1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MEDIA_AUDIO_PULSE_PULSE_INPUT_H_
6 #define MEDIA_AUDIO_PULSE_PULSE_INPUT_H_
10 #include "base/threading/thread_checker.h"
11 #include "media/audio/agc_audio_stream.h"
12 #include "media/audio/audio_device_name.h"
13 #include "media/audio/audio_io.h"
14 #include "media/audio/audio_parameters.h"
17 struct pa_source_info;
19 struct pa_threaded_mainloop;
23 class AudioManagerPulse;
26 class PulseAudioInputStream : public AgcAudioStream<AudioInputStream> {
28 PulseAudioInputStream(AudioManagerPulse* audio_manager,
29 const std::string& device_name,
30 const AudioParameters& params,
31 pa_threaded_mainloop* mainloop,
34 virtual ~PulseAudioInputStream();
36 // Implementation of AudioInputStream.
37 virtual bool Open() OVERRIDE;
38 virtual void Start(AudioInputCallback* callback) OVERRIDE;
39 virtual void Stop() OVERRIDE;
40 virtual void Close() OVERRIDE;
41 virtual double GetMaxVolume() OVERRIDE;
42 virtual void SetVolume(double volume) OVERRIDE;
43 virtual double GetVolume() OVERRIDE;
46 // PulseAudio Callbacks.
47 static void ReadCallback(pa_stream* handle, size_t length, void* user_data);
48 static void StreamNotifyCallback(pa_stream* stream, void* user_data);
49 static void VolumeCallback(pa_context* context, const pa_source_info* info,
50 int error, void* user_data);
52 // Helper for the ReadCallback.
55 AudioManagerPulse* audio_manager_;
56 AudioInputCallback* callback_;
57 std::string device_name_;
58 AudioParameters params_;
63 // Holds the data from the OS.
64 scoped_ptr<media::SeekableBuffer> buffer_;
66 // Temporary storage for recorded data. It gets a packet of data from
67 // |buffer_| and deliver the data to OnData() callback.
68 scoped_ptr<uint8[]> audio_data_buffer_;
70 // PulseAudio API structs.
71 pa_threaded_mainloop* pa_mainloop_; // Weak.
72 pa_context* pa_context_; // Weak.
75 // Flag indicating the state of the context has been changed.
76 bool context_state_changed_;
78 scoped_ptr<AudioBus> audio_bus_;
80 base::ThreadChecker thread_checker_;
82 DISALLOW_COPY_AND_ASSIGN(PulseAudioInputStream);
87 #endif // MEDIA_AUDIO_PULSE_PULSE_INPUT_H_