蓝牙A2DP Sink连接
打开蓝牙并允许蓝牙可被检测到,然后用手机连接此设备,进行A2DP Sink连接,连接时调用com_android_bluetooth_a2dp_sink.cpp bta2dp_connection_state_callback()
-->A2dpSinkStateMachine.java onConnectionStateChanged() 发送EVENT_TYPE_CONNECTION_STATE_CHANGED广播
-->A2dpSinkStateMachine.java Disconnected.processConnectionEvent()
当前状态是Disconnected,新状态是CONNECTION_STATE_CONNECTING,:
上面代码首先做一些音频相关的处理(这里不分析它),然后发送广播MSG_CONNECTION_STATE_CHANGED、切换状态到Pending。
-->A2dpSinkStateMachine.java IntentBroadcastHandler.handleMessage()
-->A2dpSinkStateMachine.java IntentBroadcastHandler.onConnectionStateChanged()
发送广播CONNECTION_STATE_CHANGED,不过这个广播最终没有被处理(所以Setting软件界面没有更新)。最后调用Profile.notifyProfileConnectionStateChanged()。
接着com_android_bluetooth_a2dp_sink.cpp bta2dp_audio_config_callback()被调用:
此时状态是Pending:
调用processAudioConfigEvent(),通知音频格式的变化。
接着com_android_bluetooth_a2dp_sink.cpp bta2dp_connection_state_callback()再被调用:
此时状态是Pending:
和前面一样调用AudioManager.setBluetoothA2dpDeviceConnectionState(),不过因状态变成Connected,所以会进行一些音频切源操作。然后发送广播,Setting应用并没有处理它。最后将状态切为Connected。
发送广播,但原生设置代码没有对它处理。