使用共享库中的audioflinger来捕获android系统中的音频缓冲区

问题描述 投票:0回答:1

我正在开发一个本机共享库,该库将在 aosp 源代码树内构建,在此路径“sdk-version/external”中

在这个共享库中,我尝试使用音频flinger来使用它的一些功能,这样我就可以捕获将在设备上的android系统中播放的音频缓冲区或轨道。

我如何在我的共享库中使用audioflinger

我尝试这样做

#include <system/audio.h>
#include <media/AudioSystem.h>
#include <media/AudioFlinger.h>

但是我收到了这个错误

enter image description here

我还尝试将音频flinger与binder一起使用,因为音频flinger是这样的ipc机制的一部分

// Get a reference to the AudioFlinger service using the IServiceManager
    android::sp<android::IBinder> binder =
        android::defaultServiceManager()->getService(android::String16("media.audio_flinger"));

if (binder != nullptr) {
     
        
        gAudioFlinger = android::interface_cast<android::IAudioFlinger>(binder);
    } 

我收到这个错误

enter image description here

shared-libraries ipc android-source android-binder audioflinger
1个回答
0
投票

请记住,如果您是新手,Android 原生开发类似于 Linux 原生开发,但要注意 Google 喜欢破坏事物。

如果您打算使用 Android Binder 在 Android 上执行 IPC,您很可能希望使用 AIDL/HIDL,而不是手动执行所有操作。 AIDL/HIDL只是源码生成机制,生成的代码可以在out/soong/.intermediates中找到。

在你的例子中,你想要调用AudioFlinger的Android Binder接口,换句话说,你想要使用IAudioFlignerService.aidl中定义的接口,所以如果你使用cpp后端,你的代码应该如下所示。

#include <android/media/IAudioPolicyService.h>
...
android::interface_cast<android::media::IAudioFlingerService>(binder);

好吧,编译器在哪里找到 android/media/IAudioPolicyService.h ,由于

interface_cast
是一个模板函数,只调用 type 参数类型的
asInterface
,那么它在哪里可以找到 IAudioFlingerService 的定义和声明呢?

template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
    return INTERFACE::asInterface(obj);
} 

IAudioFlingerService
的定义和声明的源代码位于 out/soong/.intermediates/frameworks/av/media/libaudioclient/audioflinger-aidl-${cpp_or_ndk}-source 中,并且在 AOSP 源代码树中生成AIDL/HIDL 代码通常被编译成(共享)库并链接形成 ELF,因此编译器也需要知道库的位置。它们位于 out/soong/.intermediates/frameworks/av/media/libaudioclient/audioflinger-aidl-${cpp_or_ndk} 中。

在您的 Android.bp 或 Android.mk 文件中,只需包含 audioflinger-aidl-${cpp_or_ndk} 作为共享库依赖项,在构建时一切应该没问题。在运行时,您可能会遇到 /dev/binder 问题或 selinux 问题。

© www.soinside.com 2019 - 2024. All rights reserved.