diff options
-rw-r--r-- | apps/playback.c | 41 |
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)); |