一、原理簡述
在Linux下,錄音——從dsp設備讀取數據,放音——向dsp設備寫入數據。
開發板采用聲卡UDA1341實現音頻編解碼,完成A/D和D/A轉換,芯片UDA1341與CPU的連接圖如下:
為了實現全雙工,數據傳輸需要使用兩個DMA通道。以音頻回放為例,數據傳輸先由內部總線送到內存, 然後傳到DMA控制器通道1,再通過IIS控制器寫入IIS總線並傳輸給音頻芯片,通道2用來錄音。
Linux下PCI設備驅動程序之注冊詳解 http://www.linuxidc.com/Linux/2014-02/97074.htm
裸機驅動與Linux設備驅動的區別 http://www.linuxidc.com/Linux/2013-08/88799.htm
Linux設備驅動開發詳解(第2版)源代碼 下載 http://www.linuxidc.com/Linux/2013-07/86977.htm
Linux設備驅動開發詳解(第2版)高清PDF http://www.linuxidc.com/Linux/2013-07/86976.htm
二、WAV文件
WAVE是錄音時用的標准的Windows文件格式,文件的擴展名為“wav”,數據本身的格式為PCM或壓縮型,屬於無損音樂格式的一種,符合RIFF(Resource Interchange File Format)規范。所有的WAV都有一個文件頭,這個文件頭音頻流的編碼參數。數據塊的記錄方式是小端(little-endian)字節順序,標志符並不是字符串而是單獨的符號
以采樣率為8kHz,量化位數為16,單通道的record.wav文件為例,文件前三行信息如下:
第一列表示地址,一行表示16個字節。
0x52,0x49,0x46,0x46 //“RIFF”4個字符對應的ASCII碼值
0x57,0x41,0x56,0x45,0x66,0x6D,0x74,0x20 //“WAVEfmt ”各個字符對應的ASCII碼值
0x10,0x00,0x00,0x00,0x01,0x00,0x01,0x00//sizeof(PCMWAVEFORMAT)4Byte,格式類別2B,通道數1B(聲道)
0x40,0x1F,0x00,0x00,0x80,0x3E,0x00,0x00, //采樣頻率0X0001F40= 8kHZ(8000Hz)4B,0x00003E80B/s=16kB/s 4B
0x02,0x00,0x10,0x00,0x64,0x61,0x74,0x61};//數據調整數0x0002(1*16/8)2B,即一個采樣點所占的字節數,樣本數據位數0x10(16位)2B,即一個采樣點所表示的位數 “data”4B
地址000014H~000017H的值:2400 01 00即十六進制0x00010024,對應十進制65572(65536+36),表示從0x08開始到文件尾的總字節數;
地址000028H~00002BH的值:0080 0C 00即十六進制0x00010000,對應十進制65536,表示采樣數據總數。
錄音測試命令:cat /dev/sound/dsp > audio.wav
使用cat命令生成的audio.wav是一個PCM純音頻文件:
通過添加wav文件頭,可以生成一個標准的wav音頻文件: