From fe0b751c8278ab07a350cd4d363743b734f4f830 Mon Sep 17 00:00:00 2001 From: Warren Dukes Date: Tue, 1 Jun 2004 11:18:25 +0000 Subject: ogg voribs comment parsing on the fly in the decoder git-svn-id: https://svn.musicpd.org/mpd/trunk@1279 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/inputPlugins/ogg_plugin.c | 94 +++++++++++++++++++++++++++---------------- 1 file changed, 60 insertions(+), 34 deletions(-) (limited to 'src/inputPlugins') diff --git a/src/inputPlugins/ogg_plugin.c b/src/inputPlugins/ogg_plugin.c index bb062dd10..8e42dec55 100644 --- a/src/inputPlugins/ogg_plugin.c +++ b/src/inputPlugins/ogg_plugin.c @@ -165,6 +165,61 @@ float ogg_getReplayGainScale(char ** comments) { return 1.0; } +MpdTag * oggCommentsParse(char ** comments) { + MpdTag * ret = NULL; + char * temp; + + while(*comments) { + if((temp = ogg_parseComment(*comments,"artist"))) { + if(!ret) ret = newMpdTag(); + if(!ret->artist) { + ret->artist = strdup(temp); + stripReturnChar(ret->artist); + } + } + else if((temp = ogg_parseComment(*comments,"title"))) { + if(!ret) ret = newMpdTag(); + if(!ret->title) { + ret->title = strdup(temp); + stripReturnChar(ret->title); + } + } + else if((temp = ogg_parseComment(*comments,"album"))) { + if(!ret) ret = newMpdTag(); + if(!ret->album) { + ret->album = strdup(temp); + stripReturnChar(ret->album); + } + } + else if((temp = ogg_parseComment(*comments,"tracknumber"))) { + if(!ret) ret = newMpdTag(); + if(!ret->track) { + ret->track = strdup(temp); + stripReturnChar(ret->track); + } + } + + comments++; + } + + return ret; +} + +void putOggCommentsIntoDecoderControlMetadata(DecoderControl * dc, + char ** comments) +{ + MpdTag * tag; + + if(dc->metadataSet) return; + + tag = oggCommentsParse(comments); + if(!tag) return; + + copyMpdTagToDecoderControlMetadata(dc, tag); + + freeMpdTag(tag); +} + int ogg_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) { OggVorbis_File vf; @@ -215,6 +270,8 @@ int ogg_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) comments = ov_comment(&vf, -1)->user_comments; + putOggCommentsIntoDecoderControlMetadata(dc, comments); + dc->state = DECODE_STATE_DECODE; replayGainScale = ogg_getReplayGainScale(comments); @@ -281,8 +338,6 @@ MpdTag * oggTagDup(char * file) { MpdTag * ret = NULL; FILE * fp; OggVorbis_File vf; - char ** comments; - char * temp; fp = fopen(file,"r"); if(!fp) return NULL; @@ -291,39 +346,10 @@ MpdTag * oggTagDup(char * file) { return NULL; } - ret = newMpdTag(); - ret->time = (int)(ov_time_total(&vf,-1)+0.5); - - comments = ov_comment(&vf,-1)->user_comments; - - while(*comments) { - if((temp = ogg_parseComment(*comments,"artist"))) { - if(!ret->artist) { - ret->artist = strdup(temp); - stripReturnChar(ret->artist); - } - } - else if((temp = ogg_parseComment(*comments,"title"))) { - if(!ret->title) { - ret->title = strdup(temp); - stripReturnChar(ret->title); - } - } - else if((temp = ogg_parseComment(*comments,"album"))) { - if(!ret->album) { - ret->album = strdup(temp); - stripReturnChar(ret->album); - } - } - else if((temp = ogg_parseComment(*comments,"tracknumber"))) { - if(!ret->track) { - ret->track = strdup(temp); - stripReturnChar(ret->track); - } - } + ret = oggCommentsParse(ov_comment(&vf,-1)->user_comments); - comments++; - } + if(!ret) ret = newMpdTag(); + ret->time = (int)(ov_time_total(&vf,-1)+0.5); ov_clear(&vf); -- cgit v1.2.3