]> git.sesse.net Git - casparcg/commitdiff
2.0. amcp: Simplified mixer commands.
authorRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 21 Aug 2011 11:37:58 +0000 (11:37 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 21 Aug 2011 11:37:58 +0000 (11:37 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1245 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/audio/audio_mixer.cpp
core/producer/frame/audio_transform.cpp
core/producer/frame/audio_transform.h
core/producer/transition/transition_producer.cpp
protocol/amcp/AMCPCommandsImpl.cpp

index 7880c56a68bf43634c71cc3d07fbf82677621fcf..cea17e4a161956b371121003753324b55cf893e3 100644 (file)
@@ -71,13 +71,13 @@ public:
                                \r
                next_audio_transforms_[tag] = next; // Store all active tags, inactive tags will be removed in end_pass.\r
                                \r
-               if(next.get_gain() < 0.001 && prev.get_gain() < 0.001)\r
+               if(next.get_volume() < 0.001 && prev.get_volume() < 0.001)\r
                        return;\r
                \r
                static const int BASE = 1<<15;\r
 \r
-               const auto next_gain = static_cast<int>(next.get_gain()*BASE);\r
-               const auto prev_gain = static_cast<int>(prev.get_gain()*BASE);\r
+               const auto next_volume = static_cast<int>(next.get_volume()*BASE);\r
+               const auto prev_volume = static_cast<int>(prev.get_volume()*BASE);\r
                \r
                const int n_samples = audio_data_.back().size();\r
                \r
@@ -94,8 +94,8 @@ public:
                        {\r
                                for(size_t n = r.begin(); n < r.end(); ++n)\r
                                {\r
-                                       const int sample_gain = (prev_gain - (prev_gain * n)/n_samples) + (next_gain * n)/n_samples;\r
-                                       const int sample = (static_cast<int>(audio_data[n])*sample_gain)/BASE;\r
+                                       const int sample_volume = (prev_volume - (prev_volume * n)/n_samples) + (next_volume * n)/n_samples;\r
+                                       const int sample = (static_cast<int>(audio_data[n])*sample_volume)/BASE;\r
                                        audio_data_.back()[n] = static_cast<int16_t>((static_cast<int>(audio_data_.back()[n]) + sample) & 0xFFFF);\r
                                }\r
                        }\r
index b6857667283e9c3d8c8b7aa8297738e462ecd75e..4c85093eb8ded73a2424378c1af3024ca1fe4c9f 100644 (file)
 namespace caspar { namespace core {\r
        \r
 audio_transform::audio_transform()\r
-       : gain_(1.0)\r
+       : volume_(1.0)\r
        , has_audio_(true){}\r
 \r
-void audio_transform::set_gain(double value)\r
+void audio_transform::set_volume(double value)\r
 {\r
-       gain_ = std::max(0.0, value);\r
+       volume_ = std::max(0.0, value);\r
 }\r
 \r
-double audio_transform::get_gain() const\r
+double audio_transform::get_volume() const\r
 {\r
-       return gain_;\r
+       return volume_;\r
 }\r
 \r
 void audio_transform::set_has_audio(bool value)\r
@@ -49,7 +49,7 @@ bool audio_transform::get_has_audio() const
 \r
 audio_transform& audio_transform::operator*=(const audio_transform &other) \r
 {\r
-       gain_ *= other.gain_;\r
+       volume_ *= other.volume_;\r
        has_audio_ &= other.has_audio_;\r
        return *this;\r
 }\r
@@ -67,7 +67,7 @@ audio_transform tween(double time, const audio_transform& source, const audio_tr
        };\r
 \r
        audio_transform result;\r
-       result.set_gain(do_tween(time, source.get_gain(), dest.get_gain(), duration, tweener));\r
+       result.set_volume(do_tween(time, source.get_volume(), dest.get_volume(), duration, tweener));\r
        result.set_has_audio(source.get_has_audio() || dest.get_has_audio());\r
        return result;\r
 }\r
index c8747cc18c2618b3f1eeb5771baa6dcf715e2786..596c106d4b92115e9d2e12875cd8a47e3f1782c4 100644 (file)
@@ -28,8 +28,8 @@ class audio_transform
 public:\r
        audio_transform();\r
 \r
-       void set_gain(double value);\r
-       double get_gain() const;\r
+       void set_volume(double value);\r
+       double get_volume() const;\r
        \r
        void set_has_audio(bool value);\r
        bool get_has_audio() const;\r
@@ -37,7 +37,7 @@ public:
        audio_transform& operator*=(const audio_transform &other);\r
        const audio_transform operator*(const audio_transform &other) const;\r
 private:\r
-       double gain_;\r
+       double volume_;\r
        bool has_audio_;\r
 };\r
 \r
index f0ad622ef70d87cec302e2edecd4ab0c5d1bb9c1..204eb084f21bde3eacf938df49665e1984b13bcd 100644 (file)
@@ -121,13 +121,13 @@ struct transition_producer : public frame_producer
                auto s_frame2 = make_safe<basic_frame>(src_frame);\r
 \r
                s_frame1->get_audio_transform().set_has_audio(false);\r
-               s_frame2->get_audio_transform().set_gain(1.0-delta2);\r
+               s_frame2->get_audio_transform().set_volume(1.0-delta2);\r
 \r
                auto d_frame1 = make_safe<basic_frame>(dest_frame);\r
                auto d_frame2 = make_safe<basic_frame>(dest_frame);\r
                \r
                d_frame1->get_audio_transform().set_has_audio(false);\r
-               d_frame2->get_audio_transform().set_gain(delta2);\r
+               d_frame2->get_audio_transform().set_volume(delta2);\r
 \r
                //if(info_.type == transition::mix)\r
                //{\r
index cb136da7822eadf7aefc154b3e0bf6de03e88743..db1683286cf025456a95856167b8e7280cb5689b 100644 (file)
@@ -221,206 +221,189 @@ bool MixerCommand::DoExecute()
        //Perform loading of the clip\r
        try\r
        {       \r
-               if(_parameters[0] == L"VIDEO")\r
+               if(_parameters[0] == L"KEYER")\r
                {\r
-                       if(_parameters[1] == L"IS_KEY")\r
+                       bool value = lexical_cast_or_default(_parameters.at(1), false);\r
+                       auto transform = [=](image_transform transform) -> image_transform\r
                        {\r
-                               bool value = lexical_cast_or_default(_parameters.at(2), false);\r
-                               auto transform = [=](image_transform transform) -> image_transform\r
-                               {\r
-                                       transform.set_is_key(value);\r
-                                       return transform;                                       \r
-                               };\r
+                               transform.set_is_key(value);\r
+                               return transform;                                       \r
+                       };\r
 \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform);\r
-                       }\r
-                       else if(_parameters[1] == L"OPACITY")\r
-                       {\r
-                               int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
+                       int layer = GetLayerIndex();\r
+                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform);\r
+               }\r
+               else if(_parameters[0] == L"OPACITY")\r
+               {\r
+                       int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
+                       std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
 \r
-                               double value = boost::lexical_cast<double>(_parameters.at(2));\r
+                       double value = boost::lexical_cast<double>(_parameters.at(1));\r
                        \r
-                               auto transform = [=](image_transform transform) -> image_transform\r
-                               {\r
-                                       transform.set_opacity(value);\r
-                                       return transform;                                       \r
-                               };\r
+                       auto transform = [=](image_transform transform) -> image_transform\r
+                       {\r
+                               transform.set_opacity(value);\r
+                               return transform;                                       \r
+                       };\r
 \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
-                       }\r
-                       else if(_parameters[1] == L"FILL_RECT")\r
+                       int layer = GetLayerIndex();\r
+                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
+               }\r
+               else if(_parameters[0] == L"FILL")\r
+               {\r
+                       int duration = _parameters.size() > 5 ? lexical_cast_or_default(_parameters[5], 0) : 0;\r
+                       std::wstring tween = _parameters.size() > 6 ? _parameters[6] : L"linear";\r
+                       double x        = boost::lexical_cast<double>(_parameters.at(1));\r
+                       double y        = boost::lexical_cast<double>(_parameters.at(2));\r
+                       double x_s      = boost::lexical_cast<double>(_parameters.at(3));\r
+                       double y_s      = boost::lexical_cast<double>(_parameters.at(4));\r
+\r
+                       auto transform = [=](image_transform transform) -> image_transform\r
                        {\r
-                               int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[6], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear";\r
-                               double x        = boost::lexical_cast<double>(_parameters.at(2));\r
-                               double y        = boost::lexical_cast<double>(_parameters.at(3));\r
-                               double x_s      = boost::lexical_cast<double>(_parameters.at(4));\r
-                               double y_s      = boost::lexical_cast<double>(_parameters.at(5));\r
-\r
-                               auto transform = [=](image_transform transform) -> image_transform\r
-                               {\r
-                                       transform.set_fill_translation(x, y);\r
-                                       transform.set_fill_scale(x_s, y_s);\r
-                                       transform.set_clip_translation(x, y);\r
-                                       transform.set_clip_scale(x_s, y_s);\r
-                                       return transform;\r
-                               };\r
+                               transform.set_fill_translation(x, y);\r
+                               transform.set_fill_scale(x_s, y_s);\r
+                               transform.set_clip_translation(x, y);\r
+                               transform.set_clip_scale(x_s, y_s);\r
+                               return transform;\r
+                       };\r
                                \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
-                       }\r
-                       else if(_parameters[1] == L"CLIP_RECT")\r
+                       int layer = GetLayerIndex();\r
+                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
+               }\r
+               else if(_parameters[0] == L"MASK")\r
+               {\r
+                       int duration = _parameters.size() > 5 ? lexical_cast_or_default(_parameters[5], 0) : 0;\r
+                       std::wstring tween = _parameters.size() > 6 ? _parameters[6] : L"linear";\r
+                       double x        = boost::lexical_cast<double>(_parameters.at(1));\r
+                       double y        = boost::lexical_cast<double>(_parameters.at(2));\r
+                       double x_s      = boost::lexical_cast<double>(_parameters.at(3));\r
+                       double y_s      = boost::lexical_cast<double>(_parameters.at(4));\r
+\r
+                       auto transform = [=](image_transform transform) -> image_transform\r
                        {\r
-                               int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[6], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear";\r
-                               double x        = boost::lexical_cast<double>(_parameters.at(2));\r
-                               double y        = boost::lexical_cast<double>(_parameters.at(3));\r
-                               double x_s      = boost::lexical_cast<double>(_parameters.at(4));\r
-                               double y_s      = boost::lexical_cast<double>(_parameters.at(5));\r
-\r
-                               auto transform = [=](image_transform transform) -> image_transform\r
-                               {\r
-                                       transform.set_clip_translation(x, y);\r
-                                       transform.set_clip_scale(x_s, y_s);\r
-                                       return transform;\r
-                               };\r
+                               transform.set_clip_translation(x, y);\r
+                               transform.set_clip_scale(x_s, y_s);\r
+                               return transform;\r
+                       };\r
                                \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
-                       }\r
-                       else if(_parameters[1] == L"GRID")\r
+                       int layer = GetLayerIndex();\r
+                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
+               }\r
+               else if(_parameters[0] == L"GRID")\r
+               {\r
+                       int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
+                       std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
+                       int n = boost::lexical_cast<int>(_parameters.at(1));\r
+                       double delta = 1.0/static_cast<double>(n);\r
+                       for(int x = 0; x < n; ++x)\r
                        {\r
-                               int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
-                               int n = boost::lexical_cast<int>(_parameters.at(2));\r
-                               double delta = 1.0/static_cast<double>(n);\r
-                               for(int x = 0; x < n; ++x)\r
+                               for(int y = 0; y < n; ++y)\r
                                {\r
-                                       for(int y = 0; y < n; ++y)\r
-                                       {\r
-                                               int index = x+y*n+1;\r
-                                               auto transform = [=](image_transform transform) -> image_transform\r
-                                               {                               \r
-                                                       transform.set_fill_translation(x*delta, y*delta);\r
-                                                       transform.set_fill_scale(delta, delta);                 \r
-                                                       transform.set_clip_translation(x*delta, y*delta);\r
-                                                       transform.set_clip_scale(delta, delta);\r
-                                                       return transform;\r
-                                               };\r
-                                               GetChannel()->mixer()->apply_image_transform(index, transform, duration, tween);\r
-                                       }\r
+                                       int index = x+y*n+1;\r
+                                       auto transform = [=](image_transform transform) -> image_transform\r
+                                       {                               \r
+                                               transform.set_fill_translation(x*delta, y*delta);\r
+                                               transform.set_fill_scale(delta, delta);                 \r
+                                               transform.set_clip_translation(x*delta, y*delta);\r
+                                               transform.set_clip_scale(delta, delta);\r
+                                               return transform;\r
+                                       };\r
+                                       GetChannel()->mixer()->apply_image_transform(index, transform, duration, tween);\r
                                }\r
                        }\r
-                       else if(_parameters[1] == L"BLEND")\r
-                       {\r
-                               auto blend_str = _parameters.at(2);                                                             \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->set_blend_mode(GetLayerIndex(), get_blend_mode(blend_str));      \r
-                       }\r
-                       else if(_parameters[1] == L"BRIGHTNESS")\r
-                       {\r
-                               auto value = boost::lexical_cast<double>(_parameters.at(2));\r
-                               int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
-                               auto transform = [=](image_transform transform) -> image_transform\r
-                               {\r
-                                       transform.set_brightness(value);\r
-                                       return transform;\r
-                               };\r
-                               \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);      \r
-                       }\r
-                       else if(_parameters[1] == L"SATURATION")\r
+               }\r
+               else if(_parameters[0] == L"BLEND")\r
+               {\r
+                       auto blend_str = _parameters.at(1);                                                             \r
+                       int layer = GetLayerIndex();\r
+                       GetChannel()->mixer()->set_blend_mode(GetLayerIndex(), get_blend_mode(blend_str));      \r
+               }\r
+               else if(_parameters[0] == L"BRIGHTNESS")\r
+               {\r
+                       auto value = boost::lexical_cast<double>(_parameters.at(1));\r
+                       int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
+                       std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
+                       auto transform = [=](image_transform transform) -> image_transform\r
                        {\r
-                               auto value = boost::lexical_cast<double>(_parameters.at(2));\r
-                               int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
-                               auto transform = [=](image_transform transform) -> image_transform\r
-                               {\r
-                                       transform.set_saturation(value);\r
-                                       return transform;\r
-                               };\r
+                               transform.set_brightness(value);\r
+                               return transform;\r
+                       };\r
                                \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);      \r
-                       }\r
-                       else if(_parameters[1] == L"CONTRAST")\r
+                       int layer = GetLayerIndex();\r
+                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);      \r
+               }\r
+               else if(_parameters[0] == L"SATURATION")\r
+               {\r
+                       auto value = boost::lexical_cast<double>(_parameters.at(1));\r
+                       int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
+                       std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
+                       auto transform = [=](image_transform transform) -> image_transform\r
                        {\r
-                               auto value = boost::lexical_cast<double>(_parameters.at(2));\r
-                               int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
-                               auto transform = [=](image_transform transform) -> image_transform\r
-                               {\r
-                                       transform.set_contrast(value);\r
-                                       return transform;\r
-                               };\r
+                               transform.set_saturation(value);\r
+                               return transform;\r
+                       };\r
                                \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);      \r
-                       }\r
-                       else if(_parameters[1] == L"LEVELS")\r
+                       int layer = GetLayerIndex();\r
+                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);      \r
+               }\r
+               else if(_parameters[0] == L"CONTRAST")\r
+               {\r
+                       auto value = boost::lexical_cast<double>(_parameters.at(1));\r
+                       int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
+                       std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
+                       auto transform = [=](image_transform transform) -> image_transform\r
                        {\r
-                               image_transform::levels value;\r
-                               value.min_input  = boost::lexical_cast<double>(_parameters.at(2));\r
-                               value.max_input  = boost::lexical_cast<double>(_parameters.at(3));\r
-                               value.gamma              = boost::lexical_cast<double>(_parameters.at(4));\r
-                               value.min_output = boost::lexical_cast<double>(_parameters.at(5));\r
-                               value.max_output = boost::lexical_cast<double>(_parameters.at(6));\r
-                               int duration = _parameters.size() > 7 ? lexical_cast_or_default(_parameters[7], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 8 ? _parameters[8] : L"linear";\r
-\r
-                               auto transform = [=](image_transform transform) -> image_transform\r
-                               {\r
-                                       transform.set_levels(value);\r
-                                       return transform;\r
-                               };\r
+                               transform.set_contrast(value);\r
+                               return transform;\r
+                       };\r
                                \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);      \r
-                       }\r
-                       else if(_parameters[1] == L"RESET")\r
+                       int layer = GetLayerIndex();\r
+                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);      \r
+               }\r
+               else if(_parameters[0] == L"LEVELS")\r
+               {\r
+                       image_transform::levels value;\r
+                       value.min_input  = boost::lexical_cast<double>(_parameters.at(1));\r
+                       value.max_input  = boost::lexical_cast<double>(_parameters.at(2));\r
+                       value.gamma              = boost::lexical_cast<double>(_parameters.at(3));\r
+                       value.min_output = boost::lexical_cast<double>(_parameters.at(4));\r
+                       value.max_output = boost::lexical_cast<double>(_parameters.at(5));\r
+                       int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[6], 0) : 0;\r
+                       std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear";\r
+\r
+                       auto transform = [=](image_transform transform) -> image_transform\r
                        {\r
-                               int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
+                               transform.set_levels(value);\r
+                               return transform;\r
+                       };\r
                                \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->set_image_transform(GetLayerIndex(), image_transform(), duration, tween);\r
