From e34968be408433d1f66035dcc9c3149dbb2606a7 Mon Sep 17 00:00:00 2001 From: Ronag Date: Sun, 21 Aug 2011 11:37:58 +0000 Subject: [PATCH] 2.0. amcp: Simplified mixer commands. 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 | 10 +- core/producer/frame/audio_transform.cpp | 14 +- core/producer/frame/audio_transform.h | 6 +- .../transition/transition_producer.cpp | 4 +- protocol/amcp/AMCPCommandsImpl.cpp | 321 +++++++++--------- 5 files changed, 169 insertions(+), 186 deletions(-) diff --git a/core/mixer/audio/audio_mixer.cpp b/core/mixer/audio/audio_mixer.cpp index 7880c56a6..cea17e4a1 100644 --- a/core/mixer/audio/audio_mixer.cpp +++ b/core/mixer/audio/audio_mixer.cpp @@ -71,13 +71,13 @@ public: next_audio_transforms_[tag] = next; // Store all active tags, inactive tags will be removed in end_pass. - if(next.get_gain() < 0.001 && prev.get_gain() < 0.001) + if(next.get_volume() < 0.001 && prev.get_volume() < 0.001) return; static const int BASE = 1<<15; - const auto next_gain = static_cast(next.get_gain()*BASE); - const auto prev_gain = static_cast(prev.get_gain()*BASE); + const auto next_volume = static_cast(next.get_volume()*BASE); + const auto prev_volume = static_cast(prev.get_volume()*BASE); const int n_samples = audio_data_.back().size(); @@ -94,8 +94,8 @@ public: { for(size_t n = r.begin(); n < r.end(); ++n) { - const int sample_gain = (prev_gain - (prev_gain * n)/n_samples) + (next_gain * n)/n_samples; - const int sample = (static_cast(audio_data[n])*sample_gain)/BASE; + const int sample_volume = (prev_volume - (prev_volume * n)/n_samples) + (next_volume * n)/n_samples; + const int sample = (static_cast(audio_data[n])*sample_volume)/BASE; audio_data_.back()[n] = static_cast((static_cast(audio_data_.back()[n]) + sample) & 0xFFFF); } } diff --git a/core/producer/frame/audio_transform.cpp b/core/producer/frame/audio_transform.cpp index b68576672..4c85093eb 100644 --- a/core/producer/frame/audio_transform.cpp +++ b/core/producer/frame/audio_transform.cpp @@ -24,17 +24,17 @@ namespace caspar { namespace core { audio_transform::audio_transform() - : gain_(1.0) + : volume_(1.0) , has_audio_(true){} -void audio_transform::set_gain(double value) +void audio_transform::set_volume(double value) { - gain_ = std::max(0.0, value); + volume_ = std::max(0.0, value); } -double audio_transform::get_gain() const +double audio_transform::get_volume() const { - return gain_; + return volume_; } void audio_transform::set_has_audio(bool value) @@ -49,7 +49,7 @@ bool audio_transform::get_has_audio() const audio_transform& audio_transform::operator*=(const audio_transform &other) { - gain_ *= other.gain_; + volume_ *= other.volume_; has_audio_ &= other.has_audio_; return *this; } @@ -67,7 +67,7 @@ audio_transform tween(double time, const audio_transform& source, const audio_tr }; audio_transform result; - result.set_gain(do_tween(time, source.get_gain(), dest.get_gain(), duration, tweener)); + result.set_volume(do_tween(time, source.get_volume(), dest.get_volume(), duration, tweener)); result.set_has_audio(source.get_has_audio() || dest.get_has_audio()); return result; } diff --git a/core/producer/frame/audio_transform.h b/core/producer/frame/audio_transform.h index c8747cc18..596c106d4 100644 --- a/core/producer/frame/audio_transform.h +++ b/core/producer/frame/audio_transform.h @@ -28,8 +28,8 @@ class audio_transform public: audio_transform(); - void set_gain(double value); - double get_gain() const; + void set_volume(double value); + double get_volume() const; void set_has_audio(bool value); bool get_has_audio() const; @@ -37,7 +37,7 @@ public: audio_transform& operator*=(const audio_transform &other); const audio_transform operator*(const audio_transform &other) const; private: - double gain_; + double volume_; bool has_audio_; }; diff --git a/core/producer/transition/transition_producer.cpp b/core/producer/transition/transition_producer.cpp index f0ad622ef..204eb084f 100644 --- a/core/producer/transition/transition_producer.cpp +++ b/core/producer/transition/transition_producer.cpp @@ -121,13 +121,13 @@ struct transition_producer : public frame_producer auto s_frame2 = make_safe(src_frame); s_frame1->get_audio_transform().set_has_audio(false); - s_frame2->get_audio_transform().set_gain(1.0-delta2); + s_frame2->get_audio_transform().set_volume(1.0-delta2); auto d_frame1 = make_safe(dest_frame); auto d_frame2 = make_safe(dest_frame); d_frame1->get_audio_transform().set_has_audio(false); - d_frame2->get_audio_transform().set_gain(delta2); + d_frame2->get_audio_transform().set_volume(delta2); //if(info_.type == transition::mix) //{ diff --git a/protocol/amcp/AMCPCommandsImpl.cpp b/protocol/amcp/AMCPCommandsImpl.cpp index cb136da78..db1683286 100644 --- a/protocol/amcp/AMCPCommandsImpl.cpp +++ b/protocol/amcp/AMCPCommandsImpl.cpp @@ -221,206 +221,189 @@ bool MixerCommand::DoExecute() //Perform loading of the clip try { - if(_parameters[0] == L"VIDEO") + if(_parameters[0] == L"KEYER") { - if(_parameters[1] == L"IS_KEY") + bool value = lexical_cast_or_default(_parameters.at(1), false); + auto transform = [=](image_transform transform) -> image_transform { - bool value = lexical_cast_or_default(_parameters.at(2), false); - auto transform = [=](image_transform transform) -> image_transform - { - transform.set_is_key(value); - return transform; - }; + transform.set_is_key(value); + return transform; + }; - int layer = GetLayerIndex(); - GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform); - } - else if(_parameters[1] == L"OPACITY") - { - int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0; - std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear"; + int layer = GetLayerIndex(); + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform); + } + else if(_parameters[0] == L"OPACITY") + { + int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0; + std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; - double value = boost::lexical_cast(_parameters.at(2)); + double value = boost::lexical_cast(_parameters.at(1)); - auto transform = [=](image_transform transform) -> image_transform - { - transform.set_opacity(value); - return transform; - }; + auto transform = [=](image_transform transform) -> image_transform + { + transform.set_opacity(value); + return transform; + }; - int layer = GetLayerIndex(); - GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); - } - else if(_parameters[1] == L"FILL_RECT") + int layer = GetLayerIndex(); + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); + } + else if(_parameters[0] == L"FILL") + { + int duration = _parameters.size() > 5 ? lexical_cast_or_default(_parameters[5], 0) : 0; + std::wstring tween = _parameters.size() > 6 ? _parameters[6] : L"linear"; + double x = boost::lexical_cast(_parameters.at(1)); + double y = boost::lexical_cast(_parameters.at(2)); + double x_s = boost::lexical_cast(_parameters.at(3)); + double y_s = boost::lexical_cast(_parameters.at(4)); + + auto transform = [=](image_transform transform) -> image_transform { - int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[6], 0) : 0; - std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear"; - double x = boost::lexical_cast(_parameters.at(2)); - double y = boost::lexical_cast(_parameters.at(3)); - double x_s = boost::lexical_cast(_parameters.at(4)); - double y_s = boost::lexical_cast(_parameters.at(5)); - - auto transform = [=](image_transform transform) -> image_transform - { - transform.set_fill_translation(x, y); - transform.set_fill_scale(x_s, y_s); - transform.set_clip_translation(x, y); - transform.set_clip_scale(x_s, y_s); - return transform; - }; + transform.set_fill_translation(x, y); + transform.set_fill_scale(x_s, y_s); + transform.set_clip_translation(x, y); + transform.set_clip_scale(x_s, y_s); + return transform; + }; - int layer = GetLayerIndex(); - GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); - } - else if(_parameters[1] == L"CLIP_RECT") + int layer = GetLayerIndex(); + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); + } + else if(_parameters[0] == L"MASK") + { + int duration = _parameters.size() > 5 ? lexical_cast_or_default(_parameters[5], 0) : 0; + std::wstring tween = _parameters.size() > 6 ? _parameters[6] : L"linear"; + double x = boost::lexical_cast(_parameters.at(1)); + double y = boost::lexical_cast(_parameters.at(2)); + double x_s = boost::lexical_cast(_parameters.at(3)); + double y_s = boost::lexical_cast(_parameters.at(4)); + + auto transform = [=](image_transform transform) -> image_transform { - int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[6], 0) : 0; - std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear"; - double x = boost::lexical_cast(_parameters.at(2)); - double y = boost::lexical_cast(_parameters.at(3)); - double x_s = boost::lexical_cast(_parameters.at(4)); - double y_s = boost::lexical_cast(_parameters.at(5)); - - auto transform = [=](image_transform transform) -> image_transform - { - transform.set_clip_translation(x, y); - transform.set_clip_scale(x_s, y_s); - return transform; - }; + transform.set_clip_translation(x, y); + transform.set_clip_scale(x_s, y_s); + return transform; + }; - int layer = GetLayerIndex(); - GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); - } - else if(_parameters[1] == L"GRID") + int layer = GetLayerIndex(); + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); + } + else if(_parameters[0] == L"GRID") + { + int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0; + std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; + int n = boost::lexical_cast(_parameters.at(1)); + double delta = 1.0/static_cast(n); + for(int x = 0; x < n; ++x) { - int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0; - std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear"; - int n = boost::lexical_cast(_parameters.at(2)); - double delta = 1.0/static_cast(n); - for(int x = 0; x < n; ++x) + for(int y = 0; y < n; ++y) { - for(int y = 0; y < n; ++y) - { - int index = x+y*n+1; - auto transform = [=](image_transform transform) -> image_transform - { - transform.set_fill_translation(x*delta, y*delta); - transform.set_fill_scale(delta, delta); - transform.set_clip_translation(x*delta, y*delta); - transform.set_clip_scale(delta, delta); - return transform; - }; - GetChannel()->mixer()->apply_image_transform(index, transform, duration, tween); - } + int index = x+y*n+1; + auto transform = [=](image_transform transform) -> image_transform + { + transform.set_fill_translation(x*delta, y*delta); + transform.set_fill_scale(delta, delta); + transform.set_clip_translation(x*delta, y*delta); + transform.set_clip_scale(delta, delta); + return transform; + }; + GetChannel()->mixer()->apply_image_transform(index, transform, duration, tween); } } - else if(_parameters[1] == L"BLEND") - { - auto blend_str = _parameters.at(2); - int layer = GetLayerIndex(); - GetChannel()->mixer()->set_blend_mode(GetLayerIndex(), get_blend_mode(blend_str)); - } - else if(_parameters[1] == L"BRIGHTNESS") - { - auto value = boost::lexical_cast(_parameters.at(2)); - int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0; - std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear"; - auto transform = [=](image_transform transform) -> image_transform - { - transform.set_brightness(value); - return transform; - }; - - int layer = GetLayerIndex(); - GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); - } - else if(_parameters[1] == L"SATURATION") + } + else if(_parameters[0] == L"BLEND") + { + auto blend_str = _parameters.at(1); + int layer = GetLayerIndex(); + GetChannel()->mixer()->set_blend_mode(GetLayerIndex(), get_blend_mode(blend_str)); + } + else if(_parameters[0] == L"BRIGHTNESS") + { + auto value = boost::lexical_cast(_parameters.at(1)); + int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0; + std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; + auto transform = [=](image_transform transform) -> image_transform { - auto value = boost::lexical_cast(_parameters.at(2)); - int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0; - std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear"; - auto transform = [=](image_transform transform) -> image_transform - { - transform.set_saturation(value); - return transform; - }; + transform.set_brightness(value); + return transform; + }; - int layer = GetLayerIndex(); - GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); - } - else if(_parameters[1] == L"CONTRAST") + int layer = GetLayerIndex(); + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); + } + else if(_parameters[0] == L"SATURATION") + { + auto value = boost::lexical_cast(_parameters.at(1)); + int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0; + std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; + auto transform = [=](image_transform transform) -> image_transform { - auto value = boost::lexical_cast(_parameters.at(2)); - int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0; - std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear"; - auto transform = [=](image_transform transform) -> image_transform - { - transform.set_contrast(value); - return transform; - }; + transform.set_saturation(value); + return transform; + }; - int layer = GetLayerIndex(); - GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); - } - else if(_parameters[1] == L"LEVELS") + int layer = GetLayerIndex(); + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); + } + else if(_parameters[0] == L"CONTRAST") + { + auto value = boost::lexical_cast(_parameters.at(1)); + int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0; + std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; + auto transform = [=](image_transform transform) -> image_transform { - image_transform::levels value; - value.min_input = boost::lexical_cast(_parameters.at(2)); - value.max_input = boost::lexical_cast(_parameters.at(3)); - value.gamma = boost::lexical_cast(_parameters.at(4)); - value.min_output = boost::lexical_cast(_parameters.at(5)); - value.max_output = boost::lexical_cast(_parameters.at(6)); - int duration = _parameters.size() > 7 ? lexical_cast_or_default(_parameters[7], 0) : 0; - std::wstring tween = _parameters.size() > 8 ? _parameters[8] : L"linear"; - - auto transform = [=](image_transform transform) -> image_transform - { - transform.set_levels(value); - return transform; - }; + transform.set_contrast(value); + return transform; + }; - int layer = GetLayerIndex(); - GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); - } - else if(_parameters[1] == L"RESET") + int layer = GetLayerIndex(); + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); + } + else if(_parameters[0] == L"LEVELS") + { + image_transform::levels value; + value.min_input = boost::lexical_cast(_parameters.at(1)); + value.max_input = boost::lexical_cast(_parameters.at(2)); + value.gamma = boost::lexical_cast(_parameters.at(3)); + value.min_output = boost::lexical_cast(_parameters.at(4)); + value.max_output = boost::lexical_cast(_parameters.at(5)); + int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[6], 0) : 0; + std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear"; + + auto transform = [=](image_transform transform) -> image_transform { - int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0; - std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; + transform.set_levels(value); + return transform; + }; - int layer = GetLayerIndex(); - GetChannel()->mixer()->set_image_transform(GetLayerIndex(), image_transform(), duration, tween); - } + int layer = GetLayerIndex(); + GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); } - else if(_parameters[0] == L"AUDIO") + else if(_parameters[0] == L"VOLUME") { - if(_parameters[1] == L"GAIN") - { - int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0; - std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear"; - double value = boost::lexical_cast(_parameters[2]); + int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0; + std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; + double value = boost::lexical_cast(_parameters[1]); - auto transform = [=](audio_transform transform) -> audio_transform - { - transform.set_gain(value); - return transform; - }; - - int layer = GetLayerIndex(); - GetChannel()->mixer()->apply_audio_transform(GetLayerIndex(), transform, duration, tween); - } - else if(_parameters[1] == L"RESET") + auto transform = [=](audio_transform transform) -> audio_transform { - int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0; - std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear"; - - int layer = GetLayerIndex(); - GetChannel()->mixer()->set_audio_transform(GetLayerIndex(), audio_transform(), duration, tween); - } + transform.set_volume(value); + return transform; + }; + + int layer = GetLayerIndex(); + GetChannel()->mixer()->apply_audio_transform(GetLayerIndex(), transform, duration, tween); } else if(_parameters[0] == L"RESET") { GetChannel()->mixer()->reset_transforms(); } + else + { + SetReplyString(TEXT("404 MIXER ERROR\r\n")); + return false; + } SetReplyString(TEXT("202 MIXER OK\r\n")); -- 2.39.2