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

Commit 98e38191 authored by Eric Laurent's avatar Eric Laurent
Browse files

audioflinger: remove obsolete stream volume management

Remove the ability to change stream volume globally (on all outputs)
in audio flinger as this doesn't make sense when stream volume is
managed per device.

Also, do not store stream volumes globally in audio flinger and apply
them when a new output is opened. The ground truth for stream volume is
in audio policy so make sure stream volumes are systematically applied
by audio policy when an output is opened according to the selected device.

Bug: 70332110
Test: audio smoke tests
Change-Id: I7180a428af53aafdee82aadbcaf284c028ac5554
parent 7c9dbd54
Loading
Loading
Loading
Loading
+14 −27
Original line number Diff line number Diff line
@@ -1099,26 +1099,17 @@ status_t AudioFlinger::setStreamVolume(audio_stream_type_t stream, float value,
    if (status != NO_ERROR) {
        return status;
    }
    if (output == AUDIO_IO_HANDLE_NONE) {
        return BAD_VALUE;
    }
    ALOG_ASSERT(stream != AUDIO_STREAM_PATCH, "attempt to change AUDIO_STREAM_PATCH volume");

    AutoMutex lock(mLock);
    Vector<VolumeInterface *> volumeInterfaces;
    if (output != AUDIO_IO_HANDLE_NONE) {
    VolumeInterface *volumeInterface = getVolumeInterface_l(output);
    if (volumeInterface == NULL) {
        return BAD_VALUE;
    }
        volumeInterfaces.add(volumeInterface);
    }

    mStreamTypes[stream].volume = value;

    if (volumeInterfaces.size() == 0) {
        volumeInterfaces = getAllVolumeInterfaces_l();
    }
    for (size_t i = 0; i < volumeInterfaces.size(); i++) {
        volumeInterfaces[i]->setStreamVolume(stream, value);
    }
    volumeInterface->setStreamVolume(stream, value);

    return NO_ERROR;
}
@@ -1157,21 +1148,17 @@ float AudioFlinger::streamVolume(audio_stream_type_t stream, audio_io_handle_t o
    if (status != NO_ERROR) {
        return 0.0f;
    }
    if (output == AUDIO_IO_HANDLE_NONE) {
        return 0.0f;
    }

    AutoMutex lock(mLock);
    float volume;
    if (output != AUDIO_IO_HANDLE_NONE) {
    VolumeInterface *volumeInterface = getVolumeInterface_l(output);
        if (volumeInterface != NULL) {
            volume = volumeInterface->streamVolume(stream);
        } else {
            volume = 0.0f;
        }
    } else {
        volume = streamVolume_l(stream);
    if (volumeInterface == NULL) {
        return 0.0f;
    }

    return volume;
    return volumeInterface->streamVolume(stream);
}

bool AudioFlinger::streamMute(audio_stream_type_t stream) const
+0 −3
Original line number Diff line number Diff line
@@ -616,9 +616,6 @@ using effect_buffer_t = int16_t;
              // no range check, AudioFlinger::mLock held
              bool streamMute_l(audio_stream_type_t stream) const
                                { return mStreamTypes[stream].mute; }
              // no range check, doesn't check per-thread stream volume, AudioFlinger::mLock held
              float streamVolume_l(audio_stream_type_t stream) const
                                { return mStreamTypes[stream].volume; }
              void ioConfigChanged(audio_io_config_event event,
                                   const sp<AudioIoDescriptor>& ioDesc,
                                   pid_t pid = 0);
+5 −2
Original line number Diff line number Diff line
@@ -1702,11 +1702,14 @@ AudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinge
    readOutputParameters_l();

    // ++ operator does not compile
    for (audio_stream_type_t stream = AUDIO_STREAM_MIN; stream < AUDIO_STREAM_CNT;
    for (audio_stream_type_t stream = AUDIO_STREAM_MIN; stream < AUDIO_STREAM_FOR_POLICY_CNT;
            stream = (audio_stream_type_t) (stream + 1)) {
        mStreamTypes[stream].volume = mAudioFlinger->streamVolume_l(stream);
        mStreamTypes[stream].volume = 0.0f;
        mStreamTypes[stream].mute = mAudioFlinger->streamMute_l(stream);
    }
    // Audio patch volume is always max
    mStreamTypes[AUDIO_STREAM_PATCH].volume = 1.0f;
    mStreamTypes[AUDIO_STREAM_PATCH].mute = false;
}

AudioFlinger::PlaybackThread::~PlaybackThread()
+5 −6
Original line number Diff line number Diff line
@@ -3791,9 +3791,11 @@ status_t AudioPolicyManager::initCheck()

// ---

void AudioPolicyManager::addOutput(audio_io_handle_t output, const sp<SwAudioOutputDescriptor>& outputDesc)
void AudioPolicyManager::addOutput(audio_io_handle_t output,
                                   const sp<SwAudioOutputDescriptor>& outputDesc)
{
    mOutputs.add(output, outputDesc);
    applyStreamVolumes(outputDesc, AUDIO_DEVICE_NONE, 0 /* delayMs */, true /* force */);
    updateMono(output); // update mono status when adding to output list
    selectOutputForMusicEffects();
    nextAudioPortGeneration();
@@ -3805,7 +3807,8 @@ void AudioPolicyManager::removeOutput(audio_io_handle_t output)
    selectOutputForMusicEffects();
}

void AudioPolicyManager::addInput(audio_io_handle_t input, const sp<AudioInputDescriptor>& inputDesc)
void AudioPolicyManager::addInput(audio_io_handle_t input,
                                  const sp<AudioInputDescriptor>& inputDesc)
{
    mInputs.add(input, inputDesc);
    nextAudioPortGeneration();
@@ -3955,9 +3958,6 @@ status_t AudioPolicyManager::checkOutputsForDevice(const sp<DeviceDescriptor>& d
                        // outputs used by dynamic policy mixes
                        audio_io_handle_t duplicatedOutput = AUDIO_IO_HANDLE_NONE;

                        // set initial stream volume for device
                        applyStreamVolumes(desc, device, 0, true);

                        //TODO: configure audio effect output stage here

                        // open a duplicating output thread for the new output and the primary output
@@ -3968,7 +3968,6 @@ status_t AudioPolicyManager::checkOutputsForDevice(const sp<DeviceDescriptor>& d
                        if (status == NO_ERROR) {
                            // add duplicated output descriptor
                            addOutput(duplicatedOutput, dupOutputDesc);
                            applyStreamVolumes(dupOutputDesc, device, 0, true);
                        } else {
                            ALOGW("checkOutputsForDevice() could not open dup output for %d and %d",
                                    mPrimaryOutput->mIoHandle, output);