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: vorbis coded test suite using vorbisfile cannam@86: last mod: $Id: test.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: cannam@86: #include "util.h" cannam@86: #include "write_read.h" cannam@86: cannam@86: #define DATA_LEN 2048 cannam@86: cannam@86: #define MAX(a,b) ((a) > (b) ? (a) : (b)) cannam@86: cannam@86: cannam@86: static int check_output (const float * data_in, unsigned len, float allowable); cannam@86: cannam@86: int cannam@86: main(void){ cannam@86: static float data_out [DATA_LEN] ; cannam@86: static float data_in [DATA_LEN] ; cannam@86: cannam@86: /* Do safest and most used sample rates first. */ cannam@86: int sample_rates [] = { 44100, 48000, 32000, 22050, 16000, 96000 } ; cannam@86: unsigned k ; cannam@86: int errors = 0 ; cannam@86: int ch; cannam@86: cannam@86: gen_windowed_sine (data_out, ARRAY_LEN (data_out), 0.95); cannam@86: cannam@86: for(ch=1;ch<=8;ch++){ cannam@86: float q=-.05; cannam@86: printf("\nTesting %d channel%s\n\n",ch,ch==1?"":"s"); cannam@86: while(q<1.){ cannam@86: for (k = 0 ; k < ARRAY_LEN (sample_rates); k ++) { cannam@86: char filename [64] ; cannam@86: snprintf (filename, sizeof (filename), "vorbis_%dch_q%.1f_%u.ogg", ch,q*10,sample_rates [k]); cannam@86: cannam@86: printf (" %-20s : ", filename); cannam@86: fflush (stdout); cannam@86: cannam@86: /* Set to know value. */ cannam@86: set_data_in (data_in, ARRAY_LEN (data_in), 3.141); cannam@86: cannam@86: write_vorbis_data_or_die (filename, sample_rates [k], q, data_out, ARRAY_LEN (data_out),ch); cannam@86: read_vorbis_data_or_die (filename, sample_rates [k], data_in, ARRAY_LEN (data_in)); cannam@86: cannam@86: if (check_output (data_in, ARRAY_LEN (data_in), (.15f - .1f*q)) != 0) cannam@86: errors ++ ; cannam@86: else { cannam@86: puts ("ok"); cannam@86: remove (filename); cannam@86: } cannam@86: } cannam@86: q+=.1; cannam@86: } cannam@86: } cannam@86: cannam@86: if (errors) cannam@86: exit (1); cannam@86: cannam@86: return 0; cannam@86: } cannam@86: cannam@86: static int cannam@86: check_output (const float * data_in, unsigned len, float allowable) cannam@86: { cannam@86: float max_abs = 0.0 ; cannam@86: unsigned k ; cannam@86: cannam@86: for (k = 0 ; k < len ; k++) { cannam@86: float temp = fabs (data_in [k]); cannam@86: max_abs = MAX (max_abs, temp); cannam@86: } cannam@86: cannam@86: if (max_abs < 0.95-allowable) { cannam@86: printf ("Error : max_abs (%f) too small.\n", max_abs); cannam@86: return 1 ; cannam@86: } else if (max_abs > .95+allowable) { cannam@86: printf ("Error : max_abs (%f) too big.\n", max_abs); cannam@86: return 1 ; cannam@86: } cannam@86: cannam@86: return 0 ; cannam@86: } cannam@86: