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. --- src/modules/bluetooth/module-bluez4-device.c | 12 +++++++----- src/modules/bluetooth/module-bluez5-device.c | 12 +++++++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/modules/bluetooth/module-bluez4-device.c b/src/modules/bluetooth/module-bluez4-device.c index 83e603f..90b1bcd 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 287e763..61723f8 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; + } } } -- 1.7.9.5