Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions src/Environment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -802,4 +802,32 @@ export class Environment {
print(`Screen Size: ${window.screen.width}x${window.screen.height}`);
}
}

/**
* Prepares the given object to be sent to workers. Web Frameworks like Vue might
* create proxy objects for all objects used. This code handles the necessary unwrapping.
* @internal
* @target web
*/
public static prepareForPostMessage<T>(object: T): T {
if (!object) {
return object;
}

// Vue toRaw:
// https://github.com/vuejs/core/blob/e7381761cc7971c0d40ae0a0a72687a500fd8db3/packages/reactivity/src/reactive.ts#L378-L381

if (typeof object === 'object') {
const unwrapped = (object as any).__v_raw;
if (unwrapped) {
return Environment.prepareForPostMessage(unwrapped);
}
}

// Solidjs unwrap: the symbol required to access the raw object is unfortunately hidden and we cannot unwrap it without importing
// import { unwrap } from "solid-js/store"
// alternative for users is to replace this method during runtime.

return object;
}
}
2 changes: 1 addition & 1 deletion src/platform/javascript/AlphaSynthAudioWorkletOutput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ export class AlphaSynthAudioWorkletOutput extends AlphaSynthWebAudioOutputBase {
public addSamples(f: Float32Array): void {
this._worklet?.port.postMessage({
cmd: AlphaSynthWorkerSynthOutput.CmdOutputAddSamples,
samples: f
samples: Environment.prepareForPostMessage(f)
});
}

Expand Down
4 changes: 2 additions & 2 deletions src/platform/javascript/AlphaSynthWebWorker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ export class AlphaSynthWebWorker {
public onSoundFontLoadFailed(e: any): void {
this._main.postMessage({
cmd: 'alphaSynth.soundFontLoadFailed',
error: this.serializeException(e)
error: this.serializeException(Environment.prepareForPostMessage(e))
});
}

Expand Down Expand Up @@ -212,7 +212,7 @@ export class AlphaSynthWebWorker {
public onMidiLoadFailed(e: any): void {
this._main.postMessage({
cmd: 'alphaSynth.midiLoaded',
error: this.serializeException(e)
error: this.serializeException(Environment.prepareForPostMessage(e))
});
}

Expand Down
12 changes: 6 additions & 6 deletions src/platform/javascript/AlphaSynthWebWorkerApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ export class AlphaSynthWebWorkerApi implements IAlphaSynth {
this._midiEventsPlayedFilter = value;
this._synth.postMessage({
cmd: 'alphaSynth.setMidiEventsPlayedFilter',
value: value
value: Environment.prepareForPostMessage(value)
});
}

Expand Down Expand Up @@ -188,7 +188,7 @@ export class AlphaSynthWebWorkerApi implements IAlphaSynth {
this._playbackRange = value;
this._synth.postMessage({
cmd: 'alphaSynth.setPlaybackRange',
value: value
value: Environment.prepareForPostMessage(value)
});
}

Expand Down Expand Up @@ -264,14 +264,14 @@ export class AlphaSynthWebWorkerApi implements IAlphaSynth {
public playOneTimeMidiFile(midi: MidiFile): void {
this._synth.postMessage({
cmd: 'alphaSynth.playOneTimeMidiFile',
midi: JsonConverter.midiFileToJsObject(midi)
midi: JsonConverter.midiFileToJsObject(Environment.prepareForPostMessage(midi))
});
}

public loadSoundFont(data: Uint8Array, append: boolean): void {
this._synth.postMessage({
cmd: 'alphaSynth.loadSoundFontBytes',
data: data,
data: Environment.prepareForPostMessage(data),
append: append
});
}
Expand All @@ -285,14 +285,14 @@ export class AlphaSynthWebWorkerApi implements IAlphaSynth {
public loadMidiFile(midi: MidiFile): void {
this._synth.postMessage({
cmd: 'alphaSynth.loadMidi',
midi: JsonConverter.midiFileToJsObject(midi)
midi: JsonConverter.midiFileToJsObject(Environment.prepareForPostMessage(midi))
});
}

public applyTranspositionPitches(transpositionPitches: Map<number, number>): void {
this._synth.postMessage({
cmd: 'alphaSynth.applyTranspositionPitches',
transpositionPitches: JSON.stringify(Array.from(transpositionPitches.entries()))
transpositionPitches: JSON.stringify(Array.from(Environment.prepareForPostMessage(transpositionPitches).entries()))
});
}

Expand Down
2 changes: 1 addition & 1 deletion src/platform/javascript/AlphaSynthWorkerSynthOutput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ export class AlphaSynthWorkerSynthOutput implements ISynthOutput {
public addSamples(samples: Float32Array): void {
this._worker.postMessage({
cmd: 'alphaSynth.output.addSamples',
samples: samples
samples: Environment.prepareForPostMessage(samples)
});
}

Expand Down
6 changes: 3 additions & 3 deletions src/platform/javascript/AlphaTabWorkerScoreRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export class AlphaTabWorkerScoreRenderer<T> implements IScoreRenderer {
}

private serializeSettingsForWorker(settings: Settings): unknown {
const jsObject = JsonConverter.settingsToJsObject(settings)!;
const jsObject = JsonConverter.settingsToJsObject(Environment.prepareForPostMessage(settings))!;
// cut out player settings, they are only needed on UI thread side
jsObject.delete('player');
return jsObject;
Expand Down Expand Up @@ -113,11 +113,11 @@ export class AlphaTabWorkerScoreRenderer<T> implements IScoreRenderer {
}

public renderScore(score: Score | null, trackIndexes: number[] | null): void {
const jsObject: unknown = score == null ? null : JsonConverter.scoreToJsObject(score);
const jsObject: unknown = score == null ? null : JsonConverter.scoreToJsObject(Environment.prepareForPostMessage(score));
this._worker.postMessage({
cmd: 'alphaTab.renderScore',
score: jsObject,
trackIndexes: trackIndexes,
trackIndexes: Environment.prepareForPostMessage(trackIndexes),
fontSizes: FontSizes.FontSizeLookupTables
});
}
Expand Down