annotate src/libsndfile-1.0.25/src/xi.c @ 14:48209aa7aa51

Add Vamp builds
author Chris Cannam
date Wed, 20 Mar 2013 16:05:58 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 ** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@0 3 **
Chris@0 4 ** This program is free software; you can redistribute it and/or modify
Chris@0 5 ** it under the terms of the GNU Lesser General Public License as published by
Chris@0 6 ** the Free Software Foundation; either version 2.1 of the License, or
Chris@0 7 ** (at your option) any later version.
Chris@0 8 **
Chris@0 9 ** This program is distributed in the hope that it will be useful,
Chris@0 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 ** GNU Lesser General Public License for more details.
Chris@0 13 **
Chris@0 14 ** You should have received a copy of the GNU Lesser General Public License
Chris@0 15 ** along with this program; if not, write to the Free Software
Chris@0 16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Chris@0 17 */
Chris@0 18
Chris@0 19 #include "sfconfig.h"
Chris@0 20
Chris@0 21 #include <stdio.h>
Chris@0 22 #include <stdlib.h>
Chris@0 23 #include <fcntl.h>
Chris@0 24 #include <string.h>
Chris@0 25 #include <ctype.h>
Chris@0 26 #include <math.h>
Chris@0 27
Chris@0 28 #include "sndfile.h"
Chris@0 29 #include "sfendian.h"
Chris@0 30 #include "common.h"
Chris@0 31
Chris@0 32 #define MAX_XI_SAMPLES 16
Chris@0 33
Chris@0 34 /*------------------------------------------------------------------------------
Chris@0 35 ** Private static functions and tyepdefs.
Chris@0 36 */
Chris@0 37
Chris@0 38 typedef struct
Chris@0 39 { /* Warning, this filename is NOT nul terminated. */
Chris@0 40 char filename [22] ;
Chris@0 41 char software [20] ;
Chris@0 42 char sample_name [22] ;
Chris@0 43
Chris@0 44 int loop_begin, loop_end ;
Chris@0 45 int sample_flags ;
Chris@0 46
Chris@0 47 /* Data for encoder and decoder. */
Chris@0 48 short last_16 ;
Chris@0 49 } XI_PRIVATE ;
Chris@0 50
Chris@0 51 static int xi_close (SF_PRIVATE *psf) ;
Chris@0 52 static int xi_write_header (SF_PRIVATE *psf, int calc_length) ;
Chris@0 53 static int xi_read_header (SF_PRIVATE *psf) ;
Chris@0 54 static int dpcm_init (SF_PRIVATE *psf) ;
Chris@0 55
Chris@0 56
Chris@0 57 static sf_count_t dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
Chris@0 58
Chris@0 59 /*------------------------------------------------------------------------------
Chris@0 60 ** Public function.
Chris@0 61 */
Chris@0 62
Chris@0 63 int
Chris@0 64 xi_open (SF_PRIVATE *psf)
Chris@0 65 { XI_PRIVATE *pxi ;
Chris@0 66 int subformat, error = 0 ;
Chris@0 67
Chris@0 68 if (psf->is_pipe)
Chris@0 69 return SFE_XI_NO_PIPE ;
Chris@0 70
Chris@0 71 if (psf->codec_data)
Chris@0 72 pxi = psf->codec_data ;
Chris@0 73 else if ((pxi = calloc (1, sizeof (XI_PRIVATE))) == NULL)
Chris@0 74 return SFE_MALLOC_FAILED ;
Chris@0 75
Chris@0 76 psf->codec_data = pxi ;
Chris@0 77
Chris@0 78 if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
Chris@0 79 { if ((error = xi_read_header (psf)))
Chris@0 80 return error ;
Chris@0 81 } ;
Chris@0 82
Chris@0 83 subformat = SF_CODEC (psf->sf.format) ;
Chris@0 84
Chris@0 85 if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
Chris@0 86 { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_XI)
Chris@0 87 return SFE_BAD_OPEN_FORMAT ;
Chris@0 88
Chris@0 89 psf->endian = SF_ENDIAN_LITTLE ;
Chris@0 90 psf->sf.channels = 1 ; /* Always mono */
Chris@0 91 psf->sf.samplerate = 44100 ; /* Always */
Chris@0 92
Chris@0 93 /* Set up default instrument and software name. */
Chris@0 94 memcpy (pxi->filename, "Default Name ", sizeof (pxi->filename)) ;
Chris@0 95 memcpy (pxi->software, PACKAGE "-" VERSION " ", sizeof (pxi->software)) ;
Chris@0 96
Chris@0 97 memset (pxi->sample_name, 0, sizeof (pxi->sample_name)) ;
Chris@0 98 snprintf (pxi->sample_name, sizeof (pxi->sample_name), "%s", "Sample #1") ;
Chris@0 99
Chris@0 100 pxi->sample_flags = (subformat == SF_FORMAT_DPCM_16) ? 16 : 0 ;
Chris@0 101
Chris@0 102 if (xi_write_header (psf, SF_FALSE))
Chris@0 103 return psf->error ;
Chris@0 104
Chris@0 105 psf->write_header = xi_write_header ;
Chris@0 106 } ;
Chris@0 107
Chris@0 108 psf->container_close = xi_close ;
Chris@0 109 psf->seek = dpcm_seek ;
Chris@0 110
Chris@0 111 psf->sf.seekable = SF_FALSE ;
Chris@0 112
Chris@0 113 psf->blockwidth = psf->bytewidth * psf->sf.channels ;
Chris@0 114
Chris@0 115 switch (subformat)
Chris@0 116 { case SF_FORMAT_DPCM_8 : /* 8-bit differential PCM. */
Chris@0 117 case SF_FORMAT_DPCM_16 : /* 16-bit differential PCM. */
Chris@0 118 error = dpcm_init (psf) ;
Chris@0 119 break ;
Chris@0 120
Chris@0 121 default : break ;
Chris@0 122 } ;
Chris@0 123
Chris@0 124 return error ;
Chris@0 125 } /* xi_open */
Chris@0 126
Chris@0 127 /*------------------------------------------------------------------------------
Chris@0 128 */
Chris@0 129
Chris@0 130 static int
Chris@0 131 xi_close (SF_PRIVATE * UNUSED (psf))
Chris@0 132 {
Chris@0 133 return 0 ;
Chris@0 134 } /* xi_close */
Chris@0 135
Chris@0 136 /*==============================================================================
Chris@0 137 */
Chris@0 138
Chris@0 139 static sf_count_t dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
Chris@0 140 static sf_count_t dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
Chris@0 141 static sf_count_t dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
Chris@0 142 static sf_count_t dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
Chris@0 143
Chris@0 144 static sf_count_t dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
Chris@0 145 static sf_count_t dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
Chris@0 146 static sf_count_t dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
Chris@0 147 static sf_count_t dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
Chris@0 148
Chris@0 149 static sf_count_t dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
Chris@0 150 static sf_count_t dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
Chris@0 151 static sf_count_t dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
Chris@0 152 static sf_count_t dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
Chris@0 153
Chris@0 154 static sf_count_t dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
Chris@0 155 static sf_count_t dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
Chris@0 156 static sf_count_t dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
Chris@0 157 static sf_count_t dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
Chris@0 158
Chris@0 159 static int
Chris@0 160 dpcm_init (SF_PRIVATE *psf)
Chris@0 161 { if (psf->bytewidth == 0 || psf->sf.channels == 0)
Chris@0 162 return SFE_INTERNAL ;
Chris@0 163
Chris@0 164 psf->blockwidth = psf->bytewidth * psf->sf.channels ;
Chris@0 165
Chris@0 166 if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
Chris@0 167 { switch (psf->bytewidth)
Chris@0 168 { case 1 :
Chris@0 169 psf->read_short = dpcm_read_dsc2s ;
Chris@0 170 psf->read_int = dpcm_read_dsc2i ;
Chris@0 171 psf->read_float = dpcm_read_dsc2f ;
Chris@0 172 psf->read_double = dpcm_read_dsc2d ;
Chris@0 173 break ;
Chris@0 174 case 2 :
Chris@0 175 psf->read_short = dpcm_read_dles2s ;
Chris@0 176 psf->read_int = dpcm_read_dles2i ;
Chris@0 177 psf->read_float = dpcm_read_dles2f ;
Chris@0 178 psf->read_double = dpcm_read_dles2d ;
Chris@0 179 break ;
Chris@0 180 default :
Chris@0 181 psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTED\n") ;
Chris@0 182 return SFE_UNIMPLEMENTED ;
Chris@0 183 } ;
Chris@0 184 } ;
Chris@0 185
Chris@0 186 if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
Chris@0 187 { switch (psf->bytewidth)
Chris@0 188 { case 1 :
Chris@0 189 psf->write_short = dpcm_write_s2dsc ;
Chris@0 190 psf->write_int = dpcm_write_i2dsc ;
Chris@0 191 psf->write_float = dpcm_write_f2dsc ;
Chris@0 192 psf->write_double = dpcm_write_d2dsc ;
Chris@0 193 break ;
Chris@0 194 case 2 :
Chris@0 195 psf->write_short = dpcm_write_s2dles ;
Chris@0 196 psf->write_int = dpcm_write_i2dles ;
Chris@0 197 psf->write_float = dpcm_write_f2dles ;
Chris@0 198 psf->write_double = dpcm_write_d2dles ;
Chris@0 199 break ;
Chris@0 200 default :
Chris@0 201 psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTED\n") ;
Chris@0 202 return SFE_UNIMPLEMENTED ;
Chris@0 203 } ;
Chris@0 204 } ;
Chris@0 205
Chris@0 206 psf->filelength = psf_get_filelen (psf) ;
Chris@0 207 psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset :
Chris@0 208 psf->filelength - psf->dataoffset ;
Chris@0 209 psf->sf.frames = psf->datalength / psf->blockwidth ;
Chris@0 210
Chris@0 211 return 0 ;
Chris@0 212 } /* dpcm_init */
Chris@0 213
Chris@0 214 /*==============================================================================
Chris@0 215 */
Chris@0 216
Chris@0 217 static sf_count_t
Chris@0 218 dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
Chris@0 219 { XI_PRIVATE *pxi ;
Chris@0 220 int total, bufferlen, len ;
Chris@0 221
Chris@0 222 if ((pxi = psf->codec_data) == NULL)
Chris@0 223 return SFE_INTERNAL ;
Chris@0 224
Chris@0 225 if (psf->datalength < 0 || psf->dataoffset < 0)
Chris@0 226 { psf->error = SFE_BAD_SEEK ;
Chris@0 227 return PSF_SEEK_ERROR ;
Chris@0 228 } ;
Chris@0 229
Chris@0 230 if (offset == 0)
Chris@0 231 { psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
Chris@0 232 pxi->last_16 = 0 ;
Chris@0 233 return 0 ;
Chris@0 234 } ;
Chris@0 235
Chris@0 236 if (offset < 0 || offset > psf->sf.frames)
Chris@0 237 { psf->error = SFE_BAD_SEEK ;
Chris@0 238 return PSF_SEEK_ERROR ;
Chris@0 239 } ;
Chris@0 240
Chris@0 241 if (mode != SFM_READ)
Chris@0 242 { /* What to do about write??? */
Chris@0 243 psf->error = SFE_BAD_SEEK ;
Chris@0 244 return PSF_SEEK_ERROR ;
Chris@0 245 } ;
Chris@0 246
Chris@0 247 psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
Chris@0 248
Chris@0 249 if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DPCM_16)
Chris@0 250 { total = offset ;
Chris@0 251 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
Chris@0 252 while (total > 0)
Chris@0 253 { len = (total > bufferlen) ? bufferlen : total ;
Chris@0 254 total -= dpcm_read_dles2s (psf, psf->u.sbuf, len) ;
Chris@0 255 } ;
Chris@0 256 }
Chris@0 257 else
Chris@0 258 { total = offset ;
Chris@0 259 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
Chris@0 260 while (total > 0)
Chris@0 261 { len = (total > bufferlen) ? bufferlen : total ;
Chris@0 262 total -= dpcm_read_dsc2s (psf, psf->u.sbuf, len) ;
Chris@0 263 } ;
Chris@0 264 } ;
Chris@0 265
Chris@0 266 return offset ;
Chris@0 267 } /* dpcm_seek */
Chris@0 268
Chris@0 269
Chris@0 270 static int
Chris@0 271 xi_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
Chris@0 272 { XI_PRIVATE *pxi ;
Chris@0 273 sf_count_t current ;
Chris@0 274 const char *string ;
Chris@0 275
Chris@0 276 if ((pxi = psf->codec_data) == NULL)
Chris@0 277 return SFE_INTERNAL ;
Chris@0 278
Chris@0 279 current = psf_ftell (psf) ;
Chris@0 280
Chris@0 281 /* Reset the current header length to zero. */
Chris@0 282 psf->header [0] = 0 ;
Chris@0 283 psf->headindex = 0 ;
Chris@0 284 psf_fseek (psf, 0, SEEK_SET) ;
Chris@0 285
Chris@0 286 string = "Extended Instrument: " ;
Chris@0 287 psf_binheader_writef (psf, "b", string, strlen (string)) ;
Chris@0 288 psf_binheader_writef (psf, "b1", pxi->filename, sizeof (pxi->filename), 0x1A) ;
Chris@0 289
Chris@0 290 /* Write software version and two byte XI version. */
Chris@0 291 psf_binheader_writef (psf, "eb2", pxi->software, sizeof (pxi->software), (1 << 8) + 2) ;
Chris@0 292
Chris@0 293 /*
Chris@0 294 ** Jump note numbers (96), volume envelope (48), pan envelope (48),
Chris@0 295 ** volume points (1), pan points (1)
Chris@0 296 */
Chris@0 297 psf_binheader_writef (psf, "z", (size_t) (96 + 48 + 48 + 1 + 1)) ;
Chris@0 298
Chris@0 299 /* Jump volume loop (3 bytes), pan loop (3), envelope flags (3), vibrato (3)
Chris@0 300 ** fade out (2), 22 unknown bytes, and then write sample_count (2 bytes).
Chris@0 301 */
Chris@0 302 psf_binheader_writef (psf, "ez2z2", (size_t) (4 * 3), 0x1234, make_size_t (22), 1) ;
Chris@0 303
Chris@0 304 pxi->loop_begin = 0 ;
Chris@0 305 pxi->loop_end = 0 ;
Chris@0 306
Chris@0 307 psf_binheader_writef (psf, "et844", psf->sf.frames, pxi->loop_begin, pxi->loop_end) ;
Chris@0 308
Chris@0 309 /* volume, fine tune, flags, pan, note, namelen */
Chris@0 310 psf_binheader_writef (psf, "111111", 128, 0, pxi->sample_flags, 128, 0, strlen (pxi->sample_name)) ;
Chris@0 311
Chris@0 312 psf_binheader_writef (psf, "b", pxi->sample_name, sizeof (pxi->sample_name)) ;
Chris@0 313
Chris@0 314
Chris@0 315
Chris@0 316
Chris@0 317
Chris@0 318 /* Header construction complete so write it out. */
Chris@0 319 psf_fwrite (psf->header, psf->headindex, 1, psf) ;
Chris@0 320
Chris@0 321 if (psf->error)
Chris@0 322 return psf->error ;
Chris@0 323
Chris@0 324 psf->dataoffset = psf->headindex ;
Chris@0 325
Chris@0 326 if (current > 0)
Chris@0 327 psf_fseek (psf, current, SEEK_SET) ;
Chris@0 328
Chris@0 329 return psf->error ;
Chris@0 330 } /* xi_write_header */
Chris@0 331
Chris@0 332 static int
Chris@0 333 xi_read_header (SF_PRIVATE *psf)
Chris@0 334 { char buffer [64], name [32] ;
Chris@0 335 short version, fade_out, sample_count ;
Chris@0 336 int k, loop_begin, loop_end ;
Chris@0 337 int sample_sizes [MAX_XI_SAMPLES] ;
Chris@0 338
Chris@0 339 psf_binheader_readf (psf, "pb", 0, buffer, 21) ;
Chris@0 340
Chris@0 341 memset (sample_sizes, 0, sizeof (sample_sizes)) ;
Chris@0 342
Chris@0 343 buffer [20] = 0 ;
Chris@0 344 if (strcmp (buffer, "Extended Instrument:") != 0)
Chris@0 345 return SFE_XI_BAD_HEADER ;
Chris@0 346
Chris@0 347 memset (buffer, 0, sizeof (buffer)) ;
Chris@0 348 psf_binheader_readf (psf, "b", buffer, 23) ;
Chris@0 349
Chris@0 350 if (buffer [22] != 0x1A)
Chris@0 351 return SFE_XI_BAD_HEADER ;
Chris@0 352
Chris@0 353 buffer [22] = 0 ;
Chris@0 354 psf_log_printf (psf, "Extended Instrument : %s\n", buffer) ;
Chris@0 355
Chris@0 356 psf_binheader_readf (psf, "be2", buffer, 20, &version) ;
Chris@0 357 buffer [19] = 0 ;
Chris@0 358 psf_log_printf (psf, "Software : %s\nVersion : %d.%02d\n", buffer, version / 256, version % 256) ;
Chris@0 359
Chris@0 360 /* Jump note numbers (96), volume envelope (48), pan envelope (48),
Chris@0 361 ** volume points (1), pan points (1)
Chris@0 362 */
Chris@0 363 psf_binheader_readf (psf, "j", 96 + 48 + 48 + 1 + 1) ;
Chris@0 364
Chris@0 365 psf_binheader_readf (psf, "b", buffer, 12) ;
Chris@0 366 psf_log_printf (psf, "Volume Loop\n sustain : %u\n begin : %u\n end : %u\n",
Chris@0 367 buffer [0], buffer [1], buffer [2]) ;
Chris@0 368 psf_log_printf (psf, "Pan Loop\n sustain : %u\n begin : %u\n end : %u\n",
Chris@0 369 buffer [3], buffer [4], buffer [5]) ;
Chris@0 370 psf_log_printf (psf, "Envelope Flags\n volume : 0x%X\n pan : 0x%X\n",
Chris@0 371 buffer [6] & 0xFF, buffer [7] & 0xFF) ;
Chris@0 372
Chris@0 373 psf_log_printf (psf, "Vibrato\n type : %u\n sweep : %u\n depth : %u\n rate : %u\n",
Chris@0 374 buffer [8], buffer [9], buffer [10], buffer [11]) ;
Chris@0 375
Chris@0 376 /*
Chris@0 377 ** Read fade_out then jump reserved (2 bytes) and ???? (20 bytes) and
Chris@0 378 ** sample_count.
Chris@0 379 */
Chris@0 380 psf_binheader_readf (psf, "e2j2", &fade_out, 2 + 20, &sample_count) ;
Chris@0 381 psf_log_printf (psf, "Fade out : %d\n", fade_out) ;
Chris@0 382
Chris@0 383 /* XI file can contain up to 16 samples. */
Chris@0 384 if (sample_count > MAX_XI_SAMPLES)
Chris@0 385 return SFE_XI_EXCESS_SAMPLES ;
Chris@0 386
Chris@0 387 if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL)
Chris@0 388 return SFE_MALLOC_FAILED ;
Chris@0 389
Chris@0 390 /* Log all data for each sample. */
Chris@0 391 for (k = 0 ; k < sample_count ; k++)
Chris@0 392 { psf_binheader_readf (psf, "e444", &(sample_sizes [k]), &loop_begin, &loop_end) ;
Chris@0 393
Chris@0 394 /* Read 5 know bytes, 1 unknown byte and 22 name bytes. */
Chris@0 395 psf_binheader_readf (psf, "bb", buffer, 6, name, 22) ;
Chris@0 396 name [21] = 0 ;
Chris@0 397
Chris@0 398 psf_log_printf (psf, "Sample #%d\n name : %s\n", k + 1, name) ;
Chris@0 399
Chris@0 400 psf_log_printf (psf, " size : %d\n", sample_sizes [k]) ;
Chris@0 401
Chris@0 402
Chris@0 403
Chris@0 404 psf_log_printf (psf, " loop\n begin : %d\n end : %d\n", loop_begin, loop_end) ;
Chris@0 405
Chris@0 406 psf_log_printf (psf, " volume : %u\n f. tune : %d\n flags : 0x%02X ",
Chris@0 407 buffer [0] & 0xFF, buffer [1] & 0xFF, buffer [2] & 0xFF) ;
Chris@0 408
Chris@0 409 psf_log_printf (psf, " (") ;
Chris@0 410 if (buffer [2] & 1)
Chris@0 411 psf_log_printf (psf, " Loop") ;
Chris@0 412 if (buffer [2] & 2)
Chris@0 413 psf_log_printf (psf, " PingPong") ;
Chris@0 414 psf_log_printf (psf, (buffer [2] & 16) ? " 16bit" : " 8bit") ;
Chris@0 415 psf_log_printf (psf, " )\n") ;
Chris@0 416
Chris@0 417 psf_log_printf (psf, " pan : %u\n note : %d\n namelen : %d\n",
Chris@0 418 buffer [3] & 0xFF, buffer [4], buffer [5]) ;
Chris@0 419
Chris@0 420 if (k != 0)
Chris@0 421 continue ;
Chris@0 422
Chris@0 423 if (buffer [2] & 16)
Chris@0 424 { psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_16 ;
Chris@0 425 psf->bytewidth = 2 ;
Chris@0 426 }
Chris@0 427 else
Chris@0 428 { psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_8 ;
Chris@0 429 psf->bytewidth = 1 ;
Chris@0 430 } ;
Chris@0 431 } ;
Chris@0 432
Chris@0 433 while (sample_count > 1 && sample_sizes [sample_count - 1] == 0)
Chris@0 434 sample_count -- ;
Chris@0 435
Chris@0 436 /* Currently, we can only handle 1 sample per file. */
Chris@0 437
Chris@0 438 if (sample_count > 2)
Chris@0 439 { psf_log_printf (psf, "*** Sample count is less than 16 but more than 1.\n") ;
Chris@0 440 psf_log_printf (psf, " sample count : %d sample_sizes [%d] : %d\n",
Chris@0 441 sample_count, sample_count - 1, sample_sizes [sample_count - 1]) ;
Chris@0 442 return SFE_XI_EXCESS_SAMPLES ;
Chris@0 443 } ;
Chris@0 444
Chris@0 445 psf->datalength = sample_sizes [0] ;
Chris@0 446
Chris@0 447 psf->dataoffset = psf_ftell (psf) ;
Chris@0 448 if (psf->dataoffset < 0)
Chris@0 449 { psf_log_printf (psf, "*** Bad Data Offset : %D\n", psf->dataoffset) ;
Chris@0 450 return SFE_BAD_OFFSET ;
Chris@0 451 } ;
Chris@0 452 psf_log_printf (psf, "Data Offset : %D\n", psf->dataoffset) ;
Chris@0 453
Chris@0 454 if (psf->dataoffset + psf->datalength > psf->filelength)
Chris@0 455 { psf_log_printf (psf, "*** File seems to be truncated. Should be at least %D bytes long.\n",
Chris@0 456 psf->dataoffset + sample_sizes [0]) ;
Chris@0 457 psf->datalength = psf->filelength - psf->dataoffset ;
Chris@0 458 } ;
Chris@0 459
Chris@0 460 if (psf_fseek (psf, psf->dataoffset, SEEK_SET) != psf->dataoffset)
Chris@0 461 return SFE_BAD_SEEK ;
Chris@0 462
Chris@0 463 psf->endian = SF_ENDIAN_LITTLE ;
Chris@0 464 psf->sf.channels = 1 ; /* Always mono */
Chris@0 465 psf->sf.samplerate = 44100 ; /* Always */
Chris@0 466
Chris@0 467 psf->blockwidth = psf->sf.channels * psf->bytewidth ;
Chris@0 468
Chris@0 469 if (! psf->sf.frames && psf->blockwidth)
Chris@0 470 psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
Chris@0 471
Chris@0 472 psf->instrument->basenote = 0 ;
Chris@0 473 psf->instrument->gain = 1 ;
Chris@0 474 psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ;
Chris@0 475 psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ;
Chris@0 476
Chris@0 477 return 0 ;
Chris@0 478 } /* xi_read_header */
Chris@0 479
Chris@0 480 /*==============================================================================
Chris@0 481 */
Chris@0 482
Chris@0 483 static void dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest) ;
Chris@0 484 static void dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest) ;
Chris@0 485 static void dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact) ;
Chris@0 486 static void dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact) ;
Chris@0 487
Chris@0 488 static void dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest) ;
Chris@0 489 static void dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest) ;
Chris@0 490 static void dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact) ;
Chris@0 491 static void dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact) ;
Chris@0 492
Chris@0 493 static sf_count_t
Chris@0 494 dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
Chris@0 495 { XI_PRIVATE *pxi ;
Chris@0 496 int bufferlen, readcount ;
Chris@0 497 sf_count_t total = 0 ;
Chris@0 498
Chris@0 499 if ((pxi = psf->codec_data) == NULL)
Chris@0 500 return 0 ;
Chris@0 501
Chris@0 502 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
Chris@0 503
Chris@0 504 while (len > 0)
Chris@0 505 { if (len < bufferlen)
Chris@0 506 bufferlen = (int) len ;
Chris@0 507 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
Chris@0 508 dsc2s_array (pxi, psf->u.scbuf, readcount, ptr + total) ;
Chris@0 509 total += readcount ;
Chris@0 510 if (readcount < bufferlen)
Chris@0 511 break ;
Chris@0 512 len -= readcount ;
Chris@0 513 } ;
Chris@0 514
Chris@0 515 return total ;
Chris@0 516 } /* dpcm_read_dsc2s */
Chris@0 517
Chris@0 518 static sf_count_t
Chris@0 519 dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
Chris@0 520 { XI_PRIVATE *pxi ;
Chris@0 521 int bufferlen, readcount ;
Chris@0 522 sf_count_t total = 0 ;
Chris@0 523
Chris@0 524 if ((pxi = psf->codec_data) == NULL)
Chris@0 525 return 0 ;
Chris@0 526
Chris@0 527 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
Chris@0 528
Chris@0 529 while (len > 0)
Chris@0 530 { if (len < bufferlen)
Chris@0 531 bufferlen = (int) len ;
Chris@0 532 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
Chris@0 533 dsc2i_array (pxi, psf->u.scbuf, readcount, ptr + total) ;
Chris@0 534 total += readcount ;
Chris@0 535 if (readcount < bufferlen)
Chris@0 536 break ;
Chris@0 537 len -= readcount ;
Chris@0 538 } ;
Chris@0 539
Chris@0 540 return total ;
Chris@0 541 } /* dpcm_read_dsc2i */
Chris@0 542
Chris@0 543 static sf_count_t
Chris@0 544 dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
Chris@0 545 { XI_PRIVATE *pxi ;
Chris@0 546 int bufferlen, readcount ;
Chris@0 547 sf_count_t total = 0 ;
Chris@0 548 float normfact ;
Chris@0 549
Chris@0 550 if ((pxi = psf->codec_data) == NULL)
Chris@0 551 return 0 ;
Chris@0 552
Chris@0 553 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
Chris@0 554
Chris@0 555 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
Chris@0 556
Chris@0 557 while (len > 0)
Chris@0 558 { if (len < bufferlen)
Chris@0 559 bufferlen = (int) len ;
Chris@0 560 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
Chris@0 561 dsc2f_array (pxi, psf->u.scbuf, readcount, ptr + total, normfact) ;
Chris@0 562 total += readcount ;
Chris@0 563 if (readcount < bufferlen)
Chris@0 564 break ;
Chris@0 565 len -= readcount ;
Chris@0 566 } ;
Chris@0 567
Chris@0 568 return total ;
Chris@0 569 } /* dpcm_read_dsc2f */
Chris@0 570
Chris@0 571 static sf_count_t
Chris@0 572 dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
Chris@0 573 { XI_PRIVATE *pxi ;
Chris@0 574 int bufferlen, readcount ;
Chris@0 575 sf_count_t total = 0 ;
Chris@0 576 double normfact ;
Chris@0 577
Chris@0 578 if ((pxi = psf->codec_data) == NULL)
Chris@0 579 return 0 ;
Chris@0 580
Chris@0 581 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
Chris@0 582
Chris@0 583 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
Chris@0 584
Chris@0 585 while (len > 0)
Chris@0 586 { if (len < bufferlen)
Chris@0 587 bufferlen = (int) len ;
Chris@0 588 readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
Chris@0 589 dsc2d_array (pxi, psf->u.scbuf, readcount, ptr + total, normfact) ;
Chris@0 590 total += readcount ;
Chris@0 591 if (readcount < bufferlen)
Chris@0 592 break ;
Chris@0 593 len -= readcount ;
Chris@0 594 } ;
Chris@0 595
Chris@0 596 return total ;
Chris@0 597 } /* dpcm_read_dsc2d */
Chris@0 598
Chris@0 599 /*------------------------------------------------------------------------------
Chris@0 600 */
Chris@0 601
Chris@0 602 static sf_count_t
Chris@0 603 dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
Chris@0 604 { XI_PRIVATE *pxi ;
Chris@0 605 int bufferlen, readcount ;
Chris@0 606 sf_count_t total = 0 ;
Chris@0 607
Chris@0 608 if ((pxi = psf->codec_data) == NULL)
Chris@0 609 return 0 ;
Chris@0 610
Chris@0 611 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
Chris@0 612
Chris@0 613 while (len > 0)
Chris@0 614 { if (len < bufferlen)
Chris@0 615 bufferlen = (int) len ;
Chris@0 616 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
Chris@0 617 dles2s_array (pxi, psf->u.sbuf, readcount, ptr + total) ;
Chris@0 618 total += readcount ;
Chris@0 619 if (readcount < bufferlen)
Chris@0 620 break ;
Chris@0 621 len -= readcount ;
Chris@0 622 } ;
Chris@0 623
Chris@0 624 return total ;
Chris@0 625 } /* dpcm_read_dles2s */
Chris@0 626
Chris@0 627 static sf_count_t
Chris@0 628 dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
Chris@0 629 { XI_PRIVATE *pxi ;
Chris@0 630 int bufferlen, readcount ;
Chris@0 631 sf_count_t total = 0 ;
Chris@0 632
Chris@0 633 if ((pxi = psf->codec_data) == NULL)
Chris@0 634 return 0 ;
Chris@0 635
Chris@0 636 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
Chris@0 637
Chris@0 638 while (len > 0)
Chris@0 639 { if (len < bufferlen)
Chris@0 640 bufferlen = (int) len ;
Chris@0 641 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
Chris@0 642 dles2i_array (pxi, psf->u.sbuf, readcount, ptr + total) ;
Chris@0 643 total += readcount ;
Chris@0 644 if (readcount < bufferlen)
Chris@0 645 break ;
Chris@0 646 len -= readcount ;
Chris@0 647 } ;
Chris@0 648
Chris@0 649 return total ;
Chris@0 650 } /* dpcm_read_dles2i */
Chris@0 651
Chris@0 652 static sf_count_t
Chris@0 653 dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
Chris@0 654 { XI_PRIVATE *pxi ;
Chris@0 655 int bufferlen, readcount ;
Chris@0 656 sf_count_t total = 0 ;
Chris@0 657 float normfact ;
Chris@0 658
Chris@0 659 if ((pxi = psf->codec_data) == NULL)
Chris@0 660 return 0 ;
Chris@0 661
Chris@0 662 normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
Chris@0 663
Chris@0 664 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
Chris@0 665
Chris@0 666 while (len > 0)
Chris@0 667 { if (len < bufferlen)
Chris@0 668 bufferlen = (int) len ;
Chris@0 669 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
Chris@0 670 dles2f_array (pxi, psf->u.sbuf, readcount, ptr + total, normfact) ;
Chris@0 671 total += readcount ;
Chris@0 672 if (readcount < bufferlen)
Chris@0 673 break ;
Chris@0 674 len -= readcount ;
Chris@0 675 } ;
Chris@0 676
Chris@0 677 return total ;
Chris@0 678 } /* dpcm_read_dles2f */
Chris@0 679
Chris@0 680 static sf_count_t
Chris@0 681 dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
Chris@0 682 { XI_PRIVATE *pxi ;
Chris@0 683 int bufferlen, readcount ;
Chris@0 684 sf_count_t total = 0 ;
Chris@0 685 double normfact ;
Chris@0 686
Chris@0 687 if ((pxi = psf->codec_data) == NULL)
Chris@0 688 return 0 ;
Chris@0 689
Chris@0 690 normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
Chris@0 691
Chris@0 692 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
Chris@0 693
Chris@0 694 while (len > 0)
Chris@0 695 { if (len < bufferlen)
Chris@0 696 bufferlen = (int) len ;
Chris@0 697 readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
Chris@0 698 dles2d_array (pxi, psf->u.sbuf, readcount, ptr + total, normfact) ;
Chris@0 699 total += readcount ;
Chris@0 700 if (readcount < bufferlen)
Chris@0 701 break ;
Chris@0 702 len -= readcount ;
Chris@0 703 } ;
Chris@0 704
Chris@0 705 return total ;
Chris@0 706 } /* dpcm_read_dles2d */
Chris@0 707
Chris@0 708 /*==============================================================================
Chris@0 709 */
Chris@0 710
Chris@0 711 static void s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count) ;
Chris@0 712 static void i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count) ;
Chris@0 713 static void f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact) ;
Chris@0 714 static void d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact) ;
Chris@0 715
Chris@0 716 static void s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count) ;
Chris@0 717 static void i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count) ;
Chris@0 718 static void f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact) ;
Chris@0 719 static void d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact) ;
Chris@0 720
Chris@0 721
Chris@0 722 static sf_count_t
Chris@0 723 dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
Chris@0 724 { XI_PRIVATE *pxi ;
Chris@0 725 int bufferlen, writecount ;
Chris@0 726 sf_count_t total = 0 ;
Chris@0 727
Chris@0 728 if ((pxi = psf->codec_data) == NULL)
Chris@0 729 return 0 ;
Chris@0 730
Chris@0 731 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
Chris@0 732
Chris@0 733 while (len > 0)
Chris@0 734 { if (len < bufferlen)
Chris@0 735 bufferlen = (int) len ;
Chris@0 736 s2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen) ;
Chris@0 737 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
Chris@0 738 total += writecount ;
Chris@0 739 if (writecount < bufferlen)
Chris@0 740 break ;
Chris@0 741 len -= writecount ;
Chris@0 742 } ;
Chris@0 743
Chris@0 744 return total ;
Chris@0 745 } /* dpcm_write_s2dsc */
Chris@0 746
Chris@0 747 static sf_count_t
Chris@0 748 dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
Chris@0 749 { XI_PRIVATE *pxi ;
Chris@0 750 int bufferlen, writecount ;
Chris@0 751 sf_count_t total = 0 ;
Chris@0 752
Chris@0 753 if ((pxi = psf->codec_data) == NULL)
Chris@0 754 return 0 ;
Chris@0 755
Chris@0 756 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
Chris@0 757
Chris@0 758 while (len > 0)
Chris@0 759 { if (len < bufferlen)
Chris@0 760 bufferlen = (int) len ;
Chris@0 761 i2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen) ;
Chris@0 762 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
Chris@0 763 total += writecount ;
Chris@0 764 if (writecount < bufferlen)
Chris@0 765 break ;
Chris@0 766 len -= writecount ;
Chris@0 767 } ;
Chris@0 768
Chris@0 769 return total ;
Chris@0 770 } /* dpcm_write_i2dsc */
Chris@0 771
Chris@0 772 static sf_count_t
Chris@0 773 dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
Chris@0 774 { XI_PRIVATE *pxi ;
Chris@0 775 int bufferlen, writecount ;
Chris@0 776 sf_count_t total = 0 ;
Chris@0 777 float normfact ;
Chris@0 778
Chris@0 779 if ((pxi = psf->codec_data) == NULL)
Chris@0 780 return 0 ;
Chris@0 781
Chris@0 782 normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ;
Chris@0 783
Chris@0 784 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
Chris@0 785
Chris@0 786 while (len > 0)
Chris@0 787 { if (len < bufferlen)
Chris@0 788 bufferlen = (int) len ;
Chris@0 789 f2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen, normfact) ;
Chris@0 790 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
Chris@0 791 total += writecount ;
Chris@0 792 if (writecount < bufferlen)
Chris@0 793 break ;
Chris@0 794 len -= writecount ;
Chris@0 795 } ;
Chris@0 796
Chris@0 797 return total ;
Chris@0 798 } /* dpcm_write_f2dsc */
Chris@0 799
Chris@0 800 static sf_count_t
Chris@0 801 dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
Chris@0 802 { XI_PRIVATE *pxi ;
Chris@0 803 int bufferlen, writecount ;
Chris@0 804 sf_count_t total = 0 ;
Chris@0 805 double normfact ;
Chris@0 806
Chris@0 807 if ((pxi = psf->codec_data) == NULL)
Chris@0 808 return 0 ;
Chris@0 809
Chris@0 810 normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ;
Chris@0 811
Chris@0 812 bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
Chris@0 813
Chris@0 814 while (len > 0)
Chris@0 815 { if (len < bufferlen)
Chris@0 816 bufferlen = (int) len ;
Chris@0 817 d2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen, normfact) ;
Chris@0 818 writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
Chris@0 819 total += writecount ;
Chris@0 820 if (writecount < bufferlen)
Chris@0 821 break ;
Chris@0 822 len -= writecount ;
Chris@0 823 } ;
Chris@0 824
Chris@0 825 return total ;
Chris@0 826 } /* dpcm_write_d2dsc */
Chris@0 827
Chris@0 828
Chris@0 829 static sf_count_t
Chris@0 830 dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
Chris@0 831 { XI_PRIVATE *pxi ;
Chris@0 832 int bufferlen, writecount ;
Chris@0 833 sf_count_t total = 0 ;
Chris@0 834
Chris@0 835 if ((pxi = psf->codec_data) == NULL)
Chris@0 836 return 0 ;
Chris@0 837
Chris@0 838 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
Chris@0 839
Chris@0 840 while (len > 0)
Chris@0 841 { if (len < bufferlen)
Chris@0 842 bufferlen = (int) len ;
Chris@0 843 s2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen) ;
Chris@0 844 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
Chris@0 845 total += writecount ;
Chris@0 846 if (writecount < bufferlen)
Chris@0 847 break ;
Chris@0 848 len -= writecount ;
Chris@0 849 } ;
Chris@0 850
Chris@0 851 return total ;
Chris@0 852 } /* dpcm_write_s2dles */
Chris@0 853
Chris@0 854 static sf_count_t
Chris@0 855 dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
Chris@0 856 { XI_PRIVATE *pxi ;
Chris@0 857 int bufferlen, writecount ;
Chris@0 858 sf_count_t total = 0 ;
Chris@0 859
Chris@0 860 if ((pxi = psf->codec_data) == NULL)
Chris@0 861 return 0 ;
Chris@0 862
Chris@0 863 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
Chris@0 864
Chris@0 865 while (len > 0)
Chris@0 866 { if (len < bufferlen)
Chris@0 867 bufferlen = (int) len ;
Chris@0 868 i2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen) ;
Chris@0 869 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
Chris@0 870 total += writecount ;
Chris@0 871 if (writecount < bufferlen)
Chris@0 872 break ;
Chris@0 873 len -= writecount ;
Chris@0 874 } ;
Chris@0 875
Chris@0 876 return total ;
Chris@0 877 } /* dpcm_write_i2dles */
Chris@0 878
Chris@0 879 static sf_count_t
Chris@0 880 dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
Chris@0 881 { XI_PRIVATE *pxi ;
Chris@0 882 int bufferlen, writecount ;
Chris@0 883 sf_count_t total = 0 ;
Chris@0 884 float normfact ;
Chris@0 885
Chris@0 886 if ((pxi = psf->codec_data) == NULL)
Chris@0 887 return 0 ;
Chris@0 888
Chris@0 889 normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
Chris@0 890
Chris@0 891 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
Chris@0 892
Chris@0 893 while (len > 0)
Chris@0 894 { if (len < bufferlen)
Chris@0 895 bufferlen = (int) len ;
Chris@0 896 f2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen, normfact) ;
Chris@0 897 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
Chris@0 898 total += writecount ;
Chris@0 899 if (writecount < bufferlen)
Chris@0 900 break ;
Chris@0 901 len -= writecount ;
Chris@0 902 } ;
Chris@0 903
Chris@0 904 return total ;
Chris@0 905 } /* dpcm_write_f2dles */
Chris@0 906
Chris@0 907 static sf_count_t
Chris@0 908 dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
Chris@0 909 { XI_PRIVATE *pxi ;
Chris@0 910 int bufferlen, writecount ;
Chris@0 911 sf_count_t total = 0 ;
Chris@0 912 double normfact ;
Chris@0 913
Chris@0 914 if ((pxi = psf->codec_data) == NULL)
Chris@0 915 return 0 ;
Chris@0 916
Chris@0 917 normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
Chris@0 918
Chris@0 919 bufferlen = ARRAY_LEN (psf->u.sbuf) ;
Chris@0 920
Chris@0 921 while (len > 0)
Chris@0 922 { if (len < bufferlen)
Chris@0 923 bufferlen = (int) len ;
Chris@0 924 d2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen, normfact) ;
Chris@0 925 writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
Chris@0 926 total += writecount ;
Chris@0 927 if (writecount < bufferlen)
Chris@0 928 break ;
Chris@0 929 len -= writecount ;
Chris@0 930 } ;
Chris@0 931
Chris@0 932 return total ;
Chris@0 933 } /* dpcm_write_d2dles */
Chris@0 934
Chris@0 935
Chris@0 936 /*==============================================================================
Chris@0 937 */
Chris@0 938
Chris@0 939 static void
Chris@0 940 dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest)
Chris@0 941 { signed char last_val ;
Chris@0 942 int k ;
Chris@0 943
Chris@0 944 last_val = pxi->last_16 >> 8 ;
Chris@0 945
Chris@0 946 for (k = 0 ; k < count ; k++)
Chris@0 947 { last_val += src [k] ;
Chris@0 948 dest [k] = last_val << 8 ;
Chris@0 949 } ;
Chris@0 950
Chris@0 951 pxi->last_16 = last_val << 8 ;
Chris@0 952 } /* dsc2s_array */
Chris@0 953
Chris@0 954 static void
Chris@0 955 dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest)
Chris@0 956 { signed char last_val ;
Chris@0 957 int k ;
Chris@0 958
Chris@0 959 last_val = pxi->last_16 >> 8 ;
Chris@0 960
Chris@0 961 for (k = 0 ; k < count ; k++)
Chris@0 962 { last_val += src [k] ;
Chris@0 963 dest [k] = last_val << 24 ;
Chris@0 964 } ;
Chris@0 965
Chris@0 966 pxi->last_16 = last_val << 8 ;
Chris@0 967 } /* dsc2i_array */
Chris@0 968
Chris@0 969 static void
Chris@0 970 dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact)
Chris@0 971 { signed char last_val ;
Chris@0 972 int k ;
Chris@0 973
Chris@0 974 last_val = pxi->last_16 >> 8 ;
Chris@0 975
Chris@0 976 for (k = 0 ; k < count ; k++)
Chris@0 977 { last_val += src [k] ;
Chris@0 978 dest [k] = last_val * normfact ;
Chris@0 979 } ;
Chris@0 980
Chris@0 981 pxi->last_16 = last_val << 8 ;
Chris@0 982 } /* dsc2f_array */
Chris@0 983
Chris@0 984 static void
Chris@0 985 dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact)
Chris@0 986 { signed char last_val ;
Chris@0 987 int k ;
Chris@0 988
Chris@0 989 last_val = pxi->last_16 >> 8 ;
Chris@0 990
Chris@0 991 for (k = 0 ; k < count ; k++)
Chris@0 992 { last_val += src [k] ;
Chris@0 993 dest [k] = last_val * normfact ;
Chris@0 994 } ;
Chris@0 995
Chris@0 996 pxi->last_16 = last_val << 8 ;
Chris@0 997 } /* dsc2d_array */
Chris@0 998
Chris@0 999 /*------------------------------------------------------------------------------
Chris@0 1000 */
Chris@0 1001
Chris@0 1002 static void
Chris@0 1003 s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count)
Chris@0 1004 { signed char last_val, current ;
Chris@0 1005 int k ;
Chris@0 1006
Chris@0 1007 last_val = pxi->last_16 >> 8 ;
Chris@0 1008
Chris@0 1009 for (k = 0 ; k < count ; k++)
Chris@0 1010 { current = src [k] >> 8 ;
Chris@0 1011 dest [k] = current - last_val ;
Chris@0 1012 last_val = current ;
Chris@0 1013 } ;
Chris@0 1014
Chris@0 1015 pxi->last_16 = last_val << 8 ;
Chris@0 1016 } /* s2dsc_array */
Chris@0 1017
Chris@0 1018 static void
Chris@0 1019 i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count)
Chris@0 1020 { signed char last_val, current ;
Chris@0 1021 int k ;
Chris@0 1022
Chris@0 1023 last_val = pxi->last_16 >> 8 ;
Chris@0 1024
Chris@0 1025 for (k = 0 ; k < count ; k++)
Chris@0 1026 { current = src [k] >> 24 ;
Chris@0 1027 dest [k] = current - last_val ;
Chris@0 1028 last_val = current ;
Chris@0 1029 } ;
Chris@0 1030
Chris@0 1031 pxi->last_16 = last_val << 8 ;
Chris@0 1032 } /* i2dsc_array */
Chris@0 1033
Chris@0 1034 static void
Chris@0 1035 f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact)
Chris@0 1036 { signed char last_val, current ;
Chris@0 1037 int k ;
Chris@0 1038
Chris@0 1039 last_val = pxi->last_16 >> 8 ;
Chris@0 1040
Chris@0 1041 for (k = 0 ; k < count ; k++)
Chris@0 1042 { current = lrintf (src [k] * normfact) ;
Chris@0 1043 dest [k] = current - last_val ;
Chris@0 1044 last_val = current ;
Chris@0 1045 } ;
Chris@0 1046
Chris@0 1047 pxi->last_16 = last_val << 8 ;
Chris@0 1048 } /* f2dsc_array */
Chris@0 1049
Chris@0 1050 static void
Chris@0 1051 d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact)
Chris@0 1052 { signed char last_val, current ;
Chris@0 1053 int k ;
Chris@0 1054
Chris@0 1055 last_val = pxi->last_16 >> 8 ;
Chris@0 1056
Chris@0 1057 for (k = 0 ; k < count ; k++)
Chris@0 1058 { current = lrint (src [k] * normfact) ;
Chris@0 1059 dest [k] = current - last_val ;
Chris@0 1060 last_val = current ;
Chris@0 1061 } ;
Chris@0 1062
Chris@0 1063 pxi->last_16 = last_val << 8 ;
Chris@0 1064 } /* d2dsc_array */
Chris@0 1065
Chris@0 1066 /*==============================================================================
Chris@0 1067 */
Chris@0 1068
Chris@0 1069 static void
Chris@0 1070 dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest)
Chris@0 1071 { short last_val ;
Chris@0 1072 int k ;
Chris@0 1073
Chris@0 1074 last_val = pxi->last_16 ;
Chris@0 1075
Chris@0 1076 for (k = 0 ; k < count ; k++)
Chris@0 1077 { last_val += LES2H_SHORT (src [k]) ;
Chris@0 1078 dest [k] = last_val ;
Chris@0 1079 } ;
Chris@0 1080
Chris@0 1081 pxi->last_16 = last_val ;
Chris@0 1082 } /* dles2s_array */
Chris@0 1083
Chris@0 1084 static void
Chris@0 1085 dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest)
Chris@0 1086 { short last_val ;
Chris@0 1087 int k ;
Chris@0 1088
Chris@0 1089 last_val = pxi->last_16 ;
Chris@0 1090
Chris@0 1091 for (k = 0 ; k < count ; k++)
Chris@0 1092 { last_val += LES2H_SHORT (src [k]) ;
Chris@0 1093 dest [k] = last_val << 16 ;
Chris@0 1094 } ;
Chris@0 1095
Chris@0 1096 pxi->last_16 = last_val ;
Chris@0 1097 } /* dles2i_array */
Chris@0 1098
Chris@0 1099 static void
Chris@0 1100 dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact)
Chris@0 1101 { short last_val ;
Chris@0 1102 int k ;
Chris@0 1103
Chris@0 1104 last_val = pxi->last_16 ;
Chris@0 1105
Chris@0 1106 for (k = 0 ; k < count ; k++)
Chris@0 1107 { last_val += LES2H_SHORT (src [k]) ;
Chris@0 1108 dest [k] = last_val * normfact ;
Chris@0 1109 } ;
Chris@0 1110
Chris@0 1111 pxi->last_16 = last_val ;
Chris@0 1112 } /* dles2f_array */
Chris@0 1113
Chris@0 1114 static void
Chris@0 1115 dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact)
Chris@0 1116 { short last_val ;
Chris@0 1117 int k ;
Chris@0 1118
Chris@0 1119 last_val = pxi->last_16 ;
Chris@0 1120
Chris@0 1121 for (k = 0 ; k < count ; k++)
Chris@0 1122 { last_val += LES2H_SHORT (src [k]) ;
Chris@0 1123 dest [k] = last_val * normfact ;
Chris@0 1124 } ;
Chris@0 1125
Chris@0 1126 pxi->last_16 = last_val ;
Chris@0 1127 } /* dles2d_array */
Chris@0 1128
Chris@0 1129 /*------------------------------------------------------------------------------
Chris@0 1130 */
Chris@0 1131
Chris@0 1132 static void
Chris@0 1133 s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count)
Chris@0 1134 { short diff, last_val ;
Chris@0 1135 int k ;
Chris@0 1136
Chris@0 1137 last_val = pxi->last_16 ;
Chris@0 1138
Chris@0 1139 for (k = 0 ; k < count ; k++)
Chris@0 1140 { diff = src [k] - last_val ;
Chris@0 1141 dest [k] = LES2H_SHORT (diff) ;
Chris@0 1142 last_val = src [k] ;
Chris@0 1143 } ;
Chris@0 1144
Chris@0 1145 pxi->last_16 = last_val ;
Chris@0 1146 } /* s2dles_array */
Chris@0 1147
Chris@0 1148 static void
Chris@0 1149 i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count)
Chris@0 1150 { short diff, last_val ;
Chris@0 1151 int k ;
Chris@0 1152
Chris@0 1153 last_val = pxi->last_16 ;
Chris@0 1154
Chris@0 1155 for (k = 0 ; k < count ; k++)
Chris@0 1156 { diff = (src [k] >> 16) - last_val ;
Chris@0 1157 dest [k] = LES2H_SHORT (diff) ;
Chris@0 1158 last_val = src [k] >> 16 ;
Chris@0 1159 } ;
Chris@0 1160
Chris@0 1161 pxi->last_16 = last_val ;
Chris@0 1162 } /* i2dles_array */
Chris@0 1163
Chris@0 1164 static void
Chris@0 1165 f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact)
Chris@0 1166 { short diff, last_val, current ;
Chris@0 1167 int k ;
Chris@0 1168
Chris@0 1169 last_val = pxi->last_16 ;
Chris@0 1170
Chris@0 1171 for (k = 0 ; k < count ; k++)
Chris@0 1172 { current = lrintf (src [k] * normfact) ;
Chris@0 1173 diff = current - last_val ;
Chris@0 1174 dest [k] = LES2H_SHORT (diff) ;
Chris@0 1175 last_val = current ;
Chris@0 1176 } ;
Chris@0 1177
Chris@0 1178 pxi->last_16 = last_val ;
Chris@0 1179 } /* f2dles_array */
Chris@0 1180
Chris@0 1181 static void
Chris@0 1182 d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact)
Chris@0 1183 { short diff, last_val, current ;
Chris@0 1184 int k ;
Chris@0 1185
Chris@0 1186 last_val = pxi->last_16 ;
Chris@0 1187
Chris@0 1188 for (k = 0 ; k < count ; k++)
Chris@0 1189 { current = lrint (src [k] * normfact) ;
Chris@0 1190 diff = current - last_val ;
Chris@0 1191 dest [k] = LES2H_SHORT (diff) ;
Chris@0 1192 last_val = current ;
Chris@0 1193 } ;
Chris@0 1194
Chris@0 1195 pxi->last_16 = last_val ;
Chris@0 1196 } /* d2dles_array */
Chris@0 1197