You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Raspberry Pi 3B搭配Suptronics X920扩展板PCM5122 DAC音频播放故障求助

我来帮你一步步排查Suptronics X920(PCM5122 DAC)的音频输出问题,结合你的配置和代码,咱们先从最关键的系统配置入手:

第一步:修正树莓派设备树配置(核心问题)

你的config.txt里存在几个冲突的配置,这大概率是导致DAC无法工作的原因:

  1. PWM和I2S共享硬件时钟,同时启用会直接冲突
  2. 错误使用了generic-i2s overlay,没有加载PCM5122对应的专用驱动
  3. 内置音频没有禁用,可能抢占了音频资源

请替换你的config.txt为以下精简且正确的配置(保留你需要的其他功能,比如RTC、显示屏):

kernel=u-boot-dtok.bin
framebuffer_depth=16
# 禁用内置音频,优先使用外接DAC
dtparam=audio=off
dtparam=i2c_arm=on
dtparam=spi=on
# 加载PCM5122对应的DAC overlay(X920适配的标准版本)
dtoverlay=hifiberry-dac
# 注释掉PWM overlay,避免和I2S时钟冲突
# dtoverlay=pwm-2chan-with-clk,pin=18,func=2,pin2=13,func2=4
start_x=1
# 保留你需要的其他配置(RTC、显示屏、USB等)
dtoverlay=i2c-rtc,ds3231
dtoverlay=rpi-ft5406
hdmi_force_hotplug=1
framebuffer_swap=0
max_usb_current=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt 1024 600 60 6 0 0 0
hdmi_drive=1
enable_uart=1
core_freq=400

注:如果hifiberry-dac无效,可以尝试dtoverlay=suptronics-x920(部分定制固件支持这个专用overlay)

第二步:验证DAC设备是否被系统识别

修改配置后重启树莓派,通过adb命令确认系统是否正确识别到DAC:

# 查看所有音频输出设备
adb shell dumpsys audio | grep -A 5 "Output Devices"

你应该能看到类型为TYPE_BUS的设备,且产品名称包含PCM5122或X920的标识。如果看不到,说明系统没识别到DAC,需要检查硬件接线或固件版本。

第三步:调整Android播放代码的设备选择逻辑

你的代码里存在两个潜在问题:

  1. 没有确认TYPE_BUS设备是否存在,空指针会导致使用默认设备
  2. preferredDevice优先级低于系统默认,建议直接指定设备

请修改代码如下:

fun playSound(file: File) {
    val audioEncoding = AudioFormat.ENCODING_PCM_16BIT
    val sampleRate = 16000
    val audioOutputFormat = AudioFormat.Builder()
        .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
        .setEncoding(audioEncoding)
        .setSampleRate(sampleRate)
        .build()
    val audioOutputBufferSize = AudioTrack.getMinBufferSize(sampleRate, audioOutputFormat.channelMask, audioEncoding)
    
    // 查找BUS设备,同时打印所有设备信息方便排查
    val audioOutputDevice = findAudioDevice(AudioManager.GET_DEVICES_OUTPUTS, AudioDeviceInfo.TYPE_BUS)
        ?: run {
            e { "ERROR: 未找到TYPE_BUS类型的音频设备" }
            return
        }

    // 直接指定音频设备,而不是设置preferredDevice
    val audioTrack = AudioTrack.Builder()
        .setAudioFormat(audioOutputFormat)
        .setBufferSizeInBytes(audioOutputBufferSize)
        .setTransferMode(AudioTrack.MODE_STREAM)
        .setAudioDeviceInfo(audioOutputDevice)
        .build()

    val buffer = ByteArray(audioOutputBufferSize)
    try {
        audioTrack.play()
        audioTrack.setVolume(1f)
        val stream = file.inputStream().buffered()
        while (stream.read(buffer) > 0) {
            val out = audioTrack.write(buffer, 0, buffer.size, AudioTrack.WRITE_BLOCKING)
            d { "写入字节数: $out" }
        }
    } catch (error: Throwable) {
        e(error) { "播放音频失败: $file" }
    } finally {
        audioTrack.stop()
        audioTrack.release()
        stream.close()
    }
}

private fun findAudioDevice(deviceFlag: Int, deviceType: Int): AudioDeviceInfo? {
    val manager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
    val adis = manager.getDevices(deviceFlag)
    for (adi in adis) {
        // 打印所有设备的详细信息,方便确认目标DAC
        d { "设备信息: 名称=${adi.productName}, 类型=${adi.type}, ID=${adi.id}" }
        if (adi.type == deviceType) {
            return adi
        }
    }
    return null
}
第四步:基础音频测试(排除代码问题)

如果修改后还是没声音,先排除代码问题,用系统原生工具测试:

# 推送一个测试wav文件到设备
adb push test.wav /sdcard/
# 使用MediaPlayer播放
adb shell am start -a android.intent.action.VIEW -d file:///sdcard/test.wav -t audio/wav

如果这样能听到声音,说明是代码逻辑问题;如果还是没声音,回到系统配置和硬件检查。

额外排查点
  • 检查X920扩展板的电源是否充足,树莓派USB供电可能不够,建议用独立电源供电
  • 确认I2S引脚连接正确:BCLK(GPIO18)、LRCLK(GPIO19)、DIN(GPIO20)、GND、5V
  • 尝试更新树莓派固件和Android系统版本,部分旧版本对PCM5122支持不好

内容的提问来源于stack exchange,提问作者4emodan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:47:27