diff -urN -x '*.o' -x .dependencies mp3-0.9.11/data-mp3.c mp3-unstable/data-mp3.c --- mp3-0.9.11/data-mp3.c 2005-02-19 12:11:41.000000000 +0100 +++ mp3-unstable/data-mp3.c 2005-02-22 18:18:58.000000000 +0100 @@ -45,7 +39,65 @@ const char *imagecache = "/var/cache/images/mp3"; const char *imageconv = "image_convert.sh"; -// --- cSong ------------------------------------------------------------- +// --- cImageConvert ----------------------------------------------------------- + +class cImageConvert : private cThread { +private: + char *image; + enum eStatus { stNone, stRun, stFin }; + eStatus status; +protected: + virtual void Action(void); +public: + cImageConvert(void); + ~cImageConvert(); + bool Convert(const char *Image); + bool Status(void); + }; + +cImageConvert::cImageConvert(void) +{ + image=0; status=stNone; +} + +cImageConvert::~cImageConvert() +{ + if(status==stRun) Cancel(10); + free(image); +} + +bool cImageConvert::Convert(const char *Image) +{ + if(status==stNone) { + image=strdup(Image); + status=stRun; + Start(); + return true; + } + return false; +} + +bool cImageConvert::Status(void) +{ + if(status==stRun && !Active()) status=stFin; + return status==stFin; +} + +void cImageConvert::Action(void) +{ + nice(3); + char *m, *cmd, *qp, *qm; + asprintf(&m,"%s%s.mpg",imagecache,image); + di(printf("image: convert started %s -> %s\n",image,m)) + asprintf(&cmd,"%s \"%s\" \"%s\"",imageconv,qp=Quote(image),qm=Quote(m)); + int r=system(cmd); + if(r!=0) di(printf("image: convert returned with code %d. Failed?\n",r)) + free(cmd); free(qp); free(qm); free(m); + di(printf("image: convert finished\n")) + status=stFin; +} + +// --- cSong ------------------------------------------------------------------- cSong::cSong(cFileObj *Obj) { @@ -67,10 +119,7 @@ cSong::~cSong() { - if(queuePid>0) { - kill(queuePid,SIGTERM); - waitpid(queuePid,0,0); - } + delete conv; delete decoder; obj->Source()->Unblock(); delete obj; @@ -79,15 +128,23 @@ void cSong::Init(void) { - decoder=0; user=0; image=0; queuePid=0; + decoder=0; user=0; image=0; conv=0; queueStat=0; fromDOS=decoderFailed=false; obj->Source()->Block(); } +#if VDRVERSNUM >= 10315 int cSong::Compare(const cListObject &ListObject) const +#else +bool cSong::operator<(const cListObject &ListObject) +#endif { cSong *song=(cSong *)&ListObject; +#if VDRVERSNUM >= 10315 return strcasecmp(obj->Path(),song->obj->Path()); +#else + return strcasecmp(obj->Path(),song->obj->Path())<0; +#endif } cSongInfo *cSong::Info(bool get) @@ -229,12 +286,13 @@ bool cSong::Image(unsigned char * &mem, int &len) { mem=0; - if(queuePid>0) { - if(!waitpid(queuePid,0,WNOHANG)) { + if(queueStat>0) { + if(!conv->Status()) { di(printf("image: still queued\n")) return false; } - queuePid=-1; + queueStat=-1; + delete conv; conv=0; } int res=0; @@ -244,31 +302,19 @@ asprintf(&m,"%s%s.mpg",imagecache,image); if(access(m,R_OK)) { di(printf("image: not cached\n")) - if(queuePid<0) { + if(queueStat<0) { di(printf("image: obviously convert failed...\n")) } else { - int pid=fork(); - if(pid==0) { // child - nice(3); - di(printf("image: convert started %s -> %s\n",image,m)) - char *m, *cmd, *qp, *qm; - asprintf(&m,"%s%s.mpg",imagecache,image); - asprintf(&cmd,"%s \"%s\" \"%s\"",imageconv,qp=Quote(image),qm=Quote(m)); - int r=system(cmd); - if(r!=0) di(printf("image: convert returned with code %d. Failed?\n",r)) - free(cmd); free(qp); free(qm); free(m); - di(printf("image: convert finished\n")) - exit(0); - } - else if(pid>0) { + if(!conv) conv=new cImageConvert; + if(conv && conv->Convert(image)) { di(printf("image: convert queued\n")) - queuePid=pid; + queueStat=1; res=-1; } else { di(printf("image: queueing failed\n")) - queuePid=-1; + queueStat=-1; } } } @@ -349,10 +395,18 @@ } } +#if VDRVERSNUM >= 10315 int cPlayList::Compare(const cListObject &ListObject) const +#else +bool cPlayList::operator<(const cListObject &ListObject) +#endif { cPlayList *list=(cPlayList *)&ListObject; +#if VDRVERSNUM >= 10315 return strcasecmp(obj->Name(),list->obj->Name()); +#else + return strcasecmp(obj->Name(),list->obj->Name())<0; +#endif } bool cPlayList::Load(void) diff -urN -x '*.o' -x .dependencies mp3-0.9.11/data-mp3.h mp3-unstable/data-mp3.h --- mp3-0.9.11/data-mp3.h 2005-02-11 18:00:07.000000000 +0100 +++ mp3-unstable/data-mp3.h 2005-02-22 18:12:09.000000000 +0100 @@ -30,6 +30,7 @@ class cDecoder; class cSongInfo; +class cImageConvert; extern const char *imagecache, *imageconv; @@ -45,7 +46,8 @@ cMutex decLock; // const char *image; - int queuePid; + cImageConvert *conv; + int queueStat; // void Init(void); char *Convert2Unix(const char *name) const; @@ -56,7 +58,11 @@ cSong(cFileSource *Source, const char *Subdir, const char *Name); cSong(cSong *Song); ~cSong(); +#if VDRVERSNUM >= 10315 virtual int Compare(const cListObject &ListObject) const; +#else + virtual bool operator<(const cListObject &ListObject); +#endif bool Parse(char *s, const char *reldir) const; bool Save(FILE *f, const char *reldir) const; void Convert(void); @@ -86,7 +92,11 @@ ~cPlayList(); virtual bool Load(void); virtual bool Save(void); +#if VDRVERSNUM >= 10315 virtual int Compare(const cListObject &ListObject) const; +#else + virtual bool operator<(const cListObject &ListObject); +#endif // bool Rename(const char *newName); bool Delete(void);