Search
SailfishOS Open Build Service
>
Projects
>
home:kimmoli
:
testing
>
pulseaudio
> _service:tar_git:1010-bluez4-util-Detect-transport-acquire-release-loop.patch
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File _service:tar_git:1010-bluez4-util-Detect-transport-acquire-release-loop.patch of Package pulseaudio
From 357814a1c4a1305cbd5d6055ff88c52db613c1c2 Mon Sep 17 00:00:00 2001 From: Timo Honkonen <timo.honkonen@oss.tieto.com> Date: Thu, 10 Apr 2014 10:39:06 +0300 Subject: [PATCH 1010/1015] bluez4-util: Detect transport acquire-release loop. --- src/modules/bluetooth/bluez4-util.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/modules/bluetooth/bluez4-util.c b/src/modules/bluetooth/bluez4-util.c index f047b73..6081fd0 100644 --- a/src/modules/bluetooth/bluez4-util.c +++ b/src/modules/bluetooth/bluez4-util.c @@ -28,6 +28,7 @@ #include <pulsecore/core-util.h> #include <pulsecore/shared.h> #include <pulsecore/dbus-shared.h> +#include <pulse/rtclock.h> #include "bluez4-util.h" #include "a2dp-codecs.h" @@ -61,6 +62,8 @@ " </interface>" \ "</node>" +#define RACE_CONDITION_TIME 1000000 // 1 second + struct pa_bluez4_discovery { PA_REFCNT_DECLARE; @@ -506,6 +509,9 @@ static int parse_audio_property(pa_bluez4_device *d, const char *interface, DBus DBusMessageIter variant_i; bool is_audio_interface; pa_bluez4_profile_t p = PA_BLUEZ4_PROFILE_OFF; + pa_usec_t tstamp_now; + static pa_usec_t tstamp_prev = 0; + DBusMessage *m; pa_assert(d); pa_assert(interface); @@ -537,6 +543,23 @@ static int parse_audio_property(pa_bluez4_device *d, const char *interface, DBus pa_bluez4_transport_state_t old_state; pa_log_debug("Device %s interface %s property 'State' changed to value '%s'", d->path, interface, value); + /* Device may change state again (e.g. suspend itself) before previous state change + * message has been parsed here. When this take place sink state in here and bluez + * will be out-of-sync. This may generate endless transport acquire/release loop + * which will be sustained by this module. When we notice this to be ongoing + * message is ignored and current state is queried with GetProperties. */ + if(pa_streq(interface, "org.bluez.AudioSink") && state == PA_BLUEZ4_AUDIO_STATE_CONNECTED) { + tstamp_now = pa_rtclock_now(); + if (tstamp_prev != 0 && tstamp_now - tstamp_prev < RACE_CONDITION_TIME) { + pa_log_debug("Race condition. Message ignored."); + tstamp_prev = 0; + pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.AudioSink", "GetProperties")); + send_and_add_to_pending(d->discovery, m, get_properties_reply, d); + + return 0; + } + tstamp_prev = tstamp_now; + } if (state == PA_BLUEZ4_AUDIO_STATE_INVALID) return -1; -- 1.9.1