aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/directory.c2
-rw-r--r--src/player.c2
-rw-r--r--src/song.c43
-rw-r--r--src/song.h1
-rw-r--r--src/tag.c33
-rw-r--r--src/tag.h1
6 files changed, 46 insertions, 36 deletions
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 <sys/stat.h>
@@ -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();