Index: media/audio/audio_input_controller.cc |
diff --git a/media/audio/audio_input_controller.cc b/media/audio/audio_input_controller.cc |
index 31e137e2b17e4442c00979e85cbcffa31cd53cba..a3f630cb2fc0069c92ead64ecb0d55dc899b6550 100644 |
--- a/media/audio/audio_input_controller.cc |
+++ b/media/audio/audio_input_controller.cc |
@@ -36,14 +36,17 @@ namespace media { |
AudioInputController::Factory* AudioInputController::factory_ = NULL; |
AudioInputController::AudioInputController(EventHandler* handler, |
- SyncWriter* sync_writer) |
+ SyncWriter* sync_writer, |
+ UserInputMonitor* user_input_monitor) |
: creator_loop_(base::MessageLoopProxy::current()), |
handler_(handler), |
stream_(NULL), |
data_is_active_(false), |
state_(kEmpty), |
sync_writer_(sync_writer), |
- max_volume_(0.0) { |
+ max_volume_(0.0), |
+ user_input_monitor_(user_input_monitor), |
+ key_pressed_(false) { |
DCHECK(creator_loop_.get()); |
} |
@@ -56,17 +59,19 @@ scoped_refptr<AudioInputController> AudioInputController::Create( |
AudioManager* audio_manager, |
EventHandler* event_handler, |
const AudioParameters& params, |
- const std::string& device_id) { |
+ const std::string& device_id, |
+ UserInputMonitor* user_input_monitor) { |
DCHECK(audio_manager); |
if (!params.IsValid() || (params.channels() > kMaxInputChannels)) |
return NULL; |
- if (factory_) |
- return factory_->Create(audio_manager, event_handler, params); |
- |
- scoped_refptr<AudioInputController> controller(new AudioInputController( |
- event_handler, NULL)); |
+ if (factory_) { |
+ return factory_->Create( |
+ audio_manager, event_handler, params, user_input_monitor); |
+ } |
+ scoped_refptr<AudioInputController> controller( |
+ new AudioInputController(event_handler, NULL, user_input_monitor)); |
controller->message_loop_ = audio_manager->GetMessageLoop(); |
@@ -87,7 +92,8 @@ scoped_refptr<AudioInputController> AudioInputController::CreateLowLatency( |
EventHandler* event_handler, |
const AudioParameters& params, |
const std::string& device_id, |
- SyncWriter* sync_writer) { |
+ SyncWriter* sync_writer, |
+ UserInputMonitor* user_input_monitor) { |
DCHECK(audio_manager); |
DCHECK(sync_writer); |
@@ -96,8 +102,8 @@ 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)); |
+ scoped_refptr<AudioInputController> controller( |
+ new AudioInputController(event_handler, sync_writer, user_input_monitor)); |
controller->message_loop_ = audio_manager->GetMessageLoop(); |
// Create and open a new audio input stream from the existing |
@@ -116,14 +122,15 @@ scoped_refptr<AudioInputController> AudioInputController::CreateForStream( |
const scoped_refptr<base::MessageLoopProxy>& message_loop, |
EventHandler* event_handler, |
AudioInputStream* stream, |
- SyncWriter* sync_writer) { |
+ SyncWriter* sync_writer, |
+ UserInputMonitor* user_input_monitor) { |
DCHECK(sync_writer); |
DCHECK(stream); |
// Create the AudioInputController object and ensure that it runs on |
// the audio-manager thread. |
- scoped_refptr<AudioInputController> controller(new AudioInputController( |
- event_handler, sync_writer)); |
+ scoped_refptr<AudioInputController> controller( |
+ new AudioInputController(event_handler, sync_writer, user_input_monitor)); |
controller->message_loop_ = message_loop; |
// TODO(miu): See TODO at top of file. Until that's resolved, we need to |
@@ -233,6 +240,9 @@ void AudioInputController::DoRecord() { |
stream_->Start(this); |
handler_->OnRecording(this); |
+ |
+ if (user_input_monitor_) |
+ user_input_monitor_->AddKeyStrokeListener(this); |
} |
void AudioInputController::DoClose() { |
@@ -252,6 +262,8 @@ void AudioInputController::DoClose() { |
state_ = kClosed; |
} |
+ if (user_input_monitor_) |
DaleCurtis
2013/08/12 20:24:11
Should this be in the (state_ != kClosed) block? Y
|
+ user_input_monitor_->RemoveKeyStrokeListener(this); |
} |
void AudioInputController::DoReportError() { |
@@ -320,10 +332,13 @@ void AudioInputController::DoCheckForNoData() { |
void AudioInputController::OnData(AudioInputStream* stream, const uint8* data, |
uint32 size, uint32 hardware_delay_bytes, |
double volume) { |
+ bool key_pressed = false; |
{ |
base::AutoLock auto_lock(lock_); |
if (state_ != kRecording) |
return; |
+ |
+ std::swap(key_pressed, key_pressed_); |
} |
// Mark data as active to ensure that the periodic calls to |
@@ -332,7 +347,7 @@ void AudioInputController::OnData(AudioInputStream* stream, const uint8* data, |
// Use SyncSocket if we are in a low-latency mode. |
if (LowLatencyMode()) { |
- sync_writer_->Write(data, size, volume); |
+ sync_writer_->Write(data, size, volume, key_pressed); |
sync_writer_->UpdateRecordedBytes(hardware_delay_bytes); |
return; |
} |
@@ -353,8 +368,13 @@ void AudioInputController::OnError(AudioInputStream* stream) { |
&AudioInputController::DoReportError, this)); |
} |
+void AudioInputController::OnKeyPressed() { |
+ base::AutoLock auto_lock(lock_); |
+ key_pressed_ = true; |
+} |
+ |
void AudioInputController::DoStopCloseAndClearStream( |
- base::WaitableEvent *done) { |
+ base::WaitableEvent* done) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
// Allow calling unconditionally and bail if we don't have a stream to close. |