Parcourir la source

Playback: make play and pause async using await so play and pause don't race (#6)

before, quickly using play and pause in succession could create a race condition
where it was random which executed / came into effect last.

fix #6

fix by @conde2
sschmid il y a 4 ans
Parent
commit
3c925429f1

+ 2 - 2
src/Common/Interfaces/IPlaybackParametersListener.ts

@@ -3,7 +3,7 @@ export interface IPlaybackParametersListener {
     volumeChanged(instrumentId: number, newVolume: number): void;
     volumeMute(instrumentId: number): void;
     volumeUnmute(instrumentId: number): void;
-    play(): void;
-    pause(): void;
+    play(): Promise<void>;
+    pause(): Promise<void>;
     reset(): void;
 }

+ 4 - 4
src/Playback/PlaybackManager.ts

@@ -329,7 +329,7 @@ export class PlaybackManager implements IPlaybackParametersListener {
         this.reset();
     }
 
-    public play(): void {
+    public async play(): Promise<void> {
         if (this.cursorIterator !== undefined && this.cursorIterator.EndReached) {
             console.log("End reached, resetting");
             this.reset();
@@ -337,11 +337,11 @@ export class PlaybackManager implements IPlaybackParametersListener {
 
         this.isPlaying = true;
         this.RunningState = PlaybackState.Running;
-        this.timingSource.start();
+        await this.timingSource.start();
         this.loop();
     }
 
-    public pause(): void {
+    public async pause(): Promise<void> {
         // lock(this.playbackThreadSyncObject) {
             this.isPlaying = false;
             // stop all active midi notes:
@@ -354,7 +354,7 @@ export class PlaybackManager implements IPlaybackParametersListener {
 
             // notify delegates (coreContainer) that the playing has finished:
             this.RunningState = PlaybackState.Stopped;
-            this.timingSource.pause();
+            await this.timingSource.pause();
             try {
                 //bool endReached = this.iterator !== undefined && this.iterator.EndReached;
                 for (const listener of this.listeners) {

+ 2 - 2
src/Playback/UIComponents/ControlPanel/ControlPanel.ts

@@ -27,10 +27,10 @@ export class ControlPanel extends AUIController<IPlaybackParametersListener> imp
     public volumeChanged(channels: number, newVolume: number): void {
         throw new Error("Method not implemented.");
     }
-    public play(): void {
+    public play(): Promise<void> {
         throw new Error("Method not implemented.");
     }
-    public pause(): void {
+    public pause(): Promise<void> {
         throw new Error("Method not implemented.");
     }
     public reset(): void {