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

Commit 01b6a05b authored by Andy Hung's avatar Andy Hung Committed by Automerger Merge Worker
Browse files

Merge "audio: add implementation for TV related API" am: 258062ea

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/1562768

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I5afca1258e9e1979dbefbf714049e015fe36af85
parents 8d44940f 258062ea
Loading
Loading
Loading
Loading
+54 −2
Original line number Diff line number Diff line
@@ -1075,6 +1075,40 @@ uint32_t AudioTrack::getOriginalSampleRate() const
    return mOriginalSampleRate;
}

status_t AudioTrack::setDualMonoMode(audio_dual_mono_mode_t mode)
{
    AutoMutex lock(mLock);
    return setDualMonoMode_l(mode);
}

status_t AudioTrack::setDualMonoMode_l(audio_dual_mono_mode_t mode)
{
    return mAudioTrack->setDualMonoMode(mode);
}

status_t AudioTrack::getDualMonoMode(audio_dual_mono_mode_t* mode) const
{
    AutoMutex lock(mLock);
    return mAudioTrack->getDualMonoMode(mode);
}

status_t AudioTrack::setAudioDescriptionMixLevel(float leveldB)
{
    AutoMutex lock(mLock);
    return setAudioDescriptionMixLevel_l(leveldB);
}

status_t AudioTrack::setAudioDescriptionMixLevel_l(float leveldB)
{
    return mAudioTrack->setAudioDescriptionMixLevel(leveldB);
}

status_t AudioTrack::getAudioDescriptionMixLevel(float* leveldB) const
{
    AutoMutex lock(mLock);
    return mAudioTrack->getAudioDescriptionMixLevel(leveldB);
}

status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate)
{
    AutoMutex lock(mLock);
@@ -1082,7 +1116,11 @@ status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate)
        return NO_ERROR;
    }
    if (isOffloadedOrDirect_l()) {
        return INVALID_OPERATION;
        status_t status = mAudioTrack->setPlaybackRateParameters(playbackRate);
        if (status == NO_ERROR) {
            mPlaybackRate = playbackRate;
        }
        return status;
    }
    if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
        return INVALID_OPERATION;
@@ -1147,9 +1185,16 @@ status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate)
    return NO_ERROR;
}

const AudioPlaybackRate& AudioTrack::getPlaybackRate() const
const AudioPlaybackRate& AudioTrack::getPlaybackRate()
{
    AutoMutex lock(mLock);
    if (isOffloadedOrDirect_l()) {
        audio_playback_rate_t playbackRateTemp;
        const status_t status = mAudioTrack->getPlaybackRateParameters(&playbackRateTemp);
        if (status == NO_ERROR) { // update local version if changed.
            mPlaybackRate = playbackRateTemp;
        }
    }
    return mPlaybackRate;
}

@@ -1745,6 +1790,13 @@ status_t AudioTrack::createTrack_l()
    mProxy->setPlaybackRate(playbackRateTemp);
    mProxy->setMinimum(mNotificationFramesAct);

    if (mDualMonoMode != AUDIO_DUAL_MONO_MODE_OFF) {
        setDualMonoMode_l(mDualMonoMode);
    }
    if (mAudioDescriptionMixLeveldB != -std::numeric_limits<float>::infinity()) {
        setAudioDescriptionMixLevel_l(mAudioDescriptionMixLeveldB);
    }

    mDeathNotifier = new DeathNotifier(this);
    IInterface::asBinder(mAudioTrack)->linkToDeath(mDeathNotifier, this);

+145 −0
Original line number Diff line number Diff line
@@ -44,6 +44,12 @@ enum {
    SIGNAL,
    APPLY_VOLUME_SHAPER,
    GET_VOLUME_SHAPER_STATE,
    SET_DUAL_MONO_MODE,
    GET_DUAL_MONO_MODE,
    SET_AUDIO_DESCRIPTION_MIX_LEVEL,
    GET_AUDIO_DESCRIPTION_MIX_LEVEL,
    SET_PLAYBACK_RATE_PARAMETERS,
    GET_PLAYBACK_RATE_PARAMETERS,
};

