Properly implementing the multistream decoder ctl()s
[opus.git] / src / opus_multistream.c
index b02636a..2d279fa 100644 (file)
@@ -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);