diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c index f601c0d78..02ef1146c 100644 --- a/src/modules/bluetooth/backend-native.c +++ b/src/modules/bluetooth/backend-native.c @@ -599,19 +599,16 @@ static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf c->state = 4; } else { c->state = 5; - t->bt_codec = pa_bluetooth_get_hf_codec("CVSD"); - t->setsockopt = NULL; + pa_bluetooth_transport_reconfigure(t, pa_bluetooth_get_hf_codec("CVSD"), sco_transport_write, NULL); transport_put(t); } return false; } else if (sscanf(buf, "AT+BCS=%d", &val)) { if (val == 1) { - t->bt_codec = pa_bluetooth_get_hf_codec("CVSD"); - t->setsockopt = NULL; + pa_bluetooth_transport_reconfigure(t, pa_bluetooth_get_hf_codec("CVSD"), sco_transport_write, NULL); } else if (val == 2) { - t->bt_codec = pa_bluetooth_get_hf_codec("mSBC"); - t->setsockopt = sco_setsockopt_enable_bt_voice; + pa_bluetooth_transport_reconfigure(t, pa_bluetooth_get_hf_codec("mSBC"), sco_transport_write, sco_setsockopt_enable_bt_voice); } else pa_assert_not_reached(); @@ -849,8 +846,6 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m, t->acquire = sco_acquire_cb; t->release = sco_release_cb; - t->write = sco_transport_write; - t->bt_codec = pa_bluetooth_get_hf_codec("CVSD"); t->destroy = transport_destroy; /* If PA is the HF/HS we are in control of volume attenuation and @@ -872,6 +867,8 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m, t->set_source_volume = set_source_volume; } + pa_bluetooth_transport_reconfigure(t, pa_bluetooth_get_hf_codec("CVSD"), sco_transport_write, NULL); + trd = pa_xnew0(struct transport_data, 1); trd->rfcomm_fd = fd; trd->mainloop = b->core->mainloop; diff --git a/src/modules/bluetooth/backend-ofono.c b/src/modules/bluetooth/backend-ofono.c index 8a4c2c913..cbd151aa5 100644 --- a/src/modules/bluetooth/backend-ofono.c +++ b/src/modules/bluetooth/backend-ofono.c @@ -227,8 +227,7 @@ static int card_acquire(struct hf_audio_card *card) { close(fd); return -1; } - card->transport->bt_codec = pa_bluetooth_get_hf_codec("CVSD"); - card->transport->setsockopt = NULL; + pa_bluetooth_transport_reconfigure(card->transport, pa_bluetooth_get_hf_codec("CVSD"), sco_transport_write, NULL); card->fd = fd; return 0; } @@ -410,8 +409,8 @@ static void hf_audio_agent_card_found(pa_bluetooth_backend *backend, const char card->transport = pa_bluetooth_transport_new(d, backend->ofono_bus_id, path, p, NULL, 0); card->transport->acquire = hf_audio_agent_transport_acquire; card->transport->release = hf_audio_agent_transport_release; - card->transport->write = sco_transport_write; card->transport->userdata = card; + pa_bluetooth_transport_reconfigure(card->transport, pa_bluetooth_get_hf_codec("CVSD"), sco_transport_write, NULL); pa_bluetooth_transport_put(card->transport); pa_hashmap_put(backend->cards, card->path, card); @@ -696,8 +695,7 @@ static DBusMessage *hf_audio_agent_new_connection(DBusConnection *c, DBusMessage card->connecting = false; card->fd = fd; - card->transport->bt_codec = pa_bluetooth_get_hf_codec("CVSD"); - card->transport->setsockopt = NULL; + pa_bluetooth_transport_reconfigure(card->transport, pa_bluetooth_get_hf_codec("CVSD"), sco_transport_write, NULL); pa_bluetooth_transport_set_state(card->transport, PA_BLUETOOTH_TRANSPORT_STATE_PLAYING); diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c index 554af28f3..55b50a6fc 100644 --- a/src/modules/bluetooth/bluez5-util.c +++ b/src/modules/bluetooth/bluez5-util.c @@ -184,6 +184,22 @@ pa_bluetooth_transport *pa_bluetooth_transport_new(pa_bluetooth_device *d, const return t; } +void pa_bluetooth_transport_reconfigure(pa_bluetooth_transport *t, const pa_a2dp_codec *bt_codec, + pa_bluetooth_transport_write_cb write_cb, pa_bluetooth_transport_setsockopt_cb setsockopt_cb) { + pa_assert(t); + + t->bt_codec = bt_codec; + + t->write = write_cb; + t->setsockopt = setsockopt_cb; + + /* reset stream write type hint */ + t->stream_write_type = 0; + + /* reset SCO MTU adjustment hint */ + t->last_read_size = 0; +} + static const char *transport_state_to_string(pa_bluetooth_transport_state_t state) { switch(state) { case PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED: @@ -1945,10 +1961,9 @@ static DBusMessage *endpoint_set_configuration(DBusConnection *conn, DBusMessage dbus_message_unref(r); t = pa_bluetooth_transport_new(d, sender, path, p, config, size); - t->bt_codec = a2dp_codec; t->acquire = bluez5_transport_acquire_cb; t->release = bluez5_transport_release_cb; - t->write = a2dp_transport_write; + pa_bluetooth_transport_reconfigure(t, a2dp_codec, a2dp_transport_write, NULL); pa_bluetooth_transport_put(t); pa_log_debug("Transport %s available for profile %s", t->path, pa_bluetooth_profile_to_string(t->profile)); diff --git a/src/modules/bluetooth/bluez5-util.h b/src/modules/bluetooth/bluez5-util.h index 8eb91c1c5..584f32bbb 100644 --- a/src/modules/bluetooth/bluez5-util.h +++ b/src/modules/bluetooth/bluez5-util.h @@ -182,6 +182,9 @@ static inline void pa_bluetooth_native_backend_enable_shared_profiles(pa_bluetoo pa_bluetooth_transport *pa_bluetooth_transport_new(pa_bluetooth_device *d, const char *owner, const char *path, pa_bluetooth_profile_t p, const uint8_t *config, size_t size); +void pa_bluetooth_transport_reconfigure(pa_bluetooth_transport *t, const pa_a2dp_codec *bt_codec, + pa_bluetooth_transport_write_cb write_cb, pa_bluetooth_transport_setsockopt_cb setsockopt_cb); + void pa_bluetooth_transport_set_state(pa_bluetooth_transport *t, pa_bluetooth_transport_state_t state); void pa_bluetooth_transport_put(pa_bluetooth_transport *t); void pa_bluetooth_transport_unlink(pa_bluetooth_transport *t);