| 145 | | } |
| 146 | | nSongSize += nPatternSize; |
| 147 | | } |
| 148 | | |
| 149 | | float ticksize = pDriver->m_nSampleRate * 60.0 / Hydrogen::get_instance()->getSong()->__bpm / 192 *4; |
| 150 | | //here we have the song length in frames dependent from bpm and samplerate |
| 151 | | unsigned songLengthInFrames = ticksize * nSongSize; |
| 152 | | |
| 153 | | unsigned frameNumber = 0; |
| 154 | | int lastRun = 0; |
| 155 | | while ( frameNumber < songLengthInFrames ) { |
| 156 | | |
| 157 | | int usedBuffer = pDriver->m_nBufferSize; |
| 158 | | |
| 159 | | //this will calculate the the size from -last- (end of song) used frame buffer, |
| 160 | | //which is mostly smaller than pDriver->m_nBufferSize |
| 161 | | if( songLengthInFrames - frameNumber < pDriver->m_nBufferSize ){ |
| 162 | | lastRun = songLengthInFrames - frameNumber; |
| 163 | | usedBuffer = lastRun; |
| 164 | | }; |
| 165 | | |
| 166 | | frameNumber += usedBuffer; |
| 167 | | int ret = pDriver->m_processCallback( usedBuffer, NULL ); |
| 168 | | |
| 169 | | for ( unsigned i = 0; i < usedBuffer; i++ ) { |
| 170 | | if(pData_L[i] > 1){ |
| 171 | | pData[i * 2] = 1; |
| 172 | | } |
| 173 | | else if(pData_L[i] < -1){ |
| 174 | | pData[i * 2] = -1; |
| 175 | | }else |
| 176 | | { |
| 177 | | pData[i * 2] = pData_L[i]; |
| 178 | | } |
| 179 | | |
| 180 | | if(pData_R[i] > 1){ |
| 181 | | pData[i * 2 + 1] = 1; |
| 182 | | } |
| 183 | | else if(pData_R[i] < -1){ |
| 184 | | pData[i * 2 + 1] = -1; |
| 185 | | }else |
| 186 | | { |
| 187 | | pData[i * 2 + 1] = pData_R[i]; |
| 188 | | } |
| 189 | | } |
| 190 | | int res = sf_writef_float( m_file, pData, usedBuffer ); |
| 191 | | if ( res != ( int )usedBuffer ) { |
| 192 | | __ERRORLOG( "Error during sf_write_float" ); |
| 193 | | } |
| 194 | | |
| 195 | | float fPercent = ( float ) frameNumber / ( float )songLengthInFrames * 100.0; |
| 196 | | EventQueue::get_instance()->push_event( EVENT_PROGRESS, ( int )fPercent ); |
| 197 | | // frameNuber += lastrun; |
| 198 | | } |
| | 149 | } |
| | 150 | |
| | 151 | ticksize = pDriver->m_nSampleRate * 60.0 / Hydrogen::get_instance()->getSong()->__bpm / Hydrogen::get_instance()->getSong()->__resolution; |
| | 152 | // check pattern bpm if timeline bpm is in use |
| | 153 | if(Preferences::get_instance()->__usetimeline){ |
| | 154 | if( engine->m_timelinevector.size() >= 1 ){ |
| | 155 | |
| | 156 | for ( int t = 0; t < engine->m_timelinevector.size(); t++){ |
| | 157 | if(engine->m_timelinevector[t].m_htimelinebeat == patternposition && engine->m_timelinevector[t].m_htimelinebpm != validBpm){ |
| | 158 | validBpm = engine->m_timelinevector[t].m_htimelinebpm; |
| | 159 | } |
| | 160 | |
| | 161 | } |
| | 162 | } |
| | 163 | pDriver->setBpm(validBpm); |
| | 164 | ticksize = pDriver->m_nSampleRate * 60.0 / validBpm / Hydrogen::get_instance()->getSong()->__resolution; |
| | 165 | pDriver->audioEngine_process_checkBPMChanged(); |
| | 166 | Hydrogen::get_instance()->setPatternPos(patternposition ); |
| | 167 | |
| | 168 | } |
| | 169 | else |
| | 170 | { |
| | 171 | ticksize = pDriver->m_nSampleRate * 60.0 / Hydrogen::get_instance()->getSong()->__bpm / Hydrogen::get_instance()->getSong()->__resolution; |
| | 172 | //pDriver->m_transport.m_nTickSize = ticksize; |
| | 173 | } |
| | 174 | |
| | 175 | |
| | 176 | //here we have the song length in frames dependent from bpm and samplerate |
| | 177 | unsigned patternLengthInFrames = ticksize * nPatternSize; |
| | 178 | |
| | 179 | unsigned frameNumber = 0; |
| | 180 | int lastRun = 0; |
| | 181 | while ( frameNumber < patternLengthInFrames ) { |
| | 182 | |
| | 183 | int usedBuffer = pDriver->m_nBufferSize; |
| | 184 | |
| | 185 | //this will calculate the the size from -last- (end of song) used frame buffer, |
| | 186 | //which is mostly smaller than pDriver->m_nBufferSize |
| | 187 | if( patternLengthInFrames - frameNumber < pDriver->m_nBufferSize ){ |
| | 188 | lastRun = patternLengthInFrames - frameNumber; |
| | 189 | usedBuffer = lastRun; |
| | 190 | }; |
| | 191 | |
| | 192 | frameNumber += usedBuffer; |
| | 193 | int ret = pDriver->m_processCallback( usedBuffer, NULL ); |
| | 194 | |
| | 195 | for ( unsigned i = 0; i < usedBuffer; i++ ) { |
| | 196 | if(pData_L[i] > 1){ |
| | 197 | pData[i * 2] = 1; |
| | 198 | } |
| | 199 | else if(pData_L[i] < -1){ |
| | 200 | pData[i * 2] = -1; |
| | 201 | }else |
| | 202 | { |
| | 203 | pData[i * 2] = pData_L[i]; |
| | 204 | } |
| | 205 | |
| | 206 | if(pData_R[i] > 1){ |
| | 207 | pData[i * 2 + 1] = 1; |
| | 208 | } |
| | 209 | else if(pData_R[i] < -1){ |
| | 210 | pData[i * 2 + 1] = -1; |
| | 211 | }else |
| | 212 | { |
| | 213 | pData[i * 2 + 1] = pData_R[i]; |
| | 214 | } |
| | 215 | } |
| | 216 | int res = sf_writef_float( m_file, pData, usedBuffer ); |
| | 217 | if ( res != ( int )usedBuffer ) { |
| | 218 | __ERRORLOG( "Error during sf_write_float" ); |
| | 219 | } |
| | 220 | } |
| | 221 | |
| | 222 | // this progress bar methode is not exact but ok enough to give users a usable visible progress feedback |
| | 223 | float fPercent = ( float )(patternposition +1) / ( float )nColumns * 100.0; |
| | 224 | EventQueue::get_instance()->push_event( EVENT_PROGRESS, ( int )fPercent ); |
| | 225 | } |
| | 350 | void DiskWriterDriver::audioEngine_process_checkBPMChanged() |
| | 351 | { |
| | 352 | float fNewTickSize = |
| | 353 | getSampleRate() * 60.0 |
| | 354 | / Hydrogen::get_instance()->getSong()->__bpm |
| | 355 | / Hydrogen::get_instance()->getSong()->__resolution; |
| | 356 | |
| | 357 | if ( fNewTickSize != m_transport.m_nTickSize ) { |
| | 358 | // cerco di convertire ... |
| | 359 | float fTickNumber = |
| | 360 | ( float )m_transport.m_nFrames |
| | 361 | / ( float )m_transport.m_nTickSize; |
| | 362 | |
| | 363 | m_transport.m_nTickSize = fNewTickSize; |
| | 364 | |
| | 365 | if ( m_transport.m_nTickSize == 0 ) { |
| | 366 | return; |
| | 367 | } |
| | 368 | long long nNewFrames = ( long long )( fTickNumber * fNewTickSize ); |
| | 369 | // update frame position |
| | 370 | m_transport.m_nFrames = nNewFrames; |
| | 371 | |
| | 372 | // currently unuseble here |
| | 373 | //EventQueue::get_instance()->push_event( EVENT_RECALCULATERUBBERBAND, -1); |
| | 374 | } |
| | 375 | } |