Skip to content

Commit adb4d57

Browse files
committed
Fix crashing due to threads and memory leaks
Fix crashing due to threads and memory leaks
1 parent 0fb1551 commit adb4d57

File tree

3 files changed

+111
-65
lines changed

3 files changed

+111
-65
lines changed

Source/PluginProcessor.cpp

Lines changed: 95 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ extern "C"
77
{
88
#include "Spleeter4Stems.h"
99
}
10-
enum { PARAM_DUMMY, PARAM__MAX };
10+
enum { PARAM_ORDER, PARAM__MAX };
1111
const char paramName[PARAM__MAX][2][12] =
1212
{
13-
{"dummy", "val" },
13+
{"Channel", "order" },
1414
};
1515
const float paramValueRange[PARAM__MAX][5] =
1616
{
17-
{ 0.0f, 1.0f, 0.5f, 1.0f, 1.0f }
17+
{ 0.0f, 3.0f, 0.0f, 1.0f, 1.0f }
1818
};
1919
#include <userenv.h> // GetUserProfileDirectory() (link with userenv)
2020
const int BUFLEN = 512;
@@ -28,7 +28,6 @@ BOOL getCurrentUserDir(char* buf, DWORD buflen)
2828
CloseHandle(hToken);
2929
return TRUE;
3030
}
31-
//#define DLINESUBWOOFER
3231
class MS5_1AI : public AudioProcessor, public AudioProcessorValueTreeState::Listener
3332
{
3433
public:
@@ -42,32 +41,87 @@ class MS5_1AI : public AudioProcessor, public AudioProcessorValueTreeState::List
4241
for (i = 0; i < PARAM__MAX; i++)
4342
treeState.addParameterListener(paramName[i][0], this);
4443
fs = 44100;
44+
order = 0;
4545
char dir[512];
4646
getCurrentUserDir(dir, 512);
47-
Spleeter4StemsInit(&msr, 2048, 128, dir);
48-
setLatencySamples(LATENCY);
47+
for (i = 0; i < 4; i++)
48+
coeffProvPtr[i] = malloc(getCoeffSize());
49+
// Load coeff
50+
char file1[17] = "\\drum4stems.dat";
51+
char file2[17] = "\\bass4stems.dat";
52+
char file3[26] = "\\accompaniment4stems.dat";
53+
char file4[17] = "\\vocal4stems.dat";
54+
size_t len1 = strlen(dir);
55+
size_t len2 = strlen(file1);
56+
char *concat = (char*)malloc(len1 + len2 + 1);
57+
memcpy(concat, dir, len1);
58+
memcpy(concat + len1, file1, len2 + 1);
59+
FILE *fp = fopen(concat, "rb");
60+
fread(coeffProvPtr[0], 1, 39290900, fp);
61+
fclose(fp);
62+
free(concat);
63+
len2 = strlen(file2);
64+
concat = (char*)malloc(len1 + len2 + 1);
65+
memcpy(concat, dir, len1);
66+
memcpy(concat + len1, file2, len2 + 1);
67+
fp = fopen(concat, "rb");
68+
fread(coeffProvPtr[1], 1, 39290900, fp);
69+
fclose(fp);
70+
free(concat);
71+
len2 = strlen(file3);
72+
concat = (char*)malloc(len1 + len2 + 1);
73+
memcpy(concat, dir, len1);
74+
memcpy(concat + len1, file3, len2 + 1);
75+
fp = fopen(concat, "rb");
76+
fread(coeffProvPtr[2], 1, 39290900, fp);
77+
fclose(fp);
78+
free(concat);
79+
len2 = strlen(file4);
80+
concat = (char*)malloc(len1 + len2 + 1);
81+
memcpy(concat, dir, len1);
82+
memcpy(concat + len1, file4, len2 + 1);
83+
fp = fopen(concat, "rb");
84+
fread(coeffProvPtr[3], 1, 39290900, fp);
85+
fclose(fp);
86+
free(concat);
87+
setLatencySamples(16384);
88+
msr = 0;
4989
}
5090
MS5_1AI::~MS5_1AI()
5191
{
52-
Spleeter4StemsFree(&msr);
92+
Spleeter4StemsFree(msr);
93+
if (coeffProvPtr[0])
94+
{
95+
for (int i = 0; i < 4; i++)
96+
free(coeffProvPtr[i]);
97+
coeffProvPtr[0] = 0;
98+
}
5399
}
54100
AudioProcessorValueTreeState::ParameterLayout createParameterLayout()
55101
{
56102
std::vector<std::unique_ptr<RangedAudioParameter>> parameters;
57103
for (int i = 0; i < PARAM__MAX; i++)
58-
parameters.push_back(std::make_unique<AudioParameterFloat>(paramName[i][0], paramName[i][0], NormalisableRange<float>(paramValueRange[i][0], paramValueRange[i][1]), paramValueRange[i][2]));
104+
parameters.push_back(std::make_unique<AudioParameterFloat>(paramName[i][0], paramName[i][0], NormalisableRange<float>(paramValueRange[i][0], paramValueRange[i][1], paramValueRange[i][4]), paramValueRange[i][2]));
59105
return { parameters.begin(), parameters.end() };
60106
}
61107
void parameterChanged(const String& parameter, float newValue) override
62108
{
63109
if (parameter == paramName[0][0])
64110
{
111+
order = (int)newValue;
65112
}
66113
}
67114
//==============================================================================
68115
void prepareToPlay(double sampleRate, int maximumExpectedSamplesPerBlock) override
69116
{
70117
fs = (int)sampleRate;
118+
if (msr)
119+
{
120+
Spleeter4StemsFree(msr);
121+
free(msr);
122+
}
123+
msr = (Spleeter4Stems*)malloc(sizeof(Spleeter4Stems));
124+
Spleeter4StemsInit(msr, 1536, 256, coeffProvPtr);
71125
}
72126
void releaseResources() override
73127
{
@@ -83,9 +137,37 @@ class MS5_1AI : public AudioProcessor, public AudioProcessorValueTreeState::List
83137
const int n = buffer.getNumSamples();
84138
// input channels
85139
const float *inputs[2] = { buffer.getReadPointer(0), buffer.getReadPointer(1) };
86-
float* const outputs[8] = { buffer.getWritePointer(0), buffer.getWritePointer(1),
140+
float *tmpPtr1, *tmpPtr2;
141+
float* outputs[8] = { buffer.getWritePointer(0), buffer.getWritePointer(1),
87142
buffer.getWritePointer(2), buffer.getWritePointer(3), buffer.getWritePointer(4),
88143
buffer.getWritePointer(5), buffer.getWritePointer(6), buffer.getWritePointer(7) };
144+
if (order == 1)
145+
{
146+
tmpPtr1 = outputs[0];
147+
tmpPtr2 = outputs[1];
148+
outputs[0] = outputs[2];
149+
outputs[1] = outputs[3];
150+
outputs[2] = tmpPtr1;
151+
outputs[3] = tmpPtr2;
152+
}
153+
else if (order == 2)
154+
{
155+
tmpPtr1 = outputs[0];
156+
tmpPtr2 = outputs[1];
157+
outputs[0] = outputs[4];
158+
outputs[1] = outputs[5];
159+
outputs[4] = tmpPtr1;
160+
outputs[5] = tmpPtr2;
161+
}
162+
else if (order == 3)
163+
{
164+
tmpPtr1 = outputs[0];
165+
tmpPtr2 = outputs[1];
166+
outputs[0] = outputs[6];
167+
outputs[1] = outputs[7];
168+
outputs[6] = tmpPtr1;
169+
outputs[7] = tmpPtr2;
170+
}
89171
// output channels
90172
int i, offset = 0;
91173
while (offset < n)
@@ -94,7 +176,7 @@ class MS5_1AI : public AudioProcessor, public AudioProcessorValueTreeState::List
94176
outputs[2] + offset, outputs[3] + offset, outputs[4] + offset,
95177
outputs[5] + offset, outputs[6] + offset, outputs[7] + offset };
96178
const int processing = min(n - offset, OVPSIZE);
97-
Spleeter4StemsProcessSamples(&msr, inputs[0] + offset, inputs[1] + offset, processing, ptr);
179+
Spleeter4StemsProcessSamples(msr, inputs[0] + offset, inputs[1] + offset, processing, ptr);
98180
offset += processing;
99181
}
100182
}
@@ -133,8 +215,10 @@ class MS5_1AI : public AudioProcessor, public AudioProcessorValueTreeState::List
133215
private:
134216
int isStandalone;
135217
//==============================================================================
136-
Spleeter4Stems msr;
218+
void *coeffProvPtr[4];
219+
Spleeter4Stems *msr;
137220
int fs;
221+
int order;
138222
AudioProcessorValueTreeState treeState;
139223
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MS5_1AI)
140224
};

