\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
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
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
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
\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
{\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