static void device_sink_cb(struct audio_device *dev, sink_state_t old_state, sink_state_t new_state, void *user_data) { struct dev_priv *priv = dev->priv; if (!dev->sink) return; priv->sink_state = new_state; switch (new_state) { case SINK_STATE_DISCONNECTED: if (dev->control) { device_remove_control_timer(dev); avrcp_disconnect(dev); } device_set_state(dev, AUDIO_STATE_DISCONNECTED); break; case SINK_STATE_CONNECTING: device_remove_avdtp_timer(dev); device_set_state(dev, AUDIO_STATE_CONNECTING); break; case SINK_STATE_CONNECTED: if (old_state == SINK_STATE_PLAYING) break; device_set_state(dev, AUDIO_STATE_CONNECTED); break; case SINK_STATE_PLAYING: break; } }
static DBusMessage *dev_disconnect(DBusConnection *conn, DBusMessage *msg, void *data) { struct audio_device *dev = data; struct dev_priv *priv = dev->priv; if (priv->state == AUDIO_STATE_DISCONNECTED) return g_dbus_create_error(msg, ERROR_INTERFACE ".NotConnected", "Not connected"); if (priv->dc_req) return dbus_message_new_method_return(msg); priv->dc_req = dbus_message_ref(msg); if (dev->control) { device_remove_control_timer(dev); avrcp_disconnect(dev); } if (dev->sink && priv->sink_state != SINK_STATE_DISCONNECTED) sink_shutdown(dev->sink); else if (priv->hs_state != HEADSET_STATE_DISCONNECTED) headset_shutdown(dev); else { dbus_message_unref(priv->dc_req); priv->dc_req = NULL; return dbus_message_new_method_return(msg); } return NULL; }
static void disconnect_cb(struct btd_device *btd_dev, gboolean removal, void *user_data) { struct audio_device *dev = user_data; struct dev_priv *priv = dev->priv; if (priv->state == AUDIO_STATE_DISCONNECTED) return; if (priv->disconnecting) return; priv->disconnecting = TRUE; device_remove_control_timer(dev); device_remove_avdtp_timer(dev); if (dev->control) avrcp_disconnect(dev); if (dev->sink && priv->sink_state != SINK_STATE_DISCONNECTED) sink_disconnect(dev, TRUE); else priv->disconnecting = FALSE; }
static void device_sink_cb(struct audio_device *dev, sink_state_t old_state, sink_state_t new_state, void *user_data) { struct dev_priv *priv = dev->priv; if (!dev->sink) return; priv->sink_state = new_state; switch (new_state) { case SINK_STATE_DISCONNECTED: if (dev->control) { device_remove_control_timer(dev); avrcp_disconnect(dev); } if (priv->hs_state == HEADSET_STATE_DISCONNECTED) device_set_state(dev, AUDIO_STATE_DISCONNECTED); else if (old_state == SINK_STATE_CONNECTING) { switch (priv->hs_state) { case HEADSET_STATE_CONNECTED: case HEADSET_STATE_PLAY_IN_PROGRESS: case HEADSET_STATE_PLAYING: device_set_state(dev, AUDIO_STATE_CONNECTED); default: break; } } break; case SINK_STATE_CONNECTING: device_remove_avdtp_timer(dev); if (priv->hs_state == HEADSET_STATE_DISCONNECTED) device_set_state(dev, AUDIO_STATE_CONNECTING); break; case SINK_STATE_CONNECTED: if (old_state == SINK_STATE_PLAYING) break; #ifdef ANDROID /* google code, Broadcom Bluetooth Feature android_set_high_priority(&dev->dst); */ #endif if (dev->auto_connect) { if (!dev->headset) device_set_state(dev, AUDIO_STATE_CONNECTED); if (priv->hs_state == HEADSET_STATE_DISCONNECTED) device_set_headset_timer(dev); else if (priv->hs_state == HEADSET_STATE_CONNECTED) device_set_state(dev, AUDIO_STATE_CONNECTED); } else if (priv->hs_state != HEADSET_STATE_CONNECTED) device_set_state(dev, AUDIO_STATE_CONNECTED); break; case SINK_STATE_PLAYING: break; } }
static void device_sink_cb(struct audio_device *dev, sink_state_t old_state, sink_state_t new_state, void *user_data) { struct dev_priv *priv = dev->priv; if (!dev->sink) return; priv->sink_state = new_state; switch (new_state) { case SINK_STATE_DISCONNECTED: if (dev->control) { device_remove_control_timer(dev); avrcp_disconnect(dev); } if (priv->hs_state == HEADSET_STATE_DISCONNECTED) device_set_state(dev, AUDIO_STATE_DISCONNECTED); else if (old_state == SINK_STATE_CONNECTING) { switch (priv->hs_state) { case HEADSET_STATE_CONNECTED: case HEADSET_STATE_PLAY_IN_PROGRESS: case HEADSET_STATE_PLAYING: device_set_state(dev, AUDIO_STATE_CONNECTED); default: break; } } break; case SINK_STATE_CONNECTING: device_remove_avdtp_timer(dev); if (priv->hs_state == HEADSET_STATE_DISCONNECTED) device_set_state(dev, AUDIO_STATE_CONNECTING); break; case SINK_STATE_CONNECTED: if (old_state == SINK_STATE_PLAYING) break; if (dev->auto_connect) { if (!dev->headset) device_set_state(dev, AUDIO_STATE_CONNECTED); else if (priv->hs_state == HEADSET_STATE_DISCONNECTED) device_set_headset_timer(dev); else if (priv->hs_state == HEADSET_STATE_CONNECTED || priv->hs_state == HEADSET_STATE_PLAY_IN_PROGRESS || priv->hs_state == HEADSET_STATE_PLAYING) device_set_state(dev, AUDIO_STATE_CONNECTED); } else if (priv->hs_state == HEADSET_STATE_DISCONNECTED || priv->hs_state == HEADSET_STATE_CONNECTING) device_set_state(dev, AUDIO_STATE_CONNECTED); break; case SINK_STATE_PLAYING: break; } }
static DBusMessage *control_disconnect(DBusConnection *conn, DBusMessage *msg, void *data) { struct audio_device *device = data; DBusMessage *reply; reply = dbus_message_new_method_return(msg); if (!reply) return NULL; avrcp_disconnect(device); return reply; }
static void device_sink_cb(struct audio_device *dev, sink_state_t old_state, sink_state_t new_state, void *user_data) { struct dev_priv *priv = dev->priv; if (!dev->sink) return; priv->sink_state = new_state; switch (new_state) { case SINK_STATE_DISCONNECTED: if (dev->control) { device_remove_control_timer(dev); avrcp_disconnect(dev); } if (priv->hs_state != HEADSET_STATE_DISCONNECTED && priv->dc_req) { headset_shutdown(dev); break; } if (priv->hs_state == HEADSET_STATE_DISCONNECTED) device_set_state(dev, AUDIO_STATE_DISCONNECTED); else if (old_state == SINK_STATE_CONNECTING) { switch (priv->hs_state) { case HEADSET_STATE_CONNECTED: case HEADSET_STATE_PLAY_IN_PROGRESS: case HEADSET_STATE_PLAYING: device_set_state(dev, AUDIO_STATE_CONNECTED); default: break; } } break; case SINK_STATE_CONNECTING: device_remove_avdtp_timer(dev); if (priv->hs_state == HEADSET_STATE_DISCONNECTED) device_set_state(dev, AUDIO_STATE_CONNECTING); break; case SINK_STATE_CONNECTED: if (old_state == SINK_STATE_PLAYING) break; #ifdef ANDROID android_set_high_priority(&dev->dst); #endif if (dev->auto_connect) { if (!dev->headset) device_set_state(dev, AUDIO_STATE_CONNECTED); else if (priv->hs_state == HEADSET_STATE_DISCONNECTED) device_set_headset_timer(dev); else if (priv->hs_state == HEADSET_STATE_CONNECTED || priv->hs_state == HEADSET_STATE_PLAY_IN_PROGRESS || priv->hs_state == HEADSET_STATE_PLAYING) device_set_state(dev, AUDIO_STATE_CONNECTED); } else if (priv->hs_state == HEADSET_STATE_DISCONNECTED || priv->hs_state == HEADSET_STATE_CONNECTING) device_set_state(dev, AUDIO_STATE_CONNECTED); break; case SINK_STATE_PLAYING: //Terry Cheng, 20101222, force to send high priority when playing + #ifdef ANDROID //Re-send high priority when playing A2DP. It may not work when only connecting A2DP profile android_set_high_priority(&dev->dst); #endif //Terry Cheng, 20101222, force to send high priority when playing - break; } }