\r
size_t preroll_count_;\r
\r
- boost::circular_buffer<std::vector<int32_t>> audio_container_;\r
+ boost::circular_buffer<std::vector<int32_t, tbb::cache_aligned_allocator<int32_t>>> audio_container_;\r
\r
tbb::concurrent_bounded_queue<std::shared_ptr<core::read_frame>> video_frame_buffer_;\r
tbb::concurrent_bounded_queue<std::shared_ptr<core::read_frame>> audio_frame_buffer_;\r
{\r
const int sample_frame_count = view.num_samples();\r
\r
- if (core::needs_rearranging(\r
- view, config_.audio_layout, config_.num_out_channels()))\r
- {\r
- std::vector<int32_t> resulting_audio_data;\r
- resulting_audio_data.resize(\r
- sample_frame_count * config_.num_out_channels());\r
-\r
- auto dest_view = core::make_multichannel_view<int32_t>(\r
- resulting_audio_data.begin(), \r
- resulting_audio_data.end(),\r
- config_.audio_layout,\r
- config_.num_out_channels());\r
-\r
- core::rearrange_or_rearrange_and_mix(\r
- view, dest_view, core::default_mix_config_repository());\r
-\r
- if (config_.audio_layout.num_channels == 1) // mono\r
- boost::copy( // duplicate L to R\r
- dest_view.channel(0),\r
- dest_view.channel(1).begin());\r
-\r
- audio_container_.push_back(std::move(resulting_audio_data));\r
- }\r
- else\r
- {\r
- audio_container_.push_back(\r
- std::vector<int32_t>(view.raw_begin(), view.raw_end()));\r
- }\r
+ audio_container_.push_back(core::get_rearranged_and_mixed(\r
+ view,\r
+ config_.audio_layout,\r
+ config_.num_out_channels()));\r
\r
if(FAILED(output_->ScheduleAudioSamples(\r
audio_container_.back().data(),\r
\r
// frame_consumer\r
\r
- virtual void initialize(const core::video_format_desc& format_desc, int channel_index) override\r
+ virtual void initialize(\r
+ const core::video_format_desc& format_desc,\r
+ const core::channel_layout& audio_channel_layout,\r
+ int channel_index) override\r
{\r
context_.reset([&]{return new decklink_consumer(config_, format_desc, channel_index);}); \r
audio_cadence_ = format_desc.audio_cadence; \r