有些說是 alsa.conf ,有些說是 asound.conf
在 android 4.2,是 /usr/share/alsa/alsa.conf 裡指定了 /etc/asound.conf
這個系統是在 /etc/asound.conf
這個檔案是在 /rootfs/rootdir/etc/ 下。
這是一個 prebuild folder, 該 file 也是預先寫定。
在 build system 時,rootdir 的內容會被整個 copy 到最後 image 的 root/ 中。
也就是說,實際系統的 /etc/asound.conf 就是這裡來的。
android 设置Audio Path 根据 getStrategy(stream_type) 和 getDeviceForStrategy() 取出對應的输出、输入,
然後 call setOutputDevice(mHardwareOutput, newDevice)
他會 call alsa_default.cpp
然後 會用到 s_route, s_open 控制到底層。
s_open 利用 deviceName(handle, devices, mode)
依照 Devices 動態組合出path字串,
用 snd_pcm_open( ) 依照 asound.conf 設定檔的 pcm 裡的 controls
所以 logcat 時可以看到:
D/AudioHardwareALSA( 674): openOutputStream called for devices: 0x00000002 I/ALSAModule( 674): s_close AndroidPlayback D/ALSAModule( 674): open called for devices 00000002 in mode 0, channel 2... E/ALSAModule( 674): s_open: AndroidPlayback_Speaker_normal E/ALSALib ( 674): external/alsa-lib/src/control/setup.c:565:(add_elem) Cannot obtain info for CTL elem (MIXER,'Speaker Switch',0,0,0): No such file or directory E/ALSAModule( 674): s_open: AndroidPlayback_Speaker E/ALSALib ( 674): external/alsa-lib/src/control/setup.c:565:(add_elem) Cannot obtain info for CTL elem (MIXER,'Speaker Switch',0,0,0): No such file or directory E/ALSAModule( 674): s_open: AndroidPlayback D/ALSAModule( 674): force handle channels to 2 D/ALSAModule( 674): Set 48000 , handl channel 2 D/ALSAModule( 674): Set PCM format to S16_LE (Signed 16 bit Little Endian) D/ALSAModule( 674): Using 2 channels for stream. D/ALSAModule( 674): Set stream sample rate to 48000 HZ D/ALSAModule( 674): Buffer size: 4096 D/ALSAModule( 674): Latency: 85333 I/ALSAModule( 674): Initialized ALSA PLAYBACK device AndroidPlayback_Speaker_normalError 是因為我改了 codec kcontrol name...
沒有留言:
張貼留言