Audio 无法使用ALSA api播放wav文件

Audio 无法使用ALSA api播放wav文件,audio,alsa,Audio,Alsa,我正在读取一个wav文件,并尝试使用writei()方法使用alsa api播放它。 Wav文件头具有以下值 Audio Format: 1 (PCM) Num Channels: 1 Sample Rate: 11025 Byte Rate: 11025 Block Align: 1 Bits Per Sample: 8 Subchunk2 id: 0x61746164 Subchunk2 Size: 24569 我没有更改缓冲区大小或周期大小。我的硬件设备的周期大小是4096(我使用snd

我正在读取一个wav文件,并尝试使用writei()方法使用alsa api播放它。 Wav文件头具有以下值

Audio Format: 1 (PCM)
Num Channels: 1
Sample Rate: 11025
Byte Rate: 11025
Block Align: 1
Bits Per Sample: 8
Subchunk2 id: 0x61746164
Subchunk2 Size: 24569
我没有更改缓冲区大小或周期大小。我的硬件设备的周期大小是4096(我使用snd_pcm_hw_params_get_Period_size()读取它)

调用writei()看起来像

//buff_size = period_size * size of each frame = 4096 * 1 bytes;
int16_t* buff = (int16_t *) malloc(buff_size);


for(i = 0; i < 6; ++i){
     memcpy(buff, &samples[i*period_size], buff_size);

    if (err = snd_pcm_writei(pcm, buff, period_size) == -EPIPE) {
    printf("XRUN.\n");
    snd_pcm_prepare(pcm);
    } else if (err < 0) {
    printf("ERROR. Can't write to PCM device. %s\n", snd_strerror(err));
    }

}
//buff\u size=period\u size*每帧大小=4096*1字节;
int16*buff=(int16*t*)malloc(buff*size);
对于(i=0;i<6;++i){
memcpy(buff,&样本[i*周期大小],buff大小);
if(err=snd\u pcm\u writei(pcm,buff,period\u size)==-EPIPE){
printf(“XRUN.\n”);
snd_pcm_prepare(pcm);
}否则如果(错误<0){
printf(“错误。无法写入PCM设备。%s\n”,snd_strerror(err));
}
}
由于wav文件是8位PCM单声道,帧大小为1字节,因此该文件的数据大小为24569帧。使用默认的周期大小,writei()的缓冲区大小=周期大小*通道=4096。
所以我需要6次调用writei()来播放整个文件。但当我这么做的时候,我什么也听不见。知道怎么回事吗?

缓冲区和周期大小通常不是固定的;您应该选择适当的值。您不需要以周期大小的块写入数据。您的错误检查错误或丢失。但是,实际的错误可能在程序的其他部分。@CL我使用了
snd\u pcm\u drain()
,现在我可以听到wav文件。现在我想弄明白为什么它会起作用?我知道尝试随机的东西不是一个好方法,但我找不到关于alsa的好文档,所以我只是想从我在网上找到的例子中找出答案。对于错误检查,我很抱歉,但我只是想让基本代码正常工作。实际错误在设置启动阈值的程序部分。