From e448df8301bc2512aa173331e07bddb08b50783b Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin <jmvalin@jmvalin.ca> Date: Sun, 11 Sep 2011 18:12:31 -0400 Subject: [PATCH] Properly implementing the multistream decoder ctl()s Not tested --- src/opus_multistream.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/opus_multistream.c b/src/opus_multistream.c index b02636a7a..2d279face 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); -- GitLab