| 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..f7747b9d37fb77b948b34e0daf2e3a8407905f56 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() {
|
| @@ -251,6 +261,9 @@ void AudioInputController::DoClose() {
|
| }
|
|
|
| state_ = kClosed;
|
| +
|
| + if (user_input_monitor_)
|
| + user_input_monitor_->RemoveKeyStrokeListener(this);
|
| }
|
| }
|
|
|
| @@ -320,10 +333,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 +348,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 +369,13 @@ void AudioInputController::OnError(AudioInputStream* stream) {
|
| &AudioInputController::DoReportError, this));
|
| }
|
|
|
| +void AudioInputController::OnKeyStroke() {
|
| + 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.
|
|
|