]> git.sesse.net Git - casparcg/commitdiff
Added support for setting a mastervolume for a channel. Examples:
authorhellgore <hellgore@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 12 Feb 2013 14:21:25 +0000 (14:21 +0000)
committerhellgore <hellgore@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 12 Feb 2013 14:21:25 +0000 (14:21 +0000)
MIXER 1 MASTERVOLUME 1
MIXER 1 MASTERVOLUME 0.5
MIXER 1 MASTERVOLUME 0
MIXER 1 MASTERVOLUME 1.1

git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/trunk@3748 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/audio/audio_mixer.cpp
core/mixer/audio/audio_mixer.h
core/mixer/mixer.cpp
core/mixer/mixer.h
protocol/amcp/AMCPCommandsImpl.cpp

index 6e35f66b57ff1df0765329e5533076983b387930..eea3057cf2be6f9df6d08d85462dba9040d55cf7 100644 (file)
@@ -72,11 +72,15 @@ struct audio_mixer::implementation
        std::vector<audio_item>                         items_;\r
        std::vector<size_t>                                     audio_cadence_;\r
        video_format_desc                                       format_desc_;\r
+       float                                                           master_volume_;\r
+       float                                                           previous_master_volume_;\r
        \r
 public:\r
        implementation(const safe_ptr<diagnostics::graph>& graph)\r
                : graph_(graph)\r
                , format_desc_(video_format_desc::get(video_format::invalid))\r
+               , master_volume_(1.0f)\r
+               , previous_master_volume_(master_volume_)\r
        {\r
                graph_->set_color("volume", diagnostics::color(1.0f, 0.8f, 0.1f));\r
                transform_stack_.push(core::frame_transform());\r
@@ -109,6 +113,11 @@ public:
        {\r
                transform_stack_.pop();\r
        }\r
+\r
+       void set_master_volume(float volume)\r
+       {\r
+               master_volume_ = volume;\r
+       }\r
        \r
        audio_buffer mix(const video_format_desc& format_desc)\r
        {       \r
@@ -138,18 +147,22 @@ public:
                        if(prev_transform.volume < 0.001 && next_transform.volume < 0.001)\r
                                continue;\r
                        \r
-                       const float prev_volume = static_cast<float>(prev_transform.volume);\r
-                       const float next_volume = static_cast<float>(next_transform.volume);\r
+                       const float prev_volume = static_cast<float>(prev_transform.volume) * previous_master_volume_;\r
+                       const float next_volume = static_cast<float>(next_transform.volume) * master_volume_;\r
                                                                        \r
                        auto alpha = (next_volume-prev_volume)/static_cast<float>(item.audio_data.size()/format_desc.audio_channels);\r
                        \r
                        for(size_t n = 0; n < item.audio_data.size(); ++n)\r
-                               next_audio.push_back(item.audio_data[n] * (prev_volume + (n/format_desc_.audio_channels) * alpha));\r
+                       {\r
+                               auto sample_multiplier = (prev_volume + (n/format_desc_.audio_channels) * alpha);\r
+                               next_audio.push_back(item.audio_data[n] * sample_multiplier);\r
+                       }\r
                                                                                \r
                        next_audio_streams[item.tag].prev_transform  = std::move(next_transform); // Store all active tags, inactive tags will be removed at the end.\r
                        next_audio_streams[item.tag].audio_data          = std::move(next_audio);                       \r
-               }                               \r
+               }\r
 \r
+               previous_master_volume_ = master_volume_;\r
                items_.clear();\r
 \r
                audio_streams_ = std::move(next_audio_streams);\r
@@ -169,6 +182,7 @@ public:
                }\r
 \r
                std::vector<float> result_ps(audio_cadence_.front(), 0.0f);\r
+\r
                BOOST_FOREACH(auto& stream, audio_streams_ | boost::adaptors::map_values)\r
                {\r
                        //CASPAR_LOG(debug) << stream.audio_data.size() << L" : " << result_ps.size();\r
@@ -181,7 +195,7 @@ public:
 \r
                        auto out = boost::range::transform(result_ps, stream.audio_data, std::begin(result_ps), std::plus<float>());\r
                        stream.audio_data.erase(std::begin(stream.audio_data), std::begin(stream.audio_data) + std::distance(std::begin(result_ps), out));\r
-               }               \r
+               }\r
                \r
                boost::range::rotate(audio_cadence_, std::begin(audio_cadence_)+1);\r
                \r
