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

Commit 58d4be5a authored by François Gaffie's avatar François Gaffie Committed by Eric Laurent
Browse files

audio: get rid of hardcoded translation stream <--> attributes

IMPORTANT NOTE:
    CL depends on another CL in frameworks/base
    https://partner-android-review.googlesource.com/c/platform/frameworks/base/+/1206275



AudioProductStrategies offers the possibility to dynamically
translate attributes to stream types (and vice versa) within
audio policy engine.
Legacy engine has hard coded rules to maintain the translation
service.

This patch removes the hardcoded translation within the helper
and replaces them by AudioProductStrategy APIs.

Test: AudioPolicyTests: AudioProductStrategiesAllStreamsTest
It loops on all stream types supported by strategy and ensures
device selection matches. Hard coded stuff would prevent right device
selection.
Test: CTS: AudioTrackTest AudioRecordTest
Test: audio smoke test on sailfish, walleye blueline


Change-Id: I76589df5555136ed49dbacc7aac9b0b5e828bef2
Signed-off-by: default avatarFrançois Gaffie <francois.gaffie@renault.com>
parent 6054a776
Loading
Loading
Loading
Loading

include/media/AudioPolicyHelper.h

deleted120000 → 0
+0 −1
Original line number Diff line number Diff line
../../media/libaudioclient/include/media/AudioPolicyHelper.h
 No newline at end of file
+5 −5
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@
#include <media/IAudioFlinger.h>
#include <media/IAudioPolicyService.h>
#include <media/AudioParameter.h>
#include <media/AudioPolicyHelper.h>
#include <media/AudioResamplerPublic.h>
#include <media/AudioSystem.h>
#include <media/MediaAnalyticsItem.h>
@@ -487,7 +486,7 @@ status_t AudioTrack::set(
                __func__,
                 mAttributes.usage, mAttributes.content_type, mAttributes.flags, mAttributes.tags);
        mStreamType = AUDIO_STREAM_DEFAULT;
        audio_attributes_flags_to_audio_output_flags(mAttributes.flags, flags);
        audio_flags_to_audio_output_flags(mAttributes.flags, &flags);
    }

    // these below should probably come from the audioFlinger too...
@@ -1390,7 +1389,7 @@ status_t AudioTrack::attachAuxEffect(int effectId)
audio_stream_type_t AudioTrack::streamType() const
{
    if (mStreamType == AUDIO_STREAM_DEFAULT) {
        return audio_attributes_to_stream_type(&mAttributes);
        return AudioSystem::attributesToStreamType(mAttributes);
    }
    return mStreamType;
}
@@ -1473,7 +1472,7 @@ status_t AudioTrack::createTrack_l()

    IAudioFlinger::CreateTrackInput input;
    if (mStreamType != AUDIO_STREAM_DEFAULT) {
        stream_type_to_audio_attributes(mStreamType, &input.attr);
        input.attr = AudioSystem::streamTypeToAttributes(mStreamType);
    } else {
        input.attr = mAttributes;
    }
@@ -2891,7 +2890,8 @@ status_t AudioTrack::dump(int fd, const Vector<String16>& args __unused) const
                        mPortId, mStatus, mState, mSessionId, mFlags);
    result.appendFormat("  stream type(%d), left - right volume(%f, %f)\n",
                        (mStreamType == AUDIO_STREAM_DEFAULT) ?
                                audio_attributes_to_stream_type(&mAttributes) : mStreamType,
                            AudioSystem::attributesToStreamType(mAttributes) :
                            mStreamType,
                        mVolume[AUDIO_INTERLEAVE_LEFT], mVolume[AUDIO_INTERLEAVE_RIGHT]);
    result.appendFormat("  format(%#x), channel mask(%#x), channel count(%u)\n",
                  mFormat, mChannelMask, mChannelCount);
+1 −2
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@
#include <math.h>
#include <utils/Log.h>
#include <cutils/properties.h>
#include <media/AudioPolicyHelper.h>
#include "media/ToneGenerator.h"


