diff options
Diffstat (limited to 'tdeioslave/audiocd/plugins/lame')
-rw-r--r-- | tdeioslave/audiocd/plugins/lame/Makefile.am | 18 | ||||
-rw-r--r-- | tdeioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfg | 138 | ||||
-rw-r--r-- | tdeioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfgc | 4 | ||||
-rw-r--r-- | tdeioslave/audiocd/plugins/lame/collectingprocess.cpp | 134 | ||||
-rw-r--r-- | tdeioslave/audiocd/plugins/lame/collectingprocess.h | 73 | ||||
-rw-r--r-- | tdeioslave/audiocd/plugins/lame/encoderlame.cpp | 366 | ||||
-rw-r--r-- | tdeioslave/audiocd/plugins/lame/encoderlame.h | 68 | ||||
-rw-r--r-- | tdeioslave/audiocd/plugins/lame/encoderlameconfig.ui | 930 |
8 files changed, 1731 insertions, 0 deletions
diff --git a/tdeioslave/audiocd/plugins/lame/Makefile.am b/tdeioslave/audiocd/plugins/lame/Makefile.am new file mode 100644 index 00000000..49ddddd9 --- /dev/null +++ b/tdeioslave/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/tdeioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfg b/tdeioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfg new file mode 100644 index 00000000..c752fd81 --- /dev/null +++ b/tdeioslave/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/tdeioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfgc b/tdeioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfgc new file mode 100644 index 00000000..b62f454d --- /dev/null +++ b/tdeioslave/audiocd/plugins/lame/audiocd_lame_encoder.kcfgc @@ -0,0 +1,4 @@ +# Code generation options for tdeconfig_compiler +File=audiocd_lame_encoder.kcfg +ClassName=Settings +Singleton=true diff --git a/tdeioslave/audiocd/plugins/lame/collectingprocess.cpp b/tdeioslave/audiocd/plugins/lame/collectingprocess.cpp new file mode 100644 index 00000000..4eaf5304 --- /dev/null +++ b/tdeioslave/audiocd/plugins/lame/collectingprocess.cpp @@ -0,0 +1,134 @@ +/* + collectingprocess.cpp + + This file is part of libtdepim. + Copyright (c) 2004 Ingo Kloecker <kloecker@kde.org> + + 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 TQt library by Trolltech AS, Norway (or with modified versions + of TQt that use the same license as TQt), 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 + TQt. 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 <tqvaluelist.h> + +#include <string.h> + +struct CollectingProcess::Private { + Private() : stdoutSize( 0 ), stderrSize( 0 ) + {} + + uint stdoutSize; + TQValueList<TQByteArray> stdoutBuffer; + uint stderrSize; + TQValueList<TQByteArray> stderrBuffer; +}; + + +CollectingProcess::CollectingProcess( TQObject * parent, const char * name ) + : TDEProcess( parent, name ) +{ + d = new Private(); +} + +CollectingProcess::~CollectingProcess() { + delete d; d = 0; +} + +bool CollectingProcess::start( RunMode runmode, Communication comm ) { + // prevent duplicate connection + disconnect( this, TQT_SIGNAL( receivedStdout( TDEProcess *, char *, int ) ), + this, TQT_SLOT( slotReceivedStdout( TDEProcess *, char *, int ) ) ); + if ( comm & Stdout ) { + connect( this, TQT_SIGNAL( receivedStdout( TDEProcess *, char *, int ) ), + this, TQT_SLOT( slotReceivedStdout( TDEProcess *, char *, int ) ) ); + } + // prevent duplicate connection + disconnect( this, TQT_SIGNAL( receivedStderr( TDEProcess *, char *, int ) ), + this, TQT_SLOT( slotReceivedStderr( TDEProcess *, char *, int ) ) ); + if ( comm & Stderr ) { + connect( this, TQT_SIGNAL( receivedStderr( TDEProcess *, char *, int ) ), + this, TQT_SLOT( slotReceivedStderr( TDEProcess *, char *, int ) ) ); + } + return TDEProcess::start( runmode, comm ); +} + +void CollectingProcess::slotReceivedStdout( TDEProcess *, char *buf, int len ) +{ + TQByteArray b; + b.duplicate( buf, len ); + d->stdoutBuffer.append( b ); + d->stdoutSize += len; +} + +void CollectingProcess::slotReceivedStderr( TDEProcess *, char *buf, int len ) +{ + TQByteArray b; + b.duplicate( buf, len ); + d->stderrBuffer.append( b ); + d->stderrSize += len; +} + +TQByteArray CollectingProcess::collectedStdout() +{ + if ( d->stdoutSize == 0 ) { + return TQByteArray(); + } + + uint offset = 0; + TQByteArray b( d->stdoutSize ); + for ( TQValueList<TQByteArray>::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; +} + +TQByteArray CollectingProcess::collectedStderr() +{ + if ( d->stderrSize == 0 ) { + return TQByteArray(); + } + + uint offset = 0; + TQByteArray b( d->stderrSize ); + for ( TQValueList<TQByteArray>::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/tdeioslave/audiocd/plugins/lame/collectingprocess.h b/tdeioslave/audiocd/plugins/lame/collectingprocess.h new file mode 100644 index 00000000..df5c180d --- /dev/null +++ b/tdeioslave/audiocd/plugins/lame/collectingprocess.h @@ -0,0 +1,73 @@ +/* -*- mode: C++ -*- + collectingprocess.h + + This file is a copy of the collectingprocess.h which is part of tdepim/libtdepim. + Copyright (c) 2004 Ingo Kloecker <kloecker@kde.org> + + 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 TQt library by Trolltech AS, Norway (or with modified versions + of TQt that use the same license as TQt), 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 + TQt. 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 TDEProcess class. + * + * This class simplifies the usage of TDEProcess by collecting all output + * (stdout/stderr) of the process. + * + * @author Ingo Kloecker <kloecker@kde.org> + */ +class CollectingProcess : public TDEProcess { + Q_OBJECT + +public: + CollectingProcess( TQObject * 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. */ + TQByteArray collectedStdout(); + /** Returns the contents of the stderr buffer and clears it afterwards. */ + TQByteArray collectedStderr(); + +private slots: + void slotReceivedStdout( TDEProcess *, char *, int ); + void slotReceivedStderr( TDEProcess *, char *, int ); + +private: + class Private; + Private * d; +protected: +}; + +#endif // __COLLECTINGPROCESS_H__ diff --git a/tdeioslave/audiocd/plugins/lame/encoderlame.cpp b/tdeioslave/audiocd/plugins/lame/encoderlame.cpp new file mode 100644 index 00000000..8984bb33 --- /dev/null +++ b/tdeioslave/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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include <config.h> +#include <endian.h> +#include "encoderlame.h" +#include "encoderlameconfig.h" +#include "audiocd_lame_encoder.h" + +#include <kdebug.h> +#include <tqgroupbox.h> +#include <kprocess.h> +#include <kdebug.h> + +#include <kglobal.h> +#include <klocale.h> +#include <kapplication.h> +#include <tqfileinfo.h> +#include <ktempfile.h> +#include <kstandarddirs.h> +#include "collectingprocess.h" + +extern "C" +{ + KDE_EXPORT void create_audiocd_encoders(TDEIO::SlaveBase *slave, TQPtrList<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; + TQString lastErrorMessage; + TQStringList genreList; + uint lastSize; + TDEProcess *currentEncodeProcess; + KTempFile *tempFile; +}; + +EncoderLame::EncoderLame(TDEIO::SlaveBase *slave) : TQObject(), AudioCDEncoder(slave) { + d = new Private(); + d->waitingForWrite = false; + d->processHasExited = false; + d->lastSize = 0; + loadSettings(); +} + +EncoderLame::~EncoderLame(){ + delete d; +} + +TQWidget* EncoderLame::getConfigureWidget(TDEConfigSkeleton** manager) const { + (*manager) = Settings::self(); + TDEGlobal::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(TDEProcess::Block, TDEProcess::Stdout); + + if(proc.exitStatus() != 0) + return false; + + const TQByteArray data = proc.collectedStdout(); + TQString str; + if ( !data.isEmpty() ) + str = TQString::fromLocal8Bit( data, data.size() ); + + d->genreList = TQStringList::split( '\n', str ); + // Remove the numbers in front of every genre + for( TQStringList::Iterator it = d->genreList.begin(); it != d->genreList.end(); ++it ) { + TQString& 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(TQString("%1").arg(bitrates[settings->cbr_bitrate()])); + d->bitrate = bitrates[settings->cbr_bitrate()]; + args.append("-q"); + args.append(TQString("%1").arg(quality)); + } + else { + // Variable Bitrate Encoding + if (settings->vbr_average_br()) { + args.append("--abr"); + args.append(TQString("%1").arg(bitrates[settings->vbr_mean_brate()])); + d->bitrate = bitrates[settings->vbr_mean_brate()]; + if (settings->vbr_min_br()){ + args.append("-b"); + args.append(TQString("%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(TQString("%1").arg(bitrates[settings->vbr_max_brate()])); + } + } else { + d->bitrate = 128; + args.append("-V"); + args.append(TQString("%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(TQString("%1").arg(settings->lowfilterfreq())); + + if (settings->set_lpf_width()){ + args.append("--lowpass-width"); + args.append(TQString("%1").arg(settings->lowfilterwidth())); + } + } + + if ( settings->enable_highpass()) { + args.append("--hipass"); + args.append(TQString("%1").arg(settings->highfilterfreq())); + + if (settings->set_hpf_width()){ + args.append("--hipass-width"); + args.append(TQString("%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 TDEProcess + d->currentEncodeProcess = new TDEProcess(0); + TQString prefix = locateLocal("tmp", ""); + d->tempFile = new KTempFile(prefix, ".mp3"); + d->tempFile->setAutoDelete(true); + d->lastErrorMessage = TQString(); + 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, TQT_SIGNAL(receivedStdout(TDEProcess *, char *, int)), + this, TQT_SLOT(receivedStdout(TDEProcess *, char *, int))); + connect(d->currentEncodeProcess, TQT_SIGNAL(receivedStderr(TDEProcess *, char *, int)), + this, TQT_SLOT(receivedStderr(TDEProcess *, char *, int))); + connect(d->currentEncodeProcess, TQT_SIGNAL(wroteStdin(TDEProcess *)), + this, TQT_SLOT(wroteStdin(TDEProcess *))); + + connect(d->currentEncodeProcess, TQT_SIGNAL(processExited(TDEProcess *)), + this, TQT_SLOT(processExited(TDEProcess *))); + + // Launch! + d->currentEncodeProcess->start(TDEProcess::NotifyOnExit, KShellProcess::All); + return 0; +} + +void EncoderLame::processExited ( TDEProcess *process ){ + kdDebug(7117) << "Lame Encoding process exited with: " << process->exitStatus() << endl; + d->processHasExited = true; +} + +void EncoderLame::receivedStderr( TDEProcess * /*process*/, char *buffer, int /*buflen*/ ){ + kdDebug(7117) << "Lame stderr: " << buffer << endl; + if ( !d->lastErrorMessage.isEmpty() ) + d->lastErrorMessage += '\t'; + d->lastErrorMessage += TQString::fromLocal8Bit( buffer ); +} + +void EncoderLame::receivedStdout( TDEProcess * /*process*/, char *buffer, int /*length*/ ){ + kdDebug(7117) << "Lame stdout: " << buffer << endl; +} + +void EncoderLame::wroteStdin( TDEProcess * /*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 + TQFileInfo 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 + TQFile file( d->tempFile->name() ); + if ( file.open( IO_ReadOnly ) ) { + TQByteArray 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 TQString &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(TQString("%1").arg(info.get("year").toString())); + + trackInfo.append("--tc"); + trackInfo.append(comment); + + trackInfo.append("--tn"); + trackInfo.append(TQString("%1").arg(track+1)); + + const TQString genre = info.get( "genre" ).toString(); + if ( d->genreList.find( genre ) != d->genreList.end() ) + { + trackInfo.append("--tg"); + trackInfo.append(genre); + } +} + + +TQString EncoderLame::lastErrorMessage() const +{ + return d->lastErrorMessage; +} + +#include "encoderlame.moc" diff --git a/tdeioslave/audiocd/plugins/lame/encoderlame.h b/tdeioslave/audiocd/plugins/lame/encoderlame.h new file mode 100644 index 00000000..09c323c3 --- /dev/null +++ b/tdeioslave/audiocd/plugins/lame/encoderlame.h @@ -0,0 +1,68 @@ +/* + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef ENCODER_LAME_H +#define ENCODER_LAME_H + +#include "audiocdencoder.h" + +class TDEProcess; + +/** + * MP3 encoder using the LAME encoder. + * Go to http://lame.sourceforge.net/ for lots of information. + */ +class EncoderLame : public TQObject, public AudioCDEncoder { + +Q_OBJECT + + +public: + EncoderLame(TDEIO::SlaveBase *slave); + ~EncoderLame(); + + virtual TQString 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 TQString &comment ); + virtual long readInit(long size); + virtual long read(int16_t * buf, int frames); + virtual long readCleanup(); + virtual TQString lastErrorMessage() const; + + virtual TQWidget* getConfigureWidget(TDEConfigSkeleton** manager) const; + +protected slots: + void wroteStdin(TDEProcess *proc); + void receivedStdout(TDEProcess *, char *buffer, int length); + void receivedStderr(TDEProcess *proc, char *buffer, int buflen); + void processExited(TDEProcess *proc); + +private: + class Private; + Private * d; + + TQStringList args; + TQStringList trackInfo; +}; + +#endif // ENCODER_LAME_H + diff --git a/tdeioslave/audiocd/plugins/lame/encoderlameconfig.ui b/tdeioslave/audiocd/plugins/lame/encoderlameconfig.ui new file mode 100644 index 00000000..f8149741 --- /dev/null +++ b/tdeioslave/audiocd/plugins/lame/encoderlameconfig.ui @@ -0,0 +1,930 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>EncoderLameConfig</class> +<widget class="TQWidget"> + <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="TQGroupBox" 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="TQCheckBox"> + <property name="name"> + <cstring>kcfg_copyright</cstring> + </property> + <property name="text"> + <string>Cop&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="TQCheckBox"> + <property name="name"> + <cstring>kcfg_original</cstring> + </property> + <property name="text"> + <string>Origi&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="TQCheckBox"> + <property name="name"> + <cstring>kcfg_iso</cstring> + </property> + <property name="text"> + <string>&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="TQCheckBox"> + <property name="name"> + <cstring>kcfg_crc</cstring> + </property> + <property name="text"> + <string>&Error protection</string> + </property> + </widget> + <widget class="TQCheckBox"> + <property name="name"> + <cstring>kcfg_id3_tag</cstring> + </property> + <property name="text"> + <string>&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="TQButtonGroup" 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="TQLayoutWidget" 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="TQLabel"> + <property name="name"> + <cstring>TextLabel3_2</cstring> + </property> + <property name="text"> + <string>Low</string> + </property> + </widget> + <widget class="TQSlider"> + <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="TQLabel"> + <property name="name"> + <cstring>TextLabel2_2</cstring> + </property> + <property name="text"> + <string>High</string> + </property> + </widget> + </hbox> + </widget> + <widget class="TQLabel" row="2" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>TextLabel1_2</cstring> + </property> + <property name="text"> + <string>&Quality:</string> + </property> + <property name="alignment"> + <set>AlignLeft</set> + </property> + <property name="buddy" stdset="0"> + <cstring>kcfg_quality</cstring> + </property> + </widget> + <widget class="TQComboBox" 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 <i>"Mono"</i> reduces file size, but also kills the stereo signal.</string> + </property> + </widget> + <widget class="TQRadioButton" row="0" column="0"> + <property name="name"> + <cstring>kcfg_bitrate_constant</cstring> + </property> + <property name="text"> + <string>Constant bitrate</string> + </property> + </widget> + <widget class="TQRadioButton" 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="TQGroupBox" 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="TQCheckBox" row="3" column="0"> + <property name="name"> + <cstring>kcfg_vbr_average_br</cstring> + </property> + <property name="text"> + <string>Specify avera&ge bitrate:</string> + </property> + <property name="whatsThis" stdset="0"> + <string>This selects the maximal bitrate used for encoding.</string> + </property> + </widget> + <widget class="TQComboBox" 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="TQCheckBox" 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&trate:</string> + </property> + <property name="whatsThis" stdset="0"> + <string>This selects the maximal bitrate used for encoding.</string> + </property> + </widget> + <widget class="TQCheckBox" row="4" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>kcfg_vbr_xing_tag</cstring> + </property> + <property name="text"> + <string>Write &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="TQComboBox" 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="TQCheckBox" 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 &value is a hard limit</string> + </property> + </widget> + <widget class="TQCheckBox" 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 &bitrate:</string> + </property> + <property name="whatsThis" stdset="0"> + <string>This selects the minimal bitrate used for encoding.</string> + </property> + </widget> + <widget class="TQComboBox" 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="TQGroupBox" 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="TQLabel"> + <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="TQComboBox"> + <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="TQGroupBox" 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="TQCheckBox" row="0" column="0"> + <property name="name"> + <cstring>kcfg_enable_lowpass</cstring> + </property> + <property name="text"> + <string>&Lowpass filter cutoff above</string> + </property> + </widget> + <widget class="TQSpinBox" 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="TQCheckBox" row="2" column="0"> + <property name="name"> + <cstring>kcfg_enable_highpass</cstring> + </property> + <property name="text"> + <string>&Highpass filter cutoff below</string> + </property> + </widget> + <widget class="TQSpinBox" 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="TQCheckBox" 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&pass filter width</string> + </property> + </widget> + <widget class="TQSpinBox" 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="TQCheckBox" 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&ss filter width</string> + </property> + </widget> + <widget class="TQSpinBox" 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> |