Linux mic陣列實時錄製 算法處理 UAC播放

       本文講解如何基於Linux系統做一個實時錄播的UAC程序。網上大多都是要麼pcm_read後直接調用pcm_write,完全沒有對聲音做處理,實用性不強,而且實時性不好。要麼就是read write單開線程,但是沒有做同步處理,穩定性不好,很容易產生延時和數據損壞,無法拿來做產品。而且UAC是無法一直向PC寫,當PC端不錄音的時候,因爲會buffer溢出,然後pcm_write就報錯的。

        那如何做一個真正實現實時錄播的程序,可以監聽PC等其他上位機端的播放、停止動作,與操作端完全同步,即降低功耗又穩定性、實用性更強呢?

(1)pcm_read  單開一個線程

(2)聲音處理單開一個線程

(3)監聽上位機端動作單開一個線程

(4)pcm_write (playback)單開一個線程

 

程序的核心就是根據PC(上位機)端何時點了錄音,何時點了停止來進行調用pcm_read,pcm_write,以及休眠等待。

文章僅從如何監聽上位機動作來展開,錄音、聲音處理、playback流程就不做探討,網上已有相關的例子。

 

說明:本例程基於AUDIO SOURCE驅動,如果基於UAC1 驅動,監聽線程需要修改,其他不變。

(1)定義全局變量

#define BUFF_LEN (16*1024)
static int g_dwFd = -1;
static volatile int start_capture = '0';
static volatile int is_start = 0;
static volatile int is_play = 0;

(2)初始化函數中判斷錄音機是否已打開,創建監聽線程

	int alt_fd;
	#define AUDIO_SOURCE_ALT "/sys/class/audio_source/audio_source0/subsystem/audio_source0/alt"
	pthread_t uevent_Thread;
	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章