@opendaw/studio-core 0.0.22 → 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.
Files changed (104) hide show
  1. package/dist/AudioDevices.d.ts.map +1 -1
  2. package/dist/AudioDevices.js +1 -0
  3. package/dist/{Worklets.d.ts → AudioWorklets.d.ts} +6 -5
  4. package/dist/AudioWorklets.d.ts.map +1 -0
  5. package/dist/{Worklets.js → AudioWorklets.js} +3 -2
  6. package/dist/Colors.d.ts.map +1 -1
  7. package/dist/Colors.js +21 -13
  8. package/dist/EffectFactory.d.ts +1 -1
  9. package/dist/EffectFactory.d.ts.map +1 -1
  10. package/dist/Engine.d.ts +6 -16
  11. package/dist/Engine.d.ts.map +1 -1
  12. package/dist/EngineFacade.d.ts +10 -9
  13. package/dist/EngineFacade.d.ts.map +1 -1
  14. package/dist/EngineFacade.js +28 -25
  15. package/dist/EngineWorklet.d.ts +7 -7
  16. package/dist/EngineWorklet.d.ts.map +1 -1
  17. package/dist/EngineWorklet.js +8 -16
  18. package/dist/PeaksWriter.d.ts +19 -0
  19. package/dist/PeaksWriter.d.ts.map +1 -0
  20. package/dist/PeaksWriter.js +43 -0
  21. package/dist/RecordingWorklet.d.ts +4 -2
  22. package/dist/RecordingWorklet.d.ts.map +1 -1
  23. package/dist/RecordingWorklet.js +36 -62
  24. package/dist/capture/Capture.d.ts +5 -6
  25. package/dist/capture/Capture.d.ts.map +1 -1
  26. package/dist/capture/CaptureAudio.d.ts +4 -5
  27. package/dist/capture/CaptureAudio.d.ts.map +1 -1
  28. package/dist/capture/CaptureAudio.js +26 -14
  29. package/dist/capture/{CaptureManager.d.ts → CaptureDevices.d.ts} +4 -3
  30. package/dist/capture/CaptureDevices.d.ts.map +1 -0
  31. package/dist/capture/{CaptureManager.js → CaptureDevices.js} +10 -1
  32. package/dist/capture/CaptureMidi.d.ts +8 -6
  33. package/dist/capture/CaptureMidi.d.ts.map +1 -1
  34. package/dist/capture/CaptureMidi.js +67 -48
  35. package/dist/capture/RecordAudio.d.ts +2 -2
  36. package/dist/capture/RecordAudio.d.ts.map +1 -1
  37. package/dist/capture/RecordAudio.js +50 -36
  38. package/dist/capture/RecordMidi.d.ts +3 -2
  39. package/dist/capture/RecordMidi.d.ts.map +1 -1
  40. package/dist/capture/RecordMidi.js +19 -22
  41. package/dist/capture/Recording.d.ts +2 -2
  42. package/dist/capture/Recording.d.ts.map +1 -1
  43. package/dist/capture/Recording.js +10 -11
  44. package/dist/dawproject/DawProject.d.ts +1 -1
  45. package/dist/dawproject/DawProject.d.ts.map +1 -1
  46. package/dist/dawproject/DawProject.js +3 -2
  47. package/dist/dawproject/DawProjectExporter.d.ts +1 -1
  48. package/dist/dawproject/DawProjectExporter.d.ts.map +1 -1
  49. package/dist/dawproject/DawProjectExporter.test.js +6 -5
  50. package/dist/index.d.ts +10 -6
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +10 -6
  53. package/dist/processors.js +3 -3
  54. package/dist/processors.js.map +4 -4
  55. package/dist/{Project.d.ts → project/Project.d.ts} +8 -7
  56. package/dist/project/Project.d.ts.map +1 -0
  57. package/dist/{Project.js → project/Project.js} +14 -6
  58. package/dist/{ProjectApi.d.ts → project/ProjectApi.d.ts} +5 -5
  59. package/dist/project/ProjectApi.d.ts.map +1 -0
  60. package/dist/{ProjectApi.js → project/ProjectApi.js} +2 -2
  61. package/dist/project/ProjectBundle.d.ts +8 -0
  62. package/dist/project/ProjectBundle.d.ts.map +1 -0
  63. package/dist/project/ProjectBundle.js +90 -0
  64. package/dist/project/ProjectEnv.d.ts +15 -0
  65. package/dist/project/ProjectEnv.d.ts.map +1 -0
  66. package/dist/project/ProjectMeta.d.ts +14 -0
  67. package/dist/project/ProjectMeta.d.ts.map +1 -0
  68. package/dist/project/ProjectMeta.js +12 -0
  69. package/dist/project/ProjectMigration.d.ts.map +1 -0
  70. package/dist/project/ProjectPaths.d.ts +12 -0
  71. package/dist/project/ProjectPaths.d.ts.map +1 -0
  72. package/dist/project/ProjectPaths.js +12 -0
  73. package/dist/project/ProjectProfile.d.ts +21 -0
  74. package/dist/project/ProjectProfile.d.ts.map +1 -0
  75. package/dist/project/ProjectProfile.js +83 -0
  76. package/dist/samples/MainThreadSampleLoader.d.ts +0 -2
  77. package/dist/samples/MainThreadSampleLoader.d.ts.map +1 -1
  78. package/dist/samples/MainThreadSampleLoader.js +1 -26
  79. package/dist/samples/MainThreadSampleManager.d.ts +1 -0
  80. package/dist/samples/MainThreadSampleManager.d.ts.map +1 -1
  81. package/dist/samples/MainThreadSampleManager.js +1 -0
  82. package/dist/sync-log/Commit.d.ts +1 -1
  83. package/dist/sync-log/Commit.d.ts.map +1 -1
  84. package/dist/sync-log/SyncLogReader.d.ts +2 -2
  85. package/dist/sync-log/SyncLogReader.d.ts.map +1 -1
  86. package/dist/sync-log/SyncLogReader.js +1 -1
  87. package/dist/sync-log/SyncLogWriter.d.ts +1 -1
  88. package/dist/sync-log/SyncLogWriter.d.ts.map +1 -1
  89. package/dist/workers.js +2 -2
  90. package/dist/workers.js.map +3 -3
  91. package/package.json +14 -14
  92. package/dist/Project.d.ts.map +0 -1
  93. package/dist/ProjectApi.d.ts.map +0 -1
  94. package/dist/ProjectEnv.d.ts +0 -5
  95. package/dist/ProjectEnv.d.ts.map +0 -1
  96. package/dist/ProjectMigration.d.ts.map +0 -1
  97. package/dist/Worklets.d.ts.map +0 -1
  98. package/dist/capture/CaptureManager.d.ts.map +0 -1
  99. package/dist/capture/RecordingContext.d.ts +0 -10
  100. package/dist/capture/RecordingContext.d.ts.map +0 -1
  101. package/dist/capture/RecordingContext.js +0 -1
  102. /package/dist/{ProjectEnv.js → project/ProjectEnv.js} +0 -0
  103. /package/dist/{ProjectMigration.d.ts → project/ProjectMigration.d.ts} +0 -0
  104. /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 "./Mixer";
