src/modules/bluetooth/module-bluez5-device.c |   20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

New commits:
commit 47d128587846c2dd4d33d56fc031e367b610ce4e
Author: Georg Chini <ge...@chini.tk>
Date:   Sat Jul 22 10:47:07 2017 +0200

    bluez5-device: Set transport state correctly for AG role
    
    When connecting a headset via the native backend, the transport state was
    not updated correctly.
    
    This patch sets the state to PLAYING in transport_acquire() if necessary.

diff --git a/src/modules/bluetooth/module-bluez5-device.c 
b/src/modules/bluetooth/module-bluez5-device.c
index ccab10ac..617aac90 100644
--- a/src/modules/bluetooth/module-bluez5-device.c
+++ b/src/modules/bluetooth/module-bluez5-device.c
@@ -77,6 +77,7 @@ static const char* const valid_modargs[] = {
 enum {
     BLUETOOTH_MESSAGE_IO_THREAD_FAILED,
     BLUETOOTH_MESSAGE_STREAM_FD_HUP,
+    BLUETOOTH_MESSAGE_SET_TRANSPORT_PLAYING,
     BLUETOOTH_MESSAGE_MAX
 };
 
@@ -745,9 +746,18 @@ static int transport_acquire(struct userdata *u, bool 
optional) {
     if (u->stream_fd < 0)
         return -1;
 
+    /* transport_acquired must be set before calling
+     * pa_bluetooth_transport_set_state() */
     u->transport_acquired = true;
     pa_log_info("Transport %s acquired: fd %d", u->transport->path, 
u->stream_fd);
 
+    if (u->transport->state == PA_BLUETOOTH_TRANSPORT_STATE_IDLE) {
+        if (pa_thread_mq_get() != NULL)
+            pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(u->msg), 
BLUETOOTH_MESSAGE_SET_TRANSPORT_PLAYING, NULL, 0, NULL, NULL);
+        else
+            pa_bluetooth_transport_set_state(u->transport, 
PA_BLUETOOTH_TRANSPORT_STATE_PLAYING);
+    }
+
     return 0;
 }
 
@@ -2138,6 +2148,16 @@ static int device_process_msg(pa_msgobject *obj, int 
code, void *data, int64_t o
             if (u->transport->state > PA_BLUETOOTH_TRANSPORT_STATE_IDLE)
                 pa_bluetooth_transport_set_state(u->transport, 
PA_BLUETOOTH_TRANSPORT_STATE_IDLE);
             break;
+        case BLUETOOTH_MESSAGE_SET_TRANSPORT_PLAYING:
+            /* transport_acquired needs to be checked here, because a message 
could have been
+             * pending when the profile was switched. If the new transport has 
been acquired
+             * correctly, the call below will have no effect because the 
transport state is
+             * already PLAYING. If transport_acquire() failed for the new 
profile, the transport
+             * state should not be changed. If the transport has been released 
for other reasons
+             * (I/O thread shutdown), transport_acquired will also be false. */
+            if (u->transport_acquired)
+                pa_bluetooth_transport_set_state(u->transport, 
PA_BLUETOOTH_TRANSPORT_STATE_PLAYING);
+            break;
     }
 
     return 0;

_______________________________________________
pulseaudio-commits mailing list
pulseaudio-commits@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/pulseaudio-commits

Reply via email to