summaryrefslogtreecommitdiff
path: root/examples/generate.cs
blob: 1817856fa704587551bcfcf6568f523be914a36a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
/* (c) 2004 James Robson, http://www.arbingersys.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
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** ****************************
**
** How to use:
**    - libsndfile.dll must have already been compiled and be in this
**      application's search path
**
**    - You must edit this file to point to the file you want to convert. Set
**    	the following line of code (found in the Main() function further below)
**    	to the name of a .WAV file that exists on your system.
**		186:	string sfn = "input.wav";
**
**    - From a command prompt type
**    		csc generate.cs
**
**    - Run the resulting executable 'generate.exe'
**
**
** Note: You will obviously need the csc compiler and the .NET runtime. I think
** 	 these are freely available for download from Microsoft's website
** 	 (part of the .NET SDK?).
*/


using System;
using System.Runtime.InteropServices;
using sf_count_t = System.Int64;	//alias; see SF_INFO struct

#if PLATFORM_64
using size_t = System.UInt64;
#else
using size_t = System.UInt32;
#endif


class lsndf_example {


//sound file formats
	public enum lsndf_frmts {
		SF_FORMAT_WAV			= 0x010000,		/* Microsoft WAV format (little endian). */
		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. */
		SF_FORMAT_PAF			= 0x050000,		/* Ensoniq PARIS file format. */
		SF_FORMAT_SVX			= 0x060000,		/* Amiga IFF / SVX8 / SV16 format. */
		SF_FORMAT_NIST			= 0x070000,		/* Sphere NIST format. */
		SF_FORMAT_VOC			= 0x080000,		/* VOC files. */
		SF_FORMAT_IRCAM			= 0x0A0000,		/* Berkeley/IRCAM/CARL */
		SF_FORMAT_W64			= 0x0B0000,		/* Sonic Foundry's 64 bit RIFF/WAV */
		SF_FORMAT_MAT4			= 0x0C0000,		/* Matlab (tm) V4.2 / GNU Octave 2.0 */
		SF_FORMAT_MAT5			= 0x0D0000,		/* Matlab (tm) V5.0 / GNU Octave 2.1 */
		SF_FORMAT_PVF			= 0x0E0000,		/* Portable Voice Format */
		SF_FORMAT_XI			= 0x0F0000,		/* Fasttracker 2 Extended Instrument */
		SF_FORMAT_HTK			= 0x100000,		/* HMM Tool Kit format */
		SF_FORMAT_SDS			= 0x110000,		/* Midi Sample Dump Standard */

		/* Subtypes from here on. */

		SF_FORMAT_PCM_S8		= 0x0001,		/* Signed 8 bit data */
		SF_FORMAT_PCM_16		= 0x0002,		/* Signed 16 bit data */
		SF_FORMAT_PCM_24		= 0x0003,		/* Signed 24 bit data */
		SF_FORMAT_PCM_32		= 0x0004,		/* Signed 32 bit data */

		SF_FORMAT_PCM_U8		= 0x0005,		/* Unsigned 8 bit data (WAV and RAW only) */

		SF_FORMAT_FLOAT			= 0x0006,		/* 32 bit float data */
		SF_FORMAT_DOUBLE		= 0x0007,		/* 64 bit float data */

		SF_FORMAT_ULAW			= 0x0010,		/* U-Law encoded. */
		SF_FORMAT_ALAW			= 0x0011,		/* A-Law encoded. */
		SF_FORMAT_IMA_ADPCM		= 0x0012,		/* IMA ADPCM. */
		SF_FORMAT_MS_ADPCM		= 0x0013,		/* Microsoft ADPCM. */

		SF_FORMAT_GSM610		= 0x0020,		/* GSM 6.10 encoding. */
		SF_FORMAT_VOX_ADPCM		= 0x0021,		/* OKI / Dialogix ADPCM */

		SF_FORMAT_G721_32		= 0x0030,		/* 32kbs G721 ADPCM encoding. */
		SF_FORMAT_G723_24		= 0x0031,		/* 24kbs G723 ADPCM encoding. */
		SF_FORMAT_G723_40		= 0x0032,		/* 40kbs G723 ADPCM encoding. */

		SF_FORMAT_DWVW_12		= 0x0040, 		/* 12 bit Delta Width Variable Word encoding. */
		SF_FORMAT_DWVW_16		= 0x0041, 		/* 16 bit Delta Width Variable Word encoding. */
		SF_FORMAT_DWVW_24		= 0x0042, 		/* 24 bit Delta Width Variable Word encoding. */
		SF_FORMAT_DWVW_N		= 0x0043, 		/* N bit Delta Width Variable Word encoding. */

		SF_FORMAT_DPCM_8		= 0x0050,		/* 8 bit differential PCM (XI only) */
		SF_FORMAT_DPCM_16		= 0x0051,		/* 16 bit differential PCM (XI only) */


		/* Endian-ness options. */

