18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/******************************************************************** 28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * 48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * 98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/ * 108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ******************************************************************** 128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: utility functions for vorbis codec test suite. 148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: util.c 13293 2007-07-24 00:09:47Z erikd $ 158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/ 178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdio.h> 198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdlib.h> 208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <math.h> 218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <string.h> 228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <errno.h> 238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <vorbis/codec.h> 258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <vorbis/vorbisenc.h> 268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "write_read.h" 288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* The following function is basically a hacked version of the code in 308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * examples/encoder_example.c */ 318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvoid 328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelswrite_vorbis_data_or_die (const char *filename, int srate, float q, const float * data, int count, int ch) 338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels{ 348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels FILE * file ; 358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_state os; 368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_page og; 378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_packet op; 388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info vi; 398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_comment vc; 408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_dsp_state vd; 418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_block vb; 428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int eos = 0, ret; 448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if ((file = fopen (filename, "wb")) == NULL) { 468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels printf("\n\nError : fopen failed : %s\n", strerror (errno)) ; 478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit (1) ; 488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /********** Encode setup ************/ 518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info_init (&vi); 538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ret = vorbis_encode_init_vbr (&vi,ch,srate,q); 558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (ret) { 568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels printf ("vorbis_encode_init_vbr return %d\n", ret) ; 578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit (1) ; 588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_comment_init (&vc); 618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_comment_add_tag (&vc,"ENCODER","test/util.c"); 628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_analysis_init (&vd,&vi); 638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_block_init (&vd,&vb); 648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_init (&os,12345678); 668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_packet header; 698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_packet header_comm; 708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_packet header_code; 718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_analysis_headerout (&vd,&vc,&header,&header_comm,&header_code); 738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_packetin (&os,&header); 748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_packetin (&os,&header_comm); 758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_packetin (&os,&header_code); 768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* Ensures the audio data will start on a new page. */ 788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while (!eos){ 798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int result = ogg_stream_flush (&os,&og); 808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (result == 0) 818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels break; 828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fwrite (og.header,1,og.header_len,file); 838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fwrite (og.body,1,og.body_len,file); 848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* expose the buffer to submit data */ 908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float **buffer = vorbis_analysis_buffer (&vd,count); 918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int i; 928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<ch;i++) 948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels memcpy (buffer [i], data, count * sizeof (float)) ; 958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* tell the library how much we actually submitted */ 978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_analysis_wrote (&vd,count); 988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_analysis_wrote (&vd,0); 998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while (vorbis_analysis_blockout (&vd,&vb) == 1) { 1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_analysis (&vb,NULL); 1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_bitrate_addblock (&vb); 1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while (vorbis_bitrate_flushpacket (&vd,&op)) { 1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_packetin (&os,&op); 1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while (!eos) { 1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int result = ogg_stream_pageout (&os,&og); 1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (result == 0) 1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels break; 1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fwrite (og.header,1,og.header_len,file); 1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fwrite (og.body,1,og.body_len,file); 1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (ogg_page_eos (&og)) 1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels eos = 1; 1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_clear (&os); 1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_block_clear (&vb); 1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_dsp_clear (&vd); 1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_comment_clear (&vc); 1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info_clear (&vi); 1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fclose (file) ; 1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* The following function is basically a hacked version of the code in 1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * examples/decoder_example.c */ 1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvoid 1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsread_vorbis_data_or_die (const char *filename, int srate, float * data, int count) 1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels{ 1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_sync_state oy; 1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_state os; 1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_page og; 1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_packet op; 1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info vi; 1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_comment vc; 1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_dsp_state vd; 1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_block vb; 1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels FILE *file; 1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels char *buffer; 1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int bytes; 1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int eos = 0; 1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int i; 1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int read_total = 0 ; 1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if ((file = fopen (filename, "rb")) == NULL) { 1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels printf("\n\nError : fopen failed : %s\n", strerror (errno)) ; 1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit (1) ; 1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_sync_init (&oy); 1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* fragile! Assumes all of our headers will fit in the first 8kB, 1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels which currently they will */ 1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels buffer = ogg_sync_buffer (&oy,8192); 1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels bytes = fread (buffer,1,8192,file); 1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_sync_wrote (&oy,bytes); 1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ogg_sync_pageout (&oy,&og) != 1) { 1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(bytes < 8192) { 1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels printf ("Out of data.\n") ; 1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto done_decode ; 1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf (stderr,"Input does not appear to be an Ogg bitstream.\n"); 1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit (1); 1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_init (&os,ogg_page_serialno(&og)); 1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info_init (&vi); 1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_comment_init (&vc); 1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (ogg_stream_pagein (&os,&og) < 0) { 1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf (stderr,"Error reading first page of Ogg bitstream data.\n"); 1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit (1); 1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (ogg_stream_packetout(&os,&op) != 1) { 1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf (stderr,"Error reading initial header packet.\n"); 1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit (1); 1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (vorbis_synthesis_headerin (&vi,&vc,&op) < 0) { 1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf (stderr,"This Ogg bitstream does not contain Vorbis " 1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels "audio data.\n"); 1938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit (1); 1948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels i = 0; 1978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while ( i < 2) { 1988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while (i < 2) { 1998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int result = ogg_sync_pageout (&oy,&og); 2018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(result == 0) 2028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels break; 2038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(result==1) { 2048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_pagein(&os,&og); 2058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while (i < 2) { 2078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels result = ogg_stream_packetout (&os,&op); 2088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (result == 0) break; 2098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (result < 0) { 2108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf (stderr,"Corrupt secondary header. Exiting.\n"); 2118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit(1); 2128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_synthesis_headerin (&vi,&vc,&op); 2148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels i++; 2158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels buffer = ogg_sync_buffer (&oy,4096); 2208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels bytes = fread (buffer,1,4096,file); 2218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (bytes == 0 && i < 2) { 2228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf (stderr,"End of file before finding all Vorbis headers!\n"); 2238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit (1); 2248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_sync_wrote (&oy,bytes); 2278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (vi.rate != srate) { 2308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels printf ("\n\nError : File '%s' has sample rate of %ld when it should be %d.\n\n", filename, vi.rate, srate); 2318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit (1) ; 2328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_synthesis_init (&vd,&vi); 2358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_block_init (&vd,&vb); 2368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while(!eos) { 2388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while (!eos) { 2398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int result = ogg_sync_pageout (&oy,&og); 2408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (result == 0) 2418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels break; 2428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (result < 0) { 2438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf (stderr,"Corrupt or missing data in bitstream; " 2448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels "continuing...\n"); 2458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } else { 2468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_pagein (&os,&og); 2478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while (1) { 2488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels result = ogg_stream_packetout (&os,&op); 2498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (result == 0) 2518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels break; 2528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (result < 0) { 2538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* no reason to complain; already complained above */ 2548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } else { 2558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float **pcm; 2568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int samples; 2578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (vorbis_synthesis (&vb,&op) == 0) 2598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_synthesis_blockin(&vd,&vb); 2608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while ((samples = vorbis_synthesis_pcmout (&vd,&pcm)) > 0 && read_total < count) { 2618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int bout = samples < count ? samples : count; 2628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels bout = read_total + bout > count ? count - read_total : bout; 2638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels memcpy (data + read_total, pcm[0], bout * sizeof (float)) ; 2658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_synthesis_read (&vd,bout); 2678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels read_total += bout ; 2688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (ogg_page_eos (&og)) eos = 1; 2738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (!eos) { 2778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels buffer = ogg_sync_buffer (&oy,4096); 2788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels bytes = fread (buffer,1,4096,file); 2798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_sync_wrote (&oy,bytes); 2808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (bytes == 0) eos = 1; 2818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_stream_clear (&os); 2858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_block_clear (&vb); 2878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_dsp_clear (&vd); 2888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_comment_clear (&vc); 2898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info_clear (&vi); 2908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdone_decode: 2928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* OK, clean up the framer */ 2948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_sync_clear (&oy); 2958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fclose (file) ; 2978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 2988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 299