ok, I manage to remove threads and yes, QProcess is async, but..seems that tries to convert all at the same time, that's why I was using waitforfinish...my updated codes:
#ifndef TEST01_HPP
#define TEST01_HPP
#include <QApplication>
#include <QWidget>
#include <QFileDialog>
#include <QDir>
#include <QDesktopServices> // Qt 4.2
#include "ui_test01.h"
#include "ffmpeg_runner.hpp"
namespace Ui {
class Form;
};
Q_OBJECT
private:
Ui::Form *ui;
MyFfmpegRunnerClass *ffmpeg;
public:
{
ui->setupUi(this);
/* below is beta, watch it!!! */
ffmpeg = new MyFfmpegRunnerClass(this);
connect(ffmpeg, SIGNAL(startJob()), this, SLOT(handleStart()));
connect(ffmpeg, SIGNAL(endJob()), this, SLOT(handleEnd()));
/* ... */
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(handleRunButton()));
connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(handleBrowseButton()));
}
virtual ~MyForm() {
delete ffmpeg;
delete ui;
}
protected:
signals:
void doneJob();
protected slots:
void handleBrowseButton() {
if (!folder.isEmpty()) ui->lineEdit->setText(folder);
}
void handleRunButton() {
QString source_dir
= ui
->lineEdit
->text
();
bool delete_me = true;
ffmpeg->Start(source_dir, target_dir, delete_me);
}
void handleStart() {
qDebug() << "We start the process";
}
void handleEnd() {
qDebug() << "Done :v";
}
};
#endif
#ifndef TEST01_HPP
#define TEST01_HPP
#include <QApplication>
#include <QWidget>
#include <QFileDialog>
#include <QDir>
#include <QDesktopServices> // Qt 4.2
#include "ui_test01.h"
#include "ffmpeg_runner.hpp"
namespace Ui {
class Form;
};
class MyForm : public QWidget {
Q_OBJECT
private:
Ui::Form *ui;
MyFfmpegRunnerClass *ffmpeg;
public:
MyForm(QWidget *root = 0) : QWidget(root), ui(new Ui::Form)
{
ui->setupUi(this);
/* below is beta, watch it!!! */
ffmpeg = new MyFfmpegRunnerClass(this);
connect(ffmpeg, SIGNAL(startJob()), this, SLOT(handleStart()));
connect(ffmpeg, SIGNAL(endJob()), this, SLOT(handleEnd()));
/* ... */
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(handleRunButton()));
connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(handleBrowseButton()));
ui->lineEdit->setText(QDesktopServices::storageLocation(QDesktopServices::MoviesLocation));
}
virtual ~MyForm() {
delete ffmpeg;
delete ui;
}
protected:
signals:
void doneJob();
protected slots:
void handleBrowseButton() {
QString folder = QFileDialog::getExistingDirectory(this);
if (!folder.isEmpty()) ui->lineEdit->setText(folder);
}
void handleRunButton() {
QString source_dir = ui->lineEdit->text();
QString target_dir = QDesktopServices::storageLocation(QDesktopServices::MusicLocation);
bool delete_me = true;
ffmpeg->Start(source_dir, target_dir, delete_me);
}
void handleStart() {
qDebug() << "We start the process";
}
void handleEnd() {
qDebug() << "Done :v";
}
};
#endif
To copy to clipboard, switch view to plain text mode
#ifndef FFMPEG_RUNNER_HPP
#define FFMPEG_RUNNER_HPP
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QProcess>
class MyFfmpegRunnerClass
: public QObject { Q_OBJECT
private:
bool delete_me;
int n_files;
public:
{
n_files = 0;
process->setStandardOutputFile("/dev/null");
process->setStandardErrorFile("/dev/null");
connect(process, SIGNAL(started()), this, SLOT(handleprocessStarted()));
connect(process,
SIGNAL(finished
(int,
QProcess::ExitStatus)),
this,
SLOT(handleprocessExited
(int,
QProcess::ExitStatus)));
}
void Start(const QString& srcdir, const QString& outdir, bool be_deleted = false) {
folder.
setNameFilters(QStringList() <<
"*.mp3" <<
"*.mp4" <<
"*.flv" <<
"*.wav" <<
"*.ogg" <<
"*.3gp");
delete_me = be_deleted;
n_files = files.size();
int index;
for (index = 0; index != n_files; index++) {
QString file = fi.
baseName() + ".mp3";
curr_file = fi.absoluteFilePath();
qDebug() << "Converting: " << curr_file;
process
->start
("ffmpeg",
QStringList() <<
"-i" << curr_file <<
"-f" <<
"mp3" <<
"-ab" <<
"128k" << out_file
);
}
// here we should wait until all files are converted, right?
qDebug() << "Why do you see this line even the process is still converting?"
}
~MyFfmpegRunnerClass() {
if (process->pid()) process->close();
delete process;
qDebug() << "Class ffmpeg died";
}
protected slots:
void handleprocessStarted() {
emit startJob();
}
void handleprocessExited
(int exitCode,
QProcess::ExitStatus exitStatus
) { qDebug() << "Exited code: " << exitCode << ". ExitStatus: " << exitStatus;
if ( (exitCode == 0) && (delete_me) ) {
process->close();
emit endJob();
// you should delete source file here
}
}
signals:
void startJob();
void endJob();
};
#endif
#ifndef FFMPEG_RUNNER_HPP
#define FFMPEG_RUNNER_HPP
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QProcess>
class MyFfmpegRunnerClass : public QObject {
Q_OBJECT
private:
QProcess *process;
QString curr_file;
bool delete_me;
int n_files;
public:
MyFfmpegRunnerClass(QObject *parent = 0) : QObject(parent)
{
n_files = 0;
process = new QProcess(this);
process->setStandardOutputFile("/dev/null");
process->setStandardErrorFile("/dev/null");
connect(process, SIGNAL(started()), this, SLOT(handleprocessStarted()));
connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(handleprocessExited(int, QProcess::ExitStatus)));
}
void Start(const QString& srcdir, const QString& outdir, bool be_deleted = false) {
QDir folder(srcdir);
folder.setNameFilters(QStringList() << "*.mp3" << "*.mp4" << "*.flv" << "*.wav" << "*.ogg" << "*.3gp");
QStringList files = folder.entryList(QDir::NoDotAndDotDot|QDir::Files);
delete_me = be_deleted;
n_files = files.size();
int index;
for (index = 0; index != n_files; index++) {
QFileInfo fi(srcdir, files.at(index));
QString file = fi.baseName() + ".mp3";
curr_file = fi.absoluteFilePath();
QString out_file = QDir(outdir).filePath(file);
qDebug() << "Converting: " << curr_file;
process->start("ffmpeg", QStringList() << "-i" << curr_file << "-f" << "mp3" << "-ab" << "128k" << out_file);
}
// here we should wait until all files are converted, right?
qDebug() << "Why do you see this line even the process is still converting?"
}
~MyFfmpegRunnerClass() {
if (process->pid()) process->close();
delete process;
qDebug() << "Class ffmpeg died";
}
protected slots:
void handleprocessStarted() {
emit startJob();
}
void handleprocessExited(int exitCode, QProcess::ExitStatus exitStatus) {
qDebug() << "Exited code: " << exitCode << ". ExitStatus: " << exitStatus;
if ( (exitCode == 0) && (delete_me) ) {
process->close();
emit endJob();
// you should delete source file here
}
}
signals:
void startJob();
void endJob();
};
#endif
To copy to clipboard, switch view to plain text mode
Bookmarks