diff options
author | satish@chromium.org <satish@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-16 05:58:04 +0000 |
---|---|---|
committer | satish@chromium.org <satish@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-16 05:58:04 +0000 |
commit | 41bdde54e45a13ff9c9f34b34f8e4f0395e9183b (patch) | |
tree | 5da8b35681a91144827aa8cd38f93814b6c9e8c2 /media/audio/audio_input_controller.h | |
parent | c60d64ec89c1a8eb5279c38c101ec710c8d931f9 (diff) | |
download | chromium_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.h | 121 |
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_ |