]> git.sesse.net Git - casparcg/commitdiff
Made audio_candence sequences mean the number of samples per channel instead of the...
authorHelge Norberg <helge.norberg@svt.se>
Tue, 16 Apr 2013 16:34:22 +0000 (18:34 +0200)
committerHelge Norberg <helge.norberg@svt.se>
Tue, 16 Apr 2013 16:34:22 +0000 (18:34 +0200)
#6

Fixed bug where we give too few samples to the decklink driver each time RenderAudioSamples() is called (constant rate of 50 calls per second) when the video format has a frame rate > 50 like 59.94 and 60

#22

core/consumer/frame_consumer.cpp
core/mixer/audio/audio_mixer.cpp
core/video_format.cpp
core/video_format.h
modules/bluefish/consumer/bluefish_consumer.cpp
modules/decklink/consumer/decklink_consumer.cpp
modules/decklink/producer/decklink_producer.cpp
modules/ffmpeg/producer/muxer/frame_muxer.cpp

index bce2337507ab7b6c09a84d9326949c20505221a5..a1e35e29e9627e76506308e927d4448822f599c8 100644 (file)
@@ -71,6 +71,7 @@ class cadence_guard : public frame_consumer
 {\r
        safe_ptr<frame_consumer>                consumer_;\r
        std::vector<size_t>                             audio_cadence_;\r
+       video_format_desc                               format_desc_;\r
        boost::circular_buffer<size_t>  sync_buffer_;\r
 public:\r
        cadence_guard(const safe_ptr<frame_consumer>& consumer)\r
@@ -82,6 +83,7 @@ public:
        {\r
                audio_cadence_  = format_desc.audio_cadence;\r
                sync_buffer_    = boost::circular_buffer<size_t>(format_desc.audio_cadence.size());\r
+               format_desc_    = format_desc;\r
                consumer_->initialize(format_desc, channel_index);\r
        }\r
 \r
@@ -92,7 +94,7 @@ public:
 \r
                boost::unique_future<bool> result = caspar::wrap_as_future(true);\r
                \r
-               if(boost::range::equal(sync_buffer_, audio_cadence_) && audio_cadence_.front() == static_cast<size_t>(frame->audio_data().size())) \r
+               if(boost::range::equal(sync_buffer_, audio_cadence_) && audio_cadence_.front() * format_desc_.audio_channels == static_cast<size_t>(frame->audio_data().size()))\r
                {       \r
                        // Audio sent so far is in sync, now we can send the next chunk.\r
                        result = consumer_->send(frame);\r
@@ -101,7 +103,7 @@ public:
                else\r
                        CASPAR_LOG(trace) << print() << L" Syncing audio.";\r
 \r
-               sync_buffer_.push_back(static_cast<size_t>(frame->audio_data().size()));\r
+               sync_buffer_.push_back(static_cast<size_t>(frame->audio_data().size() / format_desc_.audio_channels));\r
                \r
                return std::move(result);\r
        }\r
index eea3057cf2be6f9df6d08d85462dba9040d55cf7..c04f1592a5dc6d5ee8ec1bb2e7fe5b81a79a889d 100644 (file)
@@ -168,20 +168,20 @@ public:
                audio_streams_ = std::move(next_audio_streams);\r
                \r
                if(audio_streams_.empty())              \r
-                       audio_streams_[nullptr].audio_data = audio_buffer_ps(audio_cadence_.front(), 0.0f);\r
+                       audio_streams_[nullptr].audio_data = audio_buffer_ps(audio_size(audio_cadence_.front()), 0.0f);\r
                                \r
                { // sanity check\r
 \r
                        auto nb_invalid_streams = boost::count_if(audio_streams_ | boost::adaptors::map_values, [&](const audio_stream& x)\r
                        {\r
-                               return x.audio_data.size() < audio_cadence_.front();\r
+                               return x.audio_data.size() < audio_size(audio_cadence_.front());\r
                        });\r
 \r
                        if(nb_invalid_streams > 0)              \r
                                CASPAR_LOG(trace) << "[audio_mixer] Incorrect frame audio cadence detected.";                   \r
                }\r
 \r
-               std::vector<float> result_ps(audio_cadence_.front(), 0.0f);\r
+               std::vector<float> result_ps(audio_size(audio_cadence_.front()), 0.0f);\r
 \r
                BOOST_FOREACH(auto& stream, audio_streams_ | boost::adaptors::map_values)\r
                {\r
@@ -209,6 +209,11 @@ public:
 \r
                return result;\r
        }\r
+\r
+       size_t audio_size(size_t num_samples) const\r
+       {\r
+               return num_samples * format_desc_.audio_channels;\r
+       }\r
 };\r
 \r
 audio_mixer::audio_mixer(const safe_ptr<diagnostics::graph>& graph) : impl_(new implementation(graph)){}\r
