1 /* AudioHardwareALSA.cpp
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.
26 #define LOG_TAG "AudioHardwareALSA"
27 #include <utils/Log.h>
28 #include <utils/String8.h>
30 #include <cutils/properties.h>
31 #include <media/AudioRecord.h>
32 #include <hardware_legacy/power.h>
34 #include "AudioHardwareALSA.h"
36 #undef FM_ROUTE_SUPPORT
37 #undef DISABLE_HARWARE_RESAMPLING
39 #ifndef ALSA_DEFAULT_SAMPLE_RATE
40 #define ALSA_DEFAULT_SAMPLE_RATE 44100 // in Hz
43 #define SND_MIXER_VOL_RANGE_MIN (0)
44 #define SND_MIXER_VOL_RANGE_MAX (100)
46 #define ALSA_NAME_MAX 128
48 #define ALSA_STRCAT(x,y) \
49 if (strlen(x) + strlen(y) < ALSA_NAME_MAX) \
55 // Make sure this prototype is consistent with what's in
56 // external/libasound/alsa-lib-1.0.16/src/pcm/pcm_null.c!
58 extern int snd_pcm_null_open(snd_pcm_t **pcmp,
60 snd_pcm_stream_t stream,
64 // Function for dlsym() to look up for creating a new AudioHardwareInterface.
66 android::AudioHardwareInterface *createAudioHardware(void) {
67 return new android::AudioHardwareALSA();
74 typedef AudioSystem::audio_routes audio_routes;
76 #define ROUTE_ALL AudioSystem::ROUTE_ALL
77 #define ROUTE_EARPIECE AudioSystem::ROUTE_EARPIECE
78 #define ROUTE_SPEAKER AudioSystem::ROUTE_SPEAKER
79 #define ROUTE_BLUETOOTH_SCO AudioSystem::ROUTE_BLUETOOTH_SCO
80 #define ROUTE_HEADSET AudioSystem::ROUTE_HEADSET
81 #define ROUTE_BLUETOOTH_A2DP AudioSystem::ROUTE_BLUETOOTH_A2DP
82 #ifdef FM_ROUTE_SUPPORT
83 #define ROUTE_FM AudioSystem::ROUTE_FM
86 // ----------------------------------------------------------------------------
88 static const int DEFAULT_SAMPLE_RATE = ALSA_DEFAULT_SAMPLE_RATE;
90 static const char _nullALSADeviceName[] = "NULL_Device";
92 static void ALSAErrorHandler(const char *file,
104 l = snprintf(buf, BUFSIZ, "%s:%i:(%s) ", file, line, function);
105 vsnprintf(buf + l, BUFSIZ - l, fmt, arg);
106 buf[BUFSIZ-1] = '\0';
107 LOG(LOG_ERROR, "ALSALib", buf);
111 // ----------------------------------------------------------------------------
113 /* The following table(s) need to match in order of the route bits
115 static const char *deviceSuffix[] = {
116 /* ROUTE_EARPIECE */ "_Earpiece",
117 /* ROUTE_SPEAKER */ "_Speaker",
118 /* ROUTE_BLUETOOTH_SCO */ "_Bluetooth",
119 /* ROUTE_HEADSET */ "_Headset",
120 /* ROUTE_BLUETOOTH_A2DP */ "_Bluetooth-A2DP",
121 #ifdef FM_ROUTE_SUPPORT
122 /* ROUTE_FM */ "_FM",
126 static const int deviceSuffixLen = (sizeof(deviceSuffix) / sizeof(char *));
130 struct alsa_properties_t
132 const audio_routes routes;
133 const char *propName;
134 const char *propDefault;
138 static alsa_properties_t
139 mixerMasterProp[SND_PCM_STREAM_LAST+1] = {
140 { ROUTE_ALL, "alsa.mixer.playback.master", "PCM", NULL},
141 { ROUTE_ALL, "alsa.mixer.capture.master", "Capture", NULL}
144 static alsa_properties_t
145 mixerProp[][SND_PCM_STREAM_LAST+1] = {
147 {ROUTE_EARPIECE, "alsa.mixer.playback.earpiece", "Earpiece", NULL},
148 {ROUTE_EARPIECE, "alsa.mixer.capture.earpiece", "Capture", NULL}
151 {ROUTE_SPEAKER, "alsa.mixer.playback.speaker", "Speaker", NULL},
152 {ROUTE_SPEAKER, "alsa.mixer.capture.speaker", "", NULL}
155 {ROUTE_BLUETOOTH_SCO, "alsa.mixer.playback.bluetooth.sco", "Bluetooth", NULL},
156 {ROUTE_BLUETOOTH_SCO, "alsa.mixer.capture.bluetooth.sco", "Bluetooth Capture", NULL}
159 {ROUTE_HEADSET, "alsa.mixer.playback.headset", "Headphone", NULL},
160 {ROUTE_HEADSET, "alsa.mixer.capture.headset", "Capture", NULL}
163 {ROUTE_BLUETOOTH_A2DP, "alsa.mixer.playback.bluetooth.a2dp", "Bluetooth A2DP", NULL},
164 {ROUTE_BLUETOOTH_A2DP, "alsa.mixer.capture.bluetooth.a2dp", "Bluetooth A2DP Capture", NULL}
166 #ifdef FM_ROUTE_SUPPORT
168 {ROUTE_FM, "alsa.mixer.playback.fm", "FM", NULL},
169 {ROUTE_FM, "alsa.mixer.capture.fm", "", NULL}
173 {static_cast<audio_routes>(0), NULL, NULL, NULL},
174 {static_cast<audio_routes>(0), NULL, NULL, NULL}
178 // ----------------------------------------------------------------------------
180 AudioHardwareALSA::AudioHardwareALSA() :
186 snd_lib_error_set_handler(&ALSAErrorHandler);
187 mMixer = new ALSAMixer;
190 int err = hw_get_module(ACOUSTICS_HARDWARE_MODULE_ID,
191 (hw_module_t const**)&module);
195 err = module->methods->open(module, ACOUSTICS_HARDWARE_NAME, &device);
197 mAcousticDevice = (acoustic_device_t *)device;
202 AudioHardwareALSA::~AudioHardwareALSA()
204 if (mOutput) delete mOutput;
205 if (mInput) delete mInput;
206 if (mMixer) delete mMixer;
208 mAcousticDevice->common.close(&mAcousticDevice->common);
211 status_t AudioHardwareALSA::initCheck()
213 if (mMixer && mMixer->isValid())
219 status_t AudioHardwareALSA::standby()
221 AutoMutex lock(mLock);
224 return mOutput->standby();
227 return mInput->standby();
230 release_wake_lock ("AudioLock");
237 status_t AudioHardwareALSA::setVoiceVolume(float volume)
239 // The voice volume is used by the VOICE_CALL audio stream.
241 return mMixer->setVolume(ROUTE_EARPIECE, volume);
243 return INVALID_OPERATION;
246 status_t AudioHardwareALSA::setMasterVolume(float volume)
249 return mMixer->setMasterVolume(volume);
251 return INVALID_OPERATION;
255 AudioHardwareALSA::openOutputStream(int format,
260 AutoMutex lock(mLock);
262 // only one output stream allowed
264 *status = ALREADY_EXISTS;
268 AudioStreamOutALSA *out = new AudioStreamOutALSA(this);
270 *status = out->set(format, channelCount, sampleRate);
272 if (*status == NO_ERROR) {
274 // Some information is expected to be available immediately after
275 // the device is open.
276 uint32_t routes = mRoutes[mMode];
277 mOutput->setDevice(mMode, routes);
287 AudioHardwareALSA::openInputStream(int format,
291 AudioSystem::audio_in_acoustics acoustics)
293 AutoMutex lock(mLock);
295 // only one input stream allowed
297 *status = ALREADY_EXISTS;
301 AudioStreamInALSA *in = new AudioStreamInALSA(this, acoustics);
303 *status = in->set(format, channelCount, sampleRate);
304 if (*status == NO_ERROR) {
306 // Some information is expected to be available immediately after
307 // the device is open.
308 uint32_t routes = mRoutes[mMode];
309 mInput->setDevice(mMode, routes);
317 status_t AudioHardwareALSA::doRouting()
321 AutoMutex lock(mLock);
324 routes = mRoutes[mMode];
325 return mOutput->setDevice(mMode, routes);
330 status_t AudioHardwareALSA::setMicMute(bool state)
333 return mMixer->setCaptureMuteState(ROUTE_EARPIECE, state);
338 status_t AudioHardwareALSA::getMicMute(bool *state)
341 return mMixer->getCaptureMuteState(ROUTE_EARPIECE, state);
346 status_t AudioHardwareALSA::dump(int fd, const Vector<String16>& args)
351 // ----------------------------------------------------------------------------
353 ALSAStreamOps::ALSAStreamOps(AudioHardwareALSA *parent) :
361 if (snd_pcm_hw_params_malloc(&mHardwareParams) < 0) {
362 LOG_ALWAYS_FATAL("Failed to allocate ALSA hardware parameters!");
365 if (snd_pcm_sw_params_malloc(&mSoftwareParams) < 0) {
366 LOG_ALWAYS_FATAL("Failed to allocate ALSA software parameters!");
370 ALSAStreamOps::~ALSAStreamOps()
375 snd_pcm_hw_params_free(mHardwareParams);
378 snd_pcm_sw_params_free(mSoftwareParams);
381 status_t ALSAStreamOps::set(int format,
386 mDefaults->channels = channels;
389 mDefaults->sampleRate = rate;
393 case AudioSystem::DEFAULT:
396 case AudioSystem::PCM_16_BIT:
397 mDefaults->format = SND_PCM_FORMAT_S16_LE;
400 case AudioSystem::PCM_8_BIT:
401 mDefaults->format = SND_PCM_FORMAT_S8;
405 LOGE("Unknown PCM format %i. Forcing default", format);
412 uint32_t ALSAStreamOps::sampleRate() const
420 return snd_pcm_hw_params_get_rate(mHardwareParams, &rate, 0) < 0
421 ? 0 : static_cast<uint32_t>(rate);
424 status_t ALSAStreamOps::sampleRate(uint32_t rate)
427 unsigned int requestedRate;
433 stream = streamName();
434 requestedRate = rate;
435 err = snd_pcm_hw_params_set_rate_near(mHandle,
441 LOGE("Unable to set %s sample rate to %u: %s",
442 stream, rate, snd_strerror(err));
445 if (requestedRate != rate) {
446 // Some devices have a fixed sample rate, and can not be changed.
447 // This may cause resampling problems; i.e. PCM playback will be too
449 LOGW("Requested rate (%u HZ) does not match actual rate (%u HZ)",
450 rate, requestedRate);
453 LOGD("Set %s sample rate to %u HZ", stream, requestedRate);
459 // Return the number of bytes (not frames)
461 size_t ALSAStreamOps::bufferSize() const
468 snd_pcm_uframes_t bufferSize = 0;
469 snd_pcm_uframes_t periodSize = 0;
471 err = snd_pcm_get_params(mHandle, &bufferSize, &periodSize);
476 return static_cast<size_t>(snd_pcm_frames_to_bytes(mHandle, bufferSize));
479 int ALSAStreamOps::format() const
481 snd_pcm_format_t ALSAFormat;
482 int pcmFormatBitWidth;
483 int audioSystemFormat;
488 if (snd_pcm_hw_params_get_format(mHardwareParams, &ALSAFormat) < 0) {
492 pcmFormatBitWidth = snd_pcm_format_physical_width(ALSAFormat);
493 audioSystemFormat = AudioSystem::DEFAULT;
494 switch(pcmFormatBitWidth) {
496 audioSystemFormat = AudioSystem::PCM_8_BIT;
500 audioSystemFormat = AudioSystem::PCM_16_BIT;
504 LOG_FATAL("Unknown AudioSystem bit width %i!", pcmFormatBitWidth);
507 return audioSystemFormat;
510 int ALSAStreamOps::channelCount() const
518 err = snd_pcm_hw_params_get_channels(mHardwareParams, &val);
520 LOGE("Unable to get device channel count: %s",
528 status_t ALSAStreamOps::channelCount(int channels) {
534 err = snd_pcm_hw_params_set_channels(mHandle, mHardwareParams, channels);
536 LOGE("Unable to set channel count to %i: %s",
537 channels, snd_strerror(err));
541 LOGD("Using %i %s for %s.",
542 channels, channels == 1 ? "channel" : "channels", streamName());
547 status_t ALSAStreamOps::open(int mode, uint32_t device)
549 const char *stream = streamName();
550 const char *devName = deviceName(mode, device);
555 // The PCM stream is opened in blocking mode, per ALSA defaults. The
556 // AudioFlinger seems to assume blocking mode too, so asynchronous mode
557 // should not be used.
558 err = snd_pcm_open(&mHandle, devName, mDefaults->direction, 0);
561 // See if there is a less specific name we can try.
562 // Note: We are changing the contents of a const char * here.
563 char *tail = strrchr(devName, '_');
569 // None of the Android defined audio devices exist. Open a generic one.
571 err = snd_pcm_open(&mHandle, devName, mDefaults->direction, 0);
573 // Last resort is the NULL device (i.e. the bit bucket).
574 devName = _nullALSADeviceName;
575 err = snd_pcm_open(&mHandle, devName, mDefaults->direction, 0);
582 LOGI("Initialized ALSA %s device %s", stream, devName);
586 void ALSAStreamOps::close()
588 snd_pcm_t *handle = mHandle;
592 snd_pcm_close(handle);
598 status_t ALSAStreamOps::setSoftwareParams()
605 // Get the current software parameters
606 err = snd_pcm_sw_params_current(mHandle, mSoftwareParams);
608 LOGE("Unable to get software parameters: %s", snd_strerror(err));
612 snd_pcm_uframes_t bufferSize = 0;
613 snd_pcm_uframes_t periodSize = 0;
614 snd_pcm_uframes_t startThreshold;
616 // Configure ALSA to start the transfer when the buffer is almost full.
617 snd_pcm_get_params(mHandle, &bufferSize, &periodSize);
619 if (mDefaults->direction == SND_PCM_STREAM_PLAYBACK) {
620 // For playback, configure ALSA to start the transfer when the
621 // buffer is almost full.
622 startThreshold = (bufferSize / periodSize) * periodSize;
625 // For recording, configure ALSA to start the transfer on the
630 err = snd_pcm_sw_params_set_start_threshold(mHandle,
634 LOGE("Unable to set start threshold to %lu frames: %s",
635 startThreshold, snd_strerror(err));
639 // Stop the transfer when the buffer is full.
640 err = snd_pcm_sw_params_set_stop_threshold(mHandle,
644 LOGE("Unable to set stop threshold to %lu frames: %s",
645 bufferSize, snd_strerror(err));
649 // Allow the transfer to start when at least periodSize samples can be
651 err = snd_pcm_sw_params_set_avail_min(mHandle,
655 LOGE("Unable to configure available minimum to %lu: %s",
656 periodSize, snd_strerror(err));
660 // Commit the software parameters back to the device.
661 err = snd_pcm_sw_params(mHandle, mSoftwareParams);
663 LOGE("Unable to configure software parameters: %s",
671 status_t ALSAStreamOps::setPCMFormat(snd_pcm_format_t format)
673 const char *formatDesc;
674 const char *formatName;
678 // snd_pcm_format_description() and snd_pcm_format_name() do not perform
679 // proper bounds checking.
680 validFormat = (static_cast<int>(format) > SND_PCM_FORMAT_UNKNOWN) &&
681 (static_cast<int>(format) <= SND_PCM_FORMAT_LAST);
682 formatDesc = validFormat ?
683 snd_pcm_format_description(format) : "Invalid Format";
684 formatName = validFormat ?
685 snd_pcm_format_name(format) : "UNKNOWN";
687 err = snd_pcm_hw_params_set_format(mHandle, mHardwareParams, format);
689 LOGE("Unable to configure PCM format %s (%s): %s",
690 formatName, formatDesc, snd_strerror(err));
694 LOGD("Set %s PCM format to %s (%s)", streamName(), formatName, formatDesc);
698 status_t ALSAStreamOps::setHardwareResample(bool resample)
702 err = snd_pcm_hw_params_set_rate_resample(mHandle,
704 static_cast<int>(resample));
706 LOGE("Unable to %s hardware resampling: %s",
707 resample ? "enable" : "disable",
714 const char *ALSAStreamOps::streamName()
716 // Don't use snd_pcm_stream(mHandle), as the PCM stream may not be
717 // opened yet. In such case, snd_pcm_stream() will abort().
718 return snd_pcm_stream_name(mDefaults->direction);
722 // Set playback or capture PCM device. It's possible to support audio output
723 // or input from multiple devices by using the ALSA plugins, but this is
724 // not supported for simplicity.
726 // The AudioHardwareALSA API does not allow one to set the input routing.
728 // If the "routes" value does not map to a valid device, the default playback
731 status_t ALSAStreamOps::setDevice(int mode, uint32_t device)
733 // Close off previously opened device.
734 // It would be nice to determine if the underlying device actually
735 // changes, but we might be manipulating mixer settings (see asound.conf).
739 const char *stream = streamName();
741 status_t status = open (mode, device);
744 if (status != NO_ERROR)
747 err = snd_pcm_hw_params_any(mHandle, mHardwareParams);
749 LOGE("Unable to configure hardware: %s", snd_strerror(err));
753 // Set the interleaved read and write format.
754 err = snd_pcm_hw_params_set_access(mHandle, mHardwareParams,
755 SND_PCM_ACCESS_RW_INTERLEAVED);
757 LOGE("Unable to configure PCM read/write format: %s",
762 status = setPCMFormat(mDefaults->format);
765 // Some devices do not have the default two channels. Force an error to
766 // prevent AudioMixer from crashing and taking the whole system down.
768 // Note that some devices will return an -EINVAL if the channel count
769 // is queried before it has been set. i.e. calling channelCount()
770 // before channelCount(channels) may return -EINVAL.
772 status = channelCount(mDefaults->channels);
773 if (status != NO_ERROR)
776 // Don't check for failure; some devices do not support the default
778 sampleRate(mDefaults->sampleRate);
780 #ifdef DISABLE_HARWARE_RESAMPLING
781 // Disable hardware resampling.
782 status = setHardwareResample(false);
783 if (status != NO_ERROR)
787 snd_pcm_uframes_t bufferSize = mDefaults->bufferSize;
788 unsigned int latency = mDefaults->latency;
790 // Make sure we have at least the size we originally wanted
791 err = snd_pcm_hw_params_set_buffer_size(mHandle, mHardwareParams, bufferSize);
793 LOGE("Unable to set buffer size to %d: %s",
794 (int)bufferSize, snd_strerror(err));
798 // Setup buffers for latency
799 err = snd_pcm_hw_params_set_buffer_time_near (mHandle, mHardwareParams,
802 /* That didn't work, set the period instead */
803 unsigned int periodTime = latency / 4;
804 err = snd_pcm_hw_params_set_period_time_near (mHandle, mHardwareParams,
807 LOGE("Unable to set the period time for latency: %s", snd_strerror(err));
810 snd_pcm_uframes_t periodSize;
811 err = snd_pcm_hw_params_get_period_size (mHardwareParams, &periodSize, NULL);
813 LOGE("Unable to get the period size for latency: %s", snd_strerror(err));
816 bufferSize = periodSize * 4;
817 if (bufferSize < mDefaults->bufferSize)
818 bufferSize = mDefaults->bufferSize;
819 err = snd_pcm_hw_params_set_buffer_size_near (mHandle, mHardwareParams, &bufferSize);
821 LOGE("Unable to set the buffer size for latency: %s", snd_strerror(err));
825 // OK, we got buffer time near what we expect. See what that did for bufferSize.
826 err = snd_pcm_hw_params_get_buffer_size (mHardwareParams, &bufferSize);
828 LOGE("Unable to get the buffer size for latency: %s", snd_strerror(err));
831 // Does set_buffer_time_near change the passed value? It should.
832 err = snd_pcm_hw_params_get_buffer_time (mHardwareParams, &latency, NULL);
834 LOGE("Unable to get the buffer time for latency: %s", snd_strerror(err));
837 unsigned int periodTime = latency / 4;
838 err = snd_pcm_hw_params_set_period_time_near (mHandle, mHardwareParams,
841 LOGE("Unable to set the period time for latency: %s", snd_strerror(err));
846 LOGD("Buffer size: %d", (int)bufferSize);
847 LOGD("Latency: %d", (int)latency);
849 mDefaults->bufferSize = bufferSize;
850 mDefaults->latency = latency;
852 // Commit the hardware parameters back to the device.
853 err = snd_pcm_hw_params(mHandle, mHardwareParams);
855 LOGE("Unable to set hardware parameters: %s", snd_strerror(err));
859 status = setSoftwareParams();
864 const char *ALSAStreamOps::deviceName(int mode, uint32_t device)
866 static char devString[ALSA_NAME_MAX];
869 strcpy (devString, mDefaults->devicePrefix);
871 for (int dev=0; device; dev++)
872 if (device & (1 << dev)) {
873 /* Don't go past the end of our list */
874 if (dev >= deviceSuffixLen)
876 ALSA_STRCAT (devString, deviceSuffix[dev]);
877 device &= ~(1 << dev);
883 case AudioSystem::MODE_NORMAL:
884 ALSA_STRCAT (devString, "_normal");
886 case AudioSystem::MODE_RINGTONE:
887 ALSA_STRCAT (devString, "_ringtone");
889 case AudioSystem::MODE_IN_CALL:
890 ALSA_STRCAT (devString, "_incall");
897 // ----------------------------------------------------------------------------
899 AudioStreamOutALSA::AudioStreamOutALSA(AudioHardwareALSA *parent) :
900 ALSAStreamOps(parent)
902 static StreamDefaults _defaults = {
903 devicePrefix : "AndroidPlayback",
904 direction : SND_PCM_STREAM_PLAYBACK,
905 format : SND_PCM_FORMAT_S16_LE, // AudioSystem::PCM_16_BIT
907 sampleRate : DEFAULT_SAMPLE_RATE,
908 latency : 250000, // Desired Delay in usec
909 bufferSize : 16384, // Desired Number of samples
912 setStreamDefaults(&_defaults);
915 AudioStreamOutALSA::~AudioStreamOutALSA()
918 mParent->mOutput = NULL;
921 int AudioStreamOutALSA::channelCount() const
923 int c = ALSAStreamOps::channelCount();
925 // AudioMixer will seg fault if it doesn't have two channels.
927 "AudioMixer expects two channels, but only %i found!", c);
931 status_t AudioStreamOutALSA::setVolume(float volume)
933 if (! mParent->mMixer || ! mDevice)
936 return mParent->mMixer->setVolume (mDevice, volume);
939 ssize_t AudioStreamOutALSA::write(const void *buffer, size_t bytes)
944 AutoMutex lock(mParent->mLock);
949 if (!mParent->mPowerLock) {
950 acquire_wake_lock (PARTIAL_WAKE_LOCK, "AudioLock");
951 setDevice(mMode, mDevice);
952 mParent->mPowerLock = true;
955 n = snd_pcm_writei(mHandle,
957 snd_pcm_bytes_to_frames(mHandle, bytes));
960 // snd_pcm_recover() will return 0 if successful in recovering from
961 // an error, or -errno if the error was unrecoverable.
962 n = snd_pcm_recover(mHandle, n, 0);
964 return static_cast<ssize_t>(n);
967 return static_cast<ssize_t>(snd_pcm_frames_to_bytes(mHandle, n));
970 status_t AudioStreamOutALSA::dump(int fd, const Vector<String16>& args)
975 status_t AudioStreamOutALSA::setDevice(int mode, uint32_t newDevice)
977 return ALSAStreamOps::setDevice(mode, newDevice);
980 status_t AudioStreamOutALSA::standby()
983 snd_pcm_drain (mHandle);
988 bool AudioStreamOutALSA::isStandby()
993 #define USEC_TO_MSEC(x) ((x + 999) / 1000)
995 uint32_t AudioStreamOutALSA::latency() const
997 // Android wants latency in milliseconds.
998 return USEC_TO_MSEC (mDefaults->latency);
1001 // ----------------------------------------------------------------------------
1003 AudioStreamInALSA::AudioStreamInALSA(AudioHardwareALSA *parent,
1004 AudioSystem::audio_in_acoustics acoustics) :
1005 ALSAStreamOps(parent),
1006 mAcoustics(acoustics)
1008 static StreamDefaults _defaults = {
1009 devicePrefix : "AndroidRecord",
1010 direction : SND_PCM_STREAM_CAPTURE,
1011 format : SND_PCM_FORMAT_S16_LE, // AudioSystem::PCM_16_BIT
1013 sampleRate : AudioRecord::DEFAULT_SAMPLE_RATE,
1014 latency : 250000, // Desired Delay in usec
1015 bufferSize : 2048, // Desired Number of samples
1018 setStreamDefaults(&_defaults);
1021 AudioStreamInALSA::~AudioStreamInALSA()
1024 mParent->mInput = NULL;
1027 status_t AudioStreamInALSA::setGain(float gain)
1029 if (mParent->mMixer)
1030 return mParent->mMixer->setMasterGain (gain);
1035 ssize_t AudioStreamInALSA::read(void *buffer, ssize_t bytes)
1037 snd_pcm_sframes_t n, frames = snd_pcm_bytes_to_frames(mHandle, bytes);
1040 AutoMutex lock(mParent->mLock);
1042 if (!mParent->mPowerLock) {
1043 acquire_wake_lock (PARTIAL_WAKE_LOCK, "AudioLock");
1044 setDevice(mMode, mDevice);
1045 mParent->mPowerLock = true;
1048 n = snd_pcm_readi(mHandle, buffer, frames);
1052 n = snd_pcm_recover(mHandle, n, 0);
1054 n = snd_pcm_prepare(mHandle);
1056 return static_cast<ssize_t>(n);
1059 if (mParent->mAcousticDevice &&
1060 mParent->mAcousticDevice->filter) {
1061 n = mParent->mAcousticDevice->filter(mHandle, buffer, frames);
1063 return static_cast<ssize_t>(n);
1066 return static_cast<ssize_t>(snd_pcm_frames_to_bytes(mHandle, n));
1069 status_t AudioStreamInALSA::dump(int fd, const Vector<String16>& args)
1074 status_t AudioStreamInALSA::setDevice(int mode, uint32_t newDevice)
1076 status_t status = ALSAStreamOps::setDevice(mode, newDevice);
1078 if (status == NO_ERROR && mParent->mAcousticDevice)
1079 status = mParent->mAcousticDevice->set_acoustics(mHandle, mAcoustics);
1084 status_t AudioStreamInALSA::standby()
1089 // ----------------------------------------------------------------------------
1095 min(SND_MIXER_VOL_RANGE_MIN),
1096 max(SND_MIXER_VOL_RANGE_MAX),
1101 snd_mixer_elem_t *elem;
1106 char name[ALSA_NAME_MAX];
1109 static int initMixer (snd_mixer_t **mixer, const char *name)
1113 if ((err = snd_mixer_open(mixer, 0)) < 0) {
1114 LOGE("Unable to open mixer: %s", snd_strerror(err));
1118 if ((err = snd_mixer_attach(*mixer, name)) < 0) {
1119 LOGE("Unable to attach mixer to device %s: %s",
1120 name, snd_strerror(err));
1122 if ((err = snd_mixer_attach(*mixer, "hw:00")) < 0) {
1123 LOGE("Unable to attach mixer to device default: %s",
1126 snd_mixer_close (*mixer);
1132 if ((err = snd_mixer_selem_register(*mixer, NULL, NULL)) < 0) {
1133 LOGE("Unable to register mixer elements: %s", snd_strerror(err));
1134 snd_mixer_close (*mixer);
1139 // Get the mixer controls from the kernel
1140 if ((err = snd_mixer_load(*mixer)) < 0) {
1141 LOGE("Unable to load mixer elements: %s", snd_strerror(err));
1142 snd_mixer_close (*mixer);
1150 typedef int (*hasVolume_t)(snd_mixer_elem_t*);
1152 static const hasVolume_t hasVolume[] = {
1153 snd_mixer_selem_has_playback_volume,
1154 snd_mixer_selem_has_capture_volume
1157 typedef int (*getVolumeRange_t)(snd_mixer_elem_t*, long int*, long int*);
1159 static const getVolumeRange_t getVolumeRange[] = {
1160 snd_mixer_selem_get_playback_volume_range,
1161 snd_mixer_selem_get_capture_volume_range
1164 typedef int (*setVolume_t)(snd_mixer_elem_t*, long int);
1166 static const setVolume_t setVol[] = {
1167 snd_mixer_selem_set_playback_volume_all,
1168 snd_mixer_selem_set_capture_volume_all
1171 ALSAMixer::ALSAMixer()
1175 initMixer (&mMixer[SND_PCM_STREAM_PLAYBACK], "AndroidPlayback");
1176 initMixer (&mMixer[SND_PCM_STREAM_CAPTURE], "AndroidRecord");
1178 snd_mixer_selem_id_t *sid;
1179 snd_mixer_selem_id_alloca(&sid);
1181 for (int i = 0; i <= SND_PCM_STREAM_LAST; i++) {
1183 mixer_info_t *info = mixerMasterProp[i].mInfo = new mixer_info_t;
1185 property_get (mixerMasterProp[i].propName,
1187 mixerMasterProp[i].propDefault);
1189 for (snd_mixer_elem_t *elem = snd_mixer_first_elem(mMixer[i]);
1191 elem = snd_mixer_elem_next(elem)) {
1193 if (!snd_mixer_selem_is_active(elem))
1196 snd_mixer_selem_get_id(elem, sid);
1198 // Find PCM playback volume control element.
1199 const char *elementName = snd_mixer_selem_id_get_name(sid);
1201 if (hasVolume[i] (elem))
1202 LOGD ("Mixer: element name: '%s'", elementName);
1204 if (info->elem == NULL &&
1205 strcmp(elementName, info->name) == 0 &&
1206 hasVolume[i] (elem)) {
1209 getVolumeRange[i] (elem, &info->min, &info->max);
1210 info->volume = info->max;
1211 setVol[i] (elem, info->volume);
1212 if (i == SND_PCM_STREAM_PLAYBACK &&
1213 snd_mixer_selem_has_playback_switch (elem))
1214 snd_mixer_selem_set_playback_switch_all (elem, 1);
1219 LOGD ("Mixer: master '%s' %s.", info->name, info->elem ? "found" : "not found");
1221 for (int j = 0; mixerProp[j][i].routes; j++) {
1223 mixer_info_t *info = mixerProp[j][i].mInfo = new mixer_info_t;
1225 property_get (mixerProp[j][i].propName,
1227 mixerProp[j][i].propDefault);
1229 for (snd_mixer_elem_t *elem = snd_mixer_first_elem(mMixer[i]);
1231 elem = snd_mixer_elem_next(elem)) {
1233 if (!snd_mixer_selem_is_active(elem))
1236 snd_mixer_selem_get_id(elem, sid);
1238 // Find PCM playback volume control element.
1239 const char *elementName = snd_mixer_selem_id_get_name(sid);
1241 if (info->elem == NULL &&
1242 strcmp(elementName, info->name) == 0 &&
1243 hasVolume[i] (elem)) {
1246 getVolumeRange[i] (elem, &info->min, &info->max);
1247 info->volume = info->max;
1248 setVol[i] (elem, info->volume);
1249 if (i == SND_PCM_STREAM_PLAYBACK &&
1250 snd_mixer_selem_has_playback_switch (elem))
1251 snd_mixer_selem_set_playback_switch_all (elem, 1);
1255 LOGD ("Mixer: route '%s' %s.", info->name, info->elem ? "found" : "not found");
1258 LOGD("mixer initialized.");
1261 ALSAMixer::~ALSAMixer()
1263 for (int i = 0; i <= SND_PCM_STREAM_LAST; i++) {
1264 if (mMixer[i]) snd_mixer_close (mMixer[i]);
1265 if (mixerMasterProp[i].mInfo) {
1266 delete mixerMasterProp[i].mInfo;
1267 mixerMasterProp[i].mInfo = NULL;
1269 for (int j = 0; mixerProp[j][i].routes; j++) {
1270 if (mixerProp[j][i].mInfo) {
1271 delete mixerProp[j][i].mInfo;
1272 mixerProp[j][i].mInfo = NULL;
1276 LOGD("mixer destroyed.");
1279 status_t ALSAMixer::setMasterVolume(float volume)
1281 mixer_info_t *info = mixerMasterProp[SND_PCM_STREAM_PLAYBACK].mInfo;
1282 if (!info || !info->elem) return INVALID_OPERATION;
1284 long minVol = info->min;
1285 long maxVol = info->max;
1287 // Make sure volume is between bounds.
1288 long vol = minVol + volume * (maxVol - minVol);
1289 if (vol > maxVol) vol = maxVol;
1290 if (vol < minVol) vol = minVol;
1293 snd_mixer_selem_set_playback_volume_all (info->elem, vol);
1298 status_t ALSAMixer::setMasterGain(float gain)
1300 mixer_info_t *info = mixerMasterProp[SND_PCM_STREAM_CAPTURE].mInfo;
1301 if (!info || !info->elem) return INVALID_OPERATION;
1303 long minVol = info->min;
1304 long maxVol = info->max;
1306 // Make sure volume is between bounds.
1307 long vol = minVol + gain * (maxVol - minVol);
1308 if (vol > maxVol) vol = maxVol;
1309 if (vol < minVol) vol = minVol;
1312 snd_mixer_selem_set_capture_volume_all (info->elem, vol);
1317 status_t ALSAMixer::setVolume(uint32_t device, float volume)
1319 for (int j = 0; mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes; j++)
1320 if (mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes & device) {
1322 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_PLAYBACK].mInfo;
1323 if (!info || !info->elem) return INVALID_OPERATION;
1325 long minVol = info->min;
1326 long maxVol = info->max;
1328 // Make sure volume is between bounds.
1329 long vol = minVol + volume * (maxVol - minVol);
1330 if (vol > maxVol) vol = maxVol;
1331 if (vol < minVol) vol = minVol;
1334 snd_mixer_selem_set_playback_volume_all (info->elem, vol);
1340 status_t ALSAMixer::setGain(uint32_t device, float gain)
1342 for (int j = 0; mixerProp[j][SND_PCM_STREAM_CAPTURE].routes; j++)
1343 if (mixerProp[j][SND_PCM_STREAM_CAPTURE].routes & device) {
1345 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_CAPTURE].mInfo;
1346 if (!info || !info->elem) return INVALID_OPERATION;
1348 long minVol = info->min;
1349 long maxVol = info->max;
1351 // Make sure volume is between bounds.
1352 long vol = minVol + gain * (maxVol - minVol);
1353 if (vol > maxVol) vol = maxVol;
1354 if (vol < minVol) vol = minVol;
1357 snd_mixer_selem_set_capture_volume_all (info->elem, vol);
1363 status_t ALSAMixer::setCaptureMuteState(uint32_t device, bool state)
1365 for (int j = 0; mixerProp[j][SND_PCM_STREAM_CAPTURE].routes; j++)
1366 if (mixerProp[j][SND_PCM_STREAM_CAPTURE].routes & device) {
1368 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_CAPTURE].mInfo;
1369 if (!info || !info->elem) return INVALID_OPERATION;
1371 if (snd_mixer_selem_has_capture_switch (info->elem)) {
1373 int err = snd_mixer_selem_set_capture_switch_all (info->elem, static_cast<int>(!state));
1375 LOGE("Unable to %s capture mixer switch %s",
1376 state ? "enable" : "disable", info->name);
1377 return INVALID_OPERATION;
1387 status_t ALSAMixer::getCaptureMuteState(uint32_t device, bool *state)
1389 if (! state) return BAD_VALUE;
1391 for (int j = 0; mixerProp[j][SND_PCM_STREAM_CAPTURE].routes; j++)
1392 if (mixerProp[j][SND_PCM_STREAM_CAPTURE].routes & device) {
1394 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_CAPTURE].mInfo;
1395 if (!info || !info->elem) return INVALID_OPERATION;
1397 *state = info->mute;
1404 status_t ALSAMixer::setPlaybackMuteState(uint32_t device, bool state)
1406 for (int j = 0; mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes; j++)
1407 if (mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes & device) {
1409 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_PLAYBACK].mInfo;
1410 if (!info || !info->elem) return INVALID_OPERATION;
1412 if (snd_mixer_selem_has_playback_switch (info->elem)) {
1414 int err = snd_mixer_selem_set_playback_switch_all (info->elem, static_cast<int>(!state));
1416 LOGE("Unable to %s playback mixer switch %s",
1417 state ? "enable" : "disable", info->name);
1418 return INVALID_OPERATION;
1428 status_t ALSAMixer::getPlaybackMuteState(uint32_t device, bool *state)
1430 if (! state) return BAD_VALUE;
1432 for (int j = 0; mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes; j++)
1433 if (mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes & device) {
1435 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_PLAYBACK].mInfo;
1436 if (!info || !info->elem) return INVALID_OPERATION;
1438 *state = info->mute;
1445 // ----------------------------------------------------------------------------
1447 ALSAControl::ALSAControl(const char *device)
1449 snd_ctl_open(&mHandle, device, 0);
1452 ALSAControl::~ALSAControl()
1454 if (mHandle) snd_ctl_close(mHandle);
1457 status_t ALSAControl::get(const char *name, unsigned int &value, int index)
1459 if (!mHandle) return NO_INIT;
1461 snd_ctl_elem_id_t *id;
1462 snd_ctl_elem_info_t *info;
1463 snd_ctl_elem_value_t *control;
1465 snd_ctl_elem_id_alloca(&id);
1466 snd_ctl_elem_info_alloca(&info);
1467 snd_ctl_elem_value_alloca(&control);
1469 snd_ctl_elem_id_set_name(id, name);
1470 snd_ctl_elem_info_set_id(info, id);
1472 int ret = snd_ctl_elem_info(mHandle, info);
1473 if (ret < 0) return BAD_VALUE;
1475 snd_ctl_elem_info_get_id(info, id);
1476 snd_ctl_elem_type_t type = snd_ctl_elem_info_get_type(info);
1477 unsigned int count = snd_ctl_elem_info_get_count(info);
1478 if ((unsigned int)index >= count) return BAD_VALUE;
1480 snd_ctl_elem_value_set_id(control, id);
1482 ret = snd_ctl_elem_read(mHandle, control);
1483 if (ret < 0) return BAD_VALUE;
1486 case SND_CTL_ELEM_TYPE_BOOLEAN:
1487 value = snd_ctl_elem_value_get_boolean(control, index);
1489 case SND_CTL_ELEM_TYPE_INTEGER:
1490 value = snd_ctl_elem_value_get_integer(control, index);
1492 case SND_CTL_ELEM_TYPE_INTEGER64:
1493 value = snd_ctl_elem_value_get_integer64(control, index);
1495 case SND_CTL_ELEM_TYPE_ENUMERATED:
1496 value = snd_ctl_elem_value_get_enumerated(control, index);
1498 case SND_CTL_ELEM_TYPE_BYTES:
1499 value = snd_ctl_elem_value_get_byte(control, index);
1508 status_t ALSAControl::set(const char *name, unsigned int value, int index)
1510 if (!mHandle) return NO_INIT;
1512 snd_ctl_elem_id_t *id;
1513 snd_ctl_elem_info_t *info;
1514 snd_ctl_elem_value_t *control;
1516 snd_ctl_elem_id_alloca(&id);
1517 snd_ctl_elem_info_alloca(&info);
1518 snd_ctl_elem_value_alloca(&control);
1520 snd_ctl_elem_id_set_name(id, name);
1521 snd_ctl_elem_info_set_id(info, id);
1523 int ret = snd_ctl_elem_info(mHandle, info);
1524 if (ret < 0) return BAD_VALUE;
1526 snd_ctl_elem_info_get_id(info, id);
1527 snd_ctl_elem_type_t type = snd_ctl_elem_info_get_type(info);
1528 unsigned int count = snd_ctl_elem_info_get_count(info);
1529 if ((unsigned int)index >= count) return BAD_VALUE;
1532 index = 0; // Range over all of them
1534 count = index + 1; // Just do the one specified
1536 snd_ctl_elem_value_set_id(control, id);
1538 for (unsigned int i = index; i < count; i++)
1540 case SND_CTL_ELEM_TYPE_BOOLEAN:
1541 snd_ctl_elem_value_set_boolean(control, i, value);
1543 case SND_CTL_ELEM_TYPE_INTEGER:
1544 snd_ctl_elem_value_set_integer(control, i, value);
1546 case SND_CTL_ELEM_TYPE_INTEGER64:
1547 snd_ctl_elem_value_set_integer64(control, i, value);
1549 case SND_CTL_ELEM_TYPE_ENUMERATED:
1550 snd_ctl_elem_value_set_enumerated(control, i, value);
1552 case SND_CTL_ELEM_TYPE_BYTES:
1553 snd_ctl_elem_value_set_byte(control, i, value);
1559 ret = snd_ctl_elem_write(mHandle, control);
1560 return (ret < 0) ? BAD_VALUE : NO_ERROR;
1563 // ----------------------------------------------------------------------------
1565 }; // namespace android