]> git.sesse.net Git - casparcg/commitdiff
Manually merged a8cbbe3ea46850ad53c25a8e75194c5c1ecbb029 from master
authorHelge Norberg <helge.norberg@svt.se>
Wed, 10 Apr 2013 09:05:01 +0000 (11:05 +0200)
committerHelge Norberg <helge.norberg@svt.se>
Wed, 10 Apr 2013 09:05:01 +0000 (11:05 +0200)
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 878b56ac0f3fc8391f9790b503ba8df596f48f1c..8a4bc289f670f815af4af7e02244d34ede134e83 100644 (file)
@@ -75,9 +75,12 @@ struct audio_mixer::impl : boost::noncopyable
        std::vector<audio_item>                         items_;
        std::vector<int>                                        audio_cadence_;
        video_format_desc                                       format_desc_;
-       
+       float                                                           master_volume_;
+       float                                                           previous_master_volume_;
 public:
        impl()
+               : master_volume_(1.0f)
+               , previous_master_volume_(master_volume_)
        {
                transform_stack_.push(core::audio_transform());
        }
@@ -112,7 +115,12 @@ public:
        {
                transform_stack_.pop();
        }
-       
+
+       void set_master_volume(float volume)
+       {
+               master_volume_ = volume;
+       }
+
        audio_buffer mix(const video_format_desc& format_desc)
        {       
                if(format_desc_ != format_desc)
@@ -150,20 +158,24 @@ public:
                        if(it == audio_streams_.end() && item.audio_data.empty()) 
                                continue;
                                                
-                       const float prev_volume = static_cast<float>(prev_transform.volume);
-                       const float next_volume = static_cast<float>(next_transform.volume);
-                                               
+                       const float prev_volume = static_cast<float>(prev_transform.volume) * previous_master_volume_;
+                       const float next_volume = static_cast<float>(next_transform.volume) * master_volume_;
+
                        // TODO: Move volume mixing into code below, in order to support audio sample counts not corresponding to frame audio samples.
                        auto alpha = (next_volume-prev_volume)/static_cast<float>(item.audio_data.size()/format_desc.audio_channels);
                        
                        for(size_t n = 0; n < item.audio_data.size(); ++n)
-                               next_audio.push_back(item.audio_data[n] * (prev_volume + (n/format_desc_.audio_channels) * alpha));
+                       {
+                               auto sample_multiplier = (prev_volume + (n/format_desc_.audio_channels) * alpha);
+                               next_audio.push_back(item.audio_data[n] * sample_multiplier);
+                       } 
                                                                                
                        next_audio_streams[tag].prev_transform  = std::move(next_transform); // Store all active tags, inactive tags will be removed at the end.
                        next_audio_streams[tag].audio_data              = std::move(next_audio);        
                        next_audio_streams[tag].is_still                = item.transform.is_still;
                }                               
 
+               previous_master_volume_ = master_volume_;
                items_.clear();
 
                audio_streams_ = std::move(next_audio_streams);
@@ -195,6 +207,7 @@ audio_mixer::audio_mixer() : impl_(new impl()){}
 void audio_mixer::push(const frame_transform& transform){impl_->push(transform);}
 void audio_mixer::visit(const const_frame& frame){impl_->visit(frame);}
 void audio_mixer::pop(){impl_->pop();}
+void audio_mixer::set_master_volume(float volume) { impl_->set_master_volume(volume); }
 audio_buffer audio_mixer::operator()(const video_format_desc& format_desc){return impl_->mix(format_desc);}
 
 }}
\ No newline at end of file
index 77a5e2fad72e8925937c4ed0eebeca9614f69798..2d1f862bc6780cef1049d9faea819745f75023b7 100644 (file)
@@ -51,6 +51,7 @@ public:
        // Methods
        
        audio_buffer operator()(const struct video_format_desc& format_desc);
+       void set_master_volume(float volume); 
 
        // frame_visitor
 
index 9756f750dbae627b922e0554f3ed758476ac0348..bc88fc16e0ca842d04f5d6842267a58861cd4b19 100644 (file)
@@ -137,7 +137,16 @@ public:
                {
                        blend_modes_.clear();
                }, task_priority::high_priority);
-       }       
+       }
+
+       void set_master_volume(float volume)
+       {
+               executor_.begin_invoke([=]
+               {
+                       audio_mixer_.set_master_volume(volume);
+               }, task_priority::high_priority);
+       }
+
        boost::unique_future<boost::property_tree::wptree> info() const
        {
                boost::promise<boost::property_tree::wptree> info;
@@ -151,6 +160,7 @@ mixer::mixer(spl::shared_ptr<diagnostics::graph> graph, spl::shared_ptr<image_mi
 void mixer::set_blend_mode(int index, blend_mode value){impl_->set_blend_mode(index, value);}
 void mixer::clear_blend_mode(int index) { impl_->clear_blend_mode(index); }
 void mixer::clear_blend_modes() { impl_->clear_blend_modes(); }
+void mixer::set_master_volume(float volume) { impl_->set_master_volume(volume); }
 boost::unique_future<boost::property_tree::wptree> mixer::info() const{return impl_->info();}
 const_frame mixer::operator()(std::map<int, draw_frame> frames, const struct video_format_desc& format_desc){return (*impl_)(std::move(frames), format_desc);}
 mutable_frame mixer::create_frame(const void* tag, const core::pixel_format_desc& desc) {return impl_->image_mixer_->create_frame(tag, desc);}
index 66ac15a1ad7829c758c696deaa3a67f22857a8b6..d580fae4dcf90dc7a561e7dffcc1f9f5096ff436 100644 (file)
@@ -60,6 +60,8 @@ public:
 
        void clear_blend_modes();
 
+       void set_master_volume(float volume);
+
        class mutable_frame create_frame(const void* tag, const struct pixel_format_desc& desc);
 
        // Properties
index bc076816a35eb25efd57d03b9b8c039d23b608b4..de5f5c0750b16de81412293935937dd46db2081c 100644 (file)
@@ -493,6 +493,11 @@ bool MixerCommand::DoExecute()
                        int layer = GetLayerIndex();
                        GetChannel()->mixer().set_blend_mode(GetLayerIndex(), get_blend_mode(blend_str));       
                }
+               else if(_parameters[0] == L"MASTERVOLUME")
+               {
+                       float master_volume = boost::lexical_cast<float>(_parameters.at(1));
+                       GetChannel()->mixer().set_master_volume(master_volume);
+               }
                else if(_parameters[0] == L"BRIGHTNESS")
                {
                        auto value = boost::lexical_cast<double>(_parameters.at(1));