2012-06-27 100 views
19

在我的應用程序發出以下語句:什麼是AudioFlinger?它爲什麼會失敗TONE_PROP_ACK?

toneGenerator.startTone(ToneGenerator.TONE_PROP_ACK, 600); 

哪一個廉價的LG LS670的作品非常好運行的是Android 2.3.3,但聽起來並不在所有的所有其他手機我有,從Android 2.2的.1到Android 2.3.4。

所以我知道操作系統版本在這裏不起作用(我也在文檔中驗證過它自API 1以來一直支持)。

而且,無論是鈴聲音量和媒體音量設置爲最大和toneGenerator與初始化:

toneGenerator = new ToneGenerator(ToneGenerator.TONE_DTMF_1, 100); 

我證實Settings.System.DTMF_TONE_WHEN_DIALING設置爲1

此不一致的行爲莫名其妙(跨越不同的手機),我檢查了系統日誌時,發生這種情況,我唯一可以找到的可疑差異是失敗發聲的手機TONE_PROP_ACK在其日誌中有這條線:

AudioFlinger setParameters(): io 25, keyvalue routing=0, tid 155, calling tid 121 

AudioFlinger的用途是什麼?它與靜音TONE_PROP_ACK有什麼聯繫?

任何idea如何解決我的代碼,使TONE_PROP_ACK永遠聽起來不管手機型號如何?

+3

音頻flinger是系統組件,它在將它交給內核驅動程序之前,管理來自android userpsace的音頻。你是否能夠從任何音調功能中獲得聲音?您是否看到API文檔中關於音頻路由變量的部分?無論如何,你真的想要完成什麼 - 你知道這些音不通過呼叫上行鏈路,對吧? –

+0

@ChrisStratton是的,我知道這些音不通過呼叫上行鏈路。這實際上是我的首選行爲,因爲我只是想提供一個可聽的提示(它不一定是DTMF)。當我使用手機的撥號活動時,我可以從音調功能中聽到聲音。你能詳細說明「音頻路由變量」嗎?我在哪裏可以找到API文檔中的那部分內容?直接URL會超級。感謝+1。 –

+0

'routing = 0'代表'io 25'意味着AudioFlinger正在告訴一個特定的音頻流(我猜這是一個AudioStreamOut),它應該路由到「無處」。音頻HAL將如何處理這是特定於實現的 - 因此它可能會不改變該流的路由。 – Michael

回答

1

解決辦法之一是在Audacity之類的東西中生成音調,並通過SoundPool或您選擇的api播放它。

根據Android的文檔ToneGenerator.TONE_PROP_ACK是:

爲1200Hz,100毫秒ON,100毫秒OFF 2連發

如果您選擇的Soundpool,我建議在OGG文件格式和循環的基調,直到完全保存。這雖然提供無縫音頻與一個非常小的剪輯,並沒有使用大量的資源。

1

解析/解碼是由Stage fright處理的,它由 媒體播放器服務使用。解碼後的數據通過音頻接收器寫入音頻軌道 ,然後音軌由 音頻指環的混音器線程混合並寫入輸出流 (音頻硬件)。輸出流對象填充自己的緩衝區 ,然後將數據寫入PCM輸出設備文件(可能或 可能不是ALSA驅動程序)。

相關問題