| Index: webrtc/voice_engine/channel.cc
 | 
| diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc
 | 
| index 16122709c31fe976ddde3c63a477d78957f72070..f69246fc85138f3969bc0e98a384f28e9f1ad937 100644
 | 
| --- a/webrtc/voice_engine/channel.cc
 | 
| +++ b/webrtc/voice_engine/channel.cc
 | 
| @@ -50,6 +50,7 @@ namespace voe {
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| +constexpr double kAudioSampleDurationSeconds = 0.01;
 | 
|  constexpr int64_t kMaxRetransmissionWindowMs = 1000;
 | 
|  constexpr int64_t kMinRetransmissionWindowMs = 30;
 | 
|  
 | 
| @@ -696,7 +697,20 @@ MixerParticipant::AudioFrameInfo Channel::GetAudioFrameWithMuted(
 | 
|  
 | 
|    // Measure audio level (0-9)
 | 
|    // TODO(henrik.lundin) Use the |muted| information here too.
 | 
| +  // TODO(deadbeef): Use RmsLevel for |_outputAudioLevel| as well (see
 | 
| +  // https://crbug.com/webrtc/7517).
 | 
|    _outputAudioLevel.ComputeLevel(*audioFrame);
 | 
| +  // See the description for "totalAudioEnergy" in the WebRTC stats spec
 | 
| +  // (https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy)
 | 
| +  // for an explanation of these formulas. In short, we need a value that can
 | 
| +  // be used to compute RMS audio levels over different time intervals, by
 | 
| +  // taking the difference between the results from two getStats calls. To do
 | 
| +  // this, the value needs to be of units "squared sample value * time".
 | 
| +  double additional_energy =
 | 
| +      static_cast<double>(_outputAudioLevel.LevelFullRange()) / INT16_MAX;
 | 
| +  additional_energy *= additional_energy;
 | 
| +  totalOutputEnergy_ += additional_energy * kAudioSampleDurationSeconds;
 | 
| +  totalOutputDuration_ += kAudioSampleDurationSeconds;
 | 
|  
 | 
|    if (capture_start_rtp_time_stamp_ < 0 && audioFrame->timestamp_ != 0) {
 | 
|      // The first frame with a valid rtp timestamp.
 | 
| @@ -2370,6 +2384,14 @@ int Channel::GetSpeechOutputLevelFullRange() const {
 | 
|    return _outputAudioLevel.LevelFullRange();
 | 
|  }
 | 
|  
 | 
| +double Channel::GetTotalOutputEnergy() const {
 | 
| +  return totalOutputEnergy_;
 | 
| +}
 | 
| +
 | 
| +double Channel::GetTotalOutputDuration() const {
 | 
| +  return totalOutputDuration_;
 | 
| +}
 | 
| +
 | 
|  void Channel::SetInputMute(bool enable) {
 | 
|    rtc::CritScope cs(&volume_settings_critsect_);
 | 
|    input_mute_ = enable;
 | 
| 
 |