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 DISABLE_HARWARE_RESAMPLING
38 #ifndef ALSA_DEFAULT_SAMPLE_RATE
39 #define ALSA_DEFAULT_SAMPLE_RATE 44100 // in Hz
42 #define SND_MIXER_VOL_RANGE_MIN (0)
43 #define SND_MIXER_VOL_RANGE_MAX (100)
45 #define ALSA_NAME_MAX 128
47 #define ALSA_STRCAT(x,y) \
48 if (strlen(x) + strlen(y) < ALSA_NAME_MAX) \
54 // Make sure this prototype is consistent with what's in
55 // external/libasound/alsa-lib-1.0.16/src/pcm/pcm_null.c!
57 extern int snd_pcm_null_open(snd_pcm_t **pcmp,
59 snd_pcm_stream_t stream,
63 // Function for dlsym() to look up for creating a new AudioHardwareInterface.
65 android::AudioHardwareInterface *createAudioHardware(void) {
66 return new android::AudioHardwareALSA();
73 typedef AudioSystem::audio_routes audio_routes;
75 #define ROUTE_ALL AudioSystem::ROUTE_ALL
76 #define ROUTE_EARPIECE AudioSystem::ROUTE_EARPIECE
77 #define ROUTE_SPEAKER AudioSystem::ROUTE_SPEAKER
78 #define ROUTE_BLUETOOTH_SCO AudioSystem::ROUTE_BLUETOOTH_SCO
79 #define ROUTE_HEADSET AudioSystem::ROUTE_HEADSET
80 #define ROUTE_BLUETOOTH_A2DP AudioSystem::ROUTE_BLUETOOTH_A2DP
81 #ifdef FM_ROUTE_SUPPORT
82 #define ROUTE_FM AudioSystem::ROUTE_FM
85 // ----------------------------------------------------------------------------
87 static const int DEFAULT_SAMPLE_RATE = ALSA_DEFAULT_SAMPLE_RATE;
89 static const char _nullALSADeviceName[] = "NULL_Device";
91 static void ALSAErrorHandler(const char *file,
103 l = snprintf(buf, BUFSIZ, "%s:%i:(%s) ", file, line, function);
104 vsnprintf(buf + l, BUFSIZ - l, fmt, arg);
105 buf[BUFSIZ-1] = '\0';
106 LOG(LOG_ERROR, "ALSALib", buf);
110 // ----------------------------------------------------------------------------
112 /* The following table(s) need to match in order of the route bits
114 static const char *deviceSuffix[] = {
115 /* ROUTE_EARPIECE */ "_Earpiece",
116 /* ROUTE_SPEAKER */ "_Speaker",
117 /* ROUTE_BLUETOOTH_SCO */ "_Bluetooth",
118 /* ROUTE_HEADSET */ "_Headset",
119 /* ROUTE_BLUETOOTH_A2DP */ "_Bluetooth-A2DP",
120 #ifdef FM_ROUTE_SUPPORT
121 /* ROUTE_FM */ "_FM",
125 static const int deviceSuffixLen = (sizeof(deviceSuffix) / sizeof(char *));
129 struct alsa_properties_t
131 const audio_routes routes;
132 const char *propName;
133 const char *propDefault;
137 static alsa_properties_t
138 mixerMasterProp[SND_PCM_STREAM_LAST+1] = {
139 { ROUTE_ALL, "alsa.mixer.playback.master", "PCM", NULL},
140 { ROUTE_ALL, "alsa.mixer.capture.master", "Capture", NULL}
143 static alsa_properties_t
144 mixerProp[][SND_PCM_STREAM_LAST+1] = {
146 {ROUTE_EARPIECE, "alsa.mixer.playback.earpiece", "Earpiece", NULL},
147 {ROUTE_EARPIECE, "alsa.mixer.capture.earpiece", "Capture", NULL}
150 {ROUTE_SPEAKER, "alsa.mixer.playback.speaker", "Speaker", NULL},
151 {ROUTE_SPEAKER, "alsa.mixer.capture.speaker", "", NULL}
154 {ROUTE_BLUETOOTH_SCO, "alsa.mixer.playback.bluetooth.sco", "Bluetooth", NULL},
155 {ROUTE_BLUETOOTH_SCO, "alsa.mixer.capture.bluetooth.sco", "Bluetooth Capture", NULL}
158 {ROUTE_HEADSET, "alsa.mixer.playback.headset", "Headphone", NULL},
159 {ROUTE_HEADSET, "alsa.mixer.capture.headset", "Capture", NULL}
162 {ROUTE_BLUETOOTH_A2DP, "alsa.mixer.playback.bluetooth.a2dp", "Bluetooth A2DP", NULL},
163 {ROUTE_BLUETOOTH_A2DP, "alsa.mixer.capture.bluetooth.a2dp", "Bluetooth A2DP Capture", NULL}
165 #ifdef FM_ROUTE_SUPPORT
167 {ROUTE_FM, "alsa.mixer.playback.fm", "FM", NULL},
168 {ROUTE_FM, "alsa.mixer.capture.fm", "", NULL}
172 {static_cast<audio_routes>(0), NULL, NULL, NULL},
173 {static_cast<audio_routes>(0), NULL, NULL, NULL}
177 // ----------------------------------------------------------------------------
179 AudioHardwareALSA::AudioHardwareALSA() :
184 snd_lib_error_set_handler(&ALSAErrorHandler);
185 mMixer = new ALSAMixer;
188 int err = hw_get_module(ACOUSTICS_HARDWARE_MODULE_ID,
189 (hw_module_t const**)&module);
193 err = module->methods->open(module, ACOUSTICS_HARDWARE_NAME, &device);
195 mAcousticDevice = (acoustic_device_t *)device;
200 AudioHardwareALSA::~AudioHardwareALSA()
202 if (mOutput) delete mOutput;
203 if (mInput) delete mInput;
204 if (mMixer) delete mMixer;
206 mAcousticDevice->common.close(&mAcousticDevice->common);
209 status_t AudioHardwareALSA::initCheck()
211 if (mMixer && mMixer->isValid())
217 status_t AudioHardwareALSA::setVoiceVolume(float volume)
219 // The voice volume is used by the VOICE_CALL audio stream.
221 return mMixer->setVolume(ROUTE_EARPIECE, volume);
223 return INVALID_OPERATION;
226 status_t AudioHardwareALSA::setMasterVolume(float volume)
229 return mMixer->setMasterVolume(volume);
231 return INVALID_OPERATION;
235 AudioHardwareALSA::openOutputStream(int format,
240 AutoMutex lock(mLock);
242 // only one output stream allowed
244 *status = ALREADY_EXISTS;
248 AudioStreamOutALSA *out = new AudioStreamOutALSA(this);
250 *status = out->set(format, channelCount, sampleRate);
252 if (*status == NO_ERROR) {
254 // Some information is expected to be available immediately after
255 // the device is open.
256 *status = mOutput->setDevice(mMode, mRoutes[mMode]);
266 AudioHardwareALSA::openInputStream(int inputSource,
271 AudioSystem::audio_in_acoustics acoustics)
273 // check for valid input source
274 if ((inputSource < AudioRecord::DEFAULT_INPUT) ||
275 (inputSource >= AudioRecord::NUM_INPUT_SOURCES)) {
279 AutoMutex lock(mLock);
281 // only one input stream allowed
283 *status = ALREADY_EXISTS;
287 AudioStreamInALSA *in = new AudioStreamInALSA(this, acoustics);
289 *status = in->set(format, channelCount, sampleRate);
290 if (*status == NO_ERROR) {
292 // Some information is expected to be available immediately after
293 // the device is open.
294 *status = mInput->setDevice(mMode, mRoutes[mMode]);
303 status_t AudioHardwareALSA::doRouting()
305 AutoMutex lock(mLock);
310 return mOutput->setDevice(mMode, mRoutes[mMode]);
313 status_t AudioHardwareALSA::setMicMute(bool state)
316 return mMixer->setCaptureMuteState(ROUTE_EARPIECE, state);
321 status_t AudioHardwareALSA::getMicMute(bool *state)
324 return mMixer->getCaptureMuteState(ROUTE_EARPIECE, state);
329 status_t AudioHardwareALSA::dump(int fd, const Vector<String16>& args)
334 // ----------------------------------------------------------------------------
336 ALSAStreamOps::ALSAStreamOps(AudioHardwareALSA *parent) :
345 if (snd_pcm_hw_params_malloc(&mHardwareParams) < 0) {
346 LOG_ALWAYS_FATAL("Failed to allocate ALSA hardware parameters!");
349 if (snd_pcm_sw_params_malloc(&mSoftwareParams) < 0) {
350 LOG_ALWAYS_FATAL("Failed to allocate ALSA software parameters!");
354 ALSAStreamOps::~ALSAStreamOps()
356 AutoMutex lock(mLock);
361 snd_pcm_hw_params_free(mHardwareParams);
364 snd_pcm_sw_params_free(mSoftwareParams);
367 status_t ALSAStreamOps::set(int format,
372 mDefaults->channels = channels;
375 mDefaults->sampleRate = rate;
379 case AudioSystem::DEFAULT:
382 case AudioSystem::PCM_16_BIT:
383 mDefaults->format = SND_PCM_FORMAT_S16_LE;
386 case AudioSystem::PCM_8_BIT:
387 mDefaults->format = SND_PCM_FORMAT_S8;
391 LOGE("Unknown PCM format %i. Forcing default", format);
398 uint32_t ALSAStreamOps::sampleRate() const
404 return mDefaults->sampleRate;
406 return snd_pcm_hw_params_get_rate(mHardwareParams, &rate, 0) < 0
407 ? 0 : static_cast<uint32_t>(rate);
410 status_t ALSAStreamOps::sampleRate(uint32_t rate)
413 unsigned int requestedRate;
419 stream = streamName();
420 requestedRate = rate;
421 err = snd_pcm_hw_params_set_rate_near(mHandle,
427 LOGE("Unable to set %s sample rate to %u: %s",
428 stream, rate, snd_strerror(err));
431 if (requestedRate != rate) {
432 // Some devices have a fixed sample rate, and can not be changed.
433 // This may cause resampling problems; i.e. PCM playback will be too
435 LOGW("Requested rate (%u HZ) does not match actual rate (%u HZ)",
436 rate, requestedRate);
439 LOGV("Set %s sample rate to %u HZ", stream, requestedRate);
445 // Return the number of bytes (not frames)
447 size_t ALSAStreamOps::bufferSize() const
452 snd_pcm_uframes_t bufferSize = 0;
453 snd_pcm_uframes_t periodSize = 0;
456 err = snd_pcm_get_params(mHandle, &bufferSize, &periodSize);
461 size_t bytes = static_cast<size_t>(snd_pcm_frames_to_bytes(mHandle, bufferSize));
463 // Not sure when this happened, but unfortunately it now
464 // appears that the bufferSize must be reported as a
465 // power of 2. This might be the fault of 3rd party
467 for (size_t i = 1; (bytes & ~i) != 0; i<<=1)
473 int ALSAStreamOps::format() const
475 snd_pcm_format_t ALSAFormat;
476 int pcmFormatBitWidth;
477 int audioSystemFormat;
482 if (snd_pcm_hw_params_get_format(mHardwareParams, &ALSAFormat) < 0) {
486 pcmFormatBitWidth = snd_pcm_format_physical_width(ALSAFormat);
487 audioSystemFormat = AudioSystem::DEFAULT;
488 switch(pcmFormatBitWidth) {
490 audioSystemFormat = AudioSystem::PCM_8_BIT;
494 audioSystemFormat = AudioSystem::PCM_16_BIT;
498 LOG_FATAL("Unknown AudioSystem bit width %i!", pcmFormatBitWidth);
501 return audioSystemFormat;
504 int ALSAStreamOps::channelCount() const
507 return mDefaults->channels;
512 err = snd_pcm_hw_params_get_channels(mHardwareParams, &val);
514 LOGE("Unable to get device channel count: %s",
516 return mDefaults->channels;
522 status_t ALSAStreamOps::channelCount(int channels) {
528 err = snd_pcm_hw_params_set_channels(mHandle, mHardwareParams, channels);
530 LOGE("Unable to set channel count to %i: %s",
531 channels, snd_strerror(err));
535 LOGV("Using %i %s for %s.",
536 channels, channels == 1 ? "channel" : "channels", streamName());
541 status_t ALSAStreamOps::open(int mode, uint32_t device)
543 const char *stream = streamName();
544 const char *devName = deviceName(mode, device);
549 // The PCM stream is opened in blocking mode, per ALSA defaults. The
550 // AudioFlinger seems to assume blocking mode too, so asynchronous mode
551 // should not be used.
552 err = snd_pcm_open(&mHandle, devName, mDefaults->direction, 0);
555 // See if there is a less specific name we can try.
556 // Note: We are changing the contents of a const char * here.
557 char *tail = strrchr(devName, '_');
563 // None of the Android defined audio devices exist. Open a generic one.
565 err = snd_pcm_open(&mHandle, devName, mDefaults->direction, 0);
567 // Last resort is the NULL device (i.e. the bit bucket).
568 devName = _nullALSADeviceName;
569 err = snd_pcm_open(&mHandle, devName, mDefaults->direction, 0);
576 LOGI("Initialized ALSA %s device %s", stream, devName);
580 void ALSAStreamOps::close()
582 snd_pcm_t *handle = mHandle;
586 snd_pcm_close(handle);
589 status_t ALSAStreamOps::setSoftwareParams()
596 // Get the current software parameters
597 err = snd_pcm_sw_params_current(mHandle, mSoftwareParams);
599 LOGE("Unable to get software parameters: %s", snd_strerror(err));
603 snd_pcm_uframes_t bufferSize = 0;
604 snd_pcm_uframes_t periodSize = 0;
605 snd_pcm_uframes_t startThreshold, stopThreshold;
607 // Configure ALSA to start the transfer when the buffer is almost full.
608 snd_pcm_get_params(mHandle, &bufferSize, &periodSize);
610 if (mDefaults->direction == SND_PCM_STREAM_PLAYBACK) {
611 // For playback, configure ALSA to start the transfer when the
613 startThreshold = bufferSize - periodSize;
614 stopThreshold = bufferSize;
617 // For recording, configure ALSA to start the transfer on the
620 stopThreshold = bufferSize;
623 err = snd_pcm_sw_params_set_start_threshold(mHandle,
627 LOGE("Unable to set start threshold to %lu frames: %s",
628 startThreshold, snd_strerror(err));
632 err = snd_pcm_sw_params_set_stop_threshold(mHandle,
636 LOGE("Unable to set stop threshold to %lu frames: %s",
637 stopThreshold, snd_strerror(err));
641 // Allow the transfer to start when at least periodSize samples can be
643 err = snd_pcm_sw_params_set_avail_min(mHandle,
647 LOGE("Unable to configure available minimum to %lu: %s",
648 periodSize, snd_strerror(err));
652 // Commit the software parameters back to the device.
653 err = snd_pcm_sw_params(mHandle, mSoftwareParams);
655 LOGE("Unable to configure software parameters: %s",
663 status_t ALSAStreamOps::setPCMFormat(snd_pcm_format_t format)
665 const char *formatDesc;
666 const char *formatName;
670 // snd_pcm_format_description() and snd_pcm_format_name() do not perform
671 // proper bounds checking.
672 validFormat = (static_cast<int>(format) > SND_PCM_FORMAT_UNKNOWN) &&
673 (static_cast<int>(format) <= SND_PCM_FORMAT_LAST);
674 formatDesc = validFormat ?
675 snd_pcm_format_description(format) : "Invalid Format";
676 formatName = validFormat ?
677 snd_pcm_format_name(format) : "UNKNOWN";
679 err = snd_pcm_hw_params_set_format(mHandle, mHardwareParams, format);
681 LOGE("Unable to configure PCM format %s (%s): %s",
682 formatName, formatDesc, snd_strerror(err));
686 LOGV("Set %s PCM format to %s (%s)", streamName(), formatName, formatDesc);
690 status_t ALSAStreamOps::setHardwareResample(bool resample)
694 err = snd_pcm_hw_params_set_rate_resample(mHandle,
696 static_cast<int>(resample));
698 LOGE("Unable to %s hardware resampling: %s",
699 resample ? "enable" : "disable",
706 const char *ALSAStreamOps::streamName()
708 // Don't use snd_pcm_stream(mHandle), as the PCM stream may not be
709 // opened yet. In such case, snd_pcm_stream() will abort().
710 return snd_pcm_stream_name(mDefaults->direction);
714 // Set playback or capture PCM device. It's possible to support audio output
715 // or input from multiple devices by using the ALSA plugins, but this is
716 // not supported for simplicity.
718 // The AudioHardwareALSA API does not allow one to set the input routing.
720 // If the "routes" value does not map to a valid device, the default playback
723 status_t ALSAStreamOps::setDevice(int mode, uint32_t device)
725 // Close off previously opened device.
726 // It would be nice to determine if the underlying device actually
727 // changes, but we might be manipulating mixer settings (see asound.conf).
731 const char *stream = streamName();
733 status_t status = open (mode, device);
736 if (status != NO_ERROR)
739 err = snd_pcm_hw_params_any(mHandle, mHardwareParams);
741 LOGE("Unable to configure hardware: %s", snd_strerror(err));
745 // Set the interleaved read and write format.
746 err = snd_pcm_hw_params_set_access(mHandle, mHardwareParams,
747 SND_PCM_ACCESS_RW_INTERLEAVED);
749 LOGE("Unable to configure PCM read/write format: %s",
754 status = setPCMFormat(mDefaults->format);
757 // Some devices do not have the default two channels. Force an error to
758 // prevent AudioMixer from crashing and taking the whole system down.
760 // Note that some devices will return an -EINVAL if the channel count
761 // is queried before it has been set. i.e. calling channelCount()
762 // before channelCount(channels) may return -EINVAL.
764 status = channelCount(mDefaults->channels);
765 if (status != NO_ERROR)
768 // Don't check for failure; some devices do not support the default
770 sampleRate(mDefaults->sampleRate);
772 #ifdef DISABLE_HARWARE_RESAMPLING
773 // Disable hardware resampling.
774 status = setHardwareResample(false);
775 if (status != NO_ERROR)
779 snd_pcm_uframes_t bufferSize = mDefaults->bufferSize;
781 // Make sure we have at least the size we originally wanted
782 err = snd_pcm_hw_params_set_buffer_size(mHandle, mHardwareParams, bufferSize);
784 LOGE("Unable to set buffer size to %d: %s",
785 (int)bufferSize, snd_strerror(err));
789 unsigned int latency = mDefaults->latency;
791 // Setup buffers for latency
792 err = snd_pcm_hw_params_set_buffer_time_near (mHandle, mHardwareParams,
795 /* That didn't work, set the period instead */
796 unsigned int periodTime = latency / 4;
797 err = snd_pcm_hw_params_set_period_time_near (mHandle, mHardwareParams,
800 LOGE("Unable to set the period time for latency: %s", snd_strerror(err));
803 snd_pcm_uframes_t periodSize;
804 err = snd_pcm_hw_params_get_period_size (mHardwareParams, &periodSize, NULL);
806 LOGE("Unable to get the period size for latency: %s", snd_strerror(err));
809 bufferSize = periodSize * 4;
810 if (bufferSize < mDefaults->bufferSize)
811 bufferSize = mDefaults->bufferSize;
812 err = snd_pcm_hw_params_set_buffer_size_near (mHandle, mHardwareParams, &bufferSize);
814 LOGE("Unable to set the buffer size for latency: %s", snd_strerror(err));
818 // OK, we got buffer time near what we expect. See what that did for bufferSize.
819 err = snd_pcm_hw_params_get_buffer_size (mHardwareParams, &bufferSize);
821 LOGE("Unable to get the buffer size for latency: %s", snd_strerror(err));
824 // Does set_buffer_time_near change the passed value? It should.
825 err = snd_pcm_hw_params_get_buffer_time (mHardwareParams, &latency, NULL);
827 LOGE("Unable to get the buffer time for latency: %s", snd_strerror(err));
830 unsigned int periodTime = latency / 4;
831 err = snd_pcm_hw_params_set_period_time_near (mHandle, mHardwareParams,
834 LOGE("Unable to set the period time for latency: %s", snd_strerror(err));
839 LOGV("Buffer size: %d", (int)bufferSize);
840 LOGV("Latency: %d", (int)latency);
842 mDefaults->bufferSize = bufferSize;
843 mDefaults->latency = latency;
845 // Commit the hardware parameters back to the device.
846 err = snd_pcm_hw_params(mHandle, mHardwareParams);
848 LOGE("Unable to set hardware parameters: %s", snd_strerror(err));
852 status = setSoftwareParams();
857 const char *ALSAStreamOps::deviceName(int mode, uint32_t device)
859 static char devString[ALSA_NAME_MAX];
862 strcpy (devString, mDefaults->devicePrefix);
864 for (int dev=0; device; dev++)
865 if (device & (1 << dev)) {
866 /* Don't go past the end of our list */
867 if (dev >= deviceSuffixLen)
869 ALSA_STRCAT (devString, deviceSuffix[dev]);
870 device &= ~(1 << dev);
876 case AudioSystem::MODE_NORMAL:
877 ALSA_STRCAT (devString, "_normal");
879 case AudioSystem::MODE_RINGTONE:
880 ALSA_STRCAT (devString, "_ringtone");
882 case AudioSystem::MODE_IN_CALL:
883 ALSA_STRCAT (devString, "_incall");
890 // ----------------------------------------------------------------------------
892 AudioStreamOutALSA::AudioStreamOutALSA(AudioHardwareALSA *parent) :
893 ALSAStreamOps(parent)
895 static StreamDefaults _defaults = {
896 devicePrefix : "AndroidPlayback",
897 direction : SND_PCM_STREAM_PLAYBACK,
898 format : SND_PCM_FORMAT_S16_LE, // AudioSystem::PCM_16_BIT
900 sampleRate : DEFAULT_SAMPLE_RATE,
901 latency : 200000, // Desired Delay in usec
902 bufferSize : DEFAULT_SAMPLE_RATE / 5, // Desired Number of samples
905 setStreamDefaults(&_defaults);
907 snd_pcm_uframes_t bufferSize = mDefaults->bufferSize;
909 // See comment in bufferSize() method.
910 for (size_t i = 1; (bufferSize & ~i) != 0; i<<=1)
913 mDefaults->bufferSize = bufferSize;
916 AudioStreamOutALSA::~AudioStreamOutALSA()
919 mParent->mOutput = NULL;
922 int AudioStreamOutALSA::channelCount() const
924 int c = ALSAStreamOps::channelCount();
926 // AudioMixer will seg fault if it doesn't have two channels.
928 "AudioMixer expects two channels, but only %i found!", c);
932 status_t AudioStreamOutALSA::setVolume(float volume)
934 if (!mParent->mMixer || !mDevice)
937 return mParent->mMixer->setVolume (mDevice, volume);
940 ssize_t AudioStreamOutALSA::write(const void *buffer, size_t bytes)
946 AutoMutex lock(mLock);
949 acquire_wake_lock (PARTIAL_WAKE_LOCK, "AudioOutLock");
954 ALSAStreamOps::setDevice(mMode, mDevice);
957 n = snd_pcm_writei(mHandle,
958 (char *)buffer + sent,
959 snd_pcm_bytes_to_frames(mHandle, bytes));
961 // Somehow the stream is in a bad state. The driver probably
962 // has a bug and snd_pcm_recover() doesn't seem to handle this.
963 ALSAStreamOps::setDevice(mMode, mDevice);
967 // snd_pcm_recover() will return 0 if successful in recovering from
968 // an error, or -errno if the error was unrecoverable.
969 n = snd_pcm_recover(mHandle, n, 1);
971 return static_cast<ssize_t>(n);
975 sent += static_cast<ssize_t>(snd_pcm_frames_to_bytes(mHandle, n));
977 } while (mHandle && sent < bytes);
982 status_t AudioStreamOutALSA::dump(int fd, const Vector<String16>& args)
987 status_t AudioStreamOutALSA::setDevice(int mode, uint32_t newDevice)
989 AutoMutex lock(mLock);
991 return ALSAStreamOps::setDevice(mode, newDevice);
994 status_t AudioStreamOutALSA::standby()
996 AutoMutex lock(mLock);
999 snd_pcm_drain (mHandle);
1004 release_wake_lock ("AudioOutLock");
1011 #define USEC_TO_MSEC(x) ((x + 999) / 1000)
1013 uint32_t AudioStreamOutALSA::latency() const
1015 // Android wants latency in milliseconds.
1016 return USEC_TO_MSEC (mDefaults->latency);
1019 // ----------------------------------------------------------------------------
1021 AudioStreamInALSA::AudioStreamInALSA(AudioHardwareALSA *parent,
1022 AudioSystem::audio_in_acoustics acoustics) :
1023 ALSAStreamOps(parent),
1024 mAcoustics(acoustics)
1026 static StreamDefaults _defaults = {
1027 devicePrefix : "AndroidRecord",
1028 direction : SND_PCM_STREAM_CAPTURE,
1029 format : SND_PCM_FORMAT_S16_LE, // AudioSystem::PCM_16_BIT
1031 sampleRate : AudioRecord::DEFAULT_SAMPLE_RATE,
1032 latency : 250000, // Desired Delay in usec
1033 bufferSize : 2048, // Desired Number of samples
1036 setStreamDefaults(&_defaults);
1039 AudioStreamInALSA::~AudioStreamInALSA()
1042 mParent->mInput = NULL;
1045 status_t AudioStreamInALSA::setGain(float gain)
1047 if (mParent->mMixer)
1048 return mParent->mMixer->setMasterGain (gain);
1053 ssize_t AudioStreamInALSA::read(void *buffer, ssize_t bytes)
1055 snd_pcm_sframes_t n, frames = snd_pcm_bytes_to_frames(mHandle, bytes);
1058 AutoMutex lock(mLock);
1061 acquire_wake_lock (PARTIAL_WAKE_LOCK, "AudioInLock");
1066 ALSAStreamOps::setDevice(mMode, mDevice);
1068 n = snd_pcm_readi(mHandle, buffer, frames);
1072 n = snd_pcm_recover(mHandle, n, 0);
1074 n = snd_pcm_prepare(mHandle);
1076 return static_cast<ssize_t>(n);
1079 if (mParent->mAcousticDevice &&
1080 mParent->mAcousticDevice->filter) {
1081 n = mParent->mAcousticDevice->filter(mHandle, buffer, frames);
1083 return static_cast<ssize_t>(n);
1086 return static_cast<ssize_t>(snd_pcm_frames_to_bytes(mHandle, n));
1089 status_t AudioStreamInALSA::dump(int fd, const Vector<String16>& args)
1094 status_t AudioStreamInALSA::setDevice(int mode, uint32_t newDevice)
1096 AutoMutex lock(mLock);
1098 status_t status = ALSAStreamOps::setDevice(mode, newDevice);
1100 if (status == NO_ERROR && mParent->mAcousticDevice)
1101 status = mParent->mAcousticDevice->set_acoustics(mHandle, mAcoustics);
1106 status_t AudioStreamInALSA::standby()
1108 AutoMutex lock(mLock);
1113 release_wake_lock ("AudioInLock");
1120 // ----------------------------------------------------------------------------
1126 min(SND_MIXER_VOL_RANGE_MIN),
1127 max(SND_MIXER_VOL_RANGE_MAX),
1132 snd_mixer_elem_t *elem;
1137 char name[ALSA_NAME_MAX];
1140 static int initMixer (snd_mixer_t **mixer, const char *name)
1144 if ((err = snd_mixer_open(mixer, 0)) < 0) {
1145 LOGE("Unable to open mixer: %s", snd_strerror(err));
1149 if ((err = snd_mixer_attach(*mixer, name)) < 0) {
1150 LOGE("Unable to attach mixer to device %s: %s",
1151 name, snd_strerror(err));
1153 if ((err = snd_mixer_attach(*mixer, "hw:00")) < 0) {
1154 LOGE("Unable to attach mixer to device default: %s",
1157 snd_mixer_close (*mixer);
1163 if ((err = snd_mixer_selem_register(*mixer, NULL, NULL)) < 0) {
1164 LOGE("Unable to register mixer elements: %s", snd_strerror(err));
1165 snd_mixer_close (*mixer);
1170 // Get the mixer controls from the kernel
1171 if ((err = snd_mixer_load(*mixer)) < 0) {
1172 LOGE("Unable to load mixer elements: %s", snd_strerror(err));
1173 snd_mixer_close (*mixer);
1181 typedef int (*hasVolume_t)(snd_mixer_elem_t*);
1183 static const hasVolume_t hasVolume[] = {
1184 snd_mixer_selem_has_playback_volume,
1185 snd_mixer_selem_has_capture_volume
1188 typedef int (*getVolumeRange_t)(snd_mixer_elem_t*, long int*, long int*);
1190 static const getVolumeRange_t getVolumeRange[] = {
1191 snd_mixer_selem_get_playback_volume_range,
1192 snd_mixer_selem_get_capture_volume_range
1195 typedef int (*setVolume_t)(snd_mixer_elem_t*, long int);
1197 static const setVolume_t setVol[] = {
1198 snd_mixer_selem_set_playback_volume_all,
1199 snd_mixer_selem_set_capture_volume_all
1202 ALSAMixer::ALSAMixer()
1206 initMixer (&mMixer[SND_PCM_STREAM_PLAYBACK], "AndroidPlayback");
1207 initMixer (&mMixer[SND_PCM_STREAM_CAPTURE], "AndroidRecord");
1209 snd_mixer_selem_id_t *sid;
1210 snd_mixer_selem_id_alloca(&sid);
1212 for (int i = 0; i <= SND_PCM_STREAM_LAST; i++) {
1214 mixer_info_t *info = mixerMasterProp[i].mInfo = new mixer_info_t;
1216 property_get (mixerMasterProp[i].propName,
1218 mixerMasterProp[i].propDefault);
1220 for (snd_mixer_elem_t *elem = snd_mixer_first_elem(mMixer[i]);
1222 elem = snd_mixer_elem_next(elem)) {
1224 if (!snd_mixer_selem_is_active(elem))
1227 snd_mixer_selem_get_id(elem, sid);
1229 // Find PCM playback volume control element.
1230 const char *elementName = snd_mixer_selem_id_get_name(sid);
1232 if (info->elem == NULL &&
1233 strcmp(elementName, info->name) == 0 &&
1234 hasVolume[i] (elem)) {
1237 getVolumeRange[i] (elem, &info->min, &info->max);
1238 info->volume = info->max;
1239 setVol[i] (elem, info->volume);
1240 if (i == SND_PCM_STREAM_PLAYBACK &&
1241 snd_mixer_selem_has_playback_switch (elem))
1242 snd_mixer_selem_set_playback_switch_all (elem, 1);
1247 LOGV("Mixer: master '%s' %s.", info->name, info->elem ? "found" : "not found");
1249 for (int j = 0; mixerProp[j][i].routes; j++) {
1251 mixer_info_t *info = mixerProp[j][i].mInfo = new mixer_info_t;
1253 property_get (mixerProp[j][i].propName,
1255 mixerProp[j][i].propDefault);
1257 for (snd_mixer_elem_t *elem = snd_mixer_first_elem(mMixer[i]);
1259 elem = snd_mixer_elem_next(elem)) {
1261 if (!snd_mixer_selem_is_active(elem))
1264 snd_mixer_selem_get_id(elem, sid);
1266 // Find PCM playback volume control element.
1267 const char *elementName = snd_mixer_selem_id_get_name(sid);
1269 if (info->elem == NULL &&
1270 strcmp(elementName, info->name) == 0 &&
1271 hasVolume[i] (elem)) {
1274 getVolumeRange[i] (elem, &info->min, &info->max);
1275 info->volume = info->max;
1276 setVol[i] (elem, info->volume);
1277 if (i == SND_PCM_STREAM_PLAYBACK &&
1278 snd_mixer_selem_has_playback_switch (elem))
1279 snd_mixer_selem_set_playback_switch_all (elem, 1);
1283 LOGV("Mixer: route '%s' %s.", info->name, info->elem ? "found" : "not found");
1286 LOGV("mixer initialized.");
1289 ALSAMixer::~ALSAMixer()
1291 for (int i = 0; i <= SND_PCM_STREAM_LAST; i++) {
1292 if (mMixer[i]) snd_mixer_close (mMixer[i]);
1293 if (mixerMasterProp[i].mInfo) {
1294 delete mixerMasterProp[i].mInfo;
1295 mixerMasterProp[i].mInfo = NULL;
1297 for (int j = 0; mixerProp[j][i].routes; j++) {
1298 if (mixerProp[j][i].mInfo) {
1299 delete mixerProp[j][i].mInfo;
1300 mixerProp[j][i].mInfo = NULL;
1304 LOGV("mixer destroyed.");
1307 status_t ALSAMixer::setMasterVolume(float volume)
1309 mixer_info_t *info = mixerMasterProp[SND_PCM_STREAM_PLAYBACK].mInfo;
1310 if (!info || !info->elem) return INVALID_OPERATION;
1312 long minVol = info->min;
1313 long maxVol = info->max;
1315 // Make sure volume is between bounds.
1316 long vol = minVol + volume * (maxVol - minVol);
1317 if (vol > maxVol) vol = maxVol;
1318 if (vol < minVol) vol = minVol;
1321 snd_mixer_selem_set_playback_volume_all (info->elem, vol);
1326 status_t ALSAMixer::setMasterGain(float gain)
1328 mixer_info_t *info = mixerMasterProp[SND_PCM_STREAM_CAPTURE].mInfo;
1329 if (!info || !info->elem) return INVALID_OPERATION;
1331 long minVol = info->min;
1332 long maxVol = info->max;
1334 // Make sure volume is between bounds.
1335 long vol = minVol + gain * (maxVol - minVol);
1336 if (vol > maxVol) vol = maxVol;
1337 if (vol < minVol) vol = minVol;
1340 snd_mixer_selem_set_capture_volume_all (info->elem, vol);
1345 status_t ALSAMixer::setVolume(uint32_t device, float volume)
1347 for (int j = 0; mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes; j++)
1348 if (mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes & device) {
1350 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_PLAYBACK].mInfo;
1351 if (!info || !info->elem) return INVALID_OPERATION;
1353 long minVol = info->min;
1354 long maxVol = info->max;
1356 // Make sure volume is between bounds.
1357 long vol = minVol + volume * (maxVol - minVol);
1358 if (vol > maxVol) vol = maxVol;
1359 if (vol < minVol) vol = minVol;
1362 snd_mixer_selem_set_playback_volume_all (info->elem, vol);
1368 status_t ALSAMixer::setGain(uint32_t device, float gain)
1370 for (int j = 0; mixerProp[j][SND_PCM_STREAM_CAPTURE].routes; j++)
1371 if (mixerProp[j][SND_PCM_STREAM_CAPTURE].routes & device) {
1373 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_CAPTURE].mInfo;
1374 if (!info || !info->elem) return INVALID_OPERATION;
1376 long minVol = info->min;
1377 long maxVol = info->max;
1379 // Make sure volume is between bounds.
1380 long vol = minVol + gain * (maxVol - minVol);
1381 if (vol > maxVol) vol = maxVol;
1382 if (vol < minVol) vol = minVol;
1385 snd_mixer_selem_set_capture_volume_all (info->elem, vol);
1391 status_t ALSAMixer::setCaptureMuteState(uint32_t device, bool state)
1393 for (int j = 0; mixerProp[j][SND_PCM_STREAM_CAPTURE].routes; j++)
1394 if (mixerProp[j][SND_PCM_STREAM_CAPTURE].routes & device) {
1396 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_CAPTURE].mInfo;
1397 if (!info || !info->elem) return INVALID_OPERATION;
1399 if (snd_mixer_selem_has_capture_switch (info->elem)) {
1401 int err = snd_mixer_selem_set_capture_switch_all (info->elem, static_cast<int>(!state));
1403 LOGE("Unable to %s capture mixer switch %s",
1404 state ? "enable" : "disable", info->name);
1405 return INVALID_OPERATION;
1415 status_t ALSAMixer::getCaptureMuteState(uint32_t device, bool *state)
1417 if (!state) return BAD_VALUE;
1419 for (int j = 0; mixerProp[j][SND_PCM_STREAM_CAPTURE].routes; j++)
1420 if (mixerProp[j][SND_PCM_STREAM_CAPTURE].routes & device) {
1422 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_CAPTURE].mInfo;
1423 if (!info || !info->elem) return INVALID_OPERATION;
1425 *state = info->mute;
1432 status_t ALSAMixer::setPlaybackMuteState(uint32_t device, bool state)
1434 for (int j = 0; mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes; j++)
1435 if (mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes & device) {
1437 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_PLAYBACK].mInfo;
1438 if (!info || !info->elem) return INVALID_OPERATION;
1440 if (snd_mixer_selem_has_playback_switch (info->elem)) {
1442 int err = snd_mixer_selem_set_playback_switch_all (info->elem, static_cast<int>(!state));
1444 LOGE("Unable to %s playback mixer switch %s",
1445 state ? "enable" : "disable", info->name);
1446 return INVALID_OPERATION;
1456 status_t ALSAMixer::getPlaybackMuteState(uint32_t device, bool *state)
1458 if (!state) return BAD_VALUE;
1460 for (int j = 0; mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes; j++)
1461 if (mixerProp[j][SND_PCM_STREAM_PLAYBACK].routes & device) {
1463 mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_PLAYBACK].mInfo;
1464 if (!info || !info->elem) return INVALID_OPERATION;
1466 *state = info->mute;
1473 // ----------------------------------------------------------------------------
1475 ALSAControl::ALSAControl(const char *device)
1477 snd_ctl_open(&mHandle, device, 0);
1480 ALSAControl::~ALSAControl()
1482 if (mHandle) snd_ctl_close(mHandle);
1485 status_t ALSAControl::get(const char *name, unsigned int &value, int index)
1487 if (!mHandle) return NO_INIT;
1489 snd_ctl_elem_id_t *id;
1490 snd_ctl_elem_info_t *info;
1491 snd_ctl_elem_value_t *control;
1493 snd_ctl_elem_id_alloca(&id);
1494 snd_ctl_elem_info_alloca(&info);
1495 snd_ctl_elem_value_alloca(&control);
1497 snd_ctl_elem_id_set_name(id, name);
1498 snd_ctl_elem_info_set_id(info, id);
1500 int ret = snd_ctl_elem_info(mHandle, info);
1501 if (ret < 0) return BAD_VALUE;
1503 snd_ctl_elem_info_get_id(info, id);
1504 snd_ctl_elem_type_t type = snd_ctl_elem_info_get_type(info);
1505 unsigned int count = snd_ctl_elem_info_get_count(info);
1506 if ((unsigned int)index >= count) return BAD_VALUE;
1508 snd_ctl_elem_value_set_id(control, id);
1510 ret = snd_ctl_elem_read(mHandle, control);
1511 if (ret < 0) return BAD_VALUE;
1514 case SND_CTL_ELEM_TYPE_BOOLEAN:
1515 value = snd_ctl_elem_value_get_boolean(control, index);
1517 case SND_CTL_ELEM_TYPE_INTEGER:
1518 value = snd_ctl_elem_value_get_integer(control, index);
1520 case SND_CTL_ELEM_TYPE_INTEGER64:
1521 value = snd_ctl_elem_value_get_integer64(control, index);
1523 case SND_CTL_ELEM_TYPE_ENUMERATED:
1524 value = snd_ctl_elem_value_get_enumerated(control, index);
1526 case SND_CTL_ELEM_TYPE_BYTES:
1527 value = snd_ctl_elem_value_get_byte(control, index);
1536 status_t ALSAControl::set(const char *name, unsigned int value, int index)
1538 if (!mHandle) return NO_INIT;
1540 snd_ctl_elem_id_t *id;
1541 snd_ctl_elem_info_t *info;
1542 snd_ctl_elem_value_t *control;
1544 snd_ctl_elem_id_alloca(&id);
1545 snd_ctl_elem_info_alloca(&info);
1546 snd_ctl_elem_value_alloca(&control);
1548 snd_ctl_elem_id_set_name(id, name);
1549 snd_ctl_elem_info_set_id(info, id);
1551 int ret = snd_ctl_elem_info(mHandle, info);
1552 if (ret < 0) return BAD_VALUE;
1554 snd_ctl_elem_info_get_id(info, id);
1555 snd_ctl_elem_type_t type = snd_ctl_elem_info_get_type(info);
1556 unsigned int count = snd_ctl_elem_info_get_count(info);
1557 if ((unsigned int)index >= count) return BAD_VALUE;
1560 index = 0; // Range over all of them
1562 count = index + 1; // Just do the one specified
1564 snd_ctl_elem_value_set_id(control, id);
1566 for (unsigned int i = index; i < count; i++)
1568 case SND_CTL_ELEM_TYPE_BOOLEAN:
1569 snd_ctl_elem_value_set_boolean(control, i, value);
1571 case SND_CTL_ELEM_TYPE_INTEGER:
1572 snd_ctl_elem_value_set_integer(control, i, value);
1574 case SND_CTL_ELEM_TYPE_INTEGER64:
1575 snd_ctl_elem_value_set_integer64(control, i, value);
1577 case SND_CTL_ELEM_TYPE_ENUMERATED:
1578 snd_ctl_elem_value_set_enumerated(control, i, value);
1580 case SND_CTL_ELEM_TYPE_BYTES:
1581 snd_ctl_elem_value_set_byte(control, i, value);
1587 ret = snd_ctl_elem_write(mHandle, control);
1588 return (ret < 0) ? BAD_VALUE : NO_ERROR;
1591 // ----------------------------------------------------------------------------
1593 }; // namespace android