Я декодирую формат Vorbis на языке C, используя библиотеку Vorbis и воспроизводя аудио через alsa.Аудиоданные копируются в буфер и затем передаются в ov_open_callback.Пока вызывается ov_open_callback, он выдает ошибку сегментации.
void *buffer ;
OggVorbis_File vf;
int eof = 0;
int current_section;
ret = ov_open_callbacks(&buffer, &vf, NULL, 0, OV_CALLBACKS_STREAMONLY_NOCLOSE);
printf("ret = %d\n",ret );
vorbis_info *vi = ov_info(&vf, -1);
fprintf(stderr, "Bitstream is %d channel, %ldHz\n",
vi->channels, vi->rate);
fprintf(stderr, "Encoded by: %s\n\n",
ov_comment(&vf, -1)->vendor);
while(!eof)
{
long ret = ov_read(&vf, buffer, 4096, 0, 2, 1,
¤t_section);
if(ret == 0)
{
/* EOF */
eof = 1;
}
else if(ret < 0)
{
/* error in the stream. */
} else
{
frames = snd_pcm_writei(handle, buffer, ret/4);
if(frames < 0)
frames = snd_pcm_recover(handle, frames,
0);
if(frames < 0) {
printf("snd_pcm_writei failed: %s\n",
snd_strerror(err));
break;
}
if(frames > 0 && frames < 4096)
printf("Short write (expected %li, wrote %li)\n",
ret, frames);
}
}
ov_clear(&vf);
snd_pcm_close(handle);