0

我正在将 AOSP 移植到 iMX8 板上。

我有一个工作的 sgtl5000 驱动程序和编解码器。

即当我运行时:

smarc_mx8mq:/sdcard/Alarms # tinyplay file_example_WAV_1MG.wav                                                           
Playing sample: 2 ch, 8000 hz, 16 bit 1072948 bytes

播放音乐。

Android 通常根本不会发出任何声音。

表格连续出现错误:

01-05 14:31:47.809  3383  4814 I audio_hw_primary: start_output_stream_primary... 0xedafe000, device 2, address , mode 0
01-05 14:31:47.809  3383  4814 I audio_hw_primary: select_output_device(), headphone 0 ,headset 0 ,speaker 2, earpiece 0, 
01-05 14:31:47.809  3383  4814 W audio_hw_primary: card -1, port 0 device 0x2
01-05 14:31:47.809  3383  4814 W audio_hw_primary: rate 48000, channel 2 period_size 0xc0
01-05 14:31:47.809  3383  4814 E audio_hw_primary: cannot open pcm_out driver 0: cannot open device '/dev/snd/pcmC4294967295D0p': No such file or directory

如果应用一个非常丑陋的 hack:

smarc_mx8mq:/dev/snd # ln -s pcmC0D0p pcmC4294967295D0p

声音现在可以在 Android 中使用,直到下次重新启动。


我找到了一个名为的文件imx/alsa/config_sgtl5000.h,其中有一个部分:

static struct audio_card sgtl5000_card = {
    .name = "sgtl5000-audio",
    .driver_name = "sgtl5000-audio",
    .bus_name = "I2S1",
    .supported_out_devices =
        (AUDIO_DEVICE_OUT_EARPIECE | AUDIO_DEVICE_OUT_SPEAKER |
         AUDIO_DEVICE_OUT_WIRED_HEADSET | AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
         AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET | AUDIO_DEVICE_OUT_ALL_SCO |
         AUDIO_DEVICE_OUT_DEFAULT),
    .supported_in_devices =
        (AUDIO_DEVICE_IN_COMMUNICATION | AUDIO_DEVICE_IN_AMBIENT |
         AUDIO_DEVICE_IN_BUILTIN_MIC | AUDIO_DEVICE_IN_WIRED_HEADSET |
         AUDIO_DEVICE_IN_BACK_MIC | AUDIO_DEVICE_IN_ALL_SCO |
         AUDIO_DEVICE_IN_DEFAULT | AUDIO_DEVICE_IN_BUS),
    .defaults = NULL,
    .bt_output = NULL,
    .speaker_output = speaker_output_sgtl5000,
    .hs_output = NULL,
    .earpiece_output = NULL,
    .vx_hs_mic_input = NULL,
    .mm_main_mic_input = mm_main_mic_input_sgtl5000,
    .vx_main_mic_input = NULL,
    .mm_hs_mic_input = NULL,
    .vx_bt_mic_input = NULL,
    .mm_bt_mic_input = NULL,
    .card = 0,
    .out_rate = 0,
    .out_channels = 0,
    .out_format = 0,
    .in_rate = 0,
    .in_channels = 0,
    .in_format = 0,
};

我目前推断Android要求可以做X的声卡并且返回值为-1(4294967295作为uint32_t)。

缺少错误检查会导致尝试在 /dev/snd/pcmC4294967295D0p 打开声卡 -1。

如何让 sgtl5000 成为 Android 的默认声卡?

4

0 回答 0