traverso-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Traverso-commit] traverso/src core/DiskIO.cpp core/DiskIO.h core...


From: Remon Sijrier
Subject: [Traverso-commit] traverso/src core/DiskIO.cpp core/DiskIO.h core...
Date: Thu, 29 Nov 2007 19:52:18 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/11/29 19:52:18

Modified files:
        src/core       : DiskIO.cpp DiskIO.h ReadSource.cpp Song.cpp 
                         Song.h 
        src/traverso   : Interface.cpp Interface.h 

Log message:
        * detect samplerate conversion config change, and apply at runtime
        * added submenu in Settings menu to select resample quality
        * Move check for proper ReadSource channel count in 
DiskIO::register_read_source() so we don't check for it in the very often run 
there_are_processable_sources()

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/DiskIO.cpp?cvsroot=traverso&r1=1.54&r2=1.55
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/DiskIO.h?cvsroot=traverso&r1=1.26&r2=1.27
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ReadSource.cpp?cvsroot=traverso&r1=1.83&r2=1.84
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.cpp?cvsroot=traverso&r1=1.162&r2=1.163
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.h?cvsroot=traverso&r1=1.75&r2=1.76
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/Interface.cpp?cvsroot=traverso&r1=1.111&r2=1.112
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/Interface.h?cvsroot=traverso&r1=1.47&r2=1.48

Patches:
Index: core/DiskIO.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/DiskIO.cpp,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -b -r1.54 -r1.55
--- core/DiskIO.cpp     29 Nov 2007 04:30:31 -0000      1.54
+++ core/DiskIO.cpp     29 Nov 2007 19:52:18 -0000      1.55
@@ -146,6 +146,7 @@
        cpuTimeBuffer = new RingBuffer(128);
        lastCpuReadTime = get_microseconds();
        m_stopWork = m_seeking = m_sampleRateChanged = 0;
+       m_resampleQuality = config().get_property("Conversion", 
"RTResamplingConverterType", 2).toInt();
        m_readBufferFillStatus = 0;
        m_hardDiskOverLoadCounter = 0;
        
@@ -194,9 +195,16 @@
        m_seeking = true;
        
        TimeRef location = m_song->get_new_transport_location();
