3 ** Copyright 2008-2009, Wind River Systems
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
9 ** http://www.apache.org/licenses/LICENSE-2.0
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
18 #ifndef ANDROID_AUDIO_HARDWARE_ALSA_H
19 #define ANDROID_AUDIO_HARDWARE_ALSA_H
21 #include <hardware_legacy/AudioHardwareBase.h>
23 #include <alsa/asoundlib.h>
25 #include <hardware/hardware.h>
29 class AudioHardwareALSA;
32 * The id of acoustics module
34 #define ACOUSTICS_HARDWARE_MODULE_ID "acoustics"
35 #define ACOUSTICS_HARDWARE_NAME "name"
37 struct acoustic_device_t {
41 * Set the provided acoustics for a particular ALSA pcm device.
43 * Returns: 0 on succes, error code on failure.
45 status_t (*set_acoustics)(snd_pcm_t *, AudioSystem::audio_in_acoustics);
48 * Read callback with PCM data so that filtering may be applied.
50 * Returns: frames filtered on success, error code on failure.
52 ssize_t (*filter)(snd_pcm_t *, void *, ssize_t);
55 // ----------------------------------------------------------------------------
63 bool isValid() { return !!mMixer[SND_PCM_STREAM_PLAYBACK]; }
64 status_t setMasterVolume(float volume);
65 status_t setMasterGain(float gain);
67 status_t setVolume(uint32_t device, float volume);
68 status_t setGain(uint32_t device, float gain);
70 status_t setCaptureMuteState(uint32_t device, bool state);
71 status_t getCaptureMuteState(uint32_t device, bool *state);
72 status_t setPlaybackMuteState(uint32_t device, bool state);
73 status_t getPlaybackMuteState(uint32_t device, bool *state);
76 snd_mixer_t *mMixer[SND_PCM_STREAM_LAST+1];
82 ALSAControl(const char *device = "default");
83 virtual ~ALSAControl();
85 status_t get(const char *name, unsigned int &value, int index = 0);
86 status_t set(const char *name, unsigned int value, int index = -1);
95 friend class AudioStreamOutALSA;
96 friend class AudioStreamInALSA;
100 const char * devicePrefix;
101 snd_pcm_stream_t direction; // playback or capture
102 snd_pcm_format_t format;
105 unsigned int latency; // Delay in usec
106 unsigned int bufferSize; // Size of sample buffer
109 ALSAStreamOps(AudioHardwareALSA *parent);
110 virtual ~ALSAStreamOps();
112 status_t set(int format,
115 virtual uint32_t sampleRate() const;
116 status_t sampleRate(uint32_t rate);
117 virtual size_t bufferSize() const;
118 virtual int format() const;
119 virtual int channelCount() const;
120 status_t channelCount(int channels);
122 status_t open(int mode, uint32_t device);
124 status_t setSoftwareParams();
125 status_t setPCMFormat(snd_pcm_format_t format);
126 status_t setHardwareResample(bool resample);
128 status_t setDevice(int mode, uint32_t device);
130 const char *streamName();
131 const char *deviceName(int mode, uint32_t device);
133 void setStreamDefaults(StreamDefaults *dev) {
138 AudioHardwareALSA *mParent;
140 snd_pcm_hw_params_t *mHardwareParams;
141 snd_pcm_sw_params_t *mSoftwareParams;
145 StreamDefaults *mDefaults;
151 // ----------------------------------------------------------------------------
153 class AudioStreamOutALSA : public AudioStreamOut, public ALSAStreamOps
156 AudioStreamOutALSA(AudioHardwareALSA *parent);
157 virtual ~AudioStreamOutALSA();
159 status_t set(int format = 0,
160 int channelCount = 0,
161 uint32_t sampleRate = 0) {
162 return ALSAStreamOps::set(format, channelCount, sampleRate);
165 virtual uint32_t sampleRate() const
167 return ALSAStreamOps::sampleRate();
170 virtual size_t bufferSize() const
172 return ALSAStreamOps::bufferSize();
175 virtual int channelCount() const;
177 virtual int format() const
179 return ALSAStreamOps::format();
182 virtual uint32_t latency() const;
184 virtual ssize_t write(const void *buffer, size_t bytes);
185 virtual status_t dump(int fd, const Vector<String16>& args);
187 status_t setVolume(float volume);
189 virtual status_t standby();
192 friend class AudioHardwareALSA;
194 status_t setDevice(int mode, uint32_t newDevice);
197 class AudioStreamInALSA : public AudioStreamIn, public ALSAStreamOps
200 AudioStreamInALSA(AudioHardwareALSA *parent,
201 AudioSystem::audio_in_acoustics acoustics);
202 virtual ~AudioStreamInALSA();
204 status_t set(int format = 0,
205 int channelCount = 0,
206 uint32_t sampleRate = 0) {
207 return ALSAStreamOps::set(format, channelCount, sampleRate);
210 virtual uint32_t sampleRate() {
211 return ALSAStreamOps::sampleRate();
214 virtual size_t bufferSize() const
216 return ALSAStreamOps::bufferSize();
219 virtual int channelCount() const
221 return ALSAStreamOps::channelCount();
224 virtual int format() const
226 return ALSAStreamOps::format();
229 virtual ssize_t read(void* buffer, ssize_t bytes);
230 virtual status_t dump(int fd, const Vector<String16>& args);
232 virtual status_t setGain(float gain);
234 virtual status_t standby();
237 friend class AudioHardwareALSA;
239 status_t setDevice(int mode, uint32_t newDevice);
242 AudioSystem::audio_in_acoustics mAcoustics;
245 class AudioHardwareALSA : public AudioHardwareBase
249 virtual ~AudioHardwareALSA();
252 * check to see if the audio hardware interface has been initialized.
253 * return status based on values defined in include/utils/Errors.h
255 virtual status_t initCheck();
257 /** set the audio volume of a voice call. Range is between 0.0 and 1.0 */
258 virtual status_t setVoiceVolume(float volume);
261 * set the audio volume for all audio activities other than voice call.
262 * Range between 0.0 and 1.0. If any value other than NO_ERROR is returned,
263 * the software mixer will emulate this capability.
265 virtual status_t setMasterVolume(float volume);
268 virtual status_t setMicMute(bool state);
269 virtual status_t getMicMute(bool* state);
271 /** This method creates and opens the audio hardware output stream */
272 virtual AudioStreamOut* openOutputStream(
275 uint32_t sampleRate=0,
278 /** This method creates and opens the audio hardware input stream */
279 virtual AudioStreamIn* openInputStream(
285 AudioSystem::audio_in_acoustics acoustics);
289 * doRouting actually initiates the routing. A call to setRouting
290 * or setMode may result in a routing change. The generic logic calls
291 * doRouting when required. If the device has any special requirements these
292 * methods can be overriden.
294 virtual status_t doRouting();
296 virtual status_t dump(int fd, const Vector<String16>& args);
298 friend class AudioStreamOutALSA;
299 friend class AudioStreamInALSA;
302 AudioStreamOutALSA *mOutput;
303 AudioStreamInALSA *mInput;
305 acoustic_device_t *mAcousticDevice;
311 // ----------------------------------------------------------------------------
313 }; // namespace android
314 #endif // ANDROID_AUDIO_HARDWARE_ALSA_H