ALSA音訊概念介紹
(1) 取樣位數 : 也就是codec取樣時一個點所佔的bit數,通常有8,16,24bit等.
(2) 通道數[channel] : 是mono還是stereo,對應的是1或者是2通道.
(3) 取樣率 : codec 每秒取樣的點數,如44.1KHZ,就是每秒44100個點.
PCM在採集音訊資料時採用**frame,periods,channel,及sample bit**來設定引數並按照設定的格式來採集.
還得介紹兩引數:frames和period:
(1) frames : 是由取樣時通道數(channel)和取樣位數(sample bit)來共同決定的,和取樣頻率等其他引數無任何聯絡,記住是無任何聯絡,
[1] : 1 frame of a Stereo 48khz 16bit PCM stream is 4 bytes. (對於取樣率為48KHZ,取樣位數16bit 的立體聲的1frame為4位元組).
[2] : 1 frame of a 5.1 48khz 16bit PCM stream is 2 bytes. (對於取樣率為5.148KHZ,取樣位數16bit的單聲道的1rame為2位元組).
(2) period : ALSA的官方是這樣介紹的 : A period is the number of frames in between each hardware interrupt. 意思就是硬體的每次中斷所對應的frames數為一個period,簡稱一個週期吧.
exmple : 我們讓codec工作在 stereo立體聲,16-bits, 44.1KHZ 的取樣流中,
[1] 'stereo' = 2; [2] 1 analog sample 是16-bits = 2bytes; [3]1 frame = (num_channels) * (1 sample in bytes) = (2 channels) * (2 bytes (16 bits) per sample) = 4 bytes (32 bits) [4] Bps_rate = (num_channels) * (1 sample in bytes) * (analog_rate) = 2 * 2 * 44100 = 176400 Bytes/sec.
如果 ALSA每秒中斷一次,那麼我們就需要準備176400 bytes的空間.
如果ALSA半秒中斷一次,那麼我們就需要準備 176400/2 = 88200 bytes個大小的空間. 100ms中斷一次的話我們就需要 176400 * 0.1 = 17640 bytes大小空間.
由上面的分析可以看出,我們可以控制PCM中斷每次的產生,通過設定period 的大小,
[1] : 如果我們設定16-bit stereo @ 44.1Khz和period_size to 4410 frames =>(對於16-bit stereo @ 44.1Khz, 1 frame 等於 4 bytes 來說- 4410 frames equal 4410*4 = 17640 bytes) => 每100ms一次的中斷將產生17640 個位元組.
[2] : 相應的buffer_size 應至少為 2 * period_size = 2 * 4410 = 8820frames = 8820 * 4 = 35280bytes.
採集過程中ALSA會將按照我們自己設定的格式將資料按照每period大小存放在迴圈緩衝區中.
下一篇將詳細介紹如何ALSA API程式設計.