Jump to content

    

ALSA-запись двумя приложениями одновременно

Уважаемые знатоки Linux, подскажите пожалуйста, как использовать ALSA для чтения данных с микрофона/линейного входа из двух приложений одновременно?

 

Дано: сетевая камера и самодельное приложение для неё.

 

Если камера "стримит" без звука (MJPEG), то приложение работает. Стоит переключить её на H.264 - приложение не запускается и наоборот: если вначале запустить приложение, камера не переключается на поток со звуком.

Аналогичная ситуация и при использовании "arecord" на камере: ИЛИ звук в потоке ИЛИ приложение ИЛИ "arecord".

Arecord вываливается с сообщением: <arecord: main:654: audio open error: Device or resource busy>

 

В моём приложении участок кода:

if ((err = snd_pcm_open (&capture_handle,"default", SND_PCM_STREAM_CAPTURE,

SND_PCM_ACCESS_MMAP_NONINTERLEAVED

)) < 0) {

printf("Error in ALSA snd_pcm_open: %i -> %s\n",err,snd_strerror (err));

return 1;

}

возвращает: <Error in ALSA snd_pcm_open: -16 -> Device or resource busy>

 

Файл /etc/asound.conf содержит:

pcm.audiosource0 {

type route

slave {

pcm "hw:0,0"

channels 2

}

ttable {

0.0= 1

0.1= 1

1.1= 1

1.0= 1

}

}

 

ctl.audiosource0 {

type hw

card 0

}

 

Подскажите, пожалуйста, направление поиска решения данной проблемы (готовое предпочтительней).

Заранее благодарен.

 

 

Share this post


Link to post
Share on other sites

а PulsAudio есть на линуксе? Попробуйте вместо mmap применить read()/write()...

Share this post


Link to post
Share on other sites
а PulsAudio есть на линуксе?

Нет, PulseAudio в камере нет (производителю предстоит его добавить).

 

Попробуйте вместо mmap применить read()/write()...

Не имеет значения какой режим я выбираю SND_PCM_ACCESS_MMAP_(NON)INTERLEAVED или SND_PCM_ACCESS_RW_(NON)INTERLEAVED - первое же обращение к ALSA (snd_pcm_open(x,x,x,x) ) с целью открыть устройство для чтения или записи приводит к <Device or resource busy> если его уже кто-то использует.

 

Share this post


Link to post
Share on other sites

Я давно с "алсой" не игрался, и не все помню, но Вы точно все по документации вызываете там? Чот-то у Вас snd_pcm_open() вообще не из той песни... Вот дока, вот экзампл... А у Вас snd_pcm_open() и snd_pcm_set_params() одна функция чего-то... Может в этом соль? В хидерах эти установочные константы - это же все int-числа. Счас лень все искать и перепроверять но вдруг... Простыми словами: пример с офсайта alsa pcm_min.c тоже блокирует устройство? Если да - то скорее нужно рыть в сторону настроек.

 

Интересно, а alsaconf есть на платке? Хотя его собрать наверное можно знать бы версию ARM-ки...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this