概述
本文介绍适配YoC声卡驱动
声卡对接
在yoc声卡移植的过程中,则需要对以下相关接口进行移植实现,包含pcm
及mixer
两部分:
- 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);
}