From 571df62e39b16e4e2fce46c406ebaa2dfe932dab Mon Sep 17 00:00:00 2001 From: lordmulder Date: Wed, 24 Nov 2010 21:00:59 +0100 Subject: [PATCH] Implement support for Job Objects + improve log view. --- gui/LogViewDialog.ui | 368 ++++++++++++++++++++++++++++---------- res/Images.qrc | 1 + res/images/HeaderIcon_LogFile.png | Bin 0 -> 21994 bytes src/Config.h | 2 +- src/Dialog_LogView.cpp | 2 + src/Dialog_MainWindow.cpp | 20 +++ src/Dialog_MainWindow.h | 2 + src/Dialog_Processing.cpp | 33 +++- src/Dialog_Processing.h | 4 + src/Encoder_Abstract.cpp | 56 +++++- src/Encoder_Abstract.h | 12 ++ src/Encoder_MP3.cpp | 19 +- src/Encoder_MP3.h | 4 - src/Main.cpp | 20 +-- 14 files changed, 413 insertions(+), 130 deletions(-) create mode 100644 res/images/HeaderIcon_LogFile.png diff --git a/gui/LogViewDialog.ui b/gui/LogViewDialog.ui index ea0e5139..4a9eb201 100644 --- a/gui/LogViewDialog.ui +++ b/gui/LogViewDialog.ui @@ -10,13 +10,13 @@ 0 0 640 - 512 + 384 640 - 512 + 384 @@ -26,154 +26,338 @@ :/icons/application_xp_terminal.png:/icons/application_xp_terminal.png - - - - - + + + 0 + + + 0 + + + + + 0 + + + + + + 0 + 64 + + + + + 16777215 + 64 + + - + - 170 + 255 255 - 0 + 255 - + - 0 - 31 - 0 + 255 + 255 + 255 - + - 170 + 255 255 - 0 + 255 - + - 0 - 31 - 0 + 255 + 255 + 255 - + - 120 - 120 - 120 + 255 + 255 + 255 - + - 240 - 240 - 240 + 255 + 255 + 255 - - - Lucida Console - + + true - - C:\DOS -C:\DOS\RUN -RUN\DOS\RUN - - - - Qt::NoTextInteraction + + QFrame::NoFrame + + + 3 + + + + + + + + 56 + 56 + + + + + 56 + 56 + + + + + + + :/images/HeaderIcon_LogFile.png + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 15 + 20 + + + + + + + + <b>Log File</b><br>The log file shows detailed information about the selected job. + + + + + + - - + + - 90 - 0 + 0 + 2 - - Discard - - - - :/icons/cross.png:/icons/cross.png - - - - - - + - 130 - 0 + 16777215 + 2 - - Save to File... + + QFrame::HLine - - - :/icons/disk.png:/icons/disk.png + + QFrame::Sunken - - - - Qt::Horizontal + + + + 10 - - - 40 - 20 - + + 6 - - - - - - - 130 - 0 - - - - Copy to Clipboard - - - - :/icons/paste_plain.png:/icons/paste_plain.png - - + + + + + + + + + 170 + 255 + 0 + + + + + + + 0 + 31 + 0 + + + + + + + + + 170 + 255 + 0 + + + + + + + 0 + 31 + 0 + + + + + + + + + 120 + 120 + 120 + + + + + + + 240 + 240 + 240 + + + + + + + + + Lucida Console + + + + C:\DOS +C:\DOS\RUN +RUN\DOS\RUN + + + + Qt::NoTextInteraction + + + + + + + + 90 + 0 + + + + Discard + + + + :/icons/cross.png:/icons/cross.png + + + + + + + + 130 + 0 + + + + Save to File... + + + + :/icons/disk.png:/icons/disk.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 130 + 0 + + + + Copy to Clipboard + + + + :/icons/paste_plain.png:/icons/paste_plain.png + + + + @@ -181,6 +365,8 @@ RUN\DOS\RUN + + diff --git a/res/Images.qrc b/res/Images.qrc index 9fe1e8cc..6249dadd 100644 --- a/res/Images.qrc +++ b/res/Images.qrc @@ -3,6 +3,7 @@ images/Busy.gif images/HeaderIcon_MetaInfo.png + images/HeaderIcon_LogFile.png images/Label.png images/Loading.gif images/Logo.png diff --git a/res/images/HeaderIcon_LogFile.png b/res/images/HeaderIcon_LogFile.png new file mode 100644 index 0000000000000000000000000000000000000000..67e098593cd439d3ce3941d653ea9d5570996dbc GIT binary patch literal 21994 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 Z{o~*G2_&O2py7J%j;ZC1I%9bJ{{Wi^sPg~- literal 0 HcmV?d00001 diff --git a/src/Config.h b/src/Config.h index d3bb937e..813275ad 100644 --- a/src/Config.h +++ b/src/Config.h @@ -25,7 +25,7 @@ #define VER_LAMEXP_MAJOR 4 #define VER_LAMEXP_MINOR_HI 0 #define VER_LAMEXP_MINOR_LO 0 -#define VER_LAMEXP_BUILD 70 +#define VER_LAMEXP_BUILD 74 #define VER_LAMEXP_SUFFIX TechPreview /* diff --git a/src/Dialog_LogView.cpp b/src/Dialog_LogView.cpp index 1deab260..d5c73d31 100644 --- a/src/Dialog_LogView.cpp +++ b/src/Dialog_LogView.cpp @@ -23,6 +23,7 @@ #include #include +#include LogViewDialog::LogViewDialog(QWidget *parent) : @@ -64,6 +65,7 @@ void LogViewDialog::copyButtonClicked(void) mime->setData("text/plain", textEdit->toPlainText().toUtf8().constData()); QApplication::clipboard()->setMimeData(mime); m_clipboardUsed = true; + MessageBeep(MB_ICONINFORMATION); } void LogViewDialog::saveButtonClicked(void) diff --git a/src/Dialog_MainWindow.cpp b/src/Dialog_MainWindow.cpp index 6d8f8fa9..8547aa8e 100644 --- a/src/Dialog_MainWindow.cpp +++ b/src/Dialog_MainWindow.cpp @@ -132,6 +132,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S m_fileSystemModel = new QFileSystemModel(); m_fileSystemModel->setFilter(QDir::Dirs | QDir::NoDotAndDotDot); m_fileSystemModel->setRootPath(m_fileSystemModel->rootPath()); + m_fileSystemModel->installEventFilter(this); outputFolderView->setModel(m_fileSystemModel); outputFolderView->header()->setStretchLastSection(true); outputFolderView->header()->hideSection(1); @@ -393,6 +394,17 @@ void MainWindow::resizeEvent(QResizeEvent *event) m_dropNoteLabel->setGeometry(0, 0, sourceFileView->width(), sourceFileView->height()); } +bool MainWindow::eventFilter(QObject *obj, QEvent *event) +{ + if(obj == m_fileSystemModel) + { + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + QTimer::singleShot(0, this, SLOT(restoreCursor())); + } + + return false; +} + //////////////////////////////////////////////////////////// // Slots //////////////////////////////////////////////////////////// @@ -1111,3 +1123,11 @@ void MainWindow::saveToSourceFolderChanged(void) { m_settings->outputToSourceDir(saveToSourceFolderCheckBox->isChecked()); } + +/* + * Restore the override cursor + */ +void MainWindow::restoreCursor(void) +{ + QApplication::restoreOverrideCursor(); +} diff --git a/src/Dialog_MainWindow.h b/src/Dialog_MainWindow.h index a01c06a2..87153907 100644 --- a/src/Dialog_MainWindow.h +++ b/src/Dialog_MainWindow.h @@ -80,6 +80,7 @@ private slots: void metaTagsEnabledChanged(void); void playlistEnabledChanged(void); void saveToSourceFolderChanged(void); + void restoreCursor(void); protected: void showEvent(QShowEvent *event); @@ -87,6 +88,7 @@ protected: void dropEvent(QDropEvent *event); void closeEvent(QCloseEvent *event); void resizeEvent(QResizeEvent *event); + bool eventFilter(QObject *obj, QEvent *event); private: void addFiles(const QStringList &files); diff --git a/src/Dialog_Processing.cpp b/src/Dialog_Processing.cpp index de7952fe..4a6058a1 100644 --- a/src/Dialog_Processing.cpp +++ b/src/Dialog_Processing.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include @@ -90,6 +91,13 @@ ProcessingDialog::ProcessingDialog(FileListModel *fileListModel, AudioFileModel connect(m_progressModel, SIGNAL(modelReset()), this, SLOT(progressModelChanged())); connect(view_log, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(logViewDoubleClicked(QModelIndex))); + //Create context menu + m_contextMenu = new QMenu(); + QAction *contextMenuAction = m_contextMenu->addAction(QIcon(":/icons/zoom.png"), "Show details for selected job"); + view_log->setContextMenuPolicy(Qt::CustomContextMenu); + connect(view_log, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuTriggered(QPoint))); + connect(contextMenuAction, SIGNAL(triggered(bool)), this, SLOT(contextMenuActionTriggered())); + //Enque jobs if(fileListModel) { @@ -117,6 +125,7 @@ ProcessingDialog::~ProcessingDialog(void) if(m_progressIndicator) m_progressIndicator->stop(); LAMEXP_DELETE(m_progressIndicator); LAMEXP_DELETE(m_progressModel); + LAMEXP_DELETE(m_contextMenu); while(!m_threadList.isEmpty()) { @@ -194,8 +203,12 @@ void ProcessingDialog::initEncoding(void) button_AbortProcess->setEnabled(true); progressBar->setRange(0, m_pendingJobs.count()); - startNextJob(); //TODO: Start as many jobs in parallel as processors available - startNextJob(); + lamexp_cpu_t cpuFeatures = lamexp_detect_cpu_features(); + + for(int i = 0; i < min(max(cpuFeatures.count, 1), 4); i++) + { + startNextJob(); + } } void ProcessingDialog::abortEncoding(void) @@ -292,9 +305,25 @@ void ProcessingDialog::logViewDoubleClicked(const QModelIndex &index) { const QStringList &logFile = m_progressModel->getLogFile(index); LogViewDialog *logView = new LogViewDialog(this); + logView->setWindowTitle(QString("LameXP - %1").arg(m_progressModel->data(index, Qt::DisplayRole).toString())); logView->exec(logFile); LAMEXP_DELETE(logView); } + else + { + MessageBeep(MB_ICONWARNING); + } +} + +void ProcessingDialog::contextMenuTriggered(const QPoint &pos) +{ + m_contextMenu->popup(view_log->mapToGlobal(pos)); +} + +void ProcessingDialog::contextMenuActionTriggered(void) +{ + QModelIndex index = view_log->indexAt(view_log->mapFromGlobal(m_contextMenu->pos())); + logViewDoubleClicked(index.isValid() ? index : view_log->currentIndex()); } //////////////////////////////////////////////////////////// diff --git a/src/Dialog_Processing.h b/src/Dialog_Processing.h index 5fe602bd..69626cff 100644 --- a/src/Dialog_Processing.h +++ b/src/Dialog_Processing.h @@ -26,6 +26,7 @@ #include class QMovie; +class QMenu; class ProgressModel; class ProcessThread; class FileListModel; @@ -47,6 +48,8 @@ private slots: void processFinished(const QUuid &jobId, const QString &outFileName, bool success); void progressModelChanged(void); void logViewDoubleClicked(const QModelIndex &index); + void contextMenuTriggered(const QPoint &pos); + void contextMenuActionTriggered(void); protected: void showEvent(QShowEvent *event); @@ -66,6 +69,7 @@ private: QMovie *m_progressIndicator; ProgressModel *m_progressModel; QStringList m_playList; + QMenu *m_contextMenu; unsigned int m_runningThreads; unsigned int m_currentFile; unsigned int m_succeededFiles; diff --git a/src/Encoder_Abstract.cpp b/src/Encoder_Abstract.cpp index fdd44c6e..de965e24 100644 --- a/src/Encoder_Abstract.cpp +++ b/src/Encoder_Abstract.cpp @@ -22,12 +22,36 @@ #include "Encoder_Abstract.h" #include +#include +#include +#include +#include #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) +QMutex *AbstractEncoder::m_mutex_startProcess = NULL; +HANDLE AbstractEncoder::m_handle_jobObject = NULL; + AbstractEncoder::AbstractEncoder(void) { + if(!m_mutex_startProcess) + { + m_mutex_startProcess = new QMutex(); + } + + if(!m_handle_jobObject) + { + m_handle_jobObject = CreateJobObject(NULL, NULL); + if(m_handle_jobObject) + { + JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobExtendedLimitInfo; + memset(&jobExtendedLimitInfo, 0, sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); + jobExtendedLimitInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION; + SetInformationJobObject(m_handle_jobObject, JobObjectExtendedLimitInformation, &jobExtendedLimitInfo, sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); + } + } + m_configBitrate = 0; m_configRCMode = 0; } @@ -36,10 +60,40 @@ AbstractEncoder::~AbstractEncoder(void) { } -//Setters +/* + * Setters + */ + void AbstractEncoder::setBitrate(int bitrate) { m_configBitrate = max(0, bitrate); } void AbstractEncoder::setRCMode(int mode) { m_configRCMode = max(0, mode); } +/* + * Auxiliary functions + */ + +bool AbstractEncoder::startProcess(QProcess &process, const QString &program, const QStringList &args) +{ + QMutexLocker lock(m_mutex_startProcess); + + emit messageLogged(commandline2string(program, args) + "\n"); + + process.setProcessChannelMode(QProcess::MergedChannels); + process.setReadChannel(QProcess::StandardOutput); + process.start(program, args); + + if(process.waitForStarted()) + { + + AssignProcessToJobObject(m_handle_jobObject, process.pid()->hProcess); + SetPriorityClass(process.pid()->hProcess, BELOW_NORMAL_PRIORITY_CLASS); + lock.unlock(); + emit statusUpdated(0); + return true; + } + + return false; +} + QString AbstractEncoder::commandline2string(const QString &program, const QStringList &arguments) { QString commandline = (program.contains(' ') ? QString("\"%1\"").arg(program) : program); diff --git a/src/Encoder_Abstract.h b/src/Encoder_Abstract.h index dc8b2f2d..ff0507a8 100644 --- a/src/Encoder_Abstract.h +++ b/src/Encoder_Abstract.h @@ -25,6 +25,10 @@ #include +class QProcess; +class QStringList; +class QMutex; + class AbstractEncoder : public QObject { Q_OBJECT @@ -39,10 +43,18 @@ public: void setBitrate(int bitrate); void setRCMode(int mode); + bool startProcess(QProcess &process, const QString &program, const QStringList &args); static QString commandline2string(const QString &program, const QStringList &arguments); +signals: + void statusUpdated(int progress); + void messageLogged(const QString &line); + protected: int m_configBitrate; int m_configRCMode; +private: + static QMutex *m_mutex_startProcess; + static void *m_handle_jobObject; }; diff --git a/src/Encoder_MP3.cpp b/src/Encoder_MP3.cpp index 31181afb..f56131c4 100644 --- a/src/Encoder_MP3.cpp +++ b/src/Encoder_MP3.cpp @@ -45,14 +45,10 @@ MP3Encoder::~MP3Encoder(void) bool MP3Encoder::encode(const AudioFileModel &sourceFile, const QString &outputFile, volatile bool *abortFlag) { - const QString baseName = QFileInfo(outputFile).fileName(); - emit statusUpdated(0); - QProcess process; - process.setProcessChannelMode(QProcess::MergedChannels); - process.setReadChannel(QProcess::StandardOutput); - + const QString baseName = QFileInfo(outputFile).fileName(); QStringList args; + args << "--nohist"; args << "-h"; @@ -86,11 +82,7 @@ bool MP3Encoder::encode(const AudioFileModel &sourceFile, const QString &outputF args << QDir::toNativeSeparators(sourceFile.filePath()); args << QDir::toNativeSeparators(outputFile); - emit messageLogged(commandline2string(m_binary, args)); - emit messageLogged(QString()); - - process.start(m_binary, args); - if(!process.waitForStarted()) + if(!startProcess(process, m_binary, args)) { return false; } @@ -106,6 +98,7 @@ bool MP3Encoder::encode(const AudioFileModel &sourceFile, const QString &outputF { process.kill(); bAborted = true; + emit messageLogged("ABORTED BY USER !!!"); break; } process.waitForReadyRead(); @@ -128,7 +121,7 @@ bool MP3Encoder::encode(const AudioFileModel &sourceFile, const QString &outputF } else if(!text.isEmpty()) { - emit messageLogged(text); //qDebug("%s", text.toUtf8().constData()); + emit messageLogged(text); } } } @@ -139,6 +132,8 @@ bool MP3Encoder::encode(const AudioFileModel &sourceFile, const QString &outputF process.kill(); process.waitForFinished(-1); } + + emit messageLogged(QString().sprintf("\n--> Exited with code: 0x%08x", process.exitCode())); if(bTimeout || bAborted || process.exitStatus() != QProcess::NormalExit) { diff --git a/src/Encoder_MP3.h b/src/Encoder_MP3.h index 677a4cf5..7c99cce6 100644 --- a/src/Encoder_MP3.h +++ b/src/Encoder_MP3.h @@ -36,10 +36,6 @@ public: virtual bool encode(const AudioFileModel &sourceFile, const QString &outputFile, volatile bool *abortFlag); virtual QString extension(void); -signals: - void statusUpdated(int progress); - void messageLogged(const QString &line); - private: const QString m_binary; }; diff --git a/src/Main.cpp b/src/Main.cpp index c381d8f0..7c933f0a 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -50,24 +50,6 @@ int lamexp_main(int argc, char* argv[]) //Init console lamexp_init_console(argc, argv); - - //LPWSTR *szArglist; - //int nArgs; - //szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs); - // - //if(nArgs >= 2) - //{ - // static HANDLE hConsole = NULL; - // hConsole = CreateFile(L"CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); - // if(!SetConsoleCP(CP_UTF8)) - // { - // wprintf(L"Failed to set CP !!!\n"); - // } - // char buffer[4096]; - // WideCharToMultiByte(CP_UTF8, 0, szArglist[1], -1, buffer, 4096, NULL, NULL); - // wprintf(L"%S\n", buffer); - // WriteConsoleA(hConsole, buffer, strlen(buffer), NULL, NULL); - //} //Print version info qDebug("LameXP - Audio Encoder Front-End"); @@ -87,7 +69,7 @@ int lamexp_main(int argc, char* argv[]) qDebug("CPU brand string : %s", cpuFeatures.brand); qDebug(" CPU signature : Family: %d, Model: %d, Stepping: %d", cpuFeatures.family, cpuFeatures.model, cpuFeatures.stepping); qDebug("CPU capabilities : MMX: %s, SSE: %s, SSE2: %s, SSE3: %s, SSSE3: %s, x64: %s", LAMEXP_BOOL(cpuFeatures.mmx), LAMEXP_BOOL(cpuFeatures.sse), LAMEXP_BOOL(cpuFeatures.sse2), LAMEXP_BOOL(cpuFeatures.sse3), LAMEXP_BOOL(cpuFeatures.ssse3), LAMEXP_BOOL(cpuFeatures.x64)); - qDebug("CPU no. of cores : %d\n", cpuFeatures.count); + qDebug(" Number of CPU's : %d\n", cpuFeatures.count); //Initialize Qt lamexp_init_qt(argc, argv); -- 2.11.0