diff options
| author | Yoshihisa Uchida <uchida@rockbox.org> | 2010-03-13 05:19:40 +0000 |
|---|---|---|
| committer | Yoshihisa Uchida <uchida@rockbox.org> | 2010-03-13 05:19:40 +0000 |
| commit | 4446d1bc857b41e491d04b05eeccc873a206fd18 (patch) | |
| tree | 47a50663e5680e115e32bed19b1f76e073b81c05 /apps/metadata | |
| parent | 131bb698ada664a49e0a548b515b14733914654e (diff) | |
| download | rockbox-4446d1bc857b41e491d04b05eeccc873a206fd18.zip rockbox-4446d1bc857b41e491d04b05eeccc873a206fd18.tar.gz rockbox-4446d1bc857b41e491d04b05eeccc873a206fd18.tar.bz2 rockbox-4446d1bc857b41e491d04b05eeccc873a206fd18.tar.xz | |
reduce firmware and sun audio codec.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25140 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/metadata')
| -rw-r--r-- | apps/metadata/au.c | 73 |
1 files changed, 27 insertions, 46 deletions
diff --git a/apps/metadata/au.c b/apps/metadata/au.c index 0639bd1..94e7453 100644 --- a/apps/metadata/au.c +++ b/apps/metadata/au.c @@ -20,8 +20,6 @@ ****************************************************************************/ #include <stdio.h> #include <string.h> -#include <stdlib.h> -#include <ctype.h> #include <inttypes.h> #include "system.h" @@ -30,62 +28,42 @@ #include "metadata_parsers.h" #include "logf.h" -/* table of bits per sample / 8 */ -static const unsigned char bitspersamples[28] = { - 0, - 1, /* G.711 MULAW */ - 1, /* 8bit */ - 2, /* 16bit */ - 3, /* 24bit */ - 4, /* 32bit */ - 4, /* 32bit */ - 8, /* 64bit */ - 0, /* Fragmented sample data */ - 0, /* DSP program */ - 0, /* 8bit fixed point */ - 0, /* 16bit fixed point */ - 0, /* 24bit fixed point */ - 0, /* 32bit fixed point */ - 0, - 0, - 0, - 0, - 0, /* 16bit linear with emphasis */ - 0, /* 16bit linear compressed */ - 0, /* 16bit linear with emphasis and compression */ - 0, /* Music kit DSP commands */ - 0, - 0, /* G.721 MULAW */ - 0, /* G.722 */ - 0, /* G.723 3bit */ - 0, /* G.723 5bit */ - 1, /* G.711 ALAW */ +static const unsigned char bitspersamples[9] = { + 0, /* encoding */ + 8, /* 1: G.711 MULAW */ + 8, /* 2: Linear PCM 8bit */ + 16, /* 3: Linear PCM 16bit */ + 24, /* 4: Linear PCM 24bit */ + 32, /* 5: Linear PCM 32bit */ + 32, /* 6: IEEE float 32bit */ + 64, /* 7: IEEE float 64bit */ + /* encoding 8 - 26 unsupported. */ + 8, /* 27: G.711 ALAW */ }; static inline unsigned char get_au_bitspersample(unsigned int encoding) { - if (encoding > 27) - return 0; - return bitspersamples[encoding]; + if (encoding < 8) + return bitspersamples[encoding]; + else if (encoding == 27) + return bitspersamples[8]; + + return 0; } bool get_au_metadata(int fd, struct mp3entry* id3) { - /* Use the trackname part of the id3 structure as a temporary buffer */ + /* temporary buffer */ unsigned char* buf = (unsigned char *)id3->path; unsigned long numbytes = 0; - int read_bytes; int offset; - unsigned char bits_ch; /* bitspersample * channels */ id3->vbr = false; /* All Sun audio files are CBR */ id3->filesize = filesize(fd); id3->length = 0; - if ((lseek(fd, 0, SEEK_SET) < 0) || ((read_bytes = read(fd, buf, 24)) < 0)) - return false; - - if (read_bytes < 24 || (memcmp(buf, ".snd", 4) != 0)) + lseek(fd, 0, SEEK_SET); + if ((read(fd, buf, 24) < 24) || (memcmp(buf, ".snd", 4) != 0)) { /* * no header @@ -96,10 +74,12 @@ bool get_au_metadata(int fd, struct mp3entry* id3) */ numbytes = id3->filesize; id3->frequency = 8000; - bits_ch = 1; + id3->bitrate = 8; } else { + /* parse header */ + /* data offset */ offset = get_long_be(buf + 4); if (offset < 24) @@ -112,13 +92,14 @@ bool get_au_metadata(int fd, struct mp3entry* id3) if (numbytes == (uint32_t)0xffffffff) numbytes = id3->filesize - offset; - bits_ch = get_au_bitspersample(get_long_be(buf + 12)) * get_long_be(buf + 20); id3->frequency = get_long_be(buf + 16); + id3->bitrate = get_au_bitspersample(get_long_be(buf + 12)) * get_long_be(buf + 20) + * id3->frequency / 1000; } /* Calculate track length [ms] */ - if (bits_ch) - id3->length = ((int64_t)numbytes * 1000LL) / (bits_ch * id3->frequency); + if (id3->bitrate) + id3->length = (numbytes << 3) / id3->bitrate; return true; } |