summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2005-06-11 16:50:07 +0000
committerDave Chapman <dave@dchapman.com>2005-06-11 16:50:07 +0000
commitb30962f9f3c29795f2ddf56c72e0f4e0ca378b6f (patch)
tree14e0eade7f2a86700c1110f1ad715050ad322ccb
parent5f12af28fb46d3d14e3168a55a34f3267543b312 (diff)
downloadrockbox-b30962f9f3c29795f2ddf56c72e0f4e0ca378b6f.tar.gz
rockbox-b30962f9f3c29795f2ddf56c72e0f4e0ca378b6f.zip
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
-rw-r--r--apps/playback.c41
1 files changed, 41 insertions, 0 deletions
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)
804 tracks[track_widx].taginfo_ready = true; 804 tracks[track_widx].taginfo_ready = true;
805 break; 805 break;
806 806
807 case AFMT_OGG_VORBIS:
808 /* A simple parser to read vital metadata from an Ogg Vorbis file */
809
810 /* Use the trackname part of the id3 structure as a temporary buffer */
811 buf=tracks[track_widx].id3.path;
812
813 lseek(fd, 0, SEEK_SET);
814
815 rc = read(fd, buf, 58);
816 if (rc < 4) {
817 close(fd);
818 return false;
819 }
820
821 if ((memcmp(buf,"OggS",4)!=0) || (memcmp(&buf[29],"vorbis",6)!=0)) {
822 logf("%s is not an Ogg Vorbis file\n",trackname);
823 close(fd);
824 return(false);
825 }
826
827 /* Ogg stores integers in little-endian format. */
828 tracks[track_widx].id3.filesize=filesize(fd);
829 tracks[track_widx].id3.frequency=buf[40]|(buf[41]<<8)|(buf[42]<<16)|(buf[43]<<24);
830 channels=buf[39];
831
832 /* We should calculate an accurate average bps, but for now, just take
833 the "nominal bitrate" from the Ogg header */
834 tracks[track_widx].id3.bitrate=(buf[48]|(buf[49]<<8)|(buf[50]<<16)|(buf[51]<<24))/1000;
835 tracks[track_widx].id3.vbr=true;
836
837 /* I don't yet know how to calculate the totalsamples */
838 totalsamples=0;
839
840 /* Calculate the length in ms */
841 tracks[track_widx].id3.length=(totalsamples/tracks[track_widx].id3.frequency)*1000;
842
843 lseek(fd, 0, SEEK_SET);
844 strncpy(tracks[track_widx].id3.path,trackname,sizeof(tracks[track_widx].id3.path));
845 tracks[track_widx].taginfo_ready = true;
846 break;
847
807 /* If we don't know how to read the metadata, just store the filename */ 848 /* If we don't know how to read the metadata, just store the filename */
808 default: 849 default:
809 strncpy(tracks[track_widx].id3.path,trackname,sizeof(tracks[track_widx].id3.path)); 850 strncpy(tracks[track_widx].id3.path,trackname,sizeof(tracks[track_widx].id3.path));