cannam@86: /******************************************************************** cannam@86: * * cannam@86: * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * cannam@86: * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * cannam@86: * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * cannam@86: * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * cannam@86: * * cannam@86: * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * cannam@86: * by the Xiph.Org Foundation http://www.xiph.org/ * cannam@86: * * cannam@86: ******************************************************************** cannam@86: cannam@86: function: utility functions for vorbis codec test suite. cannam@86: last mod: $Id: util.c 13293 2007-07-24 00:09:47Z erikd $ cannam@86: cannam@86: ********************************************************************/ cannam@86: cannam@86: #include cannam@86: #include cannam@86: #include cannam@86: #include cannam@86: #include cannam@86: cannam@86: #include cannam@86: #include cannam@86: cannam@86: #include "write_read.h" cannam@86: cannam@86: /* The following function is basically a hacked version of the code in cannam@86: * examples/encoder_example.c */ cannam@86: void cannam@86: write_vorbis_data_or_die (const char *filename, int srate, float q, const float * data, int count, int ch) cannam@86: { cannam@86: FILE * file ; cannam@86: ogg_stream_state os; cannam@86: ogg_page og; cannam@86: ogg_packet op; cannam@86: vorbis_info vi; cannam@86: vorbis_comment vc; cannam@86: vorbis_dsp_state vd; cannam@86: vorbis_block vb; cannam@86: cannam@86: int eos = 0, ret; cannam@86: cannam@86: if ((file = fopen (filename, "wb")) == NULL) { cannam@86: printf("\n\nError : fopen failed : %s\n", strerror (errno)) ; cannam@86: exit (1) ; cannam@86: } cannam@86: cannam@86: /********** Encode setup ************/ cannam@86: cannam@86: vorbis_info_init (&vi); cannam@86: cannam@86: ret = vorbis_encode_init_vbr (&vi,ch,srate,q); cannam@86: if (ret) { cannam@86: printf ("vorbis_encode_init_vbr return %d\n", ret) ; cannam@86: exit (1) ; cannam@86: } cannam@86: cannam@86: vorbis_comment_init (&vc); cannam@86: vorbis_comment_add_tag (&vc,"ENCODER","test/util.c"); cannam@86: vorbis_analysis_init (&vd,&vi); cannam@86: vorbis_block_init (&vd,&vb); cannam@86: cannam@86: ogg_stream_init (&os,12345678); cannam@86: cannam@86: { cannam@86: ogg_packet header; cannam@86: ogg_packet header_comm; cannam@86: ogg_packet header_code; cannam@86: cannam@86: vorbis_analysis_headerout (&vd,&vc,&header,&header_comm,&header_code); cannam@86: ogg_stream_packetin (&os,&header); cannam@86: ogg_stream_packetin (&os,&header_comm); cannam@86: ogg_stream_packetin (&os,&header_code); cannam@86: cannam@86: /* Ensures the audio data will start on a new page. */ cannam@86: while (!eos){ cannam@86: int result = ogg_stream_flush (&os,&og); cannam@86: if (result == 0) cannam@86: break; cannam@86: fwrite (og.header,1,og.header_len,file); cannam@86: fwrite (og.body,1,og.body_len,file); cannam@86: } cannam@86: cannam@86: } cannam@86: cannam@86: { cannam@86: /* expose the buffer to submit data */ cannam@86: float **buffer = vorbis_analysis_buffer (&vd,count); cannam@86: int i; cannam@86: cannam@86: for(i=0;i 0 && read_total < count) { cannam@86: int bout = samples < count ? samples : count; cannam@86: bout = read_total + bout > count ? count - read_total : bout; cannam@86: cannam@86: memcpy (data + read_total, pcm[0], bout * sizeof (float)) ; cannam@86: cannam@86: vorbis_synthesis_read (&vd,bout); cannam@86: read_total += bout ; cannam@86: } cannam@86: } cannam@86: } cannam@86: cannam@86: if (ogg_page_eos (&og)) eos = 1; cannam@86: } cannam@86: } cannam@86: cannam@86: if (!eos) { cannam@86: buffer = ogg_sync_buffer (&oy,4096); cannam@86: bytes = fread (buffer,1,4096,file); cannam@86: ogg_sync_wrote (&oy,bytes); cannam@86: if (bytes == 0) eos = 1; cannam@86: } cannam@86: } cannam@86: cannam@86: ogg_stream_clear (&os); cannam@86: cannam@86: vorbis_block_clear (&vb); cannam@86: vorbis_dsp_clear (&vd); cannam@86: vorbis_comment_clear (&vc); cannam@86: vorbis_info_clear (&vi); cannam@86: } cannam@86: done_decode: cannam@86: cannam@86: /* OK, clean up the framer */ cannam@86: ogg_sync_clear (&oy); cannam@86: cannam@86: fclose (file) ; cannam@86: } cannam@86: