From b30962f9f3c29795f2ddf56c72e0f4e0ca378b6f Mon Sep 17 00:00:00 2001 From: Dave Chapman Date: Sat, 11 Jun 2005 16:50:07 +0000 Subject: Initial attempt at parsing the metadata in an Ogg file - it still doesn't calculate total track length git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6677 a1c6a512-1295-4272-9138-f99709370657 --- apps/playback.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/apps/playback.c b/apps/playback.c index d27a9aae64..028c4c90f7 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -804,6 +804,47 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) tracks[track_widx].taginfo_ready = true; break; + case AFMT_OGG_VORBIS: + /* A simple parser to read vital metadata from an Ogg Vorbis file */ + + /* Use the trackname part of the id3 structure as a temporary buffer */ + buf=tracks[track_widx].id3.path; + + lseek(fd, 0, SEEK_SET); + + rc = read(fd, buf, 58); + if (rc < 4) { + close(fd); + return false; + } + + if ((memcmp(buf,"OggS",4)!=0) || (memcmp(&buf[29],"vorbis",6)!=0)) { + logf("%s is not an Ogg Vorbis file\n",trackname); + close(fd); + return(false); + } + + /* Ogg stores integers in little-endian format. */ + tracks[track_widx].id3.filesize=filesize(fd); + tracks[track_widx].id3.frequency=buf[40]|(buf[41]<<8)|(buf[42]<<16)|(buf[43]<<24); + channels=buf[39]; + + /* We should calculate an accurate average bps, but for now, just take + the "nominal bitrate" from the Ogg header */ + tracks[track_widx].id3.bitrate=(buf[48]|(buf[49]<<8)|(buf[50]<<16)|(buf[51]<<24))/1000; + tracks[track_widx].id3.vbr=true; + + /* I don't yet know how to calculate the totalsamples */ + totalsamples=0; + + /* Calculate the length in ms */ + tracks[track_widx].id3.length=(totalsamples/tracks[track_widx].id3.frequency)*1000; + + lseek(fd, 0, SEEK_SET); + strncpy(tracks[track_widx].id3.path,trackname,sizeof(tracks[track_widx].id3.path)); + tracks[track_widx].taginfo_ready = true; + break; + /* If we don't know how to read the metadata, just store the filename */ default: strncpy(tracks[track_widx].id3.path,trackname,sizeof(tracks[track_widx].id3.path)); -- cgit v1.2.3