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