在我們的系統上 , 有一個 flash player 和 2.6.21 的 Samsung BSP kernel . 搭配 WM8960 CODEC.
最近軟體部門測試到 , 只要經過錄音後馬上撥放 Flash player 就會沒有聲音 , 並且使用 arecord (ALSA utility Program) 也會以同樣的 bug , 所以很確定是 kernel Driver 的問題了 !!
利用 amixer contents 的方式 , 將所有的CODEC 控制內容都print out 來比對 , 看看發生了哪樣的錯誤 , 最後發現 , 產生 bug 的時候 , 都沒有透過 dapm event 來打開Speaker 相關的 power .
納悶了.... 怎會這樣呢 ?? arecord -> flash player => 沒聲音 , arecord -> aplay -> flash player => 正常 ...... 更奇怪了 , 不知道 bug 出在哪個環節 ??
aplay & arecord 都使用 ALSA 的 Driver , 不巧的我們的 flash player 使用 OSS .
ALSA 的 過程會呼叫 linux/sound/core/pcm_native.c 的 snd_pcm_open_file() , OSS 卻是呼叫 linux/sound/core/oss/pcm_oss.c 的 snd_pcm_oss_open_file() .
在snd_pcm_oss_open_file() 中將 SNDRV_PCM_STREAM_PLAYBACK 的參數傳給 CODEC Driver 就解決了這個 bug .
snd_pcm_open_file() Function 中 有將 SNDRV_PCM_STREAM_PLAYBACK 傳給 CODEC Driver , 所以可以正確的知道 Playback mode 還是 capture mode , dapm event 才能正確的打開 speaker or microphone power 了..... !!