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

Commit 4ad3d03f authored by jiabin's avatar jiabin
Browse files

Make AudioGain parcelable.

Make AudioGain parcelable so that it can be easier to use in binder
call.

Bug: 135621476
Test: make
Change-Id: I4159e92a27c6d99570ac2e2175c3d46fa7975059
Merged-In: I4159e92a27c6d99570ac2e2175c3d46fa7975059
parent cc825811
Loading
Loading
Loading
Loading
+60 −0
Original line number Diff line number Diff line
@@ -111,4 +111,64 @@ void AudioGain::dump(std::string *dst, int spaces, int index) const
    dst->append(base::StringPrintf("%*s- max_ramp_ms: %d ms\n", spaces, "", mGain.max_ramp_ms));
}

status_t AudioGain::writeToParcel(android::Parcel *parcel) const
{
    status_t status = NO_ERROR;
    if ((status = parcel->writeInt32(mIndex)) != NO_ERROR) return status;
    if ((status = parcel->writeBool(mUseInChannelMask)) != NO_ERROR) return status;
    if ((status = parcel->writeBool(mUseForVolume)) != NO_ERROR) return status;
    if ((status = parcel->writeUint32(mGain.mode)) != NO_ERROR) return status;
    if ((status = parcel->writeUint32(mGain.channel_mask)) != NO_ERROR) return status;
    if ((status = parcel->writeInt32(mGain.min_value)) != NO_ERROR) return status;
    if ((status = parcel->writeInt32(mGain.max_value)) != NO_ERROR) return status;
    if ((status = parcel->writeInt32(mGain.default_value)) != NO_ERROR) return status;
    if ((status = parcel->writeUint32(mGain.step_value)) != NO_ERROR) return status;
    if ((status = parcel->writeUint32(mGain.min_ramp_ms)) != NO_ERROR) return status;
    status = parcel->writeUint32(mGain.max_ramp_ms);
    return status;
}

status_t AudioGain::readFromParcel(const android::Parcel *parcel)
{
    status_t status = NO_ERROR;
    if ((status = parcel->readInt32(&mIndex)) != NO_ERROR) return status;
    if ((status = parcel->readBool(&mUseInChannelMask)) != NO_ERROR) return status;
    if ((status = parcel->readBool(&mUseForVolume)) != NO_ERROR) return status;
    if ((status = parcel->readUint32(&mGain.mode)) != NO_ERROR) return status;
    if ((status = parcel->readUint32(&mGain.channel_mask)) != NO_ERROR) return status;
    if ((status = parcel->readInt32(&mGain.min_value)) != NO_ERROR) return status;
    if ((status = parcel->readInt32(&mGain.max_value)) != NO_ERROR) return status;
    if ((status = parcel->readInt32(&mGain.default_value)) != NO_ERROR) return status;
    if ((status = parcel->readUint32(&mGain.step_value)) != NO_ERROR) return status;
    if ((status = parcel->readUint32(&mGain.min_ramp_ms)) != NO_ERROR) return status;
    status = parcel->readUint32(&mGain.max_ramp_ms);
    return status;
}

status_t AudioGains::writeToParcel(android::Parcel *parcel) const {
    status_t status = NO_ERROR;
    if ((status = parcel->writeUint64(this->size())) != NO_ERROR) return status;
    for (const auto &audioGain : *this) {
        if ((status = parcel->writeParcelable(*audioGain)) != NO_ERROR) {
            break;
        }
    }
    return status;
}

status_t AudioGains::readFromParcel(const android::Parcel *parcel) {
    status_t status = NO_ERROR;
    uint64_t count;
    if ((status = parcel->readUint64(&count)) != NO_ERROR) return status;
    for (uint64_t i = 0; i < count; i++) {
        sp<AudioGain> audioGain = new AudioGain(0, false);
        if ((status = parcel->readParcelable(audioGain.get())) != NO_ERROR) {
            this->clear();
            break;
        }
        this->push_back(audioGain);
    }
    return status;
}

} // namespace android
+10 −2
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

#pragma once

#include <binder/Parcel.h>
#include <binder/Parcelable.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
#include <system/audio.h>
@@ -24,7 +26,7 @@

namespace android {

class AudioGain: public RefBase
class AudioGain: public RefBase, public Parcelable
{
public:
    AudioGain(int index, bool useInChannelMask);
@@ -65,6 +67,9 @@ public:

    const struct audio_gain &getGain() const { return mGain; }

    status_t writeToParcel(Parcel* parcel) const override;
    status_t readFromParcel(const Parcel* parcel) override;

private:
    int               mIndex;
    struct audio_gain mGain;
@@ -72,7 +77,7 @@ private:
    bool              mUseForVolume = false;
};

class AudioGains : public std::vector<sp<AudioGain> >
class AudioGains : public std::vector<sp<AudioGain> >, public Parcelable
{
public:
    bool canUseForVolume() const
@@ -90,6 +95,9 @@ public:
        push_back(gain);
        return 0;
    }

    status_t writeToParcel(Parcel* parcel) const override;
    status_t readFromParcel(const Parcel* parcel) override;
};

} // namespace android