Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: media/audio/audio_input_controller.cc

Issue 645923002: Add support for audio input mute detection on all platforms (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed audio_recorder_unittest Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/audio/audio_input_controller.h" 5 #include "media/audio/audio_input_controller.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/strings/string_number_conversions.h" 8 #include "base/strings/string_number_conversions.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "base/threading/thread_restrictions.h" 10 #include "base/threading/thread_restrictions.h"
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 handler_->OnData(this, data.get()); 576 handler_->OnData(this, data.get());
577 } 577 }
578 578
579 void AudioInputController::DoLogAudioLevels(float level_dbfs, 579 void AudioInputController::DoLogAudioLevels(float level_dbfs,
580 int microphone_volume_percent) { 580 int microphone_volume_percent) {
581 #if defined(AUDIO_POWER_MONITORING) 581 #if defined(AUDIO_POWER_MONITORING)
582 DCHECK(task_runner_->BelongsToCurrentThread()); 582 DCHECK(task_runner_->BelongsToCurrentThread());
583 if (!handler_) 583 if (!handler_)
584 return; 584 return;
585 585
586 std::string log_string = base::StringPrintf( 586 std::string log_string;
tommi (sloooow) - chröme 2014/10/15 17:00:48 nit: move this down to where you need it (where pr
henrika (OOO until Aug 14) 2014/10/16 09:58:00 Done.
587
588 // Detect if the user has enabled hardware mute by pressing the mute
589 // button in audio settings for the selected microphone.
590 const bool microphone_is_muted = stream_->IsMuted();
591 if (microphone_is_muted) {
tommi (sloooow) - chröme 2014/10/15 17:00:48 nit: you don't really need this variable.
henrika (OOO until Aug 14) 2014/10/16 09:58:00 Done.
592 LogMicrophoneMuteResult(MICROPHONE_IS_MUTED);
593 log_string = base::StringPrintf(
tommi (sloooow) - chröme 2014/10/15 17:00:48 no need for StringPrintf
henrika (OOO until Aug 14) 2014/10/16 09:58:00 Done.
594 "AIC::OnData: microphone is muted!");
595 handler_->OnLog(this, log_string);
596 // Return early if microphone is muted. No idea adding logs and UMA stats
tommi (sloooow) - chröme 2014/10/15 17:00:48 nit: "No idea" -> "No need to" (etc)
henrika (OOO until Aug 14) 2014/10/16 09:58:00 Done.
597 // of audio levels if we know that the micropone is muted.
598 return;
599 } else {
tommi (sloooow) - chröme 2014/10/15 17:00:48 nit: no need for else since there's an early retur
henrika (OOO until Aug 14) 2014/10/16 09:58:00 Done.
600 LogMicrophoneMuteResult(MICROPHONE_IS_NOT_MUTED);
601 }
602
603 log_string = base::StringPrintf(
587 "AIC::OnData: average audio level=%.2f dBFS", level_dbfs); 604 "AIC::OnData: average audio level=%.2f dBFS", level_dbfs);
588 static const float kSilenceThresholdDBFS = -72.24719896f; 605 static const float kSilenceThresholdDBFS = -72.24719896f;
589 if (level_dbfs < kSilenceThresholdDBFS) 606 if (level_dbfs < kSilenceThresholdDBFS)
590 log_string += " <=> no audio input!"; 607 log_string += " <=> no audio input!";
591 handler_->OnLog(this, log_string); 608 handler_->OnLog(this, log_string);
592 609
593 UpdateSilenceState(level_dbfs < kSilenceThresholdDBFS); 610 UpdateSilenceState(level_dbfs < kSilenceThresholdDBFS);
594 611
595 UMA_HISTOGRAM_PERCENTAGE("Media.MicrophoneVolume", microphone_volume_percent); 612 UMA_HISTOGRAM_PERCENTAGE("Media.MicrophoneVolume", microphone_volume_percent);
596 log_string = base::StringPrintf( 613 log_string = base::StringPrintf(
597 "AIC::OnData: microphone volume=%d%%", microphone_volume_percent); 614 "AIC::OnData: microphone volume=%d%%", microphone_volume_percent);
598 if (microphone_volume_percent < kLowLevelMicrophoneLevelPercent) 615 if (microphone_volume_percent < kLowLevelMicrophoneLevelPercent)
599 log_string += " <=> low microphone level!"; 616 log_string += " <=> low microphone level!";
600 handler_->OnLog(this, log_string); 617 handler_->OnLog(this, log_string);
601
602 // Try to detect if the user has enabled hardware mute by pressing the mute
603 // button in audio settings for the selected microphone. The idea here is to
604 // detect when all input samples are zeros but the actual volume slider is
605 // larger than zero. It should correspond to a hardware mute state.
606 if (level_dbfs == -std::numeric_limits<float>::infinity() &&
607 microphone_volume_percent > 0) {
608 LogMicrophoneMuteResult(MICROPHONE_IS_MUTED);
609 log_string = base::StringPrintf(
610 "AIC::OnData: microphone is muted!");
611 handler_->OnLog(this, log_string);
612 } else {
613 LogMicrophoneMuteResult(MICROPHONE_IS_NOT_MUTED);
614 }
615 #endif 618 #endif
616 } 619 }
617 620
618 void AudioInputController::OnError(AudioInputStream* stream) { 621 void AudioInputController::OnError(AudioInputStream* stream) {
619 // Handle error on the audio-manager thread. 622 // Handle error on the audio-manager thread.
620 task_runner_->PostTask(FROM_HERE, base::Bind( 623 task_runner_->PostTask(FROM_HERE, base::Bind(
621 &AudioInputController::DoReportError, this)); 624 &AudioInputController::DoReportError, this));
622 } 625 }
623 626
624 void AudioInputController::DoStopCloseAndClearStream() { 627 void AudioInputController::DoStopCloseAndClearStream() {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 } 670 }
668 671
669 void AudioInputController::LogSilenceState(SilenceState value) { 672 void AudioInputController::LogSilenceState(SilenceState value) {
670 UMA_HISTOGRAM_ENUMERATION("Media.AudioInputControllerSessionSilenceReport", 673 UMA_HISTOGRAM_ENUMERATION("Media.AudioInputControllerSessionSilenceReport",
671 value, 674 value,
672 SILENCE_STATE_MAX + 1); 675 SILENCE_STATE_MAX + 1);
673 } 676 }
674 #endif 677 #endif
675 678
676 } // namespace media 679 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698