@@ -122,14 +122,18 @@ class NativeAudioSource {
122122 var arrayType : TypedArrayType ;
123123 var loopPoints : Array <Int >; // In Samples
124124
125- static var threadRunning : Bool = false ;
126125 static var streamSources : Array <NativeAudioSource > = [];
127126 static var queuedStreamSources : Array <NativeAudioSource > = [];
128127
129128 static var streamMutex : Mutex = new Mutex ();
130- static var streamThread : Thread ;
131129 static var streamTimer : Timer ;
132130
131+ #if !ALLOW_MULTITHREADING
132+ static var wasEmpty : Bool = false ;
133+ static var threadRunning : Bool = false ;
134+ static var streamThread : Thread ;
135+ #end
136+
133137 var streamRemove : Bool ;
134138
135139 var bufferLength : Int ; // Size in bytes for current streamed audio buffers.
@@ -469,27 +473,31 @@ class NativeAudioSource {
469473 streamMutex .release ();
470474 }
471475
472- static function streamThreadRun () {
473- var i : Int , source : NativeAudioSource , process : Int , v : Int ;
474-
475- while ((i = Thread .readMessage (true )) != 0 ) {
476- streamMutex .acquire ();
477- while (i -- > 0 ) {
478- if ((source = streamSources [i ]).streamRemove ) continue ;
479- else if (source .parent .buffer == null ) {
480- source .stopStream ();
481- continue ;
482- }
476+ static function streamBuffersUpdate () {
477+ streamMutex .acquire ();
483478
484- process = source .requestBuffers < STREAM_MIN_BUFFERS ? STREAM_MIN_BUFFERS - source .requestBuffers : 0 ;
485- process = STREAM_PROCESS_BUFFERS > process ? STREAM_PROCESS_BUFFERS : process ;
486- if ((process = (v = STREAM_MAX_BUFFERS - source .requestBuffers ) > process ? process : v ) > 0 ) source .fillBuffers (process );
479+ var i : Int = streamSources .length , source : NativeAudioSource , process : Int , v : Int ;
480+ while (i -- > 0 ) {
481+ if ((source = streamSources [i ]).streamRemove ) continue ;
482+ else if (source .parent .buffer == null ) {
483+ source .stopStream ();
484+ continue ;
487485 }
488- streamMutex .release ();
486+
487+ process = source .requestBuffers < STREAM_MIN_BUFFERS ? STREAM_MIN_BUFFERS - source .requestBuffers : 0 ;
488+ process = STREAM_PROCESS_BUFFERS > process ? STREAM_PROCESS_BUFFERS : process ;
489+ if ((process = (v = STREAM_MAX_BUFFERS - source .requestBuffers ) > process ? process : v ) > 0 ) source .fillBuffers (process );
489490 }
490491
492+ streamMutex .release ();
493+ }
494+
495+ #if !ALLOW_MULTITHREADING
496+ static function streamThreadRun () {
497+ while (Thread .readMessage (true )) streamBuffersUpdate ();
491498 threadRunning = false ;
492499 }
500+ #end
493501
494502 static function streamUpdate () {
495503 if (! streamMutex .tryAcquire ()) return ;
@@ -512,13 +520,28 @@ class NativeAudioSource {
512520 }
513521 }
514522
515- streamMutex .release ();
523+ #if ALLOW_MULTITHREADING
524+ if (streamSources .length != 0 ) funkin.backend.utils. EngineUtil .execAsync (streamBuffersUpdate );
525+ #else
516526 if (streamSources .length == 0 ) {
517- streamTimer .stop ();
518- if (threadRunning ) streamThread .sendMessage (0 );
527+ if (wasEmpty ) {
528+ wasEmpty = false ;
529+ streamTimer .stop ();
530+ if (threadRunning ) streamThread .sendMessage (1 );
531+ }
532+ else {
533+ wasEmpty = true ;
534+ streamTimer = resetTimer (streamTimer , 1000 , streamUpdate );
535+ }
519536 }
520- else if (threadRunning || (threadRunning = (streamThread = Thread .create (streamThreadRun )) != null ))
521- streamThread .sendMessage (streamSources .length );
537+ else {
538+ wasEmpty = false ;
539+ if (threadRunning || (threadRunning = (streamThread = Thread .create (streamThreadRun )) != null ))
540+ streamThread .sendMessage (1 );
541+ }
542+ #end
543+
544+ streamMutex .release ();
522545 }
523546
524547 function removeStream () {
0 commit comments