1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 Dave Chapman
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
27 #include "metadata_common.h"
29 bool get_wave_metadata(int fd
, struct mp3entry
* id3
)
31 /* Use the trackname part of the id3 structure as a temporary buffer */
32 unsigned char* buf
= (unsigned char *)id3
->path
;
33 unsigned long totalsamples
= 0;
34 unsigned long channels
= 0;
35 unsigned long bitspersample
= 0;
36 unsigned long numbytes
= 0;
40 /* get RIFF chunk header */
41 if ((lseek(fd
, 0, SEEK_SET
) < 0)
42 || ((read_bytes
= read(fd
, buf
, 12)) < 12))
47 if ((memcmp(buf
, "RIFF",4) != 0)
48 || (memcmp(&buf
[8], "WAVE", 4) !=0 ))
53 /* iterate over WAVE chunks until 'data' chunk */
56 /* get chunk header */
57 if ((read_bytes
= read(fd
, buf
, 8)) < 8)
61 i
= get_long_le(&buf
[4]);
63 if (memcmp(buf
, "fmt ", 4) == 0)
65 /* get rest of chunk */
66 if ((read_bytes
= read(fd
, buf
, 16)) < 16)
71 /* skipping wFormatTag */
73 channels
= buf
[2] | (buf
[3] << 8);
75 id3
->frequency
= get_long_le(&buf
[4]);
76 /* dwAvgBytesPerSec */
77 id3
->bitrate
= (get_long_le(&buf
[8]) * 8) / 1000;
78 /* skipping wBlockAlign */
80 bitspersample
= buf
[14] | (buf
[15] << 8);
82 else if (memcmp(buf
, "data", 4) == 0)
87 else if (memcmp(buf
, "fact", 4) == 0)
92 /* get rest of chunk */
93 if ((read_bytes
= read(fd
, buf
, 4)) < 4)
97 totalsamples
= get_long_le(buf
);
101 /* seek to next chunk (even chunk sizes must be padded) */
105 if(lseek(fd
, i
, SEEK_CUR
) < 0)
109 if ((numbytes
== 0) || (channels
== 0))
114 if (totalsamples
== 0)
117 totalsamples
= numbytes
118 / ((((bitspersample
- 1) / 8) + 1) * channels
);
121 id3
->vbr
= false; /* All WAV files are CBR */
122 id3
->filesize
= filesize(fd
);
124 /* Calculate track length (in ms) and estimate the bitrate (in kbit/s) */
125 id3
->length
= ((int64_t) totalsamples
* 1000) / id3
->frequency
;