@opendaw/studio-core 0.0.23 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AudioDevices.d.ts.map +1 -1
- package/dist/AudioDevices.js +1 -0
- package/dist/{Worklets.d.ts → AudioWorklets.d.ts} +6 -5
- package/dist/AudioWorklets.d.ts.map +1 -0
- package/dist/{Worklets.js → AudioWorklets.js} +3 -2
- package/dist/EffectFactory.d.ts +1 -1
- package/dist/EffectFactory.d.ts.map +1 -1
- package/dist/Engine.d.ts +6 -16
- package/dist/Engine.d.ts.map +1 -1
- package/dist/EngineFacade.d.ts +10 -9
- package/dist/EngineFacade.d.ts.map +1 -1
- package/dist/EngineFacade.js +28 -25
- package/dist/EngineWorklet.d.ts +7 -7
- package/dist/EngineWorklet.d.ts.map +1 -1
- package/dist/EngineWorklet.js +8 -16
- package/dist/PeaksWriter.d.ts +19 -0
- package/dist/PeaksWriter.d.ts.map +1 -0
- package/dist/PeaksWriter.js +43 -0
- package/dist/RecordingWorklet.d.ts +4 -2
- package/dist/RecordingWorklet.d.ts.map +1 -1
- package/dist/RecordingWorklet.js +36 -62
- package/dist/capture/Capture.d.ts +5 -6
- package/dist/capture/Capture.d.ts.map +1 -1
- package/dist/capture/CaptureAudio.d.ts +4 -5
- package/dist/capture/CaptureAudio.d.ts.map +1 -1
- package/dist/capture/CaptureAudio.js +26 -14
- package/dist/capture/{CaptureManager.d.ts → CaptureDevices.d.ts} +4 -3
- package/dist/capture/CaptureDevices.d.ts.map +1 -0
- package/dist/capture/{CaptureManager.js → CaptureDevices.js} +10 -1
- package/dist/capture/CaptureMidi.d.ts +8 -6
- package/dist/capture/CaptureMidi.d.ts.map +1 -1
- package/dist/capture/CaptureMidi.js +67 -47
- package/dist/capture/RecordAudio.d.ts +2 -2
- package/dist/capture/RecordAudio.d.ts.map +1 -1
- package/dist/capture/RecordAudio.js +50 -36
- package/dist/capture/RecordMidi.d.ts +3 -2
- package/dist/capture/RecordMidi.d.ts.map +1 -1
- package/dist/capture/RecordMidi.js +19 -22
- package/dist/capture/Recording.d.ts +2 -2
- package/dist/capture/Recording.d.ts.map +1 -1
- package/dist/capture/Recording.js +10 -11
- package/dist/dawproject/DawProject.d.ts +1 -1
- package/dist/dawproject/DawProject.d.ts.map +1 -1
- package/dist/dawproject/DawProject.js +3 -2
- package/dist/dawproject/DawProjectExporter.d.ts +1 -1
- package/dist/dawproject/DawProjectExporter.d.ts.map +1 -1
- package/dist/dawproject/DawProjectExporter.test.js +6 -5
- package/dist/index.d.ts +10 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -6
- package/dist/processors.js +3 -3
- package/dist/processors.js.map +4 -4
- package/dist/{Project.d.ts → project/Project.d.ts} +8 -7
- package/dist/project/Project.d.ts.map +1 -0
- package/dist/{Project.js → project/Project.js} +14 -6
- package/dist/{ProjectApi.d.ts → project/ProjectApi.d.ts} +5 -5
- package/dist/project/ProjectApi.d.ts.map +1 -0
- package/dist/{ProjectApi.js → project/ProjectApi.js} +2 -2
- package/dist/project/ProjectBundle.d.ts +8 -0
- package/dist/project/ProjectBundle.d.ts.map +1 -0
- package/dist/project/ProjectBundle.js +90 -0
- package/dist/project/ProjectEnv.d.ts +15 -0
- package/dist/project/ProjectEnv.d.ts.map +1 -0
- package/dist/project/ProjectMeta.d.ts +14 -0
- package/dist/project/ProjectMeta.d.ts.map +1 -0
- package/dist/project/ProjectMeta.js +12 -0
- package/dist/project/ProjectMigration.d.ts.map +1 -0
- package/dist/project/ProjectPaths.d.ts +12 -0
- package/dist/project/ProjectPaths.d.ts.map +1 -0
- package/dist/project/ProjectPaths.js +12 -0
- package/dist/project/ProjectProfile.d.ts +21 -0
- package/dist/project/ProjectProfile.d.ts.map +1 -0
- package/dist/project/ProjectProfile.js +83 -0
- package/dist/samples/MainThreadSampleLoader.d.ts +0 -2
- package/dist/samples/MainThreadSampleLoader.d.ts.map +1 -1
- package/dist/samples/MainThreadSampleLoader.js +1 -26
- package/dist/samples/MainThreadSampleManager.d.ts +1 -0
- package/dist/samples/MainThreadSampleManager.d.ts.map +1 -1
- package/dist/samples/MainThreadSampleManager.js +1 -0
- package/dist/sync-log/Commit.d.ts +1 -1
- package/dist/sync-log/Commit.d.ts.map +1 -1
- package/dist/sync-log/SyncLogReader.d.ts +2 -2
- package/dist/sync-log/SyncLogReader.d.ts.map +1 -1
- package/dist/sync-log/SyncLogReader.js +1 -1
- package/dist/sync-log/SyncLogWriter.d.ts +1 -1
- package/dist/sync-log/SyncLogWriter.d.ts.map +1 -1
- package/dist/workers.js +2 -2
- package/dist/workers.js.map +3 -3
- package/package.json +14 -14
- package/dist/Project.d.ts.map +0 -1
- package/dist/ProjectApi.d.ts.map +0 -1
- package/dist/ProjectEnv.d.ts +0 -5
- package/dist/ProjectEnv.d.ts.map +0 -1
- package/dist/ProjectMigration.d.ts.map +0 -1
- package/dist/Worklets.d.ts.map +0 -1
- package/dist/capture/CaptureManager.d.ts.map +0 -1
- package/dist/capture/RecordingContext.d.ts +0 -10
- package/dist/capture/RecordingContext.d.ts.map +0 -1
- package/dist/capture/RecordingContext.js +0 -1
- /package/dist/{ProjectEnv.js → project/ProjectEnv.js} +0 -0
- /package/dist/{ProjectMigration.d.ts → project/ProjectMigration.d.ts} +0 -0
- /package/dist/{ProjectMigration.js → project/ProjectMigration.js} +0 -0
@@ -4,12 +4,12 @@ import { AudioBusBox, AudioUnitBox, BoxIO, RootBox, TimelineBox, UserInterfaceBo
|
|
4
4
|
import { BoxAdapters, BoxAdaptersContext, ClipSequencing, ParameterFieldAdapters, ProjectDecoder, RootBoxAdapter, SampleManager, TimelineBoxAdapter, UserEditingManager, VertexSelection } from "@opendaw/studio-adapters";
|
5
5
|
import { LiveStreamBroadcaster, LiveStreamReceiver } from "@opendaw/lib-fusion";
|
6
6
|
import { ProjectEnv } from "./ProjectEnv";
|
7
|
-
import { Mixer } from "
|
7
|
+
import { Mixer } from "../Mixer";
|
8
8
|
import { ProjectApi } from "./ProjectApi";
|
9
|
-
import {
|
10
|
-
import { EngineFacade } from "
|
11
|
-
import { EngineWorklet } from "
|
12
|
-
import {
|
9
|
+
import { CaptureDevices } from "../capture/CaptureDevices";
|
10
|
+
import { EngineFacade } from "../EngineFacade";
|
11
|
+
import { EngineWorklet } from "../EngineWorklet";
|
12
|
+
import { AudioWorklets } from "../AudioWorklets";
|
13
13
|
export type RestartWorklet = {
|
14
14
|
unload: Procedure<unknown>;
|
15
15
|
load: Procedure<EngineWorklet>;
|
@@ -26,7 +26,7 @@ export declare class Project implements BoxAdaptersContext, Terminable, Terminab
|
|
26
26
|
readonly masterAudioUnit: AudioUnitBox;
|
27
27
|
readonly timelineBox: TimelineBox;
|
28
28
|
readonly api: ProjectApi;
|
29
|
-
readonly
|
29
|
+
readonly captureDevices: CaptureDevices;
|
30
30
|
readonly editing: Editing;
|
31
31
|
readonly selection: VertexSelection;
|
32
32
|
readonly boxAdapters: BoxAdapters;
|
@@ -36,7 +36,8 @@ export declare class Project implements BoxAdaptersContext, Terminable, Terminab
|
|
36
36
|
readonly mixer: Mixer;
|
37
37
|
readonly engine: EngineFacade;
|
38
38
|
private constructor();
|
39
|
-
startAudioWorklet(worklets:
|
39
|
+
startAudioWorklet(worklets: AudioWorklets, restart: RestartWorklet): EngineWorklet;
|
40
|
+
startRecording(countIn?: boolean): void;
|
40
41
|
own<T extends Terminable>(terminable: T): T;
|
41
42
|
ownAll<T extends Terminable>(...terminables: Array<T>): void;
|
42
43
|
spawn(): Terminator;
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
|
@@ -4,11 +4,12 @@ import { AudioBusBox, AudioUnitBox, BoxIO, GrooveShuffleBox, RootBox, TimelineBo
|
|
4
4
|
import { BoxAdapters, IconSymbol, ParameterFieldAdapters, ProjectDecoder, RootBoxAdapter, TimelineBoxAdapter, UserEditingManager, VertexSelection } from "@opendaw/studio-adapters";
|
5
5
|
import { LiveStreamReceiver } from "@opendaw/lib-fusion";
|
6
6
|
import { AudioUnitType } from "@opendaw/studio-enums";
|
7
|
-
import { Mixer } from "
|
7
|
+
import { Mixer } from "../Mixer";
|
8
8
|
import { ProjectApi } from "./ProjectApi";
|
9
9
|
import { ProjectMigration } from "./ProjectMigration";
|
10
|
-
import {
|
11
|
-
import { EngineFacade } from "
|
10
|
+
import { CaptureDevices } from "../capture/CaptureDevices";
|
11
|
+
import { EngineFacade } from "../EngineFacade";
|
12
|
+
import { Recording } from "../capture/Recording";
|
12
13
|
// Main Entry Point for a Project
|
13
14
|
export class Project {
|
14
15
|
static new(env) {
|
@@ -67,7 +68,7 @@ export class Project {
|
|
67
68
|
masterAudioUnit;
|
68
69
|
timelineBox;
|
69
70
|
api;
|
70
|
-
|
71
|
+
captureDevices;
|
71
72
|
editing;
|
72
73
|
selection;
|
73
74
|
boxAdapters;
|
@@ -85,7 +86,6 @@ export class Project {
|
|
85
86
|
this.masterAudioUnit = masterAudioUnit;
|
86
87
|
this.timelineBox = timelineBox;
|
87
88
|
this.api = new ProjectApi(this);
|
88
|
-
this.captureManager = this.#terminator.own(new CaptureManager(this));
|
89
89
|
this.editing = new Editing(this.boxGraph);
|
90
90
|
this.selection = new VertexSelection(this.editing, this.boxGraph);
|
91
91
|
this.parameterFieldAdapters = new ParameterFieldAdapters();
|
@@ -94,6 +94,7 @@ export class Project {
|
|
94
94
|
this.userEditingManager.follow(this.userInterfaceBox);
|
95
95
|
this.selection.switch(this.userInterfaceBox.selection);
|
96
96
|
this.liveStreamReceiver = this.#terminator.own(new LiveStreamReceiver());
|
97
|
+
this.captureDevices = this.#terminator.own(new CaptureDevices(this));
|
97
98
|
this.mixer = new Mixer(this.rootBoxAdapter.audioUnits);
|
98
99
|
console.debug(`Project was created on ${this.rootBoxAdapter.created.toString()}`);
|
99
100
|
}
|
@@ -113,9 +114,16 @@ export class Project {
|
|
113
114
|
engine.addEventListener("error", handler);
|
114
115
|
engine.addEventListener("processorerror", handler);
|
115
116
|
engine.connect(engine.context.destination);
|
116
|
-
this.engine.
|
117
|
+
this.engine.setWorklet(engine);
|
117
118
|
return engine;
|
118
119
|
}
|
120
|
+
startRecording(countIn = true) {
|
121
|
+
this.engine.assertWorklet();
|
122
|
+
if (Recording.isRecording) {
|
123
|
+
return;
|
124
|
+
}
|
125
|
+
Recording.start(this, countIn).finally();
|
126
|
+
}
|
119
127
|
own(terminable) { return this.#terminator.own(terminable); }
|
120
128
|
ownAll(...terminables) { return this.#terminator.ownAll(...terminables); }
|
121
129
|
spawn() { return this.#terminator.spawn(); }
|
@@ -5,11 +5,11 @@ import { AudioUnitType, Pointers } from "@opendaw/studio-enums";
|
|
5
5
|
import { AudioBusBox, AudioUnitBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueRegionBox } from "@opendaw/studio-boxes";
|
6
6
|
import { AnyClipBox, AudioUnitBoxAdapter, EffectPointerType, IconSymbol, IndexedAdapterCollectionListener } from "@opendaw/studio-adapters";
|
7
7
|
import { Project } from "./Project";
|
8
|
-
import { InstrumentFactory } from "
|
9
|
-
import { InstrumentProduct } from "
|
10
|
-
import { InstrumentOptions } from "
|
11
|
-
import { EffectFactory } from "
|
12
|
-
import { EffectBox } from "
|
8
|
+
import { InstrumentFactory } from "../InstrumentFactory";
|
9
|
+
import { InstrumentProduct } from "../InstrumentProduct";
|
10
|
+
import { InstrumentOptions } from "../InstrumentOptions";
|
11
|
+
import { EffectFactory } from "../EffectFactory";
|
12
|
+
import { EffectBox } from "../EffectBox";
|
13
13
|
export type ClipRegionOptions = {
|
14
14
|
name?: string;
|
15
15
|
hue?: number;
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"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"}
|
@@ -4,8 +4,8 @@ import { IndexedBox, StringField } from "@opendaw/lib-box";
|
|
4
4
|
import { AudioUnitType } from "@opendaw/studio-enums";
|
5
5
|
import { AudioBusBox, AudioUnitBox, CaptureAudioBox, CaptureMidiBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox, ValueEventCollectionBox, ValueRegionBox } from "@opendaw/studio-boxes";
|
6
6
|
import { IconSymbol, TrackType } from "@opendaw/studio-adapters";
|
7
|
-
import { ColorCodes } from "
|
8
|
-
import { AudioUnitOrdering } from "
|
7
|
+
import { ColorCodes } from "../ColorCodes";
|
8
|
+
import { AudioUnitOrdering } from "../AudioUnitOrdering";
|
9
9
|
// noinspection JSUnusedGlobalSymbols
|
10
10
|
export class ProjectApi {
|
11
11
|
#project;
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { MutableObservableValue, unitValue, UUID } from "@opendaw/lib-std";
|
2
|
+
import { ProjectEnv } from "./ProjectEnv";
|
3
|
+
import { ProjectProfile } from "./ProjectProfile";
|
4
|
+
export declare namespace ProjectBundle {
|
5
|
+
const encode: ({ uuid, project, meta, cover }: ProjectProfile, progress: MutableObservableValue<unitValue>) => Promise<ArrayBuffer>;
|
6
|
+
const decode: (env: ProjectEnv, arrayBuffer: ArrayBuffer, exclude?: UUID.Format) => Promise<ProjectProfile>;
|
7
|
+
}
|
8
|
+
//# sourceMappingURL=ProjectBundle.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ProjectBundle.d.ts","sourceRoot":"","sources":["../../src/project/ProjectBundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,sBAAsB,EAAiB,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAInH,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAM/C,yBAAiB,aAAa,CAAC;IACpB,MAAM,MAAM,GAAU,gCAA8B,cAAc,EAC5C,UAAU,sBAAsB,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,WAAW,CAuB7F,CAAA;IAEM,MAAM,MAAM,GAAU,KAAK,UAAU,EACf,aAAa,WAAW,EACxB,UAAU,IAAI,CAAC,MAAM,KAAG,OAAO,CAAC,cAAc,CA8B1E,CAAA;CAyBJ"}
|
@@ -0,0 +1,90 @@
|
|
1
|
+
import { asDefined, isDefined, Option, panic, UUID } from "@opendaw/lib-std";
|
2
|
+
import { AudioFileBox } from "@opendaw/studio-boxes";
|
3
|
+
import { Project } from "./Project";
|
4
|
+
import { ProjectPaths } from "./ProjectPaths";
|
5
|
+
import { ProjectProfile } from "./ProjectProfile";
|
6
|
+
import { WorkerAgents } from "../WorkerAgents";
|
7
|
+
import { SampleStorage } from "../samples/SampleStorage";
|
8
|
+
export var ProjectBundle;
|
9
|
+
(function (ProjectBundle) {
|
10
|
+
ProjectBundle.encode = async ({ uuid, project, meta, cover }, progress) => {
|
11
|
+
const { default: JSZip } = await import("jszip");
|
12
|
+
const zip = new JSZip();
|
13
|
+
zip.file("version", "1");
|
14
|
+
zip.file("uuid", uuid, { binary: true });
|
15
|
+
zip.file(ProjectPaths.ProjectFile, project.toArrayBuffer(), { binary: true });
|
16
|
+
zip.file(ProjectPaths.ProjectMetaFile, JSON.stringify(meta, null, 2));
|
17
|
+
cover.ifSome(buffer => zip.file(ProjectPaths.ProjectCoverFile, buffer, { binary: true }));
|
18
|
+
const samples = asDefined(zip.folder("samples"), "Could not create folder samples");
|
19
|
+
const boxes = project.boxGraph.boxes().filter(box => box instanceof AudioFileBox);
|
20
|
+
let boxIndex = 0;
|
21
|
+
const blob = await Promise.all(boxes
|
22
|
+
.map(async ({ address: { uuid } }) => {
|
23
|
+
const handler = project.sampleManager.getOrCreate(uuid);
|
24
|
+
const folder = asDefined(samples.folder(UUID.toString(uuid)), "Could not create folder for sample");
|
25
|
+
return pipeSampleLoaderInto(handler, folder).then(() => progress.setValue(++boxIndex / boxes.length * 0.75));
|
26
|
+
})).then(() => zip.generateAsync({
|
27
|
+
type: "blob",
|
28
|
+
compression: "DEFLATE",
|
29
|
+
compressionOptions: { level: 6 }
|
30
|
+
}));
|
31
|
+
progress.setValue(1.0);
|
32
|
+
return blob.arrayBuffer();
|
33
|
+
};
|
34
|
+
ProjectBundle.decode = async (env, arrayBuffer, exclude) => {
|
35
|
+
const { default: JSZip } = await import("jszip");
|
36
|
+
const zip = await JSZip.loadAsync(arrayBuffer);
|
37
|
+
if (await asDefined(zip.file("version")).async("text") !== "1") {
|
38
|
+
return panic("Unknown bundle version");
|
39
|
+
}
|
40
|
+
const bundleUUID = UUID.validate(await asDefined(zip.file("uuid")).async("uint8array"));
|
41
|
+
console.debug(UUID.toString(bundleUUID), exclude ? UUID.toString(exclude) : "none");
|
42
|
+
if (isDefined(exclude) && UUID.equals(exclude, bundleUUID)) {
|
43
|
+
return panic("Project is already open");
|
44
|
+
}
|
45
|
+
console.debug("loading samples...");
|
46
|
+
const samples = asDefined(zip.folder("samples"), "Could not find samples");
|
47
|
+
const promises = [];
|
48
|
+
samples.forEach((path, file) => {
|
49
|
+
if (!file.dir) {
|
50
|
+
promises.push(file
|
51
|
+
.async("arraybuffer")
|
52
|
+
.then(arrayBuffer => WorkerAgents.Opfs
|
53
|
+
.write(`${SampleStorage.Folder}/${path}`, new Uint8Array(arrayBuffer))));
|
54
|
+
}
|
55
|
+
});
|
56
|
+
await Promise.all(promises);
|
57
|
+
const project = Project.load(env, await asDefined(zip.file(ProjectPaths.ProjectFile)).async("arraybuffer"));
|
58
|
+
const meta = JSON.parse(await asDefined(zip.file(ProjectPaths.ProjectMetaFile)).async("text"));
|
59
|
+
const coverFile = zip.file(ProjectPaths.ProjectCoverFile);
|
60
|
+
const cover = isDefined(coverFile)
|
61
|
+
? Option.wrap(await coverFile.async("arraybuffer"))
|
62
|
+
: Option.None;
|
63
|
+
return new ProjectProfile(bundleUUID, project, meta, cover);
|
64
|
+
};
|
65
|
+
const pipeSampleLoaderInto = async (loader, zip) => {
|
66
|
+
const exec = async () => {
|
67
|
+
const path = `${SampleStorage.Folder}/${UUID.toString(loader.uuid)}`;
|
68
|
+
zip.file("audio.wav", await WorkerAgents.Opfs.read(`${path}/audio.wav`), { binary: true });
|
69
|
+
zip.file("peaks.bin", await WorkerAgents.Opfs.read(`${path}/peaks.bin`), { binary: true });
|
70
|
+
zip.file("meta.json", await WorkerAgents.Opfs.read(`${path}/meta.json`));
|
71
|
+
};
|
72
|
+
if (loader.state.type === "loaded") {
|
73
|
+
return exec();
|
74
|
+
}
|
75
|
+
else {
|
76
|
+
return new Promise((resolve, reject) => {
|
77
|
+
const subscription = loader.subscribe(state => {
|
78
|
+
if (state.type === "loaded") {
|
79
|
+
resolve();
|
80
|
+
subscription.terminate();
|
81
|
+
}
|
82
|
+
else if (state.type === "error") {
|
83
|
+
reject(state.reason);
|
84
|
+
subscription.terminate();
|
85
|
+
}
|
86
|
+
});
|
87
|
+
}).then(() => exec());
|
88
|
+
}
|
89
|
+
};
|
90
|
+
})(ProjectBundle || (ProjectBundle = {}));
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import { SampleManager } from "@opendaw/studio-adapters";
|
2
|
+
import { AudioWorklets } from "../AudioWorklets";
|
3
|
+
export interface ProjectEnv {
|
4
|
+
dialogs?: ProjectEnv.Dialogs;
|
5
|
+
audioContext: AudioContext;
|
6
|
+
audioWorklets: AudioWorklets;
|
7
|
+
sampleManager: SampleManager;
|
8
|
+
}
|
9
|
+
export declare namespace ProjectEnv {
|
10
|
+
interface Dialogs {
|
11
|
+
info(headline: string, message: string, okText: string): Promise<void>;
|
12
|
+
approve(headline: string, message: string, approveText: string, cancelText: string): Promise<boolean>;
|
13
|
+
}
|
14
|
+
}
|
15
|
+
//# sourceMappingURL=ProjectEnv.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ProjectEnv.d.ts","sourceRoot":"","sources":["../../src/project/ProjectEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAE9C,MAAM,WAAW,UAAU;IACvB,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,CAAA;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;CAC/B;AAED,yBAAiB,UAAU,CAAC;IACxB,UAAiB,OAAO;QACpB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACtE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACxG;CACJ"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import { JSONValue } from "@opendaw/lib-std";
|
2
|
+
export type ProjectMeta = {
|
3
|
+
name: string;
|
4
|
+
description: string;
|
5
|
+
tags: Array<string>;
|
6
|
+
created: Readonly<string>;
|
7
|
+
modified: string;
|
8
|
+
notepad?: string;
|
9
|
+
} & JSONValue;
|
10
|
+
export declare namespace ProjectMeta {
|
11
|
+
const init: (name?: string) => ProjectMeta;
|
12
|
+
const copy: (meta: ProjectMeta) => ProjectMeta;
|
13
|
+
}
|
14
|
+
//# sourceMappingURL=ProjectMeta.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ProjectMeta.d.ts","sourceRoot":"","sources":["../../src/project/ProjectMeta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAE1C,MAAM,MAAM,WAAW,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,SAAS,CAAA;AAEb,yBAAiB,WAAW,CAAC;IAElB,MAAM,IAAI,GAAI,OAAM,MAAmB,KAAG,WAM/C,CAAA;IAEK,MAAM,IAAI,GAAI,MAAM,WAAW,KAAG,WAAsC,CAAA;CAClF"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
export var ProjectMeta;
|
2
|
+
(function (ProjectMeta) {
|
3
|
+
const created = new Date().toISOString();
|
4
|
+
ProjectMeta.init = (name = "Untitled") => ({
|
5
|
+
name,
|
6
|
+
description: "",
|
7
|
+
tags: [],
|
8
|
+
created,
|
9
|
+
modified: created
|
10
|
+
});
|
11
|
+
ProjectMeta.copy = (meta) => Object.assign({}, meta);
|
12
|
+
})(ProjectMeta || (ProjectMeta = {}));
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ProjectMigration.d.ts","sourceRoot":"","sources":["../../src/project/ProjectMigration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAcvD,qBAAa,gBAAgB;IACzB,MAAM,CAAC,OAAO,CAAC,EAAC,QAAQ,EAAE,cAAc,EAAC,EAAE,cAAc,CAAC,QAAQ,GAAG,IAAI;CAoE5E"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { UUID } from "@opendaw/lib-std";
|
2
|
+
export declare namespace ProjectPaths {
|
3
|
+
const Folder = "projects/v1";
|
4
|
+
const ProjectFile = "project.od";
|
5
|
+
const ProjectMetaFile = "meta.json";
|
6
|
+
const ProjectCoverFile = "image.bin";
|
7
|
+
const projectFile: (uuid: UUID.Format) => string;
|
8
|
+
const projectMeta: (uuid: UUID.Format) => string;
|
9
|
+
const projectCover: (uuid: UUID.Format) => string;
|
10
|
+
const projectFolder: (uuid: UUID.Format) => string;
|
11
|
+
}
|
12
|
+
//# sourceMappingURL=ProjectPaths.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ProjectPaths.d.ts","sourceRoot":"","sources":["../../src/project/ProjectPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAErC,yBAAiB,YAAY,CAAC;IACnB,MAAM,MAAM,gBAAgB,CAAA;IAC5B,MAAM,WAAW,eAAe,CAAA;IAChC,MAAM,eAAe,cAAc,CAAA;IACnC,MAAM,gBAAgB,cAAc,CAAA;IACpC,MAAM,WAAW,GAAI,MAAM,IAAI,CAAC,MAAM,KAAG,MAAmD,CAAA;IAC5F,MAAM,WAAW,GAAI,MAAM,IAAI,CAAC,MAAM,KAAG,MAAuD,CAAA;IAChG,MAAM,YAAY,GAAI,MAAM,IAAI,CAAC,MAAM,KAAG,MAAwD,CAAA;IAClG,MAAM,aAAa,GAAI,MAAM,IAAI,CAAC,MAAM,KAAG,MAA4C,CAAA;CACjG"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { UUID } from "@opendaw/lib-std";
|
2
|
+
export var ProjectPaths;
|
3
|
+
(function (ProjectPaths) {
|
4
|
+
ProjectPaths.Folder = "projects/v1";
|
5
|
+
ProjectPaths.ProjectFile = "project.od";
|
6
|
+
ProjectPaths.ProjectMetaFile = "meta.json";
|
7
|
+
ProjectPaths.ProjectCoverFile = "image.bin";
|
8
|
+
ProjectPaths.projectFile = (uuid) => `${(ProjectPaths.projectFolder(uuid))}/${ProjectPaths.ProjectFile}`;
|
9
|
+
ProjectPaths.projectMeta = (uuid) => `${(ProjectPaths.projectFolder(uuid))}/${ProjectPaths.ProjectMetaFile}`;
|
10
|
+
ProjectPaths.projectCover = (uuid) => `${(ProjectPaths.projectFolder(uuid))}/${ProjectPaths.ProjectCoverFile}`;
|
11
|
+
ProjectPaths.projectFolder = (uuid) => `${ProjectPaths.Folder}/${UUID.toString(uuid)}`;
|
12
|
+
})(ProjectPaths || (ProjectPaths = {}));
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import { Observer, Option, Subscription, UUID } from "@opendaw/lib-std";
|
2
|
+
import { ProjectMeta } from "./ProjectMeta";
|
3
|
+
import { Project } from "./Project";
|
4
|
+
export declare class ProjectProfile {
|
5
|
+
#private;
|
6
|
+
constructor(uuid: UUID.Format, project: Project, meta: ProjectMeta, cover: Option<ArrayBuffer>, hasBeenSaved?: boolean);
|
7
|
+
get uuid(): UUID.Format;
|
8
|
+
get project(): Project;
|
9
|
+
get meta(): ProjectMeta;
|
10
|
+
get cover(): Option<ArrayBuffer>;
|
11
|
+
save(): Promise<void>;
|
12
|
+
saveAs(meta: ProjectMeta): Promise<Option<ProjectProfile>>;
|
13
|
+
saved(): boolean;
|
14
|
+
hasChanges(): boolean;
|
15
|
+
subscribeMetaData(observer: Observer<ProjectMeta>): Subscription;
|
16
|
+
updateCover(cover: Option<ArrayBuffer>): void;
|
17
|
+
updateMetaData<KEY extends keyof ProjectMeta>(key: KEY, value: ProjectMeta[KEY]): void;
|
18
|
+
updateModifyDate(): void;
|
19
|
+
toString(): string;
|
20
|
+
}
|
21
|
+
//# sourceMappingURL=ProjectProfile.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ProjectProfile.d.ts","sourceRoot":"","sources":["../../src/project/ProjectProfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAA;AACzC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAIjC,qBAAa,cAAc;;gBAYX,IAAI,EAAE,IAAI,CAAC,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAC1B,YAAY,GAAE,OAAe;IAUzC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAoB;IAC3C,IAAI,OAAO,IAAI,OAAO,CAAuB;IAC7C,IAAI,IAAI,IAAI,WAAW,CAAoB;IAC3C,IAAI,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC,CAAqB;IAE/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAqBhE,KAAK,IAAI,OAAO;IAChB,UAAU,IAAI,OAAO;IAErB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,YAAY;IAIhE,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI;IAK7C,cAAc,CAAC,GAAG,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI;IAOtF,gBAAgB,IAAI,IAAI;IAExB,QAAQ,IAAI,MAAM;CAcrB"}
|
@@ -0,0 +1,83 @@
|
|
1
|
+
import { EmptyExec, Notifier, Option, UUID } from "@opendaw/lib-std";
|
2
|
+
import { ProjectMeta } from "./ProjectMeta";
|
3
|
+
import { WorkerAgents } from "../WorkerAgents";
|
4
|
+
import { ProjectPaths } from "./ProjectPaths";
|
5
|
+
export class ProjectProfile {
|
6
|
+
#uuid;
|
7
|
+
#project;
|
8
|
+
#meta;
|
9
|
+
#cover;
|
10
|
+
#metaUpdated;
|
11
|
+
#saved;
|
12
|
+
#hasChanges = false;
|
13
|
+
constructor(uuid, project, meta, cover, hasBeenSaved = false) {
|
14
|
+
this.#uuid = uuid;
|
15
|
+
this.#project = project;
|
16
|
+
this.#meta = meta;
|
17
|
+
this.#cover = cover;
|
18
|
+
this.#saved = hasBeenSaved;
|
19
|
+
this.#metaUpdated = new Notifier();
|
20
|
+
}
|
21
|
+
get uuid() { return this.#uuid; }
|
22
|
+
get project() { return this.#project; }
|
23
|
+
get meta() { return this.#meta; }
|
24
|
+
get cover() { return this.#cover; }
|
25
|
+
async save() {
|
26
|
+
this.updateModifyDate();
|
27
|
+
return this.#saved
|
28
|
+
? ProjectProfile.#writeFiles(this).then(() => { this.#hasChanges = false; })
|
29
|
+
: Promise.reject("Project has not been saved");
|
30
|
+
}
|
31
|
+
async saveAs(meta) {
|
32
|
+
Object.assign(this.meta, meta);
|
33
|
+
this.updateModifyDate();
|
34
|
+
if (this.#saved) {
|
35
|
+
// Copy project
|
36
|
+
const uuid = UUID.generate();
|
37
|
+
const project = this.project.copy();
|
38
|
+
const meta = ProjectMeta.copy(this.meta);
|
39
|
+
const session = new ProjectProfile(uuid, project, meta, Option.None, true);
|
40
|
+
await ProjectProfile.#writeFiles(session);
|
41
|
+
return Option.wrap(session);
|
42
|
+
}
|
43
|
+
else {
|
44
|
+
return ProjectProfile.#writeFiles(this).then(() => {
|
45
|
+
this.#saved = true;
|
46
|
+
this.#hasChanges = false;
|
47
|
+
this.#metaUpdated.notify(this.meta);
|
48
|
+
return Option.None;
|
49
|
+
});
|
50
|
+
}
|
51
|
+
}
|
52
|
+
saved() { return this.#saved; }
|
53
|
+
hasChanges() { return this.#hasChanges; }
|
54
|
+
subscribeMetaData(observer) {
|
55
|
+
return this.#metaUpdated.subscribe(observer);
|
56
|
+
}
|
57
|
+
updateCover(cover) {
|
58
|
+
this.#cover = cover;
|
59
|
+
this.#hasChanges = true;
|
60
|
+
}
|
61
|
+
updateMetaData(key, value) {
|
62
|
+
if (this.meta[key] === value) {
|
63
|
+
return;
|
64
|
+
}
|
65
|
+
this.meta[key] = value;
|
66
|
+
this.#hasChanges = true;
|
67
|
+
this.#metaUpdated.notify(this.meta);
|
68
|
+
}
|
69
|
+
updateModifyDate() { this.meta.modified = new Date().toISOString(); }
|
70
|
+
toString() {
|
71
|
+
return `{uuid: ${UUID.toString(this.uuid)}, meta: ${JSON.stringify(this.meta)}}`;
|
72
|
+
}
|
73
|
+
static async #writeFiles({ uuid, project, meta, cover }) {
|
74
|
+
return Promise.all([
|
75
|
+
WorkerAgents.Opfs.write(ProjectPaths.projectFile(uuid), new Uint8Array(project.toArrayBuffer())),
|
76
|
+
WorkerAgents.Opfs.write(ProjectPaths.projectMeta(uuid), new TextEncoder().encode(JSON.stringify(meta))),
|
77
|
+
cover.match({
|
78
|
+
none: () => Promise.resolve(),
|
79
|
+
some: x => WorkerAgents.Opfs.write(ProjectPaths.projectCover(uuid), new Uint8Array(x))
|
80
|
+
})
|
81
|
+
]).then(EmptyExec);
|
82
|
+
}
|
83
|
+
}
|
@@ -1,7 +1,6 @@
|
|
1
1
|
import { Observer, Option, Subscription, UUID } from "@opendaw/lib-std";
|
2
2
|
import { Peaks } from "@opendaw/lib-fusion";
|
3
3
|
import { AudioData, SampleLoader, SampleLoaderState, SampleMetaData } from "@opendaw/studio-adapters";
|
4
|
-
import JSZip from "jszip";
|
5
4
|
import { MainThreadSampleManager } from "./MainThreadSampleManager";
|
6
5
|
export declare class MainThreadSampleLoader implements SampleLoader {
|
7
6
|
#private;
|
@@ -13,7 +12,6 @@ export declare class MainThreadSampleLoader implements SampleLoader {
|
|
13
12
|
get meta(): Option<SampleMetaData>;
|
14
13
|
get peaks(): Option<Peaks>;
|
15
14
|
get state(): SampleLoaderState;
|
16
|
-
pipeFilesInto(zip: JSZip): Promise<void>;
|
17
15
|
toString(): string;
|
18
16
|
}
|
19
17
|
//# sourceMappingURL=MainThreadSampleLoader.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"MainThreadSampleLoader.d.ts","sourceRoot":"","sources":["../../src/samples/MainThreadSampleLoader.ts"],"names":[],"mappings":"AAAA,OAAO,
|
1
|
+
{"version":3,"file":"MainThreadSampleLoader.d.ts","sourceRoot":"","sources":["../../src/samples/MainThreadSampleLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,QAAQ,EACR,MAAM,EAEN,YAAY,EAEZ,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,KAAK,EAAc,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAC,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAEnG,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAA;AAGjE,qBAAa,sBAAuB,YAAW,YAAY;;gBAY3C,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM;IAQ/D,UAAU,IAAI,IAAI;IASlB,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,YAAY;IAQ9D,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAoB;IAC3C,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,CAAoB;IACjD,IAAI,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,CAAoB;IACtD,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAqB;IAC/C,IAAI,KAAK,IAAI,iBAAiB,CAAqB;IAEnD,QAAQ,IAAI,MAAM;CAgErB"}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { ByteArrayInput, Notifier, Option, Progress, Terminable, UUID } from "@opendaw/lib-std";
|
2
|
-
import { SamplePeaks } from "@opendaw/lib-fusion";
|
3
2
|
import { Promises } from "@opendaw/lib-runtime";
|
3
|
+
import { SamplePeaks } from "@opendaw/lib-fusion";
|
4
4
|
import { WorkerAgents } from "../WorkerAgents";
|
5
5
|
import { SampleStorage } from "./SampleStorage";
|
6
6
|
export class MainThreadSampleLoader {
|
@@ -38,31 +38,6 @@ export class MainThreadSampleLoader {
|
|
38
38
|
get meta() { return this.#meta; }
|
39
39
|
get peaks() { return this.#peaks; }
|
40
40
|
get state() { return this.#state; }
|
41
|
-
async pipeFilesInto(zip) {
|
42
|
-
const exec = async () => {
|
43
|
-
const path = `${SampleStorage.Folder}/${UUID.toString(this.#uuid)}`;
|
44
|
-
zip.file("audio.wav", await WorkerAgents.Opfs.read(`${path}/audio.wav`), { binary: true });
|
45
|
-
zip.file("peaks.bin", await WorkerAgents.Opfs.read(`${path}/peaks.bin`), { binary: true });
|
46
|
-
zip.file("meta.json", await WorkerAgents.Opfs.read(`${path}/meta.json`));
|
47
|
-
};
|
48
|
-
if (this.#state.type === "loaded") {
|
49
|
-
return exec();
|
50
|
-
}
|
51
|
-
else {
|
52
|
-
return new Promise((resolve, reject) => {
|
53
|
-
const subscription = this.#notifier.subscribe((state) => {
|
54
|
-
if (state.type === "loaded") {
|
55
|
-
resolve();
|
56
|
-
subscription.terminate();
|
57
|
-
}
|
58
|
-
else if (state.type === "error") {
|
59
|
-
reject(state.reason);
|
60
|
-
subscription.terminate();
|
61
|
-
}
|
62
|
-
});
|
63
|
-
}).then(() => exec());
|
64
|
-
}
|
65
|
-
}
|
66
41
|
toString() { return `{MainThreadSampleLoader}`; }
|
67
42
|
#setState(value) {
|
68
43
|
this.#state = value;
|
@@ -6,6 +6,7 @@ export declare class MainThreadSampleManager implements SampleManager, SamplePro
|
|
6
6
|
constructor(api: SampleProvider, context: AudioContext);
|
7
7
|
get context(): AudioContext;
|
8
8
|
fetch(uuid: UUID.Format, progress: Progress.Handler): Promise<[AudioData, SampleMetaData]>;
|
9
|
+
remove(uuid: UUID.Format): void;
|
9
10
|
invalidate(uuid: UUID.Format): void;
|
10
11
|
record(loader: SampleLoader): void;
|
11
12
|
getOrCreate(uuid: UUID.Format): SampleLoader;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"MainThreadSampleManager.d.ts","sourceRoot":"","sources":["../../src/samples/MainThreadSampleManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAa,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAE/F,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAE/C,qBAAa,uBAAwB,YAAW,aAAa,EAAE,cAAc;;gBAK7D,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY;IAMtD,IAAI,OAAO,IAAI,YAAY,CAAuB;IAElD,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAI1F,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM;IAE5B,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAElC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,YAAY;CAG/C"}
|
1
|
+
{"version":3,"file":"MainThreadSampleManager.d.ts","sourceRoot":"","sources":["../../src/samples/MainThreadSampleManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAa,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAE/F,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAE/C,qBAAa,uBAAwB,YAAW,aAAa,EAAE,cAAc;;gBAK7D,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY;IAMtD,IAAI,OAAO,IAAI,YAAY,CAAuB;IAElD,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAI1F,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM;IACxB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM;IAE5B,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAElC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,YAAY;CAG/C"}
|
@@ -13,6 +13,7 @@ export class MainThreadSampleManager {
|
|
13
13
|
fetch(uuid, progress) {
|
14
14
|
return this.#api.fetch(uuid, progress);
|
15
15
|
}
|
16
|
+
remove(uuid) { this.#loaders.removeByKey(uuid); }
|
16
17
|
invalidate(uuid) { this.#loaders.opt(uuid).ifSome(loader => loader.invalidate()); }
|
17
18
|
record(loader) { this.#loaders.add(loader); }
|
18
19
|
getOrCreate(uuid) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Commit.d.ts","sourceRoot":"","sources":["../../src/sync-log/Commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,cAAc,EAAwB,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAC,OAAO,EAAC,MAAM,
|
1
|
+
{"version":3,"file":"Commit.d.ts","sourceRoot":"","sources":["../../src/sync-log/Commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,cAAc,EAAwB,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAE1C,0BAAkB,UAAU;IAAG,IAAI,IAAA;IAAE,IAAI,IAAA;IAAE,OAAO,IAAA;IAAE,UAAU,IAAA;CAAE;AAEhE,qBAAa,MAAM;;IAiDK,QAAQ,CAAC,IAAI,EAAE,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW;IAC9B,QAAQ,CAAC,QAAQ,EAAE,WAAW;IAC9B,QAAQ,CAAC,OAAO,EAAE,WAAW;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM;IApDzC,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAI;IAK3B,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAKrD,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;WAI5C,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAejG,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM;IAmBjD,OAAO;IAMP,SAAS,IAAI,WAAW;IAYxB,QAAQ,IAAI,MAAM;CAGrB"}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { int } from "@opendaw/lib-std";
|
2
|
-
import { Project } from "../Project";
|
2
|
+
import { Project } from "../project/Project";
|
3
3
|
import { Commit } from "./Commit";
|
4
|
-
import { ProjectEnv } from "../ProjectEnv";
|
4
|
+
import { ProjectEnv } from "../project/ProjectEnv";
|
5
5
|
export declare class SyncLogReader {
|
6
6
|
static unwrap(env: ProjectEnv, buffer: ArrayBuffer): Promise<{
|
7
7
|
project: Project;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SyncLogReader.d.ts","sourceRoot":"","sources":["../../src/sync-log/SyncLogReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,GAAG,EAAW,MAAM,kBAAkB,CAAA;AAG5E,OAAO,EAAC,OAAO,EAAC,MAAM,
|
1
|
+
{"version":3,"file":"SyncLogReader.d.ts","sourceRoot":"","sources":["../../src/sync-log/SyncLogReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,GAAG,EAAW,MAAM,kBAAkB,CAAA;AAG5E,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAC,MAAM,EAAa,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAA;AAEhD,qBAAa,aAAa;WACT,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;QAC/D,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,GAAG,CAAA;KAClB,CAAC;CA2CL"}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { assert, ByteArrayInput, Hash, tryCatch } from "@opendaw/lib-std";
|
2
2
|
import { Updates } from "@opendaw/lib-box";
|
3
3
|
import { Wait } from "@opendaw/lib-runtime";
|
4
|
-
import { Project } from "../Project";
|
4
|
+
import { Project } from "../project/Project";
|
5
5
|
import { Commit, CommitType } from "./Commit";
|
6
6
|
export class SyncLogReader {
|
7
7
|
static async unwrap(env, buffer) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SyncLogWriter.d.ts","sourceRoot":"","sources":["../../src/sync-log/SyncLogWriter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,QAAQ,EAAgB,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAEpF,OAAO,EAAC,OAAO,EAAC,MAAM,
|
1
|
+
{"version":3,"file":"SyncLogWriter.d.ts","sourceRoot":"","sources":["../../src/sync-log/SyncLogWriter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,QAAQ,EAAgB,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAEpF,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAE/B,qBAAa,aAAc,YAAW,UAAU;;IAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa;IAW/F,OAAO;IAWP,SAAS,IAAI,IAAI;CA6BpB"}
|