这是我的声卡初始化函数。
首先我设置了需要的参数
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;
}