blob: 1f373f9c95702909e49f7c041b00580a128de8fb [file] [log] [blame]
Alexandre Lision7c6f4a62013-09-05 13:27:01 -04001/*
2** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
3**
4** This program is free software; you can redistribute it and/or modify
5** it under the terms of the GNU Lesser General Public License as published by
6** the Free Software Foundation; either version 2.1 of the License, or
7** (at your option) any later version.
8**
9** This program is distributed in the hope that it will be useful,
10** but WITHOUT ANY WARRANTY; without even the implied warranty of
11** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12** GNU Lesser General Public License for more details.
13**
14** You should have received a copy of the GNU Lesser General Public License
15** along with this program; if not, write to the Free Software
16** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17*/
18
19#include "sfconfig.h"
20
21#include <stdlib.h>
22#include <string.h>
23#include <ctype.h>
24#include <assert.h>
25
26#include "sndfile.h"
27#include "sfendian.h"
28#include "common.h"
29
30#define SNDFILE_MAGICK 0x1234C0DE
31
32#ifdef __APPLE__
33 /*
34 ** Detect if a compile for a universal binary is being attempted and barf if it is.
35 ** See the URL below for the rationale.
36 */
37 #ifdef __BIG_ENDIAN__
38 #if (CPU_IS_LITTLE_ENDIAN == 1)
39 #error "Universal binary compile detected. See http://www.mega-nerd.com/libsndfile/FAQ.html#Q018"
40 #endif
41 #endif
42
43 #ifdef __LITTLE_ENDIAN__
44 #if (CPU_IS_BIG_ENDIAN == 1)
45 #error "Universal binary compile detected. See http://www.mega-nerd.com/libsndfile/FAQ.html#Q018"
46 #endif
47 #endif
48#endif
49
50
51typedef struct
52{ int error ;
53 const char *str ;
54} ErrorStruct ;
55
56static
57ErrorStruct SndfileErrors [] =
58{
59 /* Public error values and their associated strings. */
60 { SF_ERR_NO_ERROR , "No Error." },
61 { SF_ERR_UNRECOGNISED_FORMAT , "Format not recognised." },
62 { SF_ERR_SYSTEM , "System error." /* Often replaced. */ },
63 { SF_ERR_MALFORMED_FILE , "Supported file format but file is malformed." },
64 { SF_ERR_UNSUPPORTED_ENCODING , "Supported file format but unsupported encoding." },
65
66 /* Private error values and their associated strings. */
67 { SFE_ZERO_MAJOR_FORMAT , "Error : major format is 0." },
68 { SFE_ZERO_MINOR_FORMAT , "Error : minor format is 0." },
69 { SFE_BAD_FILE , "File does not exist or is not a regular file (possibly a pipe?)." },
70 { SFE_BAD_FILE_READ , "File exists but no data could be read." },
71 { SFE_OPEN_FAILED , "Could not open file." },
72 { SFE_BAD_SNDFILE_PTR , "Not a valid SNDFILE* pointer." },
73 { SFE_BAD_SF_INFO_PTR , "NULL SF_INFO pointer passed to libsndfile." },
74 { SFE_BAD_SF_INCOMPLETE , "SF_PRIVATE struct incomplete and end of header parsing." },
75 { SFE_BAD_FILE_PTR , "Bad FILE pointer." },
76 { SFE_BAD_INT_PTR , "Internal error, Bad pointer." },
77 { SFE_BAD_STAT_SIZE , "Error : software was misconfigured at compile time (sizeof statbuf.st_size)." },
78
79 { SFE_MALLOC_FAILED , "Internal malloc () failed." },
80 { SFE_UNIMPLEMENTED , "File contains data in an unimplemented format." },
81 { SFE_BAD_READ_ALIGN , "Attempt to read a non-integer number of channels." },
82 { SFE_BAD_WRITE_ALIGN , "Attempt to write a non-integer number of channels." },
83 { SFE_UNKNOWN_FORMAT , "File contains data in an unknown format." },
84 { SFE_NOT_READMODE , "Read attempted on file currently open for write." },
85 { SFE_NOT_WRITEMODE , "Write attempted on file currently open for read." },
86 { SFE_BAD_MODE_RW , "Error : This file format does not support read/write mode." },
87 { SFE_BAD_SF_INFO , "Internal error : SF_INFO struct incomplete." },
88 { SFE_BAD_OFFSET , "Error : supplied offset beyond end of file." },
89 { SFE_NO_EMBED_SUPPORT , "Error : embedding not supported for this file format." },
90 { SFE_NO_EMBEDDED_RDWR , "Error : cannot open embedded file read/write." },
91 { SFE_NO_PIPE_WRITE , "Error : this file format does not support pipe write." },
92 { SFE_BAD_VIRTUAL_IO , "Error : bad pointer on SF_VIRTUAL_IO struct." },
93 { SFE_BAD_BROADCAST_INFO_SIZE
94 , "Error : bad size in SF_BROADCAST_INFO struct." },
95 { SFE_BAD_BROADCAST_INFO_TOO_BIG
96 , "Error : SF_BROADCAST_INFO struct too large." },
97
98 { SFE_INTERLEAVE_MODE , "Attempt to write to file with non-interleaved data." },
99 { SFE_INTERLEAVE_SEEK , "Bad karma in seek during interleave read operation." },
100 { SFE_INTERLEAVE_READ , "Bad karma in read during interleave read operation." },
101
102 { SFE_INTERNAL , "Unspecified internal error." },
103 { SFE_BAD_COMMAND_PARAM , "Bad parameter passed to function sf_command." },
104 { SFE_BAD_ENDIAN , "Bad endian-ness. Try default endian-ness" },
105 { SFE_CHANNEL_COUNT_ZERO , "Channel count is zero." },
106 { SFE_CHANNEL_COUNT , "Too many channels specified." },
107
108 { SFE_BAD_SEEK , "Internal psf_fseek() failed." },
109 { SFE_NOT_SEEKABLE , "Seek attempted on unseekable file type." },
110 { SFE_AMBIGUOUS_SEEK , "Error : combination of file open mode and seek command is ambiguous." },
111 { SFE_WRONG_SEEK , "Error : invalid seek parameters." },
112 { SFE_SEEK_FAILED , "Error : parameters OK, but psf_seek() failed." },
113
114 { SFE_BAD_OPEN_MODE , "Error : bad mode parameter for file open." },
115 { SFE_OPEN_PIPE_RDWR , "Error : attempt to open a pipe in read/write mode." },
116 { SFE_RDWR_POSITION , "Error on RDWR position (cryptic)." },
117 { SFE_RDWR_BAD_HEADER , "Error : Cannot open file in read/write mode due to string data in header." },
118 { SFE_CMD_HAS_DATA , "Error : Command fails because file already has audio data." },
119
120 { SFE_STR_NO_SUPPORT , "Error : File type does not support string data." },
121 { SFE_STR_NOT_WRITE , "Error : Trying to set a string when file is not in write mode." },
122 { SFE_STR_MAX_DATA , "Error : Maximum string data storage reached." },
123 { SFE_STR_MAX_COUNT , "Error : Maximum string data count reached." },
124 { SFE_STR_BAD_TYPE , "Error : Bad string data type." },
125 { SFE_STR_NO_ADD_END , "Error : file type does not support strings added at end of file." },
126 { SFE_STR_BAD_STRING , "Error : bad string." },
127 { SFE_STR_WEIRD , "Error : Weird string error." },
128
129 { SFE_WAV_NO_RIFF , "Error in WAV file. No 'RIFF' chunk marker." },
130 { SFE_WAV_NO_WAVE , "Error in WAV file. No 'WAVE' chunk marker." },
131 { SFE_WAV_NO_FMT , "Error in WAV/W64/RF64 file. No 'fmt ' chunk marker." },
132 { SFE_WAV_BAD_FMT , "Error in WAV/W64/RF64 file. Malformed 'fmt ' chunk." },
133 { SFE_WAV_FMT_SHORT , "Error in WAV/W64/RF64 file. Short 'fmt ' chunk." },
134
135 { SFE_WAV_BAD_FACT , "Error in WAV file. 'fact' chunk out of place." },
136 { SFE_WAV_BAD_PEAK , "Error in WAV file. Bad 'PEAK' chunk." },
137 { SFE_WAV_PEAK_B4_FMT , "Error in WAV file. 'PEAK' chunk found before 'fmt ' chunk." },
138
139 { SFE_WAV_BAD_FORMAT , "Error in WAV file. Errors in 'fmt ' chunk." },
140 { SFE_WAV_BAD_BLOCKALIGN , "Error in WAV file. Block alignment in 'fmt ' chunk is incorrect." },
141 { SFE_WAV_NO_DATA , "Error in WAV file. No 'data' chunk marker." },
142 { SFE_WAV_BAD_LIST , "Error in WAV file. Malformed LIST chunk." },
143 { SFE_WAV_UNKNOWN_CHUNK , "Error in WAV file. File contains an unknown chunk marker." },
144 { SFE_WAV_WVPK_DATA , "Error in WAV file. Data is in WAVPACK format." },
145
146 { SFE_WAV_ADPCM_NOT4BIT , "Error in ADPCM WAV file. Invalid bit width." },
147 { SFE_WAV_ADPCM_CHANNELS , "Error in ADPCM WAV file. Invalid number of channels." },
148 { SFE_WAV_GSM610_FORMAT , "Error in GSM610 WAV file. Invalid format chunk." },
149
150 { SFE_AIFF_NO_FORM , "Error in AIFF file, bad 'FORM' marker." },
151 { SFE_AIFF_AIFF_NO_FORM , "Error in AIFF file, 'AIFF' marker without 'FORM'." },
152 { SFE_AIFF_COMM_NO_FORM , "Error in AIFF file, 'COMM' marker without 'FORM'." },
153 { SFE_AIFF_SSND_NO_COMM , "Error in AIFF file, 'SSND' marker without 'COMM'." },
154 { SFE_AIFF_UNKNOWN_CHUNK , "Error in AIFF file, unknown chunk." },
155 { SFE_AIFF_COMM_CHUNK_SIZE, "Error in AIFF file, bad 'COMM' chunk size." },
156 { SFE_AIFF_BAD_COMM_CHUNK , "Error in AIFF file, bad 'COMM' chunk." },
157 { SFE_AIFF_PEAK_B4_COMM , "Error in AIFF file. 'PEAK' chunk found before 'COMM' chunk." },
158 { SFE_AIFF_BAD_PEAK , "Error in AIFF file. Bad 'PEAK' chunk." },
159 { SFE_AIFF_NO_SSND , "Error in AIFF file, bad 'SSND' chunk." },
160 { SFE_AIFF_NO_DATA , "Error in AIFF file, no sound data." },
161 { SFE_AIFF_RW_SSND_NOT_LAST, "Error in AIFF file, RDWR only possible if SSND chunk at end of file." },
162
163 { SFE_AU_UNKNOWN_FORMAT , "Error in AU file, unknown format." },
164 { SFE_AU_NO_DOTSND , "Error in AU file, missing '.snd' or 'dns.' marker." },
165 { SFE_AU_EMBED_BAD_LEN , "Embedded AU file with unknown length." },
166
167 { SFE_RAW_READ_BAD_SPEC , "Error while opening RAW file for read. Must specify format and channels.\n"
168 "Possibly trying to open unsupported format."
169 },
170 { SFE_RAW_BAD_BITWIDTH , "Error. RAW file bitwidth must be a multiple of 8." },
171 { SFE_RAW_BAD_FORMAT , "Error. Bad format field in SF_INFO struct when openning a RAW file for read." },
172
173 { SFE_PAF_NO_MARKER , "Error in PAF file, no marker." },
174 { SFE_PAF_VERSION , "Error in PAF file, bad version." },
175 { SFE_PAF_UNKNOWN_FORMAT , "Error in PAF file, unknown format." },
176 { SFE_PAF_SHORT_HEADER , "Error in PAF file. File shorter than minimal header." },
177 { SFE_PAF_BAD_CHANNELS , "Error in PAF file. Bad channel count." },
178
179 { SFE_SVX_NO_FORM , "Error in 8SVX / 16SV file, no 'FORM' marker." },
180 { SFE_SVX_NO_BODY , "Error in 8SVX / 16SV file, no 'BODY' marker." },
181 { SFE_SVX_NO_DATA , "Error in 8SVX / 16SV file, no sound data." },
182 { SFE_SVX_BAD_COMP , "Error in 8SVX / 16SV file, unsupported compression format." },
183 { SFE_SVX_BAD_NAME_LENGTH , "Error in 8SVX / 16SV file, NAME chunk too long." },
184
185 { SFE_NIST_BAD_HEADER , "Error in NIST file, bad header." },
186 { SFE_NIST_CRLF_CONVERISON, "Error : NIST file damaged by Windows CR -> CRLF conversion process." },
187 { SFE_NIST_BAD_ENCODING , "Error in NIST file, unsupported compression format." },
188
189 { SFE_VOC_NO_CREATIVE , "Error in VOC file, no 'Creative Voice File' marker." },
190 { SFE_VOC_BAD_FORMAT , "Error in VOC file, bad format." },
191 { SFE_VOC_BAD_VERSION , "Error in VOC file, bad version number." },
192 { SFE_VOC_BAD_MARKER , "Error in VOC file, bad marker in file." },
193 { SFE_VOC_BAD_SECTIONS , "Error in VOC file, incompatible VOC sections." },
194 { SFE_VOC_MULTI_SAMPLERATE, "Error in VOC file, more than one sample rate defined." },
195 { SFE_VOC_MULTI_SECTION , "Unimplemented VOC file feature, file contains multiple sound sections." },
196 { SFE_VOC_MULTI_PARAM , "Error in VOC file, file contains multiple bit or channel widths." },
197 { SFE_VOC_SECTION_COUNT , "Error in VOC file, too many sections." },
198 { SFE_VOC_NO_PIPE , "Error : not able to operate on VOC files over a pipe." },
199
200 { SFE_IRCAM_NO_MARKER , "Error in IRCAM file, bad IRCAM marker." },
201 { SFE_IRCAM_BAD_CHANNELS , "Error in IRCAM file, bad channel count." },
202 { SFE_IRCAM_UNKNOWN_FORMAT, "Error in IRCAM file, unknow encoding format." },
203
204 { SFE_W64_64_BIT , "Error in W64 file, file contains 64 bit offset." },
205 { SFE_W64_NO_RIFF , "Error in W64 file. No 'riff' chunk marker." },
206 { SFE_W64_NO_WAVE , "Error in W64 file. No 'wave' chunk marker." },
207 { SFE_W64_NO_DATA , "Error in W64 file. No 'data' chunk marker." },
208 { SFE_W64_ADPCM_NOT4BIT , "Error in ADPCM W64 file. Invalid bit width." },
209 { SFE_W64_ADPCM_CHANNELS , "Error in ADPCM W64 file. Invalid number of channels." },
210 { SFE_W64_GSM610_FORMAT , "Error in GSM610 W64 file. Invalid format chunk." },
211
212 { SFE_MAT4_BAD_NAME , "Error in MAT4 file. No variable name." },
213 { SFE_MAT4_NO_SAMPLERATE , "Error in MAT4 file. No sample rate." },
214
215 { SFE_MAT5_BAD_ENDIAN , "Error in MAT5 file. Not able to determine endian-ness." },
216 { SFE_MAT5_NO_BLOCK , "Error in MAT5 file. Bad block structure." },
217 { SFE_MAT5_SAMPLE_RATE , "Error in MAT5 file. Not able to determine sample rate." },
218
219 { SFE_PVF_NO_PVF1 , "Error in PVF file. No PVF1 marker." },
220 { SFE_PVF_BAD_HEADER , "Error in PVF file. Bad header." },
221 { SFE_PVF_BAD_BITWIDTH , "Error in PVF file. Bad bit width." },
222
223 { SFE_XI_BAD_HEADER , "Error in XI file. Bad header." },
224 { SFE_XI_EXCESS_SAMPLES , "Error in XI file. Excess samples in file." },
225 { SFE_XI_NO_PIPE , "Error : not able to operate on XI files over a pipe." },
226
227 { SFE_HTK_NO_PIPE , "Error : not able to operate on HTK files over a pipe." },
228
229 { SFE_SDS_NOT_SDS , "Error : not an SDS file." },
230 { SFE_SDS_BAD_BIT_WIDTH , "Error : bad bit width for SDS file." },
231
232 { SFE_SD2_FD_DISALLOWED , "Error : cannot open SD2 file without a file name." },
233 { SFE_SD2_BAD_DATA_OFFSET , "Error : bad data offset." },
234 { SFE_SD2_BAD_MAP_OFFSET , "Error : bad map offset." },
235 { SFE_SD2_BAD_DATA_LENGTH , "Error : bad data length." },
236 { SFE_SD2_BAD_MAP_LENGTH , "Error : bad map length." },
237 { SFE_SD2_BAD_RSRC , "Error : bad resource fork." },
238 { SFE_SD2_BAD_SAMPLE_SIZE , "Error : bad sample size." },
239
240 { SFE_FLAC_BAD_HEADER , "Error : bad flac header." },
241 { SFE_FLAC_NEW_DECODER , "Error : problem while creating flac decoder." },
242 { SFE_FLAC_INIT_DECODER , "Error : problem while initialization of the flac decoder." },
243 { SFE_FLAC_LOST_SYNC , "Error : flac decoder lost sync." },
244 { SFE_FLAC_BAD_SAMPLE_RATE, "Error : flac does not support this sample rate." },
245 { SFE_FLAC_UNKOWN_ERROR , "Error : unknown error in flac decoder." },
246
247 { SFE_WVE_NOT_WVE , "Error : not a WVE file." },
248 { SFE_WVE_NO_PIPE , "Error : not able to operate on WVE files over a pipe." },
249
250 { SFE_DWVW_BAD_BITWIDTH , "Error : Bad bit width for DWVW encoding. Must be 12, 16 or 24." },
251 { SFE_G72X_NOT_MONO , "Error : G72x encoding does not support more than 1 channel." },
252
253 { SFE_VORBIS_ENCODER_BUG , "Error : Sample rate chosen is known to trigger a Vorbis encoder bug on this CPU." },
254
255 { SFE_RF64_NOT_RF64 , "Error : Not an RF64 file." },
256
257 { SFE_MAX_ERROR , "Maximum error number." },
258 { SFE_MAX_ERROR + 1 , NULL }
259} ;
260
261/*------------------------------------------------------------------------------
262*/
263
264static int format_from_extension (SF_PRIVATE *psf) ;
265static int guess_file_type (SF_PRIVATE *psf) ;
266static int validate_sfinfo (SF_INFO *sfinfo) ;
267static int validate_psf (SF_PRIVATE *psf) ;
268static void save_header_info (SF_PRIVATE *psf) ;
269static void copy_filename (SF_PRIVATE *psf, const char *path) ;
270static int psf_close (SF_PRIVATE *psf) ;
271
272static int try_resource_fork (SF_PRIVATE * psf) ;
273
274/*------------------------------------------------------------------------------
275** Private (static) variables.
276*/
277
278int sf_errno = 0 ;
279static char sf_logbuffer [SF_BUFFER_LEN] = { 0 } ;
280static char sf_syserr [SF_SYSERR_LEN] = { 0 } ;
281
282/*------------------------------------------------------------------------------
283*/
284
285#define VALIDATE_SNDFILE_AND_ASSIGN_PSF(a,b,c) \
286 { if ((a) == NULL) \
287 { sf_errno = SFE_BAD_SNDFILE_PTR ; \
288 return 0 ; \
289 } ; \
290 (b) = (SF_PRIVATE*) (a) ; \
291 if ((b)->virtual_io == SF_FALSE && \
292 psf_file_valid (b) == 0) \
293 { (b)->error = SFE_BAD_FILE_PTR ; \
294 return 0 ; \
295 } ; \
296 if ((b)->Magick != SNDFILE_MAGICK) \
297 { (b)->error = SFE_BAD_SNDFILE_PTR ; \
298 return 0 ; \
299 } ; \
300 if (c) (b)->error = 0 ; \
301 }
302
303/*------------------------------------------------------------------------------
304** Public functions.
305*/
306
Alexandre Lision2b237922013-09-09 16:23:02 -0400307SNDFILE*
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400308sf_open (const char *path, int mode, SF_INFO *sfinfo)
Alexandre Lision2b237922013-09-09 16:23:02 -0400309{
310
311 SF_PRIVATE *psf ;
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400312
313 /* Ultimate sanity check. */
314 assert (sizeof (sf_count_t) == 8) ;
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400315 if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL)
316 { sf_errno = SFE_MALLOC_FAILED ;
317 return NULL ;
318 } ;
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400319 memset (psf, 0, sizeof (SF_PRIVATE)) ;
320 psf_init_files (psf) ;
321
Alexandre Lision2b237922013-09-09 16:23:02 -0400322 psf_log_printf (psf, "File : %s\n", path);
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400323
324 copy_filename (psf, path) ;
325
326 psf->file.mode = mode ;
Alexandre Lision2b237922013-09-09 16:23:02 -0400327 if (strcmp (path, "-") == 0){
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400328 psf->error = psf_set_stdio (psf) ;
Alexandre Lision2b237922013-09-09 16:23:02 -0400329 }else{
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400330 psf->error = psf_fopen (psf) ;
Alexandre Lision2b237922013-09-09 16:23:02 -0400331 }
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400332 return psf_open_file (psf, sfinfo) ;
333} /* sf_open */
334
335SNDFILE*
336sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc)
337{ SF_PRIVATE *psf ;
338
339 if ((SF_CONTAINER (sfinfo->format)) == SF_FORMAT_SD2)
340 { sf_errno = SFE_SD2_FD_DISALLOWED ;
341 return NULL ;
342 } ;
343
344 if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL)
345 { sf_errno = SFE_MALLOC_FAILED ;
346 return NULL ;
347 } ;
348
349 psf_init_files (psf) ;
350 copy_filename (psf, "") ;
351
352 psf->file.mode = mode ;
353 psf_set_file (psf, fd) ;
354 psf->is_pipe = psf_is_pipe (psf) ;
355 psf->fileoffset = psf_ftell (psf) ;
356
357 if (! close_desc)
358 psf->file.do_not_close_descriptor = SF_TRUE ;
359
360 return psf_open_file (psf, sfinfo) ;
361} /* sf_open_fd */
362
363SNDFILE*
364sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data)
365{ SF_PRIVATE *psf ;
366
367 /* Make sure we have a valid set ot virtual pointers. */
368 if (sfvirtual->get_filelen == NULL || sfvirtual->seek == NULL || sfvirtual->tell == NULL)
369 { sf_errno = SFE_BAD_VIRTUAL_IO ;
370 snprintf (sf_logbuffer, sizeof (sf_logbuffer), "Bad vio_get_filelen / vio_seek / vio_tell in SF_VIRTUAL_IO struct.\n") ;
371 return NULL ;
372 } ;
373
374 if ((mode == SFM_READ || mode == SFM_RDWR) && sfvirtual->read == NULL)
375 { sf_errno = SFE_BAD_VIRTUAL_IO ;
376 snprintf (sf_logbuffer, sizeof (sf_logbuffer), "Bad vio_read in SF_VIRTUAL_IO struct.\n") ;
377 return NULL ;
378 } ;
379
380 if ((mode == SFM_WRITE || mode == SFM_RDWR) && sfvirtual->write == NULL)
381 { sf_errno = SFE_BAD_VIRTUAL_IO ;
382 snprintf (sf_logbuffer, sizeof (sf_logbuffer), "Bad vio_write in SF_VIRTUAL_IO struct.\n") ;
383 return NULL ;
384 } ;
385
386 if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL)
387 { sf_errno = SFE_MALLOC_FAILED ;
388 return NULL ;
389 } ;
390
391 psf_init_files (psf) ;
392
393 psf->virtual_io = SF_TRUE ;
394 psf->vio = *sfvirtual ;
395 psf->vio_user_data = user_data ;
396
397 psf->file.mode = mode ;
398
399 return psf_open_file (psf, sfinfo) ;
400} /* sf_open_virtual */
401
402int
403sf_close (SNDFILE *sndfile)
404{ SF_PRIVATE *psf ;
405
406 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
407
408 return psf_close (psf) ;
409} /* sf_close */
410
411void
412sf_write_sync (SNDFILE *sndfile)
413{ SF_PRIVATE *psf ;
414
415 if ((psf = (SF_PRIVATE *) sndfile) == NULL)
416 return ;
417
418 psf_fsync (psf) ;
419
420 return ;
421} /* sf_write_sync */
422
423/*==============================================================================
424*/
425
426const char*
427sf_error_number (int errnum)
428{ static const char *bad_errnum =
429 "No error defined for this error number. This is a bug in libsndfile." ;
430 int k ;
431
432 if (errnum == SFE_MAX_ERROR)
433 return SndfileErrors [0].str ;
434
435 if (errnum < 0 || errnum > SFE_MAX_ERROR)
436 { /* This really shouldn't happen in release versions. */
437 printf ("Not a valid error number (%d).\n", errnum) ;
438 return bad_errnum ;
439 } ;
440
441 for (k = 0 ; SndfileErrors [k].str ; k++)
442 if (errnum == SndfileErrors [k].error)
443 return SndfileErrors [k].str ;
444
445 return bad_errnum ;
446} /* sf_error_number */
447
448const char*
449sf_strerror (SNDFILE *sndfile)
450{ SF_PRIVATE *psf = NULL ;
451 int errnum ;
452
453 if (sndfile == NULL)
454 { errnum = sf_errno ;
455 if (errnum == SFE_SYSTEM && sf_syserr [0])
456 return sf_syserr ;
457 }
458 else
459 { psf = (SF_PRIVATE *) sndfile ;
460
461 if (psf->Magick != SNDFILE_MAGICK)
462 return "sf_strerror : Bad magic number." ;
463
464 errnum = psf->error ;
465
466 if (errnum == SFE_SYSTEM && psf->syserr [0])
467 return psf->syserr ;
468 } ;
469
470 return sf_error_number (errnum) ;
471} /* sf_strerror */
472
473/*------------------------------------------------------------------------------
474*/
475
476int
477sf_error (SNDFILE *sndfile)
478{ SF_PRIVATE *psf ;
479
480 if (sndfile == NULL)
481 return sf_errno ;
482
483 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ;
484
485 if (psf->error)
486 return psf->error ;
487
488 return 0 ;
489} /* sf_error */
490
491/*------------------------------------------------------------------------------
492*/
493
494int
495sf_perror (SNDFILE *sndfile)
496{ SF_PRIVATE *psf ;
497 int errnum ;
498
499 if (sndfile == NULL)
500 { errnum = sf_errno ;
501 }
502 else
503 { VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ;
504 errnum = psf->error ;
505 } ;
506
507 fprintf (stderr, "%s\n", sf_error_number (errnum)) ;
508 return SFE_NO_ERROR ;
509} /* sf_perror */
510
511
512/*------------------------------------------------------------------------------
513*/
514
515int
516sf_error_str (SNDFILE *sndfile, char *str, size_t maxlen)
517{ SF_PRIVATE *psf ;
518 int errnum ;
519
520 if (str == NULL)
521 return SFE_INTERNAL ;
522
523 if (sndfile == NULL)
524 errnum = sf_errno ;
525 else
526 { VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ;
527 errnum = psf->error ;
528 } ;
529
530 snprintf (str, maxlen, "%s", sf_error_number (errnum)) ;
531
532 return SFE_NO_ERROR ;
533} /* sf_error_str */
534
535/*==============================================================================
536*/
537
538int
539sf_format_check (const SF_INFO *info)
540{ int subformat, endian ;
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400541 subformat = SF_CODEC (info->format) ;
542 endian = SF_ENDIAN (info->format) ;
543
544 /* This is the place where each file format can check if the suppiled
545 ** SF_INFO struct is valid.
546 ** Return 0 on failure, 1 ons success.
547 */
548
549 if (info->channels < 1 || info->channels > SF_MAX_CHANNELS)
550 return 0 ;
551
552 if (info->samplerate < 0)
553 return 0 ;
554
555 switch (SF_CONTAINER (info->format))
556 { case SF_FORMAT_WAV :
557 /* WAV now allows both endian, RIFF or RIFX (little or big respectively) */
558 if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
559 return 1 ;
560 if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
561 return 1 ;
562 if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2)
563 return 1 ;
564 if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
565 return 1 ;
566 if (subformat == SF_FORMAT_G721_32 && info->channels == 1)
567 return 1 ;
568 if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
569 return 1 ;
570 if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
571 return 1 ;
572 break ;
573
574 case SF_FORMAT_WAVEX :
575 if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
576 return 0 ;
577 if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
578 return 1 ;
579 if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
580 return 1 ;
581 if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
582 return 1 ;
583 if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
584 return 1 ;
585 break ;
586
587 case SF_FORMAT_AIFF :
588 /* AIFF does allow both endian-nesses for PCM data.*/
589 if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
590 return 1 ;
591 /* Other encodings. Check for endian-ness. */
592 if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
593 return 0 ;
594 if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8)
595 return 1 ;
596 if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
597 return 1 ;
598 if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
599 return 1 ;
600 if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 ||
601 subformat == SF_FORMAT_DWVW_24) && info-> channels == 1)
602 return 1 ;
603 if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
604 return 1 ;
605 if (subformat == SF_FORMAT_IMA_ADPCM && (info->channels == 1 || info->channels == 2))
606 return 1 ;
607 break ;
608
609 case SF_FORMAT_AU :
610 if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
611 return 1 ;
612 if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
613 return 1 ;
614 if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
615 return 1 ;
616 if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
617 return 1 ;
618 if (subformat == SF_FORMAT_G721_32 && info->channels == 1)
619 return 1 ;
620 if (subformat == SF_FORMAT_G723_24 && info->channels == 1)
621 return 1 ;
622 if (subformat == SF_FORMAT_G723_40 && info->channels == 1)
623 return 1 ;
624 break ;
625
626 case SF_FORMAT_CAF :
627 if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
628 return 1 ;
629 if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
630 return 1 ;
631 if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
632 return 1 ;
633 if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
634 return 1 ;
635 break ;
636
637 case SF_FORMAT_RAW :
638 if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
639 return 1 ;
640 if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
641 return 1 ;
642 if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
643 return 1 ;
644 if (subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_ULAW)
645 return 1 ;
646 if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 ||
647 subformat == SF_FORMAT_DWVW_24) && info-> channels == 1)
648 return 1 ;
649 if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
650 return 1 ;
651 if (subformat == SF_FORMAT_VOX_ADPCM && info->channels == 1)
652 return 1 ;
653 break ;
654
655 case SF_FORMAT_PAF :
656 if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
657 return 1 ;
658 break ;
659
660 case SF_FORMAT_SVX :
661 /* SVX only supports writing mono SVX files. */
662 if (info->channels > 1)
663 return 0 ;
664 /* Always big endian. */
665 if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
666 return 0 ;
667
668 if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
669 return 1 ;
670 break ;
671
672 case SF_FORMAT_NIST :
673 if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
674 return 1 ;
675 if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
676 return 1 ;
677 if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
678 return 1 ;
679 break ;
680
681 case SF_FORMAT_IRCAM :
682 if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)
683 return 1 ;
684 if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_FLOAT)
685 return 1 ;
686 break ;
687
688 case SF_FORMAT_VOC :
689 /* VOC is strictly little endian. */
690 if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
691 return 0 ;
692 if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
693 return 1 ;
694 if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
695 return 1 ;
696 break ;
697
698 case SF_FORMAT_W64 :
699 /* W64 is strictly little endian. */
700 if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
701 return 0 ;
702 if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
703 return 1 ;
704 if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
705 return 1 ;
706 if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2)
707 return 1 ;
708 if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
709 return 1 ;
710 if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
711 return 1 ;
712 if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
713 return 1 ;
714 break ;
715
716 case SF_FORMAT_MAT4 :
717 if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)
718 return 1 ;
719 if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
720 return 1 ;
721 break ;
722
723 case SF_FORMAT_MAT5 :
724 if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)
725 return 1 ;
726 if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
727 return 1 ;
728 break ;
729
730 case SF_FORMAT_PVF :
731 if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)
732 return 1 ;
733 break ;
734
735 case SF_FORMAT_XI :
736 if (info->channels != 1)
737 return 0 ;
738 if (subformat == SF_FORMAT_DPCM_8 || subformat == SF_FORMAT_DPCM_16)
739 return 1 ;
740 break ;
741
742 case SF_FORMAT_HTK :
743 /* HTK is strictly big endian. */
744 if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
745 return 0 ;
746 if (info->channels != 1)
747 return 0 ;
748 if (subformat == SF_FORMAT_PCM_16)
749 return 1 ;
750 break ;
751
752 case SF_FORMAT_SDS :
753 /* SDS is strictly big endian. */
754 if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
755 return 0 ;
756 if (info->channels != 1)
757 return 0 ;
758 if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
759 return 1 ;
760 break ;
761
762 case SF_FORMAT_AVR :
763 /* SDS is strictly big endian. */
764 if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
765 return 0 ;
766 if (info->channels > 2)
767 return 0 ;
768 if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
769 return 1 ;
770 break ;
771
772 case SF_FORMAT_FLAC :
773 /* FLAC can't do more than 8 channels. */
774 if (info->channels > 8)
775 return 0 ;
776 if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
777 return 1 ;
778 break ;
779
780 case SF_FORMAT_SD2 :
781 /* SD2 is strictly big endian. */
782 if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
783 return 0 ;
784 if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
785 return 1 ;
786 break ;
787
788 case SF_FORMAT_WVE :
789 /* WVE is strictly big endian. */
790 if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
791 return 0 ;
792 if (info->channels > 1)
793 return 0 ;
794 if (subformat == SF_FORMAT_ALAW)
795 return 1 ;
796 break ;
797
798 case SF_FORMAT_OGG :
799 if (subformat == SF_FORMAT_VORBIS)
800 return 1 ;
801 break ;
802
803 case SF_FORMAT_MPC2K :
804 /* MPC2000 is strictly little endian. */
805 if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
806 return 0 ;
807 if (info->channels > 2)
808 return 0 ;
809 if (subformat == SF_FORMAT_PCM_16)
810 return 1 ;
811 break ;
812
813 case SF_FORMAT_RF64 :
814 if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
815 return 0 ;
816 if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
817 return 1 ;
818 if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
819 return 1 ;
820 if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
821 return 1 ;
822 if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
823 return 1 ;
824 break ;
825 default : break ;
826 } ;
827
828 return 0 ;
829} /* sf_format_check */
830
831/*------------------------------------------------------------------------------
832*/
833
834const char *
835sf_version_string (void)
836{
837#if ENABLE_EXPERIMENTAL_CODE
838 return PACKAGE_NAME "-" PACKAGE_VERSION "-exp" ;
839#else
840 return PACKAGE_NAME "-" PACKAGE_VERSION ;
841#endif
842}
843
844
845/*------------------------------------------------------------------------------
846*/
847
848int
849sf_command (SNDFILE *sndfile, int command, void *data, int datasize)
850{ SF_PRIVATE *psf = (SF_PRIVATE *) sndfile ;
851 int old_value ;
852
853 /* This set of commands do not need the sndfile parameter. */
854 switch (command)
855 { case SFC_GET_LIB_VERSION :
856 if (data == NULL)
857 { if (psf)
858 psf->error = SFE_BAD_COMMAND_PARAM ;
859 return SFE_BAD_COMMAND_PARAM ;
860 } ;
861 snprintf (data, datasize, "%s", sf_version_string ()) ;
862 return strlen (data) ;
863
864 case SFC_GET_SIMPLE_FORMAT_COUNT :
865 if (data == NULL || datasize != SIGNED_SIZEOF (int))
866 return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
867 *((int*) data) = psf_get_format_simple_count () ;
868 return 0 ;
869
870 case SFC_GET_SIMPLE_FORMAT :
871 if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
872 return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
873 return psf_get_format_simple (data) ;
874
875 case SFC_GET_FORMAT_MAJOR_COUNT :
876 if (data == NULL || datasize != SIGNED_SIZEOF (int))
877 return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
878 *((int*) data) = psf_get_format_major_count () ;
879 return 0 ;
880
881 case SFC_GET_FORMAT_MAJOR :
882 if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
883 return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
884 return psf_get_format_major (data) ;
885
886 case SFC_GET_FORMAT_SUBTYPE_COUNT :
887 if (data == NULL || datasize != SIGNED_SIZEOF (int))
888 return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
889 *((int*) data) = psf_get_format_subtype_count () ;
890 return 0 ;
891
892 case SFC_GET_FORMAT_SUBTYPE :
893 if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
894 return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
895 return psf_get_format_subtype (data) ;
896
897 case SFC_GET_FORMAT_INFO :
898 if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
899 return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
900 return psf_get_format_info (data) ;
901 } ;
902
903 if (sndfile == NULL && command == SFC_GET_LOG_INFO)
904 { if (data == NULL)
905 return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
906 snprintf (data, datasize, "%s", sf_logbuffer) ;
907 return strlen (data) ;
908 } ;
909
910 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
911
912 switch (command)
913 { case SFC_SET_NORM_FLOAT :
914 old_value = psf->norm_float ;
915 psf->norm_float = (datasize) ? SF_TRUE : SF_FALSE ;
916 return old_value ;
917
918 case SFC_GET_CURRENT_SF_INFO :
919 if (data == NULL || datasize != SIGNED_SIZEOF (SF_INFO))
920 return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
921 memcpy (data, &psf->sf, sizeof (SF_INFO)) ;
922 break ;
923
924 case SFC_SET_NORM_DOUBLE :
925 old_value = psf->norm_double ;
926 psf->norm_double = (datasize) ? SF_TRUE : SF_FALSE ;
927 return old_value ;
928
929 case SFC_GET_NORM_FLOAT :
930 return psf->norm_float ;
931
932 case SFC_GET_NORM_DOUBLE :
933 return psf->norm_double ;
934
935 case SFC_SET_SCALE_FLOAT_INT_READ :
936 old_value = psf->float_int_mult ;
937
938 psf->float_int_mult = (datasize != 0) ? SF_TRUE : SF_FALSE ;
939 if (psf->float_int_mult && psf->float_max < 0.0)
940 psf->float_max = psf_calc_signal_max (psf, SF_FALSE) ;
941 return old_value ;
942
943 case SFC_SET_SCALE_INT_FLOAT_WRITE :
944 old_value = psf->scale_int_float ;
945 psf->scale_int_float = (datasize != 0) ? SF_TRUE : SF_FALSE ;
946 return old_value ;
947
948 case SFC_SET_ADD_PEAK_CHUNK :
949 { int format = SF_CONTAINER (psf->sf.format) ;
950
951 /* Only WAV and AIFF support the PEAK chunk. */
952 switch (format)
953 { case SF_FORMAT_AIFF :
954 case SF_FORMAT_CAF :
955 case SF_FORMAT_WAV :
956 case SF_FORMAT_WAVEX :
957 break ;
958
959 default :
960 return SF_FALSE ;
961 } ;
962
963 format = SF_CODEC (psf->sf.format) ;
964
965 /* Only files containg the following data types support the PEAK chunk. */
966 if (format != SF_FORMAT_FLOAT && format != SF_FORMAT_DOUBLE)
967 return SF_FALSE ;
968
969 } ;
970 /* Can only do this is in SFM_WRITE mode. */
971 if (psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR)
972 return SF_FALSE ;
973 /* If data has already been written this must fail. */
974 if (psf->have_written)
975 { psf->error = SFE_CMD_HAS_DATA ;
976 return SF_FALSE ;
977 } ;
978 /* Everything seems OK, so set psf->has_peak and re-write header. */
979 if (datasize == SF_FALSE && psf->peak_info != NULL)
980 { free (psf->peak_info) ;
981 psf->peak_info = NULL ;
982 }
983 else if (psf->peak_info == NULL)
984 { psf->peak_info = peak_info_calloc (psf->sf.channels) ;
985 if (psf->peak_info != NULL)
986 psf->peak_info->peak_loc = SF_PEAK_START ;
987 } ;
988
989 if (psf->write_header)
990 psf->write_header (psf, SF_TRUE) ;
991 return datasize ;
992
993 case SFC_SET_ADD_HEADER_PAD_CHUNK :
994 return SF_FALSE ;
995
996 case SFC_GET_LOG_INFO :
997 if (data == NULL)
998 return SFE_BAD_COMMAND_PARAM ;
999 snprintf (data, datasize, "%s", psf->logbuffer) ;
1000 break ;
1001
1002 case SFC_CALC_SIGNAL_MAX :
1003 if (data == NULL || datasize != sizeof (double))
1004 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1005 *((double*) data) = psf_calc_signal_max (psf, SF_FALSE) ;
1006 break ;
1007
1008 case SFC_CALC_NORM_SIGNAL_MAX :
1009 if (data == NULL || datasize != sizeof (double))
1010 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1011 *((double*) data) = psf_calc_signal_max (psf, SF_TRUE) ;
1012 break ;
1013
1014 case SFC_CALC_MAX_ALL_CHANNELS :
1015 if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels)
1016 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1017 return psf_calc_max_all_channels (psf, (double*) data, SF_FALSE) ;
1018
1019 case SFC_CALC_NORM_MAX_ALL_CHANNELS :
1020 if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels)
1021 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1022 return psf_calc_max_all_channels (psf, (double*) data, SF_TRUE) ;
1023
1024 case SFC_GET_SIGNAL_MAX :
1025 if (data == NULL || datasize != sizeof (double))
1026 { psf->error = SFE_BAD_COMMAND_PARAM ;
1027 return SF_FALSE ;
1028 } ;
1029 return psf_get_signal_max (psf, (double *) data) ;
1030
1031 case SFC_GET_MAX_ALL_CHANNELS :
1032 if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels)
1033 { psf->error = SFE_BAD_COMMAND_PARAM ;
1034 return SF_FALSE ;
1035 } ;
1036 return psf_get_max_all_channels (psf, (double*) data) ;
1037
1038 case SFC_UPDATE_HEADER_NOW :
1039 if (psf->write_header)
1040 psf->write_header (psf, SF_TRUE) ;
1041 break ;
1042
1043 case SFC_SET_UPDATE_HEADER_AUTO :
1044 psf->auto_header = datasize ? SF_TRUE : SF_FALSE ;
1045 return psf->auto_header ;
1046 break ;
1047
1048 case SFC_SET_ADD_DITHER_ON_WRITE :
1049 case SFC_SET_ADD_DITHER_ON_READ :
1050 /*
1051 ** FIXME !
1052 ** These are obsolete. Just return.
1053 ** Remove some time after version 1.0.8.
1054 */
1055 break ;
1056
1057 case SFC_SET_DITHER_ON_WRITE :
1058 if (data == NULL || datasize != SIGNED_SIZEOF (SF_DITHER_INFO))
1059 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1060 memcpy (&psf->write_dither, data, sizeof (psf->write_dither)) ;
1061 if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
1062 dither_init (psf, SFM_WRITE) ;
1063 break ;
1064
1065 case SFC_SET_DITHER_ON_READ :
1066 if (data == NULL || datasize != SIGNED_SIZEOF (SF_DITHER_INFO))
1067 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1068 memcpy (&psf->read_dither, data, sizeof (psf->read_dither)) ;
1069 if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
1070 dither_init (psf, SFM_READ) ;
1071 break ;
1072
1073 case SFC_FILE_TRUNCATE :
1074 if (psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR)
1075 return SF_TRUE ;
1076 if (datasize != sizeof (sf_count_t))
1077 return SF_TRUE ;
1078 if (data == NULL || datasize != sizeof (sf_count_t))
1079 { psf->error = SFE_BAD_COMMAND_PARAM ;
1080 return SF_FALSE ;
1081 }
1082 else
1083 { sf_count_t position ;
1084
1085 position = *((sf_count_t*) data) ;
1086
1087 if (sf_seek (sndfile, position, SEEK_SET) != position)
1088 return SF_TRUE ;
1089
1090 psf->sf.frames = position ;
1091
1092 position = psf_fseek (psf, 0, SEEK_CUR) ;
1093
1094 return psf_ftruncate (psf, position) ;
1095 } ;
1096 break ;
1097
1098 case SFC_SET_RAW_START_OFFSET :
1099 if (data == NULL || datasize != sizeof (sf_count_t))
1100 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1101
1102 if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_RAW)
1103 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1104
1105 psf->dataoffset = *((sf_count_t*) data) ;
1106 sf_seek (sndfile, 0, SEEK_CUR) ;
1107 break ;
1108
1109 case SFC_GET_EMBED_FILE_INFO :
1110 if (data == NULL || datasize != sizeof (SF_EMBED_FILE_INFO))
1111 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1112
1113 ((SF_EMBED_FILE_INFO*) data)->offset = psf->fileoffset ;
1114 ((SF_EMBED_FILE_INFO*) data)->length = psf->filelength ;
1115 break ;
1116
1117 /* Lite remove start */
1118 case SFC_TEST_IEEE_FLOAT_REPLACE :
1119 psf->ieee_replace = (datasize) ? SF_TRUE : SF_FALSE ;
1120 if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_FLOAT)
1121 float32_init (psf) ;
1122 else if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DOUBLE)
1123 double64_init (psf) ;
1124 else
1125 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1126 break ;
1127 /* Lite remove end */
1128
1129 case SFC_SET_CLIPPING :
1130 psf->add_clipping = (datasize) ? SF_TRUE : SF_FALSE ;
1131 return psf->add_clipping ;
1132
1133 case SFC_GET_CLIPPING :
1134 return psf->add_clipping ;
1135
1136 case SFC_GET_LOOP_INFO :
1137 if (datasize != sizeof (SF_LOOP_INFO) || data == NULL)
1138 { psf->error = SFE_BAD_COMMAND_PARAM ;
1139 return SF_FALSE ;
1140 } ;
1141 if (psf->loop_info == NULL)
1142 return SF_FALSE ;
1143 memcpy (data, psf->loop_info, sizeof (SF_LOOP_INFO)) ;
1144 return SF_TRUE ;
1145
1146 case SFC_SET_BROADCAST_INFO :
1147 { int format = SF_CONTAINER (psf->sf.format) ;
1148
1149 /* Only WAV and RF64 supports the BEXT (Broadcast) chunk. */
1150 if (format != SF_FORMAT_WAV && format != SF_FORMAT_WAVEX && format != SF_FORMAT_RF64)
1151 return SF_FALSE ;
1152 } ;
1153
1154 /* Only makes sense in SFM_WRITE or SFM_RDWR mode. */
1155 if ((psf->file.mode != SFM_WRITE) && (psf->file.mode != SFM_RDWR))
1156 return SF_FALSE ;
1157 /* If data has already been written this must fail. */
1158 if (psf->broadcast_16k == NULL && psf->have_written)
1159 { psf->error = SFE_CMD_HAS_DATA ;
1160 return SF_FALSE ;
1161 } ;
1162
1163#if 0
1164 if (psf->broadcast_info == NULL)
1165 psf->broadcast_info = broadcast_info_alloc () ;
1166
1167 broadcast_info_copy (psf->broadcast_info, data) ;
1168 broadcast_add_coding_history (psf->broadcast_info, psf->sf.channels, psf->sf.samplerate, psf->sf.format) ;
1169#else
1170 broadcast_var_set (psf, data, datasize) ;
1171#endif
1172
1173 if (psf->write_header)
1174 psf->write_header (psf, SF_TRUE) ;
1175 return SF_TRUE ;
1176
1177 case SFC_GET_BROADCAST_INFO :
1178 if (data == NULL)
1179 { psf->error = SFE_BAD_COMMAND_PARAM ;
1180 return SF_FALSE ;
1181 } ;
1182#if 0
1183 if (psf->broadcast_info == NULL)
1184 return SF_FALSE ;
1185 return broadcast_info_copy (data, psf->broadcast_info) ;
1186#else
1187 return broadcast_var_get (psf, data, datasize) ;
1188#endif
1189
1190 case SFC_GET_INSTRUMENT :
1191 if (datasize != sizeof (SF_INSTRUMENT) || data == NULL)
1192 { psf->error = SFE_BAD_COMMAND_PARAM ;
1193 return SF_FALSE ;
1194 } ;
1195 if (psf->instrument == NULL)
1196 return SF_FALSE ;
1197 memcpy (data, psf->instrument, sizeof (SF_INSTRUMENT)) ;
1198 return SF_TRUE ;
1199
1200 case SFC_SET_INSTRUMENT :
1201 /* If data has already been written this must fail. */
1202 if (psf->have_written)
1203 { psf->error = SFE_CMD_HAS_DATA ;
1204 return SF_FALSE ;
1205 } ;
1206 if (datasize != sizeof (SF_INSTRUMENT) || data == NULL)
1207 { psf->error = SFE_BAD_COMMAND_PARAM ;
1208 return SF_FALSE ;
1209 } ;
1210
1211 if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL)
1212 { psf->error = SFE_MALLOC_FAILED ;
1213 return SF_FALSE ;
1214 } ;
1215 memcpy (psf->instrument, data, sizeof (SF_INSTRUMENT)) ;
1216 return SF_TRUE ;
1217
1218 case SFC_RAW_DATA_NEEDS_ENDSWAP :
1219 return psf->data_endswap ;
1220
1221 case SFC_GET_CHANNEL_MAP_INFO :
1222 if (psf->channel_map == NULL)
1223 return SF_FALSE ;
1224
1225 if (data == NULL || datasize != SIGNED_SIZEOF (psf->channel_map [0]) * psf->sf.channels)
1226 { psf->error = SFE_BAD_COMMAND_PARAM ;
1227 return SF_FALSE ;
1228 } ;
1229
1230 memcpy (data, psf->channel_map, datasize) ;
1231 return SF_TRUE ;
1232
1233 case SFC_SET_CHANNEL_MAP_INFO :
1234 if (psf->have_written)
1235 { psf->error = SFE_CMD_HAS_DATA ;
1236 return SF_FALSE ;
1237 } ;
1238 if (data == NULL || datasize != SIGNED_SIZEOF (psf->channel_map [0]) * psf->sf.channels)
1239 { psf->error = SFE_BAD_COMMAND_PARAM ;
1240 return SF_FALSE ;
1241 } ;
1242
1243 { int *iptr ;
1244
1245 for (iptr = data ; iptr < (int*) data + psf->sf.channels ; iptr++)
1246 { if (*iptr <= SF_CHANNEL_MAP_INVALID || *iptr >= SF_CHANNEL_MAP_MAX)
1247 { psf->error = SFE_BAD_COMMAND_PARAM ;
1248 return SF_FALSE ;
1249 } ;
1250 } ;
1251 } ;
1252
1253 free (psf->channel_map) ;
1254 if ((psf->channel_map = malloc (datasize)) == NULL)
1255 { psf->error = SFE_MALLOC_FAILED ;
1256 return SF_FALSE ;
1257 } ;
1258
1259 memcpy (psf->channel_map, data, datasize) ;
1260
1261 /*
1262 ** Pass the command down to the container's command handler.
1263 ** Don't pass user data, use validated psf->channel_map data instead.
1264 */
1265 if (psf->command)
1266 return psf->command (psf, command, NULL, 0) ;
1267 return SF_FALSE ;
1268
1269 default :
1270 /* Must be a file specific command. Pass it on. */
1271 if (psf->command)
1272 return psf->command (psf, command, data, datasize) ;
1273
1274 psf_log_printf (psf, "*** sf_command : cmd = 0x%X\n", command) ;
1275 return (psf->error = SFE_BAD_COMMAND_PARAM) ;
1276 } ;
1277
1278 return 0 ;
1279} /* sf_command */
1280
1281/*------------------------------------------------------------------------------
1282*/
1283
1284sf_count_t
1285sf_seek (SNDFILE *sndfile, sf_count_t offset, int whence)
1286{ SF_PRIVATE *psf ;
1287 sf_count_t seek_from_start = 0, retval ;
1288
1289 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1290
1291 if (! psf->sf.seekable)
1292 { psf->error = SFE_NOT_SEEKABLE ;
1293 return PSF_SEEK_ERROR ;
1294 } ;
1295
1296 /* If the whence parameter has a mode ORed in, check to see that
1297 ** it makes sense.
1298 */
1299 if (((whence & SFM_MASK) == SFM_WRITE && psf->file.mode == SFM_READ) ||
1300 ((whence & SFM_MASK) == SFM_READ && psf->file.mode == SFM_WRITE))
1301 { psf->error = SFE_WRONG_SEEK ;
1302 return PSF_SEEK_ERROR ;
1303 } ;
1304
1305 /* Convert all SEEK_CUR and SEEK_END into seek_from_start to be
1306 ** used with SEEK_SET.
1307 */
1308 switch (whence)
1309 { /* The SEEK_SET behaviour is independant of mode. */
1310 case SEEK_SET :
1311 case SEEK_SET | SFM_READ :
1312 case SEEK_SET | SFM_WRITE :
1313 case SEEK_SET | SFM_RDWR :
1314 seek_from_start = offset ;
1315 break ;
1316
1317 /* The SEEK_CUR is a little more tricky. */
1318 case SEEK_CUR :
1319 if (offset == 0)
1320 { if (psf->file.mode == SFM_READ)
1321 return psf->read_current ;
1322 if (psf->file.mode == SFM_WRITE)
1323 return psf->write_current ;
1324 } ;
1325 if (psf->file.mode == SFM_READ)
1326 seek_from_start = psf->read_current + offset ;
1327 else if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
1328 seek_from_start = psf->write_current + offset ;
1329 else
1330 psf->error = SFE_AMBIGUOUS_SEEK ;
1331 break ;
1332
1333 case SEEK_CUR | SFM_READ :
1334 if (offset == 0)
1335 return psf->read_current ;
1336 seek_from_start = psf->read_current + offset ;
1337 break ;
1338
1339 case SEEK_CUR | SFM_WRITE :
1340 if (offset == 0)
1341 return psf->write_current ;
1342 seek_from_start = psf->write_current + offset ;
1343 break ;
1344
1345 /* The SEEK_END */
1346 case SEEK_END :
1347 case SEEK_END | SFM_READ :
1348 case SEEK_END | SFM_WRITE :
1349 seek_from_start = psf->sf.frames + offset ;
1350 break ;
1351
1352 default :
1353 psf->error = SFE_BAD_SEEK ;
1354 break ;
1355 } ;
1356
1357 if (psf->error)
1358 return PSF_SEEK_ERROR ;
1359
1360 if (psf->file.mode == SFM_RDWR || psf->file.mode == SFM_WRITE)
1361 { if (seek_from_start < 0)
1362 { psf->error = SFE_BAD_SEEK ;
1363 return PSF_SEEK_ERROR ;
1364 } ;
1365 }
1366 else if (seek_from_start < 0 || seek_from_start > psf->sf.frames)
1367 { psf->error = SFE_BAD_SEEK ;
1368 return PSF_SEEK_ERROR ;
1369 } ;
1370
1371 if (psf->seek)
1372 { int new_mode = (whence & SFM_MASK) ? (whence & SFM_MASK) : psf->file.mode ;
1373
1374 retval = psf->seek (psf, new_mode, seek_from_start) ;
1375
1376 switch (new_mode)
1377 { case SFM_READ :
1378 psf->read_current = retval ;
1379 break ;
1380 case SFM_WRITE :
1381 psf->write_current = retval ;
1382 break ;
1383 case SFM_RDWR :
1384 psf->read_current = retval ;
1385 psf->write_current = retval ;
1386 new_mode = SFM_READ ;
1387 break ;
1388 } ;
1389
1390 psf->last_op = new_mode ;
1391
1392 return retval ;
1393 } ;
1394
1395 psf->error = SFE_AMBIGUOUS_SEEK ;
1396 return PSF_SEEK_ERROR ;
1397} /* sf_seek */
1398
1399/*------------------------------------------------------------------------------
1400*/
1401
1402const char*
1403sf_get_string (SNDFILE *sndfile, int str_type)
1404{ SF_PRIVATE *psf ;
1405
1406 if ((psf = (SF_PRIVATE*) sndfile) == NULL)
1407 return NULL ;
1408 if (psf->Magick != SNDFILE_MAGICK)
1409 return NULL ;
1410
1411 return psf_get_string (psf, str_type) ;
1412} /* sf_get_string */
1413
1414int
1415sf_set_string (SNDFILE *sndfile, int str_type, const char* str)
1416{ SF_PRIVATE *psf ;
1417
1418 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1419
1420 return psf_set_string (psf, str_type, str) ;
1421} /* sf_get_string */
1422
1423/*==============================================================================
1424*/
1425
1426sf_count_t
1427sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes)
1428{ SF_PRIVATE *psf ;
1429 sf_count_t count, extra ;
1430 int bytewidth, blockwidth ;
1431
1432 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1433
1434 bytewidth = (psf->bytewidth > 0) ? psf->bytewidth : 1 ;
1435 blockwidth = (psf->blockwidth > 0) ? psf->blockwidth : 1 ;
1436
1437 if (psf->file.mode == SFM_WRITE)
1438 { psf->error = SFE_NOT_READMODE ;
1439 return 0 ;
1440 } ;
1441
1442 if (bytes < 0 || psf->read_current >= psf->sf.frames)
1443 { psf_memset (ptr, 0, bytes) ;
1444 return 0 ;
1445 } ;
1446
1447 if (bytes % (psf->sf.channels * bytewidth))
1448 { psf->error = SFE_BAD_READ_ALIGN ;
1449 return 0 ;
1450 } ;
1451
1452 if (psf->last_op != SFM_READ)
1453 if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
1454 return 0 ;
1455
1456 count = psf_fread (ptr, 1, bytes, psf) ;
1457
1458 if (psf->read_current + count / blockwidth <= psf->sf.frames)
1459 psf->read_current += count / blockwidth ;
1460 else
1461 { count = (psf->sf.frames - psf->read_current) * blockwidth ;
1462 extra = bytes - count ;
1463 psf_memset (((char *) ptr) + count, 0, extra) ;
1464 psf->read_current = psf->sf.frames ;
1465 } ;
1466
1467 psf->last_op = SFM_READ ;
1468
1469 return count ;
1470} /* sf_read_raw */
1471
1472/*------------------------------------------------------------------------------
1473*/
1474
1475sf_count_t
1476sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t len)
1477{ SF_PRIVATE *psf ;
1478 sf_count_t count, extra ;
1479
1480 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1481
1482 if (psf->file.mode == SFM_WRITE)
1483 { psf->error = SFE_NOT_READMODE ;
1484 return 0 ;
1485 } ;
1486
1487 if (len % psf->sf.channels)
1488 { psf->error = SFE_BAD_READ_ALIGN ;
1489 return 0 ;
1490 } ;
1491
1492 if (len <= 0 || psf->read_current >= psf->sf.frames)
1493 { psf_memset (ptr, 0, len * sizeof (short)) ;
1494 return 0 ; /* End of file. */
1495 } ;
1496
1497 if (psf->read_short == NULL || psf->seek == NULL)
1498 { psf->error = SFE_UNIMPLEMENTED ;
1499 return 0 ;
1500 } ;
1501
1502 if (psf->last_op != SFM_READ)
1503 if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
1504 return 0 ;
1505
1506 count = psf->read_short (psf, ptr, len) ;
1507
1508 if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
1509 psf->read_current += count / psf->sf.channels ;
1510 else
1511 { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
1512 extra = len - count ;
1513 psf_memset (ptr + count, 0, extra * sizeof (short)) ;
1514 psf->read_current = psf->sf.frames ;
1515 } ;
1516
1517 psf->last_op = SFM_READ ;
1518
1519 return count ;
1520} /* sf_read_short */
1521
1522sf_count_t
1523sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames)
1524{ SF_PRIVATE *psf ;
1525 sf_count_t count, extra ;
1526
1527 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1528
1529 if (psf->file.mode == SFM_WRITE)
1530 { psf->error = SFE_NOT_READMODE ;
1531 return 0 ;
1532 } ;
1533
1534 if (frames <= 0 || psf->read_current >= psf->sf.frames)
1535 { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (short)) ;
1536 return 0 ; /* End of file. */
1537 } ;
1538
1539 if (psf->read_short == NULL || psf->seek == NULL)
1540 { psf->error = SFE_UNIMPLEMENTED ;
1541 return 0 ;
1542 } ;
1543
1544 if (psf->last_op != SFM_READ)
1545 if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
1546 return 0 ;
1547
1548 count = psf->read_short (psf, ptr, frames * psf->sf.channels) ;
1549
1550 if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
1551 psf->read_current += count / psf->sf.channels ;
1552 else
1553 { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
1554 extra = frames * psf->sf.channels - count ;
1555 psf_memset (ptr + count, 0, extra * sizeof (short)) ;
1556 psf->read_current = psf->sf.frames ;
1557 } ;
1558
1559 psf->last_op = SFM_READ ;
1560
1561 return count / psf->sf.channels ;
1562} /* sf_readf_short */
1563
1564/*------------------------------------------------------------------------------
1565*/
1566
1567sf_count_t
1568sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t len)
1569{ SF_PRIVATE *psf ;
1570 sf_count_t count, extra ;
1571
1572 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1573
1574 if (psf->file.mode == SFM_WRITE)
1575 { psf->error = SFE_NOT_READMODE ;
1576 return 0 ;
1577 } ;
1578
1579 if (len % psf->sf.channels)
1580 { psf->error = SFE_BAD_READ_ALIGN ;
1581 return 0 ;
1582 } ;
1583
1584 if (len <= 0 || psf->read_current >= psf->sf.frames)
1585 { psf_memset (ptr, 0, len * sizeof (int)) ;
1586 return 0 ;
1587 } ;
1588
1589 if (psf->read_int == NULL || psf->seek == NULL)
1590 { psf->error = SFE_UNIMPLEMENTED ;
1591 return 0 ;
1592 } ;
1593
1594 if (psf->last_op != SFM_READ)
1595 if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
1596 return 0 ;
1597
1598 count = psf->read_int (psf, ptr, len) ;
1599
1600 if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
1601 psf->read_current += count / psf->sf.channels ;
1602 else
1603 { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
1604 extra = len - count ;
1605 psf_memset (ptr + count, 0, extra * sizeof (int)) ;
1606 psf->read_current = psf->sf.frames ;
1607 } ;
1608
1609 psf->last_op = SFM_READ ;
1610
1611 return count ;
1612} /* sf_read_int */
1613
1614sf_count_t
1615sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames)
1616{ SF_PRIVATE *psf ;
1617 sf_count_t count, extra ;
1618
1619 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1620
1621 if (psf->file.mode == SFM_WRITE)
1622 { psf->error = SFE_NOT_READMODE ;
1623 return 0 ;
1624 } ;
1625
1626 if (frames <= 0 || psf->read_current >= psf->sf.frames)
1627 { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (int)) ;
1628 return 0 ;
1629 } ;
1630
1631 if (psf->read_int == NULL || psf->seek == NULL)
1632 { psf->error = SFE_UNIMPLEMENTED ;
1633 return 0 ;
1634 } ;
1635
1636 if (psf->last_op != SFM_READ)
1637 if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
1638 return 0 ;
1639
1640 count = psf->read_int (psf, ptr, frames * psf->sf.channels) ;
1641
1642 if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
1643 psf->read_current += count / psf->sf.channels ;
1644 else
1645 { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
1646 extra = frames * psf->sf.channels - count ;
1647 psf_memset (ptr + count, 0, extra * sizeof (int)) ;
1648 psf->read_current = psf->sf.frames ;
1649 } ;
1650
1651 psf->last_op = SFM_READ ;
1652
1653 return count / psf->sf.channels ;
1654} /* sf_readf_int */
1655
1656/*------------------------------------------------------------------------------
1657*/
1658
1659sf_count_t
1660sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t len)
1661{ SF_PRIVATE *psf ;
1662 sf_count_t count, extra ;
1663
1664 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1665
1666 if (psf->file.mode == SFM_WRITE)
1667 { psf->error = SFE_NOT_READMODE ;
1668 return 0 ;
1669 } ;
1670
1671 if (len % psf->sf.channels)
1672 { psf->error = SFE_BAD_READ_ALIGN ;
1673 return 0 ;
1674 } ;
1675
1676 if (len <= 0 || psf->read_current >= psf->sf.frames)
1677 { psf_memset (ptr, 0, len * sizeof (float)) ;
1678 return 0 ;
1679 } ;
1680
1681 if (psf->read_float == NULL || psf->seek == NULL)
1682 { psf->error = SFE_UNIMPLEMENTED ;
1683 return 0 ;
1684 } ;
1685
1686 if (psf->last_op != SFM_READ)
1687 if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
1688 return 0 ;
1689
1690 count = psf->read_float (psf, ptr, len) ;
1691
1692 if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
1693 psf->read_current += count / psf->sf.channels ;
1694 else
1695 { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
1696 extra = len - count ;
1697 psf_memset (ptr + count, 0, extra * sizeof (float)) ;
1698 psf->read_current = psf->sf.frames ;
1699 } ;
1700
1701 psf->last_op = SFM_READ ;
1702
1703 return count ;
1704} /* sf_read_float */
1705
1706sf_count_t
1707sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames)
1708{ SF_PRIVATE *psf ;
1709 sf_count_t count, extra ;
1710
1711 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1712
1713 if (psf->file.mode == SFM_WRITE)
1714 { psf->error = SFE_NOT_READMODE ;
1715 return 0 ;
1716 } ;
1717
1718 if (frames <= 0 || psf->read_current >= psf->sf.frames)
1719 { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (float)) ;
1720 return 0 ;
1721 } ;
1722
1723 if (psf->read_float == NULL || psf->seek == NULL)
1724 { psf->error = SFE_UNIMPLEMENTED ;
1725 return 0 ;
1726 } ;
1727
1728 if (psf->last_op != SFM_READ)
1729 if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
1730 return 0 ;
1731
1732 count = psf->read_float (psf, ptr, frames * psf->sf.channels) ;
1733
1734 if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
1735 psf->read_current += count / psf->sf.channels ;
1736 else
1737 { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
1738 extra = frames * psf->sf.channels - count ;
1739 psf_memset (ptr + count, 0, extra * sizeof (float)) ;
1740 psf->read_current = psf->sf.frames ;
1741 } ;
1742
1743 psf->last_op = SFM_READ ;
1744
1745 return count / psf->sf.channels ;
1746} /* sf_readf_float */
1747
1748/*------------------------------------------------------------------------------
1749*/
1750
1751sf_count_t
1752sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t len)
1753{ SF_PRIVATE *psf ;
1754 sf_count_t count, extra ;
1755
1756 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1757
1758 if (psf->file.mode == SFM_WRITE)
1759 { psf->error = SFE_NOT_READMODE ;
1760 return 0 ;
1761 } ;
1762
1763 if (len % psf->sf.channels)
1764 { psf->error = SFE_BAD_READ_ALIGN ;
1765 return 0 ;
1766 } ;
1767
1768 if (len <= 0 || psf->read_current >= psf->sf.frames)
1769 { psf_memset (ptr, 0, len * sizeof (double)) ;
1770 return 0 ;
1771 } ;
1772
1773 if (psf->read_double == NULL || psf->seek == NULL)
1774 { psf->error = SFE_UNIMPLEMENTED ;
1775 return 0 ;
1776 } ;
1777
1778 if (psf->last_op != SFM_READ)
1779 if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
1780 return 0 ;
1781
1782 count = psf->read_double (psf, ptr, len) ;
1783
1784 if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
1785 psf->read_current += count / psf->sf.channels ;
1786 else
1787 { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
1788 extra = len - count ;
1789 psf_memset (ptr + count, 0, extra * sizeof (double)) ;
1790 psf->read_current = psf->sf.frames ;
1791 } ;
1792
1793 psf->last_op = SFM_READ ;
1794
1795 return count ;
1796} /* sf_read_double */
1797
1798sf_count_t
1799sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames)
1800{ SF_PRIVATE *psf ;
1801 sf_count_t count, extra ;
1802
1803 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1804
1805 if (psf->file.mode == SFM_WRITE)
1806 { psf->error = SFE_NOT_READMODE ;
1807 return 0 ;
1808 } ;
1809
1810 if (frames <= 0 || psf->read_current >= psf->sf.frames)
1811 { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (double)) ;
1812 return 0 ;
1813 } ;
1814
1815 if (psf->read_double == NULL || psf->seek == NULL)
1816 { psf->error = SFE_UNIMPLEMENTED ;
1817 return 0 ;
1818 } ;
1819
1820 if (psf->last_op != SFM_READ)
1821 if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
1822 return 0 ;
1823
1824 count = psf->read_double (psf, ptr, frames * psf->sf.channels) ;
1825
1826 if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
1827 psf->read_current += count / psf->sf.channels ;
1828 else
1829 { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
1830 extra = frames * psf->sf.channels - count ;
1831 psf_memset (ptr + count, 0, extra * sizeof (double)) ;
1832 psf->read_current = psf->sf.frames ;
1833 } ;
1834
1835 psf->last_op = SFM_READ ;
1836
1837 return count / psf->sf.channels ;
1838} /* sf_readf_double */
1839
1840/*------------------------------------------------------------------------------
1841*/
1842
1843sf_count_t
1844sf_write_raw (SNDFILE *sndfile, const void *ptr, sf_count_t len)
1845{ SF_PRIVATE *psf ;
1846 sf_count_t count ;
1847 int bytewidth, blockwidth ;
1848
1849 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1850
1851 bytewidth = (psf->bytewidth > 0) ? psf->bytewidth : 1 ;
1852 blockwidth = (psf->blockwidth > 0) ? psf->blockwidth : 1 ;
1853
1854 if (psf->file.mode == SFM_READ)
1855 { psf->error = SFE_NOT_WRITEMODE ;
1856 return 0 ;
1857 } ;
1858
1859 if (len % (psf->sf.channels * bytewidth))
1860 { psf->error = SFE_BAD_WRITE_ALIGN ;
1861 return 0 ;
1862 } ;
1863
1864 if (psf->last_op != SFM_WRITE)
1865 if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
1866 return 0 ;
1867
1868 if (psf->have_written == SF_FALSE && psf->write_header != NULL)
1869 psf->write_header (psf, SF_FALSE) ;
1870 psf->have_written = SF_TRUE ;
1871
1872 count = psf_fwrite (ptr, 1, len, psf) ;
1873
1874 psf->write_current += count / blockwidth ;
1875
1876 psf->last_op = SFM_WRITE ;
1877
1878 if (psf->auto_header && psf->write_header != NULL)
1879 psf->write_header (psf, SF_TRUE) ;
1880
1881 if (psf->write_current > psf->sf.frames)
1882 psf->sf.frames = psf->write_current ;
1883
1884 return count ;
1885} /* sf_write_raw */
1886
1887/*------------------------------------------------------------------------------
1888*/
1889
1890sf_count_t
1891sf_write_short (SNDFILE *sndfile, const short *ptr, sf_count_t len)
1892{ SF_PRIVATE *psf ;
1893 sf_count_t count ;
1894
1895 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1896
1897 if (psf->file.mode == SFM_READ)
1898 { psf->error = SFE_NOT_WRITEMODE ;
1899 return 0 ;
1900 } ;
1901
1902 if (len % psf->sf.channels)
1903 { psf->error = SFE_BAD_WRITE_ALIGN ;
1904 return 0 ;
1905 } ;
1906
1907 if (psf->write_short == NULL || psf->seek == NULL)
1908 { psf->error = SFE_UNIMPLEMENTED ;
1909 return 0 ;
1910 } ;
1911
1912 if (psf->last_op != SFM_WRITE)
1913 if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
1914 return 0 ;
1915
1916 if (psf->have_written == SF_FALSE && psf->write_header != NULL)
1917 psf->write_header (psf, SF_FALSE) ;
1918 psf->have_written = SF_TRUE ;
1919
1920 count = psf->write_short (psf, ptr, len) ;
1921
1922 psf->write_current += count / psf->sf.channels ;
1923
1924 psf->last_op = SFM_WRITE ;
1925
1926 if (psf->auto_header && psf->write_header != NULL)
1927 psf->write_header (psf, SF_TRUE) ;
1928
1929 if (psf->write_current > psf->sf.frames)
1930 psf->sf.frames = psf->write_current ;
1931
1932 return count ;
1933} /* sf_write_short */
1934
1935sf_count_t
1936sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames)
1937{ SF_PRIVATE *psf ;
1938 sf_count_t count ;
1939
1940 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1941
1942 if (psf->file.mode == SFM_READ)
1943 { psf->error = SFE_NOT_WRITEMODE ;
1944 return 0 ;
1945 } ;
1946
1947 if (psf->write_short == NULL || psf->seek == NULL)
1948 { psf->error = SFE_UNIMPLEMENTED ;
1949 return 0 ;
1950 } ;
1951
1952 if (psf->last_op != SFM_WRITE)
1953 if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
1954 return 0 ;
1955
1956 if (psf->have_written == SF_FALSE && psf->write_header != NULL)
1957 psf->write_header (psf, SF_FALSE) ;
1958 psf->have_written = SF_TRUE ;
1959
1960 count = psf->write_short (psf, ptr, frames * psf->sf.channels) ;
1961
1962 psf->write_current += count / psf->sf.channels ;
1963
1964 psf->last_op = SFM_WRITE ;
1965
1966 if (psf->auto_header && psf->write_header != NULL)
1967 psf->write_header (psf, SF_TRUE) ;
1968
1969 if (psf->write_current > psf->sf.frames)
1970 psf->sf.frames = psf->write_current ;
1971
1972 return count / psf->sf.channels ;
1973} /* sf_writef_short */
1974
1975/*------------------------------------------------------------------------------
1976*/
1977
1978sf_count_t
1979sf_write_int (SNDFILE *sndfile, const int *ptr, sf_count_t len)
1980{ SF_PRIVATE *psf ;
1981 sf_count_t count ;
1982
1983 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
1984
1985 if (psf->file.mode == SFM_READ)
1986 { psf->error = SFE_NOT_WRITEMODE ;
1987 return 0 ;
1988 } ;
1989
1990 if (len % psf->sf.channels)
1991 { psf->error = SFE_BAD_WRITE_ALIGN ;
1992 return 0 ;
1993 } ;
1994
1995 if (psf->write_int == NULL || psf->seek == NULL)
1996 { psf->error = SFE_UNIMPLEMENTED ;
1997 return 0 ;
1998 } ;
1999
2000 if (psf->last_op != SFM_WRITE)
2001 if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
2002 return 0 ;
2003
2004 if (psf->have_written == SF_FALSE && psf->write_header != NULL)
2005 psf->write_header (psf, SF_FALSE) ;
2006 psf->have_written = SF_TRUE ;
2007
2008 count = psf->write_int (psf, ptr, len) ;
2009
2010 psf->write_current += count / psf->sf.channels ;
2011
2012 psf->last_op = SFM_WRITE ;
2013
2014 if (psf->auto_header && psf->write_header != NULL)
2015 psf->write_header (psf, SF_TRUE) ;
2016
2017 if (psf->write_current > psf->sf.frames)
2018 psf->sf.frames = psf->write_current ;
2019
2020 return count ;
2021} /* sf_write_int */
2022
2023sf_count_t
2024sf_writef_int (SNDFILE *sndfile, const int *ptr, sf_count_t frames)
2025{ SF_PRIVATE *psf ;
2026 sf_count_t count ;
2027
2028 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
2029
2030 if (psf->file.mode == SFM_READ)
2031 { psf->error = SFE_NOT_WRITEMODE ;
2032 return 0 ;
2033 } ;
2034
2035 if (psf->write_int == NULL || psf->seek == NULL)
2036 { psf->error = SFE_UNIMPLEMENTED ;
2037 return 0 ;
2038 } ;
2039
2040 if (psf->last_op != SFM_WRITE)
2041 if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
2042 return 0 ;
2043
2044 if (psf->have_written == SF_FALSE && psf->write_header != NULL)
2045 psf->write_header (psf, SF_FALSE) ;
2046 psf->have_written = SF_TRUE ;
2047
2048 count = psf->write_int (psf, ptr, frames * psf->sf.channels) ;
2049
2050 psf->write_current += count / psf->sf.channels ;
2051
2052 psf->last_op = SFM_WRITE ;
2053
2054 if (psf->auto_header && psf->write_header != NULL)
2055 psf->write_header (psf, SF_TRUE) ;
2056
2057 if (psf->write_current > psf->sf.frames)
2058 psf->sf.frames = psf->write_current ;
2059
2060 return count / psf->sf.channels ;
2061} /* sf_writef_int */
2062
2063/*------------------------------------------------------------------------------
2064*/
2065
2066sf_count_t
2067sf_write_float (SNDFILE *sndfile, const float *ptr, sf_count_t len)
2068{ SF_PRIVATE *psf ;
2069 sf_count_t count ;
2070
2071 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
2072
2073 if (psf->file.mode == SFM_READ)
2074 { psf->error = SFE_NOT_WRITEMODE ;
2075 return 0 ;
2076 } ;
2077
2078 if (len % psf->sf.channels)
2079 { psf->error = SFE_BAD_WRITE_ALIGN ;
2080 return 0 ;
2081 } ;
2082
2083 if (psf->write_float == NULL || psf->seek == NULL)
2084 { psf->error = SFE_UNIMPLEMENTED ;
2085 return 0 ;
2086 } ;
2087
2088 if (psf->last_op != SFM_WRITE)
2089 if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
2090 return 0 ;
2091
2092 if (psf->have_written == SF_FALSE && psf->write_header != NULL)
2093 psf->write_header (psf, SF_FALSE) ;
2094 psf->have_written = SF_TRUE ;
2095
2096 count = psf->write_float (psf, ptr, len) ;
2097
2098 psf->write_current += count / psf->sf.channels ;
2099
2100 psf->last_op = SFM_WRITE ;
2101
2102 if (psf->auto_header && psf->write_header != NULL)
2103 psf->write_header (psf, SF_TRUE) ;
2104
2105 if (psf->write_current > psf->sf.frames)
2106 psf->sf.frames = psf->write_current ;
2107
2108 return count ;
2109} /* sf_write_float */
2110
2111sf_count_t
2112sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames)
2113{ SF_PRIVATE *psf ;
2114 sf_count_t count ;
2115
2116 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
2117
2118 if (psf->file.mode == SFM_READ)
2119 { psf->error = SFE_NOT_WRITEMODE ;
2120 return 0 ;
2121 } ;
2122
2123 if (psf->write_float == NULL || psf->seek == NULL)
2124 { psf->error = SFE_UNIMPLEMENTED ;
2125 return 0 ;
2126 } ;
2127
2128 if (psf->last_op != SFM_WRITE)
2129 if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
2130 return 0 ;
2131
2132 if (psf->have_written == SF_FALSE && psf->write_header != NULL)
2133 psf->write_header (psf, SF_FALSE) ;
2134 psf->have_written = SF_TRUE ;
2135
2136 count = psf->write_float (psf, ptr, frames * psf->sf.channels) ;
2137
2138 psf->write_current += count / psf->sf.channels ;
2139
2140 psf->last_op = SFM_WRITE ;
2141
2142 if (psf->auto_header && psf->write_header != NULL)
2143 psf->write_header (psf, SF_TRUE) ;
2144
2145 if (psf->write_current > psf->sf.frames)
2146 psf->sf.frames = psf->write_current ;
2147
2148 return count / psf->sf.channels ;
2149} /* sf_writef_float */
2150
2151/*------------------------------------------------------------------------------
2152*/
2153
2154sf_count_t
2155sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t len)
2156{ SF_PRIVATE *psf ;
2157 sf_count_t count ;
2158
2159 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
2160
2161 if (psf->file.mode == SFM_READ)
2162 { psf->error = SFE_NOT_WRITEMODE ;
2163 return 0 ;
2164 } ;
2165
2166 if (len % psf->sf.channels)
2167 { psf->error = SFE_BAD_WRITE_ALIGN ;
2168 return 0 ;
2169 } ;
2170
2171 if (psf->write_double == NULL || psf->seek == NULL)
2172 { psf->error = SFE_UNIMPLEMENTED ;
2173 return 0 ;
2174 } ;
2175
2176 if (psf->last_op != SFM_WRITE)
2177 if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
2178 return 0 ;
2179
2180 if (psf->have_written == SF_FALSE && psf->write_header != NULL)
2181 psf->write_header (psf, SF_FALSE) ;
2182 psf->have_written = SF_TRUE ;
2183
2184 count = psf->write_double (psf, ptr, len) ;
2185
2186 psf->write_current += count / psf->sf.channels ;
2187
2188 psf->last_op = SFM_WRITE ;
2189
2190 if (psf->auto_header && psf->write_header != NULL)
2191 psf->write_header (psf, SF_TRUE) ;
2192
2193 if (psf->write_current > psf->sf.frames)
2194 psf->sf.frames = psf->write_current ;
2195
2196 return count ;
2197} /* sf_write_double */
2198
2199sf_count_t
2200sf_writef_double (SNDFILE *sndfile, const double *ptr, sf_count_t frames)
2201{ SF_PRIVATE *psf ;
2202 sf_count_t count ;
2203
2204 VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
2205
2206 if (psf->file.mode == SFM_READ)
2207 { psf->error = SFE_NOT_WRITEMODE ;
2208 return 0 ;
2209 } ;
2210
2211 if (psf->write_double == NULL || psf->seek == NULL)
2212 { psf->error = SFE_UNIMPLEMENTED ;
2213 return 0 ;
2214 } ;
2215
2216 if (psf->last_op != SFM_WRITE)
2217 if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
2218 return 0 ;
2219
2220 if (psf->have_written == SF_FALSE && psf->write_header != NULL)
2221 psf->write_header (psf, SF_FALSE) ;
2222 psf->have_written = SF_TRUE ;
2223
2224 count = psf->write_double (psf, ptr, frames * psf->sf.channels) ;
2225
2226 psf->write_current += count / psf->sf.channels ;
2227
2228 psf->last_op = SFM_WRITE ;
2229
2230 if (psf->auto_header && psf->write_header != NULL)
2231 psf->write_header (psf, SF_TRUE) ;
2232
2233 if (psf->write_current > psf->sf.frames)
2234 psf->sf.frames = psf->write_current ;
2235
2236 return count / psf->sf.channels ;
2237} /* sf_writef_double */
2238
2239/*=========================================================================
2240** Private functions.
2241*/
2242
2243static int
2244try_resource_fork (SF_PRIVATE * psf)
2245{ int old_error = psf->error ;
2246
2247 /* Set READ mode now, to see if resource fork exists. */
2248 psf->rsrc.mode = SFM_READ ;
2249 if (psf_open_rsrc (psf) != 0)
2250 { psf->error = old_error ;
2251 return 0 ;
2252 } ;
2253
2254 /* More checking here. */
2255 psf_log_printf (psf, "Resource fork : %s\n", psf->rsrc.path.c) ;
2256
2257 return SF_FORMAT_SD2 ;
2258} /* try_resource_fork */
2259
2260static int
2261format_from_extension (SF_PRIVATE *psf)
2262{ char *cptr ;
2263 char buffer [16] ;
2264 int format = 0 ;
2265
2266 if ((cptr = strrchr (psf->file.name.c, '.')) == NULL)
2267 return 0 ;
2268
2269 cptr ++ ;
2270 if (strlen (cptr) > sizeof (buffer) - 1)
2271 return 0 ;
2272
2273 psf_strlcpy (buffer, sizeof (buffer), cptr) ;
2274 buffer [sizeof (buffer) - 1] = 0 ;
2275
2276 /* Convert everything in the buffer to lower case. */
2277 cptr = buffer ;
2278 while (*cptr)
2279 { *cptr = tolower (*cptr) ;
2280 cptr ++ ;
2281 } ;
2282
2283 cptr = buffer ;
2284
2285 if (strcmp (cptr, "au") == 0)
2286 { psf->sf.channels = 1 ;
2287 psf->sf.samplerate = 8000 ;
2288 format = SF_FORMAT_RAW | SF_FORMAT_ULAW ;
2289 }
2290 else if (strcmp (cptr, "snd") == 0)
2291 { psf->sf.channels = 1 ;
2292 psf->sf.samplerate = 8000 ;
2293 format = SF_FORMAT_RAW | SF_FORMAT_ULAW ;
2294 }
2295
2296 else if (strcmp (cptr, "vox") == 0 || strcmp (cptr, "vox8") == 0)
2297 { psf->sf.channels = 1 ;
2298 psf->sf.samplerate = 8000 ;
2299 format = SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ;
2300 }
2301 else if (strcmp (cptr, "vox6") == 0)
2302 { psf->sf.channels = 1 ;
2303 psf->sf.samplerate = 6000 ;
2304 format = SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ;
2305 }
2306 else if (strcmp (cptr, "gsm") == 0)
2307 { psf->sf.channels = 1 ;
2308 psf->sf.samplerate = 8000 ;
2309 format = SF_FORMAT_RAW | SF_FORMAT_GSM610 ;
2310 }
2311
2312 /* For RAW files, make sure the dataoffset if set correctly. */
2313 if ((SF_CONTAINER (format)) == SF_FORMAT_RAW)
2314 psf->dataoffset = 0 ;
2315
2316 return format ;
2317} /* format_from_extension */
2318
2319static int
2320guess_file_type (SF_PRIVATE *psf)
2321{ int buffer [3], format ;
2322
2323 if (psf_binheader_readf (psf, "b", &buffer, SIGNED_SIZEOF (buffer)) != SIGNED_SIZEOF (buffer))
2324 { psf->error = SFE_BAD_FILE_READ ;
2325 return 0 ;
2326 } ;
2327
2328 if ((buffer [0] == MAKE_MARKER ('R', 'I', 'F', 'F') || buffer [0] == MAKE_MARKER ('R', 'I', 'F', 'X'))
2329 && buffer [2] == MAKE_MARKER ('W', 'A', 'V', 'E'))
2330 return SF_FORMAT_WAV ;
2331
2332 if (buffer [0] == MAKE_MARKER ('F', 'O', 'R', 'M'))
2333 { if (buffer [2] == MAKE_MARKER ('A', 'I', 'F', 'F') || buffer [2] == MAKE_MARKER ('A', 'I', 'F', 'C'))
2334 return SF_FORMAT_AIFF ;
2335 if (buffer [2] == MAKE_MARKER ('8', 'S', 'V', 'X') || buffer [2] == MAKE_MARKER ('1', '6', 'S', 'V'))
2336 return SF_FORMAT_SVX ;
2337 return 0 ;
2338 } ;
2339
2340 if (buffer [0] == MAKE_MARKER ('.', 's', 'n', 'd') || buffer [0] == MAKE_MARKER ('d', 'n', 's', '.'))
2341 return SF_FORMAT_AU ;
2342
2343 if ((buffer [0] == MAKE_MARKER ('f', 'a', 'p', ' ') || buffer [0] == MAKE_MARKER (' ', 'p', 'a', 'f')))
2344 return SF_FORMAT_PAF ;
2345
2346 if (buffer [0] == MAKE_MARKER ('N', 'I', 'S', 'T'))
2347 return SF_FORMAT_NIST ;
2348
2349 if (buffer [0] == MAKE_MARKER ('C', 'r', 'e', 'a') && buffer [1] == MAKE_MARKER ('t', 'i', 'v', 'e'))
2350 return SF_FORMAT_VOC ;
2351
2352 if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0xF8, 0xFF)) == MAKE_MARKER (0x64, 0xA3, 0x00, 0x00) ||
2353 (buffer [0] & MAKE_MARKER (0xFF, 0xF8, 0xFF, 0xFF)) == MAKE_MARKER (0x00, 0x00, 0xA3, 0x64))
2354 return SF_FORMAT_IRCAM ;
2355
2356 if (buffer [0] == MAKE_MARKER ('r', 'i', 'f', 'f'))
2357 return SF_FORMAT_W64 ;
2358
2359 if (buffer [0] == MAKE_MARKER (0, 0, 0x03, 0xE8) && buffer [1] == MAKE_MARKER (0, 0, 0, 1) &&
2360 buffer [2] == MAKE_MARKER (0, 0, 0, 1))
2361 return SF_FORMAT_MAT4 ;
2362
2363 if (buffer [0] == MAKE_MARKER (0, 0, 0, 0) && buffer [1] == MAKE_MARKER (1, 0, 0, 0) &&
2364 buffer [2] == MAKE_MARKER (1, 0, 0, 0))
2365 return SF_FORMAT_MAT4 ;
2366
2367 if (buffer [0] == MAKE_MARKER ('M', 'A', 'T', 'L') && buffer [1] == MAKE_MARKER ('A', 'B', ' ', '5'))
2368 return SF_FORMAT_MAT5 ;
2369
2370 if (buffer [0] == MAKE_MARKER ('P', 'V', 'F', '1'))
2371 return SF_FORMAT_PVF ;
2372
2373 if (buffer [0] == MAKE_MARKER ('E', 'x', 't', 'e') && buffer [1] == MAKE_MARKER ('n', 'd', 'e', 'd') &&
2374 buffer [2] == MAKE_MARKER (' ', 'I', 'n', 's'))
2375 return SF_FORMAT_XI ;
2376
2377 if (buffer [0] == MAKE_MARKER ('c', 'a', 'f', 'f') && buffer [2] == MAKE_MARKER ('d', 'e', 's', 'c'))
2378 return SF_FORMAT_CAF ;
2379
2380 if (buffer [0] == MAKE_MARKER ('O', 'g', 'g', 'S'))
2381 return SF_FORMAT_OGG ;
2382
2383 if (buffer [0] == MAKE_MARKER ('A', 'L', 'a', 'w') && buffer [1] == MAKE_MARKER ('S', 'o', 'u', 'n')
2384 && buffer [2] == MAKE_MARKER ('d', 'F', 'i', 'l'))
2385 return SF_FORMAT_WVE ;
2386
2387 if (buffer [0] == MAKE_MARKER ('D', 'i', 'a', 'm') && buffer [1] == MAKE_MARKER ('o', 'n', 'd', 'W')
2388 && buffer [2] == MAKE_MARKER ('a', 'r', 'e', ' '))
2389 return SF_FORMAT_DWD ;
2390
2391 if (buffer [0] == MAKE_MARKER ('L', 'M', '8', '9') || buffer [0] == MAKE_MARKER ('5', '3', 0, 0))
2392 return SF_FORMAT_TXW ;
2393
2394 if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0x80, 0xFF)) == MAKE_MARKER (0xF0, 0x7E, 0, 0x01))
2395 return SF_FORMAT_SDS ;
2396
2397 if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0, 0)) == MAKE_MARKER (1, 4, 0, 0))
2398 return SF_FORMAT_MPC2K ;
2399
2400 if (buffer [0] == MAKE_MARKER ('C', 'A', 'T', ' ') && buffer [2] == MAKE_MARKER ('R', 'E', 'X', '2'))
2401 return SF_FORMAT_REX2 ;
2402
2403 if (buffer [0] == MAKE_MARKER (0x30, 0x26, 0xB2, 0x75) && buffer [1] == MAKE_MARKER (0x8E, 0x66, 0xCF, 0x11))
2404 return 0 /*-SF_FORMAT_WMA-*/ ;
2405
2406 /* HMM (Hidden Markov Model) Tool Kit. */
2407 if (2 * BEI2H_INT (buffer [0]) + 12 == psf->filelength && buffer [2] == MAKE_MARKER (0, 2, 0, 0))
2408 return SF_FORMAT_HTK ;
2409
2410 if (buffer [0] == MAKE_MARKER ('f', 'L', 'a', 'C'))
2411 return SF_FORMAT_FLAC ;
2412
2413 if (buffer [0] == MAKE_MARKER ('2', 'B', 'I', 'T'))
2414 return SF_FORMAT_AVR ;
2415
2416 if (buffer [0] == MAKE_MARKER ('R', 'F', '6', '4') && buffer [2] == MAKE_MARKER ('W', 'A', 'V', 'E'))
2417 return SF_FORMAT_RF64 ;
2418
2419 if (buffer [0] == MAKE_MARKER ('I', 'D', '3', 3))
2420 { psf_log_printf (psf, "Found 'ID3' marker.\n") ;
2421 if (id3_skip (psf))
2422 return guess_file_type (psf) ;
2423 return 0 ;
2424 } ;
2425
2426 /* Turtle Beach SMP 16-bit */
2427 if (buffer [0] == MAKE_MARKER ('S', 'O', 'U', 'N') && buffer [1] == MAKE_MARKER ('D', ' ', 'S', 'A'))
2428 return 0 ;
2429
2430 /* Yamaha sampler format. */
2431 if (buffer [0] == MAKE_MARKER ('S', 'Y', '8', '0') || buffer [0] == MAKE_MARKER ('S', 'Y', '8', '5'))
2432 return 0 ;
2433
2434 if (buffer [0] == MAKE_MARKER ('a', 'j', 'k', 'g'))
2435 return 0 /*-SF_FORMAT_SHN-*/ ;
2436
2437 /* This must be the last one. */
2438 if (psf->filelength > 0 && (format = try_resource_fork (psf)) != 0)
2439 return format ;
2440
2441 return 0 ;
2442} /* guess_file_type */
2443
2444
2445static int
2446validate_sfinfo (SF_INFO *sfinfo)
2447{ if (sfinfo->samplerate < 1)
2448 return 0 ;
2449 if (sfinfo->frames < 0)
2450 return 0 ;
2451 if (sfinfo->channels < 1)
2452 return 0 ;
2453 if ((SF_CONTAINER (sfinfo->format)) == 0)
2454 return 0 ;
2455 if ((SF_CODEC (sfinfo->format)) == 0)
2456 return 0 ;
2457 if (sfinfo->sections < 1)
2458 return 0 ;
2459 return 1 ;
2460} /* validate_sfinfo */
2461
2462static int
2463validate_psf (SF_PRIVATE *psf)
2464{
2465 if (psf->datalength < 0)
2466 { psf_log_printf (psf, "Invalid SF_PRIVATE field : datalength == %D.\n", psf->datalength) ;
2467 return 0 ;
2468 } ;
2469 if (psf->dataoffset < 0)
2470 { psf_log_printf (psf, "Invalid SF_PRIVATE field : dataoffset == %D.\n", psf->dataoffset) ;
2471 return 0 ;
2472 } ;
2473 if (psf->blockwidth && psf->blockwidth != psf->sf.channels * psf->bytewidth)
2474 { psf_log_printf (psf, "Invalid SF_PRIVATE field : channels * bytewidth == %d.\n",
2475 psf->sf.channels * psf->bytewidth) ;
2476 return 0 ;
2477 } ;
2478 return 1 ;
2479} /* validate_psf */
2480
2481static void
2482save_header_info (SF_PRIVATE *psf)
2483{ snprintf (sf_logbuffer, sizeof (sf_logbuffer), "%s", psf->logbuffer) ;
2484} /* save_header_info */
2485
2486static void
2487copy_filename (SF_PRIVATE *psf, const char *path)
2488{ const char *ccptr ;
2489 char *cptr ;
2490
2491 snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", path) ;
2492 if ((ccptr = strrchr (path, '/')) || (ccptr = strrchr (path, '\\')))
2493 ccptr ++ ;
2494 else
2495 ccptr = path ;
2496
2497 snprintf (psf->file.name.c, sizeof (psf->file.name.c), "%s", ccptr) ;
2498
2499 /* Now grab the directory. */
2500 snprintf (psf->file.dir.c, sizeof (psf->file.dir.c), "%s", path) ;
2501 if ((cptr = strrchr (psf->file.dir.c, '/')) || (cptr = strrchr (psf->file.dir.c, '\\')))
2502 cptr [1] = 0 ;
2503 else
2504 psf->file.dir.c [0] = 0 ;
2505
2506 return ;
2507} /* copy_filename */
2508
2509/*==============================================================================
2510*/
2511
2512static int
2513psf_close (SF_PRIVATE *psf)
2514{ int error = 0 ;
2515
2516 if (psf->codec_close)
2517 error = psf->codec_close (psf) ;
2518 if (psf->container_close)
2519 error = psf->container_close (psf) ;
2520
2521 error = psf_fclose (psf) ;
2522 psf_close_rsrc (psf) ;
2523
2524 if (psf->container_data)
2525 free (psf->container_data) ;
2526
2527 if (psf->codec_data)
2528 free (psf->codec_data) ;
2529
2530 if (psf->interleave)
2531 free (psf->interleave) ;
2532
2533 if (psf->dither)
2534 free (psf->dither) ;
2535
2536 if (psf->peak_info)
2537 free (psf->peak_info) ;
2538
2539 if (psf->broadcast_16k)
2540 free (psf->broadcast_16k) ;
2541
2542 if (psf->loop_info)
2543 free (psf->loop_info) ;
2544
2545 if (psf->instrument)
2546 free (psf->instrument) ;
2547
2548 if (psf->channel_map)
2549 free (psf->channel_map) ;
2550
2551 if (psf->format_desc)
2552 { psf->format_desc [0] = 0 ;
2553 free (psf->format_desc) ;
2554 } ;
2555
2556 memset (psf, 0, sizeof (SF_PRIVATE)) ;
2557 free (psf) ;
2558
2559 return error ;
2560} /* psf_close */
2561
2562SNDFILE *
2563psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo)
2564{ int error, format ;
2565
2566 sf_errno = error = 0 ;
2567 sf_logbuffer [0] = 0 ;
Alexandre Lision2b237922013-09-09 16:23:02 -04002568__android_log_print(3,"TAG","psf_open_file 1");
Alexandre Lision7c6f4a62013-09-05 13:27:01 -04002569 if (psf->error)
2570 { error = psf->error ;
2571 goto error_exit ;
2572 } ;
Alexandre Lision2b237922013-09-09 16:23:02 -04002573__android_log_print(3,"TAG","psf_open_file 2");
Alexandre Lision7c6f4a62013-09-05 13:27:01 -04002574 if (psf->file.mode != SFM_READ && psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR)
2575 { error = SFE_BAD_OPEN_MODE ;
2576 goto error_exit ;
2577 } ;
Alexandre Lision2b237922013-09-09 16:23:02 -04002578__android_log_print(3,"TAG","psf_open_file 3");
Alexandre Lision7c6f4a62013-09-05 13:27:01 -04002579 if (sfinfo == NULL)
2580 { error = SFE_BAD_SF_INFO_PTR ;
2581 goto error_exit ;
2582 } ;
Alexandre Lision2b237922013-09-09 16:23:02 -04002583__android_log_print(3,"TAG","psf_open_file 4");
Alexandre Lision7c6f4a62013-09-05 13:27:01 -04002584 /* Zero out these fields. */
2585 sfinfo->frames = 0 ;
2586 sfinfo->sections = 0 ;
2587 sfinfo->seekable = 0 ;
2588
2589 if (psf->file.mode == SFM_READ)
2590 { if ((SF_CONTAINER (sfinfo->format)) == SF_FORMAT_RAW)
2591 { if (sf_format_check (sfinfo) == 0)
2592 { error = SFE_RAW_BAD_FORMAT ;
2593 goto error_exit ;
2594 } ;
2595 }
2596 else
2597 memset (sfinfo, 0, sizeof (SF_INFO)) ;
2598 } ;
2599
2600 memcpy (&(psf->sf), sfinfo, sizeof (SF_INFO)) ;
2601
2602 psf->Magick = SNDFILE_MAGICK ;
2603 psf->norm_float = SF_TRUE ;
2604 psf->norm_double = SF_TRUE ;
2605 psf->dataoffset = -1 ;
2606 psf->datalength = -1 ;
2607 psf->read_current = -1 ;
2608 psf->write_current = -1 ;
2609 psf->auto_header = SF_FALSE ;
2610 psf->rwf_endian = SF_ENDIAN_LITTLE ;
2611 psf->seek = psf_default_seek ;
2612 psf->float_int_mult = 0 ;
2613 psf->float_max = -1.0 ;
2614
2615 /* An attempt at a per SF_PRIVATE unique id. */
2616 psf->unique_id = psf_rand_int32 () ;
2617
2618 psf->sf.sections = 1 ;
2619
2620 psf->is_pipe = psf_is_pipe (psf) ;
2621
2622 if (psf->is_pipe)
2623 { psf->sf.seekable = SF_FALSE ;
2624 psf->filelength = SF_COUNT_MAX ;
2625 }
2626 else
2627 { psf->sf.seekable = SF_TRUE ;
2628
2629 /* File is open, so get the length. */
2630 psf->filelength = psf_get_filelen (psf) ;
2631 } ;
2632
2633 if (psf->fileoffset > 0)
2634 { switch (psf->file.mode)
2635 { case SFM_READ :
2636 if (psf->filelength < 44)
2637 { psf_log_printf (psf, "Short filelength: %D (fileoffset: %D)\n", psf->filelength, psf->fileoffset) ;
2638 error = SFE_BAD_OFFSET ;
2639 goto error_exit ;
2640 } ;
2641 break ;
2642
2643 case SFM_WRITE :
2644 psf->fileoffset = 0 ;
2645 psf_fseek (psf, 0, SEEK_END) ;
2646 psf->fileoffset = psf_ftell (psf) ;
2647 break ;
2648
2649 case SFM_RDWR :
2650 error = SFE_NO_EMBEDDED_RDWR ;
2651 goto error_exit ;
2652 } ;
2653
2654 psf_log_printf (psf, "Embedded file offset : %D\n", psf->fileoffset) ;
2655 } ;
2656
2657 if (psf->filelength == SF_COUNT_MAX)
2658 psf_log_printf (psf, "Length : unknown\n") ;
2659 else
2660 psf_log_printf (psf, "Length : %D\n", psf->filelength) ;
2661
2662 if (psf->file.mode == SFM_WRITE || (psf->file.mode == SFM_RDWR && psf->filelength == 0))
2663 { /* If the file is being opened for write or RDWR and the file is currently
2664 ** empty, then the SF_INFO struct must contain valid data.
2665 */
2666 if ((SF_CONTAINER (psf->sf.format)) == 0)
2667 { error = SFE_ZERO_MAJOR_FORMAT ;
2668 goto error_exit ;
2669 } ;
2670 if ((SF_CODEC (psf->sf.format)) == 0)
2671 { error = SFE_ZERO_MINOR_FORMAT ;
2672 goto error_exit ;
2673 } ;
2674
2675 if (sf_format_check (&(psf->sf)) == 0)
2676 { error = SFE_BAD_OPEN_FORMAT ;
2677 goto error_exit ;
2678 } ;
2679 }
2680 else if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_RAW)
2681 { /* If type RAW has not been specified then need to figure out file type. */
2682 psf->sf.format = guess_file_type (psf) ;
2683
2684 if (psf->sf.format == 0)
2685 psf->sf.format = format_from_extension (psf) ;
2686 } ;
2687
2688 /* Prevent unnecessary seeks */
2689 psf->last_op = psf->file.mode ;
2690
2691 /* Set bytewidth if known. */
2692 switch (SF_CODEC (psf->sf.format))
2693 { case SF_FORMAT_PCM_S8 :
2694 case SF_FORMAT_PCM_U8 :
2695 case SF_FORMAT_ULAW :
2696 case SF_FORMAT_ALAW :
2697 case SF_FORMAT_DPCM_8 :
2698 psf->bytewidth = 1 ;
2699 break ;
2700
2701 case SF_FORMAT_PCM_16 :
2702 case SF_FORMAT_DPCM_16 :
2703 psf->bytewidth = 2 ;
2704 break ;
2705
2706 case SF_FORMAT_PCM_24 :
2707 psf->bytewidth = 3 ;
2708 break ;
2709
2710 case SF_FORMAT_PCM_32 :
2711 case SF_FORMAT_FLOAT :
2712 psf->bytewidth = 4 ;
2713 break ;
2714
2715 case SF_FORMAT_DOUBLE :
2716 psf->bytewidth = 8 ;
2717 break ;
2718 } ;
2719
2720 /* Call the initialisation function for the relevant file type. */
2721 switch (SF_CONTAINER (psf->sf.format))
2722 { case SF_FORMAT_WAV :
2723 case SF_FORMAT_WAVEX :
2724 error = wav_open (psf) ;
2725 break ;
2726
2727 case SF_FORMAT_AIFF :
2728 error = aiff_open (psf) ;
2729 break ;
2730
2731 case SF_FORMAT_AU :
2732 error = au_open (psf) ;
2733 break ;
2734
2735 case SF_FORMAT_RAW :
2736 error = raw_open (psf) ;
2737 break ;
2738
2739 case SF_FORMAT_W64 :
2740 error = w64_open (psf) ;
2741 break ;
2742
2743 case SF_FORMAT_RF64 :
2744 error = rf64_open (psf) ;
2745 break ;
2746
2747 /* Lite remove start */
2748 case SF_FORMAT_PAF :
2749 error = paf_open (psf) ;
2750 break ;
2751
2752 case SF_FORMAT_SVX :
2753 error = svx_open (psf) ;
2754 break ;
2755
2756 case SF_FORMAT_NIST :
2757 error = nist_open (psf) ;
2758 break ;
2759
2760 case SF_FORMAT_IRCAM :
2761 error = ircam_open (psf) ;
2762 break ;
2763
2764 case SF_FORMAT_VOC :
2765 error = voc_open (psf) ;
2766 break ;
2767
2768 case SF_FORMAT_SDS :
2769 error = sds_open (psf) ;
2770 break ;
2771
2772 case SF_FORMAT_OGG :
2773 error = ogg_open (psf) ;
2774 break ;
2775
2776 case SF_FORMAT_TXW :
2777 error = txw_open (psf) ;
2778 break ;
2779
2780 case SF_FORMAT_WVE :
2781 error = wve_open (psf) ;
2782 break ;
2783
2784 case SF_FORMAT_DWD :
2785 error = dwd_open (psf) ;
2786 break ;
2787
2788 case SF_FORMAT_MAT4 :
2789 error = mat4_open (psf) ;
2790 break ;
2791
2792 case SF_FORMAT_MAT5 :
2793 error = mat5_open (psf) ;
2794 break ;
2795
2796 case SF_FORMAT_PVF :
2797 error = pvf_open (psf) ;
2798 break ;
2799
2800 case SF_FORMAT_XI :
2801 error = xi_open (psf) ;
2802 break ;
2803
2804 case SF_FORMAT_HTK :
2805 error = htk_open (psf) ;
2806 break ;
2807
2808 case SF_FORMAT_SD2 :
2809 error = sd2_open (psf) ;
2810 break ;
2811
2812 case SF_FORMAT_REX2 :
2813 error = rx2_open (psf) ;
2814 break ;
2815
2816 case SF_FORMAT_AVR :
2817 error = avr_open (psf) ;
2818 break ;
2819
2820 case SF_FORMAT_FLAC :
2821 error = flac_open (psf) ;
2822 break ;
2823
2824 case SF_FORMAT_CAF :
2825 error = caf_open (psf) ;
2826 break ;
2827
2828 case SF_FORMAT_MPC2K :
2829 error = mpc2k_open (psf) ;
2830 break ;
2831
2832 /* Lite remove end */
2833
2834 default :
2835 error = SFE_UNKNOWN_FORMAT ;
2836 } ;
2837
2838 if (error)
2839 goto error_exit ;
2840
2841 /* For now, check whether embedding is supported. */
2842 format = SF_CONTAINER (psf->sf.format) ;
2843 if (psf->fileoffset > 0)
2844 { switch (format)
2845 { case SF_FORMAT_WAV :
2846 case SF_FORMAT_WAVEX :
2847 case SF_FORMAT_AIFF :
2848 case SF_FORMAT_AU :
2849 /* Actual embedded files. */
2850 break ;
2851
2852 case SF_FORMAT_FLAC :
2853 /* Flac with an ID3v2 header? */
2854 break ;
2855
2856 default :
2857 error = SFE_NO_EMBED_SUPPORT ;
2858 goto error_exit ;
2859 } ;
2860 } ;
2861
2862 if (psf->fileoffset > 0)
2863 psf_log_printf (psf, "Embedded file length : %D\n", psf->filelength) ;
2864
2865 if (psf->file.mode == SFM_RDWR && sf_format_check (&(psf->sf)) == 0)
2866 { error = SFE_BAD_MODE_RW ;
2867 goto error_exit ;
2868 } ;
2869
2870 if (validate_sfinfo (&(psf->sf)) == 0)
2871 { psf_log_SF_INFO (psf) ;
2872 save_header_info (psf) ;
2873 error = SFE_BAD_SF_INFO ;
2874 goto error_exit ;
2875 } ;
2876
2877 if (validate_psf (psf) == 0)
2878 { save_header_info (psf) ;
2879 error = SFE_INTERNAL ;
2880 goto error_exit ;
2881 } ;
2882
2883 psf->read_current = 0 ;
2884 psf->write_current = 0 ;
2885 if (psf->file.mode == SFM_RDWR)
2886 { psf->write_current = psf->sf.frames ;
2887 psf->have_written = psf->sf.frames > 0 ? SF_TRUE : SF_FALSE ;
2888 } ;
2889
2890 memcpy (sfinfo, &(psf->sf), sizeof (SF_INFO)) ;
2891
2892 memcpy (sfinfo, &(psf->sf), sizeof (SF_INFO)) ;
2893
2894 return (SNDFILE *) psf ;
2895
2896error_exit :
2897 sf_errno = error ;
2898
2899 if (error == SFE_SYSTEM)
2900 snprintf (sf_syserr, sizeof (sf_syserr), "%s", psf->syserr) ;
2901 snprintf (sf_logbuffer, sizeof (sf_logbuffer), "%s", psf->logbuffer) ;
2902
2903 switch (error)
2904 { case SF_ERR_SYSTEM :
2905 case SF_ERR_UNSUPPORTED_ENCODING :
2906 case SFE_UNIMPLEMENTED :
2907 break ;
2908
2909 case SFE_RAW_BAD_FORMAT :
2910 break ;
2911
2912 default :
2913 if (psf->file.mode == SFM_READ)
2914 { psf_log_printf (psf, "Parse error : %s\n", sf_error_number (error)) ;
2915 error = SF_ERR_MALFORMED_FILE ;
2916 } ;
2917 } ;
2918
2919 psf_close (psf) ;
2920 return NULL ;
2921} /* psf_open_file */
2922