2014-09-13 66 views
0

我想從Linux(ubuntu 14.04)中的多個麥克風讀取數據。我有一個特定的限制,即麥克風的讀數應該通過輪詢(所以沒有等到有數據,儘管數據頻率很高)。我想知道這在Linux中是否可行?不幸的是,音頻捕捉不是我的專長領域,我想知道使用Alsa的選擇是否合適。爲了更好地理解這個問題,這裏是一個僞代碼,我腦子裏想的:使用ALSA [或V4L2]查詢麥克風數據

open_the_audio_device(); 
set_the_parameters_of_the_audio_device(); 
while (!done) 
{ 
    poll_result=poll_the_devices(); //other non-audio devices are also polled here preferably, something like using select on all different file descriptors of audio, video, socket, etc.  
    if(poll_success_for_audio_device) 
      receive_audio_from_the_device_that_has_data(); 
    else 
      do_some_other_very_fast_stuff_and_start_loop_again(); 
} 
close_the_device(); 

我的問題是2倍:

  1. 是艾莎的一個很好的選擇嗎?
  2. 它可以以某種方式完成一些庫給我一個文件描述符,以便我可以使用它的選擇功能?如果是這樣,這是最佳的,因爲還有其他非音頻設備也與選擇工作。

感謝您的關注。

回答

1

爲防止snd_pcm_read*()呼叫被阻塞,使用snd_pcm_nonblock()啓用非阻塞模式。

要獲得可輪詢的文件描述符,請撥打snd_pcm_poll_descriptors_count()snd_pcm_poll_descriptors()。 有可能有多個描述符,因爲一些插件可能會以不同的方式實現通知。 要將這些描述符上的poll()的結果轉換回POLLIN/POLLOUT值,請致電snd_pcm_poll_descriptors_revents()

+0

謝謝你的回答。在select或poll(函數)場景中是否有直觀的例子使用這些函數?我閱讀了描述,並對我需要做的事情有了一個很好的想法。只是想知道是否有一個全雙工的例子,以確保我正朝着正確的方向前進。 – 2014-09-14 00:52:53

+0

一個全雙工用戶將是Jack,但這不是一個直觀的例子。 – 2014-09-14 08:03:38