On Fri, 2013-07-12 at 15:07 -0300, jprvita at gmail.com wrote: > +/* Run from main thread */ > +static void transport_config(struct userdata *u) { > + sbc_info_t *sbc_info = &u->sbc_info; > + a2dp_sbc_t *config; > + > + pa_assert(u->transport); > + > + u->sample_spec.format = PA_SAMPLE_S16LE; > + config = (a2dp_sbc_t *) u->transport->config; > + > + if (sbc_info->sbc_initialized) > + sbc_reinit(&sbc_info->sbc, 0); > + else > + sbc_init(&sbc_info->sbc, 0); > + sbc_info->sbc_initialized = true; > + > + switch (config->frequency) { > + case SBC_SAMPLING_FREQ_16000: > + sbc_info->sbc.frequency = SBC_FREQ_16000; > + u->sample_spec.rate = 16000U; > + break; > + case SBC_SAMPLING_FREQ_32000: > + sbc_info->sbc.frequency = SBC_FREQ_32000; > + u->sample_spec.rate = 32000U; > + break; > + case SBC_SAMPLING_FREQ_44100: > + sbc_info->sbc.frequency = SBC_FREQ_44100; > + u->sample_spec.rate = 44100U; > + break; > + case SBC_SAMPLING_FREQ_48000: > + sbc_info->sbc.frequency = SBC_FREQ_48000; > + u->sample_spec.rate = 48000U; > + break; > + default: > + pa_assert_not_reached(); > + } If broken config is handled with assertions (which I totally agree is a good way to do it), then the config definitely must be checked at the time it's received. > @@ -517,6 +722,8 @@ void pa__done(pa_module *m) { > if (u->device_connection_changed_slot) > pa_hook_slot_free(u->device_connection_changed_slot); > > + sbc_finish(&u->sbc_info.sbc); This should be done only if sbc_initialized is true. The code may work just fine, since the sbc struct is initialized to all zero when userdata is allocated, but that's relying on undocumented internal details of sbc_finish(). -- Tanu