summaryrefslogtreecommitdiffstats
path: root/media/audio
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-12 21:55:52 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-12 21:55:52 +0000
commitc2a17ba1120977c97de531883aafbf74eae4cf97 (patch)
tree35fa2525304f4fb69e2f71319b759664de697a8b /media/audio
parent1631af60045c70c824da789990969a14f8cd01d3 (diff)
downloadchromium_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.cc46
-rw-r--r--media/audio/audio_input_controller.h41
-rw-r--r--media/audio/test_audio_input_controller_factory.cc8
-rw-r--r--media/audio/test_audio_input_controller_factory.h3
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.