#include #include #include #include #include "tocdata.h" #include "track.h" gint gdrdao_tocedit_init(struct gdrdao_toceditor* _use) { register long i; if(_use==NULL) return 1; _use->tracks=0; _use->track=NULL; _use->disktype=-1; strcpy(_use->catalog,"000000000000"); _use->lmin=0; _use->lsec=0; _use->lfrm=0; _use->pmin=0; _use->psec=0; _use->pfrm=0; _use->usetext=FALSE; for(i=0;i<8;++i) { gdrdao_cdtext_init(&_use->cdtext[i]); gdrdao_cdtext_clear(&_use->cdtext[i]); }; gdrdao_lmap_init(&_use->lmap); gdrdao_lmap_clear(&_use->lmap); return 0; }; gint gdrdao_tocedit_clear(struct gdrdao_toceditor* _use) { struct gdrdao_trackentry* tmp; register long i; if(_use==NULL) return 1; tmp=gdrdao_tocedit_getlastinchain(_use); if(tmp==NULL) return 1; while(1) { if(tmp->prev!=NULL) { tmp=tmp->prev; g_free(tmp->next); tmp->next=NULL; } else { g_free(tmp); break; }; }; _use->tracks=0; _use->disktype=0; strcpy(_use->catalog,"0000000000000"); _use->lmin=0; _use->lsec=0; _use->lfrm=0; _use->pmin=0; _use->psec=0; _use->pfrm=0; _use->usetext=FALSE; gdrdao_cdtext_clear(_use->cdtext); gdrdao_lmap_clear(&_use->lmap); return 0; }; struct gdrdao_trackentry* gdrdao_tocedit_getlastinchain( struct gdrdao_toceditor* _use) { struct gdrdao_trackentry* tmp; register long i; if(_use==NULL) return NULL; tmp=_use->track; if(tmp==NULL) return NULL; /* no chain at all */ for(i=1;i<_use->tracks;++i) { tmp=tmp->next; }; return tmp; }; gint gdrdao_tocedit_addtrack(struct gdrdao_toceditor* _use, gint _no, struct gdrdao_trackentry* _set) { register long i; struct gdrdao_trackentry* tmp, *q; if(_use==NULL||_no<=0||_set==NULL) return 1; if(gdrdao_get_track_length(_set->trackfile, &_set->lmin,&_set->lsec,&_set->lfrm)!=0) return 1; tmp=gdrdao_tocedit_getlastinchain(_use); if(tmp==NULL) { /* no chain there, yet */ _set->prev=NULL; _set->next=NULL; _use->track=_set; /* set the first entry */ } else { _set->prev=tmp; tmp->next=_set; /* okay, it's in the chain */ _set->next=NULL; /* terminate chain */ }; _use->tracks++; _set->number=0; q=_use->track; for(i=0;i<_use->tracks;++i) { if(q->number>=_no) q->number++; q=q->next; }; _set->number=_no; gdrdao_add_ttime(&_use->lmin,&_use->lsec,&_use->lfrm,_set->lmin, _set->lsec,_set->lfrm); gdrdao_get_track_length(_set->trackfile,&_set->flenmin,&_set->flensec, &_set->flenfrm); printf("tocdata: %02i:%02i:%02i\n",_use->lmin,_use->lsec,_use->lfrm); return 0; }; gint gdrdao_tocedit_deltrack(struct gdrdao_toceditor* _use, gint _no) { struct gdrdao_trackentry* tmp, *q; register long i; char w; if(_use==NULL||_no<=0) return 1; if(_use->tracks<=0) return 1; q=_use->track; w=FALSE; for(i=0;i<_use->tracks;++i) { if(q->number==_no) { w=TRUE; break; } else { q=q->next; }; }; if(w==FALSE) return 1; /* no such track */ /* now remove it */ if(q->prev==NULL&&q->next==NULL) { _use->track=NULL; _use->tracks=0; }; /* the only element */ if(q->prev==NULL&&q->next!=NULL) { /* first entry in list */ q->next->prev=NULL; _use->track=q->next; _use->tracks--; }; if(q->prev!=NULL&&q->next==NULL) { /* last entry in list */ q->prev->next=NULL; _use->tracks--; }; /* everything else is in between */ if(q->prev!=NULL&&q->next!=NULL) { q->prev->next=q->next; q->next->prev=q->prev; _use->tracks--; }; gdrdao_sub_ttime(&_use->lmin,&_use->lsec,&_use->lfrm,q->lmin, q->lsec,q->lfrm); printf("tocdata: %02i:%02i:%02i\n",_use->lmin,_use->lsec,_use->lfrm); free(q); /* now do update the track numbers */ tmp=_use->track; for(i=0;i<_use->tracks;++i) { if(tmp->number>_no) tmp->number--; tmp=tmp->next; }; return 0; }; gint gdrdao_tocedit_trackup(struct gdrdao_toceditor* _use, gint _no) { struct gdrdao_trackentry *hi,*lo; if(_use==NULL||_no<0) return 1; hi=gdrdao_tocedit_gettrack(_use,_no-1); lo=gdrdao_tocedit_gettrack(_use,_no); if(hi==NULL) return -1; /* it is the highest track! */ if(lo==NULL) return 1; lo->number--; hi->number++; return 0; }; gint gdrdao_tocedit_trackdown(struct gdrdao_toceditor* _use, gint _no) { struct gdrdao_trackentry *hi,*lo; if(_use==NULL||_no<0) return 1; hi=gdrdao_tocedit_gettrack(_use,_no); lo=gdrdao_tocedit_gettrack(_use,_no+1); if(hi==NULL) return 1; /* track not there */ if(lo==NULL) return -1; /* it's the lowest track */ lo->number--; hi->number++; return 0; }; gint gdrdao_tocedit_sorttracks(struct gdrdao_toceditor* _use) { struct gdrdao_trackentry** tmp; struct gdrdao_trackentry* q; register long i,ii; long counter, lowest; if(_use==NULL) return 0; if(_use->tracks<0) return 1; if(_use->tracks==0) return 0; tmp=(struct gdrdao_trackentry**)g_malloc(sizeof( struct gdrdao_trackentry*)*_use->tracks); q=_use->track; counter=1; lowest=0; for(i=0;i<_use->tracks;++i) { tmp[i]=q; q=q->next; }; for(i=0;i<_use->tracks-1;++i) { for(ii=0;ii<_use->tracks-1;++ii) if(tmp[ii]->number>tmp[ii+1]->number) { q=tmp[ii]; tmp[ii]=tmp[ii+1]; tmp[ii+1]=q; }; }; q=tmp[0]; for(i=0;i<_use->tracks;++i) { if(i==0) { /* first entry */ q->prev=NULL; } else { q->prev=tmp[i-1]; }; if(i==_use->tracks-1) { /* last entry */ q->next=NULL; break; } else { q->next=tmp[i+1]; }; q=q->next; }; _use->track=tmp[0]; free(tmp); return 0; }; gint gdrdao_tocedit_dump__(struct gdrdao_toceditor* _use) { struct gdrdao_trackentry* tmp; tmp=_use->track; while(tmp) { printf("%i %s\n",tmp->number,tmp->trackfile); tmp=tmp->next; }; return 0; }; struct gdrdao_trackentry* gdrdao_tocedit_gettrack( struct gdrdao_toceditor* _use, gint _no) { register long i; struct gdrdao_trackentry* tmp; if(_use==NULL||_no<0) return NULL; tmp=_use->track; for(i=0;i<_use->tracks;++i) { if(tmp->number==_no) return tmp; tmp=tmp->next; }; return NULL; }; gint gdrdao_trackentry_init(struct gdrdao_trackentry* _use) { register long i; if(_use==NULL) return 1; _use->number=-1; _use->trackfile=NULL; strcpy(_use->comment,""); _use->type=-1; _use->premin=0; _use->presec=0; _use->prefrm=0; _use->silmin=0; _use->silsec=0; _use->silfrm=0; _use->strmin=0; _use->strsec=0; _use->strfrm=0; _use->endmin=0; _use->endsec=0; _use->endfrm=0; _use->lmin=0; _use->lsec=0; _use->lfrm=0; _use->flenmin=0; _use->flensec=0; _use->flenfrm=0; _use->preemph=FALSE; _use->copy=FALSE; strcpy(_use->isrc,"000000000000"); _use->next=NULL; _use->prev=NULL; _use->pregap=(struct gdrdao_toceditor*)g_malloc(sizeof(struct gdrdao_toceditor)); gdrdao_tocedit_init(_use->pregap); for(i=0;i<8;++i) { gdrdao_cdtext_init(&_use->cdtext[i]); gdrdao_cdtext_clear(&_use->cdtext[i]); }; return 0; }; gint gdrdao_trackentry_clear(struct gdrdao_trackentry* _use) { register long i; if(_use==NULL) return 1; if(_use->trackfile!=NULL) free(_use->trackfile); _use->trackfile=NULL; strcpy(_use->comment,""); _use->number=-1; _use->type=-1; _use->premin=0; _use->presec=0; _use->prefrm=0; _use->silmin=0; _use->silsec=0; _use->silfrm=0; _use->strmin=0; _use->strsec=0; _use->strfrm=0; _use->endmin=0; _use->endsec=0; _use->endfrm=0; _use->lmin=0; _use->lsec=0; _use->lfrm=0; _use->flenmin=0; _use->flensec=0; _use->flenfrm=0; _use->preemph=FALSE; _use->copy=FALSE; strcpy(_use->isrc,"000000000000"); _use->next=NULL; _use->prev=NULL; if(_use->pregap!=NULL) free(_use->pregap); _use->pregap=NULL; for(i=0;i<8;++i) gdrdao_cdtext_clear(&_use->cdtext[i]); return 0; }; gint gdrdao_trackentry_setfile(struct gdrdao_trackentry* _use, gchar* _set) { if(_use==NULL) return 1; if(_use->trackfile!=0) free(_use->trackfile); _use->trackfile=(gchar*)malloc(sizeof(gchar)*strlen(_set)+1); strcpy(_use->trackfile,_set); return 0; }; gchar* gdrdao_trackentry_getfile(struct gdrdao_trackentry* _use) { if(_use==NULL) return NULL; return _use->trackfile; }; gint gdrdao_cdtext_init(struct gdrdao_track_cdtext* _use) { if (_use==NULL) return 1; strcpy(_use->title,""); strcpy(_use->performer,""); strcpy(_use->songwriter,""); strcpy(_use->composer,""); strcpy(_use->arranger,""); strcpy(_use->message,""); strcpy(_use->disc_id,""); strcpy(_use->genre,""); strcpy(_use->toc_info1,""); strcpy(_use->toc_info2,""); strcpy(_use->upc_ean,""); strcpy(_use->isrc,""); strcpy(_use->size_info,""); return 0; }; gint gdrdao_cdtext_clear(struct gdrdao_track_cdtext* _use) { return gdrdao_cdtext_init(_use); }; gint gdrdao_lmap_init(struct gdrdao_track_cdtext_lmap* _use) { register long i; for(i=0;i<8;++i) _use->map[i]=NA; return 0; }; gint gdrdao_lmap_clear(struct gdrdao_track_cdtext_lmap* _use) { return gdrdao_lmap_init(_use); };