diff --git a/src/audiobuffer.hxx b/src/audiobuffer.hxx index 495d336..c9fb2a2 100644 --- a/src/audiobuffer.hxx +++ b/src/audiobuffer.hxx @@ -17,11 +17,13 @@ class AudioBuffer { ID = privateID++; numBeats = 0; + audioFrames = 0; } AudioBuffer(unsigned long size) { /// no ID assigned: it *takes* the one from the previous buffer! numBeats = 0; + audioFrames = 0; buffer.resize(size); } @@ -63,6 +65,19 @@ class AudioBuffer numBeats = b; } + void setAudioFrames(long af) + { + audioFrames = af; +#ifdef DEBUG_BUFFER + cout << "AudioBuffer " << ID << " has " << audioFrames << " audioFrames\n" << endl; +#endif + } + + long getAudioFrames() + { + return audioFrames; + } + std::vector& getData() { return buffer; @@ -79,6 +94,10 @@ class AudioBuffer int numBeats; + /// holds the number of samples that are usable audio, as opposed to + /// buffer.size(), which also has non-used space at the end. + long audioFrames; + char name[20]; std::vector buffer; diff --git a/src/diskreader.cxx b/src/diskreader.cxx index 9172e7f..1085413 100644 --- a/src/diskreader.cxx +++ b/src/diskreader.cxx @@ -33,6 +33,7 @@ void DiskReader::loadSample( int track, int scene, string path ) infile.read( &buf[0] , infile.frames() ); // set the data + ab->setAudioFrames( infile.frames() ); ab->nonRtSetSample( buf ); cout << "Worker: loadSample() " << path << " size: " << infile.frames() << endl; @@ -154,6 +155,8 @@ void DiskReader::readMaster() // bpm { cJSON* bpm = cJSON_GetObjectItem( master, "bpm"); + cout << "Session: BPM " << bpm->valuedouble << " int " << bpm->valueint << endl; + EventTimeBPM e( bpm->valuedouble ); writeToDspRingbuffer( &e ); } diff --git a/src/diskwriter.cxx b/src/diskwriter.cxx index 3c94a76..f5867bf 100644 --- a/src/diskwriter.cxx +++ b/src/diskwriter.cxx @@ -65,8 +65,12 @@ void DiskWriter::writeAudioBuffer(int track, int scene, AudioBuffer* ab ) path << sessionPath << "/" << sessionName << "/samples/" << filename.str(); SndfileHandle outfile( path.str(), SFM_WRITE, SF_FORMAT_WAV | SF_FORMAT_FLOAT, 1, 44100); - cout << "Worker::writeSample() " << path.str() << " size: " << ab->getData().size() << endl; - outfile.write( &ab->getData()[0], ab->getData().size() ); + cout << "Worker::writeSample() " << path.str() << " size: " << ab->getAudioFrames() << endl; + + // FIXME: the size of the buffer is bigger than the audio contained in it: + // calculate the length that needs saving using getBeats() * framesPerBeat + + outfile.write( &ab->getData()[0], ab->getAudioFrames() ); // de allocate the AudioBuffer delete ab; diff --git a/src/looperclip.cxx b/src/looperclip.cxx index 3812fd7..e04e5ec 100644 --- a/src/looperclip.cxx +++ b/src/looperclip.cxx @@ -37,11 +37,11 @@ void LooperClip::save() if ( _loaded ) { char buffer [50]; - sprintf (buffer, "LooperClip::save() track %i, scene %i", track,scene); + sprintf (buffer, "LC::save() track %i, scene %i", track,scene); EventGuiPrint e( buffer ); writeToGuiRingbuffer( &e ); - EventRequestSaveBuffer e2( track, scene, _buffer->getData().size() ); + EventRequestSaveBuffer e2( track, scene, _buffer->getAudioFrames() ); writeToGuiRingbuffer( &e2 ); } else @@ -69,7 +69,7 @@ void LooperClip::load( AudioBuffer* ab ) _recordhead = _buffer->getData().size(); char buffer [50]; - sprintf (buffer, "LooperClip::load() track %i, scene %i",track, scene); + sprintf (buffer, "LC::load() t %i, s %i, aF %i",track, scene, int(_buffer->getAudioFrames()) ); EventGuiPrint e( buffer ); writeToGuiRingbuffer( &e ); @@ -99,11 +99,12 @@ void LooperClip::setRequestedBuffer( AudioBuffer* ab ) void LooperClip::recieveSaveBuffer( AudioBuffer* saveBuffer ) { // copy current contents into save buffer, - size_t size = _buffer->getData().size(); - memcpy( &saveBuffer->getData().at(0), &_buffer->getData().at(0), sizeof(float)*size); + size_t framesBySize = _buffer->getAudioFrames(); + memcpy( &saveBuffer->getData().at(0), &_buffer->getData().at(0), sizeof(float)*framesBySize); saveBuffer->setID ( _buffer->getID() ); saveBuffer->setBeats( _buffer->getBeats() ); + saveBuffer->setAudioFrames( _buffer->getAudioFrames() ); EventSaveBuffer e ( track, scene, saveBuffer ); writeToGuiRingbuffer( &e ); @@ -217,6 +218,7 @@ void LooperClip::bar() { // FIXME: assumes 4 beats in a bar _buffer->setBeats( _buffer->getBeats() + 4 ); + _buffer->setAudioFrames( jack->getTimeManager()->getFpb() * _buffer->getBeats() ); } if ( change ) diff --git a/src/timemanager.cxx b/src/timemanager.cxx index fbd9d35..12a83e4 100644 --- a/src/timemanager.cxx +++ b/src/timemanager.cxx @@ -31,7 +31,7 @@ int TimeManager::getFpb() void TimeManager::setBpm(float bpm) { - //cout << "setBpm() " << bpm << endl; + cout << "setBpm() " << bpm << endl; setFpb( 44100 / bpm * 60 ); } @@ -62,6 +62,10 @@ void TimeManager::registerObserver(TimeObserver* o) //cout << "registerObserver() " << o << endl; observers.push_back(o); o->setFpb( fpb ); + + int bpm = (44100 * 60) / fpb; + EventTimeBPM e2( bpm ); + writeToGuiRingbuffer( &e2 ); } void TimeManager::tap()