[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Traverso-commit] traverso/src audiofileio/audiofileio.pro audiof...
From: |
Ben Levitt |
Subject: |
[Traverso-commit] traverso/src audiofileio/audiofileio.pro audiof... |
Date: |
Fri, 21 Sep 2007 01:36:25 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Ben Levitt <benjie> 07/09/21 01:36:24
Modified files:
src/audiofileio: audiofileio.pro
src/audiofileio/decode: MadAudioReader.cpp
src/audiofileio/encode: AbstractAudioWriter.cpp
src/core : ReadSource.cpp
src/traverso : ExportWidget.cpp ExportWidget.h traverso.pro
src/traverso/ui: ExportWidget.ui
Added files:
src/audiofileio/encode: LameAudioWriter.cpp LameAudioWriter.h
Log message:
- Add mp3 encoding using libmp3lame
- Add ui for simple-ish mp3 settings in ExportWidget
- Relaytoolize libmp3lame
- Fix SEGV in ReadSource when m_bufferstatus wasn't always created
- Fix SEGV in ReadSource when syncing a clip with a NULL m_audioReader
- Clean up ExportWidget ComboBoxes to use UserData instead of just index
- ExportWidget spelling error: save -> safe :)
- ExportWidget whitespace cleanup
- ExportWidget: don't pop up the "Another CD?" box after querying for
devices
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/audiofileio.pro?cvsroot=traverso&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/decode/MadAudioReader.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/encode/AbstractAudioWriter.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/encode/LameAudioWriter.cpp?cvsroot=traverso&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/encode/LameAudioWriter.h?cvsroot=traverso&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.60&r2=1.61
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/ExportWidget.cpp?cvsroot=traverso&r1=1.55&r2=1.56
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/ExportWidget.h?cvsroot=traverso&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/traverso.pro?cvsroot=traverso&r1=1.67&r2=1.68
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/ui/ExportWidget.ui?cvsroot=traverso&r1=1.16&r2=1.17
Patches:
Index: audiofileio/audiofileio.pro
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/audiofileio.pro,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- audiofileio/audiofileio.pro 18 Sep 2007 15:52:18 -0000 1.9
+++ audiofileio/audiofileio.pro 21 Sep 2007 01:36:23 -0000 1.10
@@ -19,7 +19,8 @@
decode/MadAudioReader.cpp \
encode/AbstractAudioWriter.cpp \
encode/SFAudioWriter.cpp \
- encode/WPAudioWriter.cpp
+ encode/WPAudioWriter.cpp \
+ encode/LameAudioWriter.cpp
HEADERS = decode/AbstractAudioReader.h \
decode/SFAudioReader.h \
decode/FlacAudioReader.h \
@@ -30,7 +31,7 @@
encode/AbstractAudioWriter.h \
encode/SFAudioWriter.h \
encode/WPAudioWriter.h \
- decode/PeakDataReader.h
+ encode/LameAudioWriter.h
macx{
QMAKE_LIBDIR += /usr/local/qt/lib
}
@@ -52,6 +53,8 @@
DEFINES += RELAYTOOL_MAD="'static const int libmad_is_present=1;
static int __attribute__((unused)) libmad_symbol_is_present(char *) { return 1;
}'"
DEFINES += RELAYTOOL_VORBISFILE="'static const int
libvorbisfile_is_present=1; static int __attribute__((unused))
libvorbisfile_symbol_is_present(char *) { return 1; }'"
+
+ DEFINES += RELAYTOOL_MP3LAME="'static const int
libmp3lame_is_present=1; static int __attribute__((unused))
libmp3lame_symbol_is_present(char *) { return 1; }'"
}
}
@@ -61,6 +64,8 @@
DEFINES += RELAYTOOL_MAD="\"static const int libmad_is_present=1; static
int __attribute__((unused)) libmad_symbol_is_present(char *) { return 1; }\""
DEFINES += RELAYTOOL_VORBISFILE="\"static const int
libvorbisfile_is_present=1; static int __attribute__((unused))
libvorbisfile_symbol_is_present(char *) { return 1; }\""
+
+ DEFINES += RELAYTOOL_MP3LAME="\"static const int libmp3lame_is_present=1;
static int __attribute__((unused)) libmp3lame_symbol_is_present(char *) {
return 1; }\""
}
HEADERS -= PeakDataReader.h \
decode/PeakDataReader.h
Index: audiofileio/decode/MadAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/decode/MadAudioReader.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- audiofileio/decode/MadAudioReader.cpp 10 Sep 2007 21:22:44 -0000
1.6
+++ audiofileio/decode/MadAudioReader.cpp 21 Sep 2007 01:36:24 -0000
1.7
@@ -520,7 +520,7 @@
m_nframes = countFrames();
- if (m_length <= 0) {
+ if (m_nframes <= 0) {
d->handle->cleanup();
delete d->handle;
delete d;
@@ -531,7 +531,6 @@
m_rate = d->firstHeader.samplerate;
m_length = TimeRef(m_nframes, m_rate);
-
d->overflowBuffers = 0;
seek_private(0);
Index: audiofileio/encode/AbstractAudioWriter.cpp
===================================================================
RCS file:
/sources/traverso/traverso/src/audiofileio/encode/AbstractAudioWriter.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- audiofileio/encode/AbstractAudioWriter.cpp 15 Aug 2007 00:18:49 -0000
1.6
+++ audiofileio/encode/AbstractAudioWriter.cpp 21 Sep 2007 01:36:24 -0000
1.7
@@ -22,10 +22,12 @@
#include "AbstractAudioWriter.h"
#include "SFAudioWriter.h"
#include "WPAudioWriter.h"
+#include "LameAudioWriter.h"
#include <QString>
RELAYTOOL_WAVPACK
+RELAYTOOL_MP3LAME
// Always put me below _all_ includes, this is needed
// in case we run with memory leak detection enabled!
@@ -130,10 +132,10 @@
else if (libwavpack_is_present && type == "wavpack") {
return new WPAudioWriter();
}
- /*else if (type == "mad") {
- return new MadAudioWriter();
+ else if (libmp3lame_is_present && type == "lame") {
+ return new LameAudioWriter();
}
- else if (type == "flac") {
+ /*else if (type == "flac") {
return new FlacAudioWriter();
}
else if (type == "vorbis") {
Index: core/ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -b -r1.60 -r1.61
--- core/ReadSource.cpp 20 Sep 2007 18:25:15 -0000 1.60
+++ core/ReadSource.cpp 21 Sep 2007 01:36:24 -0000 1.61
@@ -195,6 +195,8 @@
Project* project = pm().get_project();
+ m_bufferstatus = new BufferStatus;
+
// Fake the samplerate, until it's set by an AudioReader!
m_rate = project->get_rate();
@@ -259,8 +261,6 @@
m_rate = m_audioReader->get_file_rate();
m_length = m_audioReader->get_length();
- m_bufferstatus = new BufferStatus;
-
return 1;
}
@@ -458,6 +458,7 @@
m_rbRelativeFileReadPos = fileposition;
}
+
void ReadSource::process_ringbuffer(DecodeBuffer* buffer, bool seeking)
{
// Do nothing if we passed the lenght of the AudioFile.
@@ -529,6 +530,11 @@
void ReadSource::sync(DecodeBuffer* buffer)
{
PENTER2;
+
+ if (!m_audioReader) {
+ return;
+ }
+
if (!m_needSync) {
return;
}
Index: traverso/ExportWidget.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/ExportWidget.cpp,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -b -r1.55 -r1.56
--- traverso/ExportWidget.cpp 30 Aug 2007 20:42:43 -0000 1.55
+++ traverso/ExportWidget.cpp 21 Sep 2007 01:36:24 -0000 1.56
@@ -61,56 +61,38 @@
set_project(pm().get_project());
- //bitdepthComboBox->insertItem(0, "8");
- bitdepthComboBox->insertItem(0, "16");
- bitdepthComboBox->insertItem(1, "24");
- bitdepthComboBox->insertItem(2, "32");
- bitdepthComboBox->insertItem(3, "32 (float)");
-
- channelComboBox->insertItem(0, "Stereo");
- channelComboBox->insertItem(1, "Mono");
-
- sampleRateComboBox->insertItem(0, "8.000 Hz");
- sampleRateComboBox->insertItem(1, "11.025 Hz");
- sampleRateComboBox->insertItem(2, "22.050 Hz");
- sampleRateComboBox->insertItem(3, "44.100 Hz");
- sampleRateComboBox->insertItem(4, "48.000 Hz");
- sampleRateComboBox->insertItem(5, "88.200 Hz");
- sampleRateComboBox->insertItem(6, "96.000 Hz");
-
- audioTypeComboBox->insertItem(0, "WAV");
- audioTypeComboBox->insertItem(1, "AIFF");
- audioTypeComboBox->insertItem(2, "FLAC");
-
+ //bitdepthComboBox->addItem("8", 8);
+ bitdepthComboBox->addItem("16", 16);
+ bitdepthComboBox->addItem("24", 24);
+ bitdepthComboBox->addItem("32", 32);
+ bitdepthComboBox->addItem("32 (float)", 1);
+
+ channelComboBox->addItem("Stereo", 2);
+ channelComboBox->addItem("Mono", 1);
+
+ sampleRateComboBox->addItem("8.000 Hz", 8000);
+ sampleRateComboBox->addItem("11.025 Hz", 11025);
+ sampleRateComboBox->addItem("22.050 Hz", 22050);
+ sampleRateComboBox->addItem("44.100 Hz", 44100);
+ sampleRateComboBox->addItem("48.000 Hz", 48000);
+ sampleRateComboBox->addItem("88.200 Hz", 88200);
+ sampleRateComboBox->addItem("96.000 Hz", 96000);
+
+ audioTypeComboBox->addItem("WAV", "wav");
+ audioTypeComboBox->addItem("AIFF", "aiff");
+ audioTypeComboBox->addItem("FLAC", "flac");
if (libwavpack_is_present) {
- audioTypeComboBox->insertItem(3, "WAVPACK");
+ audioTypeComboBox->addItem("WAVPACK", "wavpack");
}
+ audioTypeComboBox->addItem("MP3", "mp3");
- bitdepthComboBox->setCurrentIndex(0);
+ bitdepthComboBox->setCurrentIndex(bitdepthComboBox->findData(16));
- switch(audiodevice().get_sample_rate()) {
- case 8000:
- sampleRateComboBox->setCurrentIndex(0);
- break;
- case 11025:
- sampleRateComboBox->setCurrentIndex(1);
- break;
- case 22050:
- sampleRateComboBox->setCurrentIndex(2);
- break;
- case 44100:
- sampleRateComboBox->setCurrentIndex(3);
- break;
- case 48000:
- sampleRateComboBox->setCurrentIndex(4);
- break;
- case 88200:
- sampleRateComboBox->setCurrentIndex(5);
- break;
- case 96000:
- sampleRateComboBox->setCurrentIndex(6);
- break;
+ int rateIndex =
sampleRateComboBox->findData(audiodevice().get_sample_rate());
+ if (rateIndex == -1) {
+ rateIndex = 0;
}
+ sampleRateComboBox->setCurrentIndex(rateIndex);
show_settings_view();
@@ -118,8 +100,39 @@
connect(buttonBox, SIGNAL(rejected()), this,
SLOT(on_cancelButton_clicked()));
connect(closeButton, SIGNAL(clicked()), this, SLOT(hide()));
connect(&pm(), SIGNAL(projectLoaded(Project*)), this,
SLOT(set_project(Project*)));
+ connect(audioTypeComboBox, SIGNAL(currentIndexChanged(int)), this,
SLOT(audio_type_changed(int)));
+ // Mp3 Options Setup
+ mp3MethodComboBox->addItem("Constant Bitrate", "cbr");
+ mp3MethodComboBox->addItem("Average Bitrate", "abr");
+ mp3MethodComboBox->addItem("Variable Bitrate", "vbr-new");
+
+ mp3MinBitrateComboBox->addItem("32 - recommended", "32");
+ mp3MinBitrateComboBox->addItem("64", "64");
+ mp3MinBitrateComboBox->addItem("96", "96");
+ mp3MinBitrateComboBox->addItem("128", "128");
+ mp3MinBitrateComboBox->addItem("160", "160");
+ mp3MinBitrateComboBox->addItem("192", "192");
+ mp3MinBitrateComboBox->addItem("256", "256");
+ mp3MinBitrateComboBox->addItem("320", "320");
+
+ mp3MaxBitrateComboBox->addItem("32", "32");
+ mp3MaxBitrateComboBox->addItem("64", "64");
+ mp3MaxBitrateComboBox->addItem("96", "96");
+ mp3MaxBitrateComboBox->addItem("128", "128");
+ mp3MaxBitrateComboBox->addItem("160", "160");
+ mp3MaxBitrateComboBox->addItem("192", "192");
+ mp3MaxBitrateComboBox->addItem("256", "256");
+ mp3MaxBitrateComboBox->addItem("320", "320");
+
+
mp3MethodComboBox->setCurrentIndex(mp3MethodComboBox->findData("vbr-new"));
+
mp3MinBitrateComboBox->setCurrentIndex(mp3MinBitrateComboBox->findData("32"));
+
mp3MaxBitrateComboBox->setCurrentIndex(mp3MaxBitrateComboBox->findData("192"));
+
+ mp3OptionsGroupBox->hide();
+ connect(mp3MethodComboBox, SIGNAL(currentIndexChanged(int)), this,
SLOT(mp3_method_changed(int)));
+
// CD Burning stuff....
@@ -151,7 +164,7 @@
{}
-bool ExportWidget::is_save_to_export()
+bool ExportWidget::is_safe_to_export()
{
PENTER;
if (m_project->is_recording()) {
@@ -172,9 +185,44 @@
return true;
}
+
+void ExportWidget::audio_type_changed(int index)
+{
+ if (audioTypeComboBox->itemData(index).toString() == "mp3") {
+ mp3OptionsGroupBox->show();
+ }
+ else {
+ mp3OptionsGroupBox->hide();
+ }
+}
+
+
+void ExportWidget::mp3_method_changed(int index)
+{
+ QString method = mp3MethodComboBox->itemData(index).toString();
+
+ if (method == "cbr") {
+ mp3MinBitrateComboBox->hide();
+ mp3MinBitrateLabel->hide();
+ mp3MaxBitrateLabel->setText(tr("Bitrate"));
+ }
+ else if (method == "abr") {
+ mp3MinBitrateComboBox->hide();
+ mp3MinBitrateLabel->hide();
+ mp3MaxBitrateLabel->setText(tr("Average Bitrate"));
+ }
+ else {
+ // VBR new or VBR old
+ mp3MinBitrateComboBox->show();
+ mp3MinBitrateLabel->show();
+ mp3MaxBitrateLabel->setText(tr("Maximum Bitrate"));
+ }
+}
+
+
void ExportWidget::on_exportStartButton_clicked( )
{
- if (!is_save_to_export()) {
+ if (!is_safe_to_export()) {
return;
}
@@ -186,76 +234,35 @@
m_exportSpec->extraFormat.clear();
- switch (audioTypeComboBox->currentIndex()) {
- case 0:
+ QString audioType =
audioTypeComboBox->itemData(audioTypeComboBox->currentIndex()).toString();
+ if (audioType == "wav") {
m_exportSpec->writerType = "sndfile";
m_exportSpec->extraFormat["filetype"] = "wav";
- break;
- case 1:
+ }
+ else if (audioType == "aiff") {
m_exportSpec->writerType = "sndfile";
m_exportSpec->extraFormat["filetype"] = "aiff";
- break;
- case 2:
+ }
+ else if (audioType == "flac") {
m_exportSpec->writerType = "sndfile";
m_exportSpec->extraFormat["filetype"] = "flac";
- break;
- case 3:
+ }
+ else if (audioType == "mp3") {
+ m_exportSpec->writerType = "lame";
+ m_exportSpec->extraFormat["method"] =
mp3MethodComboBox->itemData(mp3MethodComboBox->currentIndex()).toString();
+ m_exportSpec->extraFormat["minBitrate"] =
mp3MinBitrateComboBox->itemData(mp3MinBitrateComboBox->currentIndex()).toString();
+ m_exportSpec->extraFormat["maxBitrate"] =
mp3MaxBitrateComboBox->itemData(mp3MaxBitrateComboBox->currentIndex()).toString();
+ m_exportSpec->extraFormat["quality"] =
QString::number(mp3QualitySlider->value());
+ }
+ else if (audioType == "wavpack") {
m_exportSpec->writerType = "wavpack";
m_exportSpec->extraFormat["quality"] = "high";
m_exportSpec->extraFormat["skip_wvx"] = "true";
- break;
- }
-
- switch (bitdepthComboBox->currentIndex()) {
- //case 0:
- // m_exportSpec->data_width = 8;
- // break;
- case 0:
- m_exportSpec->data_width = 16;
- break;
- case 1:
- m_exportSpec->data_width = 24;
- break;
- case 2:
- m_exportSpec->data_width = 32;
- break;
- case 3:
- m_exportSpec->data_width = 1; // 1 means float
- break;
- }
-
- switch (channelComboBox->currentIndex()) {
- case 0:
- m_exportSpec->channels = 2;
- break;
- case 1:
- m_exportSpec->channels = 1;
- break;
}
- switch (sampleRateComboBox->currentIndex()) {
- case 0:
- m_exportSpec->sample_rate = 8000;
- break;
- case 1:
- m_exportSpec->sample_rate = 11025;
- break;
- case 2:
- m_exportSpec->sample_rate = 22050;
- break;
- case 3:
- m_exportSpec->sample_rate = 44100;
- break;
- case 4:
- m_exportSpec->sample_rate = 48000;
- break;
- case 5:
- m_exportSpec->sample_rate = 88200;
- break;
- case 6:
- m_exportSpec->sample_rate = 96000;
- break;
- }
+ m_exportSpec->data_width =
bitdepthComboBox->itemData(channelComboBox->currentIndex()).toInt();
+ m_exportSpec->channels =
channelComboBox->itemData(channelComboBox->currentIndex()).toInt();
+ m_exportSpec->sample_rate =
sampleRateComboBox->itemData(sampleRateComboBox->currentIndex()).toInt();
//TODO Make a ComboBox for this one too!
m_exportSpec->dither_type = GDitherTri;
@@ -303,9 +310,9 @@
QString dirName = QFileDialog::getExistingDirectory(this,
tr("Choose/create an export directory"), m_exportSpec->exportdir);
- if (!dirName.isEmpty())
+ if (!dirName.isEmpty()) {
exportDirName->setText(dirName);
-
+ }
}
@@ -459,7 +466,7 @@
{
PENTER;
- if(!is_save_to_export()) {
+ if(!is_safe_to_export()) {
return;
}
@@ -505,6 +512,7 @@
progressBar->setMaximum(100);
progressBar->setValue(0);
+ if (m_writingState == BURNING) {
// check if we have to write another CD
bool writeAnotherCd = false;
if (m_copyNumber < spinBoxNumCopies->value()) {
@@ -515,10 +523,11 @@
if (writeAnotherCd) {
write_to_cd();
+ return;
}
- else {
- enable_ui_interaction();
}
+
+ enable_ui_interaction();
}
void ExportWidget::cd_render()
Index: traverso/ExportWidget.h
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/ExportWidget.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- traverso/ExportWidget.h 30 Aug 2007 20:42:43 -0000 1.14
+++ traverso/ExportWidget.h 21 Sep 2007 01:36:24 -0000 1.15
@@ -52,7 +52,7 @@
void show_progress_view();
void show_settings_view();
- bool is_save_to_export();
+ bool is_safe_to_export();
void cd_render();
void write_to_cd();
void disable_ui_interaction();
@@ -91,6 +91,9 @@
void on_cancelButton_clicked();
void export_only_changed(int state);
+ void audio_type_changed(int index);
+ void mp3_method_changed(int index);
+
void start_burn_process();
void stop_burn_process();
void read_standard_output();
Index: traverso/traverso.pro
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/traverso.pro,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -b -r1.67 -r1.68
--- traverso/traverso.pro 14 Aug 2007 04:12:57 -0000 1.67
+++ traverso/traverso.pro 21 Sep 2007 01:36:24 -0000 1.68
@@ -160,11 +160,13 @@
system(which relaytool 2>/dev/null >/dev/null) {
LIBS += $$system(relaytool --relay FLAC -lFLAC)
LIBS += $$system(relaytool --relay mad -lmad)
+ LIBS += $$system(relaytool --relay mp3lame -lmp3lame)
LIBS += $$system(relaytool --relay vorbisfile -lvorbisfile)
LIBS += $$system(relaytool --relay wavpack -lwavpack)
} else {
LIBS += -lvorbisfile \
-lmad \
+ -lmp3lame \
-lFLAC \
-lwavpack
}
@@ -173,6 +175,7 @@
!unix { #non-unix systems don't have relaytool
LIBS += -lvorbisfile \
-lmad \
+ -lmp3lame \
-lFLAC \
-lwavpack
}
Index: traverso/ui/ExportWidget.ui
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/ui/ExportWidget.ui,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- traverso/ui/ExportWidget.ui 30 Aug 2007 20:42:43 -0000 1.16
+++ traverso/ui/ExportWidget.ui 21 Sep 2007 01:36:24 -0000 1.17
@@ -15,14 +15,24 @@
<property name="windowTitle" >
<string>Export</string>
</property>
- <layout class="QGridLayout" >
+ <layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
- <item row="0" column="0" >
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ </layout>
+ </item>
+ <item>
<widget class="QTabWidget" name="tabWidget" >
<property name="enabled" >
<bool>true</bool>
@@ -146,8 +156,8 @@
<widget class="QCheckBox" name="normalizeCheckBox" >
<property name="sizePolicy" >
<sizepolicy>
- <hsizetype>1</hsizetype>
- <vsizetype>5</vsizetype>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -282,6 +292,177 @@
</widget>
</item>
<item>
+ <widget class="QGroupBox" name="mp3OptionsGroupBox" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>MP3 Options</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_15" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>4</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Encoding Method</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="mp3MaxBitrateLabel" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>4</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Maximum Bitrate</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="mp3MinBitrateLabel" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>4</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Minimum Bitrate</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_16" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>4</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Quality (Fastest <-> Best)</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QComboBox" name="mp3MaxBitrateComboBox" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>5</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QComboBox" name="mp3MinBitrateComboBox" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>5</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QComboBox" name="mp3MethodComboBox" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>5</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSlider" name="mp3QualitySlider" >
+ <property name="layoutDirection" >
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>9</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>3</number>
+ </property>
+ <property name="tracking" >
+ <bool>true</bool>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="invertedAppearance" >
+ <bool>true</bool>
+ </property>
+ <property name="invertedControls" >
+ <bool>false</bool>
+ </property>
+ <property name="tickPosition" >
+ <enum>QSlider::TicksAbove</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
Index: audiofileio/encode/LameAudioWriter.cpp
===================================================================
RCS file: audiofileio/encode/LameAudioWriter.cpp
diff -N audiofileio/encode/LameAudioWriter.cpp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ audiofileio/encode/LameAudioWriter.cpp 21 Sep 2007 01:36:24 -0000
1.1
@@ -0,0 +1,227 @@
+/*
+Copyright (C) 2007 Ben Levitt
+
+This file is part of Traverso
+
+Traverso 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 St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+*/
+
+#include "LameAudioWriter.h"
+
+#include <stdio.h>
+#include <lame/lame.h>
+
+#include <QString>
+
+// Always put me below _all_ includes, this is needed
+// in case we run with memory leak detection enabled!
+#include "Debugger.h"
+
+
+// This just exists to keep lame types private and out of LameAudioWriter.h
+struct LameAudioWriter::LameInfo {
+ lame_global_flags *flags;
+};
+
+
+LameAudioWriter::LameAudioWriter()
+ : AbstractAudioWriter()
+{
+ m_fid = 0;
+ m_lameInfo = new LameInfo();
+ m_lameInfo->flags = 0;
+ m_bufferSize = 0;
+ m_buffer = 0;
+
+ // Quality settings
+ m_method = 0;
+ m_minBitrate = 0;
+ m_maxBitrate = 0;
+ m_quality = 0;
+}
+
+
+LameAudioWriter::~LameAudioWriter()
+{
+ if (m_fid) {
+ close_private();
+ }
+ if (m_buffer) {
+ delete [] m_buffer;
+ }
+ delete m_lameInfo;
+}
+
+
+const char* LameAudioWriter::get_extension()
+{
+ return ".mp3";
+}
+
+
+bool LameAudioWriter::set_format_attribute(const QString& key, const QString&
value)
+{
+
+ if (key == "method") {
+ if (value == "cbr") {
+ m_method = 0;
+ return true;
+ }
+ else if (value == "abr") {
+ m_method = 1;
+ return true;
+ }
+ else if (value == "vbr-old") {
+ m_method = 2;
+ return true;
+ }
+ else if (value == "vbr-new") {
+ m_method = 3;
+ return true;
+ }
+ }
+ else if (key == "minBitrate") {
+ m_minBitrate = value.toInt();
+ return true;
+ }
+ else if (key == "maxBitrate") {
+ m_maxBitrate = value.toInt();
+ return true;
+ }
+ else if (key == "quality") {
+ m_quality = value.toInt();
+ return true;
+ }
+
+ return false;
+}
+
+
+bool LameAudioWriter::open_private()
+{
+ m_fid = fopen(m_fileName.toUtf8().data(), "w+");
+ if (!m_fid) {
+ return false;
+ }
+
+ m_lameInfo->flags = lame_init();
+
+ if (m_lameInfo->flags == 0) {
+ PERROR("lame_init failed.");
+ return false;
+ }
+
+ lame_set_in_samplerate(m_lameInfo->flags, m_rate);
+ lame_set_num_channels(m_lameInfo->flags, m_channels);
+ lame_set_out_samplerate(m_lameInfo->flags, m_rate);
+
+
+ if(m_method == 0) {
+ // Constant Bitrate
+ lame_set_VBR(m_lameInfo->flags, vbr_off);
+ lame_set_brate(m_lameInfo->flags, m_maxBitrate);
+ }
+ else if (m_method == 1) {
+ // Average Bitrate
+ lame_set_VBR(m_lameInfo->flags, vbr_abr);
+ lame_set_VBR_mean_bitrate_kbps(m_lameInfo->flags, m_maxBitrate);
+ }
+ else if (m_method == 2) {
+ // Variable Bitrate (old)
+ lame_set_VBR(m_lameInfo->flags, vbr_default);
+ lame_set_VBR_min_bitrate_kbps(m_lameInfo->flags, m_minBitrate);
+ lame_set_VBR_max_bitrate_kbps(m_lameInfo->flags, m_maxBitrate);
+ }
+ else if (m_method == 3) {
+ // Variable Bitrate (new)
+ lame_set_VBR(m_lameInfo->flags, vbr_default);
+ lame_set_VBR_min_bitrate_kbps(m_lameInfo->flags, m_minBitrate);
+ lame_set_VBR_max_bitrate_kbps(m_lameInfo->flags, m_maxBitrate);
+ }
+
+ lame_set_quality(m_lameInfo->flags, m_quality);
+
+
+ //
+ // file options
+ //
+ lame_set_copyright(m_lameInfo->flags, false);
+ lame_set_original(m_lameInfo->flags, true);
+ lame_set_strict_ISO(m_lameInfo->flags, false);
+ lame_set_error_protection(m_lameInfo->flags, false);
+
+ return (lame_init_params(m_lameInfo->flags ) != -1);
+}
+
+
+nframes_t LameAudioWriter::write_private(void* buffer, nframes_t frameCount)
+{
+ if (m_bufferSize < frameCount * 1.25 + 7200) {
+ if (m_buffer) {
+ delete [] m_buffer;
+ }
+ m_bufferSize = (long)(frameCount * 1.25 + 7200);
+ m_buffer = new char[m_bufferSize];
+ }
+
+ int size = lame_encode_buffer_interleaved(m_lameInfo->flags,
+ (short*)buffer,
+ frameCount,
+ (unsigned char*)m_buffer,
+ m_bufferSize);
+
+ if (size < 0) {
+ PERROR("lame_encode_buffer_interleaved failed.");
+ return 0;
+ }
+ if (size > 0 && fwrite(m_buffer, 1, size, m_fid) != (nframes_t)size) {
+ PERROR("writing mp3 data failed.");
+ return 0;
+ }
+
+ return frameCount;
+}
+
+
+void LameAudioWriter::close_private()
+{
+ if (m_fid)
+ {
+ if (m_bufferSize < 7200) {
+ if (m_buffer) {
+ delete [] m_buffer;
+ }
+ m_bufferSize = 7200;
+ m_buffer = new char[m_bufferSize];
+ }
+
+ int size = lame_encode_flush(m_lameInfo->flags,
+ (unsigned char*)m_buffer,
+ m_bufferSize);
+ if(size > 0) {
+ fwrite(m_buffer, 1, size, m_fid);
+ }
+
+ lame_mp3_tags_fid(m_lameInfo->flags, m_fid);
+
+ lame_close(m_lameInfo->flags);
+ m_lameInfo->flags = 0;
+
+ fclose(m_fid);
+ m_fid = 0;
+ }
+}
+
Index: audiofileio/encode/LameAudioWriter.h
===================================================================
RCS file: audiofileio/encode/LameAudioWriter.h
diff -N audiofileio/encode/LameAudioWriter.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ audiofileio/encode/LameAudioWriter.h 21 Sep 2007 01:36:24 -0000
1.1
@@ -0,0 +1,60 @@
+/*
+Copyright (C) 2007 Ben Levitt
+
+This file is part of Traverso
+
+Traverso 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 St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+*/
+
+#ifndef LAMEAUDIOWRITER_H
+#define LAMEAUDIOWRITER_H
+
+#include "AbstractAudioWriter.h"
+#include "defines.h"
+
+
+class QString;
+
+class LameAudioWriter : public AbstractAudioWriter
+{
+ Q_OBJECT
+
+public:
+ LameAudioWriter();
+ ~LameAudioWriter();
+
+ bool set_format_attribute(const QString& key, const QString& value);
+ const char* get_extension();
+
+protected:
+ bool open_private();
+ nframes_t write_private(void* buffer, nframes_t frameCount);
+ void close_private();
+
+ struct LameInfo;
+ LameInfo* m_lameInfo;
+
+ char *m_buffer;
+ long m_bufferSize;
+ FILE* m_fid;
+
+ int m_method; // 0=CBR, 1=ABR, 2=VBR-old, 3=VBR-new
+ int m_minBitrate; // unused for CBR, ABR
+ int m_maxBitrate; // used as the bitrate for CBR, ABR
+ int m_quality; // performance / quality tradeoff 0=slow and
good, 9=fast and rough
+};
+
+#endif