From: ronag Date: Fri, 4 Mar 2011 18:46:41 +0000 (+0000) Subject: 2.0.0.2: Per sample audio transitions. X-Git-Tag: 2.0.1~705 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=90f0fc83b25565df07d052209f2312ea9a02f785;p=casparcg 2.0.0.2: Per sample audio transitions. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@522 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- diff --git a/core/producer/ffmpeg/ffmpeg_producer.cpp b/core/producer/ffmpeg/ffmpeg_producer.cpp index 342c98c68..65f68c479 100644 --- a/core/producer/ffmpeg/ffmpeg_producer.cpp +++ b/core/producer/ffmpeg/ffmpeg_producer.cpp @@ -89,6 +89,7 @@ public: try { auto frame = video_decoder_->execute(video_packet); + frame->tag(reinterpret_cast(this)); video_frame_channel_.push_back(std::move(frame)); } catch(...) diff --git a/mixer/audio/audio_mixer.cpp b/mixer/audio/audio_mixer.cpp index f90164886..27c2a84f3 100644 --- a/mixer/audio/audio_mixer.cpp +++ b/mixer/audio/audio_mixer.cpp @@ -10,6 +10,8 @@ struct audio_mixer::implementation std::vector audio_data_; std::stack transform_stack_; + std::map audio_transforms_; + public: implementation() { @@ -21,14 +23,16 @@ public: transform_stack_.push(transform_stack_.top()*transform); } - void process(const std::vector& audio_data) + void process(const std::vector& audio_data, int tag) { if(audio_data_.empty()) audio_data_.resize(audio_data.size(), 0); - double gain = transform_stack_.top().get_gain(); - if(gain < 0.001) - return; + auto prev = audio_transforms_[tag]; + auto next = transform_stack_.top(); + + auto prev_gain = prev.get_gain(); + auto next_gain = next.get_gain(); tbb::parallel_for ( @@ -37,14 +41,18 @@ public: { for(size_t n = r.begin(); n < r.end(); ++n) { + double delta = static_cast(n)/static_cast(audio_data_.size()); + double sample_gain = prev_gain * (1.0 - delta) + next_gain * delta; int sample = static_cast(audio_data[n]); - sample = (static_cast(gain*8192.0)*sample)/8192; + sample = (static_cast(sample_gain*8192.0)*sample)/8192; audio_data_[n] = static_cast((static_cast(audio_data_[n]) + sample) & 0xFFFF); } } ); - } + audio_transforms_[tag] = next; + } + void end() { transform_stack_.pop(); @@ -54,13 +62,17 @@ public: { return std::move(audio_data_); } + + void end_pass() + { + } }; audio_mixer::audio_mixer() : impl_(new implementation()){} void audio_mixer::begin(const audio_transform& transform){impl_->begin(transform);} -void audio_mixer::process(const std::vector& audio_data){impl_->process(audio_data);} +void audio_mixer::process(const std::vector& audio_data, int tag){impl_->process(audio_data, tag);} void audio_mixer::end(){impl_->end();} std::vector audio_mixer::begin_pass(){return impl_->begin_pass();} -void audio_mixer::end_pass(){} +void audio_mixer::end_pass(){impl_->end_pass();} }} \ No newline at end of file diff --git a/mixer/audio/audio_mixer.h b/mixer/audio/audio_mixer.h index bb09a02ee..dc4f805a2 100644 --- a/mixer/audio/audio_mixer.h +++ b/mixer/audio/audio_mixer.h @@ -12,9 +12,9 @@ public: audio_mixer(); void begin(const audio_transform& transform); - void process(const std::vector& audio_data); + void process(const std::vector& audio_data, int tag); void end(); - + std::vector begin_pass(); void end_pass(); diff --git a/mixer/frame/write_frame.cpp b/mixer/frame/write_frame.cpp index 61994bf4a..7869b45f2 100644 --- a/mixer/frame/write_frame.cpp +++ b/mixer/frame/write_frame.cpp @@ -22,12 +22,14 @@ struct write_frame::implementation : boost::noncopyable std::vector> buffers_; std::vector audio_data_; const pixel_format_desc desc_; + int tag_; public: implementation(write_frame& self, const pixel_format_desc& desc, std::vector> buffers) : self_(self) , desc_(desc) - , buffers_(buffers){} + , buffers_(buffers) + , tag_(std::numeric_limits::min()){} void process_image(image_mixer& mixer) { @@ -39,7 +41,7 @@ public: void process_audio(audio_mixer& mixer) { mixer.begin(self_.get_audio_transform()); - mixer.process(audio_data_); + mixer.process(audio_data_, tag_); mixer.end(); } @@ -76,4 +78,6 @@ void write_frame::process_image(image_mixer& mixer){impl_->process_image(mixer); void write_frame::process_audio(audio_mixer& mixer){impl_->process_audio(mixer);} boost::iterator_range write_frame::image_data(size_t index){return impl_->image_data(index);} std::vector& write_frame::audio_data() { return impl_->audio_data_; } +void write_frame::tag(int tag) { impl_->tag_ = tag;} +int write_frame::tag() const {return impl_->tag_;} }} \ No newline at end of file diff --git a/mixer/frame/write_frame.h b/mixer/frame/write_frame.h index 82671bf87..7f65668dc 100644 --- a/mixer/frame/write_frame.h +++ b/mixer/frame/write_frame.h @@ -32,6 +32,9 @@ public: virtual void process_image(image_mixer& mixer); virtual void process_audio(audio_mixer& mixer); + + void tag(int tag); + int tag() const; private: struct implementation;