Mercurial > hg > sv-dependency-builds
comparison src/libsndfile-1.0.25/tests/cpp_test.cc @ 0:c7265573341e
Import initial set of sources
author | Chris Cannam |
---|---|
date | Mon, 18 Mar 2013 14:12:14 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:c7265573341e |
---|---|
1 /* | |
2 ** Copyright (C) 2006-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 General Public License as published by | |
6 ** the Free Software Foundation; either version 2 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 General Public License for more details. | |
13 ** | |
14 ** You should have received a copy of the GNU 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 <cstdio> | |
20 #include <cstdlib> | |
21 #include <cstring> | |
22 | |
23 #include <sndfile.hh> | |
24 | |
25 #include "utils.h" | |
26 | |
27 static short sbuffer [100] ; | |
28 static int ibuffer [100] ; | |
29 static float fbuffer [100] ; | |
30 static double dbuffer [100] ; | |
31 | |
32 static void | |
33 ceeplusplus_wchar_test (void) | |
34 { | |
35 #if 0 | |
36 LPCWSTR filename = L"wchar_test.wav" ; | |
37 | |
38 print_test_name (__func__, "ceeplusplus_wchar_test.wav") ; | |
39 | |
40 /* Use this scope to make sure the created file is closed. */ | |
41 { | |
42 SndfileHandle file (filename, SFM_WRITE, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, 44100) ; | |
43 | |
44 if (file.refCount () != 1) | |
45 { printf ("\n\n%s %d : Error : Reference count (%d) should be 1.\n\n", __func__, __LINE__, file.refCount ()) ; | |
46 exit (1) ; | |
47 } ; | |
48 | |
49 /* This should check that the file did in fact get created with a | |
50 ** wchar_t * filename. | |
51 */ | |
52 exit_if_true ( | |
53 GetFileAttributesW (filename) == INVALID_FILE_ATTRIBUTES, | |
54 "\n\nLine %d : GetFileAttributes failed.\n\n", __LINE__ | |
55 ) ; | |
56 } | |
57 | |
58 /* Use this because the file was created with CreateFileW. */ | |
59 DeleteFileW (filename) ; | |
60 | |
61 puts ("ok") ; | |
62 #endif | |
63 } /* ceeplusplus_wchar_test */ | |
64 | |
65 | |
66 | |
67 static void | |
68 create_file (const char * filename, int format) | |
69 { SndfileHandle file ; | |
70 | |
71 if (file.refCount () != 0) | |
72 { printf ("\n\n%s %d : Error : Reference count (%d) should be zero.\n\n", __func__, __LINE__, file.refCount ()) ; | |
73 exit (1) ; | |
74 } ; | |
75 | |
76 file = SndfileHandle (filename, SFM_WRITE, format, 2, 48000) ; | |
77 | |
78 if (file.refCount () != 1) | |
79 { printf ("\n\n%s %d : Error : Reference count (%d) should be 1.\n\n", __func__, __LINE__, file.refCount ()) ; | |
80 exit (1) ; | |
81 } ; | |
82 | |
83 file.setString (SF_STR_TITLE, filename) ; | |
84 | |
85 /* Item write. */ | |
86 file.write (sbuffer, ARRAY_LEN (sbuffer)) ; | |
87 file.write (ibuffer, ARRAY_LEN (ibuffer)) ; | |
88 file.write (fbuffer, ARRAY_LEN (fbuffer)) ; | |
89 file.write (dbuffer, ARRAY_LEN (dbuffer)) ; | |
90 | |
91 /* Frame write. */ | |
92 file.writef (sbuffer, ARRAY_LEN (sbuffer) / file.channels ()) ; | |
93 file.writef (ibuffer, ARRAY_LEN (ibuffer) / file.channels ()) ; | |
94 file.writef (fbuffer, ARRAY_LEN (fbuffer) / file.channels ()) ; | |
95 file.writef (dbuffer, ARRAY_LEN (dbuffer) / file.channels ()) ; | |
96 | |
97 /* RAII takes care of the SndfileHandle. */ | |
98 } /* create_file */ | |
99 | |
100 static void | |
101 check_title (const SndfileHandle & file, const char * filename) | |
102 { const char *title = NULL ; | |
103 | |
104 title = file.getString (SF_STR_TITLE) ; | |
105 | |
106 if (title == NULL) | |
107 { printf ("\n\n%s %d : Error : No title.\n\n", __func__, __LINE__) ; | |
108 exit (1) ; | |
109 } ; | |
110 | |
111 if (strcmp (filename, title) != 0) | |
112 { printf ("\n\n%s %d : Error : title '%s' should be '%s'\n\n", __func__, __LINE__, title, filename) ; | |
113 exit (1) ; | |
114 } ; | |
115 | |
116 return ; | |
117 } /* check_title */ | |
118 | |
119 static void | |
120 read_file (const char * filename, int format) | |
121 { SndfileHandle file ; | |
122 sf_count_t count ; | |
123 | |
124 if (file) | |
125 { printf ("\n\n%s %d : Error : should not be here.\n\n", __func__, __LINE__) ; | |
126 exit (1) ; | |
127 } ; | |
128 | |
129 file = SndfileHandle (filename) ; | |
130 | |
131 if (1) | |
132 { SndfileHandle file2 = file ; | |
133 | |
134 if (file.refCount () != 2 || file2.refCount () != 2) | |
135 { printf ("\n\n%s %d : Error : Reference count (%d) should be two.\n\n", __func__, __LINE__, file.refCount ()) ; | |
136 exit (1) ; | |
137 } ; | |
138 } ; | |
139 | |
140 if (file.refCount () != 1) | |
141 { printf ("\n\n%s %d : Error : Reference count (%d) should be one.\n\n", __func__, __LINE__, file.refCount ()) ; | |
142 exit (1) ; | |
143 } ; | |
144 | |
145 if (! file) | |
146 { printf ("\n\n%s %d : Error : should not be here.\n\n", __func__, __LINE__) ; | |
147 exit (1) ; | |
148 } ; | |
149 | |
150 if (file.format () != format) | |
151 { printf ("\n\n%s %d : Error : format 0x%08x should be 0x%08x.\n\n", __func__, __LINE__, file.format (), format) ; | |
152 exit (1) ; | |
153 } ; | |
154 | |
155 if (file.channels () != 2) | |
156 { printf ("\n\n%s %d : Error : channels %d should be 2.\n\n", __func__, __LINE__, file.channels ()) ; | |
157 exit (1) ; | |
158 } ; | |
159 | |
160 if (file.frames () != ARRAY_LEN (sbuffer) * 4) | |
161 { printf ("\n\n%s %d : Error : frames %ld should be %lu.\n\n", __func__, __LINE__, | |
162 SF_COUNT_TO_LONG (file.frames ()), (long unsigned int) ARRAY_LEN (sbuffer) * 4 / 2) ; | |
163 exit (1) ; | |
164 } ; | |
165 | |
166 switch (format & SF_FORMAT_TYPEMASK) | |
167 { case SF_FORMAT_AU : | |
168 break ; | |
169 | |
170 default : | |
171 check_title (file, filename) ; | |
172 break ; | |
173 } ; | |
174 | |
175 /* Item read. */ | |
176 file.read (sbuffer, ARRAY_LEN (sbuffer)) ; | |
177 file.read (ibuffer, ARRAY_LEN (ibuffer)) ; | |
178 file.read (fbuffer, ARRAY_LEN (fbuffer)) ; | |
179 file.read (dbuffer, ARRAY_LEN (dbuffer)) ; | |
180 | |
181 /* Frame read. */ | |
182 file.readf (sbuffer, ARRAY_LEN (sbuffer) / file.channels ()) ; | |
183 file.readf (ibuffer, ARRAY_LEN (ibuffer) / file.channels ()) ; | |
184 file.readf (fbuffer, ARRAY_LEN (fbuffer) / file.channels ()) ; | |
185 file.readf (dbuffer, ARRAY_LEN (dbuffer) / file.channels ()) ; | |
186 | |
187 count = file.seek (file.frames () - 10, SEEK_SET) ; | |
188 if (count != file.frames () - 10) | |
189 { printf ("\n\n%s %d : Error : offset (%ld) should be %ld\n\n", __func__, __LINE__, | |
190 SF_COUNT_TO_LONG (count), SF_COUNT_TO_LONG (file.frames () - 10)) ; | |
191 exit (1) ; | |
192 } ; | |
193 | |
194 count = file.read (sbuffer, ARRAY_LEN (sbuffer)) ; | |
195 if (count != 10 * file.channels ()) | |
196 { printf ("\n\n%s %d : Error : count (%ld) should be %ld\n\n", __func__, __LINE__, | |
197 SF_COUNT_TO_LONG (count), SF_COUNT_TO_LONG (10 * file.channels ())) ; | |
198 exit (1) ; | |
199 } ; | |
200 | |
201 /* RAII takes care of the SndfileHandle. */ | |
202 } /* read_file */ | |
203 | |
204 static void | |
205 ceeplusplus_test (const char *filename, int format) | |
206 { | |
207 print_test_name ("ceeplusplus_test", filename) ; | |
208 | |
209 create_file (filename, format) ; | |
210 read_file (filename, format) ; | |
211 | |
212 remove (filename) ; | |
213 puts ("ok") ; | |
214 } /* ceeplusplus_test */ | |
215 | |
216 static void | |
217 ceeplusplus_extra_test (void) | |
218 { SndfileHandle file ; | |
219 const char * filename = "bad_file_name.wav" ; | |
220 int error ; | |
221 | |
222 print_test_name ("ceeplusplus_extra_test", filename) ; | |
223 | |
224 file = SndfileHandle (filename) ; | |
225 | |
226 error = file.error () ; | |
227 if (error == 0) | |
228 { printf ("\n\n%s %d : error should be zero.\n\n", __func__, __LINE__) ; | |
229 exit (1) ; | |
230 } ; | |
231 | |
232 if (file.strError () == NULL) | |
233 { printf ("\n\n%s %d : strError should not return NULL.\n\n", __func__, __LINE__) ; | |
234 exit (1) ; | |
235 } ; | |
236 | |
237 if (file.seek (0, SEEK_SET) != 0) | |
238 { printf ("\n\n%s %d : bad seek ().\n\n", __func__, __LINE__) ; | |
239 exit (1) ; | |
240 } ; | |
241 | |
242 puts ("ok") ; | |
243 } /* ceeplusplus_extra_test */ | |
244 | |
245 | |
246 static void | |
247 ceeplusplus_rawhandle_test (const char *filename) | |
248 { | |
249 SNDFILE* handle ; | |
250 { | |
251 SndfileHandle file (filename) ; | |
252 handle = file.rawHandle () ; | |
253 sf_read_float (handle, fbuffer, ARRAY_LEN (fbuffer)) ; | |
254 } | |
255 } /* ceeplusplus_rawhandle_test */ | |
256 | |
257 static void | |
258 ceeplusplus_takeOwnership_test (const char *filename) | |
259 { | |
260 SNDFILE* handle ; | |
261 { | |
262 SndfileHandle file (filename) ; | |
263 handle = file.takeOwnership () ; | |
264 } | |
265 | |
266 if (sf_read_float (handle, fbuffer, ARRAY_LEN (fbuffer)) <= 0) | |
267 { printf ("\n\n%s %d : error when taking ownership of handle.\n\n", __func__, __LINE__) ; | |
268 exit (1) ; | |
269 } | |
270 | |
271 if (sf_close (handle) != 0) | |
272 { printf ("\n\n%s %d : cannot close file.\n\n", __func__, __LINE__) ; | |
273 exit (1) ; | |
274 } | |
275 | |
276 SndfileHandle file (filename) ; | |
277 SndfileHandle file2 (file) ; | |
278 | |
279 if (file2.takeOwnership ()) | |
280 { printf ("\n\n%s %d : taking ownership of shared handle is not allowed.\n\n", __func__, __LINE__) ; | |
281 exit (1) ; | |
282 } | |
283 } /* ceeplusplus_takeOwnership_test */ | |
284 | |
285 static void | |
286 ceeplusplus_handle_test (const char *filename, int format) | |
287 { | |
288 print_test_name ("ceeplusplus_handle_test", filename) ; | |
289 | |
290 create_file (filename, format) ; | |
291 | |
292 if (0) ceeplusplus_rawhandle_test (filename) ; | |
293 ceeplusplus_takeOwnership_test (filename) ; | |
294 | |
295 remove (filename) ; | |
296 puts ("ok") ; | |
297 } /* ceeplusplus_test */ | |
298 | |
299 int | |
300 main (void) | |
301 { | |
302 ceeplusplus_test ("cpp_test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; | |
303 ceeplusplus_test ("cpp_test.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_S8) ; | |
304 ceeplusplus_test ("cpp_test.au", SF_FORMAT_AU | SF_FORMAT_FLOAT) ; | |
305 | |
306 ceeplusplus_extra_test () ; | |
307 ceeplusplus_handle_test ("cpp_test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; | |
308 | |
309 ceeplusplus_wchar_test () ; | |
310 | |
311 return 0 ; | |
312 } /* main */ | |
313 |