]> git.sesse.net Git - casparcg/blobdiff - core/mixer/audio/audio_mixer.cpp
2.0.0.2: SET MODE: Does not clear producers.
[casparcg] / core / mixer / audio / audio_mixer.cpp
index a42b27cc401cace80a758359fe4b514e63d825e0..e0b5b424b765c59234f0b93c14813e9a9a36c74d 100644 (file)
@@ -28,7 +28,7 @@ namespace caspar { namespace core {
        \r
 struct audio_mixer::implementation\r
 {\r
-       std::vector<int16_t> audio_data_;\r
+       std::deque<std::vector<int16_t>> audio_data_;\r
        std::stack<core::audio_transform> transform_stack_;\r
 \r
        std::map<int, core::audio_transform> prev_audio_transforms_;\r
@@ -38,6 +38,7 @@ public:
        implementation()\r
        {\r
                transform_stack_.push(core::audio_transform());\r
+               audio_data_.push_back(std::vector<int16_t>());\r
        }\r
        \r
        void begin(const core::basic_frame& frame)\r
@@ -53,8 +54,8 @@ public:
                auto& audio_data = frame.audio_data();\r
                auto tag = frame.tag(); // Get the identifier for the audio-stream.\r
 \r
-               if(audio_data_.empty())\r
-                       audio_data_.resize(audio_data.size(), 0);\r
+               if(audio_data_.back().empty())\r
+                       audio_data_.back().resize(audio_data.size(), 0);\r
                \r
                auto next = transform_stack_.top();\r
                auto prev = next;\r
@@ -73,7 +74,7 @@ public:
                auto next_gain = static_cast<int>(next.get_gain()*BASE);\r
                auto prev_gain = static_cast<int>(prev.get_gain()*BASE);\r
                \r
-               int n_samples = audio_data_.size();\r
+               int n_samples = audio_data_.back().size();\r
 \r
                tbb::parallel_for\r
                (\r
@@ -86,13 +87,12 @@ public:
                                        \r
                                        int sample = (static_cast<int>(audio_data[n])*sample_gain)/BASE;\r
                                        \r
-                                       audio_data_[n] = static_cast<int16_t>((static_cast<int>(audio_data_[n]) + sample) & 0xFFFF);\r
+                                       audio_data_.back()[n] = static_cast<int16_t>((static_cast<int>(audio_data_.back()[n]) + sample) & 0xFFFF);\r
                                }\r
                        }\r
                );\r
        }\r
 \r
-\r
        void begin(const core::audio_transform& transform)\r
        {\r
                transform_stack_.push(transform_stack_.top()*transform);\r
@@ -102,12 +102,14 @@ public:
        {\r
                transform_stack_.pop();\r
        }\r
-\r
-\r
+       \r
        std::vector<int16_t> mix()\r
        {\r
                prev_audio_transforms_ = std::move(next_audio_transforms_);     \r
-               return std::move(audio_data_);\r
+               auto result = std::move(audio_data_.front());\r
+               audio_data_.pop_front();\r
+               audio_data_.push_back(std::vector<int16_t>());\r
+               return std::move(result);\r
        }\r
 };\r
 \r