]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Per sample audio transitions.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 4 Mar 2011 18:46:41 +0000 (18:46 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 4 Mar 2011 18:46:41 +0000 (18:46 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@522 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/producer/ffmpeg/ffmpeg_producer.cpp
mixer/audio/audio_mixer.cpp
mixer/audio/audio_mixer.h
mixer/frame/write_frame.cpp
mixer/frame/write_frame.h

index 342c98c688e6145560b11de1c39cac847c9ed063..65f68c479b14919f1dbfeada75b5bdfcd3a66189 100644 (file)
@@ -89,6 +89,7 @@ public:
                                        try\r
                                        {\r
                                                auto frame = video_decoder_->execute(video_packet);\r
+                                               frame->tag(reinterpret_cast<int>(this));\r
                                                video_frame_channel_.push_back(std::move(frame));\r
                                        }\r
                                        catch(...)\r
index f90164886e63528c47cad243879da30265e36776..27c2a84f3177677b4b9e29fcc76c7fee0ec22404 100644 (file)
@@ -10,6 +10,8 @@ struct audio_mixer::implementation
        std::vector<short> audio_data_;\r
        std::stack<audio_transform> transform_stack_;\r
 \r
+       std::map<int, audio_transform> audio_transforms_;\r
+\r
 public:\r
        implementation()\r
        {\r
@@ -21,14 +23,16 @@ public:
                transform_stack_.push(transform_stack_.top()*transform);\r
        }\r
 \r
-       void process(const std::vector<short>& audio_data)\r
+       void process(const std::vector<short>& audio_data, int tag)\r
        {               \r
                if(audio_data_.empty())\r
                        audio_data_.resize(audio_data.size(), 0);\r
 \r
-               double gain = transform_stack_.top().get_gain();\r
-               if(gain < 0.001)\r
-                       return;\r
+               auto prev = audio_transforms_[tag];\r
+               auto next = transform_stack_.top();\r
+\r
+               auto prev_gain = prev.get_gain();\r
+               auto next_gain = next.get_gain();\r
 \r
                tbb::parallel_for\r
                (\r
@@ -37,14 +41,18 @@ public:
                        {\r
                                for(size_t n = r.begin(); n < r.end(); ++n)\r
                                {\r
+                                       double delta = static_cast<double>(n)/static_cast<double>(audio_data_.size());\r
+                                       double sample_gain = prev_gain * (1.0 - delta) + next_gain * delta;\r
                                        int sample = static_cast<int>(audio_data[n]);\r
-                                       sample = (static_cast<int>(gain*8192.0)*sample)/8192;\r
+                                       sample = (static_cast<int>(sample_gain*8192.0)*sample)/8192;\r
                                        audio_data_[n] = static_cast<short>((static_cast<int>(audio_data_[n]) + sample) & 0xFFFF);\r
                                }\r
                        }\r
                );\r
-       }\r
 \r
+               audio_transforms_[tag] = next;\r
+       }\r
+       \r
        void end()\r
        {\r
                transform_stack_.pop();\r
@@ -54,13 +62,17 @@ public:
        {\r
                return std::move(audio_data_);\r
        }\r
+\r
+       void end_pass()\r
+       {\r
+       }\r
 };\r
 \r
 audio_mixer::audio_mixer() : impl_(new implementation()){}\r
 void audio_mixer::begin(const audio_transform& transform){impl_->begin(transform);}\r
-void audio_mixer::process(const std::vector<short>& audio_data){impl_->process(audio_data);}\r
+void audio_mixer::process(const std::vector<short>& audio_data, int tag){impl_->process(audio_data, tag);}\r
 void audio_mixer::end(){impl_->end();}\r
 std::vector<short> audio_mixer::begin_pass(){return impl_->begin_pass();}      \r
-void audio_mixer::end_pass(){}\r
+void audio_mixer::end_pass(){impl_->end_pass();}\r
 \r
 }}
\ No newline at end of file
index bb09a02ee178a06c94f88a6d2ec9d5837c3ef7a9..dc4f805a203fff91a2ed479b855c092f4e5e9396 100644 (file)
@@ -12,9 +12,9 @@ public:
        audio_mixer();\r
 \r
        void begin(const audio_transform& transform);\r
-       void process(const std::vector<short>& audio_data);\r
+       void process(const std::vector<short>& audio_data, int tag);\r
        void end();\r
-       \r
+\r
        std::vector<short> begin_pass();\r
        void end_pass();\r
 \r
index 61994bf4ac08e75ee391887f82f0af81f9cf7655..7869b45f2761be166dbb4bef0e26cd26dd0fcd26 100644 (file)
@@ -22,12 +22,14 @@ struct write_frame::implementation : boost::noncopyable
        std::vector<safe_ptr<host_buffer>> buffers_;\r
        std::vector<short> audio_data_;\r
        const pixel_format_desc desc_;\r
+       int tag_;\r
 \r
 public:\r
        implementation(write_frame& self, const pixel_format_desc& desc, std::vector<safe_ptr<host_buffer>> buffers) \r
                : self_(self)\r
                , desc_(desc)\r
-               , buffers_(buffers){}\r
+               , buffers_(buffers)\r
+               , tag_(std::numeric_limits<int>::min()){}\r
        \r
        void process_image(image_mixer& mixer)\r
        {\r
@@ -39,7 +41,7 @@ public:
        void process_audio(audio_mixer& mixer)\r
        {\r
                mixer.begin(self_.get_audio_transform());\r
-               mixer.process(audio_data_);\r
+               mixer.process(audio_data_, tag_);\r
                mixer.end();\r
        }\r
 \r
@@ -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);}\r
 boost::iterator_range<unsigned char*> write_frame::image_data(size_t index){return impl_->image_data(index);}\r
 std::vector<short>& write_frame::audio_data() { return impl_->audio_data_; }\r
+void write_frame::tag(int tag) { impl_->tag_ = tag;}\r
+int write_frame::tag() const {return impl_->tag_;}\r
 }}
\ No newline at end of file
index 82671bf878d9d5802a29a3a5a2c59829ba2a130c..7f65668dc036ead0a5673907c0e506fd57c0aa65 100644 (file)
@@ -32,6 +32,9 @@ public:
 \r
        virtual void process_image(image_mixer& mixer);\r
        virtual void process_audio(audio_mixer& mixer);\r
+\r
+       void tag(int tag);\r
+       int tag() const;\r
        \r
 private:\r
        struct implementation;\r