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

Commit c44b3464 authored by jiabin's avatar jiabin Committed by Jiabin Huang
Browse files

Invalidate tracks by a list of port id.

Adding an interface to just invalidate tracks with the given list of
port id. By invalidating the tracks via given port id, it can help
prevent mmap tracks from being invalidated when a mixer policy is
registered.

Bug: 139763500
Test: manually
Test: atest audiopolicy_tests
Test: audioflinger_fuzzer
Change-Id: Ifaadb981314088e3b2ac3223accece1576a2a575
parent f5a3c7c4
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -493,12 +493,6 @@ status_t AudioFlingerClientAdapter::closeInput(audio_io_handle_t input) {
    return statusTFromBinderStatus(mDelegate->closeInput(inputAidl));
}

status_t AudioFlingerClientAdapter::invalidateStream(audio_stream_type_t stream) {
    AudioStreamType streamAidl = VALUE_OR_RETURN_STATUS(
            legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
    return statusTFromBinderStatus(mDelegate->invalidateStream(streamAidl));
}

status_t AudioFlingerClientAdapter::setVoiceVolume(float volume) {
    return statusTFromBinderStatus(mDelegate->setVoiceVolume(volume));
}
@@ -858,6 +852,14 @@ status_t AudioFlingerClientAdapter::getSoundDoseInterface(
    return statusTFromBinderStatus(mDelegate->getSoundDoseInterface(callback, soundDose));
}

status_t AudioFlingerClientAdapter::invalidateTracks(
        const std::vector<audio_port_handle_t>& portIds) {
    std::vector<int32_t> portIdsAidl = VALUE_OR_RETURN_STATUS(
            convertContainer<std::vector<int32_t>>(
                    portIds, legacy2aidl_audio_port_handle_t_int32_t));
    return statusTFromBinderStatus(mDelegate->invalidateTracks(portIdsAidl));
}

////////////////////////////////////////////////////////////////////////////////////////////////////
// AudioFlingerServerAdapter
AudioFlingerServerAdapter::AudioFlingerServerAdapter(
@@ -1090,12 +1092,6 @@ Status AudioFlingerServerAdapter::closeInput(int32_t input) {
    return Status::fromStatusT(mDelegate->closeInput(inputLegacy));
}

Status AudioFlingerServerAdapter::invalidateStream(AudioStreamType stream) {
    audio_stream_type_t streamLegacy = VALUE_OR_RETURN_BINDER(
            aidl2legacy_AudioStreamType_audio_stream_type_t(stream));
    return Status::fromStatusT(mDelegate->invalidateStream(streamLegacy));
}

Status AudioFlingerServerAdapter::setVoiceVolume(float volume) {
    return Status::fromStatusT(mDelegate->setVoiceVolume(volume));
}
@@ -1385,4 +1381,12 @@ Status AudioFlingerServerAdapter::getSoundDoseInterface(
    return Status::fromStatusT(mDelegate->getSoundDoseInterface(callback, soundDose));
}

Status AudioFlingerServerAdapter::invalidateTracks(const std::vector<int32_t>& portIds) {
    std::vector<audio_port_handle_t> portIdsLegacy = VALUE_OR_RETURN_BINDER(
            convertContainer<std::vector<audio_port_handle_t>>(
                    portIds, aidl2legacy_int32_t_audio_port_handle_t));
    RETURN_BINDER_IF_ERROR(mDelegate->invalidateTracks(portIdsLegacy));
    return Status::ok();
}

} // namespace android
+5 −2
Original line number Diff line number Diff line
@@ -134,8 +134,6 @@ interface IAudioFlingerService {
    OpenInputResponse openInput(in OpenInputRequest request);
    void closeInput(int /* audio_io_handle_t */ input);

    void invalidateStream(AudioStreamType stream);

    void setVoiceVolume(float volume);

    RenderPosition getRenderPosition(int /* audio_io_handle_t */ output);
@@ -254,6 +252,11 @@ interface IAudioFlingerService {
     */
    ISoundDose getSoundDoseInterface(in ISoundDoseCallback callback);

    /**
     * Invalidate all tracks with given port ids.
     */
    void invalidateTracks(in int[] /* audio_port_handle_t[] */ portIds);

    // When adding a new method, please review and update
    // IAudioFlinger.h AudioFlingerServerAdapter::Delegate::TransactionCode
    // AudioFlinger.cpp AudioFlinger::onTransactWrapper()
+6 −1
Original line number Diff line number Diff line
@@ -584,7 +584,12 @@ void AudioFlingerFuzzer::invokeAudioSystem() {

    float balance = mFdp.ConsumeFloatingPoint<float>();
    af->getMasterBalance(&balance);
    af->invalidateStream(static_cast<audio_stream_type_t>(mFdp.ConsumeIntegral<uint32_t>()));

    std::vector<audio_port_handle_t> tracks;
    for (int i = 0; i < mFdp.ConsumeIntegralInRange<int32_t>(0, MAX_ARRAY_LENGTH); ++i) {
        tracks.push_back(static_cast<audio_port_handle_t>(mFdp.ConsumeIntegral<int32_t>()));
    }
    af->invalidateTracks(tracks);
}

status_t AudioFlingerFuzzer::invokeAudioInputDevice() {
+1 −0
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ const product_strategy_t PRODUCT_STRATEGY_NONE = static_cast<product_strategy_t>

using AttributesVector = std::vector<audio_attributes_t>;
using StreamTypeVector = std::vector<audio_stream_type_t>;
using PortHandleVector = std::vector<audio_port_handle_t>;

using TrackSecondaryOutputsMap = std::map<audio_port_handle_t, std::vector<audio_io_handle_t>>;

+5 −5
Original line number Diff line number Diff line
@@ -268,8 +268,6 @@ public:

    virtual status_t closeInput(audio_io_handle_t input) = 0;

    virtual status_t invalidateStream(audio_stream_type_t stream) = 0;

    virtual status_t setVoiceVolume(float volume) = 0;

    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
@@ -374,6 +372,8 @@ public:

    virtual status_t getSoundDoseInterface(const sp<media::ISoundDoseCallback>& callback,
                                           sp<media::ISoundDose>* soundDose) = 0;

    virtual status_t invalidateTracks(const std::vector<audio_port_handle_t>& portIds) = 0;
};

/**
@@ -428,7 +428,6 @@ public:
    status_t openInput(const media::OpenInputRequest& request,
                       media::OpenInputResponse* response) override;
    status_t closeInput(audio_io_handle_t input) override;
    status_t invalidateStream(audio_stream_type_t stream) override;
    status_t setVoiceVolume(float volume) override;
    status_t getRenderPosition(uint32_t* halFrames, uint32_t* dspFrames,
                               audio_io_handle_t output) const override;
@@ -482,6 +481,7 @@ public:
            audio_io_handle_t output, std::vector<audio_latency_mode_t>* modes) override;
    status_t getSoundDoseInterface(const sp<media::ISoundDoseCallback>& callback,
                                   sp<media::ISoundDose>* soundDose) override;
    status_t invalidateTracks(const std::vector<audio_port_handle_t>& portIds) override;

private:
    const sp<media::IAudioFlingerService> mDelegate;
@@ -535,7 +535,6 @@ public:
            RESTORE_OUTPUT = media::BnAudioFlingerService::TRANSACTION_restoreOutput,
            OPEN_INPUT = media::BnAudioFlingerService::TRANSACTION_openInput,
            CLOSE_INPUT = media::BnAudioFlingerService::TRANSACTION_closeInput,
            INVALIDATE_STREAM = media::BnAudioFlingerService::TRANSACTION_invalidateStream,
            SET_VOICE_VOLUME = media::BnAudioFlingerService::TRANSACTION_setVoiceVolume,
            GET_RENDER_POSITION = media::BnAudioFlingerService::TRANSACTION_getRenderPosition,
            GET_INPUT_FRAMES_LOST = media::BnAudioFlingerService::TRANSACTION_getInputFramesLost,
@@ -574,6 +573,7 @@ public:
            SET_REQUESTED_LATENCY_MODE = media::BnAudioFlingerService::TRANSACTION_setRequestedLatencyMode,
            GET_SUPPORTED_LATENCY_MODES = media::BnAudioFlingerService::TRANSACTION_getSupportedLatencyModes,
            GET_SOUND_DOSE_INTERFACE = media::BnAudioFlingerService::TRANSACTION_getSoundDoseInterface,
            INVALIDATE_TRACKS = media::BnAudioFlingerService::TRANSACTION_invalidateTracks,
        };

    protected:
@@ -653,7 +653,6 @@ public:
    Status openInput(const media::OpenInputRequest& request,
                     media::OpenInputResponse* _aidl_return) override;
    Status closeInput(int32_t input) override;
    Status invalidateStream(media::audio::common::AudioStreamType stream) override;
    Status setVoiceVolume(float volume) override;
    Status getRenderPosition(int32_t output, media::RenderPosition* _aidl_return) override;
    Status getInputFramesLost(int32_t ioHandle, int32_t* _aidl_return) override;
@@ -700,6 +699,7 @@ public:
            std::vector<media::LatencyMode>* _aidl_return) override;
    Status getSoundDoseInterface(const sp<media::ISoundDoseCallback>& callback,
                                 sp<media::ISoundDose>* _aidl_return) override;
    Status invalidateTracks(const std::vector<int32_t>& portIds) override;
private:
    const sp<AudioFlingerServerAdapter::Delegate> mDelegate;
};
Loading