annotate src/libsndfile-1.0.27/programs/common.c @ 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) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@40 3 ** Copyright (C) 2008 George Blood Audio
Chris@40 4 **
Chris@40 5 ** All rights reserved.
Chris@40 6 **
Chris@40 7 ** Redistribution and use in source and binary forms, with or without
Chris@40 8 ** modification, are permitted provided that the following conditions are
Chris@40 9 ** met:
Chris@40 10 **
Chris@40 11 ** * Redistributions of source code must retain the above copyright
Chris@40 12 ** notice, this list of conditions and the following disclaimer.
Chris@40 13 ** * Redistributions in binary form must reproduce the above copyright
Chris@40 14 ** notice, this list of conditions and the following disclaimer in
Chris@40 15 ** the documentation and/or other materials provided with the
Chris@40 16 ** distribution.
Chris@40 17 ** * Neither the author nor the names of any contributors may be used
Chris@40 18 ** to endorse or promote products derived from this software without
Chris@40 19 ** specific prior written permission.
Chris@40 20 **
Chris@40 21 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Chris@40 22 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
Chris@40 23 ** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
Chris@40 24 ** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
Chris@40 25 ** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
Chris@40 26 ** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
Chris@40 27 ** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
Chris@40 28 ** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
Chris@40 29 ** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
Chris@40 30 ** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
Chris@40 31 ** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Chris@40 32 */
Chris@40 33
Chris@40 34 #include <stdio.h>
Chris@40 35 #include <stdlib.h>
Chris@40 36 #include <string.h>
Chris@40 37 #include <ctype.h>
Chris@40 38 #include <stdint.h>
Chris@40 39
Chris@40 40 #include <sndfile.h>
Chris@40 41
Chris@40 42 #include "common.h"
Chris@40 43
Chris@40 44 #define BUFFER_LEN 4096
Chris@40 45
Chris@40 46 #define MIN(x, y) ((x) < (y) ? (x) : (y))
Chris@40 47
Chris@40 48 void
Chris@40 49 sfe_copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels, int normalize)
Chris@40 50 { static double data [BUFFER_LEN], max ;
Chris@40 51 int frames, readcount, k ;
Chris@40 52
Chris@40 53 frames = BUFFER_LEN / channels ;
Chris@40 54 readcount = frames ;
Chris@40 55
Chris@40 56 sf_command (infile, SFC_CALC_SIGNAL_MAX, &max, sizeof (max)) ;
Chris@40 57
Chris@40 58 if (!normalize && max < 1.0)
Chris@40 59 { while (readcount > 0)
Chris@40 60 { readcount = sf_readf_double (infile, data, frames) ;
Chris@40 61 sf_writef_double (outfile, data, readcount) ;
Chris@40 62 } ;
Chris@40 63 }
Chris@40 64 else
Chris@40 65 { sf_command (infile, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
Chris@40 66
Chris@40 67 while (readcount > 0)
Chris@40 68 { readcount = sf_readf_double (infile, data, frames) ;
Chris@40 69 for (k = 0 ; k < readcount * channels ; k++)
Chris@40 70 data [k] /= max ;
Chris@40 71 sf_writef_double (outfile, data, readcount) ;
Chris@40 72 } ;
Chris@40 73 } ;
Chris@40 74
Chris@40 75 return ;
Chris@40 76 } /* sfe_copy_data_fp */
Chris@40 77
Chris@40 78 void
Chris@40 79 sfe_copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels)
Chris@40 80 { static int data [BUFFER_LEN] ;
Chris@40 81 int frames, readcount ;
Chris@40 82
Chris@40 83 frames = BUFFER_LEN / channels ;
Chris@40 84 readcount = frames ;
Chris@40 85
Chris@40 86 while (readcount > 0)
Chris@40 87 { readcount = sf_readf_int (infile, data, frames) ;
Chris@40 88 sf_writef_int (outfile, data, readcount) ;
Chris@40 89 } ;
Chris@40 90
Chris@40 91 return ;
Chris@40 92 } /* sfe_copy_data_int */
Chris@40 93
Chris@40 94 /*==============================================================================
Chris@40 95 */
Chris@40 96
Chris@40 97 static int
Chris@40 98 merge_broadcast_info (SNDFILE * infile, SNDFILE * outfile, int format, const METADATA_INFO * info)
Chris@40 99 { SF_BROADCAST_INFO_2K binfo ;
Chris@40 100 int infileminor ;
Chris@40 101
Chris@40 102 memset (&binfo, 0, sizeof (binfo)) ;
Chris@40 103
Chris@40 104 if ((SF_FORMAT_TYPEMASK & format) != SF_FORMAT_WAV)
Chris@40 105 { printf ("Error : This is not a WAV file and hence broadcast info cannot be added to it.\n\n") ;
Chris@40 106 return 1 ;
Chris@40 107 } ;
Chris@40 108
Chris@40 109 infileminor = SF_FORMAT_SUBMASK & format ;
Chris@40 110
Chris@40 111 switch (infileminor)
Chris@40 112 { case SF_FORMAT_PCM_16 :
Chris@40 113 case SF_FORMAT_PCM_24 :
Chris@40 114 case SF_FORMAT_PCM_32 :
Chris@40 115 break ;
Chris@40 116
Chris@40 117 default :
Chris@40 118 printf (
Chris@40 119 "Warning : The EBU Technical Recommendation R68-2000 states that the only\n"
Chris@40 120 " allowed encodings are Linear PCM and MPEG3. This file is not in\n"
Chris@40 121 " the right format.\n\n"
Chris@40 122 ) ;
Chris@40 123 break ;
Chris@40 124 } ;
Chris@40 125
Chris@40 126 if (sf_command (infile, SFC_GET_BROADCAST_INFO, &binfo, sizeof (binfo)) == 0)
Chris@40 127 { if (infile == outfile)
Chris@40 128 { printf (
Chris@40 129 "Error : Attempting in-place broadcast info update, but file does not\n"
Chris@40 130 " have a 'bext' chunk to modify. The solution is to specify both\n"
Chris@40 131 " input and output files on the command line.\n\n"
Chris@40 132 ) ;
Chris@40 133 return 1 ;
Chris@40 134 } ;
Chris@40 135 } ;
Chris@40 136
Chris@40 137 #define REPLACE_IF_NEW(x) \
Chris@40 138 if (info->x != NULL) \
Chris@40 139 { memset (binfo.x, 0, sizeof (binfo.x)) ; \
Chris@40 140 memcpy (binfo.x, info->x, MIN (strlen (info->x), sizeof (binfo.x))) ; \
Chris@40 141 } ;
Chris@40 142
Chris@40 143 REPLACE_IF_NEW (description) ;
Chris@40 144 REPLACE_IF_NEW (originator) ;
Chris@40 145 REPLACE_IF_NEW (originator_reference) ;
Chris@40 146 REPLACE_IF_NEW (origination_date) ;
Chris@40 147 REPLACE_IF_NEW (origination_time) ;
Chris@40 148 REPLACE_IF_NEW (umid) ;
Chris@40 149
Chris@40 150 /* Special case for Time Ref. */
Chris@40 151 if (info->time_ref != NULL)
Chris@40 152 { uint64_t ts = atoll (info->time_ref) ;
Chris@40 153
Chris@40 154 binfo.time_reference_high = (ts >> 32) ;
Chris@40 155 binfo.time_reference_low = (ts & 0xffffffff) ;
Chris@40 156 } ;
Chris@40 157
Chris@40 158 /* Special case for coding_history because we may want to append. */
Chris@40 159 if (info->coding_history != NULL)
Chris@40 160 { if (info->coding_hist_append)
Chris@40 161 { int slen = strlen (binfo.coding_history) ;
Chris@40 162
Chris@40 163 while (slen > 1 && isspace (binfo.coding_history [slen - 1]))
Chris@40 164 slen -- ;
Chris@40 165
Chris@40 166 memcpy (binfo.coding_history + slen, info->coding_history, sizeof (binfo.coding_history) - slen) ;
Chris@40 167 }
Chris@40 168 else
Chris@40 169 { size_t slen = MIN (strlen (info->coding_history), sizeof (binfo.coding_history)) ;
Chris@40 170
Chris@40 171 memset (binfo.coding_history, 0, sizeof (binfo.coding_history)) ;
Chris@40 172 memcpy (binfo.coding_history, info->coding_history, slen) ;
Chris@40 173 binfo.coding_history_size = slen ;
Chris@40 174 } ;
Chris@40 175 } ;
Chris@40 176
Chris@40 177 if (sf_command (outfile, SFC_SET_BROADCAST_INFO, &binfo, sizeof (binfo)) == 0)
Chris@40 178 { printf ("Error : Setting of broadcast info chunks failed.\n\n") ;
Chris@40 179 return 1 ;
Chris@40 180 } ;
Chris@40 181
Chris@40 182 return 0 ;
Chris@40 183 } /* merge_broadcast_info*/
Chris@40 184
Chris@40 185 static void
Chris@40 186 update_strings (SNDFILE * outfile, const METADATA_INFO * info)
Chris@40 187 {
Chris@40 188 if (info->title != NULL)
Chris@40 189 sf_set_string (outfile, SF_STR_TITLE, info->title) ;
Chris@40 190
Chris@40 191 if (info->copyright != NULL)
Chris@40 192 sf_set_string (outfile, SF_STR_COPYRIGHT, info->copyright) ;
Chris@40 193
Chris@40 194 if (info->artist != NULL)
Chris@40 195 sf_set_string (outfile, SF_STR_ARTIST, info->artist) ;
Chris@40 196
Chris@40 197 if (info->comment != NULL)
Chris@40 198 sf_set_string (outfile, SF_STR_COMMENT, info->comment) ;
Chris@40 199
Chris@40 200 if (info->date != NULL)
Chris@40 201 sf_set_string (outfile, SF_STR_DATE, info->date) ;
Chris@40 202
Chris@40 203 if (info->album != NULL)
Chris@40 204 sf_set_string (outfile, SF_STR_ALBUM, info->album) ;
Chris@40 205
Chris@40 206 if (info->license != NULL)
Chris@40 207 sf_set_string (outfile, SF_STR_LICENSE, info->license) ;
Chris@40 208
Chris@40 209 } /* update_strings */
Chris@40 210
Chris@40 211
Chris@40 212
Chris@40 213 void
Chris@40 214 sfe_apply_metadata_changes (const char * filenames [2], const METADATA_INFO * info)
Chris@40 215 { SNDFILE *infile = NULL, *outfile = NULL ;
Chris@40 216 SF_INFO sfinfo ;
Chris@40 217 METADATA_INFO tmpinfo ;
Chris@40 218 int error_code = 0 ;
Chris@40 219
Chris@40 220 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 221 memset (&tmpinfo, 0, sizeof (tmpinfo)) ;
Chris@40 222
Chris@40 223 if (filenames [1] == NULL)
Chris@40 224 infile = outfile = sf_open (filenames [0], SFM_RDWR, &sfinfo) ;
Chris@40 225 else
Chris@40 226 { infile = sf_open (filenames [0], SFM_READ, &sfinfo) ;
Chris@40 227
Chris@40 228 /* Output must be WAV. */
Chris@40 229 sfinfo.format = SF_FORMAT_WAV | (SF_FORMAT_SUBMASK & sfinfo.format) ;
Chris@40 230 outfile = sf_open (filenames [1], SFM_WRITE, &sfinfo) ;
Chris@40 231 } ;
Chris@40 232
Chris@40 233 if (infile == NULL)
Chris@40 234 { printf ("Error : Not able to open input file '%s' : %s\n", filenames [0], sf_strerror (infile)) ;
Chris@40 235 error_code = 1 ;
Chris@40 236 goto cleanup_exit ;
Chris@40 237 } ;
Chris@40 238
Chris@40 239 if (outfile == NULL)
Chris@40 240 { printf ("Error : Not able to open output file '%s' : %s\n", filenames [1], sf_strerror (outfile)) ;
Chris@40 241 error_code = 1 ;
Chris@40 242 goto cleanup_exit ;
Chris@40 243 } ;
Chris@40 244
Chris@40 245 if (info->has_bext_fields && merge_broadcast_info (infile, outfile, sfinfo.format, info))
Chris@40 246 { error_code = 1 ;
Chris@40 247 goto cleanup_exit ;
Chris@40 248 } ;
Chris@40 249
Chris@40 250 if (infile != outfile)
Chris@40 251 { int infileminor = SF_FORMAT_SUBMASK & sfinfo.format ;
Chris@40 252
Chris@40 253 /* If the input file is not the same as the output file, copy the data. */
Chris@40 254 if ((infileminor == SF_FORMAT_DOUBLE) || (infileminor == SF_FORMAT_FLOAT))
Chris@40 255 sfe_copy_data_fp (outfile, infile, sfinfo.channels, SF_FALSE) ;
Chris@40 256 else
Chris@40 257 sfe_copy_data_int (outfile, infile, sfinfo.channels) ;
Chris@40 258 } ;
Chris@40 259
Chris@40 260 update_strings (outfile, info) ;
Chris@40 261
Chris@40 262 cleanup_exit :
Chris@40 263
Chris@40 264 if (outfile != NULL && outfile != infile)
Chris@40 265 sf_close (outfile) ;
Chris@40 266
Chris@40 267 if (infile != NULL)
Chris@40 268 sf_close (infile) ;
Chris@40 269
Chris@40 270 if (error_code)
Chris@40 271 exit (error_code) ;
Chris@40 272
Chris@40 273 return ;
Chris@40 274 } /* sfe_apply_metadata_changes */
Chris@40 275
Chris@40 276 /*==============================================================================
Chris@40 277 */
Chris@40 278
Chris@40 279 typedef struct
Chris@40 280 { const char *ext ;
Chris@40 281 int len ;
Chris@40 282 int format ;
Chris@40 283 } OUTPUT_FORMAT_MAP ;
Chris@40 284
Chris@40 285 static OUTPUT_FORMAT_MAP format_map [] =
Chris@40 286 {
Chris@40 287 { "wav", 0, SF_FORMAT_WAV },
Chris@40 288 { "aif", 3, SF_FORMAT_AIFF },
Chris@40 289 { "au", 0, SF_FORMAT_AU },
Chris@40 290 { "snd", 0, SF_FORMAT_AU },
Chris@40 291 { "raw", 0, SF_FORMAT_RAW },
Chris@40 292 { "gsm", 0, SF_FORMAT_RAW },
Chris@40 293 { "vox", 0, SF_FORMAT_RAW },
Chris@40 294 { "paf", 0, SF_FORMAT_PAF | SF_ENDIAN_BIG },
Chris@40 295 { "fap", 0, SF_FORMAT_PAF | SF_ENDIAN_LITTLE },
Chris@40 296 { "svx", 0, SF_FORMAT_SVX },
Chris@40 297 { "nist", 0, SF_FORMAT_NIST },
Chris@40 298 { "sph", 0, SF_FORMAT_NIST },
Chris@40 299 { "voc", 0, SF_FORMAT_VOC },
Chris@40 300 { "ircam", 0, SF_FORMAT_IRCAM },
Chris@40 301 { "sf", 0, SF_FORMAT_IRCAM },
Chris@40 302 { "w64", 0, SF_FORMAT_W64 },
Chris@40 303 { "mat", 0, SF_FORMAT_MAT4 },
Chris@40 304 { "mat4", 0, SF_FORMAT_MAT4 },
Chris@40 305 { "mat5", 0, SF_FORMAT_MAT5 },
Chris@40 306 { "pvf", 0, SF_FORMAT_PVF },
Chris@40 307 { "xi", 0, SF_FORMAT_XI },
Chris@40 308 { "htk", 0, SF_FORMAT_HTK },
Chris@40 309 { "sds", 0, SF_FORMAT_SDS },
Chris@40 310 { "avr", 0, SF_FORMAT_AVR },
Chris@40 311 { "wavex", 0, SF_FORMAT_WAVEX },
Chris@40 312 { "sd2", 0, SF_FORMAT_SD2 },
Chris@40 313 { "flac", 0, SF_FORMAT_FLAC },
Chris@40 314 { "caf", 0, SF_FORMAT_CAF },
Chris@40 315 { "wve", 0, SF_FORMAT_WVE },
Chris@40 316 { "prc", 0, SF_FORMAT_WVE },
Chris@40 317 { "ogg", 0, SF_FORMAT_OGG },
Chris@40 318 { "oga", 0, SF_FORMAT_OGG },
Chris@40 319 { "mpc", 0, SF_FORMAT_MPC2K },
Chris@40 320 { "rf64", 0, SF_FORMAT_RF64 },
Chris@40 321 } ; /* format_map */
Chris@40 322
Chris@40 323 int
Chris@40 324 sfe_file_type_of_ext (const char *str, int format)
Chris@40 325 { char buffer [16], *cptr ;
Chris@40 326 int k ;
Chris@40 327
Chris@40 328 format &= SF_FORMAT_SUBMASK ;
Chris@40 329
Chris@40 330 if ((cptr = strrchr (str, '.')) == NULL)
Chris@40 331 return 0 ;
Chris@40 332
Chris@40 333 strncpy (buffer, cptr + 1, 15) ;
Chris@40 334 buffer [15] = 0 ;
Chris@40 335
Chris@40 336 for (k = 0 ; buffer [k] ; k++)
Chris@40 337 buffer [k] = tolower ((buffer [k])) ;
Chris@40 338
Chris@40 339 if (strcmp (buffer, "gsm") == 0)
Chris@40 340 return SF_FORMAT_RAW | SF_FORMAT_GSM610 ;
Chris@40 341
Chris@40 342 if (strcmp (buffer, "vox") == 0)
Chris@40 343 return SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ;
Chris@40 344
Chris@40 345 for (k = 0 ; k < (int) (sizeof (format_map) / sizeof (format_map [0])) ; k++)
Chris@40 346 { if (format_map [k].len > 0 && strncmp (buffer, format_map [k].ext, format_map [k].len) == 0)
Chris@40 347 return format_map [k].format | format ;
Chris@40 348 else if (strcmp (buffer, format_map [k].ext) == 0)
Chris@40 349 return format_map [k].format | format ;
Chris@40 350 } ;
Chris@40 351
Chris@40 352 /* Default if all the above fails. */
Chris@40 353 return (SF_FORMAT_WAV | SF_FORMAT_PCM_24) ;
Chris@40 354 } /* sfe_file_type_of_ext */
Chris@40 355
Chris@40 356 void
Chris@40 357 sfe_dump_format_map (void)
Chris@40 358 { SF_FORMAT_INFO info ;
Chris@40 359 int k ;
Chris@40 360
Chris@40 361 for (k = 0 ; k < ARRAY_LEN (format_map) ; k++)
Chris@40 362 { info.format = format_map [k].format ;
Chris@40 363 sf_command (NULL, SFC_GET_FORMAT_INFO, &info, sizeof (info)) ;
Chris@40 364 printf (" %-10s : %s\n", format_map [k].ext, info.name == NULL ? "????" : info.name) ;
Chris@40 365 } ;
Chris@40 366
Chris@40 367 } /* sfe_dump_format_map */
Chris@40 368
Chris@40 369 const char *
Chris@40 370 program_name (const char * argv0)
Chris@40 371 { const char * tmp ;
Chris@40 372
Chris@40 373 tmp = strrchr (argv0, '/') ;
Chris@40 374 argv0 = tmp ? tmp + 1 : argv0 ;
Chris@40 375
Chris@40 376 /* Remove leading libtool name mangling. */
Chris@40 377 if (strstr (argv0, "lt-") == argv0)
Chris@40 378 return argv0 + 3 ;
Chris@40 379
Chris@40 380 return argv0 ;
Chris@40 381 } /* program_name */
Chris@40 382
Chris@40 383 const char *
Chris@40 384 sfe_endian_name (int format)
Chris@40 385 {
Chris@40 386 switch (format & SF_FORMAT_ENDMASK)
Chris@40 387 { case SF_ENDIAN_FILE : return "file" ;
Chris@40 388 case SF_ENDIAN_LITTLE : return "little" ;
Chris@40 389 case SF_ENDIAN_BIG : return "big" ;
Chris@40 390 case SF_ENDIAN_CPU : return "cpu" ;
Chris@40 391 default : break ;
Chris@40 392 } ;
Chris@40 393
Chris@40 394 return "unknown" ;
Chris@40 395 } /* sfe_endian_name */
Chris@40 396
Chris@40 397 const char *
Chris@40 398 sfe_container_name (int format)
Chris@40 399 {
Chris@40 400 switch (format & SF_FORMAT_TYPEMASK)
Chris@40 401 { case SF_FORMAT_WAV : return "WAV" ;
Chris@40 402 case SF_FORMAT_AIFF : return "AIFF" ;
Chris@40 403 case SF_FORMAT_AU : return "AU" ;
Chris@40 404 case SF_FORMAT_RAW : return "RAW" ;
Chris@40 405 case SF_FORMAT_PAF : return "PAF" ;
Chris@40 406 case SF_FORMAT_SVX : return "SVX" ;
Chris@40 407 case SF_FORMAT_NIST : return "NIST" ;
Chris@40 408 case SF_FORMAT_VOC : return "VOC" ;
Chris@40 409 case SF_FORMAT_IRCAM : return "IRCAM" ;
Chris@40 410 case SF_FORMAT_W64 : return "W64" ;
Chris@40 411 case SF_FORMAT_MAT4 : return "MAT4" ;
Chris@40 412 case SF_FORMAT_MAT5 : return "MAT5" ;
Chris@40 413 case SF_FORMAT_PVF : return "PVF" ;
Chris@40 414 case SF_FORMAT_XI : return "XI" ;
Chris@40 415 case SF_FORMAT_HTK : return "HTK" ;
Chris@40 416 case SF_FORMAT_SDS : return "SDS" ;
Chris@40 417 case SF_FORMAT_AVR : return "AVR" ;
Chris@40 418 case SF_FORMAT_WAVEX : return "WAVEX" ;
Chris@40 419 case SF_FORMAT_SD2 : return "SD2" ;
Chris@40 420 case SF_FORMAT_FLAC : return "FLAC" ;
Chris@40 421 case SF_FORMAT_CAF : return "CAF" ;
Chris@40 422 case SF_FORMAT_WVE : return "WVE" ;
Chris@40 423 case SF_FORMAT_OGG : return "OGG" ;
Chris@40 424 case SF_FORMAT_MPC2K : return "MPC2K" ;
Chris@40 425 case SF_FORMAT_RF64 : return "RF64" ;
Chris@40 426 default : break ;
Chris@40 427 } ;
Chris@40 428
Chris@40 429 return "unknown" ;
Chris@40 430 } /* sfe_container_name */
Chris@40 431
Chris@40 432 const char *
Chris@40 433 sfe_codec_name (int format)
Chris@40 434 {
Chris@40 435 switch (format & SF_FORMAT_SUBMASK)
Chris@40 436 { case SF_FORMAT_PCM_S8 : return "signed 8 bit PCM" ;
Chris@40 437 case SF_FORMAT_PCM_16 : return "16 bit PCM" ;
Chris@40 438 case SF_FORMAT_PCM_24 : return "24 bit PCM" ;
Chris@40 439 case SF_FORMAT_PCM_32 : return "32 bit PCM" ;
Chris@40 440 case SF_FORMAT_PCM_U8 : return "unsigned 8 bit PCM" ;
Chris@40 441 case SF_FORMAT_FLOAT : return "32 bit float" ;
Chris@40 442 case SF_FORMAT_DOUBLE : return "64 bit double" ;
Chris@40 443 case SF_FORMAT_ULAW : return "u-law" ;
Chris@40 444 case SF_FORMAT_ALAW : return "a-law" ;
Chris@40 445 case SF_FORMAT_IMA_ADPCM : return "IMA ADPCM" ;
Chris@40 446 case SF_FORMAT_MS_ADPCM : return "MS ADPCM" ;
Chris@40 447 case SF_FORMAT_GSM610 : return "gsm610" ;
Chris@40 448 case SF_FORMAT_VOX_ADPCM : return "Vox ADPCM" ;
Chris@40 449 case SF_FORMAT_G721_32 : return "g721 32kbps" ;
Chris@40 450 case SF_FORMAT_G723_24 : return "g723 24kbps" ;
Chris@40 451 case SF_FORMAT_G723_40 : return "g723 40kbps" ;
Chris@40 452 case SF_FORMAT_DWVW_12 : return "12 bit DWVW" ;
Chris@40 453 case SF_FORMAT_DWVW_16 : return "16 bit DWVW" ;
Chris@40 454 case SF_FORMAT_DWVW_24 : return "14 bit DWVW" ;
Chris@40 455 case SF_FORMAT_DWVW_N : return "DWVW" ;
Chris@40 456 case SF_FORMAT_DPCM_8 : return "8 bit DPCM" ;
Chris@40 457 case SF_FORMAT_DPCM_16 : return "16 bit DPCM" ;
Chris@40 458 case SF_FORMAT_VORBIS : return "Vorbis" ;
Chris@40 459 case SF_FORMAT_ALAC_16 : return "16 bit ALAC" ;
Chris@40 460 case SF_FORMAT_ALAC_20 : return "20 bit ALAC" ;
Chris@40 461 case SF_FORMAT_ALAC_24 : return "24 bit ALAC" ;
Chris@40 462 case SF_FORMAT_ALAC_32 : return "32 bit ALAC" ;
Chris@40 463 default : break ;
Chris@40 464 } ;
Chris@40 465 return "unknown" ;
Chris@40 466 } /* sfe_codec_name */
Chris@40 467