@opendaw/studio-core 0.0.26 → 0.0.28
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/AudioOfflineRenderer.d.ts.map +1 -1
- package/dist/AudioOfflineRenderer.js +7 -3
- package/dist/Engine.d.ts +4 -4
- package/dist/Engine.d.ts.map +1 -1
- package/dist/EngineFacade.d.ts +4 -4
- package/dist/EngineFacade.d.ts.map +1 -1
- package/dist/EngineWorklet.d.ts +4 -4
- package/dist/EngineWorklet.d.ts.map +1 -1
- package/dist/RecordingWorklet.d.ts +1 -1
- package/dist/RecordingWorklet.d.ts.map +1 -1
- package/dist/RecordingWorklet.js +1 -1
- package/dist/WavFile.d.ts +10 -0
- package/dist/WavFile.d.ts.map +1 -0
- package/dist/WavFile.js +94 -0
- package/dist/WorkerAgents.d.ts +1 -1
- package/dist/WorkerAgents.d.ts.map +1 -1
- package/dist/WorkerAgents.js +15 -3
- package/dist/capture/Capture.d.ts +1 -1
- package/dist/capture/Capture.d.ts.map +1 -1
- package/dist/capture/CaptureAudio.js +1 -1
- package/dist/capture/CaptureDevices.d.ts +1 -1
- package/dist/capture/CaptureDevices.d.ts.map +1 -1
- package/dist/capture/CaptureMidi.js +1 -1
- package/dist/clouds/CloudAuthManager.d.ts +10 -0
- package/dist/clouds/CloudAuthManager.d.ts.map +1 -0
- package/dist/clouds/CloudAuthManager.js +195 -0
- package/dist/clouds/CloudBackup.d.ts +8 -0
- package/dist/clouds/CloudBackup.d.ts.map +1 -0
- package/dist/clouds/CloudBackup.js +55 -0
- package/dist/clouds/CloudBackupProjects.d.ts +10 -0
- package/dist/clouds/CloudBackupProjects.d.ts.map +1 -0
- package/dist/clouds/CloudBackupProjects.js +167 -0
- package/dist/clouds/CloudBackupSamples.d.ts +13 -0
- package/dist/clouds/CloudBackupSamples.d.ts.map +1 -0
- package/dist/clouds/CloudBackupSamples.js +129 -0
- package/dist/clouds/CloudHandler.d.ts +9 -0
- package/dist/clouds/CloudHandler.d.ts.map +1 -0
- package/dist/clouds/CloudHandler.js +1 -0
- package/dist/clouds/CloudService.d.ts +2 -0
- package/dist/clouds/CloudService.d.ts.map +1 -0
- package/dist/clouds/CloudService.js +1 -0
- package/dist/clouds/DropboxHandler.d.ts +12 -0
- package/dist/clouds/DropboxHandler.d.ts.map +1 -0
- package/dist/clouds/DropboxHandler.js +83 -0
- package/dist/clouds/GoogleDriveHandler.d.ts +12 -0
- package/dist/clouds/GoogleDriveHandler.d.ts.map +1 -0
- package/dist/clouds/GoogleDriveHandler.js +256 -0
- package/dist/dawproject/DawProject.d.ts +2 -2
- package/dist/dawproject/DawProject.d.ts.map +1 -1
- package/dist/dawproject/DawProjectExporter.js +2 -2
- package/dist/dawproject/DawProjectImport.d.ts +1 -1
- package/dist/dawproject/DawProjectImport.d.ts.map +1 -1
- package/dist/dawproject/DeviceIO.d.ts +1 -1
- package/dist/dawproject/DeviceIO.d.ts.map +1 -1
- package/dist/dawproject/DeviceIO.js +2 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/processors.js +3 -3
- package/dist/processors.js.map +4 -4
- package/dist/project/Project.d.ts +1 -7
- package/dist/project/Project.d.ts.map +1 -1
- package/dist/project/Project.js +7 -12
- package/dist/project/ProjectApi.d.ts +9 -1
- package/dist/project/ProjectApi.d.ts.map +1 -1
- package/dist/project/ProjectApi.js +67 -3
- package/dist/project/ProjectBundle.d.ts +1 -1
- package/dist/project/ProjectBundle.d.ts.map +1 -1
- package/dist/project/ProjectBundle.js +1 -1
- package/dist/project/ProjectPaths.d.ts +4 -4
- package/dist/project/ProjectPaths.d.ts.map +1 -1
- package/dist/project/ProjectProfile.d.ts +2 -2
- package/dist/project/ProjectProfile.d.ts.map +1 -1
- package/dist/project/ProjectSignals.d.ts +6 -0
- package/dist/project/ProjectSignals.d.ts.map +1 -0
- package/dist/project/ProjectSignals.js +4 -0
- package/dist/project/ProjectStorage.d.ts +23 -0
- package/dist/project/ProjectStorage.d.ts.map +1 -0
- package/dist/project/ProjectStorage.js +59 -0
- package/dist/samples/MainThreadSampleLoader.d.ts +2 -2
- package/dist/samples/MainThreadSampleLoader.d.ts.map +1 -1
- package/dist/samples/MainThreadSampleLoader.js +2 -3
- package/dist/samples/MainThreadSampleManager.d.ts +4 -4
- package/dist/samples/MainThreadSampleManager.d.ts.map +1 -1
- package/dist/samples/OpenSampleAPI.d.ts +4 -2
- package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
- package/dist/samples/OpenSampleAPI.js +19 -2
- package/dist/samples/SampleAPI.d.ts +2 -2
- package/dist/samples/SampleAPI.d.ts.map +1 -1
- package/dist/samples/SampleImporter.d.ts +1 -1
- package/dist/samples/SampleImporter.d.ts.map +1 -1
- package/dist/samples/SampleProvider.d.ts +1 -1
- package/dist/samples/SampleProvider.d.ts.map +1 -1
- package/dist/samples/SampleStorage.d.ts +7 -5
- package/dist/samples/SampleStorage.d.ts.map +1 -1
- package/dist/samples/SampleStorage.js +31 -17
- package/dist/workers.js +2 -2
- package/dist/workers.js.map +4 -4
- package/package.json +14 -14
- package/dist/Wav.d.ts +0 -6
- package/dist/Wav.d.ts.map +0 -1
- package/dist/Wav.js +0 -46
@@ -0,0 +1,256 @@
|
|
1
|
+
import { assert, Errors, isDefined, Option, panic } from "@opendaw/lib-std";
|
2
|
+
const DRIVE_FILES_API = "https://www.googleapis.com/drive/v3/files";
|
3
|
+
const DRIVE_UPLOAD_API = "https://www.googleapis.com/upload/drive/v3/files";
|
4
|
+
const FOLDER_MIME = "application/vnd.google-apps.folder";
|
5
|
+
const ROOT_ID = "appDataFolder";
|
6
|
+
export class GoogleDriveHandler {
|
7
|
+
#accessToken;
|
8
|
+
#ensureFolderInProgress = false;
|
9
|
+
constructor(accessToken) { this.#accessToken = accessToken; }
|
10
|
+
async alive() {
|
11
|
+
const params = new URLSearchParams({
|
12
|
+
q: `'${ROOT_ID}' in parents and trashed = false`,
|
13
|
+
fields: "files(id)",
|
14
|
+
pageSize: "1",
|
15
|
+
spaces: "appDataFolder"
|
16
|
+
});
|
17
|
+
const res = await fetch(`${DRIVE_FILES_API}?${params.toString()}`, { headers: this.#authHeaders() });
|
18
|
+
if (!res.ok) {
|
19
|
+
const text = await res.text();
|
20
|
+
return panic(`Google Drive ping failed: ${res.status} ${text}`);
|
21
|
+
}
|
22
|
+
}
|
23
|
+
async upload(path, data) {
|
24
|
+
const { dir, base } = this.#splitPath(path);
|
25
|
+
const parentId = await this.#ensureFolderPath(dir);
|
26
|
+
const existing = await this.#findFileInFolder(base, parentId);
|
27
|
+
if (existing.nonEmpty()) {
|
28
|
+
const fileId = existing.unwrap().id;
|
29
|
+
const res = await fetch(`${DRIVE_UPLOAD_API}/${fileId}?uploadType=media`, {
|
30
|
+
method: "PATCH",
|
31
|
+
headers: {
|
32
|
+
Authorization: `Bearer ${this.#accessToken}`,
|
33
|
+
"Content-Type": "application/octet-stream"
|
34
|
+
},
|
35
|
+
body: data
|
36
|
+
});
|
37
|
+
if (!res.ok)
|
38
|
+
return panic(`Google Drive update failed: ${res.status} ${await res.text()}`);
|
39
|
+
}
|
40
|
+
else {
|
41
|
+
const meta = { name: base, parents: [parentId] };
|
42
|
+
const { boundary, body } = this.#buildMultipartBody(meta, data);
|
43
|
+
const res = await fetch(`${DRIVE_UPLOAD_API}?uploadType=multipart`, {
|
44
|
+
method: "POST",
|
45
|
+
headers: {
|
46
|
+
Authorization: `Bearer ${this.#accessToken}`,
|
47
|
+
"Content-Type": `multipart/related; boundary=${boundary}`
|
48
|
+
},
|
49
|
+
body
|
50
|
+
});
|
51
|
+
if (!res.ok)
|
52
|
+
return panic(`Google Drive upload failed: ${res.status} ${await res.text()}`);
|
53
|
+
}
|
54
|
+
}
|
55
|
+
async download(path) {
|
56
|
+
const fileId = await this.#resolveFileIdByPath(path);
|
57
|
+
if (fileId.isEmpty()) {
|
58
|
+
throw new Errors.FileNotFound(path);
|
59
|
+
}
|
60
|
+
const res = await fetch(`${DRIVE_FILES_API}/${fileId.unwrap()}?alt=media`, {
|
61
|
+
method: "GET",
|
62
|
+
headers: { "Authorization": `Bearer ${this.#accessToken}` }
|
63
|
+
});
|
64
|
+
if (!res.ok) {
|
65
|
+
if (res.status === 404)
|
66
|
+
throw new Errors.FileNotFound(path);
|
67
|
+
const text = await res.text();
|
68
|
+
return panic(`Google Drive download failed: ${res.status} ${text}`);
|
69
|
+
}
|
70
|
+
return await res.arrayBuffer();
|
71
|
+
}
|
72
|
+
async exists(path) {
|
73
|
+
const fileId = await this.#resolveFileIdByPath(path);
|
74
|
+
return fileId.nonEmpty();
|
75
|
+
}
|
76
|
+
async list(path) {
|
77
|
+
const folderId = await this.#resolveFolderId(path ?? "/");
|
78
|
+
if (folderId.isEmpty())
|
79
|
+
return [];
|
80
|
+
const q = `'${folderId.unwrap()}' in parents and trashed = false`;
|
81
|
+
const names = [];
|
82
|
+
let pageToken = undefined;
|
83
|
+
do {
|
84
|
+
const params = new URLSearchParams({
|
85
|
+
q,
|
86
|
+
fields: "files(id,name,mimeType),nextPageToken",
|
87
|
+
pageSize: "1000",
|
88
|
+
spaces: "appDataFolder"
|
89
|
+
});
|
90
|
+
if (pageToken)
|
91
|
+
params.set("pageToken", pageToken);
|
92
|
+
const res = await fetch(`${DRIVE_FILES_API}?${params.toString()}`, {
|
93
|
+
headers: { "Authorization": `Bearer ${this.#accessToken}` }
|
94
|
+
});
|
95
|
+
if (!res.ok) {
|
96
|
+
const text = await res.text();
|
97
|
+
return panic(`Google Drive list failed: ${res.status} ${text}`);
|
98
|
+
}
|
99
|
+
const json = await res.json();
|
100
|
+
json.files.forEach(f => names.push(f.name));
|
101
|
+
pageToken = json.nextPageToken;
|
102
|
+
} while (isDefined(pageToken));
|
103
|
+
return names;
|
104
|
+
}
|
105
|
+
async delete(path) {
|
106
|
+
const fileId = await this.#resolveFileIdByPath(path);
|
107
|
+
if (fileId.isEmpty()) {
|
108
|
+
// deleting a non-existent file should be a no-op
|
109
|
+
return;
|
110
|
+
}
|
111
|
+
const res = await fetch(`${DRIVE_FILES_API}/${fileId.unwrap()}`, {
|
112
|
+
method: "DELETE",
|
113
|
+
headers: { "Authorization": `Bearer ${this.#accessToken}` }
|
114
|
+
});
|
115
|
+
if (!res.ok && res.status !== 404) {
|
116
|
+
const text = await res.text();
|
117
|
+
return panic(`Google Drive delete failed: ${res.status} ${text}`);
|
118
|
+
}
|
119
|
+
}
|
120
|
+
// ---------- Helpers ----------
|
121
|
+
#authHeaders() {
|
122
|
+
return { "Authorization": `Bearer ${this.#accessToken}` };
|
123
|
+
}
|
124
|
+
#splitPath(path) {
|
125
|
+
const clean = path.replace(/^\/*/, ""); // remove leading slashes
|
126
|
+
const parts = clean.split("/").filter(p => p.length > 0);
|
127
|
+
if (parts.length === 0)
|
128
|
+
return { dir: [], base: "" };
|
129
|
+
const base = parts.pop();
|
130
|
+
return { dir: parts, base };
|
131
|
+
}
|
132
|
+
async #resolveFileIdByPath(path) {
|
133
|
+
const { dir, base } = this.#splitPath(path);
|
134
|
+
const parentId = await this.#resolveFolderPath(dir);
|
135
|
+
if (parentId.isEmpty() || base.length === 0)
|
136
|
+
return Option.None;
|
137
|
+
const existing = await this.#findFileInFolder(base, parentId.unwrap());
|
138
|
+
return existing.map(f => f.id);
|
139
|
+
}
|
140
|
+
async #resolveFolderId(path) {
|
141
|
+
if (path === "/" || path.trim() === "")
|
142
|
+
return Option.wrap(ROOT_ID);
|
143
|
+
const parts = path.replace(/^\/*/, "").split("/").filter(Boolean);
|
144
|
+
return this.#resolveFolderPath(parts);
|
145
|
+
}
|
146
|
+
// Resolve a folder path without creating anything
|
147
|
+
async #resolveFolderPath(parts) {
|
148
|
+
let currentId = ROOT_ID;
|
149
|
+
for (const part of parts) {
|
150
|
+
const next = await this.#findFolderInFolder(part, currentId);
|
151
|
+
if (next.isEmpty())
|
152
|
+
return Option.None;
|
153
|
+
currentId = next.unwrap().id;
|
154
|
+
}
|
155
|
+
return Option.wrap(currentId);
|
156
|
+
}
|
157
|
+
async #ensureFolderPath(parts) {
|
158
|
+
// We found a bug when writing multiple files at a yet non-existing folder at the same time.
|
159
|
+
// Some of them are still waiting for #ensureFolderPath to resolve.
|
160
|
+
// Unless somebody knows how to use Google Drive's API correctly, we are stuck with that 'solution'.
|
161
|
+
assert(!this.#ensureFolderInProgress, "Google Drive can get confused when multiple uploads are in progress");
|
162
|
+
this.#ensureFolderInProgress = true;
|
163
|
+
let currentId = ROOT_ID;
|
164
|
+
for (const part of parts) {
|
165
|
+
const found = await this.#findFolderInFolder(part, currentId);
|
166
|
+
if (found.nonEmpty()) {
|
167
|
+
currentId = found.unwrap().id;
|
168
|
+
continue;
|
169
|
+
}
|
170
|
+
const created = await this.#createFolder(part, currentId);
|
171
|
+
currentId = created.id;
|
172
|
+
}
|
173
|
+
this.#ensureFolderInProgress = false;
|
174
|
+
return currentId;
|
175
|
+
}
|
176
|
+
async #findFolderInFolder(name, parentId) {
|
177
|
+
const q = [
|
178
|
+
`name = '${name.replace(/'/g, "\\'")}'`,
|
179
|
+
`'${parentId}' in parents`,
|
180
|
+
`mimeType = '${FOLDER_MIME}'`,
|
181
|
+
`trashed = false`
|
182
|
+
].join(" and ");
|
183
|
+
const params = new URLSearchParams({
|
184
|
+
q,
|
185
|
+
fields: "files(id,name,mimeType)",
|
186
|
+
pageSize: "1",
|
187
|
+
spaces: "appDataFolder"
|
188
|
+
});
|
189
|
+
const res = await fetch(`${DRIVE_FILES_API}?${params.toString()}`, { headers: this.#authHeaders() });
|
190
|
+
if (!res.ok) {
|
191
|
+
const text = await res.text();
|
192
|
+
return panic(`Google Drive query failed: ${res.status} ${text}`);
|
193
|
+
}
|
194
|
+
const json = await res.json();
|
195
|
+
return Option.wrap(json.files[0]);
|
196
|
+
}
|
197
|
+
async #findFileInFolder(name, parentId) {
|
198
|
+
const q = [
|
199
|
+
`name = '${name.replace(/'/g, "\\'")}'`,
|
200
|
+
`'${parentId}' in parents`,
|
201
|
+
`mimeType != '${FOLDER_MIME}'`,
|
202
|
+
`trashed = false`
|
203
|
+
].join(" and ");
|
204
|
+
const params = new URLSearchParams({
|
205
|
+
q,
|
206
|
+
fields: "files(id,name,mimeType)",
|
207
|
+
pageSize: "1",
|
208
|
+
spaces: "appDataFolder"
|
209
|
+
});
|
210
|
+
const res = await fetch(`${DRIVE_FILES_API}?${params.toString()}`, { headers: this.#authHeaders() });
|
211
|
+
if (!res.ok) {
|
212
|
+
const text = await res.text();
|
213
|
+
return panic(`Google Drive query failed: ${res.status} ${text}`);
|
214
|
+
}
|
215
|
+
const json = await res.json();
|
216
|
+
return Option.wrap(json.files[0]);
|
217
|
+
}
|
218
|
+
async #createFolder(name, parentId) {
|
219
|
+
const metadata = {
|
220
|
+
name,
|
221
|
+
mimeType: FOLDER_MIME,
|
222
|
+
parents: [parentId]
|
223
|
+
};
|
224
|
+
const res = await fetch(DRIVE_FILES_API, {
|
225
|
+
method: "POST",
|
226
|
+
headers: {
|
227
|
+
...this.#authHeaders(),
|
228
|
+
"Content-Type": "application/json"
|
229
|
+
},
|
230
|
+
body: JSON.stringify(metadata)
|
231
|
+
});
|
232
|
+
if (!res.ok) {
|
233
|
+
const text = await res.text();
|
234
|
+
return panic(`Google Drive create folder failed: ${res.status} ${text}`);
|
235
|
+
}
|
236
|
+
return await res.json();
|
237
|
+
}
|
238
|
+
#buildMultipartBody(metadata, content) {
|
239
|
+
const boundary = `======opendaw_${Math.random().toString(36).slice(2)}`;
|
240
|
+
const delimiter = `--${boundary}`;
|
241
|
+
const close = `--${boundary}--`;
|
242
|
+
const metaHeader = `${delimiter}\r\n` +
|
243
|
+
"Content-Type: application/json; charset=UTF-8\r\n\r\n" +
|
244
|
+
`${JSON.stringify(metadata)}\r\n`;
|
245
|
+
const binHeader = `${delimiter}\r\n` +
|
246
|
+
"Content-Type: application/octet-stream\r\n\r\n";
|
247
|
+
// Use ArrayBuffer (content) as BlobPart directly to satisfy TS typings
|
248
|
+
const body = new Blob([
|
249
|
+
metaHeader,
|
250
|
+
binHeader,
|
251
|
+
content,
|
252
|
+
`\r\n${close}\r\n`
|
253
|
+
]);
|
254
|
+
return { boundary, body };
|
255
|
+
}
|
256
|
+
}
|
@@ -3,14 +3,14 @@ import { MetaDataSchema, ProjectSchema } from "@opendaw/lib-dawproject";
|
|
3
3
|
import { Project } from "../project/Project";
|
4
4
|
export declare namespace DawProject {
|
5
5
|
type Resource = {
|
6
|
-
uuid: UUID.
|
6
|
+
uuid: UUID.Bytes;
|
7
7
|
path: string;
|
8
8
|
name: string;
|
9
9
|
buffer: ArrayBuffer;
|
10
10
|
};
|
11
11
|
interface ResourceProvider {
|
12
12
|
fromPath(path: string): Resource;
|
13
|
-
fromUUID(uuid: UUID.
|
13
|
+
fromUUID(uuid: UUID.Bytes): Resource;
|
14
14
|
}
|
15
15
|
const decode: (buffer: ArrayBuffer | NonSharedBuffer) => Promise<{
|
16
16
|
metaData: MetaDataSchema;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DawProject.d.ts","sourceRoot":"","sources":["../../src/dawproject/DawProject.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAsB,cAAc,EAAE,aAAa,EAAC,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAG1C,yBAAiB,UAAU,CAAC;IACxB,KAAY,QAAQ,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC,
|
1
|
+
{"version":3,"file":"DawProject.d.ts","sourceRoot":"","sources":["../../src/dawproject/DawProject.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAsB,cAAc,EAAE,aAAa,EAAC,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAG1C,yBAAiB,UAAU,CAAC;IACxB,KAAY,QAAQ,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAAA;IAE5F,UAAiB,gBAAgB;QAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;QAChC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAA;KACvC;IAEM,MAAM,MAAM,GAAU,QAAQ,WAAW,GAAG,eAAe,KAAG,OAAO,CAAC;QACzE,QAAQ,EAAE,cAAc,CAAC;QACzB,OAAO,EAAE,aAAa,CAAC;QACvB,SAAS,EAAE,gBAAgB,CAAA;KAC9B,CAyBA,CAAA;IAEM,MAAM,MAAM,GAAU,SAAS,OAAO,EAAE,UAAU,cAAc,KAAG,OAAO,CAAC,WAAW,CAiB5F,CAAA;CACJ"}
|
@@ -8,9 +8,9 @@ import { AudioFileBox, AudioUnitBox, NoteEventBox, NoteEventCollectionBox, Track
|
|
8
8
|
import { AudioUnitExportLayout } from "./AudioUnitExportLayout";
|
9
9
|
import { ColorCodes } from "../ColorCodes";
|
10
10
|
import { Html } from "@opendaw/lib-dom";
|
11
|
-
import { encodeWavFloat } from "../Wav";
|
12
11
|
import { DeviceBoxUtils } from "@opendaw/studio-adapters";
|
13
12
|
import { DeviceIO } from "./DeviceIO";
|
13
|
+
import { WavFile } from "../WavFile";
|
14
14
|
export var DawProjectExporter;
|
15
15
|
(function (DawProjectExporter) {
|
16
16
|
DawProjectExporter.write = (project, resourcePacker) => {
|
@@ -21,7 +21,7 @@ export var DawProjectExporter;
|
|
21
21
|
.sort((a, b) => a.index.getValue() - b.index.getValue());
|
22
22
|
boxGraph.boxes().forEach(box => box.accept({
|
23
23
|
visitAudioFileBox: (box) => sampleManager.getOrCreate(box.address.uuid).data
|
24
|
-
.ifSome(({ frames, numberOfFrames, sampleRate, numberOfChannels }) => resourcePacker.write(`samples/${box.fileName.getValue()}.wav`,
|
24
|
+
.ifSome(({ frames, numberOfFrames, sampleRate, numberOfChannels }) => resourcePacker.write(`samples/${box.fileName.getValue()}.wav`, WavFile.encodeFloats({
|
25
25
|
channels: frames,
|
26
26
|
duration: numberOfFrames * sampleRate,
|
27
27
|
numberOfChannels,
|
@@ -4,7 +4,7 @@ import { ProjectDecoder } from "@opendaw/studio-adapters";
|
|
4
4
|
import { DawProject } from "./DawProject";
|
5
5
|
export declare namespace DawProjectImport {
|
6
6
|
type Result = {
|
7
|
-
audioIds: ReadonlyArray<UUID.
|
7
|
+
audioIds: ReadonlyArray<UUID.Bytes>;
|
8
8
|
skeleton: ProjectDecoder.Skeleton;
|
9
9
|
};
|
10
10
|
const read: (schema: ProjectSchema, resources: DawProject.ResourceProvider) => Promise<Result>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DawProjectImport.d.ts","sourceRoot":"","sources":["../../src/dawproject/DawProjectImport.ts"],"names":[],"mappings":"AAAA,OAAO,
|
1
|
+
{"version":3,"file":"DawProjectImport.d.ts","sourceRoot":"","sources":["../../src/dawproject/DawProjectImport.ts"],"names":[],"mappings":"AAAA,OAAO,EAiBH,IAAI,EAEP,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAcH,aAAa,EAOhB,MAAM,yBAAyB,CAAA;AAuBhC,OAAO,EAAyC,cAAc,EAAY,MAAM,0BAA0B,CAAA;AAC1G,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AAQvC,yBAAiB,gBAAgB,CAAC;IAW9B,KAAY,MAAM,GAAG;QACjB,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAA;KACpC,CAAA;IAOM,MAAM,IAAI,GAAU,QAAQ,aAAa,EAAE,WAAW,UAAU,CAAC,gBAAgB,KAAG,OAAO,CAAC,MAAM,CA6WxG,CAAA;CAaJ"}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { Box, BoxGraph } from "@opendaw/lib-box";
|
2
|
-
import { BoxIO } from "@opendaw/studio-boxes";
|
3
2
|
import { DeviceBox } from "@opendaw/studio-adapters";
|
3
|
+
import { BoxIO } from "@opendaw/studio-boxes";
|
4
4
|
export declare namespace DeviceIO {
|
5
5
|
const exportDevice: (box: Box) => ArrayBufferLike;
|
6
6
|
const importDevice: (boxGraph: BoxGraph<BoxIO.TypeMap>, buffer: ArrayBufferLike) => DeviceBox;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DeviceIO.d.ts","sourceRoot":"","sources":["../../src/dawproject/DeviceIO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,GAAG,EAAE,QAAQ,EAAe,MAAM,kBAAkB,CAAA;AAErE,OAAO,
|
1
|
+
{"version":3,"file":"DeviceIO.d.ts","sourceRoot":"","sources":["../../src/dawproject/DeviceIO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,GAAG,EAAE,QAAQ,EAAe,MAAM,kBAAkB,CAAA;AAErE,OAAO,EAAC,SAAS,EAAiB,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAe,KAAK,EAAC,MAAM,uBAAuB,CAAA;AAEzD,yBAAiB,QAAQ,CAAC;IACf,MAAM,YAAY,GAAI,KAAK,GAAG,KAAG,eAiBvC,CAAA;IAEM,MAAM,YAAY,GAAI,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,eAAe,KAAG,SAwCzF,CAAA;CACJ"}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { PointerField } from "@opendaw/lib-box";
|
2
2
|
import { assert, ByteArrayInput, ByteArrayOutput, panic, UUID } from "@opendaw/lib-std";
|
3
3
|
import { DeviceBoxUtils } from "@opendaw/studio-adapters";
|
4
|
+
import { AudioFileBox } from "@opendaw/studio-boxes";
|
4
5
|
export var DeviceIO;
|
5
6
|
(function (DeviceIO) {
|
6
7
|
DeviceIO.exportDevice = (box) => {
|
@@ -34,7 +35,7 @@ export var DeviceIO;
|
|
34
35
|
const length = input.readInt();
|
35
36
|
const array = new Int8Array(length);
|
36
37
|
input.readBytes(array);
|
37
|
-
mapping.add({ source: uuid, target: key ===
|
38
|
+
mapping.add({ source: uuid, target: key === AudioFileBox.ClassName ? uuid : UUID.generate() });
|
38
39
|
return { uuid, key, input: new ByteArrayInput(array.buffer) };
|
39
40
|
};
|
40
41
|
rawBoxes.push(readRawBox());
|
package/dist/index.d.ts
CHANGED
@@ -16,6 +16,8 @@ export * from "./project/ProjectEnv";
|
|
16
16
|
export * from "./project/ProjectMeta";
|
17
17
|
export * from "./project/ProjectPaths";
|
18
18
|
export * from "./project/ProjectProfile";
|
19
|
+
export * from "./project/ProjectSignals";
|
20
|
+
export * from "./project/ProjectStorage";
|
19
21
|
export * from "./samples/SampleStorage";
|
20
22
|
export * from "./samples/MainThreadSampleLoader";
|
21
23
|
export * from "./samples/MainThreadSampleManager";
|
@@ -26,6 +28,9 @@ export * from "./samples/SampleProvider";
|
|
26
28
|
export * from "./sync-log/Commit";
|
27
29
|
export * from "./sync-log/SyncLogReader";
|
28
30
|
export * from "./sync-log/SyncLogWriter";
|
31
|
+
export * from "./clouds/CloudAuthManager";
|
32
|
+
export * from "./clouds/CloudHandler";
|
33
|
+
export * from "./clouds/CloudBackup";
|
29
34
|
export * from "./AudioDevices";
|
30
35
|
export * from "./AudioOfflineRenderer";
|
31
36
|
export * from "./AudioUnitOrdering";
|
@@ -47,7 +52,7 @@ export * from "./MeterWorklet";
|
|
47
52
|
export * from "./Mixer";
|
48
53
|
export * from "./PeaksWriter";
|
49
54
|
export * from "./RenderQuantum";
|
50
|
-
export * from "./
|
55
|
+
export * from "./WavFile";
|
51
56
|
export * from "./WorkerAgents";
|
52
57
|
export * from "./AudioWorklets";
|
53
58
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,+BAA+B,CAAA;AAE7C,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,0BAA0B,CAAA;AAExC,cAAc,yBAAyB,CAAA;AACvC,cAAc,kCAAkC,CAAA;AAChD,cAAc,mCAAmC,CAAA;AACjD,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AAExC,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AAExC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,+BAA+B,CAAA;AAE7C,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AAExC,cAAc,yBAAyB,CAAA;AACvC,cAAc,kCAAkC,CAAA;AAChD,cAAc,mCAAmC,CAAA;AACjD,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AAExC,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AAExC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA"}
|
package/dist/index.js
CHANGED
@@ -16,6 +16,8 @@ export * from "./project/ProjectEnv";
|
|
16
16
|
export * from "./project/ProjectMeta";
|
17
17
|
export * from "./project/ProjectPaths";
|
18
18
|
export * from "./project/ProjectProfile";
|
19
|
+
export * from "./project/ProjectSignals";
|
20
|
+
export * from "./project/ProjectStorage";
|
19
21
|
export * from "./samples/SampleStorage";
|
20
22
|
export * from "./samples/MainThreadSampleLoader";
|
21
23
|
export * from "./samples/MainThreadSampleManager";
|
@@ -26,6 +28,9 @@ export * from "./samples/SampleProvider";
|
|
26
28
|
export * from "./sync-log/Commit";
|
27
29
|
export * from "./sync-log/SyncLogReader";
|
28
30
|
export * from "./sync-log/SyncLogWriter";
|
31
|
+
export * from "./clouds/CloudAuthManager";
|
32
|
+
export * from "./clouds/CloudHandler";
|
33
|
+
export * from "./clouds/CloudBackup";
|
29
34
|
export * from "./AudioDevices";
|
30
35
|
export * from "./AudioOfflineRenderer";
|
31
36
|
export * from "./AudioUnitOrdering";
|
@@ -47,6 +52,6 @@ export * from "./MeterWorklet";
|
|
47
52
|
export * from "./Mixer";
|
48
53
|
export * from "./PeaksWriter";
|
49
54
|
export * from "./RenderQuantum";
|
50
|
-
export * from "./
|
55
|
+
export * from "./WavFile";
|
51
56
|
export * from "./WorkerAgents";
|
52
57
|
export * from "./AudioWorklets";
|