1b815c7f3Sopenharmony_ci[+ AutoGen5 template c +] 2b815c7f3Sopenharmony_ci/* 3b815c7f3Sopenharmony_ci** Copyright (C) 1999-2013 Erik de Castro Lopo <erikd@mega-nerd.com> 4b815c7f3Sopenharmony_ci** 5b815c7f3Sopenharmony_ci** This program is free software; you can redistribute it and/or modify 6b815c7f3Sopenharmony_ci** it under the terms of the GNU General Public License as published by 7b815c7f3Sopenharmony_ci** the Free Software Foundation; either version 2 of the License, or 8b815c7f3Sopenharmony_ci** (at your option) any later version. 9b815c7f3Sopenharmony_ci** 10b815c7f3Sopenharmony_ci** This program is distributed in the hope that it will be useful, 11b815c7f3Sopenharmony_ci** but WITHOUT ANY WARRANTY; without even the implied warranty of 12b815c7f3Sopenharmony_ci** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13b815c7f3Sopenharmony_ci** GNU General Public License for more details. 14b815c7f3Sopenharmony_ci** 15b815c7f3Sopenharmony_ci** You should have received a copy of the GNU General Public License 16b815c7f3Sopenharmony_ci** along with this program; if not, write to the Free Software 17b815c7f3Sopenharmony_ci** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18b815c7f3Sopenharmony_ci*/ 19b815c7f3Sopenharmony_ci 20b815c7f3Sopenharmony_ci#include "sfconfig.h" 21b815c7f3Sopenharmony_ci 22b815c7f3Sopenharmony_ci#include <stdio.h> 23b815c7f3Sopenharmony_ci#include <stdlib.h> 24b815c7f3Sopenharmony_ci#include <string.h> 25b815c7f3Sopenharmony_ci#include <math.h> 26b815c7f3Sopenharmony_ci#include <inttypes.h> 27b815c7f3Sopenharmony_ci 28b815c7f3Sopenharmony_ci#if HAVE_UNISTD_H 29b815c7f3Sopenharmony_ci#include <unistd.h> 30b815c7f3Sopenharmony_ci#else 31b815c7f3Sopenharmony_ci#include "sf_unistd.h" 32b815c7f3Sopenharmony_ci#endif 33b815c7f3Sopenharmony_ci 34b815c7f3Sopenharmony_ci#include <sndfile.h> 35b815c7f3Sopenharmony_ci 36b815c7f3Sopenharmony_ci#include "utils.h" 37b815c7f3Sopenharmony_ci 38b815c7f3Sopenharmony_ci#define BUFFER_SIZE (1 << 12) 39b815c7f3Sopenharmony_ci 40b815c7f3Sopenharmony_cistatic void lrintf_test (void) ; 41b815c7f3Sopenharmony_ci 42b815c7f3Sopenharmony_ci[+ FOR data_type 43b815c7f3Sopenharmony_ci+]static void pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash) ; 44b815c7f3Sopenharmony_ci[+ ENDFOR data_type 45b815c7f3Sopenharmony_ci+] 46b815c7f3Sopenharmony_cistatic void pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) ; 47b815c7f3Sopenharmony_cistatic void pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) ; 48b815c7f3Sopenharmony_ci 49b815c7f3Sopenharmony_citypedef union 50b815c7f3Sopenharmony_ci{ double d [BUFFER_SIZE + 1] ; 51b815c7f3Sopenharmony_ci float f [BUFFER_SIZE + 1] ; 52b815c7f3Sopenharmony_ci int i [BUFFER_SIZE + 1] ; 53b815c7f3Sopenharmony_ci short s [BUFFER_SIZE + 1] ; 54b815c7f3Sopenharmony_ci} BUFFER ; 55b815c7f3Sopenharmony_ci 56b815c7f3Sopenharmony_ci/* Data written to the file. */ 57b815c7f3Sopenharmony_cistatic BUFFER data_out ; 58b815c7f3Sopenharmony_ci 59b815c7f3Sopenharmony_ci/* Data read back from the file. */ 60b815c7f3Sopenharmony_cistatic BUFFER data_in ; 61b815c7f3Sopenharmony_ci 62b815c7f3Sopenharmony_ciint 63b815c7f3Sopenharmony_cimain (void) 64b815c7f3Sopenharmony_ci{ 65b815c7f3Sopenharmony_ci lrintf_test () ; 66b815c7f3Sopenharmony_ci 67b815c7f3Sopenharmony_ci pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0xa335091249dbfLL) ; 68b815c7f3Sopenharmony_ci pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x48c433d695f3fLL) ; 69b815c7f3Sopenharmony_ci 70b815c7f3Sopenharmony_ci pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xb956c881ebf08LL) ; 71b815c7f3Sopenharmony_ci pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x2f840c55750f8LL) ; 72b815c7f3Sopenharmony_ci 73b815c7f3Sopenharmony_ci pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xb6a759ab496f8LL) ; 74b815c7f3Sopenharmony_ci pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xf3eaf9c30b6f8LL) ; 75b815c7f3Sopenharmony_ci 76b815c7f3Sopenharmony_ci pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xaece1c1c17f08LL) ; 77b815c7f3Sopenharmony_ci pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x9ddf142d0b0f8LL) ; 78b815c7f3Sopenharmony_ci 79b815c7f3Sopenharmony_ci /* Lite remove start */ 80b815c7f3Sopenharmony_ci pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xad04f7554267aLL, SF_FALSE) ; 81b815c7f3Sopenharmony_ci pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xde3e248fa9186LL, SF_FALSE) ; 82b815c7f3Sopenharmony_ci 83b815c7f3Sopenharmony_ci pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x2726f958f669cLL, SF_FALSE) ; 84b815c7f3Sopenharmony_ci pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x3583f8ee51164LL, SF_FALSE) ; 85b815c7f3Sopenharmony_ci 86b815c7f3Sopenharmony_ci pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xad04f7554267aLL, SF_TRUE) ; 87b815c7f3Sopenharmony_ci pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xde3e248fa9186LL, SF_TRUE) ; 88b815c7f3Sopenharmony_ci 89b815c7f3Sopenharmony_ci pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x2726f958f669cLL, SF_TRUE) ; 90b815c7f3Sopenharmony_ci pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x3583f8ee51164LL, SF_TRUE) ; 91b815c7f3Sopenharmony_ci /* Lite remove end */ 92b815c7f3Sopenharmony_ci 93b815c7f3Sopenharmony_ci return 0 ; 94b815c7f3Sopenharmony_ci} /* main */ 95b815c7f3Sopenharmony_ci 96b815c7f3Sopenharmony_ci/*============================================================================================ 97b815c7f3Sopenharmony_ci** Here are the test functions. 98b815c7f3Sopenharmony_ci*/ 99b815c7f3Sopenharmony_ci 100b815c7f3Sopenharmony_cistatic void 101b815c7f3Sopenharmony_cilrintf_test (void) 102b815c7f3Sopenharmony_ci{ int k, items ; 103b815c7f3Sopenharmony_ci float *float_data ; 104b815c7f3Sopenharmony_ci int *int_data ; 105b815c7f3Sopenharmony_ci 106b815c7f3Sopenharmony_ci print_test_name ("lrintf_test", "") ; 107b815c7f3Sopenharmony_ci 108b815c7f3Sopenharmony_ci items = 1024 ; 109b815c7f3Sopenharmony_ci 110b815c7f3Sopenharmony_ci float_data = data_out.f ; 111b815c7f3Sopenharmony_ci int_data = data_in.i ; 112b815c7f3Sopenharmony_ci 113b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 114b815c7f3Sopenharmony_ci float_data [k] = (k * ((k % 2) ? 333333.0 : -333333.0)) ; 115b815c7f3Sopenharmony_ci 116b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 117b815c7f3Sopenharmony_ci int_data [k] = lrintf (float_data [k]) ; 118b815c7f3Sopenharmony_ci 119b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 120b815c7f3Sopenharmony_ci if (fabs (int_data [k] - float_data [k]) > 1.0) 121b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %d).\n", __LINE__, k, float_data [k], int_data [k]) ; 122b815c7f3Sopenharmony_ci exit (1) ; 123b815c7f3Sopenharmony_ci } ; 124b815c7f3Sopenharmony_ci 125b815c7f3Sopenharmony_ci printf ("ok\n") ; 126b815c7f3Sopenharmony_ci} /* lrintf_test */ 127b815c7f3Sopenharmony_ci 128b815c7f3Sopenharmony_ci[+ FOR data_type 129b815c7f3Sopenharmony_ci+]static void 130b815c7f3Sopenharmony_cipcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash) 131b815c7f3Sopenharmony_ci{ SNDFILE *file ; 132b815c7f3Sopenharmony_ci SF_INFO sfinfo ; 133b815c7f3Sopenharmony_ci int k, items, zero_count ; 134b815c7f3Sopenharmony_ci short *short_out, *short_in ; 135b815c7f3Sopenharmony_ci int *int_out, *int_in ; 136b815c7f3Sopenharmony_ci /* Lite remove start */ 137b815c7f3Sopenharmony_ci float *float_out, *float_in ; 138b815c7f3Sopenharmony_ci double *double_out, *double_in ; 139b815c7f3Sopenharmony_ci /* Lite remove end */ 140b815c7f3Sopenharmony_ci 141b815c7f3Sopenharmony_ci print_test_name ("pcm_test_[+ (get "name") +]", filename) ; 142b815c7f3Sopenharmony_ci 143b815c7f3Sopenharmony_ci items = [+ (get "item_count") +] ; 144b815c7f3Sopenharmony_ci 145b815c7f3Sopenharmony_ci short_out = data_out.s ; 146b815c7f3Sopenharmony_ci short_in = data_in.s ; 147b815c7f3Sopenharmony_ci 148b815c7f3Sopenharmony_ci zero_count = 0 ; 149b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 150b815c7f3Sopenharmony_ci { short_out [k] = [+ (get "short_func") +] ; 151b815c7f3Sopenharmony_ci zero_count = short_out [k] ? zero_count : zero_count + 1 ; 152b815c7f3Sopenharmony_ci } ; 153b815c7f3Sopenharmony_ci 154b815c7f3Sopenharmony_ci if (zero_count > items / 4) 155b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; 156b815c7f3Sopenharmony_ci exit (1) ; 157b815c7f3Sopenharmony_ci } ; 158b815c7f3Sopenharmony_ci 159b815c7f3Sopenharmony_ci sfinfo.samplerate = 44100 ; 160b815c7f3Sopenharmony_ci sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ 161b815c7f3Sopenharmony_ci sfinfo.channels = 1 ; 162b815c7f3Sopenharmony_ci sfinfo.format = filetype ; 163b815c7f3Sopenharmony_ci 164b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; 165b815c7f3Sopenharmony_ci 166b815c7f3Sopenharmony_ci test_write_short_or_die (file, 0, short_out, items, __LINE__) ; 167b815c7f3Sopenharmony_ci 168b815c7f3Sopenharmony_ci sf_close (file) ; 169b815c7f3Sopenharmony_ci 170b815c7f3Sopenharmony_ci memset (short_in, 0, items * sizeof (short)) ; 171b815c7f3Sopenharmony_ci 172b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; 173b815c7f3Sopenharmony_ci 174b815c7f3Sopenharmony_ci if (sfinfo.format != filetype) 175b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; 176b815c7f3Sopenharmony_ci exit (1) ; 177b815c7f3Sopenharmony_ci } ; 178b815c7f3Sopenharmony_ci 179b815c7f3Sopenharmony_ci if (sfinfo.frames != items) 180b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; 181b815c7f3Sopenharmony_ci exit (1) ; 182b815c7f3Sopenharmony_ci } ; 183b815c7f3Sopenharmony_ci 184b815c7f3Sopenharmony_ci if (sfinfo.channels != 1) 185b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; 186b815c7f3Sopenharmony_ci exit (1) ; 187b815c7f3Sopenharmony_ci } ; 188b815c7f3Sopenharmony_ci 189b815c7f3Sopenharmony_ci check_log_buffer_or_die (file, __LINE__) ; 190b815c7f3Sopenharmony_ci 191b815c7f3Sopenharmony_ci test_read_short_or_die (file, 0, short_in, items, __LINE__) ; 192b815c7f3Sopenharmony_ci 193b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 194b815c7f3Sopenharmony_ci if (short_out [k] != short_in [k]) 195b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; 196b815c7f3Sopenharmony_ci exit (1) ; 197b815c7f3Sopenharmony_ci } ; 198b815c7f3Sopenharmony_ci 199b815c7f3Sopenharmony_ci sf_close (file) ; 200b815c7f3Sopenharmony_ci 201b815c7f3Sopenharmony_ci /* Finally, check the file hash. */ 202b815c7f3Sopenharmony_ci check_file_hash_or_die (filename, hash, __LINE__) ; 203b815c7f3Sopenharmony_ci 204b815c7f3Sopenharmony_ci /*-------------------------------------------------------------------------- 205b815c7f3Sopenharmony_ci ** Test sf_read/write_int () 206b815c7f3Sopenharmony_ci */ 207b815c7f3Sopenharmony_ci zero_count = 0 ; 208b815c7f3Sopenharmony_ci 209b815c7f3Sopenharmony_ci int_out = data_out.i ; 210b815c7f3Sopenharmony_ci int_in = data_in.i ; 211b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 212b815c7f3Sopenharmony_ci { int_out [k] = [+ (get "int_func") +] ; 213b815c7f3Sopenharmony_ci zero_count = int_out [k] ? zero_count : zero_count + 1 ; 214b815c7f3Sopenharmony_ci } ; 215b815c7f3Sopenharmony_ci 216b815c7f3Sopenharmony_ci if (zero_count > items / 4) 217b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; 218b815c7f3Sopenharmony_ci exit (1) ; 219b815c7f3Sopenharmony_ci } ; 220b815c7f3Sopenharmony_ci 221b815c7f3Sopenharmony_ci sfinfo.samplerate = 44100 ; 222b815c7f3Sopenharmony_ci sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ 223b815c7f3Sopenharmony_ci sfinfo.channels = 1 ; 224b815c7f3Sopenharmony_ci sfinfo.format = filetype ; 225b815c7f3Sopenharmony_ci 226b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; 227b815c7f3Sopenharmony_ci 228b815c7f3Sopenharmony_ci test_write_int_or_die (file, 0, int_out, items, __LINE__) ; 229b815c7f3Sopenharmony_ci 230b815c7f3Sopenharmony_ci sf_close (file) ; 231b815c7f3Sopenharmony_ci 232b815c7f3Sopenharmony_ci memset (int_in, 0, items * sizeof (int)) ; 233b815c7f3Sopenharmony_ci 234b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; 235b815c7f3Sopenharmony_ci 236b815c7f3Sopenharmony_ci if (sfinfo.format != filetype) 237b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; 238b815c7f3Sopenharmony_ci exit (1) ; 239b815c7f3Sopenharmony_ci } ; 240b815c7f3Sopenharmony_ci 241b815c7f3Sopenharmony_ci if (sfinfo.frames != items) 242b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; 243b815c7f3Sopenharmony_ci exit (1) ; 244b815c7f3Sopenharmony_ci } ; 245b815c7f3Sopenharmony_ci 246b815c7f3Sopenharmony_ci if (sfinfo.channels != 1) 247b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; 248b815c7f3Sopenharmony_ci exit (1) ; 249b815c7f3Sopenharmony_ci } ; 250b815c7f3Sopenharmony_ci 251b815c7f3Sopenharmony_ci check_log_buffer_or_die (file, __LINE__) ; 252b815c7f3Sopenharmony_ci 253b815c7f3Sopenharmony_ci test_read_int_or_die (file, 0, int_in, items, __LINE__) ; 254b815c7f3Sopenharmony_ci 255b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 256b815c7f3Sopenharmony_ci if (int_out [k] != int_in [k]) 257b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; 258b815c7f3Sopenharmony_ci exit (1) ; 259b815c7f3Sopenharmony_ci } ; 260b815c7f3Sopenharmony_ci 261b815c7f3Sopenharmony_ci sf_close (file) ; 262b815c7f3Sopenharmony_ci 263b815c7f3Sopenharmony_ci /* Lite remove start */ 264b815c7f3Sopenharmony_ci /*-------------------------------------------------------------------------- 265b815c7f3Sopenharmony_ci ** Test sf_read/write_float () 266b815c7f3Sopenharmony_ci */ 267b815c7f3Sopenharmony_ci zero_count = 0 ; 268b815c7f3Sopenharmony_ci 269b815c7f3Sopenharmony_ci float_out = data_out.f ; 270b815c7f3Sopenharmony_ci float_in = data_in.f ; 271b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 272b815c7f3Sopenharmony_ci { float_out [k] = [+ (get "float_func") +] ; 273b815c7f3Sopenharmony_ci zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; 274b815c7f3Sopenharmony_ci } ; 275b815c7f3Sopenharmony_ci 276b815c7f3Sopenharmony_ci if (zero_count > items / 4) 277b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; 278b815c7f3Sopenharmony_ci exit (1) ; 279b815c7f3Sopenharmony_ci } ; 280b815c7f3Sopenharmony_ci 281b815c7f3Sopenharmony_ci sfinfo.samplerate = 44100 ; 282b815c7f3Sopenharmony_ci sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ 283b815c7f3Sopenharmony_ci sfinfo.channels = 1 ; 284b815c7f3Sopenharmony_ci sfinfo.format = filetype ; 285b815c7f3Sopenharmony_ci 286b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; 287b815c7f3Sopenharmony_ci 288b815c7f3Sopenharmony_ci sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; 289b815c7f3Sopenharmony_ci 290b815c7f3Sopenharmony_ci test_write_float_or_die (file, 0, float_out, items, __LINE__) ; 291b815c7f3Sopenharmony_ci 292b815c7f3Sopenharmony_ci sf_close (file) ; 293b815c7f3Sopenharmony_ci 294b815c7f3Sopenharmony_ci memset (float_in, 0, items * sizeof (float)) ; 295b815c7f3Sopenharmony_ci 296b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; 297b815c7f3Sopenharmony_ci 298b815c7f3Sopenharmony_ci if (sfinfo.format != filetype) 299b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; 300b815c7f3Sopenharmony_ci exit (1) ; 301b815c7f3Sopenharmony_ci } ; 302b815c7f3Sopenharmony_ci 303b815c7f3Sopenharmony_ci if (sfinfo.frames != items) 304b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; 305b815c7f3Sopenharmony_ci exit (1) ; 306b815c7f3Sopenharmony_ci } ; 307b815c7f3Sopenharmony_ci 308b815c7f3Sopenharmony_ci if (sfinfo.channels != 1) 309b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; 310b815c7f3Sopenharmony_ci exit (1) ; 311b815c7f3Sopenharmony_ci } ; 312b815c7f3Sopenharmony_ci 313b815c7f3Sopenharmony_ci check_log_buffer_or_die (file, __LINE__) ; 314b815c7f3Sopenharmony_ci 315b815c7f3Sopenharmony_ci sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; 316b815c7f3Sopenharmony_ci 317b815c7f3Sopenharmony_ci test_read_float_or_die (file, 0, float_in, items, __LINE__) ; 318b815c7f3Sopenharmony_ci 319b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 320b815c7f3Sopenharmony_ci if (fabs (float_out [k] - float_in [k]) > 1e-10) 321b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; 322b815c7f3Sopenharmony_ci exit (1) ; 323b815c7f3Sopenharmony_ci } ; 324b815c7f3Sopenharmony_ci 325b815c7f3Sopenharmony_ci sf_close (file) ; 326b815c7f3Sopenharmony_ci 327b815c7f3Sopenharmony_ci /*-------------------------------------------------------------------------- 328b815c7f3Sopenharmony_ci ** Test sf_read/write_double () 329b815c7f3Sopenharmony_ci */ 330b815c7f3Sopenharmony_ci zero_count = 0 ; 331b815c7f3Sopenharmony_ci 332b815c7f3Sopenharmony_ci double_out = data_out.d ; 333b815c7f3Sopenharmony_ci double_in = data_in.d ; 334b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 335b815c7f3Sopenharmony_ci { double_out [k] = [+ (get "float_func") +] ; 336b815c7f3Sopenharmony_ci zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; 337b815c7f3Sopenharmony_ci } ; 338b815c7f3Sopenharmony_ci 339b815c7f3Sopenharmony_ci if (zero_count > items / 4) 340b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; 341b815c7f3Sopenharmony_ci exit (1) ; 342b815c7f3Sopenharmony_ci } ; 343b815c7f3Sopenharmony_ci 344b815c7f3Sopenharmony_ci sfinfo.samplerate = 44100 ; 345b815c7f3Sopenharmony_ci sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ 346b815c7f3Sopenharmony_ci sfinfo.channels = 1 ; 347b815c7f3Sopenharmony_ci sfinfo.format = filetype ; 348b815c7f3Sopenharmony_ci 349b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; 350b815c7f3Sopenharmony_ci 351b815c7f3Sopenharmony_ci sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; 352b815c7f3Sopenharmony_ci 353b815c7f3Sopenharmony_ci test_write_double_or_die (file, 0, double_out, items, __LINE__) ; 354b815c7f3Sopenharmony_ci 355b815c7f3Sopenharmony_ci sf_close (file) ; 356b815c7f3Sopenharmony_ci 357b815c7f3Sopenharmony_ci memset (double_in, 0, items * sizeof (double)) ; 358b815c7f3Sopenharmony_ci 359b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; 360b815c7f3Sopenharmony_ci 361b815c7f3Sopenharmony_ci if (sfinfo.format != filetype) 362b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; 363b815c7f3Sopenharmony_ci exit (1) ; 364b815c7f3Sopenharmony_ci } ; 365b815c7f3Sopenharmony_ci 366b815c7f3Sopenharmony_ci if (sfinfo.frames != items) 367b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; 368b815c7f3Sopenharmony_ci exit (1) ; 369b815c7f3Sopenharmony_ci } ; 370b815c7f3Sopenharmony_ci 371b815c7f3Sopenharmony_ci if (sfinfo.channels != 1) 372b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; 373b815c7f3Sopenharmony_ci exit (1) ; 374b815c7f3Sopenharmony_ci } ; 375b815c7f3Sopenharmony_ci 376b815c7f3Sopenharmony_ci check_log_buffer_or_die (file, __LINE__) ; 377b815c7f3Sopenharmony_ci 378b815c7f3Sopenharmony_ci sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; 379b815c7f3Sopenharmony_ci 380b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, double_in, items, __LINE__) ; 381b815c7f3Sopenharmony_ci 382b815c7f3Sopenharmony_ci for (k = 0 ; k < items ; k++) 383b815c7f3Sopenharmony_ci if (fabs (double_out [k] - double_in [k]) > 1e-10) 384b815c7f3Sopenharmony_ci { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; 385b815c7f3Sopenharmony_ci exit (1) ; 386b815c7f3Sopenharmony_ci } ; 387b815c7f3Sopenharmony_ci 388b815c7f3Sopenharmony_ci sf_close (file) ; 389b815c7f3Sopenharmony_ci /* Lite remove end */ 390b815c7f3Sopenharmony_ci unlink (filename) ; 391b815c7f3Sopenharmony_ci 392b815c7f3Sopenharmony_ci puts ("ok") ; 393b815c7f3Sopenharmony_ci} /* pcm_test_[+ (get "name") +] */ 394b815c7f3Sopenharmony_ci 395b815c7f3Sopenharmony_ci[+ ENDFOR data_type 396b815c7f3Sopenharmony_ci+] 397b815c7f3Sopenharmony_ci 398b815c7f3Sopenharmony_ci/*============================================================================== 399b815c7f3Sopenharmony_ci*/ 400b815c7f3Sopenharmony_ci 401b815c7f3Sopenharmony_cistatic void 402b815c7f3Sopenharmony_cipcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) 403b815c7f3Sopenharmony_ci{ SNDFILE *file ; 404b815c7f3Sopenharmony_ci SF_INFO sfinfo ; 405b815c7f3Sopenharmony_ci int k, items, frames ; 406b815c7f3Sopenharmony_ci int sign ; 407b815c7f3Sopenharmony_ci double *data, error ; 408b815c7f3Sopenharmony_ci 409b815c7f3Sopenharmony_ci print_test_name (replace_float ? "pcm_test_float (replace)" : "pcm_test_float", filename) ; 410b815c7f3Sopenharmony_ci 411b815c7f3Sopenharmony_ci items = BUFFER_SIZE ; 412b815c7f3Sopenharmony_ci 413b815c7f3Sopenharmony_ci data = data_out.d ; 414b815c7f3Sopenharmony_ci for (sign = 1, k = 0 ; k < items ; k++) 415b815c7f3Sopenharmony_ci { data [k] = ((double) (k * sign)) / 100.0 ; 416b815c7f3Sopenharmony_ci sign = (sign > 0) ? -1 : 1 ; 417b815c7f3Sopenharmony_ci } ; 418b815c7f3Sopenharmony_ci 419b815c7f3Sopenharmony_ci sfinfo.samplerate = 44100 ; 420b815c7f3Sopenharmony_ci sfinfo.frames = items ; 421b815c7f3Sopenharmony_ci sfinfo.channels = 1 ; 422b815c7f3Sopenharmony_ci sfinfo.format = filetype ; 423b815c7f3Sopenharmony_ci 424b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; 425b815c7f3Sopenharmony_ci sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; 426b815c7f3Sopenharmony_ci if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) 427b815c7f3Sopenharmony_ci { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; 428b815c7f3Sopenharmony_ci dump_log_buffer (file) ; 429b815c7f3Sopenharmony_ci exit (1) ; 430b815c7f3Sopenharmony_ci } ; 431b815c7f3Sopenharmony_ci 432b815c7f3Sopenharmony_ci test_write_double_or_die (file, 0, data, items, __LINE__) ; 433b815c7f3Sopenharmony_ci 434b815c7f3Sopenharmony_ci sf_close (file) ; 435b815c7f3Sopenharmony_ci 436b815c7f3Sopenharmony_ci check_file_hash_or_die (filename, hash, __LINE__) ; 437b815c7f3Sopenharmony_ci 438b815c7f3Sopenharmony_ci memset (data, 0, items * sizeof (double)) ; 439b815c7f3Sopenharmony_ci 440b815c7f3Sopenharmony_ci if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) 441b815c7f3Sopenharmony_ci memset (&sfinfo, 0, sizeof (sfinfo)) ; 442b815c7f3Sopenharmony_ci 443b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; 444b815c7f3Sopenharmony_ci sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; 445b815c7f3Sopenharmony_ci if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) 446b815c7f3Sopenharmony_ci { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; 447b815c7f3Sopenharmony_ci dump_log_buffer (file) ; 448b815c7f3Sopenharmony_ci exit (1) ; 449b815c7f3Sopenharmony_ci } ; 450b815c7f3Sopenharmony_ci 451b815c7f3Sopenharmony_ci if (sfinfo.format != filetype) 452b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; 453b815c7f3Sopenharmony_ci exit (1) ; 454b815c7f3Sopenharmony_ci } ; 455b815c7f3Sopenharmony_ci 456b815c7f3Sopenharmony_ci if (sfinfo.frames != items) 457b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ; 458b815c7f3Sopenharmony_ci exit (1) ; 459b815c7f3Sopenharmony_ci } ; 460b815c7f3Sopenharmony_ci 461b815c7f3Sopenharmony_ci if (sfinfo.channels != 1) 462b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; 463b815c7f3Sopenharmony_ci exit (1) ; 464b815c7f3Sopenharmony_ci } ; 465b815c7f3Sopenharmony_ci 466b815c7f3Sopenharmony_ci check_log_buffer_or_die (file, __LINE__) ; 467b815c7f3Sopenharmony_ci 468b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data, items, __LINE__) ; 469b815c7f3Sopenharmony_ci 470b815c7f3Sopenharmony_ci for (sign = -1, k = 0 ; k < items ; k++) 471b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 472b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 473b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 474b815c7f3Sopenharmony_ci exit (1) ; 475b815c7f3Sopenharmony_ci } ; 476b815c7f3Sopenharmony_ci } ; 477b815c7f3Sopenharmony_ci 478b815c7f3Sopenharmony_ci /* Seek to end of file. */ 479b815c7f3Sopenharmony_ci test_seek_or_die (file, 0, SEEK_END, sfinfo.frames, sfinfo.channels, __LINE__) ; 480b815c7f3Sopenharmony_ci 481b815c7f3Sopenharmony_ci /* Seek to start of file. */ 482b815c7f3Sopenharmony_ci test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; 483b815c7f3Sopenharmony_ci 484b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data, 4, __LINE__) ; 485b815c7f3Sopenharmony_ci for (k = 0 ; k < 4 ; k++) 486b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 487b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 488b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 489b815c7f3Sopenharmony_ci exit (1) ; 490b815c7f3Sopenharmony_ci } ; 491b815c7f3Sopenharmony_ci } ; 492b815c7f3Sopenharmony_ci 493b815c7f3Sopenharmony_ci /* Seek to offset from start of file. */ 494b815c7f3Sopenharmony_ci test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; 495b815c7f3Sopenharmony_ci 496b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; 497b815c7f3Sopenharmony_ci for (k = 10 ; k < 14 ; k++) 498b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 499b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 500b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 501b815c7f3Sopenharmony_ci exit (1) ; 502b815c7f3Sopenharmony_ci } ; 503b815c7f3Sopenharmony_ci } ; 504b815c7f3Sopenharmony_ci 505b815c7f3Sopenharmony_ci /* Seek to offset from current position. */ 506b815c7f3Sopenharmony_ci test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; 507b815c7f3Sopenharmony_ci 508b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ; 509b815c7f3Sopenharmony_ci for (k = 20 ; k < 24 ; k++) 510b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 511b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 512b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 513b815c7f3Sopenharmony_ci exit (1) ; 514b815c7f3Sopenharmony_ci } ; 515b815c7f3Sopenharmony_ci } ; 516b815c7f3Sopenharmony_ci 517b815c7f3Sopenharmony_ci /* Seek to offset from end of file. */ 518b815c7f3Sopenharmony_ci test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; 519b815c7f3Sopenharmony_ci 520b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; 521b815c7f3Sopenharmony_ci for (k = 10 ; k < 14 ; k++) 522b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 523b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 524b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 525b815c7f3Sopenharmony_ci exit (1) ; 526b815c7f3Sopenharmony_ci } ; 527b815c7f3Sopenharmony_ci } ; 528b815c7f3Sopenharmony_ci 529b815c7f3Sopenharmony_ci sf_close (file) ; 530b815c7f3Sopenharmony_ci 531b815c7f3Sopenharmony_ci /* Now test Stereo. */ 532b815c7f3Sopenharmony_ci 533b815c7f3Sopenharmony_ci if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */ 534b815c7f3Sopenharmony_ci { printf ("ok\n") ; 535b815c7f3Sopenharmony_ci return ; 536b815c7f3Sopenharmony_ci } ; 537b815c7f3Sopenharmony_ci 538b815c7f3Sopenharmony_ci items = BUFFER_SIZE ; 539b815c7f3Sopenharmony_ci 540b815c7f3Sopenharmony_ci data = data_out.d ; 541b815c7f3Sopenharmony_ci for (sign = -1, k = 0 ; k < items ; k++) 542b815c7f3Sopenharmony_ci data [k] = ((double) k) / 100.0 * (sign *= -1) ; 543b815c7f3Sopenharmony_ci 544b815c7f3Sopenharmony_ci sfinfo.samplerate = 44100 ; 545b815c7f3Sopenharmony_ci sfinfo.frames = items ; 546b815c7f3Sopenharmony_ci sfinfo.channels = 2 ; 547b815c7f3Sopenharmony_ci sfinfo.format = filetype ; 548b815c7f3Sopenharmony_ci 549b815c7f3Sopenharmony_ci frames = items / sfinfo.channels ; 550b815c7f3Sopenharmony_ci 551b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; 552b815c7f3Sopenharmony_ci sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; 553b815c7f3Sopenharmony_ci if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) 554b815c7f3Sopenharmony_ci { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; 555b815c7f3Sopenharmony_ci dump_log_buffer (file) ; 556b815c7f3Sopenharmony_ci exit (1) ; 557b815c7f3Sopenharmony_ci } ; 558b815c7f3Sopenharmony_ci 559b815c7f3Sopenharmony_ci test_writef_double_or_die (file, 0, data, frames, __LINE__) ; 560b815c7f3Sopenharmony_ci 561b815c7f3Sopenharmony_ci sf_close (file) ; 562b815c7f3Sopenharmony_ci 563b815c7f3Sopenharmony_ci check_file_hash_or_die (filename, hash, __LINE__) ; 564b815c7f3Sopenharmony_ci 565b815c7f3Sopenharmony_ci memset (data, 0, items * sizeof (double)) ; 566b815c7f3Sopenharmony_ci 567b815c7f3Sopenharmony_ci if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) 568b815c7f3Sopenharmony_ci memset (&sfinfo, 0, sizeof (sfinfo)) ; 569b815c7f3Sopenharmony_ci 570b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; 571b815c7f3Sopenharmony_ci sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; 572b815c7f3Sopenharmony_ci if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) 573b815c7f3Sopenharmony_ci { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; 574b815c7f3Sopenharmony_ci dump_log_buffer (file) ; 575b815c7f3Sopenharmony_ci exit (1) ; 576b815c7f3Sopenharmony_ci } ; 577b815c7f3Sopenharmony_ci 578b815c7f3Sopenharmony_ci if (sfinfo.format != filetype) 579b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; 580b815c7f3Sopenharmony_ci exit (1) ; 581b815c7f3Sopenharmony_ci } ; 582b815c7f3Sopenharmony_ci 583b815c7f3Sopenharmony_ci if (sfinfo.frames != frames) 584b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ; 585b815c7f3Sopenharmony_ci exit (1) ; 586b815c7f3Sopenharmony_ci } ; 587b815c7f3Sopenharmony_ci 588b815c7f3Sopenharmony_ci if (sfinfo.channels != 2) 589b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; 590b815c7f3Sopenharmony_ci exit (1) ; 591b815c7f3Sopenharmony_ci } ; 592b815c7f3Sopenharmony_ci 593b815c7f3Sopenharmony_ci check_log_buffer_or_die (file, __LINE__) ; 594b815c7f3Sopenharmony_ci 595b815c7f3Sopenharmony_ci test_readf_double_or_die (file, 0, data, frames, __LINE__) ; 596b815c7f3Sopenharmony_ci for (sign = -1, k = 0 ; k < items ; k++) 597b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 598b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 599b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 600b815c7f3Sopenharmony_ci exit (1) ; 601b815c7f3Sopenharmony_ci } ; 602b815c7f3Sopenharmony_ci } ; 603b815c7f3Sopenharmony_ci 604b815c7f3Sopenharmony_ci /* Seek to start of file. */ 605b815c7f3Sopenharmony_ci test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; 606b815c7f3Sopenharmony_ci 607b815c7f3Sopenharmony_ci test_readf_double_or_die (file, 0, data, 4, __LINE__) ; 608b815c7f3Sopenharmony_ci for (k = 0 ; k < 4 ; k++) 609b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 610b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 611b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 612b815c7f3Sopenharmony_ci exit (1) ; 613b815c7f3Sopenharmony_ci } ; 614b815c7f3Sopenharmony_ci } ; 615b815c7f3Sopenharmony_ci 616b815c7f3Sopenharmony_ci /* Seek to offset from start of file. */ 617b815c7f3Sopenharmony_ci test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; 618b815c7f3Sopenharmony_ci 619b815c7f3Sopenharmony_ci test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ; 620b815c7f3Sopenharmony_ci for (k = 20 ; k < 24 ; k++) 621b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 622b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 623b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 624b815c7f3Sopenharmony_ci exit (1) ; 625b815c7f3Sopenharmony_ci } ; 626b815c7f3Sopenharmony_ci } ; 627b815c7f3Sopenharmony_ci 628b815c7f3Sopenharmony_ci /* Seek to offset from current position. */ 629b815c7f3Sopenharmony_ci test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; 630b815c7f3Sopenharmony_ci 631b815c7f3Sopenharmony_ci test_readf_double_or_die (file, 0, data + 40, 2, __LINE__) ; 632b815c7f3Sopenharmony_ci for (k = 40 ; k < 44 ; k++) 633b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 634b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 635b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 636b815c7f3Sopenharmony_ci exit (1) ; 637b815c7f3Sopenharmony_ci } ; 638b815c7f3Sopenharmony_ci } ; 639b815c7f3Sopenharmony_ci 640b815c7f3Sopenharmony_ci /* Seek to offset from end of file. */ 641b815c7f3Sopenharmony_ci test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; 642b815c7f3Sopenharmony_ci 643b815c7f3Sopenharmony_ci test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ; 644b815c7f3Sopenharmony_ci for (k = 20 ; k < 24 ; k++) 645b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 646b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 647b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 648b815c7f3Sopenharmony_ci exit (1) ; 649b815c7f3Sopenharmony_ci } ; 650b815c7f3Sopenharmony_ci } ; 651b815c7f3Sopenharmony_ci 652b815c7f3Sopenharmony_ci sf_close (file) ; 653b815c7f3Sopenharmony_ci 654b815c7f3Sopenharmony_ci printf ("ok\n") ; 655b815c7f3Sopenharmony_ci unlink (filename) ; 656b815c7f3Sopenharmony_ci} /* pcm_test_float */ 657b815c7f3Sopenharmony_ci 658b815c7f3Sopenharmony_cistatic void 659b815c7f3Sopenharmony_cipcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) 660b815c7f3Sopenharmony_ci{ SNDFILE *file ; 661b815c7f3Sopenharmony_ci SF_INFO sfinfo ; 662b815c7f3Sopenharmony_ci int k, items, frames ; 663b815c7f3Sopenharmony_ci int sign ; 664b815c7f3Sopenharmony_ci double *data, error ; 665b815c7f3Sopenharmony_ci 666b815c7f3Sopenharmony_ci /* This is the best test routine. Other should be brought up to this standard. */ 667b815c7f3Sopenharmony_ci 668b815c7f3Sopenharmony_ci print_test_name (replace_float ? "pcm_test_double (replace)" : "pcm_test_double", filename) ; 669b815c7f3Sopenharmony_ci 670b815c7f3Sopenharmony_ci items = BUFFER_SIZE ; 671b815c7f3Sopenharmony_ci 672b815c7f3Sopenharmony_ci data = data_out.d ; 673b815c7f3Sopenharmony_ci for (sign = 1, k = 0 ; k < items ; k++) 674b815c7f3Sopenharmony_ci { data [k] = ((double) (k * sign)) / 100.0 ; 675b815c7f3Sopenharmony_ci sign = (sign > 0) ? -1 : 1 ; 676b815c7f3Sopenharmony_ci } ; 677b815c7f3Sopenharmony_ci 678b815c7f3Sopenharmony_ci sfinfo.samplerate = 44100 ; 679b815c7f3Sopenharmony_ci sfinfo.frames = items ; 680b815c7f3Sopenharmony_ci sfinfo.channels = 1 ; 681b815c7f3Sopenharmony_ci sfinfo.format = filetype ; 682b815c7f3Sopenharmony_ci 683b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; 684b815c7f3Sopenharmony_ci sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; 685b815c7f3Sopenharmony_ci if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) 686b815c7f3Sopenharmony_ci { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; 687b815c7f3Sopenharmony_ci dump_log_buffer (file) ; 688b815c7f3Sopenharmony_ci exit (1) ; 689b815c7f3Sopenharmony_ci } ; 690b815c7f3Sopenharmony_ci 691b815c7f3Sopenharmony_ci test_write_double_or_die (file, 0, data, items, __LINE__) ; 692b815c7f3Sopenharmony_ci 693b815c7f3Sopenharmony_ci sf_close (file) ; 694b815c7f3Sopenharmony_ci 695b815c7f3Sopenharmony_ci check_file_hash_or_die (filename, hash, __LINE__) ; 696b815c7f3Sopenharmony_ci 697b815c7f3Sopenharmony_ci memset (data, 0, items * sizeof (double)) ; 698b815c7f3Sopenharmony_ci 699b815c7f3Sopenharmony_ci if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) 700b815c7f3Sopenharmony_ci memset (&sfinfo, 0, sizeof (sfinfo)) ; 701b815c7f3Sopenharmony_ci 702b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; 703b815c7f3Sopenharmony_ci sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; 704b815c7f3Sopenharmony_ci if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) 705b815c7f3Sopenharmony_ci { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; 706b815c7f3Sopenharmony_ci dump_log_buffer (file) ; 707b815c7f3Sopenharmony_ci exit (1) ; 708b815c7f3Sopenharmony_ci } ; 709b815c7f3Sopenharmony_ci 710b815c7f3Sopenharmony_ci if (sfinfo.format != filetype) 711b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; 712b815c7f3Sopenharmony_ci exit (1) ; 713b815c7f3Sopenharmony_ci } ; 714b815c7f3Sopenharmony_ci 715b815c7f3Sopenharmony_ci if (sfinfo.frames != items) 716b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ; 717b815c7f3Sopenharmony_ci exit (1) ; 718b815c7f3Sopenharmony_ci } ; 719b815c7f3Sopenharmony_ci 720b815c7f3Sopenharmony_ci if (sfinfo.channels != 1) 721b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; 722b815c7f3Sopenharmony_ci exit (1) ; 723b815c7f3Sopenharmony_ci } ; 724b815c7f3Sopenharmony_ci 725b815c7f3Sopenharmony_ci check_log_buffer_or_die (file, __LINE__) ; 726b815c7f3Sopenharmony_ci 727b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data, items, __LINE__) ; 728b815c7f3Sopenharmony_ci 729b815c7f3Sopenharmony_ci for (sign = -1, k = 0 ; k < items ; k++) 730b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 731b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 732b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 733b815c7f3Sopenharmony_ci exit (1) ; 734b815c7f3Sopenharmony_ci } ; 735b815c7f3Sopenharmony_ci } ; 736b815c7f3Sopenharmony_ci 737b815c7f3Sopenharmony_ci /* Seek to start of file. */ 738b815c7f3Sopenharmony_ci test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; 739b815c7f3Sopenharmony_ci 740b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data, 4, __LINE__) ; 741b815c7f3Sopenharmony_ci for (k = 0 ; k < 4 ; k++) 742b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 743b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 744b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 745b815c7f3Sopenharmony_ci exit (1) ; 746b815c7f3Sopenharmony_ci } ; 747b815c7f3Sopenharmony_ci } ; 748b815c7f3Sopenharmony_ci 749b815c7f3Sopenharmony_ci /* Seek to offset from start of file. */ 750b815c7f3Sopenharmony_ci test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; 751b815c7f3Sopenharmony_ci 752b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; 753b815c7f3Sopenharmony_ci 754b815c7f3Sopenharmony_ci test_seek_or_die (file, 0, SEEK_CUR, 14, sfinfo.channels, __LINE__) ; 755b815c7f3Sopenharmony_ci 756b815c7f3Sopenharmony_ci for (k = 10 ; k < 14 ; k++) 757b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 758b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 759b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 760b815c7f3Sopenharmony_ci exit (1) ; 761b815c7f3Sopenharmony_ci } ; 762b815c7f3Sopenharmony_ci } ; 763b815c7f3Sopenharmony_ci 764b815c7f3Sopenharmony_ci /* Seek to offset from current position. */ 765b815c7f3Sopenharmony_ci test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; 766b815c7f3Sopenharmony_ci 767b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ; 768b815c7f3Sopenharmony_ci for (k = 20 ; k < 24 ; k++) 769b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 770b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 771b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 772b815c7f3Sopenharmony_ci exit (1) ; 773b815c7f3Sopenharmony_ci } ; 774b815c7f3Sopenharmony_ci } ; 775b815c7f3Sopenharmony_ci 776b815c7f3Sopenharmony_ci /* Seek to offset from end of file. */ 777b815c7f3Sopenharmony_ci test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; 778b815c7f3Sopenharmony_ci 779b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; 780b815c7f3Sopenharmony_ci for (k = 10 ; k < 14 ; k++) 781b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 782b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 783b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 784b815c7f3Sopenharmony_ci exit (1) ; 785b815c7f3Sopenharmony_ci } ; 786b815c7f3Sopenharmony_ci } ; 787b815c7f3Sopenharmony_ci 788b815c7f3Sopenharmony_ci sf_close (file) ; 789b815c7f3Sopenharmony_ci 790b815c7f3Sopenharmony_ci /* Now test Stereo. */ 791b815c7f3Sopenharmony_ci 792b815c7f3Sopenharmony_ci if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */ 793b815c7f3Sopenharmony_ci { printf ("ok\n") ; 794b815c7f3Sopenharmony_ci return ; 795b815c7f3Sopenharmony_ci } ; 796b815c7f3Sopenharmony_ci 797b815c7f3Sopenharmony_ci items = BUFFER_SIZE ; 798b815c7f3Sopenharmony_ci 799b815c7f3Sopenharmony_ci data = data_out.d ; 800b815c7f3Sopenharmony_ci for (sign = -1, k = 0 ; k < items ; k++) 801b815c7f3Sopenharmony_ci data [k] = ((double) k) / 100.0 * (sign *= -1) ; 802b815c7f3Sopenharmony_ci 803b815c7f3Sopenharmony_ci sfinfo.samplerate = 44100 ; 804b815c7f3Sopenharmony_ci sfinfo.frames = items ; 805b815c7f3Sopenharmony_ci sfinfo.channels = 2 ; 806b815c7f3Sopenharmony_ci sfinfo.format = filetype ; 807b815c7f3Sopenharmony_ci 808b815c7f3Sopenharmony_ci frames = items / sfinfo.channels ; 809b815c7f3Sopenharmony_ci 810b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; 811b815c7f3Sopenharmony_ci sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; 812b815c7f3Sopenharmony_ci if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) 813b815c7f3Sopenharmony_ci { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; 814b815c7f3Sopenharmony_ci dump_log_buffer (file) ; 815b815c7f3Sopenharmony_ci exit (1) ; 816b815c7f3Sopenharmony_ci } ; 817b815c7f3Sopenharmony_ci 818b815c7f3Sopenharmony_ci test_writef_double_or_die (file, 0, data, frames, __LINE__) ; 819b815c7f3Sopenharmony_ci 820b815c7f3Sopenharmony_ci sf_close (file) ; 821b815c7f3Sopenharmony_ci 822b815c7f3Sopenharmony_ci check_file_hash_or_die (filename, hash, __LINE__) ; 823b815c7f3Sopenharmony_ci 824b815c7f3Sopenharmony_ci memset (data, 0, items * sizeof (double)) ; 825b815c7f3Sopenharmony_ci 826b815c7f3Sopenharmony_ci if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) 827b815c7f3Sopenharmony_ci memset (&sfinfo, 0, sizeof (sfinfo)) ; 828b815c7f3Sopenharmony_ci 829b815c7f3Sopenharmony_ci file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; 830b815c7f3Sopenharmony_ci sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; 831b815c7f3Sopenharmony_ci if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) 832b815c7f3Sopenharmony_ci { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; 833b815c7f3Sopenharmony_ci dump_log_buffer (file) ; 834b815c7f3Sopenharmony_ci exit (1) ; 835b815c7f3Sopenharmony_ci } ; 836b815c7f3Sopenharmony_ci 837b815c7f3Sopenharmony_ci if (sfinfo.format != filetype) 838b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; 839b815c7f3Sopenharmony_ci exit (1) ; 840b815c7f3Sopenharmony_ci } ; 841b815c7f3Sopenharmony_ci 842b815c7f3Sopenharmony_ci if (sfinfo.frames != frames) 843b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ; 844b815c7f3Sopenharmony_ci exit (1) ; 845b815c7f3Sopenharmony_ci } ; 846b815c7f3Sopenharmony_ci 847b815c7f3Sopenharmony_ci if (sfinfo.channels != 2) 848b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; 849b815c7f3Sopenharmony_ci exit (1) ; 850b815c7f3Sopenharmony_ci } ; 851b815c7f3Sopenharmony_ci 852b815c7f3Sopenharmony_ci check_log_buffer_or_die (file, __LINE__) ; 853b815c7f3Sopenharmony_ci 854b815c7f3Sopenharmony_ci test_readf_double_or_die (file, 0, data, frames, __LINE__) ; 855b815c7f3Sopenharmony_ci 856b815c7f3Sopenharmony_ci for (sign = -1, k = 0 ; k < items ; k++) 857b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 858b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 859b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 860b815c7f3Sopenharmony_ci exit (1) ; 861b815c7f3Sopenharmony_ci } ; 862b815c7f3Sopenharmony_ci } ; 863b815c7f3Sopenharmony_ci 864b815c7f3Sopenharmony_ci /* Seek to start of file. */ 865b815c7f3Sopenharmony_ci test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; 866b815c7f3Sopenharmony_ci 867b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data, 4, __LINE__) ; 868b815c7f3Sopenharmony_ci for (k = 0 ; k < 4 ; k++) 869b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 870b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 871b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 872b815c7f3Sopenharmony_ci exit (1) ; 873b815c7f3Sopenharmony_ci } ; 874b815c7f3Sopenharmony_ci } ; 875b815c7f3Sopenharmony_ci 876b815c7f3Sopenharmony_ci /* Seek to offset from start of file. */ 877b815c7f3Sopenharmony_ci test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; 878b815c7f3Sopenharmony_ci 879b815c7f3Sopenharmony_ci test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; 880b815c7f3Sopenharmony_ci for (k = 20 ; k < 24 ; k++) 881b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 882b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 883b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 884b815c7f3Sopenharmony_ci exit (1) ; 885b815c7f3Sopenharmony_ci } ; 886b815c7f3Sopenharmony_ci } ; 887b815c7f3Sopenharmony_ci 888b815c7f3Sopenharmony_ci /* Seek to offset from current position. */ 889b815c7f3Sopenharmony_ci test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; 890b815c7f3Sopenharmony_ci 891b815c7f3Sopenharmony_ci test_readf_double_or_die (file, 0, data + 40, 4, __LINE__) ; 892b815c7f3Sopenharmony_ci for (k = 40 ; k < 44 ; k++) 893b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 894b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 895b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 896b815c7f3Sopenharmony_ci exit (1) ; 897b815c7f3Sopenharmony_ci } ; 898b815c7f3Sopenharmony_ci } ; 899b815c7f3Sopenharmony_ci 900b815c7f3Sopenharmony_ci /* Seek to offset from end of file. */ 901b815c7f3Sopenharmony_ci test_seek_or_die (file, -1 * (sfinfo.frames -10), SEEK_END, 10, sfinfo.channels, __LINE__) ; 902b815c7f3Sopenharmony_ci 903b815c7f3Sopenharmony_ci test_readf_double_or_die (file, 0, data + 20, 4, __LINE__) ; 904b815c7f3Sopenharmony_ci for (k = 20 ; k < 24 ; k++) 905b815c7f3Sopenharmony_ci { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; 906b815c7f3Sopenharmony_ci if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) 907b815c7f3Sopenharmony_ci { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; 908b815c7f3Sopenharmony_ci exit (1) ; 909b815c7f3Sopenharmony_ci } ; 910b815c7f3Sopenharmony_ci } ; 911b815c7f3Sopenharmony_ci 912b815c7f3Sopenharmony_ci sf_close (file) ; 913b815c7f3Sopenharmony_ci 914b815c7f3Sopenharmony_ci printf ("ok\n") ; 915b815c7f3Sopenharmony_ci unlink (filename) ; 916b815c7f3Sopenharmony_ci} /* pcm_test_double */ 917b815c7f3Sopenharmony_ci 918b815c7f3Sopenharmony_ci/*============================================================================== 919b815c7f3Sopenharmony_ci*/ 920