獲取當前物理輸出設備的類型

先來說方法:調用 AudioSystem 的 System getDeviceConnectionState(Device, device_add),用不同的 Deveice 依次調用這個函數,如果返回值爲 DEVICE_STATE_AVAILABLE,則說明當前判斷的 Deveice 就是當前的輸出設備類型。

         其中第二個參數 deveice_add 不能賦值爲空指針, Android 內部沒有判斷它是否爲空,直接就拿過來 * 了。
         Device 的輸入順序按照 uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy, bool fromCache) 函數中獲取 Deveice 的順序來排列。
         STRATEGY_MEDIA 模式下的判斷 Device 順序爲 DEVICE_OUT_WIRED_HEADPHONE, DEVICE_OUT_WIRED_HEADSET,DEVICE_OUT_SPEAKER。
 reason:(1)audio_io_handle_t AudioPolicyManagerBase::getOutput 函數會根據模式調用 uint32_t device = getDeviceForStrategy(strategy) 來得到 Deveice。
            (2)getDeviceForStrategy 的獲取 Device 的方法就是依次按照順序與成員變量 mAvailableOutputDevices 位與,一旦位與結果爲 1,就將設備類型設置爲該類型。
            (3)mAvailableOutputDevices 只在初始化和 void AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, uint32_t device, bool force, int delayMs) 中賦值。
            (4)現在來看 setOutputDevice,這個函數將 Device 位或到 mAvailableOutputDevices 中,如果是 A2DP 藍牙的話,還會去判斷是否可以連接成功,如果失敗,還會再將 Device 用反位位與掉。
                 設置好 OutPut 後,會再從 mAvailableOutputDevices 中獲取最新的 Device,然後按最新的 Device setOutputDevice(mHardwareOutput, newDevice);
            (5)播放設備的句柄爲 mHardwareOutput,在初始化的時候,將它初始化爲用 DEVICE_OUT_SPEAKER 打開的設備。

 

調用 getDeviceConnectionState 時需要權限 android.permission.MODIFY_AUDIO_SETTINGS.

在 Manifest.xml 裏 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />s

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章