无法使用ALSA api播放wav文件

时间:2014-05-05 00:04:33

标签: 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

我没有改变缓冲区大小或周期大小。我的hw设备的周期大小是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));
    }

}

由于wav文件是8位PCM Mono,帧大小为1字节,因此该文件的数据大小为24569帧。使用默认的period_size,writei()= period_size * channels = 4096的缓冲区大小。 所以我需要6次调用writei()来播放整个文件。但是当我这样做时,我听不到任何声音。知道什么是错的吗?

0 个答案:

没有答案