mirror of
https://github.com/vale981/openAV-Luppp
synced 2025-03-05 09:01:39 -05:00
restyled code after stereo added
This commit is contained in:
parent
ed72627245
commit
08bdc1ff09
6 changed files with 128 additions and 133 deletions
|
@ -102,10 +102,10 @@ long AudioBuffer::getAudioFrames()
|
|||
|
||||
long AudioBuffer::getSize()
|
||||
{
|
||||
if(bufferL.size() != bufferR.size()) {
|
||||
LUPPP_WARN("left and right channels of audio buffer have different size: %i vs %i", bufferL.size(), bufferR.size() );
|
||||
}
|
||||
return std::min(bufferL.size(), bufferR.size());
|
||||
if(bufferL.size() != bufferR.size()) {
|
||||
LUPPP_WARN("left and right channels of audio buffer have different size: %i vs %i", bufferL.size(), bufferR.size() );
|
||||
}
|
||||
return std::min(bufferL.size(), bufferR.size());
|
||||
}
|
||||
|
||||
std::vector<float>& AudioBuffer::getDataL()
|
||||
|
|
|
@ -52,7 +52,7 @@ public:
|
|||
|
||||
long getAudioFrames();
|
||||
|
||||
long getSize();
|
||||
long getSize();
|
||||
|
||||
std::vector<float>& getDataL();
|
||||
std::vector<float>& getDataR();
|
||||
|
|
|
@ -167,7 +167,7 @@ int DiskReader::loadSample( int track, int scene, string path )
|
|||
int chnls = infile.channels();
|
||||
std::vector<float> bufL( infile.frames() );
|
||||
std::vector<float> bufR( infile.frames() );
|
||||
float frameBuf[ sizeof(float) * chnls ];
|
||||
float frameBuf[ sizeof(float) * chnls ];
|
||||
|
||||
if ( infile.error() ) {
|
||||
LUPPP_ERROR("File %s, Error %s", path.c_str(), infile.strError() );
|
||||
|
@ -177,22 +177,22 @@ int DiskReader::loadSample( int track, int scene, string path )
|
|||
LUPPP_NOTE("Loading file with %i chnls, frames %i, bufferL size %i bufferR size %i", infile.channels(), infile.frames(), bufL.size(), bufR.size() );
|
||||
|
||||
// Read data
|
||||
for(int f=0; f<infile.frames(); f++) {
|
||||
infile.readf( frameBuf, 1 );
|
||||
for(int f=0; f<infile.frames(); f++) {
|
||||
infile.readf( frameBuf, 1 );
|
||||
|
||||
// Frist sapmle
|
||||
// used for both channels when file is mono
|
||||
// used for left channel when file is stereo
|
||||
if(chnls > 0) {
|
||||
bufL[f] = frameBuf[0];
|
||||
bufR[f] = frameBuf[0];
|
||||
}
|
||||
// Second sample
|
||||
// used for right channel when file is stereo
|
||||
if(chnls > 1) {
|
||||
bufR[f] = frameBuf[1];
|
||||
}
|
||||
}
|
||||
// Frist sapmle
|
||||
// used for both channels when file is mono
|
||||
// used for left channel when file is stereo
|
||||
if(chnls > 0) {
|
||||
bufL[f] = frameBuf[0];
|
||||
bufR[f] = frameBuf[0];
|
||||
}
|
||||
// Second sample
|
||||
// used for right channel when file is stereo
|
||||
if(chnls > 1) {
|
||||
bufR[f] = frameBuf[1];
|
||||
}
|
||||
}
|
||||
|
||||
/// resample?
|
||||
if ( infile.samplerate() != gui->samplerate ) {
|
||||
|
@ -632,10 +632,10 @@ int DiskReader::readTracks()
|
|||
LUPPP_WARN("Track %i has no send data saved.", t);
|
||||
} else {
|
||||
EventTrackSendActive e1( t, SEND_POSTFADER, sendActive->valueint );
|
||||
EventTrackSendActive e2( t, SEND_KEY , keyActive ->valueint );
|
||||
EventTrackSendActive e2( t, SEND_KEY, keyActive ->valueint );
|
||||
|
||||
EventTrackSend e3( t, SEND_XSIDE , xside->valuedouble );
|
||||
EventTrackSend e4( t, SEND_POSTFADER , send->valuedouble );
|
||||
EventTrackSend e3( t, SEND_XSIDE, xside->valuedouble );
|
||||
EventTrackSend e4( t, SEND_POSTFADER, send->valuedouble );
|
||||
|
||||
|
||||
writeToDspRingbuffer( &e1 );
|
||||
|
|
|
@ -97,7 +97,7 @@ void DiskWriter::initialize(std::string path, std::string name )
|
|||
|
||||
/* If project dir doesn't exist yet, create it */
|
||||
int projectDir = mkdir( path.c_str(),
|
||||
S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH );
|
||||
S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH );
|
||||
if ( errno == EEXIST ) {
|
||||
//LUPPP_NOTE("project dir %s exists, this is good", path.c_str());
|
||||
} else if ( projectDir ) {
|
||||
|
@ -193,15 +193,15 @@ int DiskWriter::writeControllerFile( Controller* c )
|
|||
cJSON_AddItemToObject( binding, "action", cJSON_CreateString( actionName ) );
|
||||
|
||||
cJSON_AddNumberToObject( binding, "status", b.at(i)->status );
|
||||
cJSON_AddNumberToObject( binding, "data" , b.at(i)->data );
|
||||
cJSON_AddNumberToObject( binding, "data", b.at(i)->data );
|
||||
|
||||
// only add JSON elements if they're not the "invalid" defaults
|
||||
if ( b.at(i)->track != -2 )
|
||||
cJSON_AddNumberToObject( binding, "track" , b.at(i)->track );
|
||||
cJSON_AddNumberToObject( binding, "track", b.at(i)->track );
|
||||
if ( b.at(i)->scene != -1 )
|
||||
cJSON_AddNumberToObject( binding, "scene" , b.at(i)->scene );
|
||||
cJSON_AddNumberToObject( binding, "scene", b.at(i)->scene );
|
||||
if ( b.at(i)->send != -1 )
|
||||
cJSON_AddNumberToObject( binding, "send" , b.at(i)->send );
|
||||
cJSON_AddNumberToObject( binding, "send", b.at(i)->send );
|
||||
if ( b.at(i)->active!= -1 )
|
||||
cJSON_AddNumberToObject( binding, "active", b.at(i)->active );
|
||||
|
||||
|
@ -321,14 +321,13 @@ int DiskWriter::writeAudioBuffer(int track, int scene, AudioBuffer* ab,
|
|||
// FIXME: the size of the buffer is bigger than the audio contained in it:
|
||||
// calculate the length that needs saving using getBeats() * framesPerBeat
|
||||
if ( ab->getAudioFrames() > 0 ) {
|
||||
float frameBuf[ sizeof(float) * 2 ];
|
||||
for(int i=0; i<ab->getAudioFrames(); i++) {
|
||||
frameBuf[0] = ab->getDataL()[i];
|
||||
frameBuf[1] = ab->getDataR()[i];
|
||||
outfile.writef( frameBuf, 1);
|
||||
}
|
||||
}
|
||||
else {
|
||||
float frameBuf[ sizeof(float) * 2 ];
|
||||
for(int i=0; i<ab->getAudioFrames(); i++) {
|
||||
frameBuf[0] = ab->getDataL()[i];
|
||||
frameBuf[1] = ab->getDataR()[i];
|
||||
outfile.writef( frameBuf, 1);
|
||||
}
|
||||
} else {
|
||||
LUPPP_WARN("%s","Sample has zero samples");
|
||||
}
|
||||
|
||||
|
@ -402,14 +401,14 @@ int DiskWriter::writeSession()
|
|||
cJSON_AddNumberToObject( track, "fader", gui->getTrack(t)->getVolume()->value() );
|
||||
cJSON_AddNumberToObject( track, "pan", gui->getTrack(t)->getPan());
|
||||
|
||||
cJSON_AddNumberToObject( track, "sendAmount" , gui->getTrack(t)->getSend() );
|
||||
cJSON_AddNumberToObject( track, "sendActive" , gui->getTrack(t)->getSendActive() );
|
||||
cJSON_AddNumberToObject( track, "sendAmount", gui->getTrack(t)->getSend() );
|
||||
cJSON_AddNumberToObject( track, "sendActive", gui->getTrack(t)->getSendActive() );
|
||||
|
||||
cJSON_AddNumberToObject( track, "jacksendAmount" , gui->getTrack(t)->getJackSend() );
|
||||
cJSON_AddNumberToObject( track, "jacksendActive" , gui->getTrack(t)->getJackSendActivate() );
|
||||
cJSON_AddNumberToObject( track, "jacksendAmount", gui->getTrack(t)->getJackSend() );
|
||||
cJSON_AddNumberToObject( track, "jacksendActive", gui->getTrack(t)->getJackSendActivate() );
|
||||
|
||||
cJSON_AddNumberToObject( track, "xsideAmount", gui->getTrack(t)->getXSide() );
|
||||
cJSON_AddNumberToObject( track, "keyActive" , gui->getTrack(t)->getKeyActive() );
|
||||
cJSON_AddNumberToObject( track, "keyActive", gui->getTrack(t)->getKeyActive() );
|
||||
|
||||
// write clipData vector into clip placeholder
|
||||
cJSON* clips = cJSON_CreateArray();
|
||||
|
|
|
@ -84,11 +84,11 @@ AudioEditor::AudioEditor()
|
|||
}
|
||||
window->end();
|
||||
|
||||
beatButtons[0]->callback( oneCB , this);
|
||||
beatButtons[1]->callback( twoCB , this);
|
||||
beatButtons[2]->callback( fourCB , this);
|
||||
beatButtons[3]->callback( eightCB , this);
|
||||
beatButtons[4]->callback( sixteenCB , this);
|
||||
beatButtons[0]->callback( oneCB, this);
|
||||
beatButtons[1]->callback( twoCB, this);
|
||||
beatButtons[2]->callback( fourCB, this);
|
||||
beatButtons[3]->callback( eightCB, this);
|
||||
beatButtons[4]->callback( sixteenCB, this);
|
||||
beatButtons[5]->callback( thirtyTwoCB, this);
|
||||
beatButtons[6]->callback( sixtyfourCB, this);
|
||||
|
||||
|
@ -101,72 +101,68 @@ void AudioEditor::show( AudioBuffer* buf, bool modal )
|
|||
|
||||
if ( !ab ) {
|
||||
LUPPP_WARN("called with ab == 0");
|
||||
} else {
|
||||
// TODO right (stereo)
|
||||
std::vector<float>& tmp = ab->getDataL();
|
||||
int size = tmp.size();
|
||||
waveform->setData( &tmp[0], size );
|
||||
return;
|
||||
}
|
||||
|
||||
const int beats[]= {1,2,4,8,16,32,64};
|
||||
std::vector<float>& tmp = ab->getDataL();
|
||||
int size = tmp.size();
|
||||
waveform->setData( &tmp[0], size );
|
||||
|
||||
int iBeatOne = -1;
|
||||
int iBeatTwo = -1;
|
||||
const int beats[]= {1,2,4,8,16,32,64};
|
||||
|
||||
// figure out BPM values from size
|
||||
for( int i = 0; i < 7; i++ ) {
|
||||
int beat = beats[i];
|
||||
int iBeatOne = -1;
|
||||
int iBeatTwo = -1;
|
||||
|
||||
int fpb = size / beat;
|
||||
// figure out BPM values from size
|
||||
for( int i = 0; i < 7; i++ ) {
|
||||
int beat = beats[i];
|
||||
int fpb = size / beat;
|
||||
int bpm = (gui->samplerate / fpb) * 60;
|
||||
|
||||
int bpm = (gui->samplerate / fpb) * 60;
|
||||
|
||||
|
||||
if ( bpm < 60 || bpm > 220 ) {
|
||||
// disable option: not valid
|
||||
beatButtons[i]->setGreyOut( true );
|
||||
beatButtons[i]->setColor( 0.4, 0.4, 0.4 );
|
||||
} else {
|
||||
//printf("%i, fpb = %i, bpm= = %i\n", beat, fpb, bpm );
|
||||
// enable option ( may be disabled previously! )
|
||||
beatButtons[i]->setGreyOut( false );
|
||||
|
||||
// remember this beat was a valid one, to check for best match
|
||||
if ( iBeatOne == -1 )
|
||||
iBeatOne = i;
|
||||
else
|
||||
iBeatTwo = i;
|
||||
}
|
||||
}
|
||||
|
||||
// both valid: compare, and adjust color
|
||||
if ( iBeatOne != -1 && iBeatTwo != -1 ) {
|
||||
int masterFpb = (gui->samplerate * 60) / gui->getMasterTrack()->getBpm();
|
||||
int oneFpb = size / beats[iBeatOne];
|
||||
int twoFpb = size / beats[iBeatTwo];
|
||||
|
||||
int oneDelta = masterFpb - oneFpb;
|
||||
int twoDelta = masterFpb - twoFpb;
|
||||
|
||||
if ( oneDelta < 0 ) oneDelta = -oneDelta;
|
||||
if ( twoDelta < 0 ) twoDelta = -twoDelta;
|
||||
|
||||
if ( oneDelta == twoDelta ) {
|
||||
beatButtons[iBeatOne]->setColor( 0.0, 1.0, 0.0 );
|
||||
beatButtons[iBeatTwo]->setColor( 0.0, 1.0, 0.0 );
|
||||
} else if ( oneDelta <= twoDelta ) {
|
||||
// one is the better match
|
||||
beatButtons[iBeatOne]->setColor( 0.0, 1.0, 0.0 );
|
||||
beatButtons[iBeatTwo]->setColor( 1.0, 0.0, 0.0 );
|
||||
} else {
|
||||
beatButtons[iBeatTwo]->setColor( 0.0, 1.0, 0.0 );
|
||||
beatButtons[iBeatOne]->setColor( 1.0, 0.0, 0.0 );
|
||||
}
|
||||
} else if( iBeatOne != -1 && iBeatTwo == -1) { // only one valid
|
||||
beatButtons[iBeatOne]->setColor( 0.0, 1.0, 0.0 );
|
||||
if ( bpm < 60 || bpm > 220 ) {
|
||||
// disable option: not valid
|
||||
beatButtons[i]->setGreyOut( true );
|
||||
beatButtons[i]->setColor( 0.4, 0.4, 0.4 );
|
||||
} else {
|
||||
// no valid BPM range..?
|
||||
}
|
||||
//printf("%i, fpb = %i, bpm= = %i\n", beat, fpb, bpm );
|
||||
// enable option ( may be disabled previously! )
|
||||
beatButtons[i]->setGreyOut( false );
|
||||
|
||||
// remember this beat was a valid one, to check for best match
|
||||
if ( iBeatOne == -1 )
|
||||
iBeatOne = i;
|
||||
else
|
||||
iBeatTwo = i;
|
||||
}
|
||||
}
|
||||
|
||||
// both valid: compare, and adjust color
|
||||
if ( iBeatOne != -1 && iBeatTwo != -1 ) {
|
||||
int masterFpb = (gui->samplerate * 60) / gui->getMasterTrack()->getBpm();
|
||||
int oneFpb = size / beats[iBeatOne];
|
||||
int twoFpb = size / beats[iBeatTwo];
|
||||
|
||||
int oneDelta = masterFpb - oneFpb;
|
||||
int twoDelta = masterFpb - twoFpb;
|
||||
|
||||
if ( oneDelta < 0 ) oneDelta = -oneDelta;
|
||||
if ( twoDelta < 0 ) twoDelta = -twoDelta;
|
||||
|
||||
if ( oneDelta == twoDelta ) {
|
||||
beatButtons[iBeatOne]->setColor( 0.0, 1.0, 0.0 );
|
||||
beatButtons[iBeatTwo]->setColor( 0.0, 1.0, 0.0 );
|
||||
} else if ( oneDelta <= twoDelta ) {
|
||||
// one is the better match
|
||||
beatButtons[iBeatOne]->setColor( 0.0, 1.0, 0.0 );
|
||||
beatButtons[iBeatTwo]->setColor( 1.0, 0.0, 0.0 );
|
||||
} else {
|
||||
beatButtons[iBeatTwo]->setColor( 0.0, 1.0, 0.0 );
|
||||
beatButtons[iBeatOne]->setColor( 1.0, 0.0, 0.0 );
|
||||
}
|
||||
} else if( iBeatOne != -1 && iBeatTwo == -1) { // only one valid
|
||||
beatButtons[iBeatOne]->setColor( 0.0, 1.0, 0.0 );
|
||||
} else {
|
||||
// no valid BPM range..?
|
||||
}
|
||||
|
||||
window->set_modal();
|
||||
|
|
54
src/jack.cxx
54
src/jack.cxx
|
@ -75,7 +75,7 @@ void Jack::resetMidiBindingState()
|
|||
}
|
||||
|
||||
Jack::Jack( std::string name ) :
|
||||
client( jack_client_open ( name.c_str(), JackNullOption , 0 , 0 ) ),
|
||||
client( jack_client_open ( name.c_str(), JackNullOption, 0, 0 ) ),
|
||||
state( new State() ),
|
||||
controllerUpdater( new ControllerUpdater() ),
|
||||
clientActive(false)
|
||||
|
@ -170,16 +170,16 @@ Jack::Jack( std::string name ) :
|
|||
0 );
|
||||
|
||||
sidechainKeyOutputL = jack_port_register( client,
|
||||
"sidechain_key_l",
|
||||
JACK_DEFAULT_AUDIO_TYPE,
|
||||
JackPortIsOutput,
|
||||
0 );
|
||||
"sidechain_key_l",
|
||||
JACK_DEFAULT_AUDIO_TYPE,
|
||||
JackPortIsOutput,
|
||||
0 );
|
||||
|
||||
sidechainKeyOutputR = jack_port_register( client,
|
||||
"sidechain_key_r",
|
||||
JACK_DEFAULT_AUDIO_TYPE,
|
||||
JackPortIsOutput,
|
||||
0 );
|
||||
"sidechain_key_r",
|
||||
JACK_DEFAULT_AUDIO_TYPE,
|
||||
JackPortIsOutput,
|
||||
0 );
|
||||
|
||||
sidechainSignalOutputL = jack_port_register( client,
|
||||
"sidechain_signal_l",
|
||||
|
@ -234,7 +234,7 @@ Jack::Jack( std::string name ) :
|
|||
tracksendreturns.push_back(new JackSendReturn(i,loopers.back(),client));
|
||||
trackOutputs.push_back( new TrackOutput(i, tracksendreturns.back() ) );
|
||||
|
||||
int o = i*2;
|
||||
int o = i*2;
|
||||
buffers.audio[Buffers::TRACK_0_L + o] = new float[ buffers.nframes ];
|
||||
buffers.audio[Buffers::TRACK_0_R + o] = new float[ buffers.nframes ];
|
||||
buffers.audio[Buffers::SEND_TRACK_0_L+o]=new float[buffers.nframes];
|
||||
|
@ -315,7 +315,7 @@ Jack::~Jack()
|
|||
delete inputMeter;
|
||||
delete masterMeter;
|
||||
for(int i = 0; i < NTRACKS; i++) {
|
||||
int o = i*2;
|
||||
int o = i*2;
|
||||
delete [] buffers.audio[Buffers::TRACK_0_L+o];
|
||||
delete [] buffers.audio[Buffers::TRACK_0_R+o];
|
||||
delete [] buffers.audio[Buffers::SEND_TRACK_0_L+o];
|
||||
|
@ -431,32 +431,32 @@ int Jack::process (jack_nframes_t nframes)
|
|||
buffers.audio[Buffers::JACK_SIDECHAIN_SIGNAL_R]= (float*)jack_port_get_buffer( sidechainSignalOutputR,nframes );
|
||||
if(gui->enablePerTrackOutput) {
|
||||
for(int t=0; t<NTRACKS; t++) {
|
||||
int o = t*2;
|
||||
int o = t*2;
|
||||
buffers.audio[Buffers::JACK_TRACK_0_L+o] = (float*)jack_port_get_buffer( trackJackOutputPorts[o], nframes );
|
||||
buffers.audio[Buffers::JACK_TRACK_0_R+o] = (float*)jack_port_get_buffer( trackJackOutputPorts[o+1], nframes );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// clear the buffers
|
||||
memset( buffers.audio[Buffers::JACK_MASTER_OUT_L] , 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::JACK_MASTER_OUT_R] , 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::MASTER_OUT_L] , 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::MASTER_OUT_R] , 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::HEADPHONES_OUT_L] , 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::HEADPHONES_OUT_R] , 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::SEND_L] , 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::SEND_R] , 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::SIDECHAIN_KEY_L] , 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::SIDECHAIN_KEY_R] , 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::JACK_MASTER_OUT_L], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::JACK_MASTER_OUT_R], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::MASTER_OUT_L], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::MASTER_OUT_R], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::HEADPHONES_OUT_L], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::HEADPHONES_OUT_R], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::SEND_L], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::SEND_R], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::SIDECHAIN_KEY_L], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::SIDECHAIN_KEY_R], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::SIDECHAIN_SIGNAL_L], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::SIDECHAIN_SIGNAL_R], 0, sizeof(float) * nframes );
|
||||
if(gui->enablePerTrackOutput) {
|
||||
for(int t=0; t<NTRACKS; t++) {
|
||||
int o = t*2;
|
||||
int o = t*2;
|
||||
memset( buffers.audio[Buffers::JACK_TRACK_0_L+o], 0, sizeof(float) * nframes );
|
||||
memset( buffers.audio[Buffers::JACK_TRACK_0_R+o], 0, sizeof(float) * nframes );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -626,7 +626,7 @@ void Jack::processFrames(int nframes)
|
|||
buffers.audio[Buffers::JACK_SIDECHAIN_SIGNAL_R]= &buffers.audio[Buffers::JACK_SIDECHAIN_SIGNAL_R][nframes];
|
||||
if(gui->enablePerTrackOutput) {
|
||||
for(int t=0; t<NTRACKS; t++) {
|
||||
int o = t*2;
|
||||
int o = t*2;
|
||||
buffers.audio[Buffers::JACK_TRACK_0_L+o] = &buffers.audio[Buffers::JACK_TRACK_0_L+o][nframes];
|
||||
buffers.audio[Buffers::JACK_TRACK_0_L+o+1] = &buffers.audio[Buffers::JACK_TRACK_0_L+o+1][nframes];
|
||||
}
|
||||
|
@ -648,7 +648,7 @@ void Jack::clearInternalBuffers(int nframes)
|
|||
memset(buffers.audio[Buffers::MASTER_OUT_L],0,sizeof(float)*nframes);
|
||||
memset(buffers.audio[Buffers::MASTER_OUT_R],0,sizeof(float)*nframes);
|
||||
for(int i=0; i<NTRACKS; i++) {
|
||||
int o = i*2;
|
||||
int o = i*2;
|
||||
memset(buffers.audio[Buffers::TRACK_0_L + o],0,sizeof(float)*nframes);
|
||||
memset(buffers.audio[Buffers::TRACK_0_R + o],0,sizeof(float)*nframes);
|
||||
memset(buffers.audio[Buffers::SEND_TRACK_0_L + o],0,sizeof(float)*nframes);
|
||||
|
|
Loading…
Add table
Reference in a new issue