summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/audioflinger/AudioFlinger.cpp104
-rw-r--r--services/audioflinger/AudioFlinger.h12
2 files changed, 100 insertions, 16 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 27a9446..db368ad 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -175,8 +175,14 @@ static const char *audio_interfaces[] = {
AudioFlinger::AudioFlinger()
: BnAudioFlinger(),
- mPrimaryHardwareDev(0), mMasterVolume(1.0f), mMasterVolumeSW(1.0f),
- mMasterVolumeSupportLvl(MVS_NONE), mMasterMute(false), mNextUniqueId(1),
+ mPrimaryHardwareDev(0),
+ mMasterVolume(1.0f),
+ mMasterVolumeSW(1.0f),
+ mMasterVolumeSupportLvl(MVS_NONE),
+ mMasterMute(false),
+ mMasterMuteSW(false),
+ mMasterMuteSupportLvl(MMS_NONE),
+ mNextUniqueId(1),
mBtNrecIsOff(false)
{
}
@@ -245,10 +251,13 @@ void AudioFlinger::onFirstRef()
return;
}
- // Determine the level of master volume support the primary audio HAL has,
- // and set the initial master volume at the same time.
+ // Determine the level of master volume/master mute support the primary
+ // audio HAL has, and set the initial master volume/mute state at the same
+ // time.
float initialVolume = 1.0;
+ bool initialMute = false;
mMasterVolumeSupportLvl = MVS_NONE;
+ mMasterMuteSupportLvl = MMS_NONE;
if (0 == mPrimaryHardwareDev->init_check(mPrimaryHardwareDev)) {
AutoMutex lock(mHardwareLock);
audio_hw_device_t *dev = mPrimaryHardwareDev;
@@ -267,11 +276,26 @@ void AudioFlinger::onFirstRef()
(NO_ERROR != dev->set_master_volume(dev, initialVolume))) {
mMasterVolumeSupportLvl = MVS_NONE;
}
+
+ mHardwareStatus = AUDIO_HW_GET_MASTER_MUTE;
+ if ((NULL != dev->get_master_mute) &&
+ (NO_ERROR == dev->get_master_mute(dev, &initialMute))) {
+ mMasterMuteSupportLvl = MMS_FULL;
+ } else {
+ mMasterMuteSupportLvl = MMS_SETONLY;
+ initialMute = 0;
+ }
+
+ mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;
+ if ((NULL == dev->set_master_mute) ||
+ (NO_ERROR != dev->set_master_mute(dev, initialMute))) {
+ mMasterMuteSupportLvl = MMS_NONE;
+ }
mHardwareStatus = AUDIO_HW_INIT;
}
- // Set the mode for each audio HAL, and try to set the initial volume (if
- // supported) for all of the non-primary audio HALs.
+ // Set the mode for each audio HAL, and try to set the initial volume and
+ // initial mute state (if supported) for all of the non-primary audio HALs.
for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
audio_hw_device_t *dev = mAudioHwDevs[i];
@@ -284,20 +308,26 @@ void AudioFlinger::onFirstRef()
mHardwareStatus = AUDIO_HW_SET_MODE;
dev->set_mode(dev, mMode);
- if ((dev != mPrimaryHardwareDev) &&
- (NULL != dev->set_master_volume)) {
- mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
- dev->set_master_volume(dev, initialVolume);
+ if (dev != mPrimaryHardwareDev) {
+ if (NULL != dev->set_master_volume) {
+ mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
+ dev->set_master_volume(dev, initialVolume);
+ }
+
+ if (NULL != dev->set_master_mute) {
+ mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;
+ dev->set_master_mute(dev, initialMute);
+ }
}
mHardwareStatus = AUDIO_HW_INIT;
}
}
- mMasterVolumeSW = (MVS_NONE == mMasterVolumeSupportLvl)
- ? initialVolume
- : 1.0;
+ mMasterVolumeSW = initialVolume;
mMasterVolume = initialVolume;
+ mMasterMuteSW = initialMute;
+ mMasterMute = initialMute;
mHardwareStatus = AUDIO_HW_IDLE;
}
@@ -724,15 +754,39 @@ bool AudioFlinger::getMicMute() const
status_t AudioFlinger::setMasterMute(bool muted)
{
+ status_t ret = initCheck();
+ if (ret != NO_ERROR) {
+ return ret;
+ }
+
// check calling permissions
if (!settingsAllowed()) {
return PERMISSION_DENIED;
}
+ bool swmm = muted;
+
+ // when hw supports master mute, don't mute in sw mixer
+ if (MMS_NONE != mMasterMuteSupportLvl) {
+ for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
+ AutoMutex lock(mHardwareLock);
+ audio_hw_device_t *dev = mAudioHwDevs[i];
+
+ mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;
+ if (NULL != dev->set_master_mute) {
+ dev->set_master_mute(dev, muted);
+ }
+ mHardwareStatus = AUDIO_HW_IDLE;
+ }
+
+ swmm = false;
+ }
+
Mutex::Autolock _l(mLock);
- mMasterMute = muted;
+ mMasterMute = muted;
+ mMasterMuteSW = swmm;
for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)
- mPlaybackThreads.valueAt(i)->setMasterMute(muted);
+ mPlaybackThreads.valueAt(i)->setMasterMute(swmm);
return NO_ERROR;
}
@@ -762,9 +816,27 @@ float AudioFlinger::masterVolumeSW() const
bool AudioFlinger::masterMute() const
{
+ if (MMS_FULL == mMasterMuteSupportLvl) {
+ bool ret_val;
+ AutoMutex lock(mHardwareLock);
+
+ mHardwareStatus = AUDIO_HW_GET_MASTER_MUTE;
+ assert(NULL != mPrimaryHardwareDev);
+ assert(NULL != mPrimaryHardwareDev->get_master_mute);
+
+ mPrimaryHardwareDev->get_master_mute(mPrimaryHardwareDev, &ret_val);
+ mHardwareStatus = AUDIO_HW_IDLE;
+ return ret_val;
+ }
+
return mMasterMute;
}
+bool AudioFlinger::masterMuteSW() const
+{
+ return mMasterMuteSW;
+}
+
status_t AudioFlinger::setStreamVolume(int stream, float value, int output)
{
// check calling permissions
@@ -1493,7 +1565,7 @@ AudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinge
mMasterVolume = mAudioFlinger->masterVolumeSW();
- mMasterMute = mAudioFlinger->masterMute();
+ mMasterMute = mAudioFlinger->masterMuteSW();
for (int stream = 0; stream < AUDIO_STREAM_CNT; stream++) {
mStreamTypes[stream].volume = mAudioFlinger->streamVolumeInternal(stream);
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 289c506..ea9d594 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -102,6 +102,7 @@ public:
virtual float masterVolume() const;
virtual float masterVolumeSW() const;
virtual bool masterMute() const;
+ virtual bool masterMuteSW() const;
virtual status_t setStreamVolume(int stream, float value, int output);
virtual status_t setStreamMute(int stream, bool muted);
@@ -193,6 +194,8 @@ public:
AUDIO_SET_VOICE_VOLUME,
AUDIO_SET_PARAMETER,
AUDIO_HW_GET_MASTER_VOLUME,
+ AUDIO_HW_SET_MASTER_MUTE,
+ AUDIO_HW_GET_MASTER_MUTE,
};
// record interface
@@ -1506,6 +1509,12 @@ private:
MVS_FULL,
};
+ enum master_mute_support {
+ MMS_NONE,
+ MMS_SETONLY,
+ MMS_FULL,
+ };
+
mutable Mutex mLock;
DefaultKeyedVector< pid_t, wp<Client> > mClients;
@@ -1521,7 +1530,10 @@ private:
float mMasterVolume;
float mMasterVolumeSW;
master_volume_support mMasterVolumeSupportLvl;
+
bool mMasterMute;
+ bool mMasterMuteSW;
+ master_mute_support mMasterMuteSupportLvl;
DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads;