annotate src/libsndfile-1.0.27/tests/cpp_test.cc @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 1df64224f5ac
children
rev   line source
Chris@40 1 /*
Chris@40 2 ** Copyright (C) 2006-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@40 3 **
Chris@40 4 ** This program is free software; you can redistribute it and/or modify
Chris@40 5 ** it under the terms of the GNU General Public License as published by
Chris@40 6 ** the Free Software Foundation; either version 2 of the License, or
Chris@40 7 ** (at your option) any later version.
Chris@40 8 **
Chris@40 9 ** This program is distributed in the hope that it will be useful,
Chris@40 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@40 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@40 12 ** GNU General Public License for more details.
Chris@40 13 **
Chris@40 14 ** You should have received a copy of the GNU General Public License
Chris@40 15 ** along with this program; if not, write to the Free Software
Chris@40 16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Chris@40 17 */
Chris@40 18
Chris@40 19 #include <cstdio>
Chris@40 20 #include <cstdlib>
Chris@40 21 #include <cstring>
Chris@40 22
Chris@40 23 #include <sndfile.hh>
Chris@40 24
Chris@40 25 #include "utils.h"
Chris@40 26
Chris@40 27 static short sbuffer [100] ;
Chris@40 28 static int ibuffer [100] ;
Chris@40 29 static float fbuffer [100] ;
Chris@40 30 static double dbuffer [100] ;
Chris@40 31
Chris@40 32 static void
Chris@40 33 ceeplusplus_wchar_test (void)
Chris@40 34 {
Chris@40 35 #if 0
Chris@40 36 LPCWSTR filename = L"wchar_test.wav" ;
Chris@40 37
Chris@40 38 print_test_name (__func__, "ceeplusplus_wchar_test.wav") ;
Chris@40 39
Chris@40 40 /* Use this scope to make sure the created file is closed. */
Chris@40 41 {
Chris@40 42 SndfileHandle file (filename, SFM_WRITE, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, 44100) ;
Chris@40 43
Chris@40 44 if (file.refCount () != 1)
Chris@40 45 { printf ("\n\n%s %d : Error : Reference count (%d) should be 1.\n\n", __func__, __LINE__, file.refCount ()) ;
Chris@40 46 exit (1) ;
Chris@40 47 } ;
Chris@40 48
Chris@40 49 /* This should check that the file did in fact get created with a
Chris@40 50 ** wchar_t * filename.
Chris@40 51 */
Chris@40 52 exit_if_true (
Chris@40 53 GetFileAttributesW (filename) == INVALID_FILE_ATTRIBUTES,
Chris@40 54 "\n\nLine %d : GetFileAttributes failed.\n\n", __LINE__
Chris@40 55 ) ;
Chris@40 56 }
Chris@40 57
Chris@40 58 /* Use this because the file was created with CreateFileW. */
Chris@40 59 DeleteFileW (filename) ;
Chris@40 60
Chris@40 61 puts ("ok") ;
Chris@40 62 #endif
Chris@40 63 } /* ceeplusplus_wchar_test */
Chris@40 64
Chris@40 65
Chris@40 66
Chris@40 67 static void
Chris@40 68 create_file (const char * filename, int format)
Chris@40 69 { SndfileHandle file ;
Chris@40 70
Chris@40 71 if (file.refCount () != 0)
Chris@40 72 { printf ("\n\n%s %d : Error : Reference count (%d) should be zero.\n\n", __func__, __LINE__, file.refCount ()) ;
Chris@40 73 exit (1) ;
Chris@40 74 } ;
Chris@40 75
Chris@40 76 file = SndfileHandle (filename, SFM_WRITE, format, 2, 48000) ;
Chris@40 77
Chris@40 78 if (file.refCount () != 1)
Chris@40 79 { printf ("\n\n%s %d : Error : Reference count (%d) should be 1.\n\n", __func__, __LINE__, file.refCount ()) ;
Chris@40 80 exit (1) ;
Chris@40 81 } ;
Chris@40 82
Chris@40 83 file.setString (SF_STR_TITLE, filename) ;
Chris@40 84
Chris@40 85 /* Item write. */
Chris@40 86 file.write (sbuffer, ARRAY_LEN (sbuffer)) ;
Chris@40 87 file.write (ibuffer, ARRAY_LEN (ibuffer)) ;
Chris@40 88 file.write (fbuffer, ARRAY_LEN (fbuffer)) ;
Chris@40 89 file.write (dbuffer, ARRAY_LEN (dbuffer)) ;
Chris@40 90
Chris@40 91 /* Frame write. */
Chris@40 92 file.writef (sbuffer, ARRAY_LEN (sbuffer) / file.channels ()) ;
Chris@40 93 file.writef (ibuffer, ARRAY_LEN (ibuffer) / file.channels ()) ;
Chris@40 94 file.writef (fbuffer, ARRAY_LEN (fbuffer) / file.channels ()) ;
Chris@40 95 file.writef (dbuffer, ARRAY_LEN (dbuffer) / file.channels ()) ;
Chris@40 96
Chris@40 97 /* RAII takes care of the SndfileHandle. */
Chris@40 98 } /* create_file */
Chris@40 99
Chris@40 100 static void
Chris@40 101 check_title (const SndfileHandle & file, const char * filename)
Chris@40 102 { const char *title = NULL ;
Chris@40 103
Chris@40 104 title = file.getString (SF_STR_TITLE) ;
Chris@40 105
Chris@40 106 if (title == NULL)
Chris@40 107 { printf ("\n\n%s %d : Error : No title.\n\n", __func__, __LINE__) ;
Chris@40 108 exit (1) ;
Chris@40 109 } ;
Chris@40 110
Chris@40 111 if (strcmp (filename, title) != 0)
Chris@40 112 { printf ("\n\n%s %d : Error : title '%s' should be '%s'\n\n", __func__, __LINE__, title, filename) ;
Chris@40 113 exit (1) ;
Chris@40 114 } ;
Chris@40 115
Chris@40 116 return ;
Chris@40 117 } /* check_title */
Chris@40 118
Chris@40 119 static void
Chris@40 120 read_file (const char * filename, int format)
Chris@40 121 { SndfileHandle file ;
Chris@40 122 sf_count_t count ;
Chris@40 123
Chris@40 124 if (file)
Chris@40 125 { printf ("\n\n%s %d : Error : should not be here.\n\n", __func__, __LINE__) ;
Chris@40 126 exit (1) ;
Chris@40 127 } ;
Chris@40 128
Chris@40 129 file = SndfileHandle (filename) ;
Chris@40 130
Chris@40 131 if (1)
Chris@40 132 { SndfileHandle file2 = file ;
Chris@40 133
Chris@40 134 if (file.refCount () != 2 || file2.refCount () != 2)
Chris@40 135 { printf ("\n\n%s %d : Error : Reference count (%d) should be two.\n\n", __func__, __LINE__, file.refCount ()) ;
Chris@40 136 exit (1) ;
Chris@40 137 } ;
Chris@40 138 } ;
Chris@40 139
Chris@40 140 if (file.refCount () != 1)
Chris@40 141 { printf ("\n\n%s %d : Error : Reference count (%d) should be one.\n\n", __func__, __LINE__, file.refCount ()) ;
Chris@40 142 exit (1) ;
Chris@40 143 } ;
Chris@40 144
Chris@40 145 if (! file)
Chris@40 146 { printf ("\n\n%s %d : Error : should not be here.\n\n", __func__, __LINE__) ;
Chris@40 147 exit (1) ;
Chris@40 148 } ;
Chris@40 149
Chris@40 150 if (file.format () != format)
Chris@40 151 { printf ("\n\n%s %d : Error : format 0x%08x should be 0x%08x.\n\n", __func__, __LINE__, file.format (), format) ;
Chris@40 152 exit (1) ;
Chris@40 153 } ;
Chris@40 154
Chris@40 155 if (file.channels () != 2)
Chris@40 156 { printf ("\n\n%s %d : Error : channels %d should be 2.\n\n", __func__, __LINE__, file.channels ()) ;
Chris@40 157 exit (1) ;
Chris@40 158 } ;
Chris@40 159
Chris@40 160 if (file.frames () != ARRAY_LEN (sbuffer) * 4)
Chris@40 161 { printf ("\n\n%s %d : Error : frames %ld should be %lu.\n\n", __func__, __LINE__,
Chris@40 162 (long) file.frames (), (long) ARRAY_LEN (sbuffer) * 4 / 2) ;
Chris@40 163 exit (1) ;
Chris@40 164 } ;
Chris@40 165
Chris@40 166 switch (format & SF_FORMAT_TYPEMASK)
Chris@40 167 { case SF_FORMAT_AU :
Chris@40 168 break ;
Chris@40 169
Chris@40 170 default :
Chris@40 171 check_title (file, filename) ;
Chris@40 172 break ;
Chris@40 173 } ;
Chris@40 174
Chris@40 175 /* Item read. */
Chris@40 176 file.read (sbuffer, ARRAY_LEN (sbuffer)) ;
Chris@40 177 file.read (ibuffer, ARRAY_LEN (ibuffer)) ;
Chris@40 178 file.read (fbuffer, ARRAY_LEN (fbuffer)) ;
Chris@40 179 file.read (dbuffer, ARRAY_LEN (dbuffer)) ;
Chris@40 180
Chris@40 181 /* Frame read. */
Chris@40 182 file.readf (sbuffer, ARRAY_LEN (sbuffer) / file.channels ()) ;
Chris@40 183 file.readf (ibuffer, ARRAY_LEN (ibuffer) / file.channels ()) ;
Chris@40 184 file.readf (fbuffer, ARRAY_LEN (fbuffer) / file.channels ()) ;
Chris@40 185 file.readf (dbuffer, ARRAY_LEN (dbuffer) / file.channels ()) ;
Chris@40 186
Chris@40 187 count = file.seek (file.frames () - 10, SEEK_SET) ;
Chris@40 188 if (count != file.frames () - 10)
Chris@40 189 { printf ("\n\n%s %d : Error : offset (%ld) should be %ld\n\n", __func__, __LINE__,
Chris@40 190 (long) count, (long) (file.frames () - 10)) ;
Chris@40 191 exit (1) ;
Chris@40 192 } ;
Chris@40 193
Chris@40 194 count = file.read (sbuffer, ARRAY_LEN (sbuffer)) ;
Chris@40 195 if (count != 10 * file.channels ())
Chris@40 196 { printf ("\n\n%s %d : Error : count (%ld) should be %ld\n\n", __func__, __LINE__,
Chris@40 197 (long) count, (long) (10 * file.channels ())) ;
Chris@40 198 exit (1) ;
Chris@40 199 } ;
Chris@40 200
Chris@40 201 /* RAII takes care of the SndfileHandle. */
Chris@40 202 } /* read_file */
Chris@40 203
Chris@40 204 static void
Chris@40 205 ceeplusplus_test (const char *filename, int format)
Chris@40 206 {
Chris@40 207 print_test_name ("ceeplusplus_test", filename) ;
Chris@40 208
Chris@40 209 create_file (filename, format) ;
Chris@40 210 read_file (filename, format) ;
Chris@40 211
Chris@40 212 remove (filename) ;
Chris@40 213 puts ("ok") ;
Chris@40 214 } /* ceeplusplus_test */
Chris@40 215
Chris@40 216 static void
Chris@40 217 ceeplusplus_extra_test (void)
Chris@40 218 { SndfileHandle file ;
Chris@40 219 const char * filename = "bad_file_name.wav" ;
Chris@40 220 int error ;
Chris@40 221
Chris@40 222 print_test_name ("ceeplusplus_extra_test", filename) ;
Chris@40 223
Chris@40 224 file = SndfileHandle (filename) ;
Chris@40 225
Chris@40 226 error = file.error () ;
Chris@40 227 if (error == 0)
Chris@40 228 { printf ("\n\n%s %d : error should not be zero.\n\n", __func__, __LINE__) ;
Chris@40 229 exit (1) ;
Chris@40 230 } ;
Chris@40 231
Chris@40 232 if (file.strError () == NULL)
Chris@40 233 { printf ("\n\n%s %d : strError should not return NULL.\n\n", __func__, __LINE__) ;
Chris@40 234 exit (1) ;
Chris@40 235 } ;
Chris@40 236
Chris@40 237 if (file.seek (0, SEEK_SET) != 0)
Chris@40 238 { printf ("\n\n%s %d : bad seek ().\n\n", __func__, __LINE__) ;
Chris@40 239 exit (1) ;
Chris@40 240 } ;
Chris@40 241
Chris@40 242 puts ("ok") ;
Chris@40 243 } /* ceeplusplus_extra_test */
Chris@40 244
Chris@40 245
Chris@40 246 static void
Chris@40 247 ceeplusplus_rawhandle_test (const char *filename)
Chris@40 248 {
Chris@40 249 SNDFILE* handle ;
Chris@40 250 {
Chris@40 251 SndfileHandle file (filename) ;
Chris@40 252 handle = file.rawHandle () ;
Chris@40 253 sf_read_float (handle, fbuffer, ARRAY_LEN (fbuffer)) ;
Chris@40 254 }
Chris@40 255 } /* ceeplusplus_rawhandle_test */
Chris@40 256
Chris@40 257 static void
Chris@40 258 ceeplusplus_takeOwnership_test (const char *filename)
Chris@40 259 {
Chris@40 260 SNDFILE* handle ;
Chris@40 261 {
Chris@40 262 SndfileHandle file (filename) ;
Chris@40 263 handle = file.takeOwnership () ;
Chris@40 264 }
Chris@40 265
Chris@40 266 if (sf_read_float (handle, fbuffer, ARRAY_LEN (fbuffer)) <= 0)
Chris@40 267 { printf ("\n\n%s %d : error when taking ownership of handle.\n\n", __func__, __LINE__) ;
Chris@40 268 exit (1) ;
Chris@40 269 }
Chris@40 270
Chris@40 271 if (sf_close (handle) != 0)
Chris@40 272 { printf ("\n\n%s %d : cannot close file.\n\n", __func__, __LINE__) ;
Chris@40 273 exit (1) ;
Chris@40 274 }
Chris@40 275
Chris@40 276 SndfileHandle file (filename) ;
Chris@40 277 SndfileHandle file2 (file) ;
Chris@40 278
Chris@40 279 if (file2.takeOwnership ())
Chris@40 280 { printf ("\n\n%s %d : taking ownership of shared handle is not allowed.\n\n", __func__, __LINE__) ;
Chris@40 281 exit (1) ;
Chris@40 282 }
Chris@40 283 } /* ceeplusplus_takeOwnership_test */
Chris@40 284
Chris@40 285 static void
Chris@40 286 ceeplusplus_handle_test (const char *filename, int format)
Chris@40 287 {
Chris@40 288 print_test_name ("ceeplusplus_handle_test", filename) ;
Chris@40 289
Chris@40 290 create_file (filename, format) ;
Chris@40 291
Chris@40 292 if (0) ceeplusplus_rawhandle_test (filename) ;
Chris@40 293 ceeplusplus_takeOwnership_test (filename) ;
Chris@40 294
Chris@40 295 remove (filename) ;
Chris@40 296 puts ("ok") ;
Chris@40 297 } /* ceeplusplus_test */
Chris@40 298
Chris@40 299 int
Chris@40 300 main (void)
Chris@40 301 {
Chris@40 302 ceeplusplus_test ("cpp_test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@40 303 ceeplusplus_test ("cpp_test.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_S8) ;
Chris@40 304 ceeplusplus_test ("cpp_test.au", SF_FORMAT_AU | SF_FORMAT_FLOAT) ;
Chris@40 305
Chris@40 306 ceeplusplus_extra_test () ;
Chris@40 307 ceeplusplus_handle_test ("cpp_test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@40 308
Chris@40 309 ceeplusplus_wchar_test () ;
Chris@40 310
Chris@40 311 return 0 ;
Chris@40 312 } /* main */
Chris@40 313