说明
在Linux环境下,alsa()是用来驱动声卡的相当不错的方案,涉及到声卡参数调节,播放声音,录音等功能,均可以使用libasound很好的解决
预备知识
1. 几个常用的结构体类型
- snd_ctl_t : CTL类型
- snd_ctl_card_info_t : CTL 卡类型
- snd_ctl_elem_list_t: CTL 元素列表类型
- snd_ctl_elem_t: CTL元素类型
- snd_ctl_elem_info_t: CTL 元素信息类型
- snd_ctl_elem_value_t: CTL 元素值类型
2. 几个常用的枚举类型
snd_ctl_elem_type_t : CTL元素类别类型
SND_CTL_ELEM_TYPE_NONE = 0,
SND_CTL_ELEM_TYPE_INTEGER,
SND_CTL_ELEM_TYPE_ENUMERATED,
SND_CTL_ELEM_TYPE_BYTES,
SND_CTL_ELEM_TYPE_INTEGER64,
SND_CTL_ELEM_TYPE_LAST = SND_CTL_ELEM_TYPE_INTEGER64snd_ctl_elem_iface_t : CTL元素的 interface类别类型
SND_CTL_ELEM_IFACE_CARD = 0,
SND_CTL_ELEM_IFACE_MIXER,
SND_CTL_ELEM_IFACE_PCM,
SND_CTL_ELEM_IFACE_RAWMIDI,
SND_CTL_ELEM_IFACE_SEQUENCER,
SND_CTL_ELEM_IFACE_LAST = SND_CTL_ELEM_IFACE_SEQUENCERsnd_ctl_event_type_t : CTL事件类别类型
SND_CTL_EVENT_ELEM = 0,
SND_CTL_EVENT_LAST = SND_CTL_EVENT_ELEM- snd_ctl_type_t : CTL类别类型
SND_CTL_TYPE_HW,
SND_CTL_TYPE_INET,
SND_CTL_TYPE_EXT
常用的api
声卡
int snd_card_next(int *card) // 查找声卡
int snd_card_load(int card) // 加载声卡驱动
int snd_card_get_name(int card, char **name) // 获取声卡名
int snd_card_get_index(const char *name) // 根据声卡名获取声卡索引
CTL
int snd_ctl_open(snd_ctl_t **ctl, const char *name, int mode) // 打开一个CTL并自动分配CTL空间, name大致格式为"hw:0", mode 一般又两个值 SND_CTL_NONBLOCK和SND_CTL_AYSNC
int snd_ctl_close(snd_ctl_t *ctl) // 关闭已打开的CTL
CTL 卡信息
int snd_ctl_card_info_malloc (snd_ctl_card_info_t **ptr) // 申请一个CTL卡信息空间
void snd_ctl_card_info_free (snd_ctl_card_info_t *obj) // 释放掉CTL卡信息的空间
void snd_ctl_card_info_clear (snd_ctl_card_info_t *obj) // 清除掉CTL卡信息中已有的信息
void snd_ctl_card_info_copy (snd_ctl_card_info_t *dst, const snd_ctl_card_info_t *src) // 拷贝
int snd_ctl_card_info_get_card (const snd_ctl_card_info_t *obj) // 获取卡号
const char * snd_ctl_card_info_get_id (const snd_ctl_card_info_t *obj) // 获取卡的id名称
const char * snd_ctl_card_info_get_driver (const snd_ctl_card_info_t *obj) //获取卡的驱动名称
const char * snd_ctl_card_info_get_name (const snd_ctl_card_info_t *obj) // 获取卡名字
const char * snd_ctl_card_info_get_longname (const snd_ctl_card_info_t *obj)// 获取卡名字的较长版本
const char * snd_ctl_card_info_get_mixername (const snd_ctl_card_info_t *obj) //获取卡信息中的mixer名字
const char * snd_ctl_card_info_get_components (const snd_ctl_card_info_t *obj) // 获取卡信息中的组件列表
CTL元素列表
int snd_ctl_elem_list_malloc (snd_ctl_elem_list_t **ptr) // 申请一个列表空间
void snd_ctl_elem_list_free (snd_ctl_elem_list_t *obj) // 给已申请空间的列表释放空间
void snd_ctl_elem_list_clear (snd_ctl_elem_list_t *obj) // 清楚列表中的信息
void snd_ctl_elem_list_copy (snd_ctl_elem_list_t *dst, const snd_ctl_elem_list_t *src) // 拷贝列表
void snd_ctl_elem_list_set_offset (snd_ctl_elem_list_t *obj, unsigned int val) // 设置第一个元素的索引偏移
unsigned int snd_ctl_elem_list_get_used (const snd_ctl_elem_list_t *obj) // 获取已使用的元素数量
unsigned int snd_ctl_elem_list_get_count (const snd_ctl_elem_list_t *obj) // 获取实际存在的CTL元素总数量
void snd_ctl_elem_list_get_id (const snd_ctl_elem_list_t *obj, unsigned int