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

Commit d4ccc624 authored by Phil Burk's avatar Phil Burk
Browse files

aaudio: implement new USAGE, CONTENT_TYPE and INPUT_PRESET

Pass these audio attributes to AudioFlinger.

Bug: 68052449
Bug: 62104146
Test: test_attributes.cpp will be moved to CTS when ready
Change-Id: Ib8804614d95dcf1b85e51ec1f5569892e017a991
parent f9d1b99e
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -17,6 +17,9 @@ LIBAAUDIO {
    AAudioStreamBuilder_setSharingMode;
    AAudioStreamBuilder_setDirection;
    AAudioStreamBuilder_setBufferCapacityInFrames;
    AAudioStreamBuilder_setUsage;
    AAudioStreamBuilder_setContentType;
    AAudioStreamBuilder_setInputPreset;
    AAudioStreamBuilder_openStream;
    AAudioStreamBuilder_delete;
    AAudioStream_close;
@@ -42,6 +45,9 @@ LIBAAUDIO {
    AAudioStream_getFormat;
    AAudioStream_getSharingMode;
    AAudioStream_getDirection;
    AAudioStream_getUsage;
    AAudioStream_getContentType;
    AAudioStream_getInputPreset;
    AAudioStream_getFramesWritten;
    AAudioStream_getFramesRead;
    AAudioStream_getTimestamp;
+17 −2
Original line number Diff line number Diff line
@@ -50,6 +50,12 @@ status_t AAudioStreamConfiguration::writeToParcel(Parcel* parcel) const {
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32(getBufferCapacity());
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32((int32_t) getUsage());
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32((int32_t) getContentType());
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32((int32_t) getInputPreset());
    if (status != NO_ERROR) goto error;
    return NO_ERROR;
error:
    ALOGE("AAudioStreamConfiguration.writeToParcel(): write failed = %d", status);
@@ -69,16 +75,25 @@ status_t AAudioStreamConfiguration::readFromParcel(const Parcel* parcel) {
    setSamplesPerFrame(value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    setSharingMode(value);
    setSharingMode((aaudio_sharing_mode_t) value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    setFormat(value);
    setFormat((aaudio_format_t) value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    setDirection((aaudio_direction_t) value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    setBufferCapacity(value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    setUsage((aaudio_usage_t) value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    setContentType((aaudio_content_type_t) value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    setInputPreset((aaudio_input_preset_t) value);
    return NO_ERROR;
error:
    ALOGE("AAudioStreamConfiguration.readFromParcel(): read failed = %d", status);
+36 −0
Original line number Diff line number Diff line
@@ -177,6 +177,24 @@ AAUDIO_API void AAudioStreamBuilder_setSharingMode(AAudioStreamBuilder* builder,
    streamBuilder->setSharingMode(sharingMode);
}

AAUDIO_API void AAudioStreamBuilder_setUsage(AAudioStreamBuilder* builder,
                                             aaudio_usage_t usage) {
    AudioStreamBuilder *streamBuilder = convertAAudioBuilderToStreamBuilder(builder);
    streamBuilder->setUsage(usage);
}

AAUDIO_API void AAudioStreamBuilder_setContentType(AAudioStreamBuilder* builder,
                                                   aaudio_content_type_t contentType) {
    AudioStreamBuilder *streamBuilder = convertAAudioBuilderToStreamBuilder(builder);
    streamBuilder->setContentType(contentType);
}

AAUDIO_API void AAudioStreamBuilder_setInputPreset(AAudioStreamBuilder* builder,
                                                   aaudio_input_preset_t inputPreset) {
    AudioStreamBuilder *streamBuilder = convertAAudioBuilderToStreamBuilder(builder);
    streamBuilder->setInputPreset(inputPreset);
}

AAUDIO_API void AAudioStreamBuilder_setBufferCapacityInFrames(AAudioStreamBuilder* builder,
                                                        int32_t frames)
{
@@ -447,6 +465,24 @@ AAUDIO_API aaudio_sharing_mode_t AAudioStream_getSharingMode(AAudioStream* strea
    return audioStream->getSharingMode();
}

AAUDIO_API aaudio_usage_t AAudioStream_getUsage(AAudioStream* stream)
{
    AudioStream *audioStream = convertAAudioStreamToAudioStream(stream);
    return audioStream->getUsage();
}

AAUDIO_API aaudio_content_type_t AAudioStream_getContentType(AAudioStream* stream)
{
    AudioStream *audioStream = convertAAudioStreamToAudioStream(stream);
    return audioStream->getContentType();
}

AAUDIO_API aaudio_input_preset_t AAudioStream_getInputPreset(AAudioStream* stream)
{
    AudioStream *audioStream = convertAAudioStreamToAudioStream(stream);
    return audioStream->getInputPreset();
}

AAUDIO_API int64_t AAudioStream_getFramesWritten(AAudioStream* stream)
{
    AudioStream *audioStream = convertAAudioStreamToAudioStream(stream);
+54 −0
Original line number Diff line number Diff line
@@ -42,6 +42,9 @@ void AAudioStreamParameters::copyFrom(const AAudioStreamParameters &other) {
    mAudioFormat     = other.mAudioFormat;
    mDirection       = other.mDirection;
    mBufferCapacity  = other.mBufferCapacity;
    mUsage           = other.mUsage;
    mContentType     = other.mContentType;
    mInputPreset     = other.mInputPreset;
}

aaudio_result_t AAudioStreamParameters::validate() const {
@@ -98,6 +101,54 @@ aaudio_result_t AAudioStreamParameters::validate() const {
            // break;
    }

    switch (mUsage) {
        case AAUDIO_UNSPECIFIED:
        case AAUDIO_USAGE_MEDIA:
        case AAUDIO_USAGE_VOICE_COMMUNICATION:
        case AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
        case AAUDIO_USAGE_ALARM:
        case AAUDIO_USAGE_NOTIFICATION:
        case AAUDIO_USAGE_NOTIFICATION_RINGTONE:
        case AAUDIO_USAGE_NOTIFICATION_EVENT:
        case AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
        case AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
        case AAUDIO_USAGE_ASSISTANCE_SONIFICATION:
        case AAUDIO_USAGE_GAME:
        case AAUDIO_USAGE_ASSISTANT:
            break; // valid
        default:
            ALOGE("usage not valid = %d", mUsage);
            return AAUDIO_ERROR_ILLEGAL_ARGUMENT;
            // break;
    }

    switch (mContentType) {
        case AAUDIO_UNSPECIFIED:
        case AAUDIO_CONTENT_TYPE_MUSIC:
        case AAUDIO_CONTENT_TYPE_MOVIE:
        case AAUDIO_CONTENT_TYPE_SONIFICATION:
        case AAUDIO_CONTENT_TYPE_SPEECH:
            break; // valid
        default:
            ALOGE("content type not valid = %d", mContentType);
            return AAUDIO_ERROR_ILLEGAL_ARGUMENT;
            // break;
    }

    switch (mInputPreset) {
        case AAUDIO_UNSPECIFIED:
        case AAUDIO_INPUT_PRESET_GENERIC:
        case AAUDIO_INPUT_PRESET_CAMCORDER:
        case AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION:
        case AAUDIO_INPUT_PRESET_VOICE_RECOGNITION:
        case AAUDIO_INPUT_PRESET_UNPROCESSED:
            break; // valid
        default:
            ALOGE("input preset not valid = %d", mInputPreset);
            return AAUDIO_ERROR_ILLEGAL_ARGUMENT;
            // break;
    }

    return AAUDIO_OK;
}

@@ -109,5 +160,8 @@ void AAudioStreamParameters::dump() const {
    ALOGD("mAudioFormat     = %6d", (int)mAudioFormat);
    ALOGD("mDirection       = %6d", mDirection);
    ALOGD("mBufferCapacity  = %6d", mBufferCapacity);
    ALOGD("mUsage           = %6d", mUsage);
    ALOGD("mContentType     = %6d", mContentType);
    ALOGD("mInputPreset     = %6d", mInputPreset);
}
+27 −0
Original line number Diff line number Diff line
@@ -88,6 +88,30 @@ public:
        mDirection = direction;
    }

    aaudio_usage_t getUsage() const {
        return mUsage;
    }

    void setUsage(aaudio_usage_t usage) {
        mUsage = usage;
    }

    aaudio_content_type_t getContentType() const {
        return mContentType;
    }

    void setContentType(aaudio_content_type_t contentType) {
        mContentType = contentType;
    }

    aaudio_input_preset_t getInputPreset() const {
        return mInputPreset;
    }

    void setInputPreset(aaudio_input_preset_t inputPreset) {
        mInputPreset = inputPreset;
    }

    int32_t calculateBytesPerFrame() const {
        return getSamplesPerFrame() * AAudioConvert_formatToSizeInBytes(getFormat());
    }
@@ -109,6 +133,9 @@ private:
    aaudio_sharing_mode_t      mSharingMode     = AAUDIO_SHARING_MODE_SHARED;
    aaudio_format_t            mAudioFormat     = AAUDIO_FORMAT_UNSPECIFIED;
    aaudio_direction_t         mDirection       = AAUDIO_DIRECTION_OUTPUT;
    aaudio_usage_t             mUsage           = AAUDIO_UNSPECIFIED;
    aaudio_content_type_t      mContentType     = AAUDIO_UNSPECIFIED;
    aaudio_input_preset_t      mInputPreset     = AAUDIO_UNSPECIFIED;
    int32_t                    mBufferCapacity  = AAUDIO_UNSPECIFIED;
};

Loading