2017-01-30 88 views
2

我正在運行Debian OS的ARM PC上以「C」語言開發linux alsa(高級linux聲音體系結構)庫。我正在嘗試錄製和播放聲音。我的目的示例項目(一個用於錄製,另一個用於播放)在for循環內完成作業。我的意思是,讀或寫緩衝區。這個for循環用法的目的是什麼?爲什麼ALSA示例使用循環播放/捕獲?

例如,在http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_min_8c-example.html中,播放聲音的官方示例。他們爲聲音數據創建一個緩衝區並隨機填充它。這是okey,但是他們編寫了這個緩衝區陣列來響應循環16次的for循環內的設備緩衝區。並沒有什麼環路內的循環計數器i完成:

for (i = 0; i < 16; i++) { 
    frames = snd_pcm_writei(handle, buffer, sizeof(buffer)); 
    if (frames < 0) 
     frames = snd_pcm_recover(handle, frames, 0); 
    if (frames < 0) { 
     printf("snd_pcm_writei failed: %s\n", snd_strerror(frames)); 
     break; 
    } 
    if (frames > 0 && frames < (long)sizeof(buffer)) 
     printf("Short write (expected %li, wrote %li)\n", (long)sizeof(buffer), frames); 
} 

recording sample

for (i = 0; i < 10; ++i) { 
    if ((err = snd_pcm_readi (capture_handle, buffer, buffer_frames)) != buffer_frames) { 
     fprintf (stderr, "read from audio interface failed (%s)\n", 
       err, snd_strerror (err)); 
     exit (1); 
    } 
    fprintf(stdout, "read %d done\n", i); 
} 

回答

2

播放示例播放相同的緩衝十六倍,讓你得到噪聲五秒鐘,而不是隻有三分之一秒。

同樣,錄音示例使用循環顯示如何錄製更長時間。 (在一個真正的程序中,你會用記錄的樣本做一些事情,而不是僅僅打印「read x done」。)

+0

這是非常有意義的。謝謝你們的編輯和回答。 –