fix gap in audio export

This commit is contained in:
tildearrow 2023-10-12 03:54:32 -05:00
parent 3bab6faf0f
commit 6118e75ec7
2 changed files with 15 additions and 14 deletions

View file

@ -1860,7 +1860,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
output->midiIn->queue.pop(); output->midiIn->queue.pop();
} }
// process audio // process sample/wave preview
if ((sPreview.sample>=0 && sPreview.sample<(int)song.sample.size()) || (sPreview.wave>=0 && sPreview.wave<(int)song.wave.size())) { if ((sPreview.sample>=0 && sPreview.sample<(int)song.sample.size()) || (sPreview.wave>=0 && sPreview.wave<(int)song.wave.size())) {
unsigned int samp_bbOff=0; unsigned int samp_bbOff=0;
unsigned int prevAvail=blip_samples_avail(samp_bb); unsigned int prevAvail=blip_samples_avail(samp_bb);
@ -2007,7 +2007,9 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
memset(samp_bbOut,0,size*sizeof(short)); memset(samp_bbOut,0,size*sizeof(short));
} }
if (playing && !halted) { // process audio
bool mustPlay=playing && !halted;
if (mustPlay) {
// logic starts here // logic starts here
for (int i=0; i<song.systemLen; i++) { for (int i=0; i<song.systemLen; i++) {
// TODO: we may have a problem here // TODO: we may have a problem here
@ -2136,6 +2138,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
renderPool->wait(); renderPool->wait();
} }
// process metronome
if (metroBufLen<size || metroBuf==NULL) { if (metroBufLen<size || metroBuf==NULL) {
if (metroBuf!=NULL) delete[] metroBuf; if (metroBuf!=NULL) delete[] metroBuf;
metroBuf=new float[size]; metroBuf=new float[size];
@ -2144,7 +2147,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
memset(metroBuf,0,metroBufLen*sizeof(float)); memset(metroBuf,0,metroBufLen*sizeof(float));
if (playing && !halted && metronome) { if (mustPlay && metronome) {
for (size_t i=0; i<size; i++) { for (size_t i=0; i<size; i++) {
if (metroTick[i]) { if (metroTick[i]) {
if (metroTick[i]==2) { if (metroTick[i]==2) {
@ -2226,6 +2229,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
// nothing/invalid // nothing/invalid
} }
// dump to oscillator buffer
for (unsigned int i=0; i<size; i++) { for (unsigned int i=0; i<size; i++) {
for (int j=0; j<outChans; j++) { for (int j=0; j<outChans; j++) {
if (oscBuf[j]==NULL) continue; if (oscBuf[j]==NULL) continue;
@ -2235,6 +2239,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
} }
oscSize=size; oscSize=size;
// force mono audio (if enabled)
if (forceMono && outChans>1) { if (forceMono && outChans>1) {
for (size_t i=0; i<size; i++) { for (size_t i=0; i<size; i++) {
float chanSum=out[0][i]; float chanSum=out[0][i];
@ -2247,6 +2252,8 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
} }
} }
} }
// clamp output (if enabled)
if (clampSamples) { if (clampSamples) {
for (size_t i=0; i<size; i++) { for (size_t i=0; i<size; i++) {
for (int j=0; j<outChans; j++) { for (int j=0; j<outChans; j++) {

View file

@ -89,6 +89,7 @@ void DivEngine::runExportThread() {
if (lastLoopPos>-1 && i>=lastLoopPos && totalLoops>=exportLoopCount) { if (lastLoopPos>-1 && i>=lastLoopPos && totalLoops>=exportLoopCount) {
logD("start fading out..."); logD("start fading out...");
isFadingOut=true; isFadingOut=true;
if (fadeOutSamples==0) break;
} }
} }
} }
@ -197,6 +198,7 @@ void DivEngine::runExportThread() {
if (lastLoopPos>-1 && j>=lastLoopPos && totalLoops>=exportLoopCount) { if (lastLoopPos>-1 && j>=lastLoopPos && totalLoops>=exportLoopCount) {
logD("start fading out..."); logD("start fading out...");
isFadingOut=true; isFadingOut=true;
if (fadeOutSamples==0) break;
} }
} }
} }
@ -239,7 +241,6 @@ void DivEngine::runExportThread() {
outBuf[0]=new float[EXPORT_BUFSIZE]; outBuf[0]=new float[EXPORT_BUFSIZE];
outBuf[1]=new float[EXPORT_BUFSIZE]; outBuf[1]=new float[EXPORT_BUFSIZE];
outBuf[2]=new float[EXPORT_BUFSIZE*2]; outBuf[2]=new float[EXPORT_BUFSIZE*2];
int loopCount=remainingLoops;
logI("rendering to files..."); logI("rendering to files...");
@ -281,11 +282,7 @@ void DivEngine::runExportThread() {
lastLoopPos=-1; lastLoopPos=-1;
totalLoops=0; totalLoops=0;
isFadingOut=false; isFadingOut=false;
if (exportFadeOut<=0.01) {
remainingLoops=loopCount;
} else {
remainingLoops=-1; remainingLoops=-1;
}
playSub(false); playSub(false);
while (playing) { while (playing) {
@ -311,6 +308,7 @@ void DivEngine::runExportThread() {
if (lastLoopPos>-1 && j>=lastLoopPos && totalLoops>=exportLoopCount) { if (lastLoopPos>-1 && j>=lastLoopPos && totalLoops>=exportLoopCount) {
logD("start fading out..."); logD("start fading out...");
isFadingOut=true; isFadingOut=true;
if (fadeOutSamples==0) break;
} }
} }
} }
@ -399,11 +397,7 @@ bool DivEngine::saveAudio(const char* path, int loops, DivAudioExportModes mode,
stop(); stop();
repeatPattern=false; repeatPattern=false;
setOrder(0); setOrder(0);
if (exportFadeOut<=0.01) {
remainingLoops=loops;
} else {
remainingLoops=-1; remainingLoops=-1;
}
if (shallSwitchCores()) { if (shallSwitchCores()) {
bool isMutedBefore[DIV_MAX_CHANS]; bool isMutedBefore[DIV_MAX_CHANS];