diff --git a/src/opus_multistream.c b/src/opus_multistream.c index b02636a7a4680a32c96b3876ab7eccf674cde6b2..2d279face6d2b33402f030bfab3378a2ff70b0c1 100644 --- a/src/opus_multistream.c +++ b/src/opus_multistream.c @@ -710,26 +710,49 @@ int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) ptr = (char*)st + align(sizeof(OpusMSDecoder)); switch (request) { - default: + case OPUS_GET_BANDWIDTH_REQUEST: + case OPUS_GET_FINAL_RANGE_REQUEST: { int s; /* This only works for int32* params, but that's all we have right now */ opus_uint32 *value = va_arg(ap, opus_uint32*); for (s=0;s<st->layout.nb_streams;s++) { - OpusDecoder *enc; + OpusDecoder *dec; + + dec = (OpusDecoder*)ptr; + if (s < st->layout.nb_coupled_streams) + ptr += align(coupled_size); + else + ptr += align(mono_size); + ret = opus_decoder_ctl(dec, request, value); + if (ret < 0) + break; + } + } + break; + case OPUS_RESET_STATE: + { + int s; + /* This only works for int32* params, but that's all we have right now */ + for (s=0;s<st->layout.nb_streams;s++) + { + OpusDecoder *dec; - enc = (OpusDecoder*)ptr; + dec = (OpusDecoder*)ptr; if (s < st->layout.nb_coupled_streams) ptr += align(coupled_size); else ptr += align(mono_size); - ret = opus_decoder_ctl(enc, request, value); + ret = opus_decoder_ctl(dec, OPUS_RESET_STATE); if (ret < 0) break; } } break; + default: + ret = OPUS_UNIMPLEMENTED; + break; } va_end(ap);