Skip to content

Commit 10ee03e

Browse files
committed
ValidFrameCount safety, better SILENT check
1 parent 8335b7e commit 10ee03e

File tree

1 file changed

+26
-14
lines changed

1 file changed

+26
-14
lines changed

src/FAudio_internal.c

+26-14
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ static inline void FAudio_INTERNAL_FilterVoice(
623623
static inline float *FAudio_INTERNAL_ProcessEffectChain(
624624
FAudioVoice *voice,
625625
float *buffer,
626-
uint32_t samples
626+
uint32_t *samples
627627
) {
628628
uint32_t i;
629629
FAPO *fapo;
@@ -634,20 +634,20 @@ static inline float *FAudio_INTERNAL_ProcessEffectChain(
634634
/* Set up the buffer to be written into */
635635
srcParams.pBuffer = buffer;
636636
srcParams.BufferFlags = FAPO_BUFFER_SILENT;
637-
srcParams.ValidFrameCount = samples;
638-
for (i = 0; i < samples; i += 1)
637+
srcParams.ValidFrameCount = *samples;
638+
for (i = 0; i < srcParams.ValidFrameCount; i += 1)
639639
{
640-
if (buffer[i] > 0.0000001f) /* Arbitrary! */
640+
if (buffer[i] != 0.0f) /* Arbitrary! */
641641
{
642642
srcParams.BufferFlags = FAPO_BUFFER_VALID;
643643
break;
644644
}
645645
}
646646

647647
/* Initialize output parameters to something sane */
648-
dstParams.pBuffer = buffer;
648+
dstParams.pBuffer = srcParams.pBuffer;
649649
dstParams.BufferFlags = FAPO_BUFFER_VALID;
650-
dstParams.ValidFrameCount = samples;
650+
dstParams.ValidFrameCount = srcParams.ValidFrameCount;
651651

652652
/* Update parameters, process! */
653653
for (i = 0; i < voice->effects.count; i += 1)
@@ -660,7 +660,7 @@ static inline float *FAudio_INTERNAL_ProcessEffectChain(
660660
{
661661
FAudio_INTERNAL_ResizeEffectChainCache(
662662
voice->audio,
663-
voice->effects.desc[i].OutputChannels * samples
663+
voice->effects.desc[i].OutputChannels * voice->audio->updateSize
664664
);
665665
dstParams.pBuffer = voice->audio->effectChainCache;
666666
}
@@ -669,7 +669,10 @@ static inline float *FAudio_INTERNAL_ProcessEffectChain(
669669
dstParams.pBuffer = buffer;
670670
}
671671

672-
FAudio_zero(dstParams.pBuffer, voice->effects.desc[i].OutputChannels * samples * sizeof(float));
672+
FAudio_zero(
673+
dstParams.pBuffer,
674+
voice->effects.desc[i].OutputChannels * voice->audio->updateSize * sizeof(float)
675+
);
673676
}
674677

675678
if (voice->effects.parameterUpdates[i])
@@ -694,6 +697,8 @@ static inline float *FAudio_INTERNAL_ProcessEffectChain(
694697
FAudio_memcpy(&srcParams, &dstParams, sizeof(dstParams));
695698
}
696699

700+
*samples = dstParams.ValidFrameCount;
701+
697702
LOG_FUNC_EXIT(voice->audio)
698703
return (float*) dstParams.pBuffer;
699704
}
@@ -895,7 +900,7 @@ static void FAudio_INTERNAL_MixSource(FAudioSourceVoice *voice)
895900
effectOut = FAudio_INTERNAL_ProcessEffectChain(
896901
voice,
897902
voice->audio->resampleCache,
898-
mixed
903+
&mixed
899904
);
900905
}
901906
FAudio_PlatformUnlockMutex(voice->effectLock);
@@ -1014,7 +1019,7 @@ static void FAudio_INTERNAL_MixSubmix(FAudioSubmixVoice *voice)
10141019
effectOut = FAudio_INTERNAL_ProcessEffectChain(
10151020
voice,
10161021
voice->audio->resampleCache,
1017-
resampled
1022+
&resampled
10181023
);
10191024
}
10201025
FAudio_PlatformUnlockMutex(voice->effectLock);
@@ -1138,12 +1143,11 @@ static void FAUDIOCALL FAudio_INTERNAL_GenerateOutput(FAudio *audio, float *outp
11381143
LOG_MUTEX_UNLOCK(audio, audio->submixLock)
11391144

11401145
/* Apply master volume */
1141-
totalSamples = audio->updateSize * audio->master->master.inputChannels;
11421146
if (audio->master->volume != 1.0f)
11431147
{
11441148
FAudio_INTERNAL_Amplify(
11451149
output,
1146-
totalSamples,
1150+
audio->updateSize * audio->master->master.inputChannels,
11471151
audio->master->volume
11481152
);
11491153
}
@@ -1153,18 +1157,26 @@ static void FAUDIOCALL FAudio_INTERNAL_GenerateOutput(FAudio *audio, float *outp
11531157
LOG_MUTEX_LOCK(audio, audio->master->effectLock)
11541158
if (audio->master->effects.count > 0)
11551159
{
1160+
totalSamples = audio->updateSize;
11561161
float *effectOut = FAudio_INTERNAL_ProcessEffectChain(
11571162
audio->master,
11581163
output,
1159-
audio->updateSize
1164+
&totalSamples
11601165
);
11611166

11621167
if (effectOut != output)
11631168
{
11641169
FAudio_memcpy(
11651170
output,
11661171
effectOut,
1167-
audio->updateSize * audio->master->outputChannels * sizeof(float)
1172+
totalSamples * audio->master->outputChannels * sizeof(float)
1173+
);
1174+
}
1175+
if (totalSamples < audio->updateSize)
1176+
{
1177+
FAudio_zero(
1178+
output + (totalSamples * audio->master->outputChannels),
1179+
(audio->updateSize - totalSamples) * sizeof(float)
11681180
);
11691181
}
11701182
}

0 commit comments

Comments
 (0)