summaryrefslogtreecommitdiffstats
path: root/kioslave/audiocd/plugins/lame
diff options
context:
space:
mode:
Diffstat (limited to 'kioslave/audiocd/plugins/lame')
-rw-r--r--kioslave/audiocd/plugins/lame/Makefile.am18
-rw-r--r--kioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfg138
-rw-r--r--kioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfgc4
-rw-r--r--kioslave/audiocd/plugins/lame/collectingprocess.cpp134
-rw-r--r--kioslave/audiocd/plugins/lame/collectingprocess.h72
-rw-r--r--kioslave/audiocd/plugins/lame/encoderlame.cpp366
-rw-r--r--kioslave/audiocd/plugins/lame/encoderlame.h67
-rw-r--r--kioslave/audiocd/plugins/lame/encoderlameconfig.ui930
8 files changed, 1729 insertions, 0 deletions
diff --git a/kioslave/audiocd/plugins/lame/Makefile.am b/kioslave/audiocd/plugins/lame/Makefile.am
new file mode 100644
index 00000000..49ddddd9
--- /dev/null
+++ b/kioslave/audiocd/plugins/lame/Makefile.am
@@ -0,0 +1,18 @@
+INCLUDES = -I$(top_srcdir)/libkcddb -I$(srcdir)/.. $(taglib_includes) $(all_includes)
+
+kde_kcfg_DATA = audiocd_lame_encoder.kcfg
+
+kde_module_LTLIBRARIES = libaudiocd_encoder_lame.la
+
+libaudiocd_encoder_lame_la_SOURCES = audiocd_lame_encoder.kcfgc encoderlame.cpp encoderlameconfig.ui collectingprocess.cpp
+
+libaudiocd_encoder_lame_la_LIBADD = $(LIB_KIO) ../libaudiocdplugins.la
+
+libaudiocd_encoder_lame_la_LDFLAGS = -avoid-version -module -no-undefined $(taglib_libs) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/audiocd/plugins
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/audiocd_encoder_lame.pot
diff --git a/kioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfg b/kioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfg
new file mode 100644
index 00000000..c752fd81
--- /dev/null
+++ b/kioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfg
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="kcmaudiocd_encoder_lame_rc"/>
+ <group name="Lame">
+
+<!-- Encoding Method -->
+ <entry name="bitrate_constant" type="Bool">
+ <label>Constant Bitrate</label>
+ <default>false</default>
+ </entry>
+ <entry name="bitrate_variable" type="Bool">
+ <label>Variable Bitrate</label>
+ <default>true</default>
+ </entry>
+
+ <entry name="stereo" type="Int">
+ <label>Stereo Mode</label>
+ <default>0</default>
+ </entry>
+ <entry name="quality" type="Int">
+ <label>Quality</label>
+ <default>-2</default>
+ </entry>
+
+<!-- Options -->
+ <entry name="copyright" type="Bool">
+ <label>Copyrighted</label>
+ <default>false</default>
+ </entry>
+ <entry name="original" type="Bool">
+ <label>Original</label>
+ <default>true</default>
+ </entry>
+ <entry name="iso" type="Bool">
+ <label>ISO Encoding</label>
+ <default>false</default>
+ </entry>
+ <entry name="crc" type="Bool">
+ <label>Error protection</label>
+ <default>false</default>
+ </entry>
+ <entry name="id3_tag" type="Bool">
+ <label>Write ID3 Tag</label>
+ <default>true</default>
+ </entry>
+
+<!-- Constant Bitrate Settings -->
+ <entry name="cbr_bitrate" type="Int">
+ <label>Constant Bitrate Settings</label>
+ <default>10</default>
+ <min>0</min>
+ <max>13</max>
+ </entry>
+
+<!-- Variable Bitrate Settings -->
+ <entry name="vbr_min_br" type="Bool">
+ <label>Minimal bitrate</label>
+ <default>false</default>
+ </entry>
+ <entry name="vbr_min_hard" type="Bool">
+ <label>Minimal Value is a hard limit</label>
+ <default>false</default>
+ </entry>
+ <entry name="vbr_max_br" type="Bool">
+ <label>Maximal bitrate</label>
+ <default>false</default>
+ </entry>
+ <entry name="vbr_average_br" type="Bool">
+ <label>Average bitrate</label>
+ <default>false</default>
+ </entry>
+ <entry name="vbr_xing_tag" type="Bool">
+ <label>Write Xing VBR tag</label>
+ <default>true</default>
+ </entry>
+
+ <entry name="vbr_min_brate" type="Int">
+ <label>Minimal bitrate value</label>
+ <default>40</default>
+ <min>0</min>
+ <max>13</max>
+ </entry>
+ <entry name="vbr_max_brate" type="Int">
+ <label>Maximal bitrate value</label>
+ <default>13</default>
+ <min>0</min>
+ <max>13</max>
+ </entry>
+ <entry name="vbr_mean_brate" type="Int">
+ <label>Average bitrate value</label>
+ <default>10</default>
+ <min>0</min>
+ <max>13</max>
+ </entry>
+
+
+<!-- Filter Settings -->
+ <entry name="enable_lowpass" type="Bool">
+ <label>Lowpass filter cutoff above</label>
+ <default>false</default>
+ </entry>
+ <entry name="lowfilterfreq" type="Int">
+ <label>Lowpass filter cutoff above Value</label>
+ <default>18000</default>
+ </entry>
+
+ <entry name="enable_highpass" type="Bool">
+ <label>Highpass filter cutoff above</label>
+ <default>false</default>
+ </entry>
+ <entry name="highfilterfreq" type="Int">
+ <label>Highpass filter cutoff above Value</label>
+ <default>0</default>
+ </entry>
+
+ <entry name="set_lpf_width" type="Bool">
+ <label>Lowpass filter width</label>
+ <default>false</default>
+ </entry>
+ <entry name="lowfilterwidth" type="Int">
+ <label>Lowpass filter width value</label>
+ <default>900</default>
+ </entry>
+
+ <entry name="set_hpf_width" type="Bool">
+ <label>Highpass filter width</label>
+ <default>false</default>
+ </entry>
+ <entry name="highfilterwidth" type="Int">
+ <label>Highpass filter width</label>
+ <default>0</default>
+ </entry>
+ </group>
+</kcfg>
+
diff --git a/kioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfgc b/kioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfgc
new file mode 100644
index 00000000..b96ee704
--- /dev/null
+++ b/kioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfgc
@@ -0,0 +1,4 @@
+# Code generation options for kconfig_compiler
+File=audiocd_lame_encoder.kcfg
+ClassName=Settings
+Singleton=true
diff --git a/kioslave/audiocd/plugins/lame/collectingprocess.cpp b/kioslave/audiocd/plugins/lame/collectingprocess.cpp
new file mode 100644
index 00000000..b3a13755
--- /dev/null
+++ b/kioslave/audiocd/plugins/lame/collectingprocess.cpp
@@ -0,0 +1,134 @@
+/*
+ collectingprocess.cpp
+
+ This file is part of libkdepim.
+ Copyright (c) 2004 Ingo Kloecker <[email protected]>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "collectingprocess.h"
+
+#include <qvaluelist.h>
+
+#include <string.h>
+
+struct CollectingProcess::Private {
+ Private() : stdoutSize( 0 ), stderrSize( 0 )
+ {}
+
+ uint stdoutSize;
+ QValueList<QByteArray> stdoutBuffer;
+ uint stderrSize;
+ QValueList<QByteArray> stderrBuffer;
+};
+
+
+CollectingProcess::CollectingProcess( QObject * parent, const char * name )
+ : KProcess( parent, name )
+{
+ d = new Private();
+}
+
+CollectingProcess::~CollectingProcess() {
+ delete d; d = 0;
+}
+
+bool CollectingProcess::start( RunMode runmode, Communication comm ) {
+ // prevent duplicate connection
+ disconnect( this, SIGNAL( receivedStdout( KProcess *, char *, int ) ),
+ this, SLOT( slotReceivedStdout( KProcess *, char *, int ) ) );
+ if ( comm & Stdout ) {
+ connect( this, SIGNAL( receivedStdout( KProcess *, char *, int ) ),
+ this, SLOT( slotReceivedStdout( KProcess *, char *, int ) ) );
+ }
+ // prevent duplicate connection
+ disconnect( this, SIGNAL( receivedStderr( KProcess *, char *, int ) ),
+ this, SLOT( slotReceivedStderr( KProcess *, char *, int ) ) );
+ if ( comm & Stderr ) {
+ connect( this, SIGNAL( receivedStderr( KProcess *, char *, int ) ),
+ this, SLOT( slotReceivedStderr( KProcess *, char *, int ) ) );
+ }
+ return KProcess::start( runmode, comm );
+}
+
+void CollectingProcess::slotReceivedStdout( KProcess *, char *buf, int len )
+{
+ QByteArray b;
+ b.duplicate( buf, len );
+ d->stdoutBuffer.append( b );
+ d->stdoutSize += len;
+}
+
+void CollectingProcess::slotReceivedStderr( KProcess *, char *buf, int len )
+{
+ QByteArray b;
+ b.duplicate( buf, len );
+ d->stderrBuffer.append( b );
+ d->stderrSize += len;
+}
+
+QByteArray CollectingProcess::collectedStdout()
+{
+ if ( d->stdoutSize == 0 ) {
+ return QByteArray();
+ }
+
+ uint offset = 0;
+ QByteArray b( d->stdoutSize );
+ for ( QValueList<QByteArray>::const_iterator it = d->stdoutBuffer.begin();
+ it != d->stdoutBuffer.end();
+ ++it ) {
+ memcpy( b.data() + offset, (*it).data(), (*it).size() );
+ offset += (*it).size();
+ }
+ d->stdoutBuffer.clear();
+ d->stdoutSize = 0;
+
+ return b;
+}
+
+QByteArray CollectingProcess::collectedStderr()
+{
+ if ( d->stderrSize == 0 ) {
+ return QByteArray();
+ }
+
+ uint offset = 0;
+ QByteArray b( d->stderrSize );
+ for ( QValueList<QByteArray>::const_iterator it = d->stderrBuffer.begin();
+ it != d->stderrBuffer.end();
+ ++it ) {
+ memcpy( b.data() + offset, (*it).data(), (*it).size() );
+ offset += (*it).size();
+ }
+ d->stderrBuffer.clear();
+ d->stderrSize = 0;
+
+ return b;
+}
+
+#include "collectingprocess.moc"
diff --git a/kioslave/audiocd/plugins/lame/collectingprocess.h b/kioslave/audiocd/plugins/lame/collectingprocess.h
new file mode 100644
index 00000000..7549fee3
--- /dev/null
+++ b/kioslave/audiocd/plugins/lame/collectingprocess.h
@@ -0,0 +1,72 @@
+/* -*- mode: C++ -*-
+ collectingprocess.h
+
+ This file is a copy of the collectingprocess.h which is part of kdepim/libkdepim.
+ Copyright (c) 2004 Ingo Kloecker <[email protected]>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __COLLECTINGPROCESS_H__
+#define __COLLECTINGPROCESS_H__
+
+#include <kprocess.h>
+
+/**
+ * @short An output collecting KProcess class.
+ *
+ * This class simplifies the usage of KProcess by collecting all output
+ * (stdout/stderr) of the process.
+ *
+ * @author Ingo Kloecker <[email protected]>
+ */
+class CollectingProcess : public KProcess {
+ Q_OBJECT
+public:
+ CollectingProcess( QObject * parent = 0, const char * name = 0 );
+ ~CollectingProcess();
+
+ /** Starts the process in NotifyOnExit mode and writes in to stdin of
+ the process.
+ */
+ bool start( RunMode runmode, Communication comm );
+
+ /** Returns the contents of the stdout buffer and clears it afterwards. */
+ QByteArray collectedStdout();
+ /** Returns the contents of the stderr buffer and clears it afterwards. */
+ QByteArray collectedStderr();
+
+private slots:
+ void slotReceivedStdout( KProcess *, char *, int );
+ void slotReceivedStderr( KProcess *, char *, int );
+
+private:
+ class Private;
+ Private * d;
+protected:
+};
+
+#endif // __COLLECTINGPROCESS_H__
diff --git a/kioslave/audiocd/plugins/lame/encoderlame.cpp b/kioslave/audiocd/plugins/lame/encoderlame.cpp
new file mode 100644
index 00000000..a00c60fd
--- /dev/null
+++ b/kioslave/audiocd/plugins/lame/encoderlame.cpp
@@ -0,0 +1,366 @@
+/*
+ Copyright (C) 2005 Benjamin Meyer <ben at meyerhome dot net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <config.h>
+#include <endian.h>
+#include "encoderlame.h"
+#include "encoderlameconfig.h"
+#include "audiocd_lame_encoder.h"
+
+#include <kdebug.h>
+#include <qgroupbox.h>
+#include <kprocess.h>
+#include <kdebug.h>
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <qfileinfo.h>
+#include <ktempfile.h>
+#include <kstandarddirs.h>
+#include "collectingprocess.h"
+
+extern "C"
+{
+ KDE_EXPORT void create_audiocd_encoders(KIO::SlaveBase *slave, QPtrList<AudioCDEncoder> &encoders) {
+ encoders.append(new EncoderLame(slave));
+ }
+}
+
+static int bitrates[] = { 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 };
+
+class EncoderLame::Private
+{
+public:
+ int bitrate;
+ bool waitingForWrite;
+ bool processHasExited;
+ QString lastErrorMessage;
+ QStringList genreList;
+ uint lastSize;
+ KProcess *currentEncodeProcess;
+ KTempFile *tempFile;
+};
+
+EncoderLame::EncoderLame(KIO::SlaveBase *slave) : QObject(), AudioCDEncoder(slave) {
+ d = new Private();
+ d->waitingForWrite = false;
+ d->processHasExited = false;
+ d->lastSize = 0;
+ loadSettings();
+}
+
+EncoderLame::~EncoderLame(){
+ delete d;
+}
+
+QWidget* EncoderLame::getConfigureWidget(KConfigSkeleton** manager) const {
+ (*manager) = Settings::self();
+ KGlobal::locale()->insertCatalogue("audiocd_encoder_lame");
+ EncoderLameConfig *config = new EncoderLameConfig();
+ config->cbr_settings->hide();
+ return config;
+}
+
+bool EncoderLame::init(){
+ // Determine if lame is installed on the system or not.
+ if ( KStandardDirs::findExe( "lame" ).isEmpty() )
+ return false;
+
+ // Ask lame for the list of genres it knows; otherwise it barfs when doing
+ // e.g. lame --tg 'Vocal Jazz'
+ CollectingProcess proc;
+ proc << "lame" << "--genre-list";
+ proc.start(KProcess::Block, KProcess::Stdout);
+
+ if(proc.exitStatus() != 0)
+ return false;
+
+ const QByteArray data = proc.collectedStdout();
+ QString str;
+ if ( !data.isEmpty() )
+ str = QString::fromLocal8Bit( data, data.size() );
+
+ d->genreList = QStringList::split( '\n', str );
+ // Remove the numbers in front of every genre
+ for( QStringList::Iterator it = d->genreList.begin(); it != d->genreList.end(); ++it ) {
+ QString& genre = *it;
+ uint i = 0;
+ while ( i < genre.length() && ( genre[i].isSpace() || genre[i].isDigit() ) )
+ ++i;
+ genre = genre.mid( i );
+
+ }
+ //kdDebug(7117) << "Available genres:" << d->genreList << endl;
+
+ return true;
+}
+
+void EncoderLame::loadSettings(){
+ // Generate the command line arguments for the current settings
+ args.clear();
+
+ Settings *settings = Settings::self();
+
+ int quality = settings->quality();
+ if (quality < 0 ) quality = quality *-1;
+ if (quality > 9) quality = 9;
+
+ int method = settings->bitrate_constant() ? 0 : 1 ;
+
+ if (method == 0) {
+ // Constant Bitrate Encoding
+ args.append("-b");
+ args.append(QString("%1").arg(bitrates[settings->cbr_bitrate()]));
+ d->bitrate = bitrates[settings->cbr_bitrate()];
+ args.append("-q");
+ args.append(QString("%1").arg(quality));
+ }
+ else {
+ // Variable Bitrate Encoding
+ if (settings->vbr_average_br()) {
+ args.append("--abr");
+ args.append(QString("%1").arg(bitrates[settings->vbr_mean_brate()]));
+ d->bitrate = bitrates[settings->vbr_mean_brate()];
+ if (settings->vbr_min_br()){
+ args.append("-b");
+ args.append(QString("%1").arg(bitrates[settings->vbr_min_brate()]));
+ }
+ if (settings->vbr_min_hard())
+ args.append("-F");
+ if (settings->vbr_max_br()){
+ args.append("-B");
+ args.append(QString("%1").arg(bitrates[settings->vbr_max_brate()]));
+ }
+ } else {
+ d->bitrate = 128;
+ args.append("-V");
+ args.append(QString("%1").arg(quality));
+ }
+ if ( !settings->vbr_xing_tag() )
+ args.append("-t");
+ }
+
+ args.append("-m");
+ switch ( settings->stereo() ) {
+ case 0:
+ args.append("s");
+ break;
+ case 1:
+ args.append("j");
+ break;
+ case 2:
+ args.append("d");
+ break;
+ case 3:
+ args.append("m");
+ break;
+ default:
+ args.append("s");
+ break;
+ }
+
+ if(settings->copyright())
+ args.append("-c");
+ if(!settings->original())
+ args.append("-o");
+ if(settings->iso())
+ args.append("--strictly-enforce-ISO");
+ if(settings->crc())
+ args.append("-p");
+
+ if ( settings->enable_lowpass() ) {
+ args.append("--lowpass");
+ args.append(QString("%1").arg(settings->lowfilterfreq()));
+
+ if (settings->set_lpf_width()){
+ args.append("--lowpass-width");
+ args.append(QString("%1").arg(settings->lowfilterwidth()));
+ }
+ }
+
+ if ( settings->enable_highpass()) {
+ args.append("--hipass");
+ args.append(QString("%1").arg(settings->highfilterfreq()));
+
+ if (settings->set_hpf_width()){
+ args.append("--hipass-width");
+ args.append(QString("%1").arg(settings->highfilterwidth()));
+ }
+ }
+}
+
+unsigned long EncoderLame::size(long time_secs) const {
+ return (time_secs * d->bitrate * 1000)/8;
+}
+
+long EncoderLame::readInit(long /*size*/){
+ // Create KProcess
+ d->currentEncodeProcess = new KProcess(0);
+ QString prefix = locateLocal("tmp", "");
+ d->tempFile = new KTempFile(prefix, ".mp3");
+ d->tempFile->setAutoDelete(true);
+ d->lastErrorMessage = QString::null;
+ d->processHasExited = false;
+
+ // -x bitswap
+ // -r raw/pcm
+ // -s 44.1 (because it is raw you have to specify this)
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ *(d->currentEncodeProcess) << "lame" << "--verbose" << "-x" << "-r" << "-s" << "44.1";
+#else
+ *(d->currentEncodeProcess) << "lame" << "--verbose" << "-r" << "-s" << "44.1";
+#endif
+
+ *(d->currentEncodeProcess) << args;
+ if(Settings::self()->id3_tag())
+ *d->currentEncodeProcess << trackInfo;
+
+ // Read in stdin, output to the temp file
+ *d->currentEncodeProcess << "-" << d->tempFile->name().latin1();
+
+ //kdDebug(7117) << d->currentEncodeProcess->args() << endl;
+
+
+ connect(d->currentEncodeProcess, SIGNAL(receivedStdout(KProcess *, char *, int)),
+ this, SLOT(receivedStdout(KProcess *, char *, int)));
+ connect(d->currentEncodeProcess, SIGNAL(receivedStderr(KProcess *, char *, int)),
+ this, SLOT(receivedStderr(KProcess *, char *, int)));
+ connect(d->currentEncodeProcess, SIGNAL(wroteStdin(KProcess *)),
+ this, SLOT(wroteStdin(KProcess *)));
+
+ connect(d->currentEncodeProcess, SIGNAL(processExited(KProcess *)),
+ this, SLOT(processExited(KProcess *)));
+
+ // Launch!
+ d->currentEncodeProcess->start(KProcess::NotifyOnExit, KShellProcess::All);
+ return 0;
+}
+
+void EncoderLame::processExited ( KProcess *process ){
+ kdDebug(7117) << "Lame Encoding process exited with: " << process->exitStatus() << endl;
+ d->processHasExited = true;
+}
+
+void EncoderLame::receivedStderr( KProcess * /*process*/, char *buffer, int /*buflen*/ ){
+ kdDebug(7117) << "Lame stderr: " << buffer << endl;
+ if ( !d->lastErrorMessage.isEmpty() )
+ d->lastErrorMessage += '\t';
+ d->lastErrorMessage += QString::fromLocal8Bit( buffer );
+}
+
+void EncoderLame::receivedStdout( KProcess * /*process*/, char *buffer, int /*length*/ ){
+ kdDebug(7117) << "Lame stdout: " << buffer << endl;
+}
+
+void EncoderLame::wroteStdin( KProcess * /*procces*/ ){
+ d->waitingForWrite = false;
+}
+
+long EncoderLame::read(int16_t *buf, int frames){
+ if(!d->currentEncodeProcess)
+ return 0;
+ if (d->processHasExited)
+ return -1;
+
+ // Pipe the raw data to lame
+ char * cbuf = reinterpret_cast<char *>(buf);
+ d->currentEncodeProcess->writeStdin( cbuf, frames*4);
+
+ // We can't return until the buffer has been written
+ d->waitingForWrite = true;
+ while(d->waitingForWrite && d->currentEncodeProcess->isRunning()){
+ kapp->processEvents();
+ usleep(1);
+ }
+
+ // Determine the file size increase
+ QFileInfo file(d->tempFile->name());
+ uint change = file.size() - d->lastSize;
+ d->lastSize = file.size();
+ return change;
+}
+
+long EncoderLame::readCleanup(){
+ if(!d->currentEncodeProcess)
+ return 0;
+
+ // Let lame tag the first frame of the mp3
+ d->currentEncodeProcess->closeStdin();
+ while( d->currentEncodeProcess->isRunning()){
+ kapp->processEvents();
+ usleep(1);
+ }
+
+ // Now copy the file out of the temp into kio
+ QFile file( d->tempFile->name() );
+ if ( file.open( IO_ReadOnly ) ) {
+ QByteArray output;
+ char data[1024];
+ while ( !file.atEnd() ) {
+ uint read = file.readBlock(data, 1024);
+ output.setRawData(data, read);
+ ioslave->data(output);
+ output.resetRawData(data, read);
+ }
+ file.close();
+ }
+
+ // cleanup the process and temp
+ delete d->currentEncodeProcess;
+ delete d->tempFile;
+ d->lastSize = 0;
+
+ return 0;
+}
+
+void EncoderLame::fillSongInfo( KCDDB::CDInfo info, int track, const QString &comment ){
+ trackInfo.clear();
+ trackInfo.append("--tt");
+ trackInfo.append(info.trackInfoList[track].get("title").toString());
+
+ trackInfo.append("--ta");
+ trackInfo.append(info.get("artist").toString());
+
+ trackInfo.append("--tl");
+ trackInfo.append(info.get("title").toString());
+
+ trackInfo.append("--ty");
+ trackInfo.append(QString("%1").arg(info.get("year").toString()));
+
+ trackInfo.append("--tc");
+ trackInfo.append(comment);
+
+ trackInfo.append("--tn");
+ trackInfo.append(QString("%1").arg(track+1));
+
+ const QString genre = info.get( "genre" ).toString();
+ if ( d->genreList.find( genre ) != d->genreList.end() )
+ {
+ trackInfo.append("--tg");
+ trackInfo.append(genre);
+ }
+}
+
+
+QString EncoderLame::lastErrorMessage() const
+{
+ return d->lastErrorMessage;
+}
+
+#include "encoderlame.moc"
diff --git a/kioslave/audiocd/plugins/lame/encoderlame.h b/kioslave/audiocd/plugins/lame/encoderlame.h
new file mode 100644
index 00000000..76aeb59b
--- /dev/null
+++ b/kioslave/audiocd/plugins/lame/encoderlame.h
@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2005 Benjamin Meyer <ben at meyerhome dot net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef ENCODER_LAME_H
+#define ENCODER_LAME_H
+
+#include "audiocdencoder.h"
+
+class KProcess;
+
+/**
+ * MP3 encoder using the LAME encoder.
+ * Go to http://lame.sourceforge.net/ for lots of information.
+ */
+class EncoderLame : public QObject, public AudioCDEncoder {
+
+Q_OBJECT
+
+public:
+ EncoderLame(KIO::SlaveBase *slave);
+ ~EncoderLame();
+
+ virtual QString type() const { return "MP3"; };
+ virtual bool init();
+ virtual void loadSettings();
+ virtual unsigned long size(long time_secs) const;
+ virtual const char * fileType() const { return "mp3"; };
+ virtual const char * mimeType() const { return "audio/x-mp3"; };
+ virtual void fillSongInfo( KCDDB::CDInfo info, int track, const QString &comment );
+ virtual long readInit(long size);
+ virtual long read(int16_t * buf, int frames);
+ virtual long readCleanup();
+ virtual QString lastErrorMessage() const;
+
+ virtual QWidget* getConfigureWidget(KConfigSkeleton** manager) const;
+
+protected slots:
+ void wroteStdin(KProcess *proc);
+ void receivedStdout(KProcess *, char *buffer, int length);
+ void receivedStderr(KProcess *proc, char *buffer, int buflen);
+ void processExited(KProcess *proc);
+
+private:
+ class Private;
+ Private * d;
+
+ QStringList args;
+ QStringList trackInfo;
+};
+
+#endif // ENCODER_LAME_H
+
diff --git a/kioslave/audiocd/plugins/lame/encoderlameconfig.ui b/kioslave/audiocd/plugins/lame/encoderlameconfig.ui
new file mode 100644
index 00000000..74060353
--- /dev/null
+++ b/kioslave/audiocd/plugins/lame/encoderlameconfig.ui
@@ -0,0 +1,930 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>EncoderLameConfig</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>LameConfig</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>471</width>
+ <height>598</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="0" column="1">
+ <property name="name">
+ <cstring>GroupBox1_2</cstring>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_copyright</cstring>
+ </property>
+ <property name="text">
+ <string>Cop&amp;yrighted</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Mark MP3 file as copyrighted</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Mark MP3 file as copyrighted.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_original</cstring>
+ </property>
+ <property name="text">
+ <string>Origi&amp;nal</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Mark MP3 file as an original</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Mark MP3 file as an original.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_iso</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;ISO encoding</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Try to use strict ISO encoding</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This selects the maximal bitrate used for encoding.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_crc</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Error protection</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_id3_tag</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Write ID3 tag</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>If checked and if cddb support is available, an id3 tag will be appended</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If checked and if cddb support is available, an id3 tag will be appended</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup" row="0" column="0">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Encoding Method</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>Layout21</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>Low</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>kcfg_quality</cstring>
+ </property>
+ <property name="minValue">
+ <number>-9</number>
+ </property>
+ <property name="maxValue">
+ <number>0</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>-7</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>NoMarks</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>High</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quality:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignLeft</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_quality</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="0" rowspan="1" colspan="2">
+ <item>
+ <property name="text">
+ <string>Stereo</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Joint Stereo</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Dual Channel</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Mono</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>kcfg_stereo</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This option controls whether MP3 files are recorded with one or two channels. Note that choosing &lt;i&gt;"Mono"&lt;/i&gt; reduces file size, but also kills the stereo signal.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>kcfg_bitrate_constant</cstring>
+ </property>
+ <property name="text">
+ <string>Constant bitrate</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="1">
+ <property name="name">
+ <cstring>kcfg_bitrate_variable</cstring>
+ </property>
+ <property name="text">
+ <string>Variable bitrate</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>vbr_settings</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Variable Bitrate Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>kcfg_vbr_average_br</cstring>
+ </property>
+ <property name="text">
+ <string>Specify avera&amp;ge bitrate:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This selects the maximal bitrate used for encoding.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <item>
+ <property name="text">
+ <string>32 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>40 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>48 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>56 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>64 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>80 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>96 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>112 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>128 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>160 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>192 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>224 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>256 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>320 kbs</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>kcfg_vbr_max_brate</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="currentItem">
+ <number>13</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>kcfg_vbr_max_br</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Maximal bi&amp;trate:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This selects the maximal bitrate used for encoding.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>kcfg_vbr_xing_tag</cstring>
+ </property>
+ <property name="text">
+ <string>Write &amp;Xing VBR tag</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This writes additional information related to VBR as introduced by Xing.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="1">
+ <item>
+ <property name="text">
+ <string>32 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>40 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>48 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>56 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>64 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>80 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>96 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>112 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>128 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>160 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>192 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>224 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>256 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>320 kbs</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>kcfg_vbr_mean_brate</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="currentItem">
+ <number>9</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>kcfg_vbr_min_hard</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Minimal &amp;value is a hard limit</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>kcfg_vbr_min_br</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Minimal &amp;bitrate:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This selects the minimal bitrate used for encoding.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>32 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>40 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>48 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>56 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>64 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>80 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>96 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>112 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>128 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>160 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>192 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>224 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>256 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>320 kbs</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>kcfg_vbr_min_brate</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="currentItem">
+ <number>1</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>cbr_settings</cstring>
+ </property>
+ <property name="title">
+ <string>Constant Bitrate Settings</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>Bitrate:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_cbr_bitrate</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>32 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>40 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>48 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>56 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>64 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>80 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>96 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>112 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>128 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>160 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>192 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>224 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>256 kbs</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>320 kbs</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>kcfg_cbr_bitrate</cstring>
+ </property>
+ <property name="currentItem">
+ <number>9</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The higher the bitrate, the better the quality and the larger the file.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>GroupBox83_2</cstring>
+ </property>
+ <property name="title">
+ <string>Filter Settings</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignLeft</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ <property name="vAlign" stdset="0">
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>kcfg_enable_lowpass</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Lowpass filter cutoff above</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="0">
+ <property name="name">
+ <cstring>kcfg_lowfilterfreq</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> Hz</string>
+ </property>
+ <property name="maxValue">
+ <number>20000</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>kcfg_enable_highpass</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Highpass filter cutoff below</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="3" column="0">
+ <property name="name">
+ <cstring>kcfg_highfilterfreq</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> Hz</string>
+ </property>
+ <property name="maxValue">
+ <number>200</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="1">
+ <property name="name">
+ <cstring>kcfg_set_lpf_width</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Low&amp;pass filter width</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>kcfg_lowfilterwidth</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> Hz</string>
+ </property>
+ <property name="maxValue">
+ <number>5000</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="1">
+ <property name="name">
+ <cstring>kcfg_set_hpf_width</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Highpa&amp;ss filter width</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="3" column="1">
+ <property name="name">
+ <cstring>kcfg_highfilterwidth</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> Hz</string>
+ </property>
+ <property name="maxValue">
+ <number>50</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>kcfg_bitrate_constant</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>cbr_settings</receiver>
+ <slot>setShown(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_enable_highpass</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_highfilterfreq</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_enable_highpass</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_highfilterwidth</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_enable_lowpass</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_lowfilterfreq</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_enable_lowpass</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_lowfilterwidth</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_enable_highpass</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_set_hpf_width</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_enable_lowpass</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_set_lpf_width</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_vbr_average_br</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_vbr_max_br</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_vbr_max_br</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_vbr_max_brate</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_vbr_average_br</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_vbr_mean_brate</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_vbr_average_br</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_vbr_min_br</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_vbr_min_br</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_vbr_min_brate</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_vbr_min_br</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_vbr_min_hard</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_bitrate_variable</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>vbr_settings</receiver>
+ <slot>setShown(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>kcfg_bitrate_variable</tabstop>
+ <tabstop>kcfg_stereo</tabstop>
+ <tabstop>kcfg_quality</tabstop>
+ <tabstop>kcfg_copyright</tabstop>
+ <tabstop>kcfg_original</tabstop>
+ <tabstop>kcfg_iso</tabstop>
+ <tabstop>kcfg_crc</tabstop>
+ <tabstop>kcfg_id3_tag</tabstop>
+ <tabstop>kcfg_cbr_bitrate</tabstop>
+ <tabstop>kcfg_vbr_min_br</tabstop>
+ <tabstop>kcfg_vbr_min_hard</tabstop>
+ <tabstop>kcfg_vbr_max_br</tabstop>
+ <tabstop>kcfg_vbr_average_br</tabstop>
+ <tabstop>kcfg_vbr_xing_tag</tabstop>
+ <tabstop>kcfg_vbr_min_brate</tabstop>
+ <tabstop>kcfg_vbr_max_brate</tabstop>
+ <tabstop>kcfg_vbr_mean_brate</tabstop>
+ <tabstop>kcfg_enable_lowpass</tabstop>
+ <tabstop>kcfg_lowfilterfreq</tabstop>
+ <tabstop>kcfg_enable_highpass</tabstop>
+ <tabstop>kcfg_highfilterfreq</tabstop>
+ <tabstop>kcfg_set_lpf_width</tabstop>
+ <tabstop>kcfg_lowfilterwidth</tabstop>
+ <tabstop>kcfg_set_hpf_width</tabstop>
+ <tabstop>kcfg_highfilterwidth</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>