Loading services/audiopolicy/common/managerdefinitions/include/AudioGain.h +25 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <utils/RefBase.h> #include <utils/String8.h> #include <system/audio.h> #include <vector> namespace android { Loading Loading @@ -59,12 +60,36 @@ public: void getDefaultConfig(struct audio_gain_config *config); status_t checkConfig(const struct audio_gain_config *config); void setUseForVolume(bool canUseForVolume) { mUseForVolume = canUseForVolume; } bool canUseForVolume() const { return mUseForVolume; } const struct audio_gain &getGain() const { return mGain; } private: int mIndex; struct audio_gain mGain; bool mUseInChannelMask; bool mUseForVolume = false; }; class AudioGains : public std::vector<sp<AudioGain> > { public: bool canUseForVolume() const { for (const auto &gain: *this) { if (gain->canUseForVolume()) { return true; } } return false; } int32_t add(const sp<AudioGain> gain) { push_back(gain); return 0; } }; } // namespace android services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h +6 −6 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ public: ActivityTracking::dump(dst, spaces); dst->appendFormat(", Volume: %.03f, MuteCount: %02d\n", mCurVolumeDb, mMuteCount); } void setVolume(float volume) { mCurVolumeDb = volume; } void setVolume(float volumeDb) { mCurVolumeDb = volumeDb; } float getVolume() const { return mCurVolumeDb; } private: Loading Loading @@ -156,7 +156,7 @@ public: virtual bool isDuplicated() const { return false; } virtual uint32_t latency() { return 0; } virtual bool isFixedVolume(audio_devices_t device); virtual bool setVolume(float volume, virtual bool setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, Loading Loading @@ -219,10 +219,10 @@ public: { return mVolumeActivities[vs].decMuteCount(); } void setCurVolume(VolumeSource vs, float volume) void setCurVolume(VolumeSource vs, float volumeDb) { // Even if not activity for this group registered, need to create anyway mVolumeActivities[vs].setVolume(volume); mVolumeActivities[vs].setVolume(volumeDb); } float getCurVolume(VolumeSource vs) const { Loading Loading @@ -327,7 +327,7 @@ public: setClientActive(client, false); } } virtual bool setVolume(float volume, virtual bool setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, Loading Loading @@ -401,7 +401,7 @@ public: void dump(String8 *dst) const override; virtual bool setVolume(float volume, virtual bool setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, Loading services/audiopolicy/common/managerdefinitions/include/AudioPort.h +6 −5 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include "AudioCollections.h" #include "AudioProfile.h" #include "AudioGain.h" #include "HandleGenerator.h" #include <utils/String8.h> #include <utils/Vector.h> Loading @@ -29,9 +30,7 @@ namespace android { class HwModule; class AudioGain; class AudioRoute; typedef Vector<sp<AudioGain> > AudioGainCollection; class AudioPort : public virtual RefBase, private HandleGenerator<audio_port_handle_t> { Loading @@ -49,8 +48,8 @@ public: virtual const String8 getTagName() const = 0; void setGains(const AudioGainCollection &gains) { mGains = gains; } const AudioGainCollection &getGains() const { return mGains; } void setGains(const AudioGains &gains) { mGains = gains; } const AudioGains &getGains() const { return mGains; } virtual void setFlags(uint32_t flags) { Loading Loading @@ -138,7 +137,7 @@ public: void log(const char* indent) const; AudioGainCollection mGains; // gain controllers AudioGains mGains; // gain controllers private: void pickChannelMask(audio_channel_mask_t &channelMask, const ChannelsVector &channelMasks) const; Loading @@ -165,6 +164,8 @@ public: return (other != 0) && (other->getAudioPort() != 0) && (getAudioPort() != 0) && (other->getAudioPort()->getModuleHandle() == getAudioPort()->getModuleHandle()); } bool hasGainController(bool canUseForVolume = false) const; unsigned int mSamplingRate = 0u; audio_format_t mFormat = AUDIO_FORMAT_INVALID; audio_channel_mask_t mChannelMask = AUDIO_CHANNEL_NONE; Loading services/audiopolicy/common/managerdefinitions/src/AudioOutputDescriptor.cpp +32 −8 Original line number Diff line number Diff line Loading @@ -149,7 +149,7 @@ bool AudioOutputDescriptor::isFixedVolume(audio_devices_t device __unused) return false; } bool AudioOutputDescriptor::setVolume(float volume, bool AudioOutputDescriptor::setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device __unused, uint32_t delayMs, Loading @@ -158,9 +158,9 @@ bool AudioOutputDescriptor::setVolume(float volume, // We actually change the volume if: // - the float value returned by computeVolume() changed // - the force flag is set if (volume != getCurVolume(static_cast<VolumeSource>(stream)) || force) { ALOGV("setVolume() for stream %d, volume %f, delay %d", stream, volume, delayMs); setCurVolume(static_cast<VolumeSource>(stream), volume); if (volumeDb != getCurVolume(static_cast<VolumeSource>(stream)) || force) { ALOGV("setVolume() for stream %d, volume %f, delay %d", stream, volumeDb, delayMs); setCurVolume(static_cast<VolumeSource>(stream), volumeDb); return true; } return false; Loading Loading @@ -388,15 +388,39 @@ void SwAudioOutputDescriptor::toAudioPort( mFlags & AUDIO_OUTPUT_FLAG_FAST ? AUDIO_LATENCY_LOW : AUDIO_LATENCY_NORMAL; } bool SwAudioOutputDescriptor::setVolume(float volume, bool SwAudioOutputDescriptor::setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, bool force) { if (!AudioOutputDescriptor::setVolume(volume, stream, device, delayMs, force)) { if (!AudioOutputDescriptor::setVolume(volumeDb, stream, device, delayMs, force)) { return false; } if (!devices().isEmpty()) { // Assume first device to check upon Gain Crontroller availability const auto &devicePort = devices().itemAt(0); ALOGV("%s: device %s hasGC %d", __FUNCTION__, devicePort->toString().c_str(), devices().itemAt(0)->hasGainController(true)); if (devicePort->hasGainController(true)) { // @todo: default stream volume to max (0) when using HW Port gain? float volumeAmpl = Volume::DbToAmpl(0); mClientInterface->setStreamVolume(stream, volumeAmpl, mIoHandle, delayMs); AudioGains gains = devicePort->getGains(); int gainMinValueInMb = gains[0]->getMinValueInMb(); int gainMaxValueInMb = gains[0]->getMaxValueInMb(); int gainStepValueInMb = gains[0]->getStepValueInMb(); int gainValueMb = ((volumeDb * 100)/ gainStepValueInMb) * gainStepValueInMb; gainValueMb = std::max(gainMinValueInMb, std::min(gainValueMb, gainMaxValueInMb)); audio_port_config config = {}; devicePort->toAudioPortConfig(&config); config.config_mask = AUDIO_PORT_CONFIG_GAIN; config.gain.values[0] = gainValueMb; return mClientInterface->setAudioPortConfig(&config, 0) == NO_ERROR; } } // Force VOICE_CALL to track BLUETOOTH_SCO stream volume when bluetooth audio is enabled float volumeAmpl = Volume::DbToAmpl(getCurVolume(static_cast<VolumeSource>(stream))); if (stream == AUDIO_STREAM_BLUETOOTH_SCO) { Loading Loading @@ -591,13 +615,13 @@ void HwAudioOutputDescriptor::toAudioPort( } bool HwAudioOutputDescriptor::setVolume(float volume, bool HwAudioOutputDescriptor::setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, bool force) { bool changed = AudioOutputDescriptor::setVolume(volume, stream, device, delayMs, force); bool changed = AudioOutputDescriptor::setVolume(volumeDb, stream, device, delayMs, force); if (changed) { // TODO: use gain controller on source device if any to adjust volume Loading services/audiopolicy/common/managerdefinitions/src/AudioPort.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -479,4 +479,14 @@ void AudioPortConfig::toAudioPortConfig(struct audio_port_config *dstConfig, dstConfig, srcConfig, AUDIO_PORT_CONFIG_FLAGS, { AUDIO_INPUT_FLAG_NONE }); } bool AudioPortConfig::hasGainController(bool canUseForVolume) const { sp<AudioPort> audioport = getAudioPort(); if (audioport == nullptr) { return false; } return canUseForVolume ? audioport->getGains().canUseForVolume() : audioport->getGains().size() > 0; } } // namespace android Loading
services/audiopolicy/common/managerdefinitions/include/AudioGain.h +25 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <utils/RefBase.h> #include <utils/String8.h> #include <system/audio.h> #include <vector> namespace android { Loading Loading @@ -59,12 +60,36 @@ public: void getDefaultConfig(struct audio_gain_config *config); status_t checkConfig(const struct audio_gain_config *config); void setUseForVolume(bool canUseForVolume) { mUseForVolume = canUseForVolume; } bool canUseForVolume() const { return mUseForVolume; } const struct audio_gain &getGain() const { return mGain; } private: int mIndex; struct audio_gain mGain; bool mUseInChannelMask; bool mUseForVolume = false; }; class AudioGains : public std::vector<sp<AudioGain> > { public: bool canUseForVolume() const { for (const auto &gain: *this) { if (gain->canUseForVolume()) { return true; } } return false; } int32_t add(const sp<AudioGain> gain) { push_back(gain); return 0; } }; } // namespace android
services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h +6 −6 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ public: ActivityTracking::dump(dst, spaces); dst->appendFormat(", Volume: %.03f, MuteCount: %02d\n", mCurVolumeDb, mMuteCount); } void setVolume(float volume) { mCurVolumeDb = volume; } void setVolume(float volumeDb) { mCurVolumeDb = volumeDb; } float getVolume() const { return mCurVolumeDb; } private: Loading Loading @@ -156,7 +156,7 @@ public: virtual bool isDuplicated() const { return false; } virtual uint32_t latency() { return 0; } virtual bool isFixedVolume(audio_devices_t device); virtual bool setVolume(float volume, virtual bool setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, Loading Loading @@ -219,10 +219,10 @@ public: { return mVolumeActivities[vs].decMuteCount(); } void setCurVolume(VolumeSource vs, float volume) void setCurVolume(VolumeSource vs, float volumeDb) { // Even if not activity for this group registered, need to create anyway mVolumeActivities[vs].setVolume(volume); mVolumeActivities[vs].setVolume(volumeDb); } float getCurVolume(VolumeSource vs) const { Loading Loading @@ -327,7 +327,7 @@ public: setClientActive(client, false); } } virtual bool setVolume(float volume, virtual bool setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, Loading Loading @@ -401,7 +401,7 @@ public: void dump(String8 *dst) const override; virtual bool setVolume(float volume, virtual bool setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, Loading
services/audiopolicy/common/managerdefinitions/include/AudioPort.h +6 −5 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include "AudioCollections.h" #include "AudioProfile.h" #include "AudioGain.h" #include "HandleGenerator.h" #include <utils/String8.h> #include <utils/Vector.h> Loading @@ -29,9 +30,7 @@ namespace android { class HwModule; class AudioGain; class AudioRoute; typedef Vector<sp<AudioGain> > AudioGainCollection; class AudioPort : public virtual RefBase, private HandleGenerator<audio_port_handle_t> { Loading @@ -49,8 +48,8 @@ public: virtual const String8 getTagName() const = 0; void setGains(const AudioGainCollection &gains) { mGains = gains; } const AudioGainCollection &getGains() const { return mGains; } void setGains(const AudioGains &gains) { mGains = gains; } const AudioGains &getGains() const { return mGains; } virtual void setFlags(uint32_t flags) { Loading Loading @@ -138,7 +137,7 @@ public: void log(const char* indent) const; AudioGainCollection mGains; // gain controllers AudioGains mGains; // gain controllers private: void pickChannelMask(audio_channel_mask_t &channelMask, const ChannelsVector &channelMasks) const; Loading @@ -165,6 +164,8 @@ public: return (other != 0) && (other->getAudioPort() != 0) && (getAudioPort() != 0) && (other->getAudioPort()->getModuleHandle() == getAudioPort()->getModuleHandle()); } bool hasGainController(bool canUseForVolume = false) const; unsigned int mSamplingRate = 0u; audio_format_t mFormat = AUDIO_FORMAT_INVALID; audio_channel_mask_t mChannelMask = AUDIO_CHANNEL_NONE; Loading
services/audiopolicy/common/managerdefinitions/src/AudioOutputDescriptor.cpp +32 −8 Original line number Diff line number Diff line Loading @@ -149,7 +149,7 @@ bool AudioOutputDescriptor::isFixedVolume(audio_devices_t device __unused) return false; } bool AudioOutputDescriptor::setVolume(float volume, bool AudioOutputDescriptor::setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device __unused, uint32_t delayMs, Loading @@ -158,9 +158,9 @@ bool AudioOutputDescriptor::setVolume(float volume, // We actually change the volume if: // - the float value returned by computeVolume() changed // - the force flag is set if (volume != getCurVolume(static_cast<VolumeSource>(stream)) || force) { ALOGV("setVolume() for stream %d, volume %f, delay %d", stream, volume, delayMs); setCurVolume(static_cast<VolumeSource>(stream), volume); if (volumeDb != getCurVolume(static_cast<VolumeSource>(stream)) || force) { ALOGV("setVolume() for stream %d, volume %f, delay %d", stream, volumeDb, delayMs); setCurVolume(static_cast<VolumeSource>(stream), volumeDb); return true; } return false; Loading Loading @@ -388,15 +388,39 @@ void SwAudioOutputDescriptor::toAudioPort( mFlags & AUDIO_OUTPUT_FLAG_FAST ? AUDIO_LATENCY_LOW : AUDIO_LATENCY_NORMAL; } bool SwAudioOutputDescriptor::setVolume(float volume, bool SwAudioOutputDescriptor::setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, bool force) { if (!AudioOutputDescriptor::setVolume(volume, stream, device, delayMs, force)) { if (!AudioOutputDescriptor::setVolume(volumeDb, stream, device, delayMs, force)) { return false; } if (!devices().isEmpty()) { // Assume first device to check upon Gain Crontroller availability const auto &devicePort = devices().itemAt(0); ALOGV("%s: device %s hasGC %d", __FUNCTION__, devicePort->toString().c_str(), devices().itemAt(0)->hasGainController(true)); if (devicePort->hasGainController(true)) { // @todo: default stream volume to max (0) when using HW Port gain? float volumeAmpl = Volume::DbToAmpl(0); mClientInterface->setStreamVolume(stream, volumeAmpl, mIoHandle, delayMs); AudioGains gains = devicePort->getGains(); int gainMinValueInMb = gains[0]->getMinValueInMb(); int gainMaxValueInMb = gains[0]->getMaxValueInMb(); int gainStepValueInMb = gains[0]->getStepValueInMb(); int gainValueMb = ((volumeDb * 100)/ gainStepValueInMb) * gainStepValueInMb; gainValueMb = std::max(gainMinValueInMb, std::min(gainValueMb, gainMaxValueInMb)); audio_port_config config = {}; devicePort->toAudioPortConfig(&config); config.config_mask = AUDIO_PORT_CONFIG_GAIN; config.gain.values[0] = gainValueMb; return mClientInterface->setAudioPortConfig(&config, 0) == NO_ERROR; } } // Force VOICE_CALL to track BLUETOOTH_SCO stream volume when bluetooth audio is enabled float volumeAmpl = Volume::DbToAmpl(getCurVolume(static_cast<VolumeSource>(stream))); if (stream == AUDIO_STREAM_BLUETOOTH_SCO) { Loading Loading @@ -591,13 +615,13 @@ void HwAudioOutputDescriptor::toAudioPort( } bool HwAudioOutputDescriptor::setVolume(float volume, bool HwAudioOutputDescriptor::setVolume(float volumeDb, audio_stream_type_t stream, audio_devices_t device, uint32_t delayMs, bool force) { bool changed = AudioOutputDescriptor::setVolume(volume, stream, device, delayMs, force); bool changed = AudioOutputDescriptor::setVolume(volumeDb, stream, device, delayMs, force); if (changed) { // TODO: use gain controller on source device if any to adjust volume Loading
services/audiopolicy/common/managerdefinitions/src/AudioPort.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -479,4 +479,14 @@ void AudioPortConfig::toAudioPortConfig(struct audio_port_config *dstConfig, dstConfig, srcConfig, AUDIO_PORT_CONFIG_FLAGS, { AUDIO_INPUT_FLAG_NONE }); } bool AudioPortConfig::hasGainController(bool canUseForVolume) const { sp<AudioPort> audioport = getAudioPort(); if (audioport == nullptr) { return false; } return canUseForVolume ? audioport->getGains().canUseForVolume() : audioport->getGains().size() > 0; } } // namespace android