/* * Initialize and launch process object */ bool AbstractTool::startProcess(QProcess &process, const QString &program, const QStringList &args) { static AssignProcessToJobObjectFun AssignProcessToJobObjectPtr = NULL; QMutexLocker lock(m_mutex_startProcess); emit messageLogged(commandline2string(program, args) + "\n"); QProcessEnvironment env = process.processEnvironment(); if(env.isEmpty()) env = QProcessEnvironment::systemEnvironment(); env.insert("TEMP", QDir::toNativeSeparators(lamexp_temp_folder2())); env.insert("TMP", QDir::toNativeSeparators(lamexp_temp_folder2())); process.setProcessEnvironment(env); if(!AssignProcessToJobObjectPtr) { QLibrary Kernel32Lib("kernel32.dll"); AssignProcessToJobObjectPtr = (AssignProcessToJobObjectFun) Kernel32Lib.resolve("AssignProcessToJobObject"); } process.setProcessChannelMode(QProcess::MergedChannels); process.setReadChannel(QProcess::StandardOutput); process.start(program, args); if(process.waitForStarted()) { if(AssignProcessToJobObjectPtr) { AssignProcessToJobObjectPtr(m_handle_jobObject, process.pid()->hProcess); } if(!SetPriorityClass(process.pid()->hProcess, BELOW_NORMAL_PRIORITY_CLASS)) { SetPriorityClass(process.pid()->hProcess, IDLE_PRIORITY_CLASS); } lock.unlock(); if(m_firstLaunch) { emit statusUpdated(0); m_firstLaunch = false; } return true; } emit messageLogged("Process creation has failed :-("); QString errorMsg= process.errorString().trimmed(); if(!errorMsg.isEmpty()) emit messageLogged(errorMsg); process.kill(); process.waitForFinished(-1); return false; }
extern "C" void _lamexp_global_free_utils(void) { //Delete temporary files const QString &tempFolder = lamexp_temp_folder2(); if(!tempFolder.isEmpty()) { bool success = false; for(int i = 0; i < 100; i++) { if(lamexp_clean_folder(tempFolder)) { success = true; break; } lamexp_sleep(100); } if(!success) { lamexp_system_message(L"Sorry, LameXP was unable to clean up all temporary files. Some residual files in your TEMP directory may require manual deletion!", lamexp_beep_warning); lamexp_exec_shell(NULL, tempFolder, QString(), QString(), true); } } //Free memory LAMEXP_DELETE(g_lamexp_temp_folder.path); LAMEXP_DELETE(g_lamexp_app_icon.appIcon); }
void AnalyzeTask::retrieveCover(AudioFileModel &audioFile, cover_t coverType, const QByteArray &coverData) { qDebug("Retrieving cover!"); QString extension; switch(coverType) { case coverPng: extension = QString::fromLatin1("png"); break; case coverGif: extension = QString::fromLatin1("gif"); break; default: extension = QString::fromLatin1("jpg"); break; } if(!(QImage::fromData(coverData, extension.toUpper().toLatin1().constData()).isNull())) { QFile coverFile(QString("%1/%2.%3").arg(lamexp_temp_folder2(), lamexp_rand_str(), extension)); if(coverFile.open(QIODevice::WriteOnly)) { coverFile.write(coverData); coverFile.close(); audioFile.metaInfo().setCover(coverFile.fileName(), true); } } else { qWarning("Image data seems to be invalid :-("); } }
bool FileAnalyzer::createTemplate(void) { if(m_templateFile) { qWarning("Template file already exists!"); return true; } QString templatePath = QString("%1/%2.txt").arg(lamexp_temp_folder2(), lamexp_rand_str()); QFile templateFile(templatePath); if(!templateFile.open(QIODevice::WriteOnly)) { return false; } templateFile.write("General;"); for(size_t i = 0; g_tags_gen[i]; i++) { templateFile.write(QString("Gen_%1=%%1%\\n").arg(g_tags_gen[i]).toLatin1().constData()); } templateFile.write("\\n\r\n"); templateFile.write("Audio;"); for(size_t i = 0; g_tags_aud[i]; i++) { templateFile.write(QString("Aud_%1=%%1%\\n").arg(g_tags_aud[i]).toLatin1().constData()); } templateFile.write("\\n\r\n"); bool success = (templateFile.error() == QFile::NoError); templateFile.close(); if(!success) { QFile::remove(templatePath); return false; } try { m_templateFile = new LockedFile(templatePath); } catch(...) { qWarning("Failed to lock template file!"); return false; } return true; }
/* * Setup QPorcess object */ void lamexp_init_process(QProcess &process, const QString &wokringDir, const bool bReplaceTempDir) { //Environment variable names static const char *const s_envvar_names_temp[] = { "TEMP", "TMP", "TMPDIR", "HOME", "USERPROFILE", "HOMEPATH", NULL }; static const char *const s_envvar_names_remove[] = { "WGETRC", "SYSTEM_WGETRC", "HTTP_PROXY", "FTP_PROXY", "NO_PROXY", "GNUPGHOME", "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MESSAGES", "LC_MONETARY", "LC_NUMERIC", "LC_TIME", "LANG", NULL }; //Initialize environment QProcessEnvironment env = process.processEnvironment(); if(env.isEmpty()) env = QProcessEnvironment::systemEnvironment(); //Clean a number of enviroment variables that might affect our tools for(size_t i = 0; s_envvar_names_remove[i]; i++) { env.remove(QString::fromLatin1(s_envvar_names_remove[i])); env.remove(QString::fromLatin1(s_envvar_names_remove[i]).toLower()); } const QString tempDir = QDir::toNativeSeparators(lamexp_temp_folder2()); //Replace TEMP directory in environment if(bReplaceTempDir) { for(size_t i = 0; s_envvar_names_temp[i]; i++) { env.insert(s_envvar_names_temp[i], tempDir); } } //Setup PATH variable const QString path = env.value("PATH", QString()).trimmed(); env.insert("PATH", path.isEmpty() ? tempDir : QString("%1;%2").arg(tempDir, path)); //Setup QPorcess object process.setWorkingDirectory(wokringDir); process.setProcessChannelMode(QProcess::MergedChannels); process.setReadChannel(QProcess::StandardOutput); process.setProcessEnvironment(env); }
bool QAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo &metaInfo, const unsigned int duration, const QString &outputFile, volatile bool *abortFlag) { QProcess process; QStringList args; process.setWorkingDirectory(QFileInfo(outputFile).canonicalPath()); QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("PATH", QDir::toNativeSeparators(QString("%1;%1/QTfiles;%2").arg(QDir(QCoreApplication::applicationDirPath()).canonicalPath(), lamexp_temp_folder2()))); process.setProcessEnvironment(env); if(m_configRCMode != SettingsModel::VBRMode) { switch(m_configProfile) { case 2: case 3: args << "--he"; //Forces use of HE AAC profile (there is no explicit HEv2 switch for QAAC) break; } } switch(m_configRCMode) { case SettingsModel::CBRMode: args << "--cbr" << QString::number(qBound(8, index2bitrate(m_configBitrate), 576)); break; case SettingsModel::ABRMode: args << "--abr" << QString::number(qBound(8, index2bitrate(m_configBitrate), 576)); break; case SettingsModel::VBRMode: args << "--tvbr" << QString::number(g_qaacVBRQualityLUT[qBound(0, m_configBitrate , 14)]); break; default: THROW("Bad rate-control mode!"); break; } if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); if(!metaInfo.title().isEmpty()) args << "--title" << cleanTag(metaInfo.title()); if(!metaInfo.artist().isEmpty()) args << "--artist" << cleanTag(metaInfo.artist()); if(!metaInfo.album().isEmpty()) args << "--album" << cleanTag(metaInfo.album()); if(!metaInfo.genre().isEmpty()) args << "--genre" << cleanTag(metaInfo.genre()); if(!metaInfo.comment().isEmpty()) args << "--comment" << cleanTag( metaInfo.comment()); if(metaInfo.year()) args << "--date" << QString::number(metaInfo.year()); if(metaInfo.position()) args << "--track" << QString::number(metaInfo.position()); if(!metaInfo.cover().isEmpty()) args << "--artwork" << metaInfo.cover(); args << "-d" << "."; args << "-o" << QDir::toNativeSeparators(outputFile); args << QDir::toNativeSeparators(sourceFile); if(!startProcess(process, m_binary_qaac, args)) { return false; } bool bTimeout = false; bool bAborted = false; int prevProgress = -1; QRegExp regExp("\\[(\\d+)\\.(\\d)%\\]"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("QAAC process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { bool ok = false; int progress = regExp.cap(1).toInt(&ok); if(ok && (progress > prevProgress)) { emit statusUpdated(progress); prevProgress = qMin(progress + 2, 99); } } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS) { return false; } return true; }
void ProcessingDialog::initEncoding(void) { qDebug("Initializing encoding process..."); m_runningThreads = 0; m_currentFile = 0; m_allJobs.clear(); m_succeededJobs.clear(); m_failedJobs.clear(); m_skippedJobs.clear(); m_userAborted = false; m_forcedAbort = false; m_playList.clear(); DecoderRegistry::configureDecoders(m_settings); CHANGE_BACKGROUND_COLOR(ui->frame_header, QColor(Qt::white)); SET_PROGRESS_TEXT(tr("Encoding files, please wait...")); m_progressIndicator->start(); ui->button_closeDialog->setEnabled(false); ui->button_AbortProcess->setEnabled(true); ui->progressBar->setRange(0, m_pendingJobs.count()); ui->checkBox_shutdownComputer->setEnabled(true); ui->checkBox_shutdownComputer->setChecked(false); WinSevenTaskbar::setTaskbarState(this, WinSevenTaskbar::WinSevenTaskbarNormalState); WinSevenTaskbar::setTaskbarProgress(this, 0, m_pendingJobs.count()); WinSevenTaskbar::setOverlayIcon(this, &QIcon(":/icons/control_play_blue.png")); if(!m_diskObserver) { m_diskObserver = new DiskObserverThread(m_settings->customTempPathEnabled() ? m_settings->customTempPath() : lamexp_temp_folder2()); connect(m_diskObserver, SIGNAL(messageLogged(QString,int)), m_progressModel, SLOT(addSystemMessage(QString,int)), Qt::QueuedConnection); connect(m_diskObserver, SIGNAL(freeSpaceChanged(quint64)), this, SLOT(diskUsageHasChanged(quint64)), Qt::QueuedConnection); m_diskObserver->start(); } if(!m_cpuObserver) { m_cpuObserver = new CPUObserverThread(); connect(m_cpuObserver, SIGNAL(currentUsageChanged(double)), this, SLOT(cpuUsageHasChanged(double)), Qt::QueuedConnection); m_cpuObserver->start(); }