Android audio设置投屏和喇叭双输出

文章讲述了在Android13上使用scrcpy进行投屏时,如何解决声音被截取到电脑端的问题。通过修改AudioSource设置,将输出设备改为SPEAKER,确保手机喇叭正常工作。

业务场景:

在 Android13 平台上,使用 USB 投屏工具scrcpy,投屏到电脑端时,声音被截到 电脑端播放,Android设备 端静音,在Android11及之前都是 在Android设备端正常播放。

分析:

scrcpy 支持 Android11以上版本的工具。投屏时有设置设备端AudioSource.REMOTE_SUBMIX属性,音频输出设备是 AUDIO_DEVICE_OUT_REMOTE_SUBMIX 

音频设备输出选择源码中在 Engine.cpp中

frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp
    
    case STRATEGY_MEDIA: {
        DeviceVector devices2;
        if (strategy != STRATEGY_SONIFICATION) {
            // no sonification on remote submix (e.g. WFD)
            sp<DeviceDescriptor> remoteSubmix;
            if ((remoteSubmix = availableOutputDevices.getDevice(
                    AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0"),
                    AUDIO_FORMAT_DEFAULT)) != nullptr) {
                devices2.add(remoteSubmix);
            }
        }

若项目需要投屏时喇叭也正常播放,需要修改此处为

    case STRATEGY_MEDIA: {
        DeviceVector devices2;
        if (strategy != STRATEGY_SONIFICATION) {
            // no sonification on remote submix (e.g. WFD)
            sp<DeviceDescriptor> remoteSubmix;
            if ((remoteSubmix = availableOutputDevices.getDevice(
                    AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0"),
                    AUDIO_FORMAT_DEFAULT)) != nullptr) {

                    //需要在这里添加 SPEAKER 输出设备
					devices2 = availableOutputDevices.getDevicesFromTypes({
                        AUDIO_DEVICE_OUT_REMOTE_SUBMIX, AUDIO_DEVICE_OUT_SPEAKER});
            }
        }

至此,声音即可从电脑播放,Android设备喇叭本身也可正常播放。

注:

Android10 以下版本参考:

修改前:

frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp

if(mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) {
       device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
}

修改后:

if (mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) {
       device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
                               
       device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_WIRED_HEADPHONE);
                               
       device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_SPEAKER);
} 

也就是说 device2的获取方式有点差异。

<think>嗯,用户的问题是关于在RK3568 Android系统上配置声音喇叭输出的方法。首先,我需要回忆之前提供的引用内容。引用[1]提到了在RK3568 Android11中,音频路由已经由原厂配置好,特别是SPK喇叭的配置路径是hardware/rockchip/audio/tinyalsa_hal/codec_config/default_config.h。用户可能需要修改这个文件来启用喇叭输出。 然后引用[2]提到了耳机检测的DTS配置,可能涉及到GPIO设置tinymix工具的使用。用户可能需要检查这些配置是否正确,避免耳机检测干扰喇叭输出。 接下来,用户可能需要分步骤的指导:首先确认硬件连接,然后检查系统配置,比如default_config.h中的路由设置,接着验证DTS配置中的喇叭相关节点是否启用。此外,使用tinymix工具调试音频参数也很重要,比如检查SPK的增益通路是否打开。 用户可能遇到的问题包括配置修改后没有生效,或者喇叭无声,这时候可能需要检查内核日志,或者重新编译系统。另外,用户可能需要知道如何通过ADB访问设备,使用命令行工具进行调试。需要确保回答覆盖这些方面,并提供具体的代码路径指令示例,帮助用户一步步排查解决问题。</think>### RK3568 Android系统喇叭输出配置指南 #### 一、硬件确认 1. 确保SPK喇叭已正确接入RK809 Codec芯片的SPKL/SPKR引脚 2. 用万用表测量喇叭阻抗(通常4Ω/8Ω)是否匹配驱动参数 #### 二、系统配置路径 1. **Codec路由配置**:修改音频路由配置文件 ```bash hardware/rockchip/audio/tinyalsa_hal/codec_config/default_config.h ``` 查找以下关键配置项: ```c // 启用SPK输出通路 #define SPK_OUT_EN 1 #define HP_OUT_DISABLE 1 // 当需要强制关闭耳机输出时[^1] // 设置音量增益(0-31) #define SPK_GAIN 24 ``` 2. **DTS配置验证**: 检查设备树中喇叭驱动配置: ```dts &rk809_codec { status = "okay"; spk-con-gpio = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>; // 确认GPIO引脚与实际硬件一致[^2] }; ``` #### 三、调试指令 通过ADB执行以下命令实时调试: ```bash # 查看所有混音器控件 adb shell tinymix # 设置SPK通路(示例值) adb shell tinymix "SPK Switch" 1 adb shell tinymix "SPK Volume" 24 # 强制切换音频路由 adb shell tinymix "Output Select" "SPK" ``` #### 四、常见问题排查 1. **无声问题**: - 执行`dmesg | grep -i audio`查看驱动加载状态 - 用示波器测量SPK引脚是否有波形输出 - 检查`/sys/kernel/debug/asoc/codec_reg`寄存器配置 2. **声道异常**: 在`default_config.h`中调整声道映射: ```c const struct route_config spk_route = { .sink = HPOUT, .source = SPKOUT, .channels = AIF1_LEFT | AIF1_RIGHT // 声道配置[^1] }; ``` #### 五、编译生效 修改后需要重新编译音频子系统: ```bash make hardware/rockchip/audio -j8 adb remount adb push out/target/product/rk3568/system/lib/hw/audio.primary.rk30board.so /system/lib/hw/ ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值