+       bool resampleQualityChanged = false;
+       int quality = config().get_property("Conversion", 
"RTResamplingConverterType", 2).toInt();
+       if (quality != m_resampleQuality) {
+               resampleQualityChanged = true;
+               m_resampleQuality = quality;
+       }
+               
 
        foreach(ReadSource* source, m_readSources) {
-               if (m_sampleRateChanged) {
+               if (m_sampleRateChanged || resampleQualityChanged) {
                        source->set_diskio(this);
                }
                source->rb_seek_to_file_position(location);
@@ -283,11 +291,9 @@
        
        for (int j=0; j<m_readSources.size(); ++j) {
                ReadSource* source = m_readSources.at(j);
-               if (source->get_channel_count() > 0) {
                        BufferStatus* status = source->get_buffer_status();
                        m_readersStatus.append(QPair<BufferStatus*, 
ReadSource*>(status, source));
                }
-       }
        
 
        for (int i=(bufferdividefactor-2); i >= 0; --i) {
@@ -391,6 +397,10 @@
 {
        PENTER2;
        
+       if (source->get_channel_count() == 0) {
+               return;
+       }
+       
        source->set_diskio(this);
        
        QMutexLocker locker(&mutex);

Index: core/DiskIO.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/DiskIO.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -b -r1.26 -r1.27
--- core/DiskIO.h       24 Nov 2007 15:56:15 -0000      1.26
+++ core/DiskIO.h       29 Nov 2007 19:52:18 -0000      1.27
@@ -68,6 +68,7 @@
        int get_write_buffers_fill_status();
        int get_read_buffers_fill_status();
        int get_output_rate() {return m_outputRate;}
+       int get_resample_quality() {return m_resampleQuality;}
        DecodeBuffer* get_resample_decode_buffer() {return 
m_resampleDecodeBuffer;}
 
 private:
@@ -88,6 +89,7 @@
        trav_time_t             cycleStartTime;
        trav_time_t             lastCpuReadTime;
        bool                    m_seeking;
+       int                     m_resampleQuality;
        bool                    m_sampleRateChanged;
        int                     m_hardDiskOverLoadCounter;
        audio_sample_t*         framebuffer[2];

Index: core/ReadSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ReadSource.cpp,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -b -r1.83 -r1.84
--- core/ReadSource.cpp 29 Nov 2007 13:17:30 -0000      1.83
+++ core/ReadSource.cpp 29 Nov 2007 19:52:18 -0000      1.84
@@ -664,9 +664,12 @@
 {
        m_diskio = diskio;
        set_output_rate(m_diskio->get_output_rate());
-       prepare_rt_buffers();
+       
        if (m_audioReader) {
                
m_audioReader->set_resample_decode_buffer(m_diskio->get_resample_decode_buffer());
+               
m_audioReader->set_converter_type(m_diskio->get_resample_quality());
        }
+       
+       prepare_rt_buffers();
 }
 

Index: core/Song.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.cpp,v
retrieving revision 1.162
retrieving revision 1.163
diff -u -b -r1.162 -r1.163
--- core/Song.cpp       29 Nov 2007 11:04:08 -0000      1.162
+++ core/Song.cpp       29 Nov 2007 19:52:18 -0000      1.163
@@ -139,6 +139,7 @@
        connect(m_diskio, SIGNAL(seekFinished()), this, SLOT(seek_finished()), 
Qt::QueuedConnection);
        connect (m_diskio, SIGNAL(readSourceBufferUnderRun()), this, 
SLOT(handle_diskio_readbuffer_underrun()));
        connect (m_diskio, SIGNAL(writeSourceBufferOverRun()), this, 
SLOT(handle_diskio_writebuffer_overrun()));
+       connect(&config(), SIGNAL(configChanged()), this, 
SLOT(config_changed()));
        connect(this, SIGNAL(transferStarted()), m_diskio, SLOT(start_io()));
        connect(this, SIGNAL(transferStopped()), m_diskio, SLOT(stop_io()));
 
@@ -1380,3 +1381,16 @@
        PMESG2("Song :: leaving seek_finished");
 }
 
+void Song::config_changed()
+{
+       PENTER;
+       
+       int quality = config().get_property("Conversion", 
"RTResamplingConverterType", 2).toInt();
+       if (m_diskio->get_resample_quality() != quality) {
+               TimeRef location = m_transportLocation;
+               location.add_frames(1, audiodevice().get_sample_rate());
+       
+               set_transport_pos(location);
+       }
+}
+

Index: core/Song.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.h,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -b -r1.75 -r1.76
--- core/Song.h 29 Nov 2007 11:04:08 -0000      1.75
+++ core/Song.h 29 Nov 2007 19:52:18 -0000      1.76
@@ -270,6 +270,7 @@
        void handle_diskio_readbuffer_underrun();
        void prepare_recording();
        void clip_finished_recording(AudioClip* clip);
+       void config_changed();
 };
 
 inline float Song::get_gain() const

Index: traverso/Interface.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/Interface.cpp,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -b -r1.111 -r1.112
--- traverso/Interface.cpp      23 Nov 2007 21:47:14 -0000      1.111
+++ traverso/Interface.cpp      29 Nov 2007 19:52:18 -0000      1.112
@@ -500,13 +500,31 @@
        
        menu = menuBar()->addMenu(tr("Se&ttings"));
        
-       QMenu* submenu = menu->addMenu(tr("&Recording File Format"));
-       m_wavAction = submenu->addAction("WAVE");
-       connect(m_wavAction, SIGNAL(triggered( bool )), this, 
SLOT(change_recording_format_to_wav()));
-       m_wavpackAction = submenu->addAction("WavPack");
-       connect(m_wavpackAction, SIGNAL(triggered( bool )), this, 
SLOT(change_recording_format_to_wavpack()));
-       m_wav64Action = submenu->addAction("WAVE-64");
-       connect(m_wav64Action, SIGNAL(triggered( bool )), this, 
SLOT(change_recording_format_to_wav64()));
+       m_encodingMenu = menu->addMenu(tr("&Recording File Format"));
+       
+       action = m_encodingMenu->addAction("WAVE");
+       action->setData("wav");
+       connect(action, SIGNAL(triggered(bool)), this, 
SLOT(change_recording_format_to_wav()));
+       action = m_encodingMenu->addAction("WavPack");
+       action->setData("wavpack");
+       connect(action, SIGNAL(triggered( bool )), this, 
SLOT(change_recording_format_to_wavpack()));
+       action = m_encodingMenu->addAction("WAVE-64");
+       action->setData("w64");
+       connect(action, SIGNAL(triggered( bool )), this, 
SLOT(change_recording_format_to_wav64()));
+       
+       m_resampleQualityMenu = menu->addMenu(tr("&Resample Quality"));
+       action = m_resampleQualityMenu->addAction("Best");
+       action->setData(0);
+       connect(action, SIGNAL(triggered(bool)), this, 
SLOT(change_resample_quality_to_best()));
+       action = m_resampleQualityMenu->addAction("High");
+       action->setData(1);
+       connect(action, SIGNAL(triggered(bool)), this, 
SLOT(change_resample_quality_to_high()));
+       action = m_resampleQualityMenu->addAction("Medium");
+       action->setData(2);
+       connect(action, SIGNAL(triggered(bool)), this, 
SLOT(change_resample_quality_to_medium()));
+       action = m_resampleQualityMenu->addAction("Fast");
+       action->setData(3);
+       connect(action, SIGNAL(triggered(bool)), this, 
SLOT(change_resample_quality_to_fast()));
        
        // fake a config changed 'signal-slot' action, to set the encoding menu 
icons
        config_changed();
@@ -943,15 +961,25 @@
        }
        
        QString encoding = config().get_property("Recording", "FileFormat", 
"").toString();
-       m_wavAction->setIcon(QIcon());
-       m_wav64Action->setIcon(QIcon());
-       m_wavpackAction->setIcon(QIcon());
-       if (encoding == "wav") {
-               
m_wavAction->setIcon(style()->standardIcon(QStyle::SP_DialogApplyButton));
-       } else if (encoding == "wavpack") {
-               
m_wavpackAction->setIcon(style()->standardIcon(QStyle::SP_DialogApplyButton));
-       } else if (encoding == "w64") {
-               
m_wav64Action->setIcon(style()->standardIcon(QStyle::SP_DialogApplyButton));
+       QList<QAction* > actions = m_encodingMenu->actions();
+       
+       foreach(QAction* action, actions) {
+               if (action->data().toString() == encoding) {
+                       
action->setIcon(style()->standardIcon(QStyle::SP_DialogApplyButton));
+               } else {
+                       action->setIcon(QIcon());
+               }
+       }
+       
+       int quality = config().get_property("Conversion", 
"RTResamplingConverterType", 2).toInt();
+       actions = m_resampleQualityMenu->actions();
+       
+       foreach(QAction* action, actions) {
+               if (action->data().toInt() == quality) {
+                       
action->setIcon(style()->standardIcon(QStyle::SP_DialogApplyButton));
+               } else {
+                       action->setIcon(QIcon());
+               }
        }
 }
 
@@ -1155,21 +1183,49 @@
 void Interface::change_recording_format_to_wav()
 {
        config().set_property("Recording", "FileFormat", "wav");
-       info().information(tr("Changed encoding for recording to 
%1").arg("WAVE"));
+       save_config_and_emit_message(tr("Changed encoding for recording to 
%1").arg("WAVE"));
        config().save();
 }
 
 void Interface::change_recording_format_to_wav64()
 {
        config().set_property("Recording", "FileFormat", "w64");
-       info().information(tr("Changed encoding for recording to 
%1").arg("WAVE-64"));
-       config().save();
+       save_config_and_emit_message(tr("Changed encoding for recording to 
%1").arg("WAVE-64"));
 }
 
 void Interface::change_recording_format_to_wavpack()
 {
        config().set_property("Recording", "FileFormat", "wavpack");
-       info().information(tr("Changed encoding for recording to 
%1").arg("WavPack"));
+       save_config_and_emit_message(tr("Changed encoding for recording to 
%1").arg("WavPack"));
+}
+
+void Interface::change_resample_quality_to_best()
+{
+       config().set_property("Conversion", "RTResamplingConverterType", 0);
+       save_config_and_emit_message(tr("Changed resample quality to: 
%1").arg("Best"));
+}
+
+void Interface::change_resample_quality_to_high()
+{
+       config().set_property("Conversion", "RTResamplingConverterType", 1);
+       save_config_and_emit_message(tr("Changed resample quality to: 
%1").arg("High"));
+}
+
+void Interface::change_resample_quality_to_medium()
+{
+       config().set_property("Conversion", "RTResamplingConverterType", 2);
+       save_config_and_emit_message(tr("Changed resample quality to: 
%1").arg("Medium"));
+}
+
+void Interface::change_resample_quality_to_fast()
+{
+       config().set_property("Conversion", "RTResamplingConverterType", 3);
+       save_config_and_emit_message(tr("Changed resample quality to: 
%1").arg("Fast"));
+}
+
+void Interface::save_config_and_emit_message(const QString & message)
+{
+       info().information(message);
        config().save();
 }
 

Index: traverso/Interface.h
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/Interface.h,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -b -r1.47 -r1.48
--- traverso/Interface.h        23 Nov 2007 21:47:14 -0000      1.47
+++ traverso/Interface.h        29 Nov 2007 19:52:18 -0000      1.48
@@ -134,15 +134,15 @@
        QAction*                m_projectSongManagerAction;
        QAction*                m_projectExportAction;
        QAction*                m_songMenuAction;
-       QAction*                m_wavAction;
-       QAction*                m_wav64Action;
-       QAction*                m_wavpackAction;
+       QMenu*                  m_encodingMenu;
+       QMenu*                  m_resampleQualityMenu;
        
        ResourcesInfoWidget*    resourcesInfo;
        DriverInfoWidget*       driverInfo;
        HDDSpaceInfoWidget*     hddInfo;
        
        void create_menus();
+       void save_config_and_emit_message(const QString& message);
        
        static Interface* m_instance;
        
@@ -163,6 +163,10 @@
        void change_recording_format_to_wav();
        void change_recording_format_to_wav64();
        void change_recording_format_to_wavpack();
+       void change_resample_quality_to_best();
+       void change_resample_quality_to_high();
+       void change_resample_quality_to_medium();
+       void change_resample_quality_to_fast();
 
        Command* full_screen();
        Command* about_traverso();




reply via email to

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