-Refactored AudioBuffer into .cxx, fixed filename loading bug in DiskReader / AudioBuffer

main
Harry van Haaren 2013-12-12 20:02:10 +00:00
parent 48ed6cbf30
commit d7928aac10
4 changed files with 151 additions and 96 deletions

124
src/audiobuffer.cxx Normal file
View File

@ -0,0 +1,124 @@
/*
* Author: Harry van Haaren 2013
* harryhaaren@gmail.com
*
* This program 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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "audiobuffer.hxx"
#include <stdio.h>
AudioBuffer::AudioBuffer()
{
ID = privateID++;
init();
}
AudioBuffer::AudioBuffer(unsigned long size)
{
// FIXME recorded buffers don't get an ID, using garbage IDs
/// no ID assigned: it *takes* the one from the previous buffer!
init();
buffer.resize(size);
}
void AudioBuffer::init()
{
numBeats = 0;
audioFrames = 0;
memset( name, 0, sizeof(char)*20 );
//sprintf( name, "%i", ID );
}
/// this function is used for "resizing" an exisiting buffer, and should
/// not be called for any other reason.
void AudioBuffer::setID(int id)
{
ID = id;
}
int AudioBuffer::getID()
{
return ID;
}
void AudioBuffer::setName(const char* n)
{
memcpy( name, n, sizeof(char)* 19 );
if ( strlen(n) > 19 )
{
#ifdef DEBUG_BUFFER
cout << "AudioBuffer setName too long, truncating." << endl;
#endif
return;
}
}
char* AudioBuffer::getName()
{
return name;
}
int AudioBuffer::getBeats()
{
return numBeats;
}
void AudioBuffer::setBeats(int b)
{
#ifdef DEBUG_BUFFER
cout << "AudioBuffer now has " << b << " beats\n" << endl;
#endif
numBeats = b;
}
void AudioBuffer::setAudioFrames(long af)
{
audioFrames = af;
#ifdef DEBUG_BUFFER
cout << "AudioBuffer " << ID << " has " << audioFrames << " audioFrames\n" << endl;
#endif
}
long AudioBuffer::getAudioFrames()
{
return audioFrames;
}
std::vector<float>& AudioBuffer::getData()
{
return buffer;
}
void AudioBuffer::nonRtSetSample(std::vector<float>& sample)
{
buffer.swap(sample);
}
void AudioBuffer::nonRtResize(unsigned long size)
{
buffer.resize(size);
}
/*
ostream& AudioBuffer::operator<<(ostream& o, const AudioBuffer& a)
{
o << "AudioBuffer " << a.name <<
" beats: " << a.numBeats <<
" audioFrames: " << a.audioFrames << endl;
return o;
}
*/

View File

@ -31,104 +31,34 @@ using namespace std;
class AudioBuffer
{
public:
AudioBuffer()
{
ID = privateID++;
init();
}
AudioBuffer(unsigned long size)
{
// FIXME recorded buffers don't get an ID, using garbage IDs
/// no ID assigned: it *takes* the one from the previous buffer!
init();
buffer.resize(size);
}
AudioBuffer();
AudioBuffer(unsigned long size);
void init()
{
numBeats = 0;
audioFrames = 0;
memset( name, 0, sizeof(char)*20 );
//sprintf( name, "%i", ID );
}
void init();
/// this function is used for "resizing" an exisiting buffer, and should
/// not be called for any other reason.
void setID(int id)
{
ID = id;
}
void setID(int id);
int getID()
{
return ID;
}
int getID();
void setName(const char* n);
void setName(const char* n)
{
if ( strlen(n) > 19 )
{
#ifdef DEBUG_BUFFER
cout << "AudioBuffer setName too long!" << endl;
#endif
return;
}
memcpy( name, n, sizeof(char)* 20 );
}
char* getName();
int getBeats();
char* getName()
{
return name;
}
void setBeats(int b);
int getBeats()
{
return numBeats;
}
void setAudioFrames(long af);
void setBeats(int b)
{
#ifdef DEBUG_BUFFER
cout << "AudioBuffer now has " << b << " beats\n" << endl;
#endif
numBeats = b;
}
long getAudioFrames();
void setAudioFrames(long af)
{
audioFrames = af;
#ifdef DEBUG_BUFFER
cout << "AudioBuffer " << ID << " has " << audioFrames << " audioFrames\n" << endl;
#endif
}
std::vector<float>& getData();
long getAudioFrames()
{
return audioFrames;
}
void nonRtSetSample(std::vector<float>& sample);
std::vector<float>& getData()
{
return buffer;
}
void nonRtResize(unsigned long size);
void nonRtSetSample(std::vector<float>& sample)
{
buffer.swap(sample);
}
void nonRtResize(unsigned long size)
{
buffer.resize(size);
}
friend ostream& operator<<(ostream& o, const AudioBuffer& a)
{
o << "AudioBuffer " << a.name <<
" beats: " << a.numBeats <<
" audioFrames: " << a.audioFrames << endl;
return o;
}
//friend ostream& operator<<(ostream& o, const AudioBuffer& a);
protected:
static int privateID;

View File

@ -222,6 +222,12 @@ int DiskReader::loadSample( int track, int scene, string path )
bool loadableBuffer = false;
// retrieve sample metadata from sample.cfg using filename as key
char* tmp = strdup( path.c_str() );
char* baseName = basename( tmp );
//cout << "tmp " << tmp << " baseName " << baseName << endl;
ab->setName( baseName );
if ( infile.frames() > 0 )
{
char* basePath = strdup( path.c_str() );
@ -252,11 +258,6 @@ int DiskReader::loadSample( int track, int scene, string path )
return LUPPP_RETURN_ERROR;
}
// retrieve sample metadata from sample.cfg using filename as key
char* tmp = strdup( path.c_str() );
char* baseName = basename( tmp );
//cout << "tmp " << tmp << " baseName " << baseName << endl;
cJSON* sample = cJSON_GetObjectItem( audioJson, baseName );
if ( sample )
{
@ -268,6 +269,7 @@ int DiskReader::loadSample( int track, int scene, string path )
loadableBuffer = true;
ab->setBeats( beats->valuedouble );
}
if ( name )
{
ab->setName( name->valuestring );
@ -277,8 +279,9 @@ int DiskReader::loadSample( int track, int scene, string path )
// if we don't find the beats from audio.cfg, show dialog
if ( loadableBuffer == false )
{
cout << "Warning: audio.cfg has no entry for beats." << endl;
LUPPP_NOTE("Warning: audio.cfg has no entry for beats.");
int ret = showAudioEditor( ab );
if ( ret == LUPPP_RETURN_OK )
{
// flag that we can load this sample OK
@ -307,15 +310,13 @@ int DiskReader::loadSample( int track, int scene, string path )
}
else
{
LUPPP_NOTE("AudioBuffer set %i beats.", ab->getBeats() );
std::string name = path;
int i = name.find_last_of('/') + 1;
std::string sub = name.substr( i );
ab->setName( sub.c_str() );
LUPPP_NOTE("AudioBuffer %s set %i beats", ab->getName(), ab->getBeats() );
loadableBuffer = true;
}
}

View File

@ -112,7 +112,7 @@ void AudioEditor::show( AudioBuffer* buf, bool modal )
}
else
{
printf("%i, fpb = %i, bpm= = %i\n", beat, fpb, bpm );
//printf("%i, fpb = %i, bpm= = %i\n", beat, fpb, bpm );
// enable option ( may be disabled previously! )
beatButtons[i]->setGreyOut( false );