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