Index: media/audio/audio_input_controller.cc |
diff --git a/media/audio/audio_input_controller.cc b/media/audio/audio_input_controller.cc |
index c49cb34f342a90baf88fa0eac38b70886db84486..b6f58755dee4c127ca146812c7123c41abe9ed8f 100644 |
--- a/media/audio/audio_input_controller.cc |
+++ b/media/audio/audio_input_controller.cc |
@@ -74,11 +74,13 @@ namespace media { |
// static |
AudioInputController::Factory* AudioInputController::factory_ = NULL; |
-AudioInputController::AudioInputController(EventHandler* handler, |
+AudioInputController::AudioInputController(AudioManager* audio_manager, |
+ EventHandler* handler, |
SyncWriter* sync_writer, |
UserInputMonitor* user_input_monitor) |
: creator_task_runner_(base::MessageLoopProxy::current()), |
handler_(handler), |
+ audio_manager_(audio_manager), |
stream_(NULL), |
data_is_active_(false), |
state_(CLOSED), |
@@ -113,16 +115,19 @@ scoped_refptr<AudioInputController> AudioInputController::Create( |
return factory_->Create( |
audio_manager, event_handler, params, user_input_monitor); |
} |
- scoped_refptr<AudioInputController> controller( |
- new AudioInputController(event_handler, NULL, user_input_monitor)); |
+ scoped_refptr<AudioInputController> controller(new AudioInputController( |
+ audio_manager, event_handler, NULL, user_input_monitor)); |
controller->task_runner_ = audio_manager->GetTaskRunner(); |
// Create and open a new audio input stream from the existing |
// audio-device thread. |
- if (!controller->task_runner_->PostTask(FROM_HERE, |
- base::Bind(&AudioInputController::DoCreate, controller, |
- base::Unretained(audio_manager), params, device_id))) { |
+ if (!controller->task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&AudioInputController::DoCreate, |
+ controller, |
+ params, |
+ device_id))) { |
controller = NULL; |
} |
@@ -145,15 +150,18 @@ scoped_refptr<AudioInputController> AudioInputController::CreateLowLatency( |
// Create the AudioInputController object and ensure that it runs on |
// the audio-manager thread. |
- scoped_refptr<AudioInputController> controller( |
- new AudioInputController(event_handler, sync_writer, user_input_monitor)); |
+ scoped_refptr<AudioInputController> controller(new AudioInputController( |
+ audio_manager, event_handler, sync_writer, user_input_monitor)); |
controller->task_runner_ = audio_manager->GetTaskRunner(); |
// Create and open a new audio input stream from the existing |
// audio-device thread. Use the provided audio-input device. |
- if (!controller->task_runner_->PostTask(FROM_HERE, |
- base::Bind(&AudioInputController::DoCreateForLowLatency, controller, |
- base::Unretained(audio_manager), params, device_id))) { |
+ if (!controller->task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&AudioInputController::DoCreate, |
+ controller, |
+ params, |
+ device_id))) { |
controller = NULL; |
} |
@@ -172,8 +180,8 @@ scoped_refptr<AudioInputController> AudioInputController::CreateForStream( |
// Create the AudioInputController object and ensure that it runs on |
// the audio-manager thread. |
- scoped_refptr<AudioInputController> controller( |
- new AudioInputController(event_handler, sync_writer, user_input_monitor)); |
+ scoped_refptr<AudioInputController> controller(new AudioInputController( |
+ NULL, event_handler, sync_writer, user_input_monitor)); |
controller->task_runner_ = task_runner; |
// TODO(miu): See TODO at top of file. Until that's resolved, we need to |
@@ -215,11 +223,13 @@ void AudioInputController::SetAutomaticGainControl(bool enabled) { |
&AudioInputController::DoSetAutomaticGainControl, this, enabled)); |
} |
-void AudioInputController::DoCreate(AudioManager* audio_manager, |
- const AudioParameters& params, |
+void AudioInputController::DoCreate(const AudioParameters& params, |
const std::string& device_id) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.CreateTime"); |
+ if (handler_) { |
+ handler_->OnLog(this, "AIC::DoCreate()"); |
+ } |
#if defined(AUDIO_POWER_MONITORING) |
// Create the audio (power) level meter given the provided audio parameters. |
@@ -233,26 +243,14 @@ void AudioInputController::DoCreate(AudioManager* audio_manager, |
silence_state_ = SILENCE_STATE_NO_MEASUREMENT; |
#endif |
+ if (audio_manager_) |
+ audio_manager_->AddStateChangeListener(this); |
+ |
// TODO(miu): See TODO at top of file. Until that's resolved, assume all |
// platform audio input requires the |no_data_timer_| be used to auto-detect |
// errors. In reality, probably only Windows needs to be treated as |
// unreliable here. |
- DoCreateForStream(audio_manager->MakeAudioInputStream(params, device_id)); |
-} |
- |
-void AudioInputController::DoCreateForLowLatency(AudioManager* audio_manager, |
- const AudioParameters& params, |
- const std::string& device_id) { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
- |
-#if defined(AUDIO_POWER_MONITORING) |
- // We only log silence state UMA stats for low latency mode and if we use a |
- // real device. |
- if (params.format() != AudioParameters::AUDIO_FAKE) |
- log_silence_state_ = true; |
-#endif |
- |
- DoCreate(audio_manager, params, device_id); |
+ DoCreateForStream(audio_manager_->MakeAudioInputStream(params, device_id)); |
} |
void AudioInputController::DoCreateForStream( |
@@ -315,6 +313,9 @@ void AudioInputController::DoRecord() { |
state_ = RECORDING; |
} |
+ if (handler_) |
+ handler_->OnLog(this, "AIC::DoRecord"); |
+ |
if (no_data_timer_) { |
// Start the data timer. Once |kTimerResetIntervalSeconds| have passed, |
// a callback to FirstCheckForNoData() is made. |
@@ -333,12 +334,18 @@ void AudioInputController::DoClose() { |
if (state_ == CLOSED) |
return; |
+ if (handler_) |
+ handler_->OnLog(this, "AIC::DoClose"); |
+ |
// Delete the timer on the same thread that created it. |
no_data_timer_.reset(); |
DoStopCloseAndClearStream(); |
SetDataIsActive(false); |
+ if (audio_manager_) |
+ audio_manager_->RemoveStateChangeListener(this); |
+ |
if (SharedMemoryAndSyncSocketMode()) |
sync_writer_->Close(); |
@@ -400,6 +407,12 @@ void AudioInputController::FirstCheckForNoData() { |
LogCaptureStartupResult(GetDataIsActive() ? |
CAPTURE_STARTUP_OK : |
CAPTURE_STARTUP_NO_DATA_CALLBACK); |
+ if (handler_) { |
+ GetDataIsActive() |
+ ? handler_->OnLog(this, "AIC::FirstCheckForNoData => data is active") |
+ : handler_->OnLog(this, |
+ "AIC::FirstCheckForNoData => data is NOT active"); |
+ } |
DoCheckForNoData(); |
} |
@@ -528,6 +541,12 @@ void AudioInputController::DoLogAudioLevel(float level_dbfs) { |
#endif |
} |
+void AudioInputController::OnStateChange(const std::string& state) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ if (handler_) |
+ handler_->OnLog(this, state); |
+} |
+ |
void AudioInputController::OnError(AudioInputStream* stream) { |
// Handle error on the audio-manager thread. |
task_runner_->PostTask(FROM_HERE, base::Bind( |