-                       }\r
+                       int layer = GetLayerIndex();\r
+                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);      \r
                }\r
-               else if(_parameters[0] == L"AUDIO")\r
+               else if(_parameters[0] == L"VOLUME")\r
                {\r
-                       if(_parameters[1] == L"GAIN")\r
-                       {\r
-                               int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
-                               double value = boost::lexical_cast<double>(_parameters[2]);\r
+                       int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
+                       std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
+                       double value = boost::lexical_cast<double>(_parameters[1]);\r
 \r
-                               auto transform = [=](audio_transform transform) -> audio_transform\r
-                               {\r
-                                       transform.set_gain(value);\r
-                                       return transform;\r
-                               };\r
-                               \r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->apply_audio_transform(GetLayerIndex(), transform, duration, tween);\r
-                       }\r
-                       else if(_parameters[1] == L"RESET")\r
+                       auto transform = [=](audio_transform transform) -> audio_transform\r
                        {\r
-                               int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
-                               std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
-\r
-                               int layer = GetLayerIndex();\r
-                               GetChannel()->mixer()->set_audio_transform(GetLayerIndex(), audio_transform(), duration, tween);\r
-                       }\r
+                               transform.set_volume(value);\r
+                               return transform;\r
+                       };\r
+                               \r
+                       int layer = GetLayerIndex();\r
+                       GetChannel()->mixer()->apply_audio_transform(GetLayerIndex(), transform, duration, tween);\r
                }\r
                else if(_parameters[0] == L"RESET")\r
                {\r
                        GetChannel()->mixer()->reset_transforms();\r
                }\r
+               else\r
+               {\r
+                       SetReplyString(TEXT("404 MIXER ERROR\r\n"));\r
+                       return false;\r
+               }\r
        \r
                SetReplyString(TEXT("202 MIXER OK\r\n"));\r
 \r