Linux下使用ALSA来播放声音 - 基本使用方法

时间:2021-08-17 03:59:06

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参数。
如果使用默认的BLOCK模式, 则此writei函数会阻塞直到写入成功。当写入成功时, 返回值rc总是等于传入的frame数。

当为NON-BLOCK模式时,如果内部缓冲区满,则返回-EAGAIN (-11)。注意EAGAIN=11,需要加一个负号。

这个函数要么完全写入,要么返回-EAGAIN,不会发生只写入一部分的情况。

 

Linux下使用ALSA来播放声音 - 基本使用方法"极星亲友定位":  简单实用,是一款适用于家人、朋友间的定位软件,实时查询对方的位置并以地图方式展示。非常适合用于家人间使用,少一份担心,多一份安全保证,能及时知道家人的去向,能避免找不到孩子、老人等情形。

(其实时性、自动特性,可以在很大程度上保证家人遇到危险时不掉链子)

不需要对方会使用智能手机,因为软件可以设置白名单自动回复,不需要对方作任何操作就能获取对方的位置。
不需要对方打开软件回复,也不需要事先启动软件。

下载位置:360市场(可以用360手机助手下载, 关键词“极星”,“极星亲友定位”) 

- 双方只要安装了本软件,并打开了GPS功能(一般手机都已经打开了),即输入对方手机号、查询位置。
- 可以从通讯录中选择联系人,或从“最近联系人”菜单中直接选择。
- 白名单用于指定受信任的联系人,对他们的查询请求会自动回复。
- 集成地图展示功能,如果手机已经安装了百度地图软件,则可以在地图上展示对方的位置。
- 可以防止误操作:发送按钮采用延时反应设计,只有在按下约1秒后才算是确认发送,并以振动和文字提示您发送成功。

----------------------------------------------------------------------------------------------------------------------------------