SBC codec reset() method may fail, so propagate this failure to caller. --- src/modules/bluetooth/a2dp-codec-api.h | 4 ++-- src/modules/bluetooth/a2dp-codec-sbc.c | 5 +++-- src/modules/bluetooth/module-bluez5-device.c | 18 ++++++++++++------ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/modules/bluetooth/a2dp-codec-api.h b/src/modules/bluetooth/a2dp-codec-api.h index 881cc659b..bc4844596 100644 --- a/src/modules/bluetooth/a2dp-codec-api.h +++ b/src/modules/bluetooth/a2dp-codec-api.h @@ -69,8 +69,8 @@ typedef struct pa_a2dp_codec { void *(*init)(bool for_encoding, bool for_backchannel, const uint8_t *config_buffer, uint8_t config_size, pa_sample_spec *sample_spec); /* Deinitialize and release codec info data in codec_info */ void (*deinit)(void *codec_info); - /* Reset internal state of codec info data in codec_info */ - void (*reset)(void *codec_info); + /* Reset internal state of codec info data in codec_info, returns non-zero on failure */ + int (*reset)(void *codec_info); /* Get read block size for codec, it is minimal size of buffer * needed to decode read_link_mtu bytes of encoded data */ diff --git a/src/modules/bluetooth/a2dp-codec-sbc.c b/src/modules/bluetooth/a2dp-codec-sbc.c index e2db91b63..f57c7b01a 100644 --- a/src/modules/bluetooth/a2dp-codec-sbc.c +++ b/src/modules/bluetooth/a2dp-codec-sbc.c @@ -466,20 +466,21 @@ static void set_bitpool(struct sbc_info *sbc_info, uint8_t bitpool) { pa_log_debug("Bitpool has changed to %u", sbc_info->sbc.bitpool); } -static void reset(void *codec_info) { +static int reset(void *codec_info) { struct sbc_info *sbc_info = (struct sbc_info *) codec_info; int ret; ret = sbc_reinit(&sbc_info->sbc, 0); if (ret != 0) { pa_log_error("SBC reinitialization failed: %d", ret); - return; + return -1; } /* sbc_reinit() sets also default parameters, so reset them back */ set_params(sbc_info); sbc_info->seq_num = 0; + return 0; } static size_t get_block_size(void *codec_info, size_t link_mtu) { diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c index fb6c523ab..548a8d131 100644 --- a/src/modules/bluetooth/module-bluez5-device.c +++ b/src/modules/bluetooth/module-bluez5-device.c @@ -766,7 +766,7 @@ static void transport_config_mtu(struct userdata *u) { } /* Run from I/O thread */ -static void setup_stream(struct userdata *u) { +static int setup_stream(struct userdata *u) { struct pollfd *pollfd; int one; @@ -774,16 +774,18 @@ static void setup_stream(struct userdata *u) { /* return if stream is already set up */ if (u->stream_setup_done) - return; + return 0; pa_log_info("Transport %s resuming", u->transport->path); if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK) { pa_assert(u->a2dp_codec); - u->a2dp_codec->reset(u->encoder_info); + if (u->a2dp_codec->reset(u->encoder_info) != 0) + return -1; } else if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE) { pa_assert(u->a2dp_codec); - u->a2dp_codec->reset(u->decoder_info); + if (u->a2dp_codec->reset(u->decoder_info) != 0) + return -1; } transport_config_mtu(u); @@ -808,6 +810,8 @@ static void setup_stream(struct userdata *u) { if (u->source) u->read_smoother = pa_smoother_new(PA_USEC_PER_SEC, 2*PA_USEC_PER_SEC, true, true, 10, pa_rtclock_now(), true); + + return 0; } /* Called from I/O thread, returns true if the transport was acquired or @@ -819,8 +823,10 @@ static bool setup_transport_and_stream(struct userdata *u) { if (transport_error < 0) { if (transport_error != -EAGAIN) return false; - } else - setup_stream(u); + } else { + if (setup_stream(u) < 0) + return false; + } return true; } -- 2.11.0 _______________________________________________ pulseaudio-discuss mailing list pulseaudio-discuss@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss