使用 ALSA 的 lib 库中的 snd_pcm_xxx 等标准接口函数,操作 /dev/snd/pcmC0D0c或pcmC0D0p 等录放音设备节点,相当于在 OSS 框架下通过 ioctl 设置不同参数去操作 /dev/dsp 设备
ALSA功能丰富,可以设置音频参数,DMA buffer 大小、分块数量,buffer 阀值等
函数原型:snd_pcm_open(&handle, pcm_name, stream, open_mode);
函数功能:打开pcm设备
参数含义:
&handle:static snd_pcm_t *handle 结构体指针
pcm_name:打开的pcm设备节点,可以是“default” ,也可以是“hw:0,0”
stream:对应放音与录音操作,SND_PCM_STREAM_PLAYBACK,SND_PCM_STREAM_CAPTURE
open_mode:一些相关功能设置,比如:是否阻塞,是否重采样,是否软件调音量等
函数原型:snd_pcm_info(handle, info);
函数功能:用来获取录放音、声卡与设备等相关信息,不是必须的接口
参数含义:
handle:static snd_pcm_t *handle 结构体指针
info:设备信息
函数原型:snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size);
函数功能:播放交错格式的音频数据
参数含义:
pcm:pcm设备
buffer:数据地址
size:数据大小
函数原型:snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size);
函数功能:录制交错格式的音频数据
参数含义:
pcm:pcm设备
buffer:数据地址
size:数据大小
函数原型:snd_pcm_drain(handle);
函数功能:等待buffer中的数据全部播放完成
参数含义:
handle:句柄
函数原型:snd_pcm_drop(handle);
函数功能:不等待buffer数据播放完成,马上停止
参数含义:
handle:句柄
函数原型:snd_pcm_hw_params_set_rate_resample(handle, params, soft_resample);
函数功能:设置采样率
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_close(handle);
函数功能:关闭pcm handle
参数含义:
handle:static snd_pcm_t *handle 结构体指针
函数原型:snd_pcm_hw_params_set_channels(handle, params, hwparams.channels);
函数功能:设置声道数
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_hw_params_set_rate_near(handle, params, &hwparams.rate, 0);
函数功能:设置采样率,之所以是rate_near,是因为上层设置的采样率&hwparams.rate,底层很可能不支持,因此,会返回上层一个底层支持的相近的采样率
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_hw_params_get_buffer_time_max(params, &buffer_time, 0);
函数功能:获取底层支持的最大buffer大小,换算为时间
参数含义:
params:参数
函数原型:snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, 0);
函数功能:设置底层period区间大小,以时间为单位,之所以为time_near,是因为上层设置的大小很可能底层不支持,底层会返回相近的&period_time
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_hw_params_set_period_size_near(handle, params, &period_frames, 0);
函数功能:设置底层period区间大小,以字节为单位,size_near,原因类似。该接口与set_period_time_near接口,都是设置period大小,只是单位不同,二选一即可
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, 0);
函数功能:设置底层buffer区间大小,以时间为单位。与上面接口类似。在底层,buffer是一个大DMA空间,而period是将buffer平均分成的几个小区间
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_hw_params_set_buffer_size_near(handle, params, &buffer_frames);
函数功能:与上类似,上面设置完成后,都需要调用下面两个函数,获取最终设置的period与buffer大小
1、snd_pcm_hw_params_get_period_size(params, &chunk_size, 0);
2、snd_pcm_hw_params_get_buffer_size(params, &buffer_size);
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_hw_params_set_format(handle, params, hwparams.format);
函数功能:设置采样位宽格式
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_hw_params_can_pause(params);
函数功能:查询底层是否支持暂停
参数含义:
params:参数
函数原型: snd_pcm_hw_params(handle, params);
函数功能:将上面设置的硬件配置参数,加载,并且会自动调用snd_pcm_prepare( )将stream状态置为SND_PCM_STATE_PREPARED
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_sw_params_alloca(&swparams);
函数功能:申请一段空间,存放软件配置参数
参数含义:
swparams:软件配置参数
函数原型:snd_pcm_sw_params_current(handle, swparams);
函数功能:获取当前的软件参数配置
参数含义:
handle:static snd_pcm_t *handle 结构体指针
swparams:软件配置参数
函数原型:snd_pcm_sw_params_set_avail_min(handle, swparams, n);
函数功能:阻塞模式下,设置已缓存一定buffer大小后开始下一次取数据
参数含义:
handle:static snd_pcm_t *handle 结构体指针
swparams:软件配置参数
n:块数量
函数原型:snd_pcm_sw_params_set_start_threshold(handle, swparams, start_threshold);
函数功能:设置开始的阀值,可以起到预缓冲的效果。对于放音,当上层调用snd_pcm_writei超过阀值时,才会启动播放
参数含义:
handle:static snd_pcm_t *handle 结构体指针
swparams:软件配置参数
start_threshold:阈值
函数原型:snd_pcm_sw_params_set_stop_threshold(handle, swparams, stop_threshold);
函数功能:设置停止的阀值,避免硬件上的underrun或overrun出现
参数含义:
handle:static snd_pcm_t *handle 结构体指针
swparams:软件配置参数
start_threshold:阈值
函数原型:snd_pcm_sw_params(handle, swparams);
函数功能:将上面的软件参数,加载到底层
参数含义:
swparams:软件配置参数
函数原型:snd_pcm_hw_params_any(handle, params);
函数功能:初始化pcm属性
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_hw_params_set_access(handle, params,SND_PCM_ACCESS_RW_INTERLEAVED);
函数功能:设置为交错方式
参数含义:
handle:static snd_pcm_t *handle 结构体指针
params:参数
函数原型:snd_pcm_format_set_silence(snd_pcm_format_t format, void *data, unsigned int samples);
函数功能:用于将某个buffer中的数据,转换为静音,也就是0
参数含义:
format:格式
data:数据地址
samples:数据大小
函数原型:snd_pcm_nonblock(handle, 0);
函数功能:打开或关闭阻塞模式。0,为阻塞模式,1,为非阻塞模式
参数含义:
handle:句柄
函数原型:snd_pcm_nonblock(handle, 1);
函数功能:如果需要非阻塞方式,则将第二个参数,设置为1。snd_pcm_open后,默认为阻塞方式,因此,该接口可以不用调用
参数含义:
handle:static snd_pcm_t *handle 结构体指针
函数原型:`snd_pcm_hw_params_alloca(¶ms);
函数功能:申请一段snd_pcm_hw_params_t *params;结构体空间。使用该结构体,来配置底层ALSA的相关硬件参数,比如:声道,采样率,位宽,buffer大小等
参数含义:
params:参数