bool RDRenderer::renderToFile(const QString &outfile,RDLogEvent *log, RDSettings *s,const QTime &start_time, bool ignore_stops,QString *err_msg, int first_line,int last_line, const QTime &first_time,const QTime &last_time) { QString temp_output_filename; char tempdir[PATH_MAX]; bool ok=false; FILE *f=NULL; bool ret; // // Verify Destination // if((f=fopen(outfile,"w"))==NULL) { *err_msg=tr("unable to open output file")+" ["+QString(strerror(errno))+"]"; return false; } fclose(f); if(((s->format()!=RDSettings::Pcm16)&&(s->format()!=RDSettings::Pcm24))|| (s->normalizationLevel()!=0)) { ProgressMessage("Pass 1 of 2"); render_total_passes=2; // // Get Temporary File // strncpy(tempdir,RDTempDirectory::basePath()+"/rdrenderXXXXXX",PATH_MAX); temp_output_filename=QString(mkdtemp(tempdir))+"/log.wav"; ProgressMessage(tr("Using temporary file")+" \""+temp_output_filename+"\"."); // // Render It // if(!Render(temp_output_filename,log,s,start_time,ignore_stops,err_msg, first_line,last_line,first_time,last_time)) { return false; } // // Convert It // ProgressMessage(tr("Pass 2 of 2")); ProgressMessage(tr("Writing output file")); ok=ConvertAudio(temp_output_filename,outfile,s,err_msg); DeleteTempFile(temp_output_filename); emit lineStarted(log->size()+1,log->size()+1); if(!ok) { return false; } } else { ProgressMessage(tr("Pass 1 of 1")); render_total_passes=1; ret=Render(outfile,log,s,start_time,ignore_stops,err_msg, first_line,last_line,first_time,last_time); emit lineStarted(log->size(),log->size()); return ret; } return true; }
void *ConvertThread(void *ctxt) { int nIsDir = 0; ENCODE_AUDIO_TYPE eAudioType; for(;;) { if(ConvertTask.nItemCount == 0) { break; } /*get encode item from the global var.*/ if((ConvertTask.eItemStatus == ITEM_INIT) &&(ConvertTask.CurEncodeItem.objID) &&(ConvertTask.CurEncodeItem.ptrAudioFormat) &&(ConvertTask.CurEncodeItem.ptrFormatCfg) ) { ZLock(&(ConvertTask.TaskItemLock)); ConvertTask.eThreadStatus = THREAD_START; ConvertTask.eItemStatus = ITEM_ENCODING; /*get the track path throught check the loacal database.*/ initMetaTrack(&(ConvertTask.TrackMeta)); /* Updated by Ke tao 2008-12-12*/ ZDBRipFindTrackMetadata(ConvertTask.ptrDBHandle, ConvertTask.CurEncodeItem.objID, &(ConvertTask.TrackMeta)); if(!ZUtilIsFilePresent(ConvertTask.TrackMeta.path, &nIsDir) || nIsDir || !checkExt(ConvertTask.TrackMeta.path, "wav")) /*if the track path isn't exists, as the normal quit*/ { DeletePendingTask(ENCPENDING, &ConvertTask.CurEncodeItem); ConvertTask.eItemStatus = ITEM_ENCODED; ConvertTask.eThreadStatus = THREAD_FINISHED; freeMetaTrack(&(ConvertTask.TrackMeta)); ZUnlock(&(ConvertTask.TaskItemLock)); continue; } ZFREE(ConvertTask.DiscAudioSrcPath); ZFREE(ConvertTask.DiscEncodePath); ConvertTask.DiscAudioSrcPath = strdup(ConvertTask.TrackMeta.path); ConvertTask.DiscEncodePath = calloc(sizeof(char), (strlen(ConvertTask.DiscAudioSrcPath)+BUF_64_BITS)); freeMetaTrack(&(ConvertTask.TrackMeta)); ZUnlock(&(ConvertTask.TaskItemLock)); } else { sleep(1); continue; } /*convert audio file to the eAudioType type.*/ eAudioType = GetAudioType(ConvertTask.CurEncodeItem.ptrAudioFormat); ConvertTask.eThreadStatus = THREAD_RUNNING; if(ConvertAudio(eAudioType, &ConvertTask.CurEncodeItem, ConvertTask.DiscAudioSrcPath, ConvertTask.DiscEncodePath) == ZAPP_FAILED) { ZLock(&(ConvertTask.TaskItemLock)); DeletePendingTask(ENCPENDING, &(ConvertTask.CurEncodeItem)); ConvertTask.eItemStatus = ITEM_ENCODED; ConvertTask.eThreadStatus = THREAD_FINISHED; ZFREE(ConvertTask.DiscAudioSrcPath); ZFREE(ConvertTask.DiscEncodePath); ZUnlock(&(ConvertTask.TaskItemLock)); continue; } /*write ID3 tag according the database.*/ if((eAudioType == MP3_AUDIO)||(eAudioType == FLAC_AUDIO)) { initMetaTrack(&(ConvertTask.TrackMeta)); /* Updated by Ke Tao 2008-12-12 */ ZDBRipFindTrackMetadata(ConvertTask.ptrDBHandle, ConvertTask.CurEncodeItem.objID, &(ConvertTask.TrackMeta)); WriteID3Tag(ConvertTask.DiscEncodePath, &(ConvertTask.TrackMeta)); freeMetaTrack(&(ConvertTask.TrackMeta)); } /*set update task to the zriptask database's updatapending table.*/ ZLock(&(ConvertTask.TaskItemLock)); ZFREE(ConvertTask.UpdateItem.objID); ZFREE(ConvertTask.UpdateItem.ptrAudioFormat); ZFREE(ConvertTask.UpdateItem.ptrWavPath); ZFREE(ConvertTask.UpdateItem.ptrEncPath); ConvertTask.UpdateItem.objID = strdup(ConvertTask.CurEncodeItem.objID); ConvertTask.UpdateItem.ptrAudioFormat = strdup(ConvertTask.CurEncodeItem.ptrAudioFormat); ConvertTask.UpdateItem.ptrWavPath = strdup(ConvertTask.DiscAudioSrcPath); ConvertTask.UpdateItem.ptrEncPath = strdup(ConvertTask.DiscEncodePath); InsertPendingTask(UPDATEPENDING, &(ConvertTask.UpdateItem)); /*Delete task to the zriptask database's EncPending table.*/ DeletePendingTask(ENCPENDING, &ConvertTask.CurEncodeItem); ConvertTask.eItemStatus = ITEM_ENCODED; ConvertTask.eThreadStatus = THREAD_FINISHED; ZUnlock(&(ConvertTask.TaskItemLock)); } return NULL; }