@@ -201,6 +215,7 @@ audio_mixer::audio_mixer(const safe_ptr<diagnostics::graph>& graph) : impl_(new
 void audio_mixer::begin(core::basic_frame& frame){impl_->begin(frame);}\r
 void audio_mixer::visit(core::write_frame& frame){impl_->visit(frame);}\r
 void audio_mixer::end(){impl_->end();}\r
+void audio_mixer::set_master_volume(float volume) { impl_->set_master_volume(volume); }\r
 audio_buffer audio_mixer::operator()(const video_format_desc& format_desc){return impl_->mix(format_desc);}\r
 \r
 }}
\ No newline at end of file
index 622a09b1c3474713f1d9dba2d7e37e1d85e481c2..38134f971def23a9d620164b1ed6ba2984f6ffc5 100644 (file)
@@ -54,6 +54,8 @@ public:
        virtual void visit(core::write_frame& frame);\r
        virtual void end();\r
 \r
+       void set_master_volume(float volume);\r
+\r
        audio_buffer operator()(const video_format_desc& format_desc);\r
        \r
 private:\r
index 471647e5c606b0b9bc8ff267e54f3a47e926c997..34bad4560153a560fca9a8d832daa4c172dcc2c6 100644 (file)
@@ -149,6 +149,14 @@ public:
                        blend_modes_.clear();\r
                }, high_priority);\r
        }\r
+\r
+       void set_master_volume(float volume)\r
+       {\r
+               executor_.begin_invoke([=]\r
+               {\r
+                       audio_mixer_.set_master_volume(volume);\r
+               }, high_priority);\r
+       }\r
        \r
        void set_video_format_desc(const video_format_desc& format_desc)\r
        {\r
@@ -181,6 +189,7 @@ safe_ptr<core::write_frame> mixer::create_frame(const void* tag, const core::pix
 void mixer::set_blend_mode(int index, blend_mode::type value){impl_->set_blend_mode(index, value);}\r
 void mixer::clear_blend_mode(int index) { impl_->clear_blend_mode(index); }\r
 void mixer::clear_blend_modes() { impl_->clear_blend_modes(); }\r
+void mixer::set_master_volume(float volume) { impl_->set_master_volume(volume); }\r
 void mixer::set_video_format_desc(const video_format_desc& format_desc){impl_->set_video_format_desc(format_desc);}\r
 boost::unique_future<boost::property_tree::wptree> mixer::info() const{return impl_->info();}\r
 }}
\ No newline at end of file
index 560b2ded4801df021b60239efc1c57a1559d7080..2ee82411c10451ea7ed5a814799a91a257de983f 100644 (file)
@@ -68,7 +68,10 @@ public:
        \r
        void set_blend_mode(int index, blend_mode::type value);\r
        void clear_blend_mode(int index);\r
-       void clear_blend_modes();\r\r
+       void clear_blend_modes();\r
+\r
+       void set_master_volume(float volume);\r
+\r
        boost::unique_future<boost::property_tree::wptree> info() const;\r
        \r
 private:\r
index 6377ddd503ae8ba2c8674efebcc389a02d837348..cae1534c89b1c7a1cb9d436fbd91db787d065fdc 100644 (file)
@@ -509,6 +509,11 @@ bool MixerCommand::DoExecute()
                        int layer = GetLayerIndex();\r
                        GetChannel()->mixer()->set_blend_mode(GetLayerIndex(), get_blend_mode(blend_str));      \r
                }\r
+               else if(_parameters[0] == L"MASTERVOLUME")\r
+               {\r
+                       float master_volume = boost::lexical_cast<float>(_parameters.at(1));\r
+                       GetChannel()->mixer()->set_master_volume(master_volume);\r
+               }\r
                else if(_parameters[0] == L"BRIGHTNESS")\r
                {\r
                        auto value = boost::lexical_cast<double>(_parameters.at(1));\r