index cdb40ba180e3bd9a6ff6f03a5f9509365decbda7..da2173be201df4c54a13132b9ede124dfb12cb30 100644 (file)
@@ -50,37 +50,37 @@ namespace caspar { namespace core {
        \r
 const video_format_desc format_descs[video_format::count] =  \r
 {                                                                         \r
-       DEFINE_VIDEOFORMATDESC(video_format::pal                ,720,  576,  1024, 576,  field_mode::upper,                     25,             1,               boost::assign::list_of(3840),                                                  L"PAL"), \r
-       DEFINE_VIDEOFORMATDESC(video_format::ntsc               ,720,  486,  720,  540,  field_mode::lower,                     30000,  1001,    boost::assign::list_of(3204)(3202)(3204)(3202)(3204),  L"NTSC"), \r
-       DEFINE_VIDEOFORMATDESC(video_format::x576p2500  ,1024, 576,  1024, 576,  field_mode::progressive,       25,             1,               boost::assign::list_of(3840),                                                  L"576p2500"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x720p2398  ,1280, 720,  1280, 720,  field_mode::progressive,       24000,  1001,    boost::assign::list_of(4004),                                                  L"720p2398"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x720p2400  ,1280, 720,  1280, 720,  field_mode::progressive,       24,             1,               boost::assign::list_of(4000),                                                  L"720p2400"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x720p2500  ,1280, 720,  1280, 720,  field_mode::progressive,       25,             1,               boost::assign::list_of(3840),                                                  L"720p2500"), \r
-       DEFINE_VIDEOFORMATDESC(video_format::x720p5000  ,1280, 720,  1280, 720,  field_mode::progressive,       50,             1,               boost::assign::list_of(1920),                                                  L"720p5000"), \r
-       DEFINE_VIDEOFORMATDESC(video_format::x720p2997  ,1280, 720,  1280, 720,  field_mode::progressive,       30000,  1001,    boost::assign::list_of(3204)(3202)(3204)(3202)(3204),  L"720p2997"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x720p5994  ,1280, 720,  1280, 720,  field_mode::progressive,       60000,  1001,    boost::assign::list_of(1602)(1601)(1602)(1601)(1602),  L"720p5994"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x720p3000  ,1280, 720,  1280, 720,  field_mode::progressive,       30,             1,               boost::assign::list_of(3200),                                                  L"720p3000"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x720p6000  ,1280, 720,  1280, 720,  field_mode::progressive,       60,             1,               boost::assign::list_of(1600),                                                  L"720p6000"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080p2398 ,1920, 1080, 1920, 1080, field_mode::progressive,       24000,  1001,    boost::assign::list_of(4004),                                                  L"1080p2398"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080p2400 ,1920, 1080, 1920, 1080, field_mode::progressive,       24,             1,               boost::assign::list_of(4000),                                                  L"1080p2400"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080i5000 ,1920, 1080, 1920, 1080, field_mode::upper,                     25,             1,               boost::assign::list_of(3840),                                                  L"1080i5000"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080i5994 ,1920, 1080, 1920, 1080, field_mode::upper,                     30000,  1001,    boost::assign::list_of(3204)(3202)(3204)(3202)(3204),  L"1080i5994"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080i6000 ,1920, 1080, 1920, 1080, field_mode::upper,                     30,             1,               boost::assign::list_of(3200),                                                  L"1080i6000"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080p2500 ,1920, 1080, 1920, 1080, field_mode::progressive,       25,             1,               boost::assign::list_of(3840),                                                  L"1080p2500"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080p2997 ,1920, 1080, 1920, 1080, field_mode::progressive,       30000,  1001,    boost::assign::list_of(3204)(3202)(3204)(3202)(3204),  L"1080p2997"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080p3000 ,1920, 1080, 1920, 1080, field_mode::progressive,       30,             1,               boost::assign::list_of(3200),                                                  L"1080p3000"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080p5000 ,1920, 1080, 1920, 1080, field_mode::progressive,       50,             1,               boost::assign::list_of(1920),                                                  L"1080p5000"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080p5994 ,1920, 1080, 1920, 1080, field_mode::progressive,       60000,  1001,    boost::assign::list_of(1602)(1601)(1602)(1601)(1602),  L"1080p5994"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x1080p6000 ,1920, 1080, 1920, 1080, field_mode::progressive,       60,             1,               boost::assign::list_of(1600),                                                  L"1080p6000"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x2k2398    ,2048, 1556, 2048, 1556, field_mode::progressive,        24000, 1001,    boost::assign::list_of(4004),                                                  L"2k2398"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x2k2400    ,2048, 1556, 2048, 1556, field_mode::progressive,        24,    1,               boost::assign::list_of(4000),                                                  L"2k2400"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x2k2500    ,2048, 1556, 2048, 1556, field_mode::progressive,        25,    1,               boost::assign::list_of(3840),                                                  L"2k2500"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x4k2398    ,3840, 2160, 3840, 2160, field_mode::progressive,        24000, 1001,    boost::assign::list_of(4004),                                                  L"4k2398"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x4k2400    ,3840, 2160, 3840, 2160, field_mode::progressive,        24,    1,               boost::assign::list_of(4000),                                                  L"4k2400"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x4k2500    ,3840, 2160, 3840, 2160, field_mode::progressive,        25,    1,               boost::assign::list_of(3840),                                                  L"4k2500"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x4k2997    ,3840, 2160, 3840, 2160, field_mode::progressive,        30000, 1001,    boost::assign::list_of(3204)(3202)(3204)(3202)(3204),  L"4k2398"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::x4k3000    ,3840, 2160, 3840, 2160, field_mode::progressive,        30,    1,              boost::assign::list_of(3200),                                                   L"4k3000"),\r
-       DEFINE_VIDEOFORMATDESC(video_format::invalid    ,0,             0,   0,         0,   field_mode::progressive,    1,             1,               boost::assign::list_of(1),                                                             L"invalid")\r
+       DEFINE_VIDEOFORMATDESC(video_format::pal                ,720,  576,  1024, 576,  field_mode::upper,                     25,             1,              boost::assign::list_of(1920),                                                                                           L"PAL"), \r
+       DEFINE_VIDEOFORMATDESC(video_format::ntsc               ,720,  486,  720,  540,  field_mode::lower,                     30000,  1001,   boost::assign::list_of(1602)    (1601)    (1602)    (1601)    (1602),           L"NTSC"), \r
+       DEFINE_VIDEOFORMATDESC(video_format::x576p2500  ,1024, 576,  1024, 576,  field_mode::progressive,       25,             1,              boost::assign::list_of(1920),                                                                                           L"576p2500"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x720p2398  ,1280, 720,  1280, 720,  field_mode::progressive,       24000,  1001,   boost::assign::list_of(2002),                                                                                           L"720p2398"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x720p2400  ,1280, 720,  1280, 720,  field_mode::progressive,       24,             1,              boost::assign::list_of(2000),                                                                                           L"720p2400"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x720p2500  ,1280, 720,  1280, 720,  field_mode::progressive,       25,             1,              boost::assign::list_of(1920),                                                                                           L"720p2500"), \r
+       DEFINE_VIDEOFORMATDESC(video_format::x720p5000  ,1280, 720,  1280, 720,  field_mode::progressive,       50,             1,              boost::assign::list_of(960),                                                                                            L"720p5000"), \r
+       DEFINE_VIDEOFORMATDESC(video_format::x720p2997  ,1280, 720,  1280, 720,  field_mode::progressive,       30000,  1001,   boost::assign::list_of(1602)    (1601)    (1602)    (1601)    (1602),           L"720p2997"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x720p5994  ,1280, 720,  1280, 720,  field_mode::progressive,       60000,  1001,   boost::assign::list_of(801)(801)(800)(801)(801)(801)(800)(801)(801)(801),       L"720p5994"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x720p3000  ,1280, 720,  1280, 720,  field_mode::progressive,       30,             1,              boost::assign::list_of(1600),                                                                                           L"720p3000"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x720p6000  ,1280, 720,  1280, 720,  field_mode::progressive,       60,             1,              boost::assign::list_of(800),                                                                                            L"720p6000"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080p2398 ,1920, 1080, 1920, 1080, field_mode::progressive,       24000,  1001,   boost::assign::list_of(2002),                                                                                           L"1080p2398"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080p2400 ,1920, 1080, 1920, 1080, field_mode::progressive,       24,             1,              boost::assign::list_of(2000),                                                                                           L"1080p2400"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080i5000 ,1920, 1080, 1920, 1080, field_mode::upper,                     25,             1,              boost::assign::list_of(1920),                                                                                           L"1080i5000"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080i5994 ,1920, 1080, 1920, 1080, field_mode::upper,                     30000,  1001,   boost::assign::list_of(1602)    (1601)    (1602)    (1601)    (1602),           L"1080i5994"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080i6000 ,1920, 1080, 1920, 1080, field_mode::upper,                     30,             1,              boost::assign::list_of(1600),                                                                                           L"1080i6000"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080p2500 ,1920, 1080, 1920, 1080, field_mode::progressive,       25,             1,              boost::assign::list_of(1920),                                                                                           L"1080p2500"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080p2997 ,1920, 1080, 1920, 1080, field_mode::progressive,       30000,  1001,   boost::assign::list_of(1602)    (1601)    (1602)    (1601)    (1602),           L"1080p2997"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080p3000 ,1920, 1080, 1920, 1080, field_mode::progressive,       30,             1,              boost::assign::list_of(1600),                                                                                           L"1080p3000"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080p5000 ,1920, 1080, 1920, 1080, field_mode::progressive,       50,             1,              boost::assign::list_of(960),                                                                                            L"1080p5000"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080p5994 ,1920, 1080, 1920, 1080, field_mode::progressive,       60000,  1001,   boost::assign::list_of(801)(801)(800)(801)(801)(801)(800)(801)(801)(801),       L"1080p5994"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x1080p6000 ,1920, 1080, 1920, 1080, field_mode::progressive,       60,             1,              boost::assign::list_of(800),                                                                                            L"1080p6000"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x2k2398    ,2048, 1556, 2048, 1556, field_mode::progressive,        24000, 1001,   boost::assign::list_of(2002),                                                                                           L"2k2398"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x2k2400    ,2048, 1556, 2048, 1556, field_mode::progressive,        24,    1,              boost::assign::list_of(2000),                                                                                           L"2k2400"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x2k2500    ,2048, 1556, 2048, 1556, field_mode::progressive,        25,    1,              boost::assign::list_of(1920),                                                                                           L"2k2500"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x4k2398    ,3840, 2160, 3840, 2160, field_mode::progressive,        24000, 1001,   boost::assign::list_of(2002),                                                                                           L"4k2398"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x4k2400    ,3840, 2160, 3840, 2160, field_mode::progressive,        24,    1,              boost::assign::list_of(2000),                                                                                           L"4k2400"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x4k2500    ,3840, 2160, 3840, 2160, field_mode::progressive,        25,    1,              boost::assign::list_of(1920),                                                                                           L"4k2500"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x4k2997    ,3840, 2160, 3840, 2160, field_mode::progressive,        30000, 1001,   boost::assign::list_of(1602)    (1601)    (1602)    (1601)    (1602),           L"4k2398"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::x4k3000    ,3840, 2160, 3840, 2160, field_mode::progressive,        30,    1,              boost::assign::list_of(1600),                                                                                           L"4k3000"),\r
+       DEFINE_VIDEOFORMATDESC(video_format::invalid    ,0,             0,   0,         0,   field_mode::progressive,    1,             1,              boost::assign::list_of(1),                                                                                                      L"invalid")\r
 };\r
 \r
 const video_format_desc& video_format_desc::get(video_format::type format)     \r
index 6e3fd01db232b49078c520ad13234fafe6830f81..77bfb71c3e13972a5a5f6890ce0b0ed1ce6ff93f 100644 (file)
@@ -109,7 +109,7 @@ struct video_format_desc
 \r
        size_t                                  audio_sample_rate;\r
        size_t                                  audio_channels;\r
-       std::vector<size_t>             audio_cadence;\r
+       std::vector<size_t>             audio_cadence; // rotating optimal number of samples per frame\r
 \r
        static const video_format_desc& get(video_format::type format);\r
        static const video_format_desc& get(const std::wstring& name);\r
index 1dabf9e801c69f2ed8eca4ae5f989d46b1809468..0ef03eea40b67d44cb1f887ac83b619f53d9c251 100644 (file)
@@ -298,6 +298,7 @@ struct bluefish_consumer_proxy : public core::frame_consumer
        const bool                                                      embedded_audio_;\r
        const bool                                                      key_only_;\r
        std::vector<size_t>                                     audio_cadence_;\r
+       core::video_format_desc                         format_desc_;\r
 public:\r
 \r
        bluefish_consumer_proxy(size_t device_index, bool embedded_audio, bool key_only)\r
@@ -323,12 +324,13 @@ public:
        {\r
                consumer_.reset(new bluefish_consumer(format_desc, device_index_, embedded_audio_, key_only_, channel_index));\r
                audio_cadence_ = format_desc.audio_cadence;\r
+               format_desc_ = format_desc;\r
                CASPAR_LOG(info) << print() << L" Successfully Initialized.";   \r
        }\r
        \r
        virtual boost::unique_future<bool> send(const safe_ptr<core::read_frame>& frame) override\r
        {\r
-               CASPAR_VERIFY(audio_cadence_.front() == static_cast<size_t>(frame->audio_data().size()));\r
+               CASPAR_VERIFY(audio_cadence_.front() * format_desc_.audio_channels == static_cast<size_t>(frame->audio_data().size()));\r
                boost::range::rotate(audio_cadence_, std::begin(audio_cadence_)+1);\r
 \r
                return consumer_->send(frame);\r
index 5993492cf8220b078d050bb9512539beb087ddb0..e18afee94950c59502c5b8480951c3475f7cb0f6 100644 (file)
@@ -228,7 +228,14 @@ public:
                is_running_ = true;\r
                                \r
                video_frame_buffer_.set_capacity(1);\r
-               audio_frame_buffer_.set_capacity(1);\r
+\r
+               if (format_desc.fps > 50.0)\r
+                       // Blackmagic calls RenderAudioSamples() 50 times per second\r
+                       // regardless of video mode so we sometimes need to give them\r
+                       // samples from 2 frames in order to keep up\r
+                       audio_frame_buffer_.set_capacity(2); \r
+               else\r
+                       audio_frame_buffer_.set_capacity(1);\r
 \r
                graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f));   \r
                graph_->set_color("late-frame", diagnostics::color(0.6f, 0.3f, 0.3f));\r
@@ -408,19 +415,22 @@ public:
                                        start_playback();                               \r
                                }\r
                                else\r
