shithub: libsamplerate

Download patch

ref: bf3d57bb4db8565a1a86268fc10a1a2b4196fb6d
parent: a58d434a5ed3eb10023fd2c04aba3252569b3d34
author: Erik de Castro Lopo <erikd@mega-nerd.com>
date: Sat Mar 15 12:05:19 EDT 2008

Preliminary Win32 updates.

--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,9 @@
     * src/* tests/*
     Remove all traces of old SRC_OLD_SINC_* converters.
 
+    * Make.bat Win32/*
+    Preliminary Win32 updates.
+
     * configure.ac
     Bump version to 0.1.3.
 
--- a/Make.bat
+++ b/Make.bat
@@ -20,12 +20,3 @@
 
 :END
 
-goto skipArchTag
-
- Do not edit or modify anything in this comment block.
- The arch-tag line is a file identity tag for the GNU Arch 
- revision control system.
-
- arch-tag: 8700080b-8d9a-4852-ad8a-8ecd027f1f61
-
-:skipArchTag
--- a/Win32/Makefile.am
+++ b/Win32/Makefile.am
@@ -1,9 +1,2 @@
 EXTRA_DIST = Makefile.msvc config.h unistd.h unistd.h libsamplerate.def
   
-
-## Do not edit or modify anything in this comment block.
-## The arch-tag line is a file identity tag for the GNU Arch 
-## revision control system.
-##
-## arch-tag: fcba51ab-858b-462c-9954-66fee32b7f8f
-
--- a/Win32/config.h
+++ b/Win32/config.h
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2002-2004 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2008 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -53,6 +53,12 @@
 /* Target processor clips on positive float to int conversion. */
 #define CPU_CLIPS_POSITIVE 0
 
+/* Target processor is big endian. */
+#define CPU_IS_BIG_ENDIAN 0
+
+/* Target processor is little endian. */
+#define CPU_IS_LITTLE_ENDIAN 1
+
 /* Set to 1 to enable debugging. */
 #define ENABLE_DEBUG 0
 
@@ -59,6 +65,9 @@
 /* Major version of GCC or 3 otherwise. */
 /* #undef GCC_MAJOR_VERSION */
 
+/* Define to 1 if you have the `alarm' function. */
+/* #undef HAVE_ALARM */
+
 /* Define to 1 if you have the `calloc' function. */
 #define HAVE_CALLOC 1
 
@@ -68,9 +77,6 @@
 /* Define to 1 if you have the <dlfcn.h> header file. */
 /* #undef HAVE_DLFCN_H */
 
-/* Set to 1 if you have libfftw3. */
-/* #undef HAVE_FFTW3 */
-
 /* Define to 1 if you have the `floor' function. */
 #define HAVE_FLOOR 1
 
@@ -86,9 +92,15 @@
 /* Define to 1 if you have the `efence' library (-lefence). */
 /* #undef HAVE_LIBEFENCE */
 
+/* Define to 1 if you have the `fftw' library (-lfftw). */
+/* #undef HAVE_LIBFFTW */
+
 /* Define to 1 if you have the `m' library (-lm). */
 /* #undef HAVE_LIBM */
 
+/* Define to 1 if you have the `rfftw' library (-lrfftw). */
+/* #undef HAVE_LIBRFFTW */
+
 /* Define if you have C99's lrint function. */
 /* #undef HAVE_LRINT */
 
@@ -107,6 +119,12 @@
 /* Define to 1 if you have the <memory.h> header file. */
 #define HAVE_MEMORY_H 1
 
+/* Define if you have signal SIGALRM. */
+/* #undef HAVE_SIGALRM */
+
+/* Define to 1 if you have the `signal' function. */
+/* #undef HAVE_SIGNAL */
+
 /* Set to 1 if you have libsndfile. */
 #define HAVE_SNDFILE 1
 
@@ -125,9 +143,6 @@
 /* Define to 1 if you have the <sys/stat.h> header file. */
 #define HAVE_SYS_STAT_H 1
 