@@ -1242,7 +1241,7 @@ bool ToneGenerator::initAudioTrack() {
    if (mStreamType == AUDIO_STREAM_VOICE_CALL) {
        streamType = AUDIO_STREAM_DTMF;
    }
    stream_type_to_audio_attributes(streamType, &attr);
    attr = AudioSystem::streamTypeToAttributes(streamType);

    const size_t frameCount = mProcessSize;
    status_t status = mpAudioTrack->set(
+0 −143
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef AUDIO_POLICY_HELPER_H_
#define AUDIO_POLICY_HELPER_H_

#include <android-base/macros.h>
#include <system/audio.h>

static inline
audio_stream_type_t audio_usage_to_stream_type(const audio_usage_t usage)
{
    switch(usage) {
        case AUDIO_USAGE_MEDIA:
        case AUDIO_USAGE_GAME:
        case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
        case AUDIO_USAGE_ASSISTANT:
            return AUDIO_STREAM_MUSIC;
        case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
            return AUDIO_STREAM_ACCESSIBILITY;
        case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
            return AUDIO_STREAM_SYSTEM;
        case AUDIO_USAGE_VOICE_COMMUNICATION:
            return AUDIO_STREAM_VOICE_CALL;

        case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
            return AUDIO_STREAM_DTMF;

        case AUDIO_USAGE_ALARM:
            return AUDIO_STREAM_ALARM;
        case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
            return AUDIO_STREAM_RING;

        case AUDIO_USAGE_NOTIFICATION:
        case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
        case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
        case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
        case AUDIO_USAGE_NOTIFICATION_EVENT:
            return AUDIO_STREAM_NOTIFICATION;

        case AUDIO_USAGE_UNKNOWN:
        default:
            return AUDIO_STREAM_MUSIC;
    }
}

static inline
audio_stream_type_t audio_attributes_to_stream_type(const audio_attributes_t *attr)
{
    // flags to stream type mapping
    if ((attr->flags & AUDIO_FLAG_AUDIBILITY_ENFORCED) == AUDIO_FLAG_AUDIBILITY_ENFORCED) {
        return AUDIO_STREAM_ENFORCED_AUDIBLE;
    }
    if ((attr->flags & AUDIO_FLAG_SCO) == AUDIO_FLAG_SCO) {
        return AUDIO_STREAM_BLUETOOTH_SCO;
    }

    // usage to stream type mapping
    return audio_usage_to_stream_type(attr->usage);
}

static inline
void stream_type_to_audio_attributes(audio_stream_type_t streamType,
                                     audio_attributes_t *attr) {
    memset(attr, 0, sizeof(audio_attributes_t));

    switch (streamType) {
    case AUDIO_STREAM_DEFAULT:
    case AUDIO_STREAM_MUSIC:
        attr->content_type = AUDIO_CONTENT_TYPE_MUSIC;
        attr->usage = AUDIO_USAGE_MEDIA;
        break;
    case AUDIO_STREAM_VOICE_CALL:
        attr->content_type = AUDIO_CONTENT_TYPE_SPEECH;
        attr->usage = AUDIO_USAGE_VOICE_COMMUNICATION;
        break;
    case AUDIO_STREAM_ENFORCED_AUDIBLE:
        attr->flags  |= AUDIO_FLAG_AUDIBILITY_ENFORCED;
        FALLTHROUGH_INTENDED; // attributes in common with STREAM_SYSTEM
    case AUDIO_STREAM_SYSTEM:
        attr->content_type = AUDIO_CONTENT_TYPE_SONIFICATION;
        attr->usage = AUDIO_USAGE_ASSISTANCE_SONIFICATION;
        break;
    case AUDIO_STREAM_RING:
        attr->content_type = AUDIO_CONTENT_TYPE_SONIFICATION;
        attr->usage = AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
        break;
    case AUDIO_STREAM_ALARM:
        attr->content_type = AUDIO_CONTENT_TYPE_SONIFICATION;
        attr->usage = AUDIO_USAGE_ALARM;
        break;
    case AUDIO_STREAM_NOTIFICATION:
        attr->content_type = AUDIO_CONTENT_TYPE_SONIFICATION;
        attr->usage = AUDIO_USAGE_NOTIFICATION;
        break;
    case AUDIO_STREAM_BLUETOOTH_SCO:
        attr->content_type = AUDIO_CONTENT_TYPE_SPEECH;
        attr->usage = AUDIO_USAGE_VOICE_COMMUNICATION;
        attr->flags |= AUDIO_FLAG_SCO;
        break;
    case AUDIO_STREAM_DTMF:
        attr->content_type = AUDIO_CONTENT_TYPE_SONIFICATION;
        attr->usage = AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
        break;
    case AUDIO_STREAM_TTS:
        attr->content_type = AUDIO_CONTENT_TYPE_SPEECH;
        attr->usage = AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
        break;
    default:
        ALOGE("invalid stream type %d when converting to attributes", streamType);
    }
}

// Convert flags sent from Java AudioAttributes.getFlags() method to audio_output_flags_t
static inline
void audio_attributes_flags_to_audio_output_flags(const audio_flags_mask_t audioAttributeFlags,
            audio_output_flags_t &flags) {
    if ((audioAttributeFlags & AUDIO_FLAG_HW_AV_SYNC) != 0) {
        flags = static_cast<audio_output_flags_t>(flags |
            AUDIO_OUTPUT_FLAG_HW_AV_SYNC | AUDIO_OUTPUT_FLAG_DIRECT);
    }
    if ((audioAttributeFlags & AUDIO_FLAG_LOW_LATENCY) != 0) {
        flags = static_cast<audio_output_flags_t>(flags | AUDIO_OUTPUT_FLAG_FAST);
    }
    // check deep buffer after flags have been modified above
    if (flags == AUDIO_OUTPUT_FLAG_NONE && (audioAttributeFlags & AUDIO_FLAG_DEEP_BUFFER) != 0) {
        flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
    }
}

#endif //AUDIO_POLICY_HELPER_H_
+0 −1
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@
#include <cutils/properties.h> // for property_get
#include <utils/Log.h>

#include <media/AudioPolicyHelper.h>
#include <media/stagefright/foundation/ADebug.h>

namespace {
Loading