7
+ import { Mixer } from "../Mixer";
8
8
  import { ProjectApi } from "./ProjectApi";
9
- import { CaptureManager } from "./capture/CaptureManager";
10
- import { EngineFacade } from "./EngineFacade";
11
- import { EngineWorklet } from "./EngineWorklet";
12
- import { Worklets } from "./Worklets";
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 captureManager: CaptureManager;
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: Worklets, restart: RestartWorklet): EngineWorklet;
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":"AAAA,OAAO,EAIH,SAAS,EACT,UAAU,EACV,eAAe,EACf,UAAU,EAEb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAA;AAClD,OAAO,EACH,WAAW,EACX,YAAY,EACZ,KAAK,EAEL,OAAO,EACP,WAAW,EACX,gBAAgB,EACnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACH,WAAW,EACX,kBAAkB,EAClB,cAAc,EAGd,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,qBAAqB,CAAA;AAE7E,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AACvC,OAAO,EAAC,KAAK,EAAC,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAC,cAAc,EAAC,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAG9C,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC,aAAa,CAAC,CAAA;CAAE,CAAA;AAG3F,qBAAa,OAAQ,YAAW,kBAAkB,EAAE,UAAU,EAAE,eAAe;;IAC3E,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAuCpC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO;IAM/D,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,GAAG,OAAO;IAQ5E,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAE1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAA;IAC3C,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAA;IAClC,QAAQ,CAAC,eAAe,EAAE,YAAY,CAAA;IACtC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IAEjC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;IACxB,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAA;IACnC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAA;IAC/C,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAA;IACvD,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAA;IAC/C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,MAAM,eAAqB;IAEpC,OAAO;IA8BP,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa;IAoBlF,cAAc,CAAC,OAAO,GAAE,OAAc,GAAG,IAAI;IAM7C,GAAG,CAAC,CAAC,SAAS,UAAU,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC;IAC3C,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;IAC5D,KAAK,IAAI,UAAU;IAEnB,IAAI,GAAG,IAAI,UAAU,CAAmB;IACxC,IAAI,GAAG,IAAI,MAAM,CAAyC;IAC1D,IAAI,cAAc,IAAI,cAAc,CAAmE;IACvG,IAAI,kBAAkB,IAAI,kBAAkB,CAA2E;IACvH,IAAI,aAAa,IAAI,aAAa,CAAiC;IACnE,IAAI,cAAc,IAAI,cAAc,CAAkD;IACtF,IAAI,cAAc,IAAI,OAAO,CAAe;IAC5C,IAAI,YAAY,IAAI,OAAO,CAAc;IACzC,IAAI,qBAAqB,IAAI,qBAAqB,CAAkD;IAEpG,IAAI,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAWtC;IAED,aAAa,IAAI,eAAe;IAiBhC,IAAI,IAAI,OAAO;IAEf,SAAS,IAAI,IAAI;CACpB"}
@@ -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 "./Mixer";
7
+ import { Mixer } from "../Mixer";
8
8
  import { ProjectApi } from "./ProjectApi";
