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

Commit d5aa6164 authored by Ytai Ben-tsvi's avatar Ytai Ben-tsvi Committed by Android (Google) Code Review
Browse files

Merge "Convert IAudioFlingerClient to stable AIDL"

parents 28b27204 10dc0a6f
Loading
Loading
Loading
Loading
+1223 −0

File added.

Preview size limit exceeded, changes collapsed.

+99 −3
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@ cc_library_headers {
    name: "libaudioclient_headers",
    vendor_available: true,
    min_sdk_version: "29",
    host_supported: true,

    header_libs: [
        "libaudiofoundation_headers",
@@ -12,7 +13,12 @@ cc_library_headers {
    export_header_lib_headers: [
        "libaudiofoundation_headers",
    ],
    host_supported: true,
    static_libs: [
        "audioflinger-aidl-unstable-cpp",
    ],
    export_static_lib_headers: [
        "audioflinger-aidl-unstable-cpp",
    ],
    target: {
        darwin: {
            enabled: false,
@@ -29,6 +35,7 @@ cc_library_shared {
        "AudioVolumeGroup.cpp",
    ],
    shared_libs: [
        "audioflinger-aidl-unstable-cpp",
        "capture_state_listener-aidl-cpp",
        "libaudiofoundation",
        "libaudioutils",
@@ -44,6 +51,7 @@ cc_library_shared {
    include_dirs: ["system/media/audio_utils/include"],
    export_include_dirs: ["include"],
    export_shared_lib_headers: [
        "audioflinger-aidl-unstable-cpp",
        "capture_state_listener-aidl-cpp",
    ],
}
@@ -73,7 +81,6 @@ cc_library_shared {
        "AudioTrack.cpp",
        "AudioTrackShared.cpp",
        "IAudioFlinger.cpp",
        "IAudioFlingerClient.cpp",
        "IAudioPolicyService.cpp",
        "IAudioPolicyServiceClient.cpp",
        "IAudioTrack.cpp",
@@ -83,7 +90,9 @@ cc_library_shared {
        "TrackPlayerBase.cpp",
    ],
    shared_libs: [
        "audioflinger-aidl-unstable-cpp",
        "capture_state_listener-aidl-cpp",
        "libaudioclient_aidl_conversion",
        "libaudiofoundation",
        "libaudioutils",
        "libaudiopolicy",
@@ -101,7 +110,10 @@ cc_library_shared {
        "libutils",
        "libvibrator",
    ],
    export_shared_lib_headers: ["libbinder"],
    export_shared_lib_headers: [
        "audioflinger-aidl-unstable-cpp",
        "libbinder",
    ],

    include_dirs: [
        "frameworks/av/media/libnbaio/include_mono/",
@@ -140,6 +152,32 @@ cc_library_shared {
    },
}

cc_library_shared {
    name: "libaudioclient_aidl_conversion",
    srcs: ["AidlConversion.cpp"],
    local_include_dirs: ["include"],
    shared_libs: [
        "audioclient-types-aidl-unstable-cpp",
        "libbase",
        "liblog",
        "libutils",
    ],
    export_shared_lib_headers: [
        "audioclient-types-aidl-unstable-cpp",
    ],
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-error=deprecated-declarations",
    ],
    sanitize: {
        misc_undefined: [
            "unsigned-integer-overflow",
            "signed-integer-overflow",
        ],
    },
}

// AIDL interface between libaudioclient and framework.jar
filegroup {
    name: "libaudioclient_aidl",
@@ -189,3 +227,61 @@ aidl_interface {
        "shared-file-region-aidl",
    ],
}

aidl_interface {
    name: "audioclient-types-aidl",
    unstable: true,
    host_supported: true,
    vendor_available: true,
    double_loadable: true,
    local_include_dir: "aidl",
    srcs: [
        "aidl/android/media/AudioGainConfig.aidl",
        "aidl/android/media/AudioGainMode.aidl",
        "aidl/android/media/AudioInputFlags.aidl",
        "aidl/android/media/AudioIoConfigEvent.aidl",
        "aidl/android/media/AudioIoDescriptor.aidl",
        "aidl/android/media/AudioIoFlags.aidl",
        "aidl/android/media/AudioOutputFlags.aidl",
        "aidl/android/media/AudioPatch.aidl",
        "aidl/android/media/AudioPortConfig.aidl",
        "aidl/android/media/AudioPortConfigType.aidl",
        "aidl/android/media/AudioPortConfigDeviceExt.aidl",
        "aidl/android/media/AudioPortConfigExt.aidl",
        "aidl/android/media/AudioPortConfigMixExt.aidl",
        "aidl/android/media/AudioPortConfigMixExtUseCase.aidl",
        "aidl/android/media/AudioPortConfigSessionExt.aidl",
        "aidl/android/media/AudioPortRole.aidl",
        "aidl/android/media/AudioPortType.aidl",
        "aidl/android/media/AudioSessionType.aidl",
        "aidl/android/media/AudioSourceType.aidl",
        "aidl/android/media/AudioStreamType.aidl",
    ],
    imports: [
        "audio_common-aidl",
    ],
}

aidl_interface {
    name: "audioflinger-aidl",
    unstable: true,
    local_include_dir: "aidl",
    host_supported: true,
    vendor_available: true,
    srcs: [
        "aidl/android/media/IAudioFlingerClient.aidl",
    ],
    imports: [
        "audioclient-types-aidl",
    ],
    double_loadable: true,
    backend: {
        cpp: {
            min_sdk_version: "29",
            apex_available: [
                "//apex_available:platform",
                "com.android.media",
            ],
        },
    },
}
+19 −3
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <binder/IServiceManager.h>
#include <binder/ProcessState.h>
#include <binder/IPCThreadState.h>
#include <media/AidlConversion.h>
#include <media/AudioResamplerPublic.h>
#include <media/AudioSystem.h>
#include <media/IAudioFlinger.h>
@@ -32,10 +33,17 @@

#include <system/audio.h>

#define VALUE_OR_RETURN(x) \
    ({ auto _tmp = (x); \
       if (!_tmp.ok()) return Status::fromStatusT(_tmp.error()); \
       _tmp.value(); })

// ----------------------------------------------------------------------------

namespace android {

using binder::Status;

// client singleton for AudioFlinger binder interface
Mutex AudioSystem::gLock;
Mutex AudioSystem::gLockErrorCallbacks;
@@ -521,11 +529,17 @@ void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who __unused
    ALOGW("AudioFlinger server died!");
}

void AudioSystem::AudioFlingerClient::ioConfigChanged(audio_io_config_event event,
                                                      const sp<AudioIoDescriptor>& ioDesc) {
Status AudioSystem::AudioFlingerClient::ioConfigChanged(
        media::AudioIoConfigEvent _event,
        const media::AudioIoDescriptor& _ioDesc) {
    audio_io_config_event event = VALUE_OR_RETURN(
            aidl2legacy_AudioIoConfigEvent_audio_io_config_event(_event));
    sp<AudioIoDescriptor> ioDesc(
            VALUE_OR_RETURN(aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(_ioDesc)));

    ALOGV("ioConfigChanged() event %d", event);

    if (ioDesc == 0 || ioDesc->mIoHandle == AUDIO_IO_HANDLE_NONE) return;
    if (ioDesc->mIoHandle == AUDIO_IO_HANDLE_NONE) return Status::ok();

    audio_port_handle_t deviceId = AUDIO_PORT_HANDLE_NONE;
    std::vector<sp<AudioDeviceCallback>> callbacksToCall;
@@ -640,6 +654,8 @@ void AudioSystem::AudioFlingerClient::ioConfigChanged(audio_io_config_event even
        // If callbacksToCall is not empty, it implies ioDesc->mIoHandle and deviceId are valid
        cb->onAudioDeviceUpdate(ioDesc->mIoHandle, deviceId);
    }

    return Status::ok();
}

status_t AudioSystem::AudioFlingerClient::getInputBufferSize(
+2 −2
Original line number Diff line number Diff line
@@ -373,7 +373,7 @@ public:
        return reply.readString8();
    }

    virtual void registerClient(const sp<IAudioFlingerClient>& client)
    virtual void registerClient(const sp<media::IAudioFlingerClient>& client)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
@@ -1213,7 +1213,7 @@ status_t BnAudioFlinger::onTransact(

        case REGISTER_CLIENT: {
            CHECK_INTERFACE(IAudioFlinger, data, reply);
            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
            sp<media::IAudioFlingerClient> client = interface_cast<media::IAudioFlingerClient>(
                    data.readStrongBinder());
            registerClient(client);
            return NO_ERROR;
+0 −91
Original line number Diff line number Diff line
/*
 * Copyright (C) 2009 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.
 */

#define LOG_TAG "IAudioFlingerClient"
#include <utils/Log.h>

#include <stdint.h>
#include <sys/types.h>

#include <binder/Parcel.h>

#include <media/IAudioFlingerClient.h>
#include <media/AudioSystem.h>

namespace android {

enum {
    IO_CONFIG_CHANGED = IBinder::FIRST_CALL_TRANSACTION
};

class BpAudioFlingerClient : public BpInterface<IAudioFlingerClient>
{
public:
    explicit BpAudioFlingerClient(const sp<IBinder>& impl)
        : BpInterface<IAudioFlingerClient>(impl)
    {
    }

    void ioConfigChanged(audio_io_config_event event, const sp<AudioIoDescriptor>& ioDesc)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IAudioFlingerClient::getInterfaceDescriptor());
        data.writeInt32(event);
        data.writeInt32((int32_t)ioDesc->mIoHandle);
        data.write(&ioDesc->mPatch, sizeof(struct audio_patch));
        data.writeInt32(ioDesc->mSamplingRate);
        data.writeInt32(ioDesc->mFormat);
        data.writeInt32(ioDesc->mChannelMask);
        data.writeInt64(ioDesc->mFrameCount);
        data.writeInt64(ioDesc->mFrameCountHAL);
        data.writeInt32(ioDesc->mLatency);
        data.writeInt32(ioDesc->mPortId);
        remote()->transact(IO_CONFIG_CHANGED, data, &reply, IBinder::FLAG_ONEWAY);
    }
};

IMPLEMENT_META_INTERFACE(AudioFlingerClient, "android.media.IAudioFlingerClient");

// ----------------------------------------------------------------------

status_t BnAudioFlingerClient::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch (code) {
    case IO_CONFIG_CHANGED: {
            CHECK_INTERFACE(IAudioFlingerClient, data, reply);
            audio_io_config_event event = (audio_io_config_event)data.readInt32();
            sp<AudioIoDescriptor> ioDesc = new AudioIoDescriptor();
            ioDesc->mIoHandle = (audio_io_handle_t) data.readInt32();
            data.read(&ioDesc->mPatch, sizeof(struct audio_patch));
            ioDesc->mSamplingRate = data.readInt32();
            ioDesc->mFormat = (audio_format_t) data.readInt32();
            ioDesc->mChannelMask = (audio_channel_mask_t) data.readInt32();
            ioDesc->mFrameCount = data.readInt64();
            ioDesc->mFrameCountHAL = data.readInt64();
            ioDesc->mLatency = data.readInt32();
            ioDesc->mPortId = data.readInt32();
            ioConfigChanged(event, ioDesc);
            return NO_ERROR;
        } break;
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
}

// ----------------------------------------------------------------------------

} // namespace android
Loading