, 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
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