X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Foal%2Fconsumer%2Foal_consumer.cpp;h=286622f89076e5e031b0333a5fad82a3f3a2b022;hb=9e4b08cde6c6de9e83a3fff42d90affc3cd8e5bc;hp=da6108c6917f497c499ca2c8bdb23301e1ba1023;hpb=b59ec2b89fbc8a2fbccaaa42d623db97a241a54b;p=casparcg diff --git a/modules/oal/consumer/oal_consumer.cpp b/modules/oal/consumer/oal_consumer.cpp index da6108c69..286622f89 100644 --- a/modules/oal/consumer/oal_consumer.cpp +++ b/modules/oal/consumer/oal_consumer.cpp @@ -72,7 +72,7 @@ public: if(!context_) CASPAR_THROW_EXCEPTION(invalid_operation() << msg_info("Failed to create audio context.")); - + if(alcMakeContextCurrent(context_) == ALC_FALSE) CASPAR_THROW_EXCEPTION(invalid_operation() << msg_info("Failed to activate audio context.")); } @@ -98,7 +98,7 @@ void init_device() { static std::unique_ptr instance; static boost::once_flag f = BOOST_ONCE_INIT; - + boost::call_once(f, []{instance.reset(new device());}); } @@ -110,7 +110,7 @@ struct oal_consumer : public core::frame_consumer boost::timer perf_timer_; tbb::atomic presentation_age_; int channel_index_ = -1; - + core::video_format_desc format_desc_; core::audio_channel_layout out_channel_layout_; std::unique_ptr channel_remapper_; @@ -130,7 +130,7 @@ public: init_device(); - graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f)); + graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f)); graph_->set_color("dropped-frame", diagnostics::color(0.3f, 0.6f, 0.3f)); graph_->set_color("late-frame", diagnostics::color(0.6f, 0.3f, 0.3f)); diagnostics::register_graph(graph_); @@ -139,7 +139,7 @@ public: ~oal_consumer() { executor_.invoke([=] - { + { if(source_) { alSourceStop(source_); @@ -158,7 +158,7 @@ public: void initialize(const core::video_format_desc& format_desc, const core::audio_channel_layout& channel_layout, int channel_index) override { - format_desc_ = format_desc; + format_desc_ = format_desc; channel_index_ = channel_index; if (out_channel_layout_ == core::audio_channel_layout::invalid()) out_channel_layout_ = channel_layout.num_channels == 2 ? channel_layout : *core::audio_channel_layout_repository::get_default()->get_layout(L"stereo"); @@ -169,7 +169,7 @@ public: graph_->set_text(print()); executor_.begin_invoke([=] - { + { buffers_.resize(format_desc_.fps > 30 ? 8 : 4); alGenBuffers(static_cast(buffers_.size()), buffers_.data()); alGenSources(1, &source_); @@ -180,10 +180,10 @@ public: alBufferData(buffers_[n], AL_FORMAT_STEREO16, audio.data(), static_cast(audio.size()*sizeof(int16_t)), format_desc_.audio_sample_rate); alSourceQueueBuffers(source_, 1, &buffers_[n]); } - + alSourcei(source_, AL_LOOPING, AL_FALSE); - alSourcePlay(source_); + alSourcePlay(source_); }); } @@ -198,13 +198,13 @@ public: // exhausted, which should not happen executor_.begin_invoke([=] { - ALenum state; + ALenum state; alGetSourcei(source_, AL_SOURCE_STATE,&state); if(state != AL_PLAYING) { for(int n = 0; n < buffers_.size()-1; ++n) - { - ALuint buffer = 0; + { + ALuint buffer = 0; alSourceUnqueueBuffers(source_, 1, &buffer); if(buffer) { @@ -213,13 +213,13 @@ public: alSourceQueueBuffers(source_, 1, &buffer); } } - alSourcePlay(source_); + alSourcePlay(source_); graph_->set_tag(diagnostics::tag_severity::WARNING, "late-frame"); } auto audio = core::audio_32_to_16(channel_remapper_->mix_and_rearrange(frame.audio_data())); - - ALuint buffer = 0; + + ALuint buffer = 0; alSourceUnqueueBuffers(source_, 1, &buffer); if(buffer) { @@ -229,14 +229,14 @@ public: else graph_->set_tag(diagnostics::tag_severity::WARNING, "dropped-frame"); - graph_->set_value("tick-time", perf_timer_.elapsed()*format_desc_.fps*0.5); + graph_->set_value("tick-time", perf_timer_.elapsed()*format_desc_.fps*0.5); perf_timer_.restart(); presentation_age_ = frame.get_age_millis() + latency_millis(); }); return make_ready_future(true); } - + std::wstring print() const override { return L"oal[" + boost::lexical_cast(channel_index_) + L"|" + format_desc_.name + L"]"; @@ -253,7 +253,7 @@ public: info.add(L"type", L"system-audio"); return info; } - + bool has_synchronization_clock() const override { return false; @@ -263,14 +263,14 @@ public: { return latency_millis_; } - + int buffer_depth() const override { int delay_in_frames = static_cast(latency_millis() / (1000.0 / format_desc_.fps)); - + return delay_in_frames; } - + int index() const override { return 500; @@ -293,7 +293,8 @@ void describe_consumer(core::help_sink& sink, const core::help_repository& repo) sink.example(L">> ADD 1 AUDIO LATENCY 500", L"Specifies that the system-audio chain: openal => driver => sound card => speaker output is 500ms"); } -spl::shared_ptr create_consumer(const std::vector& params, core::interaction_sink*) +spl::shared_ptr create_consumer( + const std::vector& params, core::interaction_sink*, std::vector> channels) { if(params.size() < 1 || !boost::iequals(params.at(0), L"AUDIO")) return core::frame_consumer::empty(); @@ -316,7 +317,8 @@ spl::shared_ptr create_consumer(const std::vector(channel_layout, latency_millis); } -spl::shared_ptr create_preconfigured_consumer(const boost::property_tree::wptree& ptree, core::interaction_sink*) +spl::shared_ptr create_preconfigured_consumer( + const boost::property_tree::wptree& ptree, core::interaction_sink*, std::vector> channels) { auto channel_layout = core::audio_channel_layout::invalid(); auto channel_layout_spec = ptree.get_optional(L"channel-layout");