ALSA编程之libasound2库的使用——controls篇

说明

在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_INTEGER64

  • snd_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_SEQUENCER

  • snd_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 idx, snd_ctl_elem_i
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Linux系统中使用ALSA(Advanced Linux Sound Architecture)进行录音是一个相对简单的过程。ALSALinux内核中的一种音频驱动框架,提供了对音频硬件的底层控制和访问接口。 要使用ALSA录音,需要进行以下步骤: 1. 打开音频设备:首先需要打开音频设备以开始录音。可以使用`snd_pcm_open()`函数来打开默认音频设备。例如,可以使用如下代码打开默认的音频捕获设备: ```C++ snd_pcm_t* handle; int err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_CAPTURE,0); if(err < 0) { // 错误处理 } ``` 2. 配置硬件参数:在打开音频设备后,需要通过设置硬件参数来配置录音质量。可以使用`snd_pcm_hw_params_t`类型的变量来设置参数。例如,可以使用如下代码配置采样率为44.1kHz,通道数为2的参数: ```C++ snd_pcm_hw_params_t *params; int err = snd_pcm_hw_params_malloc(&params); if (err < 0) { // 错误处理 } err = snd_pcm_hw_params_any(handle, params); if (err < 0) { // 错误处理 } err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED); if (err < 0) { // 错误处理 } err = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE); if (err < 0) { // 错误处理 } unsigned int rate = 44100; err = snd_pcm_hw_params_set_rate_near(handle, params, &rate, 0); if (err < 0) { // 错误处理 } unsigned int channels = 2; err = snd_pcm_hw_params_set_channels(handle, params, channels); if (err < 0) { // 错误处理 } err = snd_pcm_hw_params(handle, params); if (err < 0) { // 错误处理 } ``` 3. 录音处理:在配置完硬件参数后,可以使用`snd_pcm_readi()`函数来读取音频数据进行录音。例如,可以使用如下代码读取音频数据并输出到文件中: ```C++ FILE *file; file = fopen("recording.wav", "w"); if (file == NULL) { // 错误处理 } char buffer[1024]; int frames = 1024; int err; while (1) { err = snd_pcm_readi(handle, buffer, frames); if (err == -EPIPE) { // 捕获到溢出错误,需要进行错误处理 } else if (err < 0) { // 其他错误处理 } else { fwrite(buffer, sizeof(char), frames, file); } } fclose(file); ``` 4. 关闭音频设备:录音完成后,需要关闭音频设备以释放资源。可以使用`snd_pcm_close()`函数来关闭音频设备。例如,可以使用如下代码关闭音频设备: ```C++ snd_pcm_close(handle); ``` 以上就是在Linux系统下使用ALSA录音的简要步骤。通过控制音频设备和配置参数,我们可以实现自定义的录音功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值