概述

本文介绍适配YoC声卡驱动

声卡对接

在yoc声卡移植的过程中,则需要对以下相关接口进行移植实现,包含pcmmixer两部分:

  • pcm的接口定义请查看头文件:pcm.h
  • mixer的接口定义请查看头文件:mixer.h

PCM

首先,先了解一下PCM相关的一个重要结构体snd_pcm_ops_t。相关的操作和接口都封装在snd_pcm_ops_t这个结构体中,相关定义在文件:pcm.h

typedef struct snd_pcm_ops {
    int (*hw_params_set)(snd_pcm_t *pcm, struct snd_pcm_hw_params *params);
    int (*hw_get_size)(snd_pcm_t *pcm);
    int (*hw_get_remain_size)(snd_pcm_t *pcm);
    int (*prepare)(snd_pcm_t *pcm);
    int (*pause)(snd_pcm_t *pcm, int enable);
    int (*write)(snd_pcm_t *pcm, void *buf, int size);
    int (*read)(snd_pcm_t *pcm, void *buf, int size);
    int (*set_event)(snd_pcm_t *pcm, pcm_event_cb cb, void *priv);
} snd_pcm_ops_t;
  • hw_params_set

    硬件参数设置

    typedef struct snd_pcm_hw_params {
        int access;
        int format;
        int subformat;
        int sample_bits;
        int frame_bits;
        int channels;
        int rate;
        int period_time;
        int period_size;
        int period_bytes;
        int periods;
        int buffer_time;
        int buffer_size;
        int buffer_bytes;
        int tick_time;
    } snd_pcm_hw_params_t;
    
  • hw_get_remain_size

    获取剩余未发送pcm数据

  • prepare

    启动设备

  • pause

    暂停pcm发送

  • write、read

    读(写)pcm,注意该接口操作的pcm均为非交错数据

  • set_event

    设置事件回调函数

    #define PCM_EVT_WRITE (1 << 0)
    #define PCM_EVT_READ (1 << 1)
    #define PCM_EVT_XRUN (1 << 2)/** Stopped: underrun (playback) or overrun (capture) detected */
    

MIXER

目前mixer只需支持音量控制

typedef struct sm_elem_ops {
    int (*set_dB)(snd_mixer_elem_t *elem, int l_dB, int r_dB);
    int (*volume_to_dB)(snd_mixer_elem_t *elem, int value);
} sm_elem_ops_t;
  • set_dB

    设置增益

  • volume_to_dB

    音量0-100转化为对应增益值

对接完成后提供声卡注册接口snd_card_register(NULL),应用层完成声卡注册

#include <devices/drv_snd_pangu.h>

void board_yoc_init()
{
    snd_card_register(NULL);
}

results matching ""

    No results matching ""