2013-08-03 69 views
0

有人可以解釋如何安全地停止使用ALSA驅動程序? 我使用snd_pcm_writei()以「週期」緩衝區大小寫入ALSA環形緩衝區,非常簡單。寫完之後,我發現很難安全地退出,在從環形緩衝區(內部驅動程序)播放所有樣本後需要退出。alsa,snd_pcm_drain(句柄),流不會播放到最後

播放後,我發現流仍然處於SND_PCM_STATE_RUNNING狀態(枚舉3),這看起來很正常,因爲環形緩衝區的其餘部分需要播放。所以,我想集中狀態

do 
{ 
    err = snd_pcm_state(handle); 
}while(err==3); 

printf("\nDone.\n\n"); // never gets here 

好了,有一個排水音頻流功能:

snd_pcm_drain(handle); 
    do 
    { 
     err = snd_pcm_state(handle); 
    }while(err==3); 

    printf("\nDone.\n\n"); 

此代碼爲1,這意味着SND_PCM_STATE_SETUP shoudn't NE停止或某事結束了? 但無論如何,直到結束時纔會播放流。唯一的測試方法是把

while(1); 

這確保了整個音頻播放。有什麼想法嗎?

在此先感謝非常多,

我發現了這個問題,但需要幫助解決:

功能snd_pcm_writei()需要一個const void *的緩衝區和我使用的是動態分配的一個:

snd_pcm_sframes_t snd_pcm_writei ( snd_pcm_t *  pcm, 
     const void * buffer, 
     snd_pcm_uframes_t size 
    ) 

frames = snd_pcm_writei (handle, buff, period_size); 

static short buf[240]; // this works 

// this is not working 
if ((buff = calloc(0,period_size)) == NULL) { 
     printf("No enough memory for period buffer\n"); 
     exit(EXIT_FAILURE); 
} 

有關如何使用snd_pcm_writei()和動態分配的緩衝區的任何想法?

回答

0

要等待要播放的緩衝區,必須在阻止模式下調用snd_pcm_drain,即以前呼叫snd_pcm_nonblock(handle, 0)

calloc的一個參數設置爲零將分配零字節。 要分配一個可以容納一個週期樣本數據的緩衝區,請使用calloc(period_size, frame_size)