]> git.sesse.net Git - casparcg/commitdiff
#190 adjustments to OSC audio level patch
authorHelge Norberg <helge.norberg@gmail.com>
Thu, 7 Nov 2013 19:14:49 +0000 (20:14 +0100)
committerHelge Norberg <helge.norberg@gmail.com>
Thu, 7 Nov 2013 19:14:49 +0000 (20:14 +0100)
core/mixer/audio/audio_mixer.cpp

index e04f5c93a7056c1bbb379e68faa90a2d2d2415e9..85176c883055eddc4ee5594449c2a4d75bbe3ea8 100644 (file)
@@ -86,7 +86,7 @@ public:
                , channel_layout_(channel_layout::stereo())\r
                , master_volume_(1.0f)\r
                , previous_master_volume_(master_volume_)\r
-               , monitor_subject_(monitor::subject("/audio"))\r
+               , 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
@@ -243,32 +243,32 @@ public:
                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
+               const int num_channels = channel_layout_.num_channels;\r
+               monitor_subject_ << monitor::message("/nb_channels") % num_channels;\r
 \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
+               auto max = std::vector<int32_t>(num_channels, std::numeric_limits<int32_t>::min());\r
 \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
+               for (size_t n = 0; n < result.size(); n += num_channels)\r
+                       for (int ch = 0; ch < num_channels; ++ch)\r
+                               max[ch] = std::max(max[ch], std::abs(result[n + ch]));\r
                \r
-               for (int k = 0; k < nb_channels; ++k)\r
+               // Makes the dBFS of silence => -dynamic range of 32bit LPCM => about -192 dBFS\r
+               // Otherwise it would be -infinity\r
+               static const auto MIN_PFS = 0.5f / static_cast<float>(std::numeric_limits<int32_t>::max());\r
+\r
+               for (int i = 0; i < num_channels; ++i)\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
+                       const auto pFS  = max[i] / static_cast<float>(std::numeric_limits<int32_t>::max());\r
+                       const auto dBFS = 20.0f * std::log10(std::max(MIN_PFS, pFS));\r
                        \r
-                       auto chan_str = boost::lexical_cast<std::string>(k+1);\r
+                       auto chan_str = boost::lexical_cast<std::string>(i + 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
+                       monitor_subject_ << monitor::message("/" + chan_str + "/pFS") % pFS;\r
+                       monitor_subject_ << monitor::message("/" + chan_str + "/dBFS") % dBFS;\r
                }\r
 \r
+               graph_->set_value("volume", static_cast<double>(*boost::max_element(max)) / std::numeric_limits<int32_t>::max());\r
+\r
                return result;\r
        }\r
 \r