-/* Define to 1 if you have the <sys/times.h> header file. */
-/* #undef HAVE_SYS_TIMES_H */
-
 /* Define to 1 if you have the <sys/types.h> header file. */
 #define HAVE_SYS_TYPES_H 1
 
@@ -171,12 +186,5 @@
 #define STDC_HEADERS 1
 
 /* Version number of package */
-#define VERSION "0.1.2"
+#define VERSION "0.1.3"
 
-/*
-** Do not edit or modify anything in this comment block.
-** The arch-tag line is a file identity tag for the GNU Arch
-** revision control system.
-**
-** arch-tag: 7c5a8910-8149-4e89-98ce-be92835e435b
-*/
--- a/Win32/sndfile.h
+++ b/Win32/sndfile.h
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2004 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 1999-2008 Erik de Castro Lopo <erikd@mega-nerd.com>
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -30,15 +30,8 @@
 #define	SNDFILE_1
 
 #include <stdio.h>
+#include <sys/types.h>
 
-/* For the Metrowerks CodeWarrior Pro Compiler (mainly MacOS) */
-
-#if	(defined (__MWERKS__))
-#include	<unix.h>
-#else
-#include	<sys/types.h>
-#endif
-
 #ifdef __cplusplus
 extern "C" {
 #endif	/* __cplusplus */
@@ -52,7 +45,7 @@
 
 enum
 {	/* Major formats. */
-	SF_FORMAT_WAV			= 0x010000,		/* Microsoft WAV format (little endian). */
+	SF_FORMAT_WAV			= 0x010000,		/* Microsoft WAV format (little endian default). */
 	SF_FORMAT_AIFF			= 0x020000,		/* Apple/SGI AIFF format (big endian). */
 	SF_FORMAT_AU			= 0x030000,		/* Sun/NeXT AU format (big endian). */
 	SF_FORMAT_RAW			= 0x040000,		/* RAW PCM data. */
@@ -68,7 +61,14 @@
 	SF_FORMAT_XI			= 0x0F0000,		/* Fasttracker 2 Extended Instrument */
 	SF_FORMAT_HTK			= 0x100000,		/* HMM Tool Kit format */
 	SF_FORMAT_SDS			= 0x110000,		/* Midi Sample Dump Standard */
-	
+	SF_FORMAT_AVR			= 0x120000,		/* Audio Visual Research */
+	SF_FORMAT_WAVEX			= 0x130000,		/* MS WAVE with WAVEFORMATEX */
+	SF_FORMAT_SD2			= 0x160000,		/* Sound Designer 2 */
+	SF_FORMAT_FLAC			= 0x170000,		/* FLAC lossless file format */
+	SF_FORMAT_CAF			= 0x180000,		/* Core Audio File format */
+	SF_FORMAT_WVE			= 0x190000,		/* Psion WVE format */
+	SF_FORMAT_OGG			= 0x200000,		/* Xiph OGG container */
+
 	/* Subtypes from here on. */
 
 	SF_FORMAT_PCM_S8		= 0x0001,		/* Signed 8 bit data */
@@ -123,11 +123,15 @@
 enum
 {	SFC_GET_LIB_VERSION				= 0x1000,
 	SFC_GET_LOG_INFO				= 0x1001,
+	SFC_GET_CURRENT_SF_INFO			= 0x1002,
 
+
 	SFC_GET_NORM_DOUBLE				= 0x1010,
 	SFC_GET_NORM_FLOAT				= 0x1011,
 	SFC_SET_NORM_DOUBLE				= 0x1012,
 	SFC_SET_NORM_FLOAT				= 0x1013,
+	SFC_SET_SCALE_FLOAT_INT_READ	= 0x1014,
+	SFC_SET_SCALE_INT_FLOAT_WRITE	= 0x1015,
 
 	SFC_GET_SIMPLE_FORMAT_COUNT		= 0x1020,
 	SFC_GET_SIMPLE_FORMAT			= 0x1021,
@@ -143,6 +147,8 @@
 	SFC_CALC_NORM_SIGNAL_MAX		= 0x1041,
 	SFC_CALC_MAX_ALL_CHANNELS		= 0x1042,
 	SFC_CALC_NORM_MAX_ALL_CHANNELS	= 0x1043,
+	SFC_GET_SIGNAL_MAX				= 0x1044,
+	SFC_GET_MAX_ALL_CHANNELS		= 0x1045,
 
 	SFC_SET_ADD_PEAK_CHUNK			= 0x1050,
 
@@ -150,7 +156,7 @@
 	SFC_SET_UPDATE_HEADER_AUTO		= 0x1061,
 
 	SFC_FILE_TRUNCATE				= 0x1080,
-	
+
 	SFC_SET_RAW_START_OFFSET		= 0x1090,
 
 	SFC_SET_DITHER_ON_WRITE			= 0x10A0,
@@ -160,7 +166,7 @@
 	SFC_GET_DITHER_INFO				= 0x10A3,
 
 	SFC_GET_EMBED_FILE_INFO			= 0x10B0,
-	
+
 	SFC_SET_CLIPPING				= 0x10C0,
 	SFC_GET_CLIPPING				= 0x10C1,
 
@@ -167,14 +173,30 @@
 	SFC_GET_INSTRUMENT				= 0x10D0,
 	SFC_SET_INSTRUMENT				= 0x10D1,
 
+	SFC_GET_LOOP_INFO				= 0x10E0,
+
+	SFC_GET_BROADCAST_INFO			= 0x10F0,
+	SFC_SET_BROADCAST_INFO			= 0x10F1,
+
+	SFC_GET_CHANNEL_MAP_INFO		= 0x1100,
+	SFC_SET_CHANNEL_MAP_INFO		= 0x1101,
+
+	SFC_RAW_DATA_NEEDS_ENDSWAP		= 0x1110,
+
+	/* Support for Wavex Ambisonics Format */
+	SFC_WAVEX_SET_AMBISONIC			= 0x1200,
+	SFC_WAVEX_GET_AMBISONIC			= 0x1201,
+
+	SFC_SET_VBR_ENCODING_QUALITY		= 0x1300,
+
 	/* Following commands for testing only. */
 	SFC_TEST_IEEE_FLOAT_REPLACE		= 0x6001,
 
 	/*
 	** SFC_SET_ADD_* values are deprecated and will disappear at some
-	** time in the future. They are guaranteed to be here up to and 
-	** including version 1.0.8 to avoid breakage of existng software. 
-	** They currently do nothing and will continue to do nothing. 
+	** time in the future. They are guaranteed to be here up to and
+	** including version 1.0.8 to avoid breakage of existng software.
+	** They currently do nothing and will continue to do nothing.
 	*/
 	SFC_SET_ADD_DITHER_ON_WRITE		= 0x1070,
 	SFC_SET_ADD_DITHER_ON_READ		= 0x1071
@@ -193,9 +215,19 @@
 	SF_STR_SOFTWARE					= 0x03,
 	SF_STR_ARTIST					= 0x04,
 	SF_STR_COMMENT					= 0x05,
-	SF_STR_DATE						= 0x06
+	SF_STR_DATE						= 0x06,
+	SF_STR_ALBUM					= 0x07,
+	SF_STR_LICENSE					= 0x08
 } ;
 
+/*
+** Use the following as the start and end index when doing metadata
+** transcoding.
+*/
+
+#define	SF_STR_FIRST	SF_STR_TITLE
+#define	SF_STR_LAST		SF_STR_LICENSE
+
 enum
 {	/* True and false */
 	SF_FALSE	= 0,
@@ -204,33 +236,75 @@
 	/* Modes for opening files. */
 	SFM_READ	= 0x10,
 	SFM_WRITE	= 0x20,
-	SFM_RDWR	= 0x30
+	SFM_RDWR	= 0x30,
+
+	SF_AMBISONIC_NONE		= 0x40,
+	SF_AMBISONIC_B_FORMAT	= 0x41
 } ;
 
-/* Pubic error values. These are guaranteed to remain unchanged for the duration
-** of the library major version number. 
+/* Public error values. These are guaranteed to remain unchanged for the duration
+** of the library major version number.
 ** There are also a large number of private error numbers which are internal to
 ** the library which can change at any time.
 */
 
 enum
-{	SF_ERR_NO_ERROR     		= 0,
+{	SF_ERR_NO_ERROR				= 0,
 	SF_ERR_UNRECOGNISED_FORMAT	= 1,
-	SF_ERR_SYSTEM				= 2
+	SF_ERR_SYSTEM				= 2,
+	SF_ERR_MALFORMED_FILE		= 3,
+	SF_ERR_UNSUPPORTED_ENCODING	= 4
 } ;
 
+
+/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP).
+*/
+
+enum
+{	SF_CHANNEL_MAP_INVALID = 0,
+	SF_CHANNEL_MAP_MONO = 1,
+	SF_CHANNEL_MAP_LEFT,
+	SF_CHANNEL_MAP_RIGHT,
+	SF_CHANNEL_MAP_CENTER,
+	SF_CHANNEL_MAP_FRONT_LEFT,
+	SF_CHANNEL_MAP_FRONT_RIGHT,
+	SF_CHANNEL_MAP_FRONT_CENTER,
+	SF_CHANNEL_MAP_REAR_CENTER,
+	SF_CHANNEL_MAP_REAR_LEFT,
+	SF_CHANNEL_MAP_REAR_RIGHT,
+	SF_CHANNEL_MAP_LFE,
+	SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER,
+	SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER,
+	SF_CHANNEL_MAP_SIDE_LEFT,
+	SF_CHANNEL_MAP_SIDE_RIGHT,
+	SF_CHANNEL_MAP_TOP_CENTER,
+	SF_CHANNEL_MAP_TOP_FRONT_LEFT,
+	SF_CHANNEL_MAP_TOP_FRONT_RIGHT,
+	SF_CHANNEL_MAP_TOP_FRONT_CENTER,
+	SF_CHANNEL_MAP_TOP_REAR_LEFT,
+	SF_CHANNEL_MAP_TOP_REAR_RIGHT,
+	SF_CHANNEL_MAP_TOP_REAR_CENTER
+} ;
+
+
 /* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */
 
 typedef	struct SNDFILE_tag	SNDFILE ;
 
-/* The following typedef is system specific and is defined when libsndfile is.
-** compiled. sf_count_t can be one of loff_t (Linux), off_t (*BSD), 
-** off64_t (Solaris), __int64_t (Win32) etc.
+/* The following typedef is system specific and is defined when libsndfile is
+** compiled. sf_count_t can be one of loff_t (Linux), off_t (*BSD), off64_t 
+** (Solaris), __int64_t (Win32) etc. On windows, we need to allow the same
+** header file to be compiler by both GCC and the microsoft compiler.
 */
 
-typedef __int64	sf_count_t ;
+#ifdef _MSCVER
+typedef __int64_t	sf_count_t ;
+#define SF_COUNT_MAX		0x7fffffffffffffffi64
+#else
+typedef loff_t	sf_count_t ;
+#define SF_COUNT_MAX		0x7FFFFFFFFFFFFFFFLL
+#endif
 
-#define SF_COUNT_MAX		0x7FFFFFFFFFFFFFFFi64
 
 /* A pointer to a SF_INFO structure is passed to sf_open_read () and filled in.
 ** On write, the SF_INFO structure is filled in by the user and passed into
@@ -261,13 +335,13 @@
 
 typedef struct
 {	int			format ;
-	const char  *name ;
-	const char  *extension ;
+	const char	*name ;
+	const char	*extension ;
 } SF_FORMAT_INFO ;
 
 /*
-** Enums and typedefs for adding dither on read and write. 
-** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE 
+** Enums and typedefs for adding dither on read and write.
+** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE
 ** and SFC_SET_DITHER_ON_READ.
 */
 
@@ -295,26 +369,91 @@
 	sf_count_t	length ;
 } SF_EMBED_FILE_INFO ;
 
-/* Struct used to retrieve music sample information from a file.
+/*
+**	Structs used to retrieve music sample information from a file.
 */
 
+enum
+{	/*
+	**	The loop mode field in SF_INSTRUMENT will be one of the following.
+	*/
+	SF_LOOP_NONE = 800,
+	SF_LOOP_FORWARD,
+	SF_LOOP_BACKWARD,
+	SF_LOOP_ALTERNATING
+} ;
+
 typedef struct
-{	int basenote ;
-	int gain ;
-	int	sustain_mode ;
-	int sustain_start, sustain_end ;
-	int release_mode ;
-	int release_start, reslease_end ;
+{	int gain ;
+	char basenote, detune ;
+	char velocity_lo, velocity_hi ;
+	char key_lo, key_hi ;
+	int loop_count ;
+
+	struct
+	{	int mode ;
+		unsigned int start ;
+		unsigned int end ;
+		unsigned int count ;
+	} loops [16] ; /* make variable in a sensible way */
 } SF_INSTRUMENT ;
 
-/* sustain_mode and release_mode will be one of the following. */
 
-enum
-{	SF_LOOP_NONE = 800,
-	SF_LOOP_FORWARD,
-	SF_LOOP_BACKWARD,
+
+/* Struct used to retrieve loop information from a file.*/
+typedef struct
+{
+	short	time_sig_num ;	/* any positive integer    > 0  */
+	short	time_sig_den ;	/* any positive power of 2 > 0  */
+	int		loop_mode ;		/* see SF_LOOP enum             */
+
+	int		num_beats ;		/* this is NOT the amount of quarter notes !!!*/
+							/* a full bar of 4/4 is 4 beats */
+							/* a full bar of 7/8 is 7 beats */
+
+	float	bpm ;			/* suggestion, as it can be calculated using other fields:*/
+							/* file's lenght, file's sampleRate and our time_sig_den*/
+							/* -> bpms are always the amount of _quarter notes_ per minute */
+
+	int	root_key ;			/* MIDI note, or -1 for None */
+	int future [6] ;
+} SF_LOOP_INFO ;
+
+
+/*	Struct used to retrieve broadcast (EBU) information from a file.
+**	Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE.
+*/
+typedef struct
+{	char			description [256] ;
+	char			originator [32] ;
+	char			originator_reference [32] ;
+	char			origination_date [10] ;
+	char			origination_time [8] ;
+	int				time_reference_low ;
+	int				time_reference_high ;
+	short			version ;
+	char			umid [64] ;
+	char			reserved [190] ;
+	unsigned int	coding_history_size ;
+	char			coding_history [256] ;
+} SF_BROADCAST_INFO ;
+
+typedef sf_count_t		(*sf_vio_get_filelen)	(void *user_data) ;
+typedef sf_count_t		(*sf_vio_seek)		(sf_count_t offset, int whence, void *user_data) ;
+typedef sf_count_t		(*sf_vio_read)		(void *ptr, sf_count_t count, void *user_data) ;
+typedef sf_count_t		(*sf_vio_write)		(const void *ptr, sf_count_t count, void *user_data) ;
+typedef sf_count_t		(*sf_vio_tell)		(void *user_data) ;
+
+struct SF_VIRTUAL_IO
+{	sf_vio_get_filelen	get_filelen ;
+	sf_vio_seek			seek ;
+	sf_vio_read			read ;
+	sf_vio_write		write ;
+	sf_vio_tell			tell ;
 } ;
 
+typedef	struct SF_VIRTUAL_IO SF_VIRTUAL_IO ;
+
 /* Open the specified file for read, write or both. On error, this will
 ** return a NULL pointer. To find the error number, pass a NULL SNDFILE
 ** to sf_perror () or sf_error_str ().
@@ -329,7 +468,7 @@
 ** When passed a descriptor like this, the library will assume that the start
 ** of file header is at the current file offset. This allows sound files within
 ** larger container files to be read and/or written.
-** On error, this will return a NULL pointer. To find the error number, pass a 
+** On error, this will return a NULL pointer. To find the error number, pass a
 ** NULL SNDFILE to sf_perror () or sf_error_str ().
 ** All calls to sf_open_fd() should be matched with a call to sf_close().
 
@@ -337,13 +476,15 @@
 
 SNDFILE* 	sf_open_fd	(int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
 
-/* sf_error () returns a error number which can be translated to a text 
+SNDFILE* 	sf_open_virtual	(SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ;
+
+/* sf_error () returns a error number which can be translated to a text
 ** string using sf_error_number().
 */
 
 int		sf_error		(SNDFILE *sndfile) ;
 
-/* sf_strerror () returns to the caller a pointer to the current error message for 
+/* sf_strerror () returns to the caller a pointer to the current error message for
 ** the given SNDFILE.
 */
 
@@ -350,7 +491,7 @@
 const char* sf_strerror (SNDFILE *sndfile) ;
 
 /* sf_error_number () allows the retrieval of the error string for each internal
-** error number. 
+** error number.
 **
 */
 
@@ -403,7 +544,7 @@
 */
 
 sf_count_t	sf_read_raw		(SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
-sf_count_t	sf_write_raw 	(SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
+sf_count_t	sf_write_raw 	(SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ;
 
 /* Functions for reading and writing the data chunk in terms of frames.
 ** The number of items actually read/written = frames * number of channels.
@@ -416,16 +557,16 @@
 */
 
 sf_count_t	sf_readf_short	(SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
-sf_count_t	sf_writef_short	(SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_short	(SNDFILE *sndfile, const short *ptr, sf_count_t frames) ;
 
 sf_count_t	sf_readf_int	(SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
-sf_count_t	sf_writef_int 	(SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_int 	(SNDFILE *sndfile, const int *ptr, sf_count_t frames) ;
 
 sf_count_t	sf_readf_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
-sf_count_t	sf_writef_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_float	(SNDFILE *sndfile, const float *ptr, sf_count_t frames) ;
 
 sf_count_t	sf_readf_double		(SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
-sf_count_t	sf_writef_double	(SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_double	(SNDFILE *sndfile, const double *ptr, sf_count_t frames) ;
 
 /* Functions for reading and writing the data chunk in terms of items.
 ** Otherwise similar to above.
@@ -433,16 +574,16 @@
 */
 
 sf_count_t	sf_read_short	(SNDFILE *sndfile, short *ptr, sf_count_t items) ;
-sf_count_t	sf_write_short	(SNDFILE *sndfile, short *ptr, sf_count_t items) ;
+sf_count_t	sf_write_short	(SNDFILE *sndfile, const short *ptr, sf_count_t items) ;
 
 sf_count_t	sf_read_int		(SNDFILE *sndfile, int *ptr, sf_count_t items) ;
-sf_count_t	sf_write_int 	(SNDFILE *sndfile, int *ptr, sf_count_t items) ;
+sf_count_t	sf_write_int 	(SNDFILE *sndfile, const int *ptr, sf_count_t items) ;
 
 sf_count_t	sf_read_float	(SNDFILE *sndfile, float *ptr, sf_count_t items) ;
-sf_count_t	sf_write_float	(SNDFILE *sndfile, float *ptr, sf_count_t items) ;
+sf_count_t	sf_write_float	(SNDFILE *sndfile, const float *ptr, sf_count_t items) ;
 
 sf_count_t	sf_read_double	(SNDFILE *sndfile, double *ptr, sf_count_t items) ;
-sf_count_t	sf_write_double	(SNDFILE *sndfile, double *ptr, sf_count_t items) ;
+sf_count_t	sf_write_double	(SNDFILE *sndfile, const double *ptr, sf_count_t items) ;
 
 /* Close the SNDFILE and clean up all memory allocations associated with this
 ** file.
@@ -451,17 +592,15 @@
 
 int		sf_close		(SNDFILE *sndfile) ;
 
+/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file
+** to force the writing of data to disk. If the file is opened SFM_READ
+** no action is taken.
+*/
+
+void	sf_write_sync	(SNDFILE *sndfile) ;
+
 #ifdef __cplusplus
 }		/* extern "C" */
 #endif	/* __cplusplus */
 
 #endif	/* SNDFILE_H */
-
-/*
-** Do not edit or modify anything in this comment block.
-** The arch-tag line is a file identity tag for the GNU Arch 
-** revision control system.
-**
-** arch-tag: 906bb197-18f2-4f66-a395-b4722bab5114
-*/
-