\r
#include "oal_consumer.h"\r
\r
+#include <common/exception/exceptions.h>\r
#include <common/diagnostics/graph.h>\r
#include <common/log/log.h>\r
#include <common/utility/timer.h>\r
safe_ptr<diagnostics::graph> graph_;\r
boost::timer perf_timer_;\r
\r
- tbb::concurrent_bounded_queue<std::vector<short>> input_;\r
+ tbb::concurrent_bounded_queue<std::shared_ptr<std::vector<short>>> input_;\r
boost::circular_buffer<std::vector<short>> container_;\r
tbb::atomic<bool> is_running_;\r
\r
public:\r
oal_consumer() \r
: graph_(diagnostics::create_graph(narrow(print())))\r
- , container_(5)\r
+ , container_(16)\r
, preroll_count_(0)\r
{\r
+ if(core::consumer_buffer_depth() < 3)\r
+ BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("audio-consumer does not support buffer-depth lower than 3."));\r
+\r
graph_->add_guide("tick-time", 0.5);\r
- graph_->set_color("tick-time", diagnostics::color(0.1f, 0.7f, 0.8f));\r
+ graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f)); \r
is_running_ = true;\r
input_.set_capacity(core::consumer_buffer_depth()-2);\r
}\r
~oal_consumer()\r
{\r
is_running_ = false;\r
- input_.try_push(std::vector<short>());\r
- input_.try_push(std::vector<short>());\r
+ input_.try_push(std::make_shared<std::vector<short>>());\r
+ input_.try_push(std::make_shared<std::vector<short>>());\r
Stop();\r
CASPAR_LOG(info) << print() << L" Shutting down."; \r
}\r
{\r
format_desc_ = format_desc; \r
sf::SoundStream::Initialize(2, 48000);\r
- Play(); \r
CASPAR_LOG(info) << print() << " Sucessfully initialized.";\r
}\r
\r
- virtual void send(const safe_ptr<core::read_frame>& frame)\r
+ virtual bool send(const safe_ptr<core::read_frame>& frame)\r
{ \r
if(preroll_count_ < input_.capacity())\r
{\r
- while(input_.try_push(std::vector<int16_t>(format_desc_.audio_samples_per_frame, 0)))\r
+ while(input_.try_push(std::make_shared<std::vector<int16_t>>(format_desc_.audio_samples_per_frame, 0)))\r
++preroll_count_;\r
+ Play(); \r
}\r
\r
- input_.push(std::vector<int16_t>(frame->audio_data().begin(), frame->audio_data().end())); \r
- }\r
+ std::vector<int16_t> audio16(frame->audio_data().size());\r
+ for(size_t n = 0; n < audio16.size(); ++n) \r
+ audio16[n] = (frame->audio_data()[n] >> 16) & 0xffff; \r
\r
- virtual size_t buffer_depth() const{return 3;}\r
+ input_.push(std::make_shared<std::vector<int16_t>>(std::move(audio16)));\r
\r
+ return true;\r
+ }\r
+ \r
virtual bool OnGetData(sf::SoundStream::Chunk& data)\r
{ \r
- std::vector<short> audio_data; \r
+ std::shared_ptr<std::vector<short>> audio_data; \r
input_.pop(audio_data);\r
\r
- container_.push_back(std::move(audio_data));\r
+ container_.push_back(std::move(*audio_data));\r
data.Samples = container_.back().data();\r
data.NbSamples = container_.back().size(); \r
\r