这是我的声卡初始化函数。
首先,我设置所需的参数。
static
int init_soundcard (snd_pcm_t *handle, unsigned *rate, uint8_t channels,
snd_pcm_uframes_t *nframes, unsigned *period)
{
snd_pcm_hw_params_t *hwparams;
int err;
snd_pcm_hw_params_alloca(&hwparams);
err = snd_pcm_hw_params_any(handle, hwparams);
if (err < 0) return err;
err = snd_pcm_hw_params_set_rate_near(handle, hwparams, rate, NULL);
if (err < 0) return err;
err = snd_pcm_hw_params_set_access(handle, hwparams,
SND_PCM_ACCESS_RW_INTERLEAVED);
if (err < 0) return err;
err = snd_pcm_hw_params_set_format(handle, hwparams,
SND_PCM_FORMAT_S16_LE);
if (err < 0) return err;
err = snd_pcm_hw_params_set_channels(handle, hwparams, channels);
if (err < 0) return err;
当每个参数都被正确设置后,这些参数将应用于句柄:
err = snd_pcm_hw_params(handle, hwparams);
if (err < 0) return err;
应用之后,勇敢的程序员可以按以下方式获取所需数据:
get_period_size_min() 返回包含采样的缓冲区的最小帧大小。具有此大小的缓冲区足够宽。
err = snd_pcm_hw_params_get_period_size_min(hwparams, nframes, NULL);
if (err < 0) return err;
这是相当反直觉的,但正确的采样周期并不是像人们可能认为的那样由1/rate给出的。可以通过使用get_period_time()原语来获得采样周期!
err = snd_pcm_hw_params_get_period_time(hwparams, period, NULL);
if (err < 0) return err;
return 0;
}
snd_uframe_t
(对于*_size)和unsigned
(对于*_time)清晰地表示,但我不明白“缓冲时间”和“周期大小”的含义。 - Dacav