1. 打开设备
snd_pcm_t *handle;
/* Open PCM device for playback. */
rc = snd_pcm_open(&handle,
"default",
SND_PCM_STREAM_PLAYBACK, 0);
if (rc < 0)
{
}
默认是block阻塞方式读写,可以设置成non-block模式。
SND_PCM_NONBLOCK
或
snd_pcm_nonblock()
2. 非阻塞方式写入(一般来说按阻塞方式来写代码就好了,ALSA里面已经写好了,就不要自己做重试操作了)
就是过一段时再尝试的意思
int rc = snd_pcm_writei(handle, buf, n /4 );
printf("done. rc=%d\n", rc);
while(rc < 0)
{
if(rc == -EAGAIN )
{
int ms = 20;
timespec ts;
ts.tv_sec = ms / 1000;
ts.tv_nsec = (ms % 1000) * 1000000;
nanosleep(&ts, NULL);
rc = snd_pcm_writei(handle, buf, n /4 );
}
}
第三个参数是frame的个数。对于一个S16 / Stereo的音频, 其frame = 2 * 2 = 4,即微软定义的BlockAlign参数。