		SF_ENDIAN_FILE			= 0x00000000,	/* Default file endian-ness. */
		SF_ENDIAN_LITTLE		= 0x10000000,	/* Force little endian-ness. */
		SF_ENDIAN_BIG			= 0x20000000,	/* Force big endian-ness. */
		SF_ENDIAN_CPU			= 0x30000000,	/* Force CPU endian-ness. */

		SF_FORMAT_SUBMASK		= 0x0000FFFF,
		SF_FORMAT_TYPEMASK		= 0x0FFF0000,
		SF_FORMAT_ENDMASK		= 0x30000000
	}


//modes and other
	public enum lsndf_tf
	{	/* True and false */
		SF_FALSE	= 0,
		SF_TRUE		= 1,

		/* Modes for opening files. */
		SFM_READ	= 0x10,
		SFM_WRITE	= 0x20,
		SFM_RDWR	= 0x30
	}


//important SF_INFO structure
	[StructLayout(LayoutKind.Sequential)]
	public struct SF_INFO
	{
		public sf_count_t	frames ;		// Used to be called samples.  Changed to avoid confusion.
		public int			samplerate ;
		public int			channels ;
		public int			format ;
		public int			sections ;
		public int			seekable ;
	};


//function declarations
//Note: Not all functions have been prototyped here. Only the ones necessary to
//	make this application work. The below code should give some clues as to
//	how to add the rest since they have a lot of parameter and return type
//	similarities.
	[DllImport("libsndfile.dll")]
	public static extern IntPtr sf_open ([MarshalAs(UnmanagedType.LPStr)] string path, int mode, ref SF_INFO sfinfo);

	[DllImport("libsndfile.dll")]
	static extern int sf_error (IntPtr sndfile);

	[DllImport("libsndfile.dll")]
	static extern IntPtr sf_strerror (IntPtr sndfile);

	[DllImport("libsndfile.dll")]
	static extern int sf_format_check (ref SF_INFO info);

	[DllImport("libsndfile.dll")]
	static extern sf_count_t sf_read_float	(IntPtr sndfile, float[] ptr, sf_count_t items);

	[DllImport("libsndfile.dll")]
	static extern sf_count_t sf_write_float	(IntPtr sndfile, float[] ptr, sf_count_t items);

	[DllImport("libsndfile.dll")]
    static extern int sf_close (IntPtr sndfile);


	public const sf_count_t BUFFER_LEN = 4096;


//program entry
	static void Main(  ) {


//declarations
		SF_INFO sfinfo = new SF_INFO();
		float[] buffer = new float[BUFFER_LEN];
		sf_count_t rcnt;

//set the input file
		string sfn = "input.wav";	//set to a file on YOUR system
		//string sfn = "noexist.wav"; 	//test with non-existent file

//set the output file
		string ofn = "output.wav";

//read in sound file to convert
		IntPtr infile = sf_open (sfn, (int)lsndf_tf.SFM_READ, ref sfinfo);

//exit if error was thrown
		if ( (int)infile == 0 ) {
			Console.WriteLine("Error opening " + sfn);
			Console.WriteLine("Error #" + sf_error(infile));
			return;
		}

//set the file type for the output file
//uncomment one and only one of the statements below to change the output
//file encoding.
		//sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_WAV | lsndf_frmts.SF_FORMAT_PCM_U8);
		//sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_WAV | lsndf_frmts.SF_FORMAT_PCM_16);
		//sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_WAV | lsndf_frmts.SF_FORMAT_MS_ADPCM);
		sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_WAV | lsndf_frmts.SF_FORMAT_IMA_ADPCM);
		//sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_WAV | lsndf_frmts.SF_FORMAT_GSM610);
		/* Soundforge W64. */
		//sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_W64 | lsndf_frmts.SF_FORMAT_PCM_U8);
		//sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_W64 | lsndf_frmts.SF_FORMAT_PCM_16);
		//sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_W64 | lsndf_frmts.SF_FORMAT_MS_ADPCM);
		//sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_W64 | lsndf_frmts.SF_FORMAT_IMA_ADPCM);
		//sfinfo.format = (int)(lsndf_frmts.SF_FORMAT_W64 | lsndf_frmts.SF_FORMAT_GSM610);


//check that SF_INFO is valid
		if ( sf_format_check(ref sfinfo) == 0 ) {
			Console.WriteLine("sf_format_check failed. Invalid encoding");
			return;
		}

//open output file
		IntPtr outfile = sf_open (ofn, (int)lsndf_tf.SFM_WRITE, ref sfinfo);

//exit if error was thrown
		if ( (int)outfile == 0 ) {
			Console.WriteLine("Error opening " + ofn);
			Console.WriteLine("Error #" + sf_error(outfile));
			return;
		}

//infile -> outfile
		Console.Write(sfn + " -> " + ofn);
		while ( (rcnt = sf_read_float (infile, buffer, BUFFER_LEN)) > 0) {
			Console.Write(".");
			sf_write_float (outfile, buffer, BUFFER_LEN);
		}
		Console.WriteLine("done.");

//close up shop
		sf_close(infile);
		sf_close(outfile);


	} //main()


} //class lsndf_example {}