mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-03 09:01:50 -05:00
bluetooth: Support media transport's State property
BlueZ 5 exposes a 'State' property in the media transport interface. With regard to PA, this replaces the profile-specific interfaces, since they were being used to know if the audio was streaming or not.
This commit is contained in:
parent
2f79fb580a
commit
6fdf2b05b8
1 changed files with 41 additions and 1 deletions
|
|
@ -126,6 +126,20 @@ static pa_bt_audio_state_t audio_state_from_string(const char* value) {
|
|||
return PA_BT_AUDIO_STATE_INVALID;
|
||||
}
|
||||
|
||||
static int transport_state_from_string(const char* value, pa_bluetooth_transport_state_t *state) {
|
||||
pa_assert(value);
|
||||
pa_assert(state);
|
||||
|
||||
if (pa_streq(value, "idle"))
|
||||
*state = PA_BLUETOOTH_TRANSPORT_STATE_IDLE;
|
||||
else if (pa_streq(value, "pending") || pa_streq(value, "active")) /* We don't need such a separation */
|
||||
*state = PA_BLUETOOTH_TRANSPORT_STATE_PLAYING;
|
||||
else
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *pa_bt_profile_to_string(enum profile profile) {
|
||||
switch(profile) {
|
||||
case PROFILE_A2DP:
|
||||
|
|
@ -1089,6 +1103,29 @@ static int transport_parse_property(pa_bluetooth_transport *t, DBusMessageIter *
|
|||
|
||||
break;
|
||||
}
|
||||
|
||||
case DBUS_TYPE_STRING: {
|
||||
|
||||
const char *value;
|
||||
dbus_message_iter_get_basic(&variant_i, &value);
|
||||
|
||||
if (pa_streq(key, "State")) { /* Added in BlueZ 5.0 */
|
||||
bool old_any_connected = pa_bluetooth_device_any_audio_connected(t->device);
|
||||
|
||||
if (transport_state_from_string(value, &t->state) < 0) {
|
||||
pa_log("Transport %s has an invalid state: '%s'", t->path, value);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pa_log_debug("dbus: transport %s set to state '%s'", t->path, value);
|
||||
pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED], t);
|
||||
|
||||
if (old_any_connected != pa_bluetooth_device_any_audio_connected(t->device))
|
||||
run_callback(t->device, old_any_connected);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -1567,7 +1604,10 @@ static pa_bluetooth_transport *transport_new(pa_bluetooth_device *d, const char
|
|||
memcpy(t->config, config, size);
|
||||
}
|
||||
|
||||
t->state = audio_state_to_transport_state(d->profile_state[p]);
|
||||
if (d->discovery->version == BLUEZ_VERSION_4)
|
||||
t->state = audio_state_to_transport_state(d->profile_state[p]);
|
||||
else
|
||||
t->state = PA_BLUETOOTH_TRANSPORT_STATE_IDLE;
|
||||
|
||||
return t;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue