]> git.sesse.net Git - casparcg/blob - core/mixer/audio/audio_mixer.cpp
2.0.0.2: clip-rect and fix-rect works now properly with transitions.
[casparcg] / core / mixer / audio / audio_mixer.cpp
1 #include "../../stdafx.h"\r
2 \r
3 #include "audio_mixer.h"\r
4 #include "audio_transform.h"\r
5 \r
6 namespace caspar { namespace core {\r
7         \r
8 struct audio_mixer::implementation\r
9 {\r
10         std::vector<short> audio_data_;\r
11         std::stack<audio_transform> transform_stack_;\r
12 \r
13 public:\r
14         implementation()\r
15         {\r
16                 transform_stack_.push(audio_transform());\r
17         }\r
18 \r
19         void begin(const audio_transform& transform)\r
20         {\r
21                 transform_stack_.push(transform_stack_.top()*transform);\r
22         }\r
23 \r
24         void process(const std::vector<short>& audio_data)\r
25         {               \r
26                 if(audio_data_.empty())\r
27                         audio_data_.resize(audio_data.size(), 0);\r
28 \r
29                 double gain = transform_stack_.top().get_gain();\r
30                 tbb::parallel_for\r
31                 (\r
32                         tbb::blocked_range<size_t>(0, audio_data.size()),\r
33                         [&](const tbb::blocked_range<size_t>& r)\r
34                         {\r
35                                 for(size_t n = r.begin(); n < r.end(); ++n)\r
36                                 {\r
37                                         int sample = static_cast<int>(audio_data[n]);\r
38                                         sample = (static_cast<int>(gain*8192.0)*sample)/8192;\r
39                                         audio_data_[n] = static_cast<short>((static_cast<int>(audio_data_[n]) + sample) & 0xFFFF);\r
40                                 }\r
41                         }\r
42                 );\r
43         }\r
44 \r
45         void end()\r
46         {\r
47                 transform_stack_.pop();\r
48         }\r
49 \r
50         std::vector<short> begin_pass()\r
51         {\r
52                 return std::move(audio_data_);\r
53         }\r
54 };\r
55 \r
56 audio_mixer::audio_mixer() : impl_(new implementation()){}\r
57 void audio_mixer::begin(const audio_transform& transform){impl_->begin(transform);}\r
58 void audio_mixer::process(const std::vector<short>& audio_data){impl_->process(audio_data);}\r
59 void audio_mixer::end(){impl_->end();}\r
60 std::vector<short> audio_mixer::begin_pass(){return impl_->begin_pass();}       \r
61 void audio_mixer::end_pass(){}\r
62 \r
63 }}