20 #include <QAbstractButton>    21 #include <QApplication>    24 #include <QDialogButtonBox>    28 #include <QLatin1Char>    31 #include <QPushButton>    35 #include <KHelpClient>    54 #define PRESET_NAME_USER_DEFINED i18n("(user defined)")    56 #ifdef EXECUTABLE_SUFFIX    57 #define EXE_SUFFIX EXECUTABLE_SUFFIX    72 #if Q_BYTE_ORDER == Q_BIG_ENDIAN   101             _(
"--strictly-enforce-ISO")   
   121 #if Q_BYTE_ORDER == Q_BIG_ENDIAN   129             _(
"--samplerate=%1"),         
   130             _(
"--samplesize=16"),         
   132                 _(
"--channels=1 --mode=mono"),  
   133                 _(
"--channels=2 --mode=joint")  
   140                 _(
"--max-bitrate=%1")     
   170 #if Q_BYTE_ORDER == Q_BIG_ENDIAN   222 #define LOAD(field, control) control->setText(m_settings.field)   229 #define SAVE(field, control) \   230     m_settings.field = QString(control->text()).simplified()   237 #define CONNECT(control) \   238     connect(control, SIGNAL(editingFinished()), \   239     this, SLOT(switchToUserDefined()))   248 #define CHECK(field, control) match &= \   249     (settings.field == QString(control->text()).simplified())   251 #define ELEMENTS_OF(x) (sizeof(x) / sizeof(x[0]))   255     :QDialog(parent), Ui::MP3EncoderDialogBase(),
   256      m_settings(g_predefined_settings[0])
   263     for (
unsigned int i = 0; i < 
ELEMENTS_OF(g_predefined_settings); i++) {
   264         QString 
name    = g_predefined_settings[i].
m_name;
   265         QString path    = 
searchPath(g_predefined_settings[i].m_path);
   268         if (version.length() >= name.length())
   269             cbProgram->addItem(version);
   271             cbProgram->addItem(name);
   280     connect(cbProgram, SIGNAL(activated(
int)),
   284     connect(buttonBox, SIGNAL(clicked(QAbstractButton*)),
   286     connect(buttonBox_Help, SIGNAL(helpRequested()),
   340     edSampleRate->setToolTip(i18n(
   341         "sample rate in Hz (use %1 as placeholder)\n"   342         "or kHz (use %2 as placeholder)",
   343         _(
"%1"), 
_(
"[%khz]")));
   344     edBitsPerSample->setToolTip(i18n(
   346         "use %1 as placeholder",
   348     edBitrateMin->setToolTip(i18n(
   349         "parameter for minimum bitrate in bits/sec\n"   350         "(use %1 as placeholder)",
   352     edBitrateMax->setToolTip(i18n(
   353         "parameter for maximum bitrate in bits/sec\n"   354         "(use %1 as placeholder)",
   356     edBitrateAvg->setToolTip(i18n(
   357         "parameter for average bitrate in bits/sec\n"   358         "(use %1 as placeholder)",
   362     buttonBox->button(QDialogButtonBox::Ok)->setFocus();
   375     bool use_preset = 
false;
   376     for (i = 0; i < 
ELEMENTS_OF(g_predefined_settings); i++) {
   381             cbProgram->setCurrentIndex(i);
   386     if ((!use_preset) && (cbProgram->currentIndex() != 
Kwave::toInt(i))) {
   388         cbProgram->setCurrentIndex(i);
   392     LOAD(m_path,                           edPath);
   394     LOAD(m_input.m_raw_format,             edRawFormat);
   395     LOAD(m_input.m_byte_order,             edByteOrder);
   396     LOAD(m_input.m_signed,                 edSign);
   398     LOAD(m_format.m_sample_rate,           edSampleRate);
   399     LOAD(m_format.m_bits_per_sample,       edBitsPerSample);
   400     LOAD(m_format.m_channels.m_mono,       edMono);
   401     LOAD(m_format.m_channels.m_stereo,     edStereo);
   403     LOAD(m_quality.m_bitrate.m_avg,        edBitrateAvg);
   404     LOAD(m_quality.m_bitrate.m_min,        edBitrateMin);
   405     LOAD(m_quality.m_bitrate.m_max,        edBitrateMax);
   407     LOAD(m_encoding.m_emphasis.m_none,     edEmphasisNone);
   408     LOAD(m_encoding.m_emphasis.m_50_15ms,  edEmphasis5015ms);
   409     LOAD(m_encoding.m_emphasis.m_ccit_j17, edEmphasisCCIT_J17);
   411     LOAD(m_encoding.m_noise_shaping,       edNoiseShaping);
   412     LOAD(m_encoding.m_compatibility,       edCompatibility);
   414     LOAD(m_flags.m_copyright,              edCopyright);
   415     LOAD(m_flags.m_original,               edOriginal);
   416     LOAD(m_flags.m_protect,                edProtect);
   417     LOAD(m_flags.m_prepend,                edPrepend);
   418     LOAD(m_flags.m_append,                 edAppend);
   420     LOAD(m_info.m_help,                    edEncoderHelp);
   421     LOAD(m_info.m_version,                 edVersionInfo);
   430     int index = cbProgram->currentIndex();
   438     SAVE(m_path,                           edPath);
   440     SAVE(m_input.m_raw_format,             edRawFormat);
   441     SAVE(m_input.m_byte_order,             edByteOrder);
   442     SAVE(m_input.m_signed,                 edSign);
   444     SAVE(m_format.m_sample_rate,           edSampleRate);
   445     SAVE(m_format.m_bits_per_sample,       edBitsPerSample);
   446     SAVE(m_format.m_channels.m_mono,       edMono);
   447     SAVE(m_format.m_channels.m_stereo,     edStereo);
   449     SAVE(m_quality.m_bitrate.m_avg,        edBitrateAvg);
   450     SAVE(m_quality.m_bitrate.m_min,        edBitrateMin);
   451     SAVE(m_quality.m_bitrate.m_max,        edBitrateMax);
   453     SAVE(m_encoding.m_emphasis.m_none,     edEmphasisNone);
   454     SAVE(m_encoding.m_emphasis.m_50_15ms,  edEmphasis5015ms);
   455     SAVE(m_encoding.m_emphasis.m_ccit_j17, edEmphasisCCIT_J17);
   457     SAVE(m_encoding.m_noise_shaping,       edNoiseShaping);
   458     SAVE(m_encoding.m_compatibility,       edCompatibility);
   460     SAVE(m_flags.m_copyright,              edCopyright);
   461     SAVE(m_flags.m_original,               edOriginal);
   462     SAVE(m_flags.m_protect,                edProtect);
   463     SAVE(m_flags.m_prepend,                edPrepend);
   464     SAVE(m_flags.m_append,                 edAppend);
   466     SAVE(m_info.m_help,                    edEncoderHelp);
   467     SAVE(m_info.m_version,                 edVersionInfo);
   475     if (index < 0) 
return;
   485     int index = cbProgram->currentIndex();
   487     for (
unsigned i = 0; i < 
ELEMENTS_OF(g_predefined_settings); i++) {
   489             g_predefined_settings[i];
   492         match &= bool(edPath->text().simplified().contains(settings.
m_path,
   493             Qt::CaseInsensitive));
   495         CHECK(m_input.m_raw_format,             edRawFormat);
   496         CHECK(m_input.m_byte_order,             edByteOrder);
   497         CHECK(m_input.m_signed,                 edSign);
   499         CHECK(m_format.m_sample_rate,           edSampleRate);
   500         CHECK(m_format.m_bits_per_sample,       edBitsPerSample);
   501         CHECK(m_format.m_channels.m_mono,       edMono);
   502         CHECK(m_format.m_channels.m_stereo,     edStereo);
   504         CHECK(m_quality.m_bitrate.m_avg,        edBitrateAvg);
   505         CHECK(m_quality.m_bitrate.m_min,        edBitrateMin);
   506         CHECK(m_quality.m_bitrate.m_max,        edBitrateMax);
   508         CHECK(m_encoding.m_emphasis.m_none,     edEmphasisNone);
   509         CHECK(m_encoding.m_emphasis.m_50_15ms,  edEmphasis5015ms);
   510         CHECK(m_encoding.m_emphasis.m_ccit_j17, edEmphasisCCIT_J17);
   512         CHECK(m_encoding.m_noise_shaping,       edNoiseShaping);
   513         CHECK(m_encoding.m_compatibility,       edCompatibility);
   515         CHECK(m_flags.m_copyright,              edCopyright);
   516         CHECK(m_flags.m_original,               edOriginal);
   517         CHECK(m_flags.m_protect,                edProtect);
   518         CHECK(m_flags.m_prepend,                edPrepend);
   519         CHECK(m_flags.m_append,                 edAppend);
   521         CHECK(m_info.m_help,                    edEncoderHelp);
   522         CHECK(m_info.m_version,                 edVersionInfo);
   527                 cbProgram->setCurrentIndex(i);
   535     cbProgram->setCurrentIndex(
ELEMENTS_OF(g_predefined_settings));
   542     if (!button || !buttonBox) 
return;
   543     switch (buttonBox->standardButton(button)) {
   544         case QDialogButtonBox::Ok:
   548         case QDialogButtonBox::Reset:
   552         case QDialogButtonBox::RestoreDefaults:
   564     for (
unsigned i = 0; i < 
ELEMENTS_OF(g_predefined_settings); ++i) {
   565         QFile f(
searchPath(g_predefined_settings[i].m_path));
   568             cbProgram->setCurrentIndex(i);
   579     const QString prog_orig = edPath->text().simplified();
   581     if (prog != prog_orig) {
   582         edPath->setText(prog);
   590     QString mask = 
_(
"*");
   591 #ifdef EXECUTABLE_SUFFIX   592     mask += QString(EXECUTABLE_SUFFIX);
   594     QPointer<Kwave::FileDialog> dlg = 
new(std::nothrow)
   596             _(
"kfiledialog:///kwave_mp3_encoder"),
   599             QUrl::fromLocalFile(
_(
"file:/") + edPath->text().simplified()),
   603     dlg->setWindowTitle(i18n(
"Select MP3 Encoder"));
   605     if (dlg->exec() == QDialog::Accepted)
   606         edPath->setText(dlg->selectedUrl().toLocalFile());
   614     const double         sample_rate = 44100.0;
   615     const unsigned int   bits        = 16;
   616     const unsigned int   tracks      = 2;
   626     manager.
newSignal(test_length, sample_rate, bits, tracks);
   640     QList<unsigned int> track_list;
   641     track_list.append(0);
   642     track_list.append(1);
   646         manager, track_list, first, last);
   652     bool succeeded = encoder.
encode(
this, src, dst, meta_data);
   656         KMessageBox::information(
this, i18n(
   657             "Congratulation, the test was successful!"));
   665     QString program = edPath->text().simplified();
   666     QString param   = QString(edEncoderHelp->text()).simplified();
   670     KMessageBox::information(
this, text);
   675                                                const QString ¶m)
   677     QStringList params(param);
   680     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
   683     process.setProcessChannelMode(QProcess::MergedChannels);
   684     process.start(path, params);
   685     process.waitForStarted();
   686     if (process.state() != QProcess::NotRunning) process.waitForFinished();
   688     QString text = QString::fromLocal8Bit(process.readAllStandardOutput());
   689     qDebug(
"stdout output: %s", 
DBG(text));
   692     QApplication::restoreOverrideCursor();
   699                                                 const QString ¶m)
   703     QStringList lines = text.split(QLatin1Char(
'\n'));
   706     while (lines.count() && !lines.first().simplified().length())
   709     return (!lines.isEmpty()) ? lines.first().simplified() : QString();
   715     const QFile::Permissions executable =
   716         (QFile::ExeOwner | QFile::ExeUser | QFile::ExeGroup | QFile::ExeOther);
   718     const QLatin1Char separator = QLatin1Char(
';');
   720     const QLatin1Char separator = QLatin1Char(
':');
   723         _(qgetenv(
"PATH")).split(separator, QString::SkipEmptyParts);
   725     QFileInfo f(program);
   726     QString d = f.path();
   727     if (d.length()) path.prepend(d);
   729     foreach (
const QString &dir, path) {
   731         if (!p.endsWith(QDir::separator()))
   732             p += QDir::separator();
   736         qDebug(
"testing '%s'", 
DBG(p));
   737         if (file.exists() && (file.permissions() & executable)) {
   749     int index = cbProgram->currentIndex();
   757     if (!title.length()) {
   759         QString 
name    = g_predefined_settings[index].
m_name;
   760         QString program = QFileInfo(edPath->text().simplified()).filePath();
   761         QString param   = edVersionInfo->text().simplified();
   763         if (version.length() >= name.length()) {
   768             program    = 
searchPath(g_predefined_settings[index].m_path);
   770             if (version.length() >= name.length())
   775     cbProgram->setItemText(index, title);
   781     KHelpClient::invokeHelp(
_(
"plugin_sect_codec_mp3"));
 
virtual ~MP3EncoderDialog()
Kwave::MP3EncoderSettings m_settings
#define PRESET_NAME_USER_DEFINED
Kwave::MetaDataList & metaData()
void newSignal(sample_index_t samples, double rate, unsigned int bits, unsigned int tracks)
void setDirectory(const QString &directory)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
void set(FileProperty key, const QVariant &value)
MP3EncoderDialog(QWidget *parent)
#define LOAD(field, control)
#define CHECK(field, control)
const Kwave::MP3EncoderSettings g_predefined_settings[]
#define SAVE(field, control)
QString callWithParam(const QString &path, const QString ¶m)
void switchToUserDefined()
void buttonClicked(QAbstractButton *button)
void selectProgram(int index)
virtual bool encode(QWidget *widget, Kwave::MultiTrackReader &src, QIODevice &dst, const Kwave::MetaDataList &meta_data)
QString encoderVersion(const QString &path, const QString ¶m)
QString searchPath(const QString &program)
struct Kwave::MP3EncoderSettings::@8 m_info