governor governor_;\r
\r
tbb::atomic<bool> is_running_;\r
+ \r
+ size_t video_loop_count_;\r
+ size_t audio_loop_count_;\r
\r
implementation(frame_muxer2::video_source_t* video_source,\r
frame_muxer2::audio_source_t* audio_source,\r
, auto_transcode_(env::properties().get("configuration.producers.auto-transcode", false))\r
, frame_factory_(frame_factory)\r
, governor_(2)\r
+ , video_loop_count_(0)\r
+ , audio_loop_count_(0)\r
{ \r
is_running_ = true;\r
start();\r
return make_safe<core::write_frame>(this); \r
\r
auto video = filter_.has_value() ? filter_.value()->poll() : nullptr;\r
- if(video) \r
+ if(video_loop_count_ >= audio_loop_count_ && video) \r
return make_write_frame(this, make_safe_ptr(video), frame_factory_, 0); \r
\r
video = receive(video_source_);\r
\r
if(video == flush_video())\r
+ {\r
+ ++video_loop_count_;\r
return receive_video();\r
+ }\r
\r
if(video == eof_video())\r
return nullptr; \r
if(!audio_source_)\r
return make_safe<core::audio_buffer>(format_desc_.audio_samples_per_frame, 0);\r
\r
- if(audio_data_.size() >= format_desc_.audio_samples_per_frame)\r
+ if(audio_loop_count_ >= video_loop_count_ && audio_data_.size() >= format_desc_.audio_samples_per_frame)\r
{\r
auto begin = audio_data_.begin(); \r
auto end = begin + format_desc_.audio_samples_per_frame;\r
std::shared_ptr<core::audio_buffer> audio = receive(audio_source_);\r
\r
if(audio == flush_audio())\r
- return receive_audio();\r
+ {\r
+ CASPAR_LOG(trace) << L"Truncating: " << audio_data_.size() << L" audio-samples:";\r
+ audio_data_.clear();\r
+ ++audio_loop_count_;\r
+ return receive_audio(); \r
+ }\r
\r
if(audio == eof_audio())\r
return nullptr;\r