AUDIO 模組包括音頻輸入、音訊輸出、音頻編碼、音頻解碼四個子模組。音頻輸入和
輸出模組通過對 Hi35xx 晶片 SIO 介面的控制實現音頻輸入輸出功能。音頻編碼和解碼模組提供對 G711、G726、ADPCM 格式的音頻編解碼功能,並支援錄製和播放 LPCM格式的原始音頻檔案。
音頻輸入輸出介面 SIO(Sonic Input/Output),用於和 Audio Codec 對接,完成聲音的錄製和播放。
對每個 SIO 介面的音頻輸入和音訊輸出功能,軟體分別用 AI 和 AO 兩個模組來管理,稱之為 AI 裝置和 AO 裝置,並按照 SIO 序號為其編號。例如與 SIO0 介面對應的軟體裝置分別為 AiDev0 和 AoDev0。
HI3518錄音和播放原理:
錄音:原始音頻訊號以類比訊號的形式給出後,通過 Audio Codec,按一定採樣率和採樣精度轉換為數字訊號。 Audio Codec 以 I2S 時序或 PCM 時序的方式,將數字訊號傳輸給SIO 介面,SIO 支援多工接收模式。Hi35xx 晶片利用 DMAC 將 SIO 介面中的音頻資料儲存到記憶體中,完成錄音操作。
播放:Hi35xx 晶片利用 DMAC 將記憶體中的資料轉送到 SIO 介面。SIO 介面通過 I2S 時序或 PCM 時序向 Audio CODEC 發送資料。Audio Codec 完成數字訊號到類比訊號的轉換過程,並輸出類比訊號。
Hi35xx音頻部分的編碼類別型 G711、G726、ADPCM_DVI4 與 ADPCM_ORG_DVI4是使用寫入程式碼,ADPCM_IMA 是使用 CPU 軟體解碼,其中 Hi3518/Hi3516C 晶片沒有硬體編碼模組,所有的編碼方式都使用軟體編碼;而所有的解碼功能基於獨立封裝的海思音頻編解碼庫,核心解碼器工作在使用者態,使用 CPU 軟體解碼。SDK 支援通過 SYS模組的綁定介面,將一個 AI 通道綁定到 AENC 通道,實現錄音編碼功能;也可以將一個 ADEC 通道綁定到 AO 通道,實現解碼播放功能。
使用海思語音編解碼庫進行 G711、G726、ADPCM 格式的編碼,編碼後的碼流遵循以下表格中描述的幀結構,即在每幀碼流資料的淨荷資料之前填充有 4 個位元組的幀頭;使用語音編解碼庫進行以上格式的解碼時,需要讀取相應的幀頭資訊。
這4個位元組的幀頭內容即為如下數組中的值:
static char aryHeard[4] = {0,1,160,0}; //hisi audio header
利用ACODEC庫進行音頻解碼播放時,每發送一包音頻資料到解碼通道前,都必須先把這個數組中的內容組合到包的頭部位置,否則解碼出錯。
G711、G726、ADPCM編碼協議的採樣率均為8KHz。
其中,Hi3518/Hi3516C 使用內部 audio codec。Hi3518A/Hi3516C 支援雙聲道,左右聲道輸入,左右聲道輸出。Hi3518C 只支援單聲道,左聲道輸入、左聲道輸出。
音頻 AI 和 AO 支援的最大通道數為 16 通道(其中 Hi3518/Hi3516C 晶片受內建 codec 限制,只支援 2 通道),且配置 AI 和 AO 裝置時需要將通道配置為偶數。
Hi3518/Hi3516C 只支援 16bit 位寬。
Hi3518A/Hi3518C/Hi3516C 提供一個內建的 Audio Codec,並在晶片內部對接到 SIO0介面,即 SIO0 介面只能通過內建的 Audio Codec 完成聲音的播放及錄製。因為 AudioCodec 不能發送同步時鐘,所以 SIO0 介面只能配置為 I2S 時序的主模式(MASTER)。使用者需要正確配置 SIO0 和 Audio Codec 對接時序才可接收或發送音頻資料。
Audio Codec 分為類比部分和數字部分。類比部分可以通過類比混音(MICPGA)選擇由麥克風輸入(MICIN) 或線性輸入(LINEIN),類比混音支援感度調整。數字部分有 ADC 和 DAC,完成類比訊號和數字訊號之間的轉換,並且可分別調節音量。使用者在進行音量大小時,可綜合類比部分和數字部分的音量大小,建議優先調節類比部分音量。
Audio Codec 支援去加重濾波、pop 音抑制和高通濾波,並預設開啟這些功能。
Audio Codec 的使用者態介面以 ioctl 形式體現,其形式如下:
int ioctl (int fd,
unsigned long cmd,
……
);
該函數是 Linux 標準介面,具備可變參數特性。但在 Audio Codec 中,實際只需要 3 個參數。因此,其文法形式等同於:
int ioctl (int fd,
unsigned long cmd,
CMD_DATA_TYPE *cmddata);
其中,CMD_DATA_TYPE 隨參數 cmd 的變化而變化。
綜上所述,HI3518C音頻子系統初始化時應該作以下軟體配置:
音頻編碼錄製流程:
1、音頻輸入屬性(見AIO_ATTR_S結構體);
2、配置音頻編碼、解碼模組(ACODEC);
3、設定AI裝置屬性;啟用AI裝置;啟用AI通道;(啟用AI雜訊抑制、啟用AI重採樣,此兩項可選。);
4、根據音頻編碼協議建立音頻編碼通道;
5、綁定音頻編碼通道到音頻輸入通道;
6、HI_MPI_AENC_GetFd(AENC_CHN AeChn)擷取音頻編碼通道的Fd;
7、HI_MPI_AENC_GetStream從編碼通道擷取編碼之後的音頻資料;
8、使用者儲存或者轉寄此資料。
音頻解碼播放流程:
1、音訊輸出屬性(見AIO_ATTR_S結構體)初始化;
2、配置音頻編碼、解碼模組(ACODEC);
3、根據音頻編碼協議建立音頻解碼通道;
4、設定AO裝置屬性;啟用AO裝置;啟用 AO通道(啟用AO重採樣,此項可選);
5、綁定音訊輸出通道到音頻解碼通道;
6、向每包待發送的音頻資料頭添加4位元組的海思音頻協議頭;
7、HI_MPI_ADEC_SendStream向音頻解碼通道發送組合之後的音頻資料包;
8、播放聲音。
Hi35xx SIO 支援擴充的多路接收的 I2S 及 PCM 介面時序,對接 CODEC 的時序模式選擇、同步時鐘、採樣位寬等配置必須與 Hi35xx SIO 的配置保持一致,否則可能採集不到正確的資料。上面代碼中AUDIO_POINT_NUM = 320,則通過調用口HI_MPI_AENC_GetStream從音頻編碼通道擷取到的每包音頻資料大小都為324位元組(320位元組的淨荷資料+4位元組海思音頻資料頭),使用ACODEC進行解碼播放時,每次調用HI_MPI_ADEC_SendStream將音頻資料發往音頻解碼通道時,資料長度也必須是324位元組(320位元組的淨荷資料+4位元組海思音頻資料頭)。
在音頻初始化配置完畢後,需要首先對ACODEC模組進行配置,在配置ACODEC模組時,注意:
1、要把MICIN靜音(MUTE)功能關閉。
2、輸入裝置選用LINEIN。
此處我有一點疑惑,裝置的輸入明明接的是MIC,我一開始也是未加思索就選擇MICIN來進行配置ACODEC的,但是音頻編碼流程完畢後擷取到的音頻資料播放時只有“沙沙沙”的背景音,聽不到話筒端的說話聲音,糾結了兩天,其它各項參數確定沒有問題了,嘗試著把MICIN改為LINEIN,聲音OK,無語。。。。。。
目前聽到的採集到的聲音和解碼播放的聲音都很清晰,只是有點小,後續再嘗試通過ioctl及相應的ACODEC模組給出的各種感度調整命令來調整音頻監聽與對講的音量大小。。。。。。