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