Bug Summary

File:read-wav.c
Warning:line 245, column 17
This statement is never executed

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name read-wav.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -menable-no-infs -menable-no-nans -fapprox-func -menable-unsafe-fp-math -fno-signed-zeros -mreassociate -freciprocal-math -fdenormal-fp-math=preserve-sign,preserve-sign -ffp-contract=fast -fno-rounding-math -ffast-math -ffinite-math-only -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/rootdir/src -resource-dir /usr/lib/llvm-14/lib/clang/14.0.6 -D HAVE_CONFIG_H -I . -I .. -D KA_PLUGIN_PATH="/usr/local/lib/libkanberra-0.31" -D KA_MACHINE_ID="/usr/local/var/lib/dbus/machine-id" -D PIC -internal-isystem /usr/lib/llvm-14/lib/clang/14.0.6/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wwrite-strings -Wno-long-long -Wno-overlength-strings -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-result -fconst-strings -fdebug-compilation-dir=/rootdir/src -ferror-limit 19 -fgnuc-version=4.2.1 -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2022-12-24-113220-18448-1 -x c read-wav.c
1/*-*- Mode: C; c-basic-offset: 8 -*-*/
2
3/***
4 This file is part of libkanberra.
5
6 Copyright 2008 Lennart Poettering
7
8 libkanberra is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as
10 published by the Free Software Foundation, either version 2.1 of the
11 License, or (at your option) any later version.
12
13 libkanberra is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public
19 License along with libkanberra. If not, see
20 <http://www.gnu.org/licenses/>.
21***/
22
23#ifdef HAVE_CONFIG_H1
24#include <config.h>
25#endif
26
27#include "kanberra.h"
28#include "read-wav.h"
29#include "macro.h"
30#include "malloc.h"
31
32#define FILE_SIZE_MAX(64U*1024U*1024U) (64U*1024U*1024U)
33
34/* Stores the bit indexes in dwChannelMask */
35enum {
36 BIT_FRONT_LEFT,
37 BIT_FRONT_RIGHT,
38 BIT_FRONT_CENTER,
39 BIT_LOW_FREQUENCY,
40 BIT_BACK_LEFT,
41 BIT_BACK_RIGHT,
42 BIT_FRONT_LEFT_OF_CENTER,
43 BIT_FRONT_RIGHT_OF_CENTER,
44 BIT_BACK_CENTER,
45 BIT_SIDE_LEFT,
46 BIT_SIDE_RIGHT,
47 BIT_TOP_CENTER,
48 BIT_TOP_FRONT_LEFT,
49 BIT_TOP_FRONT_CENTER,
50 BIT_TOP_FRONT_RIGHT,
51 BIT_TOP_BACK_LEFT,
52 BIT_TOP_BACK_CENTER,
53 BIT_TOP_BACK_RIGHT,
54 _BIT_MAX
55};
56
57static const ka_channel_position_t channel_table[_BIT_MAX] = {
58 [BIT_FRONT_LEFT] = KA_CHANNEL_FRONT_LEFT,
59 [BIT_FRONT_RIGHT] = KA_CHANNEL_FRONT_RIGHT,
60 [BIT_FRONT_CENTER] = KA_CHANNEL_FRONT_CENTER,
61 [BIT_LOW_FREQUENCY] = KA_CHANNEL_LFE,
62 [BIT_BACK_LEFT] = KA_CHANNEL_REAR_LEFT,
63 [BIT_BACK_RIGHT] = KA_CHANNEL_REAR_RIGHT,
64 [BIT_FRONT_LEFT_OF_CENTER] = KA_CHANNEL_FRONT_LEFT_OF_CENTER,
65 [BIT_FRONT_RIGHT_OF_CENTER] = KA_CHANNEL_FRONT_RIGHT_OF_CENTER,
66 [BIT_BACK_CENTER] = KA_CHANNEL_REAR_CENTER,
67 [BIT_SIDE_LEFT] = KA_CHANNEL_SIDE_LEFT,
68 [BIT_SIDE_RIGHT] = KA_CHANNEL_SIDE_RIGHT,
69 [BIT_TOP_CENTER] = KA_CHANNEL_TOP_CENTER,
70 [BIT_TOP_FRONT_LEFT] = KA_CHANNEL_TOP_FRONT_LEFT,
71 [BIT_TOP_FRONT_CENTER] = KA_CHANNEL_TOP_FRONT_CENTER,
72 [BIT_TOP_FRONT_RIGHT] = KA_CHANNEL_TOP_FRONT_RIGHT,
73 [BIT_TOP_BACK_LEFT] = KA_CHANNEL_TOP_REAR_LEFT,
74 [BIT_TOP_BACK_CENTER] = KA_CHANNEL_TOP_REAR_CENTER,
75 [BIT_TOP_BACK_RIGHT] = KA_CHANNEL_TOP_REAR_RIGHT
76};
77
78struct ka_wav {
79 FILE *file;
80
81 off_t data_size;
82 unsigned nchannels;
83 unsigned rate;
84 unsigned depth;
85 uint32_t channel_mask;
86
87 ka_channel_position_t channel_map[_BIT_MAX];
88};
89
90#define CHUNK_ID_DATA0x61746164U 0x61746164U
91#define CHUNK_ID_FMT0x20746d66U 0x20746d66U
92
93static const uint8_t pcm_guid[16] = {
94 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
95 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
96};
97
98static int skip_to_chunk(ka_wav *w, uint32_t id, uint32_t *size) {
99
100 ka_return_val_if_fail(w, KA_ERROR_INVALID)do { if ((__builtin_expect((!(w)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "w"
, "read-wav.c", 100, __PRETTY_FUNCTION__); return (KA_ERROR_INVALID
); } } while((0))
;
101 ka_return_val_if_fail(size, KA_ERROR_INVALID)do { if ((__builtin_expect((!(size)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "size"
, "read-wav.c", 101, __PRETTY_FUNCTION__); return (KA_ERROR_INVALID
); } } while((0))
;
102
103 for (;;) {
104 uint32_t chunk[2];
105 uint32_t s;
106
107 if (fread(chunk, sizeof(uint32_t), KA_ELEMENTSOF(chunk)(sizeof(chunk)/sizeof((chunk)[0])), w->file) != KA_ELEMENTSOF(chunk)(sizeof(chunk)/sizeof((chunk)[0])))
108 goto fail_io;
109
110 s = KA_UINT32_FROM_LE(chunk[1])((uint32_t)(chunk[1]));
111
112 if (s <= 0 || s >= FILE_SIZE_MAX(64U*1024U*1024U))
113 return KA_ERROR_TOOBIG;
114
115 if (KA_UINT32_FROM_LE(chunk[0])((uint32_t)(chunk[0])) == id) {
116 *size = s;
117 break;
118 }
119
120 if (fseek(w->file, (long) s, SEEK_CUR1) < 0)
121 return KA_ERROR_SYSTEM;
122 }
123
124 return KA_SUCCESS;
125
126fail_io:
127
128 if (feof(w->file))
129 return KA_ERROR_CORRUPT;
130 else if (ferror(w->file))
131 return KA_ERROR_SYSTEM;
132
133 ka_assert_not_reached()do { fprintf(stderr, "Code should not be reached at %s:%u, function %s(). Aborting.\n"
, "read-wav.c", 133, __PRETTY_FUNCTION__); abort(); } while (
(0))
;
134}
135
136int ka_wav_open(ka_wav **_w, FILE *f) {
137 uint32_t header[3], fmt_chunk[10];
138 int ret;
139 ka_wav *w;
140 uint32_t file_size, fmt_size, data_size;
141 ka_bool_t extensible;
142 uint32_t format;
143
144 ka_return_val_if_fail(_w, KA_ERROR_INVALID)do { if ((__builtin_expect((!(_w)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "_w"
, "read-wav.c", 144, __PRETTY_FUNCTION__); return (KA_ERROR_INVALID
); } } while((0))
;
145 ka_return_val_if_fail(f, KA_ERROR_INVALID)do { if ((__builtin_expect((!(f)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "f"
, "read-wav.c", 145, __PRETTY_FUNCTION__); return (KA_ERROR_INVALID
); } } while((0))
;
146
147 if (!(w = ka_new(ka_wav, 1)((ka_wav*) malloc(sizeof(ka_wav)*(1)))))
148 return KA_ERROR_OOM;
149
150 w->file = f;
151
152 if (fread(header, sizeof(uint32_t), KA_ELEMENTSOF(header)(sizeof(header)/sizeof((header)[0])), f) != KA_ELEMENTSOF(header)(sizeof(header)/sizeof((header)[0])))
153 goto fail_io;
154
155 if (KA_UINT32_FROM_LE(header[0])((uint32_t)(header[0])) != 0x46464952U ||
156 KA_UINT32_FROM_LE(header[2])((uint32_t)(header[2])) != 0x45564157U) {
157 ret = KA_ERROR_CORRUPT;
158 goto fail;
159 }
160
161 file_size = KA_UINT32_FROM_LE(header[1])((uint32_t)(header[1]));
162
163 if (file_size <= 0 || file_size >= FILE_SIZE_MAX(64U*1024U*1024U)) {
164 ret = KA_ERROR_TOOBIG;
165 goto fail;
166 }
167
168 /* Skip to the fmt chunk */
169 if ((ret = skip_to_chunk(w, CHUNK_ID_FMT0x20746d66U, &fmt_size)) < 0)
170 goto fail;
171
172 switch (fmt_size) {
173
174 case 14: /* WAVEFORMAT */
175 case 16:
176 case 18: /* WAVEFORMATEX */
177 extensible = FALSE(0);
178 break;
179
180 case 40: /* WAVEFORMATEXTENSIBLE */
181 extensible = TRUE(!(0));
182 break;
183
184 default:
185 ret = KA_ERROR_NOTSUPPORTED;
186 goto fail;
187 }
188
189 if (fread(fmt_chunk, 1, fmt_size, f) != fmt_size)
190 goto fail_io;
191
192 /* PCM? or WAVEX? */
193 format = (KA_UINT32_FROM_LE(fmt_chunk[0])((uint32_t)(fmt_chunk[0])) & 0xFFFF);
194 if ((!extensible && format != 0x0001) ||
195 (extensible && format != 0xFFFE)) {
196 ret = KA_ERROR_NOTSUPPORTED;
197 goto fail;
198 }
199
200 if (extensible) {
201 if (memcmp(fmt_chunk + 6, pcm_guid, 16) != 0) {
202 ret = KA_ERROR_NOTSUPPORTED;
203 goto fail;
204 }
205
206 w->channel_mask = KA_UINT32_FROM_LE(fmt_chunk[5])((uint32_t)(fmt_chunk[5]));
207 } else
208 w->channel_mask = 0;
209
210 w->nchannels = KA_UINT32_FROM_LE(fmt_chunk[0])((uint32_t)(fmt_chunk[0])) >> 16;
211 w->rate = KA_UINT32_FROM_LE(fmt_chunk[1])((uint32_t)(fmt_chunk[1]));
212 w->depth = KA_UINT32_FROM_LE(fmt_chunk[3])((uint32_t)(fmt_chunk[3])) >> 16;
213
214 if (w->nchannels <= 0 || w->rate <= 0) {
215 ret = KA_ERROR_CORRUPT;
216 goto fail;
217 }
218
219 if (w->depth != 16 && w->depth != 8) {
220 ret = KA_ERROR_NOTSUPPORTED;
221 goto fail;
222 }
223
224 /* Skip to the data chunk */
225 if ((ret = skip_to_chunk(w, CHUNK_ID_DATA0x61746164U, &data_size)) < 0)
226 goto fail;
227 w->data_size = (off_t) data_size;
228
229 if ((w->data_size % (w->depth/8)) != 0) {
230 ret = KA_ERROR_CORRUPT;
231 goto fail;
232 }
233
234 *_w = w;
235
236 return KA_SUCCESS;
237
238fail_io:
239
240 if (feof(f))
241 ret = KA_ERROR_CORRUPT;
242 else if (ferror(f))
243 ret = KA_ERROR_SYSTEM;
244 else
245 ka_assert_not_reached()do { fprintf(stderr, "Code should not be reached at %s:%u, function %s(). Aborting.\n"
, "read-wav.c", 245, __PRETTY_FUNCTION__); abort(); } while (
(0))
;
This statement is never executed
246
247fail:
248
249 ka_freefree(w);
250
251 return ret;
252}
253
254void ka_wav_close(ka_wav *w) {
255 ka_assert(w)do { if ((__builtin_expect((!(w)),0))) { fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s(). Aborting.\n"
, "w" , "read-wav.c", 255, __PRETTY_FUNCTION__); abort(); } }
while ((0))
;
256
257 fclose(w->file);
258 ka_freefree(w);
259}
260
261unsigned ka_wav_get_nchannels(ka_wav *w) {
262 ka_assert(w)do { if ((__builtin_expect((!(w)),0))) { fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s(). Aborting.\n"
, "w" , "read-wav.c", 262, __PRETTY_FUNCTION__); abort(); } }
while ((0))
;
263
264 return w->nchannels;
265}
266
267unsigned ka_wav_get_rate(ka_wav *w) {
268 ka_assert(w)do { if ((__builtin_expect((!(w)),0))) { fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s(). Aborting.\n"
, "w" , "read-wav.c", 268, __PRETTY_FUNCTION__); abort(); } }
while ((0))
;
269
270 return w->rate;
271}
272
273const ka_channel_position_t* ka_wav_get_channel_map(ka_wav *w) {
274 unsigned c;
275 ka_channel_position_t *p;
276
277 ka_assert(w)do { if ((__builtin_expect((!(w)),0))) { fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s(). Aborting.\n"
, "w" , "read-wav.c", 277, __PRETTY_FUNCTION__); abort(); } }
while ((0))
;
278
279 if (!w->channel_mask)
280 return NULL((void*)0);
281
282 p = w->channel_map;
283
284 for (c = 0; c < _BIT_MAX; c++)
285 if ((w->channel_mask & (1 << c)))
286 *(p++) = channel_table[c];
287
288 ka_assert(p <= w->channel_map + _BIT_MAX)do { if ((__builtin_expect((!(p <= w->channel_map + _BIT_MAX
)),0))) { fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s(). Aborting.\n"
, "p <= w->channel_map + _BIT_MAX" , "read-wav.c", 288,
__PRETTY_FUNCTION__); abort(); } } while ((0))
;
289
290 if (p != w->channel_map + w->nchannels)
291 return NULL((void*)0);
292
293 return w->channel_map;
294}
295
296ka_sample_type_t ka_wav_get_sample_type(ka_wav *w) {
297 ka_assert(w)do { if ((__builtin_expect((!(w)),0))) { fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s(). Aborting.\n"
, "w" , "read-wav.c", 297, __PRETTY_FUNCTION__); abort(); } }
while ((0))
;
298
299 return w->depth == 16 ?
300#ifdef WORDS_BIGENDIAN
301 KA_SAMPLE_S16RE
302#else
303 KA_SAMPLE_S16NE
304#endif
305 : KA_SAMPLE_U8;
306}
307
308int ka_wav_read_s16le(ka_wav *w, int16_t *d, size_t *n) {
309 off_t remaining;
310
311 ka_return_val_if_fail(w, KA_ERROR_INVALID)do { if ((__builtin_expect((!(w)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "w"
, "read-wav.c", 311, __PRETTY_FUNCTION__); return (KA_ERROR_INVALID
); } } while((0))
;
312 ka_return_val_if_fail(w->depth == 16, KA_ERROR_INVALID)do { if ((__builtin_expect((!(w->depth == 16)),0))) { if (
ka_debug()) fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s().\n"
, "w->depth == 16" , "read-wav.c", 312, __PRETTY_FUNCTION__
); return (KA_ERROR_INVALID); } } while((0))
;
313 ka_return_val_if_fail(d, KA_ERROR_INVALID)do { if ((__builtin_expect((!(d)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "d"
, "read-wav.c", 313, __PRETTY_FUNCTION__); return (KA_ERROR_INVALID
); } } while((0))
;
314 ka_return_val_if_fail(n, KA_ERROR_INVALID)do { if ((__builtin_expect((!(n)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "n"
, "read-wav.c", 314, __PRETTY_FUNCTION__); return (KA_ERROR_INVALID
); } } while((0))
;
315 ka_return_val_if_fail(*n > 0, KA_ERROR_INVALID)do { if ((__builtin_expect((!(*n > 0)),0))) { if (ka_debug
()) fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s().\n"
, "*n > 0" , "read-wav.c", 315, __PRETTY_FUNCTION__); return
(KA_ERROR_INVALID); } } while((0))
;
316
317 remaining = w->data_size / (off_t) sizeof(int16_t);
318
319 if ((off_t) *n > remaining)
320 *n = (size_t) remaining;
321
322 if (*n > 0) {
323 *n = fread(d, sizeof(int16_t), *n, w->file);
324
325 if (*n <= 0 && ferror(w->file))
326 return KA_ERROR_SYSTEM;
327
328 ka_assert(w->data_size >= (off_t) *n * (off_t) sizeof(int16_t))do { if ((__builtin_expect((!(w->data_size >= (off_t) *
n * (off_t) sizeof(int16_t))),0))) { fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s(). Aborting.\n"
, "w->data_size >= (off_t) *n * (off_t) sizeof(int16_t)"
, "read-wav.c", 328, __PRETTY_FUNCTION__); abort(); } } while
((0))
;
329 w->data_size -= (off_t) *n * (off_t) sizeof(int16_t);
330 }
331
332 return KA_SUCCESS;
333}
334
335int ka_wav_read_u8(ka_wav *w, uint8_t *d, size_t *n) {
336 off_t remaining;
337
338 ka_return_val_if_fail(w, KA_ERROR_INVALID)do { if ((__builtin_expect((!(w)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "w"
, "read-wav.c", 338, __PRETTY_FUNCTION__); return (KA_ERROR_INVALID
); } } while((0))
;
339 ka_return_val_if_fail(w->depth == 8, KA_ERROR_INVALID)do { if ((__builtin_expect((!(w->depth == 8)),0))) { if (ka_debug
()) fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s().\n"
, "w->depth == 8" , "read-wav.c", 339, __PRETTY_FUNCTION__
); return (KA_ERROR_INVALID); } } while((0))
;
340 ka_return_val_if_fail(d, KA_ERROR_INVALID)do { if ((__builtin_expect((!(d)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "d"
, "read-wav.c", 340, __PRETTY_FUNCTION__); return (KA_ERROR_INVALID
); } } while((0))
;
341 ka_return_val_if_fail(n, KA_ERROR_INVALID)do { if ((__builtin_expect((!(n)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "n"
, "read-wav.c", 341, __PRETTY_FUNCTION__); return (KA_ERROR_INVALID
); } } while((0))
;
342 ka_return_val_if_fail(*n > 0, KA_ERROR_INVALID)do { if ((__builtin_expect((!(*n > 0)),0))) { if (ka_debug
()) fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s().\n"
, "*n > 0" , "read-wav.c", 342, __PRETTY_FUNCTION__); return
(KA_ERROR_INVALID); } } while((0))
;
343
344 remaining = w->data_size / (off_t) sizeof(uint8_t);
345
346 if ((off_t) *n > remaining)
347 *n = (size_t) remaining;
348
349 if (*n > 0) {
350 *n = fread(d, sizeof(uint8_t), *n, w->file);
351
352 if (*n <= 0 && ferror(w->file))
353 return KA_ERROR_SYSTEM;
354
355 ka_assert(w->data_size >= (off_t) *n * (off_t) sizeof(uint8_t))do { if ((__builtin_expect((!(w->data_size >= (off_t) *
n * (off_t) sizeof(uint8_t))),0))) { fprintf(stderr, "Assertion '%s' failed at %s:%u, function %s(). Aborting.\n"
, "w->data_size >= (off_t) *n * (off_t) sizeof(uint8_t)"
, "read-wav.c", 355, __PRETTY_FUNCTION__); abort(); } } while
((0))
;
356 w->data_size -= (off_t) *n * (off_t) sizeof(uint8_t);
357 }
358
359 return KA_SUCCESS;
360}
361
362off_t ka_wav_get_size(ka_wav *v) {
363 ka_return_val_if_fail(v, (off_t) -1)do { if ((__builtin_expect((!(v)),0))) { if (ka_debug()) fprintf
(stderr, "Assertion '%s' failed at %s:%u, function %s().\n", "v"
, "read-wav.c", 363, __PRETTY_FUNCTION__); return ((off_t) -
1); } } while((0))
;
364
365 return v->data_size;
366}