class BpAudioTrack : public BpInterface<IAudioTrack>
@@ -207,6 +213,92 @@ public:
        }
        return state;
    }

    status_t getDualMonoMode(audio_dual_mono_mode_t* mode) override {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
        status_t status = remote()->transact(GET_DUAL_MONO_MODE, data, &reply);
        if (status != NO_ERROR) {
            return status;
        }
        status = (status_t)reply.readInt32();
        if (status != NO_ERROR) {
            return status;
        }
        *mode = (audio_dual_mono_mode_t)reply.readInt32();
        return NO_ERROR;
    }

    status_t setDualMonoMode(audio_dual_mono_mode_t mode) override {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
        data.writeInt32((int32_t)mode);
        status_t status = remote()->transact(SET_DUAL_MONO_MODE, data, &reply);
        if (status != NO_ERROR) {
            return status;
        }
        return reply.readInt32();
    }

    status_t getAudioDescriptionMixLevel(float* leveldB) override {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
        status_t status = remote()->transact(GET_AUDIO_DESCRIPTION_MIX_LEVEL, data, &reply);
        if (status != NO_ERROR) {
            return status;
        }
        status = (status_t)reply.readInt32();
        if (status != NO_ERROR) {
            return status;
        }
        *leveldB = reply.readFloat();
        return NO_ERROR;
    }

    status_t setAudioDescriptionMixLevel(float leveldB) override {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
        data.writeFloat(leveldB);
        status_t status = remote()->transact(SET_AUDIO_DESCRIPTION_MIX_LEVEL, data, &reply);
        if (status != NO_ERROR) {
            return status;
        }
        return reply.readInt32();
    }

    status_t getPlaybackRateParameters(audio_playback_rate_t* playbackRate) override {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
        status_t status = remote()->transact(GET_PLAYBACK_RATE_PARAMETERS, data, &reply);
        if (status != NO_ERROR) {
            return status;
        }
        status = (status_t)reply.readInt32();
        if (status != NO_ERROR) {
            return status;
        }
        playbackRate->mSpeed = reply.readFloat();
        playbackRate->mPitch = reply.readFloat();
        playbackRate->mStretchMode =
            static_cast<audio_timestretch_stretch_mode_t>(reply.readInt32());
        playbackRate->mFallbackMode =
            static_cast<audio_timestretch_fallback_mode_t>(reply.readInt32());
        return NO_ERROR;
    }

    status_t setPlaybackRateParameters(const audio_playback_rate_t& playbackRate) override {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
        data.writeFloat(playbackRate.mSpeed);
        data.writeFloat(playbackRate.mPitch);
        data.writeInt32(playbackRate.mStretchMode);
        data.writeInt32(playbackRate.mFallbackMode);
        status_t status = remote()->transact(SET_PLAYBACK_RATE_PARAMETERS, data, &reply);
        if (status != NO_ERROR) {
            return status;
        }
        return reply.readInt32();
    }
};

IMPLEMENT_META_INTERFACE(AudioTrack, "android.media.IAudioTrack");
@@ -309,6 +401,59 @@ status_t BnAudioTrack::onTransact(
            }
            return NO_ERROR;
        } break;
        case SET_DUAL_MONO_MODE: {
            CHECK_INTERFACE(IAudioTrack, data, reply);
            reply->writeInt32( setDualMonoMode((audio_dual_mono_mode_t)data.readInt32()) );
            return NO_ERROR;
        } break;
        case GET_DUAL_MONO_MODE: {
            CHECK_INTERFACE(IAudioTrack, data, reply);
            audio_dual_mono_mode_t mode;
            const status_t status = getDualMonoMode(&mode);
            reply->writeInt32((int32_t)status);
            if (status == NO_ERROR) {
                reply->writeInt32(mode);
            }
            return NO_ERROR;
        } break;
        case SET_AUDIO_DESCRIPTION_MIX_LEVEL: {
            CHECK_INTERFACE(IAudioTrack, data, reply);
            reply->writeInt32( setAudioDescriptionMixLevel(data.readFloat()) );
            return NO_ERROR;
        } break;
        case GET_AUDIO_DESCRIPTION_MIX_LEVEL: {
            CHECK_INTERFACE(IAudioTrack, data, reply);
            float f;
            const status_t status = getAudioDescriptionMixLevel(&f);
            reply->writeInt32((int32_t)status);
            if (status == NO_ERROR) {
                reply->writeFloat(f);
            }
            return NO_ERROR;
        } break;
        case SET_PLAYBACK_RATE_PARAMETERS: {
            CHECK_INTERFACE(IAudioTrack, data, reply);
            audio_playback_rate_t playbackRate = {
                data.readFloat(),
                data.readFloat(),
                static_cast<audio_timestretch_stretch_mode_t>(data.readInt32()),
                static_cast<audio_timestretch_fallback_mode_t>(data.readInt32())};
            reply->writeInt32( setPlaybackRateParameters(playbackRate) );
            return NO_ERROR;
        } break;
        case GET_PLAYBACK_RATE_PARAMETERS: {
            CHECK_INTERFACE(IAudioTrack, data, reply);
            audio_playback_rate_t playbackRate;
            const status_t status = getPlaybackRateParameters(&playbackRate);
            reply->writeInt32((int32_t)status);
            if (status == NO_ERROR) {
                reply->writeFloat(playbackRate.mSpeed);
                reply->writeFloat(playbackRate.mPitch);
                reply->writeInt32(playbackRate.mStretchMode);
                reply->writeInt32(playbackRate.mFallbackMode);
            }
            return NO_ERROR;
        } break;
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+23 −1
Original line number Diff line number Diff line
@@ -513,6 +513,18 @@ public:
     */
            uint32_t    getOriginalSampleRate() const;

    /* Sets the Dual Mono mode presentation on the output device. */
            status_t    setDualMonoMode(audio_dual_mono_mode_t mode);

    /* Returns the Dual Mono mode presentation setting. */
            status_t    getDualMonoMode(audio_dual_mono_mode_t* mode) const;

    /* Sets the Audio Description Mix level in dB. */
            status_t    setAudioDescriptionMixLevel(float leveldB);

    /* Returns the Audio Description Mix level in dB. */
            status_t    getAudioDescriptionMixLevel(float* leveldB) const;

    /* Set source playback rate for timestretch
     * 1.0 is normal speed: < 1.0 is slower, > 1.0 is faster
     * 1.0 is normal pitch: < 1.0 is lower pitch, > 1.0 is higher pitch
@@ -526,7 +538,7 @@ public:
            status_t    setPlaybackRate(const AudioPlaybackRate &playbackRate);

    /* Return current playback rate */
            const AudioPlaybackRate& getPlaybackRate() const;
            const AudioPlaybackRate& getPlaybackRate();

    /* Enables looping and sets the start and end points of looping.
     * Only supported for static buffer mode.
@@ -1070,6 +1082,12 @@ public:

            void     updateRoutedDeviceId_l();

            /* Sets the Dual Mono mode presentation on the output device. */
            status_t setDualMonoMode_l(audio_dual_mono_mode_t mode);

            /* Sets the Audio Description Mix level in dB. */
            status_t setAudioDescriptionMixLevel_l(float leveldB);

    // Next 4 fields may be changed if IAudioTrack is re-created, but always != 0
    sp<IAudioTrack>         mAudioTrack;
    sp<IMemory>             mCblkMemory;
