重点设置参数。
帧,声道数,采样率,采样精度。
为什么要设置这些东西呢?
缓存大小 = 帧*声道数*采样精度/8;
每一个周期产生一个硬件中断,把缓冲区的数据读或者写入到声卡缓冲区中,程序中自己设置的缓冲区大小为: 帧数*声道数*采样精度/8。这些参数必须设置正确,否则无法正常工作。帧数如果设置太大,可能无法产生中断,没有中断就无法播放或者录音。
参考设置代码如下
rc = snd_pcm_open(&handle, "default",SND_PCM_STREAM_PLAYBACK, 0);
if (rc < 0) {
fprintf(stderr, "unable to open pcm device: %s/n",
snd_strerror(rc));
exit(1);
}
/* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(¶ms);
/* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params);
/* Set the desired hardware parameters. */
/* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED);
/* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params,
SND_PCM_FORMAT_S16_LE);
/* Two channels (stereo) */
snd_pcm_hw_params_set_channels(handle, params, 2);
/* 44100 bits/second sampling rate (CD quality) */
val = 44100;
snd_pcm_hw_params_set_rate_near(handle, params,
&val, &dir);
/* Set period size to 32 frames. */
frames = 16; //设置不同值可以测试播放音频是否正常。
snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir); //
printf("frames is %d\n",(int)frames);
/* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < 0) {
fprintf(stderr, "unable to set hw parameters: %s/n", snd_strerror(rc));
exit(1);
}
/* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(params, &frames,
&dir);
size = frames * 4; /* 2 bytes/sample, 2 channels */
buffer = (char *) malloc(size);