]> git.sesse.net Git - casparcg/commitdiff
Publish audio levels via osc. dBFS and pFS levels are provided. I am not sure of...
authorTK3 <tomkaltz@gmail.com>
Thu, 7 Nov 2013 06:35:42 +0000 (01:35 -0500)
committerTK3 <tomkaltz@gmail.com>
Thu, 7 Nov 2013 06:35:42 +0000 (01:35 -0500)
core/mixer/audio/audio_mixer.cpp

index 1c90878bf04aed6f509f2dc43530bfed55f9e266..e04f5c93a7056c1bbb379e68faa90a2d2d2415e9 100644 (file)
@@ -77,7 +77,7 @@ struct audio_mixer::implementation
        channel_layout                                          channel_layout_;\r
        float                                                           master_volume_;\r
        float                                                           previous_master_volume_;\r
-       safe_ptr<monitor::subject>                      monitor_subject_;\r
+       monitor::subject                                        monitor_subject_;\r
        \r
 public:\r
        implementation(const safe_ptr<diagnostics::graph>& graph)\r
@@ -86,7 +86,7 @@ public:
                , channel_layout_(channel_layout::stereo())\r
                , master_volume_(1.0f)\r
                , previous_master_volume_(master_volume_)\r
-               , monitor_subject_(make_safe<monitor::subject>("/audio"))\r
+               , monitor_subject_(monitor::subject("/audio"))\r
        {\r
                graph_->set_color("volume", diagnostics::color(1.0f, 0.8f, 0.1f));\r
                transform_stack_.push(core::frame_transform());\r
@@ -238,13 +238,36 @@ public:
                \r
                boost::range::rotate(audio_cadence_, std::begin(audio_cadence_)+1);\r
                \r
+\r
                audio_buffer result;\r
                result.reserve(result_ps.size());\r
                boost::range::transform(result_ps, std::back_inserter(result), [](float sample){return static_cast<int32_t>(sample);});         \r
+               \r
+               const int nb_channels = channel_layout_.num_channels;\r
 \r
-               auto max = boost::range::max_element(result);\r
+               auto min = std::vector<int32_t>(nb_channels, std::numeric_limits<int32_t>::max());\r
+               auto max = std::vector<int32_t>(nb_channels, std::numeric_limits<int32_t>::min());\r
 \r
-               graph_->set_value("volume", static_cast<double>(std::abs(*max))/std::numeric_limits<int32_t>::max());\r
+               for (int n = 0; n < boost::lexical_cast<int>(result.size()); n += nb_channels)\r
+               {\r
+                       for (int k = 0; k < nb_channels; ++k)\r
+                       {\r
+                               min[k] = std::min(min[k], result[n+k]);\r
+                               max[k] = std::max(max[k], result[n+k]);\r
+                       }\r
+               }\r
+               \r
+               for (int k = 0; k < nb_channels; ++k)\r
+               {\r
+                       const auto pFS  = std::max(-min[k], max[k]) / static_cast<float>(std::numeric_limits<int32_t>::max());\r
+                       const auto dBFS = 20.0f * std::log10(pFS);\r
+                       \r
+                       auto chan_str = boost::lexical_cast<std::string>(k+1);\r
+\r
+                       monitor_subject_ << monitor::message("/nb_channels") % nb_channels;\r
+                       monitor_subject_ << monitor::message("/"+ chan_str +"/pFS") % pFS;\r
+                       monitor_subject_ << monitor::message("/"+ chan_str +"/dBFS") % dBFS;\r
+               }\r
 \r
                return result;\r
        }\r
@@ -275,6 +298,6 @@ void audio_mixer::end(){impl_->end();}
 float audio_mixer::get_master_volume() const { return impl_->get_master_volume(); }\r
 void audio_mixer::set_master_volume(float volume) { impl_->set_master_volume(volume); }\r
 audio_buffer audio_mixer::operator()(const video_format_desc& format_desc, const channel_layout& layout){return impl_->mix(format_desc, layout);}\r
-monitor::subject& audio_mixer::monitor_output(){return *impl_->monitor_subject_;}\r
+monitor::subject& audio_mixer::monitor_output(){return impl_->monitor_subject_;}\r
 \r
 }}
\ No newline at end of file