@@ -1282,6 +1300,10 @@ private:

    wp<AudioSystem::AudioDeviceCallback> mDeviceCallback;

    // Cached values to restore along with the AudioTrack.
    audio_dual_mono_mode_t mDualMonoMode = AUDIO_DUAL_MONO_MODE_OFF;
    float mAudioDescriptionMixLeveldB = -std::numeric_limits<float>::infinity();

private:
    class MediaMetrics {
      public:
+19 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <utils/String8.h>
#include <media/AudioTimestamp.h>
#include <media/VolumeShaper.h>
#include <system/audio.h>

namespace android {

@@ -86,6 +87,24 @@ public:

    /* gets the volume shaper state */
    virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) = 0;

    /* Returns the Dual Mono mode presentation setting. */
    virtual status_t    getDualMonoMode(audio_dual_mono_mode_t* mode) = 0;

    /* Sets the Dual Mono mode presentation on the output device. */
    virtual status_t    setDualMonoMode(audio_dual_mono_mode_t mode) = 0;

    /* Returns the Audio Description Mix level in dB. */
    virtual status_t    getAudioDescriptionMixLevel(float* leveldB) = 0;

    /* Sets the Audio Description Mix level in dB. */
    virtual status_t    setAudioDescriptionMixLevel(float leveldB) = 0;

    /* Retrieves current playback rate parameters. */
    virtual status_t    getPlaybackRateParameters(audio_playback_rate_t* playbackRate) = 0;

    /* Sets the playback rate parameters that control playback behavior. */
    virtual status_t    setPlaybackRateParameters(const audio_playback_rate_t& playbackRate) = 0;
};

// ----------------------------------------------------------------------------
+9 −1
Original line number Diff line number Diff line
@@ -50,12 +50,20 @@ status_t ConversionHelperHidl::keysFromHal(const String8& keys, hidl_vec<hidl_st
            halKeys.get(String8(AUDIO_PARAMETER_DEVICE_SUP_ENCAPSULATION_METADATA_TYPES),
                        value) == NO_ERROR;

    const bool keepDelayValue =
            halKeys.get(String8(AUDIO_PARAMETER_DEVICE_ADDITIONAL_OUTPUT_DELAY),
                        value) == NO_ERROR ||
            halKeys.get(String8(AUDIO_PARAMETER_DEVICE_MAX_ADDITIONAL_OUTPUT_DELAY),
                        value) == NO_ERROR;

    for (size_t i = 0; i < halKeys.size(); ++i) {
        String8 key;
        status_t status = halKeys.getAt(i, key);
        if (status != OK) return status;
        if ((keepFormatValue && key == AudioParameter::keyFormat) ||
            (keepRoutingValue && key == AudioParameter::keyRouting)) {
            (keepRoutingValue && key == AudioParameter::keyRouting) ||
            (keepDelayValue && key == AUDIO_PARAMETER_DEVICE_ADDITIONAL_OUTPUT_DELAY) ||
            (keepDelayValue && key == AUDIO_PARAMETER_DEVICE_MAX_ADDITIONAL_OUTPUT_DELAY)) {
            AudioParameter keepValueParam;
            halKeys.getAt(i, key, value);
            keepValueParam.add(key, value);
Loading