summaryrefslogtreecommitdiffstats
path: root/media/audio/audio_input_controller.h
diff options
context:
space:
mode:
authorsatish@chromium.org <satish@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-16 05:58:04 +0000
committersatish@chromium.org <satish@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-16 05:58:04 +0000
commit41bdde54e45a13ff9c9f34b34f8e4f0395e9183b (patch)
tree5da8b35681a91144827aa8cd38f93814b6c9e8c2 /media/audio/audio_input_controller.h
parentc60d64ec89c1a8eb5279c38c101ec710c8d931f9 (diff)
downloadchromium_src-41bdde54e45a13ff9c9f34b34f8e4f0395e9183b.zip
chromium_src-41bdde54e45a13ff9c9f34b34f8e4f0395e9183b.tar.gz
chromium_src-41bdde54e45a13ff9c9f34b34f8e4f0395e9183b.tar.bz2
Add an AudioInputController to help with audio recording.
This is similar to the existing AudioOutputController class used for playback. Also adds a unit test which uses the new fake audio input stream, so this patch is dependant on http://codereview.chromium.org/2909015 TEST=no new user visible change to test, just some backend recording additions which are unused at the moment. BUG=none Review URL: http://codereview.chromium.org/2905010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52617 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/audio_input_controller.h')
-rw-r--r--media/audio/audio_input_controller.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/media/audio/audio_input_controller.h b/media/audio/audio_input_controller.h
new file mode 100644
index 0000000..27b3a54
--- /dev/null
+++ b/media/audio/audio_input_controller.h
@@ -0,0 +1,121 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_
+#define MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_
+
+#include "base/lock.h"
+#include "base/ref_counted.h"
+#include "base/scoped_ptr.h"
+#include "base/thread.h"
+#include "media/audio/audio_io.h"
+
+// An AudioInputController controls an AudioInputStream and records data
+// from this input stream. It has an important function that it executes
+// audio operations like record, pause, stop, etc. on a separate thread.
+//
+// All the public methods of AudioInputController are non-blocking except
+// close, the actual operations are performed on the audio input controller
+// thread.
+//
+// Here is a state diagram for the AudioInputController:
+//
+// .--> [ Closed / Error ] <--.
+// | |
+// | |
+// [ Created ] ----------> [ Recording ]
+// ^
+// |
+// *[ Empty ]
+//
+// * Initial state
+//
+namespace media {
+
+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.
+ class EventHandler {
+ public:
+ virtual ~EventHandler() {}
+ virtual void OnCreated(AudioInputController* controller) = 0;
+ virtual void OnRecording(AudioInputController* controller) = 0;
+ virtual void OnError(AudioInputController* controller, int error_code) = 0;
+ virtual void OnData(AudioInputController* controller, const uint8* data,
+ uint32 size) = 0;
+ };
+
+ virtual ~AudioInputController();
+
+ // Factory method for creating an AudioInputController.
+ // If successful, an audio input controller thread is created. The audio
+ // device will be created on the new thread and when that is done event
+ // handler will receive a OnCreated() call.
+ static scoped_refptr<AudioInputController> Create(
+ EventHandler* event_handler,
+ AudioManager::Format format, // Format of the stream.
+ int channels, // Number of channels.
+ int sample_rate, // Sampling frequency/rate.
+ int bits_per_sample, // Number of bits per sample.
+ int samples_per_packet); // Size of the hardware buffer.
+
+ // Starts recording in this audio input stream.
+ void Record();
+
+ // Closes the audio input stream and shutdown the audio input controller
+ // thread. This method returns only after all operations are completed. This
+ // input controller cannot be used after this method is called.
+ //
+ // It is safe to call this method more than once. Calls after the first one
+ // will have no effect.
+ void Close();
+
+ ///////////////////////////////////////////////////////////////////////////
+ // AudioInputCallback methods.
+ virtual void OnData(AudioInputStream* stream, const uint8* src, uint32 size);
+ virtual void OnClose(AudioInputStream* stream);
+ virtual void OnError(AudioInputStream* stream, int code);
+
+ private:
+ // Internal state of the source.
+ enum State {
+ kEmpty,
+ kCreated,
+ kRecording,
+ kClosed,
+ kError
+ };
+
+ AudioInputController(EventHandler* handler);
+
+ // The following methods are executed on the audio controller thread.
+ void DoCreate(AudioManager::Format format, int channels,
+ int sample_rate, int bits_per_sample,
+ uint32 samples_per_packet);
+ void DoRecord();
+ void DoClose();
+ void DoReportError(int code);
+
+ EventHandler* handler_;
+ AudioInputStream* stream_;
+
+ // |state_| is written on the audio input controller thread and is read on
+ // the hardware audio thread. These operations need to be locked. But lock
+ // is not required for reading on the audio input controller thread.
+ State state_;
+
+ Lock lock_;
+
+ // The audio input controller thread that this object runs on.
+ base::Thread thread_;
+
+ DISALLOW_COPY_AND_ASSIGN(AudioInputController);
+};
+
+} // namespace media
+
+#endif // MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_