diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-12 21:55:52 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-12 21:55:52 +0000 |
commit | c2a17ba1120977c97de531883aafbf74eae4cf97 (patch) | |
tree | 35fa2525304f4fb69e2f71319b759664de697a8b /media/audio | |
parent | 1631af60045c70c824da789990969a14f8cd01d3 (diff) | |
download | chromium_src-c2a17ba1120977c97de531883aafbf74eae4cf97.zip chromium_src-c2a17ba1120977c97de531883aafbf74eae4cf97.tar.gz chromium_src-c2a17ba1120977c97de531883aafbf74eae4cf97.tar.bz2 |
Implements AudioInputDevice API for low-latency audio input in the browser process.
Also refactors some shared audio code into audio_common.{cc,h}.
Patch by henrika@chromim.org:
http://codereview.chromium.org/6250196/
BUG=none
TEST=none
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81315 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio')
-rw-r--r-- | media/audio/audio_input_controller.cc | 46 | ||||
-rw-r--r-- | media/audio/audio_input_controller.h | 41 | ||||
-rw-r--r-- | media/audio/test_audio_input_controller_factory.cc | 8 | ||||
-rw-r--r-- | media/audio/test_audio_input_controller_factory.h | 3 |
4 files changed, 85 insertions, 13 deletions
diff --git a/media/audio/audio_input_controller.cc b/media/audio/audio_input_controller.cc index 3d58a50..311a54e 100644 --- a/media/audio/audio_input_controller.cc +++ b/media/audio/audio_input_controller.cc @@ -14,11 +14,13 @@ static const int kMaxInputChannels = 2; // static AudioInputController::Factory* AudioInputController::factory_ = NULL; -AudioInputController::AudioInputController(EventHandler* handler) +AudioInputController::AudioInputController(EventHandler* handler, + SyncWriter* sync_writer) : handler_(handler), stream_(NULL), state_(kEmpty), - thread_("AudioInputControllerThread") { + thread_("AudioInputControllerThread"), + sync_writer_(sync_writer) { } AudioInputController::~AudioInputController() { @@ -37,7 +39,33 @@ scoped_refptr<AudioInputController> AudioInputController::Create( } scoped_refptr<AudioInputController> controller(new AudioInputController( - event_handler)); + event_handler, NULL)); + + // Start the thread and post a task to create the audio input stream. + controller->thread_.Start(); + controller->thread_.message_loop()->PostTask( + FROM_HERE, + NewRunnableMethod(controller.get(), &AudioInputController::DoCreate, + params)); + return controller; +} + +// static +scoped_refptr<AudioInputController> AudioInputController::CreateLowLatency( + EventHandler* event_handler, + AudioParameters params, + SyncWriter* sync_writer) { + DCHECK(sync_writer); + + if (!params.IsValid() || (params.channels > kMaxInputChannels)) + return NULL; + + if (!AudioManager::GetAudioManager()) + return NULL; + + // Starts the audio controller thread. + scoped_refptr<AudioInputController> controller(new AudioInputController( + event_handler, sync_writer)); // Start the thread and post a task to create the audio input stream. controller->thread_.Start(); @@ -126,6 +154,10 @@ void AudioInputController::DoClose() { stream_ = NULL; } + if (LowLatencyMode()) { + sync_writer_->Close(); + } + // Since the stream is closed at this point there's no other threads reading // |state_| so we don't need to lock. state_ = kClosed; @@ -143,6 +175,14 @@ void AudioInputController::OnData(AudioInputStream* stream, const uint8* data, if (state_ != kRecording) return; } + + // Use SyncSocket if we are in a low-latency mode. + if (LowLatencyMode()) { + sync_writer_->Write(data, size); + sync_writer_->UpdateRecordedBytes(size); + return; + } + handler_->OnData(this, data, size); } diff --git a/media/audio/audio_input_controller.h b/media/audio/audio_input_controller.h index c630a67..b21eaba 100644 --- a/media/audio/audio_input_controller.h +++ b/media/audio/audio_input_controller.h @@ -34,9 +34,9 @@ // namespace media { -class AudioInputController : - public base::RefCountedThreadSafe<AudioInputController>, - public AudioInputStream::AudioInputCallback { +class AudioInputController + : public base::RefCountedThreadSafe<AudioInputController>, + public AudioInputStream::AudioInputCallback { public: // An event handler that receives events from the AudioInputController. The // following methods are called on the audio input controller thread. @@ -50,13 +50,30 @@ class AudioInputController : uint32 size) = 0; }; + // A synchronous writer interface used by AudioInputController for + // synchronous writing. + class SyncWriter { + public: + virtual ~SyncWriter() {} + + // Notify the synchronous writer about the number of bytes in the + // AudioInputController which has been recorded. + virtual void UpdateRecordedBytes(uint32 bytes) = 0; + + // Write certain amount of data from |data|. This method returns + // number of written bytes. + virtual uint32 Write(const void* data, uint32 size) = 0; + + // Close this synchronous writer. + virtual void Close() = 0; + }; + // AudioInputController::Create uses the currently registered Factory to // create the AudioInputController. Factory is intended for testing. class Factory { public: virtual AudioInputController* Create(EventHandler* event_handler, AudioParameters params) = 0; - protected: virtual ~Factory() {} }; @@ -71,6 +88,13 @@ class AudioInputController : EventHandler* event_handler, AudioParameters params); + // Factory method for creating a low latency audio stream. + static scoped_refptr<AudioInputController> CreateLowLatency( + EventHandler* event_handler, + AudioParameters params, + // External synchronous reader for audio controller. + SyncWriter* sync_writer); + // Sets the factory used by the static method Create. AudioInputController // does not take ownership of |factory|. A value of NULL results in an // AudioInputController being created directly. @@ -89,6 +113,8 @@ class AudioInputController : // will have no effect. virtual void Close(); + bool LowLatencyMode() const { return sync_writer_ != NULL; } + /////////////////////////////////////////////////////////////////////////// // AudioInputCallback methods. virtual void OnData(AudioInputStream* stream, const uint8* src, uint32 size); @@ -105,7 +131,7 @@ class AudioInputController : kError }; - AudioInputController(EventHandler* handler); + AudioInputController(EventHandler* handler, SyncWriter* sync_writer); // The following methods are executed on the audio controller thread. void DoCreate(AudioParameters params); @@ -126,6 +152,9 @@ class AudioInputController : // The audio input controller thread that this object runs on. base::Thread thread_; + // SyncWriter is used only in low latency mode for synchronous writing. + SyncWriter* sync_writer_; + static Factory* factory_; DISALLOW_COPY_AND_ASSIGN(AudioInputController); @@ -133,4 +162,4 @@ class AudioInputController : } // namespace media -#endif // MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_ +#endif // MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_ diff --git a/media/audio/test_audio_input_controller_factory.cc b/media/audio/test_audio_input_controller_factory.cc index 2a2f402..a31ed3d 100644 --- a/media/audio/test_audio_input_controller_factory.cc +++ b/media/audio/test_audio_input_controller_factory.cc @@ -8,8 +8,10 @@ namespace media { TestAudioInputController::TestAudioInputController( - TestAudioInputControllerFactory* factory, EventHandler* event_handler) - : AudioInputController(event_handler), + TestAudioInputControllerFactory* factory, + EventHandler* event_handler, + SyncWriter* sync_writer) + : AudioInputController(event_handler, sync_writer), factory_(factory), event_handler_(event_handler) { } @@ -27,7 +29,7 @@ AudioInputController* TestAudioInputControllerFactory::Create( AudioInputController::EventHandler* event_handler, AudioParameters params) { DCHECK(!controller_); // Only one test instance managed at a time. - controller_ = new TestAudioInputController(this, event_handler); + controller_ = new TestAudioInputController(this, event_handler, NULL); return controller_; } diff --git a/media/audio/test_audio_input_controller_factory.h b/media/audio/test_audio_input_controller_factory.h index 3339a23..97b7201 100644 --- a/media/audio/test_audio_input_controller_factory.h +++ b/media/audio/test_audio_input_controller_factory.h @@ -45,7 +45,8 @@ class TestAudioInputControllerFactory; class TestAudioInputController : public AudioInputController { public: TestAudioInputController(TestAudioInputControllerFactory* factory, - EventHandler* event_handler); + EventHandler* event_handler, + SyncWriter* sync_writer); virtual ~TestAudioInputController(); // Returns the event handler installed on the AudioInputController. |