-                                       schedule_next_audio(core::audio_buffer(format_desc_.audio_cadence[preroll % format_desc_.audio_cadence.size()], 0));    \r
+                                       schedule_next_audio(core::audio_buffer(format_desc_.audio_cadence[preroll % format_desc_.audio_cadence.size()] * format_desc_.audio_channels, 0));      \r
                        }\r
                        else\r
                        {\r
                                std::shared_ptr<core::read_frame> frame;\r
-                               audio_frame_buffer_.pop(frame);\r
-                               send_completion_.try_completion();\r
-                               schedule_next_audio(frame->audio_data());\r
+\r
+                               while (audio_frame_buffer_.try_pop(frame))\r
+                               {\r
+                                       send_completion_.try_completion();\r
+                                       schedule_next_audio(frame->audio_data());\r
+                               }\r
                        }\r
 \r
                        unsigned long buffered;\r
                        output_->GetBufferedAudioSampleFrameCount(&buffered);\r
-                       graph_->set_value("buffered-audio", static_cast<double>(buffered)/(format_desc_.audio_cadence[0]*2));\r
+                       graph_->set_value("buffered-audio", static_cast<double>(buffered)/(format_desc_.audio_cadence[0] * format_desc_.audio_channels * 2));\r
                }\r
                catch(...)\r
                {\r
@@ -530,6 +540,7 @@ struct decklink_consumer_proxy : public core::frame_consumer
        const configuration                             config_;\r
        com_context<decklink_consumer>  context_;\r
        std::vector<size_t>                             audio_cadence_;\r
+       core::video_format_desc                 format_desc_;\r
 public:\r
 \r
        decklink_consumer_proxy(const configuration& config)\r
@@ -554,13 +565,14 @@ public:
        {\r
                context_.reset([&]{return new decklink_consumer(config_, format_desc, channel_index);});                \r
                audio_cadence_ = format_desc.audio_cadence;             \r
+               format_desc_ = format_desc;\r
 \r
                CASPAR_LOG(info) << print() << L" Successfully Initialized.";   \r
        }\r
        \r
        virtual boost::unique_future<bool> send(const safe_ptr<core::read_frame>& frame) override\r
        {\r
-               CASPAR_VERIFY(audio_cadence_.front() == static_cast<size_t>(frame->audio_data().size()));\r
+               CASPAR_VERIFY(audio_cadence_.front() * format_desc_.audio_channels == static_cast<size_t>(frame->audio_data().size()));\r
                boost::range::rotate(audio_cadence_, std::begin(audio_cadence_)+1);\r
 \r
                return context_->send(frame);\r
index f1b4d57e27da7746a0651bf5716b8afb9a036c6c..9ba419f8ff1ac7a592c878e81b4110284d9c0814 100644 (file)
@@ -211,12 +211,12 @@ public:
                                audio_buffer = std::make_shared<core::audio_buffer>(audio_data, audio_data + sample_frame_count*format_desc_.audio_channels);\r
                        }\r
                        else                    \r
-                               audio_buffer = std::make_shared<core::audio_buffer>(audio_cadence_.front(), 0);\r
+                               audio_buffer = std::make_shared<core::audio_buffer>(audio_cadence_.front() * format_desc_.audio_channels, 0);\r
                        \r
                        // Note: Uses 1 step rotated cadence for 1001 modes (1602, 1602, 1601, 1602, 1601)\r
                        // This cadence fills the audio mixer most optimally.\r
 \r
-                       sync_buffer_.push_back(audio_buffer->size());           \r
+                       sync_buffer_.push_back(audio_buffer->size() / format_desc_.audio_channels);             \r
                        if(!boost::range::equal(sync_buffer_, audio_cadence_))\r
                        {\r
                                CASPAR_LOG(trace) << print() << L" Syncing audio.";\r
index bb9114b035b1dfb873fab08965095379295ee52a..52d837cc656f3c8967ce07abe93d61205a51a5f8 100644 (file)
@@ -163,14 +163,14 @@ struct frame_muxer::implementation : boost::noncopyable
                }\r
                else if(audio == empty_audio())\r
                {\r
-                       boost::range::push_back(audio_streams_.back(), core::audio_buffer(audio_cadence_.front(), 0));\r
+                       boost::range::push_back(audio_streams_.back(), core::audio_buffer(audio_cadence_.front() * format_desc_.audio_channels, 0));\r
                }\r
                else\r
                {\r
                        boost::range::push_back(audio_streams_.back(), *audio);\r
                }\r
 \r
-               if(audio_streams_.back().size() > 32*audio_cadence_.front())\r
+               if(audio_streams_.back().size() > 32*audio_cadence_.front() * format_desc_.audio_channels)\r
                        BOOST_THROW_EXCEPTION(invalid_operation() << source_info("frame_muxer") << msg_info("audio-stream overflow. This can be caused by incorrect frame-rate. Check clip meta-data."));\r
        }\r
        \r
