編輯:Android開發實例
Android提供了一套音效處理的庫,包括有BassBoost重低音,Equalizer均衡器,Virtualizer虛擬器,PresetReverb預置混響,EnvirenmentReverb環境音混響,Visaulizer可視化,downmix,preprocess(AGC(增益) AEC(回聲消除) NS(噪聲抑制))等。本文介紹音效庫是如何從底層獲取數據和為上層提供處理好的數據。
一、如何加載庫和創建音效
以上這些音效分別封裝在libbundlewrapper.so,libreverbwrapper.so,libvisualizer.so,libdownmix.so,libpreprocess.so等五個庫中,這些庫是由system/etc/audio_effects.conf這個配置文件中聲明。加載該文件的地方有兩個,一個是libeffect.so的EffectsFactory類,另外一個是libaudioflinger.so中的AudioPolicyService類。類工廠EffectsFactory使用了兩個鏈表分別保存了lib和每個效果的結構體。目前使用到音效的地方有AudioFlinger中輸出的各種音效, AudioMixer中的downmix, AudioPolicyService中的輸入時的預處理preprocess。
當創建一個音效時,由上層傳入UUID到EffectsFactory中鏈表保存的音效中查詢獲得。java層media.audiofx包提供了java層的接口,JNI層有兩個接口文件:android_media_AudioEffect.cpp和Android_media_visualizer.cpp,本地層有AudioEffect.cpp和Visualizer.cpp,在構造AudioEffect的構造函數中,根據Effect的UUID調用AudioFlinger的createEffect函數,從而調用類工廠EffectsFactory的EffectQueryNumberEffects查詢並創建Effect的對象。
圖1-1 AudioFx包類圖
二、音效數據的來源
音效數據的來源需要分析AudioFlinger中的數據流的流程。首先我們先看一下hardware/libhardware/include/hardware/audio_effect.h定義了effect_config_t, buffer_config_t,audio_buffer_s等結構體,在audio_buffer_s中定義了保存輸入數據的指針,我接下來看一下這些指針是在何處賦值。
struct audio_buffer_s {
size_t frameCount; // number of frames in buffer
union {
void* raw; // raw pointer to start of buffer
int32_t* s32; // pointer to signed 32 bit data at start of buffer
int16_t* s16; // pointer to signed 16 bit data at start of buffer
uint8_t* u8; // pointer to unsigned 8 bit data at start of buffer
};
};
當創建音效時,在AudioFlinger首先調用的是CreateEffect函數,當創建了一個effect實例後,要調用CreateEffect_l函數創建一個EffectHandle用於操作effect實例,並且判斷該track是否已存在effectchain,如果不存在則創建一個effectChain然後將effect加入,如已存在則直接加入,在創建effectchain的部分指定了chain的inbuffer和outbuffer;將effect加入到effectchain的過程就是設置每個effect數據來源的地方,根據effect自己的flag屬性確定它在chain中的位置。addEffect_l中調用了setInBuffer和setOutBuffer指定了數據源。
三、硬件音效的實現
目前的音頻芯片很多都提供了部分硬件音效(如硬件EQ),其效果和效率是軟件實現所不能夠比的。根據硬件提供的控制節點,由mixer control將相應的值設置到聲卡生效。
四、總結
本文通過跟蹤一個音效創建分析音效的創建過程和音效的數據來源。
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
本文實例總結了 Android中Notification用法。分享給大家供大家參考,具體如下: 我們在用手機的時候,如果來了短信,而我們沒有點擊查看的話,是不是在
一般而言在Android上使用JAVA實現彩圖轉換為灰度圖,與J2ME上的實現方法類似,不過遇到頻繁地轉換或者是大圖轉換時,就必須使用NDK來提高速度了。本文主要
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我