編輯:關於Android編程
android整體audio包括android層和底層ASLA驅動。
最近開始調3G 通話功能繼而開始接觸android 音頻架構,之前調試聲卡的時候也有過接觸,不過那些都相對比較簡單,基本上只需要修改audio path, 也就是修改audio_codec.h, 該文件定義了各種情況下的音頻數據流程。其中有個結構體定義,如下:
typedef struct AudioMixer_tag {
const char *ctl;
const int val;
} AudioMixer;
具體定義格式如下:
onst AudioMixer device_out_SPK[] = { //playback_speaker//path {"AIF1DACL Source", 0}, //Left DAC receive left channel {"AIF1DACR Source", 1}, //Right DAC receive right channel {"AIF1DAC Mux", 0}, //AIF1DAC, select AIF1DACDAT {"DAC1L Mixer AIF1.1 Switch", 1}, //AIF1DAC1L --> DAC1L Mixer {"DAC1R Mixer AIF1.1 Switch", 1}, //AIF1DAC1R --> DAC1R Mixer {"SPKL DAC1 Switch", 1}, //DAC1L --> SPKL {"SPKR DAC1 Switch", 1}, //DAC1R --> SPKR {"SPKL Boost SPKL Switch", 1}, //SPKL --> SPKL Boost {"SPKR Boost SPKR Switch", 1}, //SPKR --> SPKR Bootst//gain {"Headphone Switch", 0}, //HPOUT PGA mute {"Speaker Mode", 0}, //Class D {"Speaker ZC Switch", 0}, //disable ZC {"Speaker Volume", 60}, //SPK volume, +3dB {"Speaker Boost Volume", 4}, //2.0x boost, +6.0dB {"Speaker Mixer Volume", 3}, //SPK Mixer Volume 0dB {"Speaker Switch", 1}, //SPK OUTPUT PGA unmute {"DAC1 Volume", 96}, //DAC1 Volume, 0dB {"DAC1 Switch", 1}, //DAC1 Switch, unmute {"AIF1DAC1 Volume", 96}, //AIF1DAC1 Input Volume, 0dB {NULL, 0}}; 3G 語音分為兩種,一種是模擬語音,一種是PCM數字語音,采用不同的語音數據,硬件電路是不同的。
模擬語音比較簡單,可以直接把MIC,SPEAKER設備接到3G 模塊,也可以把模擬輸出接入到聲卡設備,以便更精細的管理。如果采用PCM數字語音需要聲卡設備或CPU 的PCM 接口支持 slave mode 。剛開始調試以為模擬音頻比較簡單就采用這種方式調試,但是調到後面發現音量調整是個問題,音頻數據不經過CPU 無法控制音量。在分析了android 音頻流程代碼發現,android的音量調節是不涉及硬件的,完全是通過mixer 實現的。關於android音量調整可以參考該文章《android音量設置from top to bottom》:http://blog.csdn.net/kld2009/article/details/8865680 ,這位仁兄寫的很詳細。
既然如此想要調整音量必須要通過硬件調整3G 模塊音量輸出的大小,後來嘗試了這種方法,不過發現效果不怎麼好,在設置界面調整音量發現反應有點延遲,可能方法或代碼的問題,就是在java調整音量的地方讀寫底層一個文件,底層根據文件的變化讀寫3G 模塊寄存器調整音量。
在看AUDIO HAL層代碼的時候發現三星調整音量不是通過上述兩種方法,它是通過SECRILD庫文件實現,如下:
openClientRILD = (HRilClient (*)(void))
dlsym(mSecRilLibHandle, "OpenClient_RILD");
disconnectRILD = (int (*)(HRilClient))
dlsym(mSecRilLibHandle, "Disconnect_RILD");
closeClientRILD = (int (*)(HRilClient))
dlsym(mSecRilLibHandle, "CloseClient_RILD");
isConnectedRILD = (int (*)(HRilClient))
dlsym(mSecRilLibHandle, "isConnected_RILD");
connectRILD = (int (*)(HRilClient))
dlsym(mSecRilLibHandle, "Connect_RILD");
setCallVolume = (int (*)(HRilClient, SoundType, int))
dlsym(mSecRilLibHandle, "SetCallVolume");
setCallAudioPath = (int (*)(HRilClient, AudioPath))
dlsym(mSecRilLibHandle, "SetCallAudioPath");
setCallClockSync = (int (*)(HRilClient, SoundClockCondition))
dlsym(mSecRilLibHandle, "SetCallClockSync");
通過調用這些設置調整3G 模塊的語音設置,應該是通過AT命令實現的,但沒有源碼具體實現還不清楚。
今天無意中再安卓巴士上看到了一片文章《Android開發者應該使用FlatBuffers替代JSON》,嚇得我趕緊看了看,突然感覺自己用了好長時間的JSON解析似乎落伍了
看一下Activity是怎麼通過View,Window等來用於自己的顯示的。上圖是Activity的Lifecycle。這裡只想說一下按back鍵和按home鍵退出,重新
前一階段開發android項目,由於客戶要求進行多分辨率適配,能夠支持國內主流的分辨率手機。因此經過了幾次開發走了很多彎路,目前剛剛領略了android多分辨率適配的一些
一、概述講解優化查詢相冊圖片之前,我們先來看下PM提出的需求,PM的需求很簡單,就是要做一個類似微信的本地相冊圖片查詢控件,主要包含兩個兩部分:進入圖片選擇頁面就要顯示出