Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5729be16 authored by Eric Laurent's avatar Eric Laurent Committed by Android (Google) Code Review
Browse files

Merge "audiopolicy: add a tag to control device port gain from policy volume API"

parents 56dc8fd0 43c73440
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <utils/RefBase.h>
#include <utils/String8.h>
#include <system/audio.h>
#include <vector>

namespace android {

@@ -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
+6 −6
Original line number Diff line number Diff line
@@ -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:
@@ -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,
@@ -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
    {
@@ -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,
@@ -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,
+6 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include "AudioCollections.h"
#include "AudioProfile.h"
#include "AudioGain.h"
#include "HandleGenerator.h"
#include <utils/String8.h>
#include <utils/Vector.h>
@@ -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>
{
@@ -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)
    {
@@ -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;
@@ -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;
+32 −8
Original line number Diff line number Diff line
@@ -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,
@@ -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;
@@ -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) {
@@ -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
+10 −0
Original line number Diff line number Diff line
@@ -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