2 ** Copyright (C) 2005-2007 Erik de Castro Lopo <erikd@mega-nerd.com>
4 ** All rights reserved.
6 ** Redistribution and use in source and binary forms, with or without
7 ** modification, are permitted provided that the following conditions are
10 ** * Redistributions of source code must retain the above copyright
11 ** notice, this list of conditions and the following disclaimer.
12 ** * Redistributions in binary form must reproduce the above copyright
13 ** notice, this list of conditions and the following disclaimer in
14 ** the documentation and/or other materials provided with the
16 ** * Neither the author nor the names of any contributors may be used
17 ** to endorse or promote products derived from this software without
18 ** specific prior written permission.
20 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 ** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 ** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24 ** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 ** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 ** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27 ** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28 ** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29 ** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
30 ** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 ** The above modified BSD style license (GPL and LGPL compatible) applies to
35 ** this file. It does not apply to libsndfile itself which is released under
36 ** the GNU LGPL or the libsndfile test suite which is released under the GNU
38 ** This means that this header file can be used under this modified BSD style
39 ** license, but the LGPL still holds for the libsndfile library itself.
43 ** sndfile.hh -- A lightweight C++ wrapper for the libsndfile API.
45 ** All the methods are inlines and all functionality is contained in this
46 ** file. There is no separate implementation file.
48 ** API documentation is in the doc/ directory of the source code tarball
49 ** and at http://www.mega-nerd.com/libsndfile/api.html.
58 #include <new> // for std::nothrow
61 namespace AudioGrapher
{
66 { SNDFILE_ref (void) ;
77 /* Default constructor */
78 SndfileHandle (void) : p (NULL
) {} ;
79 SndfileHandle (const char *path
, int mode
= SFM_READ
,
80 int format
= 0, int channels
= 0, int samplerate
= 0) ;
81 SndfileHandle (std::string
const & path
, int mode
= SFM_READ
,
82 int format
= 0, int channels
= 0, int samplerate
= 0) ;
83 SndfileHandle (int fd
, bool close_desc
, int mode
= SFM_READ
,
84 int format
= 0, int channels
= 0, int samplerate
= 0) ;
85 ~SndfileHandle (void) ;
87 SndfileHandle (const SndfileHandle
&orig
) ;
88 SndfileHandle
& operator = (const SndfileHandle
&rhs
) ;
90 /* Mainly for debugging/testing. */
91 int refCount (void) const { return (p
== NULL
) ? 0 : p
->ref
; }
93 operator bool () const { return (p
!= NULL
) ; }
95 bool operator == (const SndfileHandle
&rhs
) const { return (p
== rhs
.p
) ; }
97 sf_count_t
frames (void) const { return p
? p
->sfinfo
.frames
: 0 ; }
98 int format (void) const { return p
? p
->sfinfo
.format
: 0 ; }
99 int channels (void) const { return p
? p
->sfinfo
.channels
: 0 ; }
100 int samplerate (void) const { return p
? p
->sfinfo
.samplerate
: 0 ; }
102 int error (void) const ;
103 const char * strError (void) const ;
105 int command (int cmd
, void *data
, int datasize
) ;
107 sf_count_t
seek (sf_count_t frames
, int whence
) ;
109 void writeSync (void) ;
111 int setString (int str_type
, const char* str
) ;
113 const char* getString (int str_type
) const ;
115 static int formatCheck (int format
, int channels
, int samplerate
) ;
117 sf_count_t
read (short *ptr
, sf_count_t items
) ;
118 sf_count_t
read (int *ptr
, sf_count_t items
) ;
119 sf_count_t
read (float *ptr
, sf_count_t items
) ;
120 sf_count_t
read (double *ptr
, sf_count_t items
) ;
122 sf_count_t
write (const short *ptr
, sf_count_t items
) ;
123 sf_count_t
write (const int *ptr
, sf_count_t items
) ;
124 sf_count_t
write (const float *ptr
, sf_count_t items
) ;
125 sf_count_t
write (const double *ptr
, sf_count_t items
) ;
127 sf_count_t
readf (short *ptr
, sf_count_t frames
) ;
128 sf_count_t
readf (int *ptr
, sf_count_t frames
) ;
129 sf_count_t
readf (float *ptr
, sf_count_t frames
) ;
130 sf_count_t
readf (double *ptr
, sf_count_t frames
) ;
132 sf_count_t
writef (const short *ptr
, sf_count_t frames
) ;
133 sf_count_t
writef (const int *ptr
, sf_count_t frames
) ;
134 sf_count_t
writef (const float *ptr
, sf_count_t frames
) ;
135 sf_count_t
writef (const double *ptr
, sf_count_t frames
) ;
137 sf_count_t
readRaw (void *ptr
, sf_count_t bytes
) ;
138 sf_count_t
writeRaw (const void *ptr
, sf_count_t bytes
) ;
142 /*==============================================================================
143 ** Nothing but implementation below.
147 SndfileHandle::SNDFILE_ref::SNDFILE_ref (void)
152 SndfileHandle::SNDFILE_ref::~SNDFILE_ref (void)
153 { if (sf
!= NULL
) sf_close (sf
) ; }
156 SndfileHandle::SndfileHandle (const char *path
, int mode
, int fmt
, int chans
, int srate
)
159 p
= new (std::nothrow
) SNDFILE_ref () ;
164 p
->sfinfo
.frames
= 0 ;
165 p
->sfinfo
.channels
= chans
;
166 p
->sfinfo
.format
= fmt
;
167 p
->sfinfo
.samplerate
= srate
;
168 p
->sfinfo
.sections
= 0 ;
169 p
->sfinfo
.seekable
= 0 ;
171 p
->sf
= sf_open (path
, mode
, &p
->sfinfo
) ;
175 } /* SndfileHandle const char * constructor */
178 SndfileHandle::SndfileHandle (std::string
const & path
, int mode
, int fmt
, int chans
, int srate
)
181 p
= new (std::nothrow
) SNDFILE_ref () ;
186 p
->sfinfo
.frames
= 0 ;
187 p
->sfinfo
.channels
= chans
;
188 p
->sfinfo
.format
= fmt
;
189 p
->sfinfo
.samplerate
= srate
;
190 p
->sfinfo
.sections
= 0 ;
191 p
->sfinfo
.seekable
= 0 ;
193 p
->sf
= sf_open (path
.c_str (), mode
, &p
->sfinfo
) ;
197 } /* SndfileHandle std::string constructor */
200 SndfileHandle::SndfileHandle (int fd
, bool close_desc
, int mode
, int fmt
, int chans
, int srate
)
206 p
= new (std::nothrow
) SNDFILE_ref () ;
211 p
->sfinfo
.frames
= 0 ;
212 p
->sfinfo
.channels
= chans
;
213 p
->sfinfo
.format
= fmt
;
214 p
->sfinfo
.samplerate
= srate
;
215 p
->sfinfo
.sections
= 0 ;
216 p
->sfinfo
.seekable
= 0 ;
218 p
->sf
= sf_open_fd (fd
, mode
, &p
->sfinfo
, close_desc
) ;
222 } /* SndfileHandle fd constructor */
225 SndfileHandle::~SndfileHandle (void)
226 { if (p
!= NULL
&& --p
->ref
== 0)
228 } /* SndfileHandle destructor */
232 SndfileHandle::SndfileHandle (const SndfileHandle
&orig
)
236 } /* SndfileHandle copy constructor */
238 inline SndfileHandle
&
239 SndfileHandle::operator = (const SndfileHandle
&rhs
)
243 if (p
!= NULL
&& --p
->ref
== 0)
251 } /* SndfileHandle assignment operator */
254 SndfileHandle::error (void) const
255 { return sf_error (p
->sf
) ; }
258 SndfileHandle::strError (void) const
259 { return sf_strerror (p
->sf
) ; }
262 SndfileHandle::command (int cmd
, void *data
, int datasize
)
263 { return sf_command (p
->sf
, cmd
, data
, datasize
) ; }
266 SndfileHandle::seek (sf_count_t frame_count
, int whence
)
267 { return sf_seek (p
->sf
, frame_count
, whence
) ; }
270 SndfileHandle::writeSync (void)
271 { sf_write_sync (p
->sf
) ; }
274 SndfileHandle::setString (int str_type
, const char* str
)
275 { return sf_set_string (p
->sf
, str_type
, str
) ; }
278 SndfileHandle::getString (int str_type
) const
279 { return sf_get_string (p
->sf
, str_type
) ; }
282 SndfileHandle::formatCheck(int fmt
, int chans
, int srate
)
287 sfinfo
.channels
= chans
;
288 sfinfo
.format
= fmt
;
289 sfinfo
.samplerate
= srate
;
290 sfinfo
.sections
= 0 ;
291 sfinfo
.seekable
= 0 ;
293 return sf_format_check (&sfinfo
) ;
296 /*---------------------------------------------------------------------*/
299 SndfileHandle::read (short *ptr
, sf_count_t items
)
300 { return sf_read_short (p
->sf
, ptr
, items
) ; }
303 SndfileHandle::read (int *ptr
, sf_count_t items
)
304 { return sf_read_int (p
->sf
, ptr
, items
) ; }
307 SndfileHandle::read (float *ptr
, sf_count_t items
)
308 { return sf_read_float (p
->sf
, ptr
, items
) ; }
311 SndfileHandle::read (double *ptr
, sf_count_t items
)
312 { return sf_read_double (p
->sf
, ptr
, items
) ; }
315 SndfileHandle::write (const short *ptr
, sf_count_t items
)
316 { return sf_write_short (p
->sf
, ptr
, items
) ; }
319 SndfileHandle::write (const int *ptr
, sf_count_t items
)
320 { return sf_write_int (p
->sf
, ptr
, items
) ; }
323 SndfileHandle::write (const float *ptr
, sf_count_t items
)
324 { return sf_write_float (p
->sf
, ptr
, items
) ; }
327 SndfileHandle::write (const double *ptr
, sf_count_t items
)
328 { return sf_write_double (p
->sf
, ptr
, items
) ; }
331 SndfileHandle::readf (short *ptr
, sf_count_t frame_count
)
332 { return sf_readf_short (p
->sf
, ptr
, frame_count
) ; }
335 SndfileHandle::readf (int *ptr
, sf_count_t frame_count
)
336 { return sf_readf_int (p
->sf
, ptr
, frame_count
) ; }
339 SndfileHandle::readf (float *ptr
, sf_count_t frame_count
)
340 { return sf_readf_float (p
->sf
, ptr
, frame_count
) ; }
343 SndfileHandle::readf (double *ptr
, sf_count_t frame_count
)
344 { return sf_readf_double (p
->sf
, ptr
, frame_count
) ; }
347 SndfileHandle::writef (const short *ptr
, sf_count_t frame_count
)
348 { return sf_writef_short (p
->sf
, ptr
, frame_count
) ; }
351 SndfileHandle::writef (const int *ptr
, sf_count_t frame_count
)
352 { return sf_writef_int (p
->sf
, ptr
, frame_count
) ; }
355 SndfileHandle::writef (const float *ptr
, sf_count_t frame_count
)
356 { return sf_writef_float (p
->sf
, ptr
, frame_count
) ; }
359 SndfileHandle::writef (const double *ptr
, sf_count_t frame_count
)
360 { return sf_writef_double (p
->sf
, ptr
, frame_count
) ; }
363 SndfileHandle::readRaw (void *ptr
, sf_count_t bytes
)
364 { return sf_read_raw (p
->sf
, ptr
, bytes
) ; }
367 SndfileHandle::writeRaw (const void *ptr
, sf_count_t bytes
)
368 { return sf_write_raw (p
->sf
, ptr
, bytes
) ; }
371 #ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES
374 SndfileHandle::SndfileHandle (LPCWSTR wpath
, int mode
, int fmt
, int chans
, int srate
)
377 p
= new (std::nothrow
) SNDFILE_ref () ;
382 p
->sfinfo
.frames
= 0 ;
383 p
->sfinfo
.channels
= chans
;
384 p
->sfinfo
.format
= fmt
;
385 p
->sfinfo
.samplerate
= srate
;
386 p
->sfinfo
.sections
= 0 ;
387 p
->sfinfo
.seekable
= 0 ;
389 p
->sf
= sf_wchar_open (wpath
, mode
, &p
->sfinfo
) ;
393 } /* SndfileHandle const wchar_t * constructor */
397 } // namespace AudioGrapher
399 #endif /* SNDFILE_HH */