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