Source/Spleeter4Stems.c

Lines changed: 14 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -351,10 +351,14 @@ void LLPAMSProcessNPR(Spleeter4Stems *msr)
351351
if (msr->nnMaskCursor >= msr->timeStep)
352352
{
353353
// Join mask functions from threads
354-
task_wait(msr, 1);
355-
task_wait(msr, 2);
356-
task_wait(msr, 3);
357-
task_wait(msr, 4);
354+
if (!msr->needWait)
355+
msr->needWait = 1;
356+
{
357+
task_wait(msr, 1);
358+
task_wait(msr, 2);
359+
task_wait(msr, 3);
360+
task_wait(msr, 4);
361+
}
358362
// Switch buffer
359363
msr->outputFramePtr = !msr->outputFramePtr;
360364
// Prevent race condition
@@ -395,7 +399,7 @@ void getAsymmetricWindow(float *analysisWnd, float *synthesisWnd, int k, int m,
395399
for (i = 0; i < FFTSIZE - SAMPLESHIFT; i++)
396400
synthesisWnd[i] = synthesisWnd[i + SAMPLESHIFT];
397401
}
398-
void Spleeter4StemsInit(Spleeter4Stems *msr, int initSpectralBinLimit, int initTimeStep, char *dir)
402+
void Spleeter4StemsInit(Spleeter4Stems *msr, int initSpectralBinLimit, int initTimeStep, void *coeffProvider[4])
399403
{
400404
memset(msr, 0, sizeof(Spleeter4Stems));
401405
int i;
@@ -437,15 +441,10 @@ void Spleeter4StemsInit(Spleeter4Stems *msr, int initSpectralBinLimit, int initT
437441
msr->nn[1] = (spleeter)allocateSpleeterStr();
438442
msr->nn[2] = (spleeter)allocateSpleeterStr();
439443
msr->nn[3] = (spleeter)allocateSpleeterStr();
440-
initSpleeter(msr->nn[0], msr->analyseBinLimit, msr->timeStep, 1);
441-
initSpleeter(msr->nn[1], msr->analyseBinLimit, msr->timeStep, 1);
442-
initSpleeter(msr->nn[2], msr->analyseBinLimit, msr->timeStep, 1);
443-
initSpleeter(msr->nn[3], msr->analyseBinLimit, msr->timeStep, 1);
444-
void *ceoffProvPtr[4];
445-
getCoeffPtr(msr->nn[0], &ceoffProvPtr[0]);
446-
getCoeffPtr(msr->nn[1], &ceoffProvPtr[1]);
447-
getCoeffPtr(msr->nn[2], &ceoffProvPtr[2]);
448-
getCoeffPtr(msr->nn[3], &ceoffProvPtr[3]);
444+
initSpleeter(msr->nn[0], msr->analyseBinLimit, msr->timeStep, 1, coeffProvider[0]);
445+
initSpleeter(msr->nn[1], msr->analyseBinLimit, msr->timeStep, 1, coeffProvider[1]);
446+
initSpleeter(msr->nn[2], msr->analyseBinLimit, msr->timeStep, 1, coeffProvider[2]);
447+
initSpleeter(msr->nn[3], msr->analyseBinLimit, msr->timeStep, 1, coeffProvider[3]);
449448
msr->maskPtr[0][0] = (float*)malloc(msr->analyseBinLimit * msr->timeStep * 2 * sizeof(float));
450449
msr->maskPtr[0][1] = (float*)malloc(msr->analyseBinLimit * msr->timeStep * 2 * sizeof(float));
451450
msr->maskPtr[0][2] = (float*)malloc(msr->analyseBinLimit * msr->timeStep * 2 * sizeof(float));
@@ -466,51 +465,13 @@ void Spleeter4StemsInit(Spleeter4Stems *msr, int initSpectralBinLimit, int initT
466465
msr->maskPtr[1][2][i] = v;
467466
msr->maskPtr[1][3][i] = v;
468467
}
469-
// Load coeff
470-
char file1[17] = "\\drum4stems.dat";
471-
char file2[17] = "\\bass4stems.dat";
472-
char file3[26] = "\\accompaniment4stems.dat";
473-
char file4[17] = "\\vocal4stems.dat";
474-
size_t len1 = strlen(dir);
475-
size_t len2 = strlen(file1);
476-
char *concat = (char*)malloc(len1 + len2 + 1);
477-
memcpy(concat, dir, len1);
478-
memcpy(concat + len1, file1, len2 + 1);
479-
FILE *fp = fopen(concat, "rb");
480-
fread(ceoffProvPtr[0], 1, 39290900, fp);
481-
fclose(fp);
482-
free(concat);
483-
len2 = strlen(file2);
484-
concat = (char*)malloc(len1 + len2 + 1);
485-
memcpy(concat, dir, len1);
486-
memcpy(concat + len1, file2, len2 + 1);
487-
fp = fopen(concat, "rb");
488-
fread(ceoffProvPtr[1], 1, 39290900, fp);
489-
fclose(fp);
490-
free(concat);
491-
len2 = strlen(file3);
492-
concat = (char*)malloc(len1 + len2 + 1);
493-
memcpy(concat, dir, len1);
494-
memcpy(concat + len1, file3, len2 + 1);
495-
fp = fopen(concat, "rb");
496-
fread(ceoffProvPtr[2], 1, 39290900, fp);
497-
fclose(fp);
498-
free(concat);
499-
len2 = strlen(file4);
500-
concat = (char*)malloc(len1 + len2 + 1);
501-
memcpy(concat, dir, len1);
502-
memcpy(concat + len1, file4, len2 + 1);
503-
fp = fopen(concat, "rb");
504-
fread(ceoffProvPtr[3], 1, 39290900, fp);
505-
fclose(fp);
506-
free(concat);
507468
msr->nnMaskCursor = 0;
508469
msr->outputFramePtr = 0;
509470
thread_initSpleeter4s(msr);
510471
}
511472
void Spleeter4StemsFree(Spleeter4Stems *msr)
512473
{
513-
if (!msr->mInputPos && !msr->nnMaskCursor && !msr->mOutputReadSampleOffset && !msr->mOutputBufferCount)
474+
if (!msr->needWait)
514475
{
515476
// Indicate we haven't run wake up the neural network thread for the first time
516477
for (int i = 1; i < TASK_NB; i++)

Source/Spleeter4Stems.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ typedef struct
6262
// IFFT Threads
6363
pthread_t threads[TASK_NB];
6464
pt_infoSpleeter4s shared_info[TASK_NB];
65+
int needWait;
6566
} Spleeter4Stems;
66-
void Spleeter4StemsInit(Spleeter4Stems *msr, int initSpectralBinLimit, int initTimeStep, char *dir);
67+
void Spleeter4StemsInit(Spleeter4Stems *msr, int initSpectralBinLimit, int initTimeStep, void *coeffProvider[4]);
6768
void Spleeter4StemsFree(Spleeter4Stems *msr);
6869
void Spleeter4StemsProcessSamples(Spleeter4Stems *msr, const float *inLeft, const float *inRight, int inSampleCount, float **components);

0 commit comments

Comments
 (0)