9
9
  import { ProjectMigration } from "./ProjectMigration";
10
- import { CaptureManager } from "./capture/CaptureManager";
11
- import { EngineFacade } from "./EngineFacade";
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
- captureManager;
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.setClient(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 "./InstrumentFactory";
9
- import { InstrumentProduct } from "./InstrumentProduct";
10
- import { InstrumentOptions } from "./InstrumentOptions";
11
- import { EffectFactory } from "./EffectFactory";
12
- import { EffectBox } from "./EffectBox";
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 "./ColorCodes";
8
- import { AudioUnitOrdering } from "./AudioUnitOrdering";
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,EAKH,QAAQ,EACR,MAAM,EAEN,YAAY,EAEZ,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,KAAK,EAAc,MAAM,qBAAqB,CAAA;AAEtD,OAAO,EAAC,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AACnG,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAA;AAIjE,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;IAE7C,aAAa,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB9C,QAAQ,IAAI,MAAM;CAgErB"}
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,6 +1,6 @@
1
1
  import { ByteArrayInput } from "@opendaw/lib-std";
2
2
  import { Update } from "@opendaw/lib-box";
3
- import { Project } from "../Project";
3
+ import { Project } from "../project/Project";
4
4
  export declare const enum CommitType {
5
5
  Init = 0,
6
6
  Open = 1,
@@ -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,YAAY,CAAA;AAElC,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
+ {"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,YAAY,CAAA;AAClC,OAAO,EAAC,MAAM,EAAa,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAA;AAExC,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
+ {"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,5 +1,5 @@
1
1
  import { Observer, Terminable } from "@opendaw/lib-std";
2
- import { Project } from "../Project";
2
+ import { Project } from "../project/Project";
3
3
  import { Commit } from "./Commit";
4
4
  export declare class SyncLogWriter implements Terminable {
5
5
  #private;
@@ -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,YAAY,CAAA;AAClC,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"}
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"}