@@ -202,9 +202,9 @@ struct frame_muxer::implementation : boost::noncopyable
                switch(display_mode_)\r
                {\r
                case display_mode::duplicate:                                   \r
-                       return audio_streams_.front().size()/2 >= audio_cadence_.front();\r
+                       return audio_streams_.front().size()/2 >= audio_cadence_.front() * format_desc_.audio_channels;\r
                default:                                                                                \r
-                       return audio_streams_.front().size() >= audio_cadence_.front();\r
+                       return audio_streams_.front().size() >= audio_cadence_.front() * format_desc_.audio_channels;\r
                }\r
        }\r
                \r
@@ -279,10 +279,10 @@ struct frame_muxer::implementation : boost::noncopyable
 \r
        core::audio_buffer pop_audio()\r
        {\r
-               CASPAR_VERIFY(audio_streams_.front().size() >= audio_cadence_.front());\r
+               CASPAR_VERIFY(audio_streams_.front().size() >= audio_cadence_.front() * format_desc_.audio_channels);\r
 \r
                auto begin = audio_streams_.front().begin();\r
-               auto end   = begin + audio_cadence_.front();\r
+               auto end   = begin + (audio_cadence_.front() * format_desc_.audio_channels);\r
 \r
                core::audio_buffer samples(begin, end);\r
                audio_streams_.front().erase(begin, end);\r