traverso-commit
[Top][All Lists]
Advanced

[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 &lt;-> 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]