@@ -623,7 +623,7 @@ static inline void FAudio_INTERNAL_FilterVoice(
623
623
static inline float * FAudio_INTERNAL_ProcessEffectChain (
624
624
FAudioVoice * voice ,
625
625
float * buffer ,
626
- uint32_t samples
626
+ uint32_t * samples
627
627
) {
628
628
uint32_t i ;
629
629
FAPO * fapo ;
@@ -634,20 +634,20 @@ static inline float *FAudio_INTERNAL_ProcessEffectChain(
634
634
/* Set up the buffer to be written into */
635
635
srcParams .pBuffer = buffer ;
636
636
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 )
639
639
{
640
- if (buffer [i ] > 0.0000001f ) /* Arbitrary! */
640
+ if (buffer [i ] != 0.0f ) /* Arbitrary! */
641
641
{
642
642
srcParams .BufferFlags = FAPO_BUFFER_VALID ;
643
643
break ;
644
644
}
645
645
}
646
646
647
647
/* Initialize output parameters to something sane */
648
- dstParams .pBuffer = buffer ;
648
+ dstParams .pBuffer = srcParams . pBuffer ;
649
649
dstParams .BufferFlags = FAPO_BUFFER_VALID ;
650
- dstParams .ValidFrameCount = samples ;
650
+ dstParams .ValidFrameCount = srcParams . ValidFrameCount ;
651
651
652
652
/* Update parameters, process! */
653
653
for (i = 0 ; i < voice -> effects .count ; i += 1 )
@@ -660,7 +660,7 @@ static inline float *FAudio_INTERNAL_ProcessEffectChain(
660
660
{
661
661
FAudio_INTERNAL_ResizeEffectChainCache (
662
662
voice -> audio ,
663
- voice -> effects .desc [i ].OutputChannels * samples
663
+ voice -> effects .desc [i ].OutputChannels * voice -> audio -> updateSize
664
664
);
665
665
dstParams .pBuffer = voice -> audio -> effectChainCache ;
666
666
}
@@ -669,7 +669,10 @@ static inline float *FAudio_INTERNAL_ProcessEffectChain(
669
669
dstParams .pBuffer = buffer ;
670
670
}
671
671
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
+ );
673
676
}
674
677
675
678
if (voice -> effects .parameterUpdates [i ])
@@ -694,6 +697,8 @@ static inline float *FAudio_INTERNAL_ProcessEffectChain(
694
697
FAudio_memcpy (& srcParams , & dstParams , sizeof (dstParams ));
695
698
}
696
699
700
+ * samples = dstParams .ValidFrameCount ;
701
+
697
702
LOG_FUNC_EXIT (voice -> audio )
698
703
return (float * ) dstParams .pBuffer ;
699
704
}
@@ -895,7 +900,7 @@ static void FAudio_INTERNAL_MixSource(FAudioSourceVoice *voice)
895
900
effectOut = FAudio_INTERNAL_ProcessEffectChain (
896
901
voice ,
897
902
voice -> audio -> resampleCache ,
898
- mixed
903
+ & mixed
899
904
);
900
905
}
901
906
FAudio_PlatformUnlockMutex (voice -> effectLock );
@@ -1014,7 +1019,7 @@ static void FAudio_INTERNAL_MixSubmix(FAudioSubmixVoice *voice)
1014
1019
effectOut = FAudio_INTERNAL_ProcessEffectChain (
1015
1020
voice ,
1016
1021
voice -> audio -> resampleCache ,
1017
- resampled
1022
+ & resampled
1018
1023
);
1019
1024
}
1020
1025
FAudio_PlatformUnlockMutex (voice -> effectLock );
@@ -1138,12 +1143,11 @@ static void FAUDIOCALL FAudio_INTERNAL_GenerateOutput(FAudio *audio, float *outp
1138
1143
LOG_MUTEX_UNLOCK (audio , audio -> submixLock )
1139
1144
1140
1145
/* Apply master volume */
1141
- totalSamples = audio -> updateSize * audio -> master -> master .inputChannels ;
1142
1146
if (audio -> master -> volume != 1.0f )
1143
1147
{
1144
1148
FAudio_INTERNAL_Amplify (
1145
1149
output ,
1146
- totalSamples ,
1150
+ audio -> updateSize * audio -> master -> master . inputChannels ,
1147
1151
audio -> master -> volume
1148
1152
);
1149
1153
}
@@ -1153,18 +1157,26 @@ static void FAUDIOCALL FAudio_INTERNAL_GenerateOutput(FAudio *audio, float *outp
1153
1157
LOG_MUTEX_LOCK (audio , audio -> master -> effectLock )
1154
1158
if (audio -> master -> effects .count > 0 )
1155
1159
{
1160
+ totalSamples = audio -> updateSize ;
1156
1161
float * effectOut = FAudio_INTERNAL_ProcessEffectChain (
1157
1162
audio -> master ,
1158
1163
output ,
1159
- audio -> updateSize
1164
+ & totalSamples
1160
1165
);
1161
1166
1162
1167
if (effectOut != output )
1163
1168
{
1164
1169
FAudio_memcpy (
1165
1170
output ,
1166
1171
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 )
1168
1180
);
1169
1181
}
1170
1182
}
0 commit comments