summaryrefslogtreecommitdiff
path: root/debian/patches/0052-bluetooth-device-Add-safe-guard-against-BT-streaming.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/0052-bluetooth-device-Add-safe-guard-against-BT-streaming.patch')
-rw-r--r--debian/patches/0052-bluetooth-device-Add-safe-guard-against-BT-streaming.patch72
1 files changed, 72 insertions, 0 deletions
diff --git a/debian/patches/0052-bluetooth-device-Add-safe-guard-against-BT-streaming.patch b/debian/patches/0052-bluetooth-device-Add-safe-guard-against-BT-streaming.patch
new file mode 100644
index 000000000..fc68150af
--- /dev/null
+++ b/debian/patches/0052-bluetooth-device-Add-safe-guard-against-BT-streaming.patch
@@ -0,0 +1,72 @@
+From 40a107c3558aa053b617d65d13c77b3c5ce9419f Mon Sep 17 00:00:00 2001
+From: Jyri Sarha <jyri.sarha@nokia.com>
+Date: Fri, 8 May 2009 13:25:21 +0300
+Subject: [PATCH 52/85] bluetooth-device: Add safe guard against BT streaming irregularities.
+
+Some bad quality BT-headsets block bluez socket sometimes for hundreds
+of milliseconds, especially when changing mode. When the module tries
+catch up the lost time it may SBC encode up to half a second of audio
+without yielding. On slow machine this may cause maximum RT time slice
+to be exceeded. Cleaned out the minor fix that slipped into first version
+of the patch.
+---
+ src/modules/bluetooth/module-bluetooth-device.c | 30 ++++++++++++++++++++--
+ 1 files changed, 27 insertions(+), 3 deletions(-)
+
+diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
+index 01357e5..32ee38b 100644
+--- a/src/modules/bluetooth/module-bluetooth-device.c
++++ b/src/modules/bluetooth/module-bluetooth-device.c
+@@ -184,6 +184,8 @@ struct userdata {
+ #define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC)
+ #define FIXED_LATENCY_RECORD_HSP (25*PA_USEC_PER_MSEC)
+
++#define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC)
++
+ #ifdef NOKIA
+ #define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source))
+ #endif
+@@ -1308,15 +1310,37 @@ static void thread_func(void *userdata) {
+
+ if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0 && writable) {
+ pa_usec_t time_passed;
+- uint64_t should_have_written;
++ pa_usec_t audio_sent;
+
+ /* Hmm, there is no input stream we could synchronize
+ * to. So let's do things by time */
+
+ time_passed = pa_rtclock_now() - u->started_at;
+- should_have_written = pa_usec_to_bytes(time_passed, &u->sample_spec);
++ audio_sent = pa_bytes_to_usec(u->write_index, &u->sample_spec);
++
++ if (audio_sent <= time_passed) {
++ pa_usec_t audio_to_send = time_passed - audio_sent;
++
++ /* Never try to catch up for more than 100ms */
++ if (u->write_index > 0 && audio_to_send > MAX_PLAYBACK_CATCH_UP_USEC) {
++ pa_usec_t skip_usec;
++ uint64_t skip_bytes;
++ pa_memchunk tmp;
++
++ skip_usec = audio_to_send - MAX_PLAYBACK_CATCH_UP_USEC;
++ skip_bytes = pa_usec_to_bytes(skip_usec, &u->sample_spec);
+
+- do_write = u->write_index <= should_have_written;
++ pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
++ (unsigned long long) skip_usec,
++ (unsigned long long) skip_bytes);
++
++ pa_sink_render_full(u->sink, skip_bytes, &tmp);
++ pa_memblock_unref(tmp.memblock);
++ u->write_index += skip_bytes;
++ }
++
++ do_write = 1;
++ }
+ }
+
+ if (writable && do_write > 0) {
+--
+1.6.3.3
+