diff options
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.patch | 72 |
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 + |