Changeset 1569
- Timestamp:
- 02/26/10 21:54:51 (3 years ago)
- Location:
- branches/0.9.4
- Files:
-
- 5 modified
-
gui/src/ExportSongDialog.cpp (modified) (3 diffs)
-
libs/hydrogen/include/hydrogen/hydrogen.h (modified) (1 diff)
-
libs/hydrogen/src/IO/DiskWriterDriver.h (modified) (1 diff)
-
libs/hydrogen/src/IO/disk_writer_driver.cpp (modified) (8 diffs)
-
libs/hydrogen/src/hydrogen.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/0.9.4/gui/src/ExportSongDialog.cpp
r1236 r1569 108 108 QString filename = exportNameTxt->text(); 109 109 m_bExporting = true; 110 Hydrogen::get_instance()->startExportSong( filename );110 Hydrogen::get_instance()->startExportSong( filename , 44100, 16 ); 111 111 } 112 112 … … 140 140 //INFOLOG("SONO A 100"); 141 141 142 Hydrogen::get_instance()->stopExportSong();142 //Hydrogen::get_instance()->stopExportSong(); 143 143 m_bExporting = false; 144 144 QFile check( exportNameTxt->text() ); … … 146 146 QMessageBox::information( this, "Hydrogen", trUtf8("Export failed!") ); 147 147 } 148 accept();149 148 } 150 149 } -
branches/0.9.4/libs/hydrogen/include/hydrogen/hydrogen.h
r1236 r1569 114 114 void restartDrivers(); 115 115 116 void startExportSong( const QString& filename );116 void startExportSong( const QString& filename, int rate, int depth ); 117 117 void stopExportSong(); 118 118 -
branches/0.9.4/libs/hydrogen/src/IO/DiskWriterDriver.h
r127 r1569 41 41 class DiskWriterDriver : public AudioOutput 42 42 { 43 public: 44 unsigned m_nSampleRate; 45 QString m_sFilename; 46 unsigned m_nBufferSize; 47 audioProcessCallback m_processCallback; 48 float* m_pOut_L; 49 float* m_pOut_R; 43 public: 50 44 51 DiskWriterDriver( audioProcessCallback processCallback, unsigned nSamplerate, const QString& sFilename ); 52 ~DiskWriterDriver(); 53 54 int init( unsigned nBufferSize ); 55 56 int connect(); 57 void disconnect(); 58 59 void write( float* buffer_L, float* buffer_R, unsigned int bufferSize ); 60 61 unsigned getBufferSize() { 62 return m_nBufferSize; 63 } 64 65 unsigned getSampleRate(); 66 float* getOut_L() { 67 return m_pOut_L; 68 } 69 float* getOut_R() { 70 return m_pOut_R; 71 } 72 73 virtual void play(); 74 virtual void stop(); 75 virtual void locate( unsigned long nFrame ); 76 virtual void updateTransportInfo(); 77 virtual void setBpm( float fBPM ); 78 79 private: 45 unsigned m_nSampleRate; 46 QString m_sFilename; 47 unsigned m_nBufferSize; 48 int m_nSampleDepth; 49 audioProcessCallback m_processCallback; 50 float* m_pOut_L; 51 float* m_pOut_R; 52 53 DiskWriterDriver( audioProcessCallback processCallback, unsigned nSamplerate, const QString& sFilename, int nSampleDepth ); 54 ~DiskWriterDriver(); 55 56 int init( unsigned nBufferSize ); 57 58 int connect(); 59 void disconnect(); 60 61 void write( float* buffer_L, float* buffer_R, unsigned int bufferSize ); 62 63 unsigned getBufferSize() { 64 return m_nBufferSize; 65 } 66 67 unsigned getSampleRate(); 68 float* getOut_L() { 69 return m_pOut_L; 70 } 71 float* getOut_R() { 72 return m_pOut_R; 73 } 74 75 virtual void play(); 76 virtual void stop(); 77 virtual void locate( unsigned long nFrame ); 78 virtual void updateTransportInfo(); 79 virtual void setBpm( float fBPM ); 80 81 private: 80 82 81 83 }; -
branches/0.9.4/libs/hydrogen/src/IO/disk_writer_driver.cpp
r687 r1569 25 25 #include <hydrogen/event_queue.h> 26 26 #include <hydrogen/hydrogen.h> 27 #include <hydrogen/Pattern.h> 27 28 28 29 #include <pthread.h> … … 41 42 // always rolling, no user interaction 42 43 pDriver->m_transport.m_status = TransportInfo::ROLLING; 43 44 44 45 45 SF_INFO soundInfo; … … 47 47 // soundInfo.frames = -1;//getNFrames(); ///\todo: da terminare 48 48 soundInfo.channels = 2; 49 soundInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; 49 //default format = waf 16bit 50 int sfformat = 0x010000; 51 int bits = 0x0002; 52 53 soundInfo.format = sfformat|bits; 50 54 51 55 if ( !sf_format_check( &soundInfo ) ) { … … 54 58 } 55 59 56 SNDFILE* m_file = sf_open( pDriver->m_sFilename.toAscii(), SFM_WRITE, &soundInfo ); 60 61 SNDFILE* m_file = sf_open( pDriver->m_sFilename.toLocal8Bit(), SFM_WRITE, &soundInfo ); 57 62 58 63 float *pData = new float[ pDriver->m_nBufferSize * 2 ]; // always stereo … … 61 66 float *pData_R = pDriver->m_pOut_R; 62 67 63 while ( pDriver->m_processCallback( pDriver->m_nBufferSize, NULL ) == 0 ) { 64 // process... 65 for ( unsigned i = 0; i < pDriver->m_nBufferSize; i++ ) { 68 69 //calculate exaxt song frames. 70 std::vector<PatternList*> *pPatternColumns = Hydrogen::get_instance()->getSong()->get_pattern_group_vector(); 71 int nColumns = pPatternColumns->size(); 72 73 int nPatternSize; 74 int nSongSize = 0; 75 for ( int i = 0; i < nColumns; ++i ) { 76 PatternList *pColumn = ( *pPatternColumns )[ i ]; 77 if ( pColumn->get_size() != 0 ) { 78 nPatternSize = pColumn->get( 0 )->get_length(); 79 } else { 80 nPatternSize = MAX_NOTES; 81 } 82 nSongSize += nPatternSize; 83 } 84 85 float ticksize = pDriver->m_nSampleRate * 60.0 / Hydrogen::get_instance()->getSong()->__bpm / 192 *4; 86 unsigned songLengthinFrames = ticksize * nSongSize; 87 88 unsigned frameNumber = 0; 89 int lastRun = 0; 90 while ( frameNumber < songLengthinFrames ) { 91 92 int usedBuffer = pDriver->m_nBufferSize; 93 94 if( songLengthinFrames - frameNumber < pDriver->m_nBufferSize ){ 95 lastRun = songLengthinFrames - frameNumber; 96 usedBuffer = lastRun; 97 }; 98 99 frameNumber += usedBuffer; 100 int ret = pDriver->m_processCallback( usedBuffer, NULL ); 101 102 for ( unsigned i = 0; i < usedBuffer; i++ ) { 66 103 if(pData_L[i] > 1){ 67 104 pData[i * 2] = 1; … … 84 121 } 85 122 } 86 int res = sf_writef_float( m_file, pData, pDriver->m_nBufferSize);87 if ( res != ( int ) pDriver->m_nBufferSize) {123 int res = sf_writef_float( m_file, pData, usedBuffer ); 124 if ( res != ( int )usedBuffer ) { 88 125 _ERRORLOG( "Error during sf_write_float" ); 89 126 } 90 127 91 if ( ( pDriver->m_transport.m_nFrames % 65536 ) == 0 ) { 92 int nPatterns = Hydrogen::get_instance()->getSong()->get_pattern_group_vector()->size(); 93 int nCurrentPatternPos = Hydrogen::get_instance()->getPatternPos(); 94 assert( nCurrentPatternPos != -1 ); 95 96 float fPercent = ( float ) nCurrentPatternPos / ( float )nPatterns * 100.0; 97 EventQueue::get_instance()->push_event( EVENT_PROGRESS, ( int )fPercent ); 98 _INFOLOG( QString( "DiskWriterDriver: %1%, transport frames:%2" ).arg( fPercent ).arg( pDriver->m_transport.m_nFrames ) ); 99 } 128 float fPercent = ( float ) frameNumber / ( float )songLengthinFrames * 100.0; 129 EventQueue::get_instance()->push_event( EVENT_PROGRESS, ( int )fPercent ); 130 // frameNuber += lastrun; 100 131 } 101 EventQueue::get_instance()->push_event( EVENT_PROGRESS, 100 );102 132 103 133 delete[] pData; … … 109 139 110 140 pthread_exit( NULL ); 141 142 // Hydrogen::get_instance()->stopExportSong(); 111 143 return NULL; 112 144 } … … 115 147 116 148 117 DiskWriterDriver::DiskWriterDriver( audioProcessCallback processCallback, unsigned nSamplerate, const QString& sFilename )149 DiskWriterDriver::DiskWriterDriver( audioProcessCallback processCallback, unsigned nSamplerate, const QString& sFilename, int nSampleDepth ) 118 150 : AudioOutput( "DiskWriterDriver" ) 119 151 , m_nSampleRate( nSamplerate ) 120 152 , m_sFilename( sFilename ) 153 , m_nSampleDepth ( nSampleDepth ) 121 154 , m_processCallback( processCallback ) 122 155 { -
branches/0.9.4/libs/hydrogen/src/hydrogen.cpp
r1284 r1569 2119 2119 2120 2120 /// Export a song to a wav file, returns the elapsed time in mSec 2121 void Hydrogen::startExportSong( const QString& filename )2121 void Hydrogen::startExportSong( const QString& filename, int rate, int depth ) 2122 2122 { 2123 2123 if ( getState() == STATE_PLAYING ) { 2124 2124 sequencer_stop(); 2125 2125 } 2126 AudioEngine::get_instance()->get_sampler()->stop_playing_notes(); 2126 2127 Preferences *pPref = Preferences::get_instance(); 2127 2128 … … 2130 2131 2131 2132 m_pSong->set_mode( Song::SONG_MODE ); 2132 m_pSong->set_loop_enabled( false );2133 unsigned nSamplerate = m_pAudioDriver->getSampleRate();2134 2133 m_pSong->set_loop_enabled( true ); 2134 // unsigned nSamplerate = m_pAudioDriver->getSampleRate(); 2135 unsigned nSamplerate = (unsigned)rate; 2135 2136 // stop all audio drivers 2136 2137 audioEngine_stopAudioDrivers(); … … 2141 2142 2142 2143 2143 m_pAudioDriver = new DiskWriterDriver( audioEngine_process, nSamplerate, filename ); 2144 2145 AudioEngine::get_instance()->get_sampler()->stop_playing_notes(); 2146 2144 m_pAudioDriver = new DiskWriterDriver( audioEngine_process, nSamplerate, filename, depth); 2145 2146 2147 2147 // reset 2148 2148 m_pAudioDriver->m_transport.m_nFrames = 0; // reset total frames … … 2204 2204 } 2205 2205 } 2206 2207 2206 2208 2207