@@ -65,16 +65,17 @@ class NativeAudioSource
6565 for (source in sources )
6666 {
6767 backend = source .__backend ;
68- if (backend != null && backend .loaded )
68+ if (backend != null && backend .loaded && ! backend . playing )
6969 {
7070 if (! backend .prepared )
7171 {
7272 backend .prepare (backend .getCurrentTime ());
73- if (! backend .prepared ) backend . timer = resetTimer ( backend . timer , 0 , backend . complete ) ;
73+ if (! backend .prepared ) continue ;
7474 }
75- else
76- backend .prepared = false ;
7775
76+ backend .prepared = false ;
77+ backend .playing = true ;
78+ backend .completed = false ;
7879 alSources .push (backend .source );
7980
8081 if (backend .streamed && ! backend .streamEnded ) backend .resetStream ();
@@ -323,15 +324,17 @@ class NativeAudioSource
323324 if (streamed )
324325 {
325326 streamMutex .acquire ();
327+
326328 removeStream ();
327329 queuedStreamAudios .remove (this );
328330 AL .sourceUnqueueBuffers (source , AL .getSourcei (source , AL .BUFFERS_QUEUED ));
329331 internalQueuedBuffers = queuedBuffers = filledBuffers = 0 ;
330- streamMutex .release ();
331332
332333 if (decoder != null && standaloneDecoder ) decoder .dispose ();
333334 decoder = null ;
334335 standaloneDecoder = false ;
336+
337+ streamMutex .release ();
335338 }
336339 else
337340 {
@@ -368,12 +371,13 @@ class NativeAudioSource
368371 if (prepared )
369372 {
370373 prepared = false ;
374+ completed = false ;
371375 if (streamed && ! streamEnded ) resetStream ();
372376
373377 AL .sourcePlay (source );
374378 timer = resetTimer (timer , (loopPoints [1 ] - pauseSample ) * 1000.0 / parent .buffer .sampleRate / getPitch (), complete );
375379 }
376- else setCurrentTime (pauseSample * 1000.0 / parent .buffer .sampleRate );
380+ else setCurrentTime (( pauseSample * 1000.0 / parent .buffer .sampleRate ) - parent . offset );
377381 }
378382
379383 public function pause (): Void
@@ -415,9 +419,9 @@ class NativeAudioSource
415419
416420 var remaining = (loopPoints [1 ] - sampleOffset ) * 1000.0 / parent .buffer .sampleRate / getPitch ();
417421 pauseSample = sampleOffset ;
418- prepared = remaining > 0 ;
422+ completed = remaining <= 0 ;
423+ prepared = ! completed ;
419424 playing = false ;
420- completed = false ;
421425
422426 if (timer != null ) timer .stop ();
423427 if (prepared )
0 commit comments