ALSA: Пример с полным дуплексом C? - PullRequest
9 голосов
/ 03 марта 2011

есть ли пример полнодуплексного соединения ALSA в C? Я читал, что это поддерживается, но все вводные примеры, которые я видел, записывали или воспроизводили звуковые сэмплы, но я хотел бы иметь один обработчик, который мог бы делать оба для моего VoIP-приложения.

Большое спасибо за помощь, Jens

Ответы [ 4 ]

4 голосов
/ 09 марта 2011

Какой-то парень по имени Алан опубликовал этот хороший (но старый) учебник, Full Duplex ALSA , который написан на C.

2 голосов
/ 05 августа 2013

Это были мои первые требования к проектам Linux / Unix VoIP, где мне нужно было знать обо всех доступных возможностях и названиях аудиоустройств. Затем мне нужно использовать эти устройства для захвата и воспроизведения звука.

Для всеобщей помощи я создал (.so) библиотеку и пример приложения, демонстрирующего использование этой библиотеки в c ++.

Вывод моей библиотеки похож на

[root@~]# ./IdeaAudioEngineTest
HDA Intel plughw:0,0
HDA Intel plughw:0,2
USB Audio Device plughw:1,0

Библиотека предоставляет функции для захвата и воспроизведения аудиоданных в реальном времени.

Полный исходный код с документацией доступен в Библиотека IdeaAudio с дуплексом Alsa Audio

Исходный код библиотеки теперь открыт на github.com

2 голосов
/ 10 июля 2012

Вы предоставляете ссылку на обе ручки и прокачиваете их по очереди.Вот код Алана, опущенный и прокомментированный.

// the device plughw handle dynamic sample rate and type conversion.
// there are a range of alternate devices defined in your alsa.conf
// try: 
// locate alsa.conf
// and check out what devices you have in there
//  
// The following device is PLUG:HW:Device:0:Subdevice:0
// Often simply plug, plughw, plughw:0, will have the same effect 
//
char           *snd_device_in  = "plughw:0,0";
char           *snd_device_out = "plughw:0,0";

// handle constructs to populate with our links
snd_pcm_t      *playback_handle;
snd_pcm_t      *capture_handle;

//this is the usual construct... If not fail BLAH
if ((err = snd_pcm_open(&playback_handle, snd_device_out, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
fprintf(stderr, "cannot open output audio device %s: %s\n", snd_device_in, snd_strerror(err));
exit(1);
}

// And now the CAPTURE
if ((err = snd_pcm_open(&capture_handle, snd_device_in, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
fprintf(stderr, "cannot open input audio device %s: %s\n", snd_device_out, snd_strerror(err));
exit(1);
}

, затем настройте и прокачайте их.

Мод звонка мог бы сделать работу: http://soundprogramming.net/programming_and_apis/creating_a_ring_buffer или вы могли бы использовать alans способом, описанным выше.

0 голосов
/ 18 сентября 2013

См. Также latency.c, включено в alsa-lib источник;на вики ALSA:

...