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

Commit bcbcb1bd authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

audiopolicy: Add more tests, fix issues found

Added tests that ensure correct initialization of APM.

Fixed issues:

  -- UB in VolumeCurvesForStream::volIndexToDb due to not
     checking that the pointer is non-null;

  -- AudioInputDescriptor::open and SwAudioOutputDescriptor::open
     were not checking that the returned IO handle is valid,
     this was causing an infinite loop in
     AudioPolicyManager::selectOutputForMusicEffects, added an
     assertion.

  -- Memory leak of VolumeCurves collection in APM.

Test: audiopolicy_tests
Change-Id: Ia4ecca1dd03b74d7f93720f042da05d5a0c74a6b
parent 82326733
Loading
Loading
Loading
Loading
+2 −3
Original line number Original line Diff line number Diff line
@@ -25,6 +25,8 @@ namespace android {
class IVolumeCurvesCollection
class IVolumeCurvesCollection
{
{
public:
public:
    virtual ~IVolumeCurvesCollection() = default;

    virtual void clearCurrentVolumeIndex(audio_stream_type_t stream) = 0;
    virtual void clearCurrentVolumeIndex(audio_stream_type_t stream) = 0;
    virtual void addCurrentVolumeIndex(audio_stream_type_t stream, audio_devices_t device,
    virtual void addCurrentVolumeIndex(audio_stream_type_t stream, audio_devices_t device,
                                       int index) = 0;
                                       int index) = 0;
@@ -46,9 +48,6 @@ public:
                                         audio_devices_t device) const = 0;
                                         audio_devices_t device) const = 0;


    virtual status_t dump(int fd) const = 0;
    virtual status_t dump(int fd) const = 0;

protected:
    virtual ~IVolumeCurvesCollection() {}
};
};


} // namespace android
} // namespace android
+7 −1
Original line number Original line Diff line number Diff line
@@ -135,7 +135,13 @@ public:


    float volIndexToDb(device_category deviceCat, int indexInUi) const
    float volIndexToDb(device_category deviceCat, int indexInUi) const
    {
    {
        return getCurvesFor(deviceCat)->volIndexToDb(indexInUi, mIndexMin, mIndexMax);
        sp<VolumeCurve> vc = getCurvesFor(deviceCat);
        if (vc != 0) {
            return vc->volIndexToDb(indexInUi, mIndexMin, mIndexMax);
        } else {
            ALOGE("Invalid device category %d for Volume Curve", deviceCat);
            return 0.0f;
        }
    }
    }


    void dump(int fd, int spaces, bool curvePoints = false) const;
    void dump(int fd, int spaces, bool curvePoints = false) const;
+3 −0
Original line number Original line Diff line number Diff line
@@ -223,6 +223,9 @@ status_t AudioInputDescriptor::open(const audio_config_t *config,
                        __FUNCTION__, mDevice, device);
                        __FUNCTION__, mDevice, device);


    if (status == NO_ERROR) {
    if (status == NO_ERROR) {
        LOG_ALWAYS_FATAL_IF(*input == AUDIO_IO_HANDLE_NONE,
                            "%s openInput returned input handle %d for device %08x",
                            __FUNCTION__, *input, device);
        mSamplingRate = lConfig.sample_rate;
        mSamplingRate = lConfig.sample_rate;
        mChannelMask = lConfig.channel_mask;
        mChannelMask = lConfig.channel_mask;
        mFormat = lConfig.format;
        mFormat = lConfig.format;
+3 −0
Original line number Original line Diff line number Diff line
@@ -431,6 +431,9 @@ status_t SwAudioOutputDescriptor::open(const audio_config_t *config,
                        __FUNCTION__, mDevice, device);
                        __FUNCTION__, mDevice, device);


    if (status == NO_ERROR) {
    if (status == NO_ERROR) {
        LOG_ALWAYS_FATAL_IF(*output == AUDIO_IO_HANDLE_NONE,
                            "%s openOutput returned output handle %d for device %08x",
                            __FUNCTION__, *output, device);
        mSamplingRate = lConfig.sample_rate;
        mSamplingRate = lConfig.sample_rate;
        mChannelMask = lConfig.channel_mask;
        mChannelMask = lConfig.channel_mask;
        mFormat = lConfig.format;
        mFormat = lConfig.format;
+1 −1
Original line number Original line Diff line number Diff line
@@ -3484,7 +3484,7 @@ AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterfa
#ifdef USE_XML_AUDIO_POLICY_CONF
#ifdef USE_XML_AUDIO_POLICY_CONF
    mVolumeCurves(new VolumeCurvesCollection()),
    mVolumeCurves(new VolumeCurvesCollection()),
    mConfig(mHwModulesAll, mAvailableOutputDevices, mAvailableInputDevices,
    mConfig(mHwModulesAll, mAvailableOutputDevices, mAvailableInputDevices,
            mDefaultOutputDevice, static_cast<VolumeCurvesCollection*>(mVolumeCurves)),
            mDefaultOutputDevice, static_cast<VolumeCurvesCollection*>(mVolumeCurves.get())),
#else
#else
    mVolumeCurves(new StreamDescriptorCollection()),
    mVolumeCurves(new StreamDescriptorCollection()),
    mConfig(mHwModulesAll, mAvailableOutputDevices, mAvailableInputDevices,
    mConfig(mHwModulesAll, mAvailableOutputDevices, mAvailableInputDevices,
Loading