Index: media/audio/linux/alsa_input.h |
diff --git a/media/audio/linux/alsa_input.h b/media/audio/linux/alsa_input.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9a326e42eaa0aa602fa82457c42e6d8a276f3a2e |
--- /dev/null |
+++ b/media/audio/linux/alsa_input.h |
@@ -0,0 +1,68 @@ |
+// 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_LINUX_ALSA_INPUT_H_ |
+#define MEDIA_AUDIO_LINUX_ALSA_INPUT_H_ |
+ |
+#include <alsa/asoundlib.h> |
+ |
+#include <string> |
+ |
+#include "base/scoped_ptr.h" |
+#include "base/task.h" |
+#include "media/audio/audio_io.h" |
+#include "media/audio/audio_parameters.h" |
+ |
+class AlsaWrapper; |
+ |
+// Provides an input stream for audio capture based on the ALSA PCM interface. |
+// This object is not thread safe and all methods should be invoked in the |
+// thread that created the object. |
+class AlsaPcmInputStream : public AudioInputStream { |
+ public: |
+ // Pass this to the constructor if you want to attempt auto-selection |
+ // of the audio recording device. |
+ static const char* kAutoSelectDevice; |
+ |
+ // Create a PCM Output stream for the ALSA device identified by |
+ // |device_name|. If unsure of what to use for |device_name|, use |
+ // |kAutoSelectDevice|. |
+ AlsaPcmInputStream(const std::string& device_name, |
+ const AudioParameters& params, |
+ int samples_per_packet, |
+ AlsaWrapper* wrapper); |
+ |
+ // Implementation of AudioOutputStream. |
+ virtual bool Open(); |
+ virtual void Start(AudioInputCallback* callback); |
+ virtual void Stop(); |
+ virtual void Close(); |
+ |
+ private: |
+ // Logs the error and invokes any registered callbacks. |
+ void HandleError(const char* method, int error); |
+ |
+ // Reads one or more packets of audio from the device, passes on to the |
+ // registered callback and schedules the next read. |
+ void ReadAudio(); |
+ |
+ // Recovers from any device errors if possible. |
+ bool Recover(int error); |
+ |
+ std::string device_name_; |
+ AudioParameters params_; |
+ int samples_per_packet_; |
+ int bytes_per_packet_; |
+ AlsaWrapper* wrapper_; |
+ int packet_duration_ms_; // Length of each recorded packet in milliseconds. |
+ AudioInputCallback* callback_; // Valid during a recording session. |
+ base::Time next_read_time_; // Scheduled time for the next read callback. |
+ snd_pcm_t* device_handle_; // Handle to the ALSA PCM recording device. |
+ ScopedRunnableMethodFactory<AlsaPcmInputStream> task_factory_; |
+ scoped_ptr<uint8> audio_packet_; // Data buffer used for reading audio data. |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AlsaPcmInputStream); |
+}; |
+ |
+#endif // MEDIA_AUDIO_LINUX_ALSA_INPUT_H_ |