From: James Bunton Date: Sun, 26 Jan 2014 14:14:38 +0000 (+1100) Subject: bluetooth: Don't abort on SBC decoding error X-Git-Url: https://code.delx.au/pulseaudio/commitdiff_plain/4a5f48e7a42f997793db76e2001b7c252f8d93fe bluetooth: Don't abort on SBC decoding error The Nokia E7 running Symbian Belle Refresh seems to generate invalid SBC packets every few minutes. This causes pulseaudio to disconnect the stream and log "SBC decoding error (-3)". If a single packet is bad, pulseaudio should keep playing the stream. --- diff --git a/src/modules/bluetooth/module-bluez4-device.c b/src/modules/bluetooth/module-bluez4-device.c index 83e603fc..90b1bcd2 100644 --- a/src/modules/bluetooth/module-bluez4-device.c +++ b/src/modules/bluetooth/module-bluez4-device.c @@ -937,7 +937,7 @@ static int a2dp_process_push(struct userdata *u) { pa_log_error("SBC decoding error (%li)", (long) decoded); pa_memblock_release(memchunk.memblock); pa_memblock_unref(memchunk.memblock); - return -1; + return 0; } /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */ @@ -1039,10 +1039,12 @@ static void thread_func(void *userdata) { if (n_read < 0) goto io_fail; - /* We just read something, so we are supposed to write something, too */ - pending_read_bytes += n_read; - do_write += pending_read_bytes / u->write_block_size; - pending_read_bytes = pending_read_bytes % u->write_block_size; + if (n_read > 0) { + /* We just read something, so we are supposed to write something, too */ + pending_read_bytes += n_read; + do_write += pending_read_bytes / u->write_block_size; + pending_read_bytes = pending_read_bytes % u->write_block_size; + } } } diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c index 287e7639..61723f86 100644 --- a/src/modules/bluetooth/module-bluez5-device.c +++ b/src/modules/bluetooth/module-bluez5-device.c @@ -458,7 +458,7 @@ static int a2dp_process_push(struct userdata *u) { pa_log_error("SBC decoding error (%li)", (long) decoded); pa_memblock_release(memchunk.memblock); pa_memblock_unref(memchunk.memblock); - return -1; + return 0; } /* Reset frame length, it can be changed due to bitpool change */ @@ -1095,10 +1095,12 @@ static void thread_func(void *userdata) { if (n_read < 0) goto io_fail; - /* We just read something, so we are supposed to write something, too */ - pending_read_bytes += n_read; - do_write += pending_read_bytes / u->write_block_size; - pending_read_bytes = pending_read_bytes % u->write_block_size; + if (n_read > 0) { + /* We just read something, so we are supposed to write something, too */ + pending_read_bytes += n_read; + do_write += pending_read_bytes / u->write_block_size; + pending_read_bytes = pending_read_bytes % u->write_block_size; + } } }