diff --git a/src/directory.c b/src/directory.c index 016ce376d..673754044 100644 --- a/src/directory.c +++ b/src/directory.c @@ -803,7 +803,7 @@ int directoryPrintSongInfo(FILE * fp, Song * song, void * data) { int sumSongTime(FILE * fp, Song * song, void * data) { unsigned long * time = (unsigned long *)data; - if(song->time>=0) *time+=song->time; + if(song->tag && song->tag->time>=0) *time+=song->tag->time; return 0; } diff --git a/src/player.c b/src/player.c index 2b45e6ab4..5932a40cb 100644 --- a/src/player.c +++ b/src/player.c @@ -108,9 +108,9 @@ int playerInit() { sigaction(SIGTERM,&sa,NULL); close(listenSocket); - finishPlaylist(); freeAllInterfaces(); closeMp3Directory(); + finishPlaylist(); closeTables(); finishPaths(); finishPermissions(); diff --git a/src/song.c b/src/song.c index 374831e9c..42754c12d 100644 --- a/src/song.c +++ b/src/song.c @@ -48,7 +48,6 @@ Song * newNullSong() { song->tag = NULL; song->utf8file = NULL; - song->time = -1; return song; } @@ -61,34 +60,26 @@ Song * newSong(char * utf8file) { if(0); #ifdef HAVE_OGG else if(isOgg(utf8file,&(song->mtime))) { - song->time = getOggTotalTime( - rmp2amp(utf8ToFsCharset(utf8file))); - if(song->time>=0) song->tag = oggTagDup(utf8file); + song->tag = oggTagDup(utf8file); } #endif #ifdef HAVE_FLAC else if((isFlac(utf8file,&(song->mtime)))) { - song->time = getFlacTotalTime( - rmp2amp(utf8ToFsCharset(utf8file))); - if(song->time>=0) song->tag = flacTagDup(utf8file); + song->tag = flacTagDup(utf8file); } #endif #ifdef HAVE_MAD else if(isMp3(utf8file,&(song->mtime))) { - song->time = getMp3TotalTime( - rmp2amp(utf8ToFsCharset(utf8file))); - if(song->time>=0) song->tag = mp3TagDup(utf8file); + song->tag = mp3TagDup(utf8file); } #endif #ifdef HAVE_AUDIOFILE else if(isWave(utf8file,&(song->mtime))) { - song->time = getAudiofileTotalTime( - rmp2amp(utf8ToFsCharset(utf8file))); - if(song->time>=0) song->tag = audiofileTagDup(utf8file); + song->tag = audiofileTagDup(utf8file); } #endif - if(song->time<0) { + if(!song->tag || song->tag->time<0) { freeSong(song); song = NULL; } @@ -130,8 +121,6 @@ void freeSongList(SongList * list) { int printSongInfo(FILE * fp, Song * song) { myfprintf(fp,"%s%s\n",SONG_FILE,song->utf8file); - if(song->time>=0) myfprintf(fp,"%s%i\n",SONG_TIME,song->time); - if(song->tag) printMpdTag(fp,song->tag); return 0; @@ -203,7 +192,8 @@ void readSongInfoIntoList(FILE * fp, SongList * list) { song->tag->title = strdup(&(buffer[strlen(SONG_TITLE)])); } else if(0==strncmp(SONG_TIME,buffer,strlen(SONG_TIME))) { - song->time = atoi(&(buffer[strlen(SONG_TIME)])); + if(!song->tag) song->tag = newMpdTag(); + song->tag->time = atoi(&(buffer[strlen(SONG_TIME)])); } else if(0==strncmp(SONG_MTIME,buffer,strlen(SONG_MTIME))) { song->mtime = atoi(&(buffer[strlen(SONG_TITLE)])); @@ -227,40 +217,31 @@ int updateSongInfo(Song * song) { removeASongFromTables(song); if(song->tag) freeMpdTag(song->tag); - song->time = -1; song->tag = NULL; if(0); #ifdef HAVE_OGG else if(isOgg(utf8file,&(song->mtime))) { - song->time = getOggTotalTime( - rmp2amp(utf8ToFsCharset(utf8file))); - if(song->time>=0) song->tag = oggTagDup(utf8file); + song->tag = oggTagDup(utf8file); } #endif #ifdef HAVE_FLAC else if((isFlac(utf8file,&(song->mtime)))) { - song->time = getFlacTotalTime( - rmp2amp(utf8ToFsCharset(utf8file))); - if(song->time>=0) song->tag = flacTagDup(utf8file); + song->tag = flacTagDup(utf8file); } #endif #ifdef HAVE_MAD else if(isMp3(utf8file,&(song->mtime))) { - song->time = getMp3TotalTime( - rmp2amp(utf8ToFsCharset(utf8file))); - if(song->time>=0) song->tag = mp3TagDup(utf8file); + song->tag = mp3TagDup(utf8file); } #endif #ifdef HAVE_AUDIOFILE else if(isWave(utf8file,&(song->mtime))) { - song->time = getAudiofileTotalTime( - rmp2amp(utf8ToFsCharset(utf8file))); - if(song->time>=0) song->tag = audiofileTagDup(utf8file); + song->tag = audiofileTagDup(utf8file); } #endif - if(song->time<0) return -1; + if(!song->tag || song->tag->time<0) return -1; else addSongToTables(song); return 0; diff --git a/src/song.h b/src/song.h index a4f744428..768a6aa04 100644 --- a/src/song.h +++ b/src/song.h @@ -32,7 +32,6 @@ typedef struct _Song { char * utf8file; MpdTag * tag; time_t mtime; - int time; } Song; typedef List SongList; diff --git a/src/tag.c b/src/tag.c index d1132b2f8..f7bd5d39d 100644 --- a/src/tag.c +++ b/src/tag.c @@ -20,6 +20,8 @@ #include "path.h" #include "myfprintf.h" #include "sig_handlers.h" +#include "mp3_decode.h" +#include "audiofile_decode.h" #include "utils.h" #include @@ -48,6 +50,7 @@ void printMpdTag(FILE * fp, MpdTag * tag) { if(tag->album) myfprintf(fp,"Album: %s\n",tag->album); if(tag->track) myfprintf(fp,"Track: %s\n",tag->track); if(tag->title) myfprintf(fp,"Title: %s\n",tag->title); + if(tag->time>=0) myfprintf(fp,"Time: %i\n",tag->time); } #ifdef HAVE_ID3TAG @@ -135,7 +138,13 @@ MpdTag * id3Dup(char * utf8filename) { #ifdef HAVE_AUDIOFILE MpdTag * audiofileTagDup(char * utf8file) { MpdTag * ret = NULL; + int time = getAudiofileTotalTime(rmp2amp(utf8ToFsCharset(utf8file))); + if (time>=0) { + if(!ret) ret = newMpdTag(); + ret->time = time; + } + return ret; } #endif @@ -143,9 +152,17 @@ MpdTag * audiofileTagDup(char * utf8file) { #ifdef HAVE_MAD MpdTag * mp3TagDup(char * utf8file) { MpdTag * ret = NULL; + int time; ret = id3Dup(utf8file); + time = getMp3TotalTime(rmp2amp(utf8ToFsCharset(utf8file))); + + if(time>=0) { + if(!ret) ret = newMpdTag(); + ret->time = time; + } + return ret; } #endif @@ -171,6 +188,7 @@ MpdTag * oggTagDup(char * utf8file) { } ret = newMpdTag(); + ret->time = (int)(ov_time_total(&vf,-1)+0.5); comments = ov_comment(&vf,-1)->user_comments; @@ -297,6 +315,10 @@ MpdTag * flacMetadataDup(char * utf8file, int * vorbisCommentFound) { } else if(block->type == FLAC__METADATA_TYPE_STREAMINFO) { if(!ret) ret = newMpdTag(); + ret->time = ((float)block->data.stream_info. + total_samples) / + block->data.stream_info.sample_rate + + 0.5; } FLAC__metadata_object_delete(block); } while(FLAC__metadata_simple_iterator_next(it)); @@ -311,9 +333,14 @@ MpdTag * flacTagDup(char * utf8file) { int foundVorbisComment = 0; ret = flacMetadataDup(utf8file,&foundVorbisComment); + if(!ret) return NULL; if(!foundVorbisComment) { - if(ret) freeMpdTag(ret); - ret = id3Dup(utf8file); + MpdTag * temp = id3Dup(utf8file); + if(temp) { + temp->time = ret->time; + freeMpdTag(ret); + ret = temp; + } } return ret; @@ -326,6 +353,7 @@ MpdTag * newMpdTag() { ret->artist = NULL; ret->title = NULL; ret->track = NULL; + ret->time = -1; return ret; } @@ -346,6 +374,7 @@ MpdTag * mpdTagDup(MpdTag * tag) { ret->album = strdup(tag->album); ret->title = strdup(tag->title); ret->track = strdup(tag->track); + ret->time = tag->time; } return ret; diff --git a/src/tag.h b/src/tag.h index 2e2996f8a..0f176449f 100644 --- a/src/tag.h +++ b/src/tag.h @@ -26,6 +26,7 @@ typedef struct _MpdTag { char * album; char * track; char * title; + int time; } MpdTag; MpdTag * newMpdTag();