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
This commit is contained in:
@@ -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,40 +346,11 @@ MpdTag * oggTagDup(char * file) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = newMpdTag();
|
||||
ret = oggCommentsParse(ov_comment(&vf,-1)->user_comments);
|
||||
|
||||
if(!ret) 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);
|
||||
}
|
||||
}
|
||||
|
||||
comments++;
|
||||
}
|
||||
|
||||
ov_clear(&vf);
|
||||
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user