有人可以解釋如何安全地停止使用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()和動態分配的緩衝區的任何想法?