omni-viewer-core 0.1.0
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/LICENSE +21 -0
- package/README.md +80 -0
- package/THIRD_PARTY_NOTICES.md +49 -0
- package/dist/assets/audio-engine/audio_engine.mjs +2 -0
- package/dist/assets/audio-engine/audio_engine.wasm +0 -0
- package/dist/assets/pdfjs/pdf.worker.min.mjs +21 -0
- package/dist/host/index.d.ts +133 -0
- package/dist/host/index.js +10 -0
- package/dist/i18n/catalog.en.d.ts +1 -0
- package/dist/i18n/catalog.en.js +411 -0
- package/dist/i18n/catalog.ko.d.ts +1 -0
- package/dist/i18n/catalog.ko.js +68 -0
- package/dist/i18n/index.d.ts +18 -0
- package/dist/i18n/index.js +41 -0
- package/dist/licenses/emscripten.txt +101 -0
- package/dist/licenses/kissfft.txt +28 -0
- package/dist/licenses/pdfjs-dist.txt +177 -0
- package/dist/parsers/a2l/index.d.ts +1 -0
- package/dist/parsers/a2l/index.js +1 -0
- package/dist/parsers/archive/index.d.ts +22 -0
- package/dist/parsers/archive/index.js +46 -0
- package/dist/parsers/archive/model.d.ts +29 -0
- package/dist/parsers/archive/model.js +1 -0
- package/dist/parsers/archive/worker.d.ts +21 -0
- package/dist/parsers/archive/worker.js +1 -0
- package/dist/parsers/arxml/index.d.ts +1 -0
- package/dist/parsers/arxml/index.js +1 -0
- package/dist/parsers/asc/index.d.ts +1 -0
- package/dist/parsers/asc/index.js +1 -0
- package/dist/parsers/audio/index.d.ts +9 -0
- package/dist/parsers/audio/index.js +46 -0
- package/dist/parsers/automotive/index.d.ts +33 -0
- package/dist/parsers/automotive/index.js +973 -0
- package/dist/parsers/blf/index.d.ts +1 -0
- package/dist/parsers/blf/index.js +1 -0
- package/dist/parsers/csv/delimiter.d.ts +31 -0
- package/dist/parsers/csv/delimiter.js +151 -0
- package/dist/parsers/csv/index.d.ts +30 -0
- package/dist/parsers/csv/index.js +108 -0
- package/dist/parsers/csv/parseText.d.ts +20 -0
- package/dist/parsers/csv/parseText.js +108 -0
- package/dist/parsers/csv/sort.d.ts +26 -0
- package/dist/parsers/csv/sort.js +224 -0
- package/dist/parsers/csv/statistics.d.ts +49 -0
- package/dist/parsers/csv/statistics.js +150 -0
- package/dist/parsers/dbc/index.d.ts +56 -0
- package/dist/parsers/dbc/index.js +94 -0
- package/dist/parsers/doc-binary/index.d.ts +35 -0
- package/dist/parsers/doc-binary/index.js +267 -0
- package/dist/parsers/doc-binary/vscode-parser.d.ts +142 -0
- package/dist/parsers/doc-binary/vscode-parser.js +3747 -0
- package/dist/parsers/excel/index.d.ts +17 -0
- package/dist/parsers/excel/index.js +406 -0
- package/dist/parsers/excel/model.d.ts +80 -0
- package/dist/parsers/excel/model.js +48 -0
- package/dist/parsers/excel/serialize.d.ts +3 -0
- package/dist/parsers/excel/serialize.js +78 -0
- package/dist/parsers/hdf5/index.d.ts +75 -0
- package/dist/parsers/hdf5/index.js +658 -0
- package/dist/parsers/hdf5/node.d.ts +21 -0
- package/dist/parsers/hdf5/node.js +95 -0
- package/dist/parsers/json/index.d.ts +15 -0
- package/dist/parsers/json/index.js +102 -0
- package/dist/parsers/json/model.d.ts +42 -0
- package/dist/parsers/json/model.js +140 -0
- package/dist/parsers/json/parse.d.ts +22 -0
- package/dist/parsers/json/parse.js +279 -0
- package/dist/parsers/json/tokenizer.d.ts +17 -0
- package/dist/parsers/json/tokenizer.js +175 -0
- package/dist/parsers/jsonl/index.d.ts +14 -0
- package/dist/parsers/jsonl/index.js +18 -0
- package/dist/parsers/jsonl/model.d.ts +23 -0
- package/dist/parsers/jsonl/model.js +1 -0
- package/dist/parsers/jsonl/parse.d.ts +7 -0
- package/dist/parsers/jsonl/parse.js +34 -0
- package/dist/parsers/markdown/index.d.ts +37 -0
- package/dist/parsers/markdown/index.js +59 -0
- package/dist/parsers/mat/index.d.ts +31 -0
- package/dist/parsers/mat/index.js +426 -0
- package/dist/parsers/mermaid/index.d.ts +5 -0
- package/dist/parsers/mermaid/index.js +3 -0
- package/dist/parsers/mf4/index.d.ts +1 -0
- package/dist/parsers/mf4/index.js +1 -0
- package/dist/parsers/parquet/index.d.ts +21 -0
- package/dist/parsers/parquet/index.js +68 -0
- package/dist/parsers/pcap/index.d.ts +1 -0
- package/dist/parsers/pcap/index.js +1 -0
- package/dist/parsers/pcapng/index.d.ts +1 -0
- package/dist/parsers/pcapng/index.js +1 -0
- package/dist/parsers/plantuml/index.d.ts +5 -0
- package/dist/parsers/plantuml/index.js +4 -0
- package/dist/parsers/ppt-binary/index.d.ts +5 -0
- package/dist/parsers/ppt-binary/index.js +62 -0
- package/dist/parsers/ppt-binary/pptBinaryBuildContext.d.ts +12 -0
- package/dist/parsers/ppt-binary/pptBinaryBuildContext.js +40 -0
- package/dist/parsers/ppt-binary/pptBinaryContainer.d.ts +4 -0
- package/dist/parsers/ppt-binary/pptBinaryContainer.js +174 -0
- package/dist/parsers/ppt-binary/pptBinaryTypes.d.ts +125 -0
- package/dist/parsers/ppt-binary/pptBinaryTypes.js +1 -0
- package/dist/parsers/ppt-binary/pptSlideLayouts.d.ts +9 -0
- package/dist/parsers/ppt-binary/pptSlideLayouts.js +510 -0
- package/dist/parsers/ppt-binary/vscode-parser.d.ts +116 -0
- package/dist/parsers/ppt-binary/vscode-parser.js +2853 -0
- package/dist/parsers/ppt-binary/vscode.d.ts +4 -0
- package/dist/parsers/ppt-binary/vscode.js +12 -0
- package/dist/parsers/pptx/index.d.ts +15 -0
- package/dist/parsers/pptx/index.js +88 -0
- package/dist/parsers/pptx/vscode-parser.d.ts +167 -0
- package/dist/parsers/pptx/vscode-parser.js +1503 -0
- package/dist/parsers/pptx/vscode.d.ts +4 -0
- package/dist/parsers/pptx/vscode.js +18 -0
- package/dist/parsers/pptx/zip-reader.d.ts +3 -0
- package/dist/parsers/pptx/zip-reader.js +20 -0
- package/dist/parsers/proto/index.d.ts +90 -0
- package/dist/parsers/proto/index.js +197 -0
- package/dist/parsers/psd/index.d.ts +16 -0
- package/dist/parsers/psd/index.js +10 -0
- package/dist/parsers/shapefile/dbf.d.ts +23 -0
- package/dist/parsers/shapefile/dbf.js +112 -0
- package/dist/parsers/shapefile/index.d.ts +44 -0
- package/dist/parsers/shapefile/index.js +119 -0
- package/dist/parsers/shapefile/reproject.d.ts +10 -0
- package/dist/parsers/shapefile/reproject.js +41 -0
- package/dist/parsers/slide-model.d.ts +106 -0
- package/dist/parsers/slide-model.js +1 -0
- package/dist/parsers/toml/index.d.ts +15 -0
- package/dist/parsers/toml/index.js +18 -0
- package/dist/parsers/toml/model.d.ts +15 -0
- package/dist/parsers/toml/model.js +1 -0
- package/dist/parsers/toml/parse.d.ts +16 -0
- package/dist/parsers/toml/parse.js +266 -0
- package/dist/parsers/types.d.ts +103 -0
- package/dist/parsers/types.js +106 -0
- package/dist/parsers/video/index.d.ts +6 -0
- package/dist/parsers/video/index.js +2 -0
- package/dist/parsers/yaml/index.d.ts +16 -0
- package/dist/parsers/yaml/index.js +58 -0
- package/dist/parsers/yaml/model.d.ts +22 -0
- package/dist/parsers/yaml/model.js +1 -0
- package/dist/parsers/yaml/self-loading.d.ts +3 -0
- package/dist/parsers/yaml/self-loading.js +19 -0
- package/dist/parsers/zip-scan.d.ts +8 -0
- package/dist/parsers/zip-scan.js +80 -0
- package/dist/registry/container.d.ts +17 -0
- package/dist/registry/container.js +49 -0
- package/dist/registry/index.d.ts +133 -0
- package/dist/registry/index.js +348 -0
- package/dist/registry/probe.d.ts +3 -0
- package/dist/registry/probe.js +177 -0
- package/dist/registry/sniff.d.ts +17 -0
- package/dist/registry/sniff.js +57 -0
- package/dist/styles/archive.css +10 -0
- package/dist/styles/audio.css +66 -0
- package/dist/styles/automotive.css +1 -0
- package/dist/styles/csv.css +262 -0
- package/dist/styles/excel.css +212 -0
- package/dist/styles/fallback.css +48 -0
- package/dist/styles/hdf5.css +3 -0
- package/dist/styles/hwp.css +12 -0
- package/dist/styles/image.css +115 -0
- package/dist/styles/json.css +342 -0
- package/dist/styles/jsonl.css +1 -0
- package/dist/styles/markdown.css +10 -0
- package/dist/styles/mat.css +2 -0
- package/dist/styles/mermaid.css +1 -0
- package/dist/styles/parquet.css +2 -0
- package/dist/styles/pdf.css +551 -0
- package/dist/styles/plantuml.css +1 -0
- package/dist/styles/ppt.css +1 -0
- package/dist/styles/proto.css +2 -0
- package/dist/styles/psd.css +1 -0
- package/dist/styles/shapefile.css +25 -0
- package/dist/styles/toml.css +1 -0
- package/dist/styles/video.css +74 -0
- package/dist/styles/word.css +685 -0
- package/dist/styles/yaml.css +1 -0
- package/dist/viewers/a2l/index.d.ts +15 -0
- package/dist/viewers/a2l/index.js +5 -0
- package/dist/viewers/archive/archive-preview-decoder.d.ts +4 -0
- package/dist/viewers/archive/archive-preview-decoder.js +223 -0
- package/dist/viewers/archive/controller.d.ts +24 -0
- package/dist/viewers/archive/controller.js +18 -0
- package/dist/viewers/archive/index.d.ts +25 -0
- package/dist/viewers/archive/index.js +230 -0
- package/dist/viewers/archive/preview.d.ts +2 -0
- package/dist/viewers/archive/preview.js +2 -0
- package/dist/viewers/archive/styles.d.ts +1 -0
- package/dist/viewers/archive/styles.js +11 -0
- package/dist/viewers/arxml/index.d.ts +15 -0
- package/dist/viewers/arxml/index.js +5 -0
- package/dist/viewers/asc/index.d.ts +15 -0
- package/dist/viewers/asc/index.js +5 -0
- package/dist/viewers/audio/controller.d.ts +33 -0
- package/dist/viewers/audio/controller.js +49 -0
- package/dist/viewers/audio/engine.d.ts +44 -0
- package/dist/viewers/audio/engine.js +108 -0
- package/dist/viewers/audio/index.d.ts +92 -0
- package/dist/viewers/audio/index.js +448 -0
- package/dist/viewers/audio/self-loading.d.ts +7 -0
- package/dist/viewers/audio/self-loading.js +42 -0
- package/dist/viewers/audio/styles.d.ts +1 -0
- package/dist/viewers/audio/styles.js +73 -0
- package/dist/viewers/automotive/index.d.ts +8 -0
- package/dist/viewers/automotive/index.js +152 -0
- package/dist/viewers/automotive/styles.d.ts +1 -0
- package/dist/viewers/automotive/styles.js +1 -0
- package/dist/viewers/avro/index.d.ts +15 -0
- package/dist/viewers/avro/index.js +5 -0
- package/dist/viewers/bag/index.d.ts +15 -0
- package/dist/viewers/bag/index.js +5 -0
- package/dist/viewers/blf/index.d.ts +15 -0
- package/dist/viewers/blf/index.js +5 -0
- package/dist/viewers/csv/controller.d.ts +126 -0
- package/dist/viewers/csv/controller.js +598 -0
- package/dist/viewers/csv/index.d.ts +48 -0
- package/dist/viewers/csv/index.js +846 -0
- package/dist/viewers/csv/styles.d.ts +1 -0
- package/dist/viewers/csv/styles.js +267 -0
- package/dist/viewers/db3/index.d.ts +15 -0
- package/dist/viewers/db3/index.js +5 -0
- package/dist/viewers/dbc/index.d.ts +15 -0
- package/dist/viewers/dbc/index.js +5 -0
- package/dist/viewers/diagram.d.ts +14 -0
- package/dist/viewers/diagram.js +95 -0
- package/dist/viewers/excel/controller.d.ts +108 -0
- package/dist/viewers/excel/controller.js +548 -0
- package/dist/viewers/excel/grid.d.ts +28 -0
- package/dist/viewers/excel/grid.js +99 -0
- package/dist/viewers/excel/index.d.ts +37 -0
- package/dist/viewers/excel/index.js +620 -0
- package/dist/viewers/excel/self-loading.d.ts +6 -0
- package/dist/viewers/excel/self-loading.js +13 -0
- package/dist/viewers/excel/styles.d.ts +1 -0
- package/dist/viewers/excel/styles.js +216 -0
- package/dist/viewers/fallback/index.d.ts +17 -0
- package/dist/viewers/fallback/index.js +130 -0
- package/dist/viewers/fallback/styles.d.ts +1 -0
- package/dist/viewers/fallback/styles.js +49 -0
- package/dist/viewers/hdf5/index.d.ts +19 -0
- package/dist/viewers/hdf5/index.js +170 -0
- package/dist/viewers/hdf5/styles.d.ts +1 -0
- package/dist/viewers/hdf5/styles.js +4 -0
- package/dist/viewers/hwp/controller.d.ts +19 -0
- package/dist/viewers/hwp/controller.js +22 -0
- package/dist/viewers/hwp/index.d.ts +39 -0
- package/dist/viewers/hwp/index.js +271 -0
- package/dist/viewers/hwp/self-loading.d.ts +2 -0
- package/dist/viewers/hwp/self-loading.js +6 -0
- package/dist/viewers/hwp/styles.d.ts +1 -0
- package/dist/viewers/hwp/styles.js +13 -0
- package/dist/viewers/image/controller.d.ts +210 -0
- package/dist/viewers/image/controller.js +336 -0
- package/dist/viewers/image/decode.d.ts +54 -0
- package/dist/viewers/image/decode.js +150 -0
- package/dist/viewers/image/index.d.ts +38 -0
- package/dist/viewers/image/index.js +749 -0
- package/dist/viewers/image/limits.d.ts +18 -0
- package/dist/viewers/image/limits.js +20 -0
- package/dist/viewers/image/styles.d.ts +1 -0
- package/dist/viewers/image/styles.js +119 -0
- package/dist/viewers/json/controller.d.ts +89 -0
- package/dist/viewers/json/controller.js +411 -0
- package/dist/viewers/json/index.d.ts +25 -0
- package/dist/viewers/json/index.js +503 -0
- package/dist/viewers/json/styles.d.ts +1 -0
- package/dist/viewers/json/styles.js +346 -0
- package/dist/viewers/json/transforms.d.ts +27 -0
- package/dist/viewers/json/transforms.js +253 -0
- package/dist/viewers/jsonl/controller.d.ts +48 -0
- package/dist/viewers/jsonl/controller.js +136 -0
- package/dist/viewers/jsonl/index.d.ts +22 -0
- package/dist/viewers/jsonl/index.js +184 -0
- package/dist/viewers/jsonl/styles.d.ts +1 -0
- package/dist/viewers/jsonl/styles.js +1 -0
- package/dist/viewers/markdown/controller.d.ts +50 -0
- package/dist/viewers/markdown/controller.js +62 -0
- package/dist/viewers/markdown/index.d.ts +64 -0
- package/dist/viewers/markdown/index.js +425 -0
- package/dist/viewers/markdown/math.d.ts +21 -0
- package/dist/viewers/markdown/math.js +100 -0
- package/dist/viewers/markdown/self-loading.d.ts +5 -0
- package/dist/viewers/markdown/self-loading.js +48 -0
- package/dist/viewers/markdown/styles.d.ts +1 -0
- package/dist/viewers/markdown/styles.js +11 -0
- package/dist/viewers/mat/index.d.ts +19 -0
- package/dist/viewers/mat/index.js +113 -0
- package/dist/viewers/mat/styles.d.ts +1 -0
- package/dist/viewers/mat/styles.js +3 -0
- package/dist/viewers/media.d.ts +9 -0
- package/dist/viewers/media.js +77 -0
- package/dist/viewers/mermaid/index.d.ts +17 -0
- package/dist/viewers/mermaid/index.js +6 -0
- package/dist/viewers/mermaid/self-loading.d.ts +2 -0
- package/dist/viewers/mermaid/self-loading.js +2 -0
- package/dist/viewers/mf4/index.d.ts +15 -0
- package/dist/viewers/mf4/index.js +5 -0
- package/dist/viewers/parquet/controller.d.ts +37 -0
- package/dist/viewers/parquet/controller.js +26 -0
- package/dist/viewers/parquet/index.d.ts +23 -0
- package/dist/viewers/parquet/index.js +134 -0
- package/dist/viewers/parquet/styles.d.ts +1 -0
- package/dist/viewers/parquet/styles.js +3 -0
- package/dist/viewers/pcap/index.d.ts +15 -0
- package/dist/viewers/pcap/index.js +5 -0
- package/dist/viewers/pcapng/index.d.ts +15 -0
- package/dist/viewers/pcapng/index.js +5 -0
- package/dist/viewers/pdf/controller.d.ts +120 -0
- package/dist/viewers/pdf/controller.js +191 -0
- package/dist/viewers/pdf/editing.d.ts +26 -0
- package/dist/viewers/pdf/editing.js +265 -0
- package/dist/viewers/pdf/index.d.ts +88 -0
- package/dist/viewers/pdf/index.js +1400 -0
- package/dist/viewers/pdf/self-loading.d.ts +6 -0
- package/dist/viewers/pdf/self-loading.js +14 -0
- package/dist/viewers/pdf/styles.d.ts +1 -0
- package/dist/viewers/pdf/styles.js +555 -0
- package/dist/viewers/plantuml/index.d.ts +17 -0
- package/dist/viewers/plantuml/index.js +6 -0
- package/dist/viewers/plantuml/self-loading.d.ts +2 -0
- package/dist/viewers/plantuml/self-loading.js +2 -0
- package/dist/viewers/ppt/chart.d.ts +8 -0
- package/dist/viewers/ppt/chart.js +83 -0
- package/dist/viewers/ppt/controller.d.ts +34 -0
- package/dist/viewers/ppt/controller.js +27 -0
- package/dist/viewers/ppt/index.d.ts +33 -0
- package/dist/viewers/ppt/index.js +101 -0
- package/dist/viewers/ppt/render.d.ts +5 -0
- package/dist/viewers/ppt/render.js +144 -0
- package/dist/viewers/ppt/self-loading.d.ts +9 -0
- package/dist/viewers/ppt/self-loading.js +4 -0
- package/dist/viewers/ppt/styles.d.ts +1 -0
- package/dist/viewers/ppt/styles.js +1 -0
- package/dist/viewers/proto/index.d.ts +17 -0
- package/dist/viewers/proto/index.js +170 -0
- package/dist/viewers/proto/styles.d.ts +1 -0
- package/dist/viewers/proto/styles.js +2 -0
- package/dist/viewers/psd/index.d.ts +27 -0
- package/dist/viewers/psd/index.js +39 -0
- package/dist/viewers/psd/self-loading.d.ts +10 -0
- package/dist/viewers/psd/self-loading.js +20 -0
- package/dist/viewers/psd/styles.d.ts +1 -0
- package/dist/viewers/psd/styles.js +1 -0
- package/dist/viewers/reqif/index.d.ts +15 -0
- package/dist/viewers/reqif/index.js +5 -0
- package/dist/viewers/shapefile/index.d.ts +35 -0
- package/dist/viewers/shapefile/index.js +336 -0
- package/dist/viewers/shapefile/self-loading.d.ts +7 -0
- package/dist/viewers/shapefile/self-loading.js +32 -0
- package/dist/viewers/shapefile/styles.d.ts +1 -0
- package/dist/viewers/shapefile/styles.js +28 -0
- package/dist/viewers/stp/index.d.ts +15 -0
- package/dist/viewers/stp/index.js +5 -0
- package/dist/viewers/structured-styles.d.ts +1 -0
- package/dist/viewers/structured-styles.js +1 -0
- package/dist/viewers/structured.d.ts +36 -0
- package/dist/viewers/structured.js +138 -0
- package/dist/viewers/toml/controller.d.ts +38 -0
- package/dist/viewers/toml/controller.js +61 -0
- package/dist/viewers/toml/index.d.ts +18 -0
- package/dist/viewers/toml/index.js +34 -0
- package/dist/viewers/types.d.ts +36 -0
- package/dist/viewers/types.js +9 -0
- package/dist/viewers/video/controller.d.ts +29 -0
- package/dist/viewers/video/controller.js +54 -0
- package/dist/viewers/video/index.d.ts +18 -0
- package/dist/viewers/video/index.js +305 -0
- package/dist/viewers/video/styles.d.ts +1 -0
- package/dist/viewers/video/styles.js +79 -0
- package/dist/viewers/word/controller.d.ts +19 -0
- package/dist/viewers/word/controller.js +22 -0
- package/dist/viewers/word/docx-preprocess.d.ts +63 -0
- package/dist/viewers/word/docx-preprocess.js +136 -0
- package/dist/viewers/word/index.d.ts +32 -0
- package/dist/viewers/word/index.js +187 -0
- package/dist/viewers/word/normalize-docx.d.ts +2 -0
- package/dist/viewers/word/normalize-docx.js +50 -0
- package/dist/viewers/word/paginate.d.ts +1 -0
- package/dist/viewers/word/paginate.js +1035 -0
- package/dist/viewers/word/self-loading.d.ts +2 -0
- package/dist/viewers/word/self-loading.js +7 -0
- package/dist/viewers/word/styles.d.ts +1 -0
- package/dist/viewers/word/styles.js +686 -0
- package/dist/viewers/yaml/controller.d.ts +42 -0
- package/dist/viewers/yaml/controller.js +41 -0
- package/dist/viewers/yaml/index.d.ts +21 -0
- package/dist/viewers/yaml/index.js +20 -0
- package/package.json +375 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// DOM-free presentation state for the waveform audio viewer. Playback time
|
|
2
|
+
// and play/pause live on the WaveSurfer instance (the engine owns them); the
|
|
3
|
+
// controller holds the pure knobs the toolbar mutates.
|
|
4
|
+
export const AUDIO_MIN_ZOOM = 1;
|
|
5
|
+
export const AUDIO_MAX_ZOOM = 32;
|
|
6
|
+
export const AUDIO_VOLUME_STEPS = 100;
|
|
7
|
+
const clampZoom = (zoom) => Math.min(AUDIO_MAX_ZOOM, Math.max(AUDIO_MIN_ZOOM, zoom));
|
|
8
|
+
export function createAudioController() {
|
|
9
|
+
let zoom = 1;
|
|
10
|
+
let volume = 1;
|
|
11
|
+
let loop = false;
|
|
12
|
+
let visualization = 'waveform';
|
|
13
|
+
const listeners = new Set();
|
|
14
|
+
const snapshot = () => ({ zoom, volume, loop, visualization });
|
|
15
|
+
const emit = () => listeners.forEach((listener) => listener(snapshot()));
|
|
16
|
+
return {
|
|
17
|
+
get state() { return snapshot(); },
|
|
18
|
+
dispatch(action) {
|
|
19
|
+
const before = snapshot();
|
|
20
|
+
switch (action.type) {
|
|
21
|
+
case 'zoom-in':
|
|
22
|
+
zoom = clampZoom(zoom * 2);
|
|
23
|
+
break;
|
|
24
|
+
case 'zoom-out':
|
|
25
|
+
zoom = clampZoom(zoom / 2);
|
|
26
|
+
break;
|
|
27
|
+
case 'zoom-fit':
|
|
28
|
+
zoom = 1;
|
|
29
|
+
break;
|
|
30
|
+
case 'set-volume':
|
|
31
|
+
volume = Math.min(1, Math.max(0, action.volume));
|
|
32
|
+
break;
|
|
33
|
+
case 'toggle-loop':
|
|
34
|
+
loop = !loop;
|
|
35
|
+
break;
|
|
36
|
+
case 'set-visualization':
|
|
37
|
+
visualization = action.visualization;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
const after = snapshot();
|
|
41
|
+
if (JSON.stringify(before) !== JSON.stringify(after))
|
|
42
|
+
emit();
|
|
43
|
+
},
|
|
44
|
+
subscribe(listener) {
|
|
45
|
+
listeners.add(listener);
|
|
46
|
+
return () => listeners.delete(listener);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { HostContext } from '../../host/index.js';
|
|
2
|
+
export interface DecodedAudio {
|
|
3
|
+
sampleRate: number;
|
|
4
|
+
channels: number;
|
|
5
|
+
frames: number;
|
|
6
|
+
/** Interleaved float32 samples, length === frames * channels. */
|
|
7
|
+
pcm: Float32Array;
|
|
8
|
+
}
|
|
9
|
+
export interface AudioAnalysis {
|
|
10
|
+
sampleRate: number;
|
|
11
|
+
channels: number;
|
|
12
|
+
duration: number;
|
|
13
|
+
/** Mono peak per pixel column, 0..1. */
|
|
14
|
+
peaks: number[];
|
|
15
|
+
}
|
|
16
|
+
export interface AudioDecodeEngine {
|
|
17
|
+
decode(data: Uint8Array): Promise<DecodedAudio>;
|
|
18
|
+
analyze(data: Uint8Array, width: number): Promise<AudioAnalysis>;
|
|
19
|
+
}
|
|
20
|
+
/** Emscripten module surface used by the bridge (see native/audio-engine). */
|
|
21
|
+
export interface AudioEngineModuleLike {
|
|
22
|
+
HEAPU8: Uint8Array;
|
|
23
|
+
HEAPF32: Float32Array;
|
|
24
|
+
getValue(pointer: number, type: string): number;
|
|
25
|
+
_malloc(size: number): number;
|
|
26
|
+
_free(pointer: number): void;
|
|
27
|
+
_decode_audio(pointer: number, length: number): number;
|
|
28
|
+
_audio_get_channels(audio: number): number;
|
|
29
|
+
_audio_get_sample_rate(audio: number): number;
|
|
30
|
+
_audio_get_total_frames(audio: number): number;
|
|
31
|
+
_audio_get_total_frames_high(audio: number): number;
|
|
32
|
+
_generate_peaks(audio: number, width: number): number;
|
|
33
|
+
_free_audio(audio: number): void;
|
|
34
|
+
_free_buffer(pointer: number): void;
|
|
35
|
+
}
|
|
36
|
+
export declare function createWasmAudioEngine(loadModule: () => Promise<AudioEngineModuleLike>): AudioDecodeEngine;
|
|
37
|
+
/**
|
|
38
|
+
* Engine loader over the platform AssetService: the adapter serves
|
|
39
|
+
* assets/audio-engine/* (chrome: web_accessible_resources, obsidian:
|
|
40
|
+
* blob URLs, web: static files) and this resolves + imports them.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createAssetAudioEngine(ctx: HostContext, importModule?: (url: string) => Promise<unknown>): AudioDecodeEngine;
|
|
43
|
+
/** Encode interleaved float32 PCM as a 16-bit little-endian WAV file. */
|
|
44
|
+
export declare function encodeWavFromFloat32(pcm: Float32Array, channels: number, sampleRate: number): Uint8Array;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// WASM audio decode/analysis engine bridge. The engine (native/audio-engine,
|
|
2
|
+
// built to assets/audio-engine/audio_engine.{mjs,wasm}) decodes WAV/MP3/FLAC/
|
|
3
|
+
// OGG entirely in WASM. The viewer uses it two ways:
|
|
4
|
+
// 1. decode-and-remux: when the browser cannot decode a file, decode in
|
|
5
|
+
// WASM and re-encode to 16-bit PCM WAV that any browser can play.
|
|
6
|
+
// 2. analyze: for large files, compute waveform peaks in WASM so WaveSurfer
|
|
7
|
+
// can render without running the whole file through decodeAudioData.
|
|
8
|
+
function openAudio(module, data) {
|
|
9
|
+
const pointer = module._malloc(data.byteLength);
|
|
10
|
+
module.HEAPU8.set(data, pointer);
|
|
11
|
+
const handle = module._decode_audio(pointer, data.byteLength);
|
|
12
|
+
module._free(pointer);
|
|
13
|
+
if (!handle)
|
|
14
|
+
throw new Error('audio engine: unsupported or corrupted stream');
|
|
15
|
+
return {
|
|
16
|
+
module,
|
|
17
|
+
handle,
|
|
18
|
+
channels: module._audio_get_channels(handle),
|
|
19
|
+
sampleRate: module._audio_get_sample_rate(handle),
|
|
20
|
+
// >>> 0: the low word is a raw uint32 read back through a signed ABI.
|
|
21
|
+
frames: (module._audio_get_total_frames(handle) >>> 0)
|
|
22
|
+
+ module._audio_get_total_frames_high(handle) * 2 ** 32
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function createWasmAudioEngine(loadModule) {
|
|
26
|
+
let modulePromise;
|
|
27
|
+
const module = () => (modulePromise ??= loadModule());
|
|
28
|
+
return {
|
|
29
|
+
async decode(data) {
|
|
30
|
+
const engine = await module();
|
|
31
|
+
const audio = openAudio(engine, data);
|
|
32
|
+
try {
|
|
33
|
+
const samplesPointer = engine.getValue(audio.handle, 'i32') >>> 0;
|
|
34
|
+
const length = audio.frames * audio.channels;
|
|
35
|
+
const pcm = new Float32Array(engine.HEAPF32.buffer, samplesPointer, length).slice();
|
|
36
|
+
return { sampleRate: audio.sampleRate, channels: audio.channels, frames: audio.frames, pcm };
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
engine._free_audio(audio.handle);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
async analyze(data, width) {
|
|
43
|
+
const engine = await module();
|
|
44
|
+
const audio = openAudio(engine, data);
|
|
45
|
+
try {
|
|
46
|
+
const columns = Math.max(1, Math.floor(width));
|
|
47
|
+
const peaksPointer = engine._generate_peaks(audio.handle, columns) >>> 0;
|
|
48
|
+
if (!peaksPointer)
|
|
49
|
+
throw new Error('audio engine: peaks generation failed');
|
|
50
|
+
const peaks = [...new Float32Array(engine.HEAPF32.buffer, peaksPointer, columns)];
|
|
51
|
+
engine._free_buffer(peaksPointer);
|
|
52
|
+
return {
|
|
53
|
+
sampleRate: audio.sampleRate,
|
|
54
|
+
channels: audio.channels,
|
|
55
|
+
duration: audio.sampleRate > 0 ? audio.frames / audio.sampleRate : 0,
|
|
56
|
+
peaks
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
engine._free_audio(audio.handle);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Engine loader over the platform AssetService: the adapter serves
|
|
67
|
+
* assets/audio-engine/* (chrome: web_accessible_resources, obsidian:
|
|
68
|
+
* blob URLs, web: static files) and this resolves + imports them.
|
|
69
|
+
*/
|
|
70
|
+
export function createAssetAudioEngine(ctx, importModule = (url) => import(/* @vite-ignore */ /* webpackIgnore: true */ url)) {
|
|
71
|
+
return createWasmAudioEngine(async () => {
|
|
72
|
+
const [moduleUrl, wasmUrl] = await Promise.all([
|
|
73
|
+
ctx.assets.resolveAssetUrl('audio-engine/audio_engine.mjs'),
|
|
74
|
+
ctx.assets.resolveAssetUrl('audio-engine/audio_engine.wasm')
|
|
75
|
+
]);
|
|
76
|
+
const factory = (await importModule(moduleUrl)).default;
|
|
77
|
+
return factory({ locateFile: () => wasmUrl });
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** Encode interleaved float32 PCM as a 16-bit little-endian WAV file. */
|
|
81
|
+
export function encodeWavFromFloat32(pcm, channels, sampleRate) {
|
|
82
|
+
const dataSize = pcm.length * 2;
|
|
83
|
+
const buffer = new ArrayBuffer(44 + dataSize);
|
|
84
|
+
const view = new DataView(buffer);
|
|
85
|
+
const writeAscii = (offset, text) => {
|
|
86
|
+
for (let i = 0; i < text.length; i++)
|
|
87
|
+
view.setUint8(offset + i, text.charCodeAt(i));
|
|
88
|
+
};
|
|
89
|
+
writeAscii(0, 'RIFF');
|
|
90
|
+
view.setUint32(4, 36 + dataSize, true);
|
|
91
|
+
writeAscii(8, 'WAVE');
|
|
92
|
+
writeAscii(12, 'fmt ');
|
|
93
|
+
view.setUint32(16, 16, true);
|
|
94
|
+
view.setUint16(20, 1, true); // PCM
|
|
95
|
+
view.setUint16(22, channels, true);
|
|
96
|
+
view.setUint32(24, sampleRate, true);
|
|
97
|
+
view.setUint32(28, sampleRate * channels * 2, true);
|
|
98
|
+
view.setUint16(32, channels * 2, true);
|
|
99
|
+
view.setUint16(34, 16, true);
|
|
100
|
+
writeAscii(36, 'data');
|
|
101
|
+
view.setUint32(40, dataSize, true);
|
|
102
|
+
const samples = new Int16Array(buffer, 44);
|
|
103
|
+
for (let i = 0; i < pcm.length; i++) {
|
|
104
|
+
const clamped = Math.max(-1, Math.min(1, pcm[i]));
|
|
105
|
+
samples[i] = Math.round(clamped < 0 ? clamped * 0x8000 : clamped * 0x7fff);
|
|
106
|
+
}
|
|
107
|
+
return new Uint8Array(buffer);
|
|
108
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { HostContext } from '../../host/index.js';
|
|
2
|
+
import { type MediaMountOptions } from '../media.js';
|
|
3
|
+
import { type ViewerHandle, type ViewerInput } from '../types.js';
|
|
4
|
+
import { type AudioDecodeEngine } from './engine.js';
|
|
5
|
+
export { parseAudioInfo } from '../../parsers/audio/index.js';
|
|
6
|
+
export { audioViewerCss } from './styles.js';
|
|
7
|
+
export { createAudioController, AUDIO_MIN_ZOOM, AUDIO_MAX_ZOOM, type AudioAction, type AudioController, type AudioViewState, type AudioVisualization } from './controller.js';
|
|
8
|
+
export { createAssetAudioEngine, createWasmAudioEngine, encodeWavFromFloat32, type AudioAnalysis, type AudioDecodeEngine, type AudioEngineModuleLike, type DecodedAudio } from './engine.js';
|
|
9
|
+
export type AudioViewerContext = HostContext;
|
|
10
|
+
export interface AudioPluginHandle {
|
|
11
|
+
destroy?(): void;
|
|
12
|
+
}
|
|
13
|
+
export interface AudioRegionHandle {
|
|
14
|
+
id: string;
|
|
15
|
+
start: number;
|
|
16
|
+
end: number;
|
|
17
|
+
play(): void;
|
|
18
|
+
remove(): void;
|
|
19
|
+
}
|
|
20
|
+
export interface AudioRegionsHandle extends AudioPluginHandle {
|
|
21
|
+
on(event: string, callback: (region: AudioRegionHandle) => void): unknown;
|
|
22
|
+
clearRegions(): void;
|
|
23
|
+
getRegions(): AudioRegionHandle[];
|
|
24
|
+
enableDragSelection(options: Record<string, unknown>): unknown;
|
|
25
|
+
}
|
|
26
|
+
export interface AudioWaveSurferHandle {
|
|
27
|
+
on(event: string, callback: (payload?: unknown) => void): unknown;
|
|
28
|
+
registerPlugin<T extends AudioPluginHandle>(plugin: T): T;
|
|
29
|
+
playPause(): void | Promise<void>;
|
|
30
|
+
stop(): void;
|
|
31
|
+
setTime(seconds: number): void;
|
|
32
|
+
setVolume(volume: number): void;
|
|
33
|
+
zoom(pxPerSec: number): void;
|
|
34
|
+
getDuration(): number;
|
|
35
|
+
getCurrentTime(): number;
|
|
36
|
+
getDecodedData(): {
|
|
37
|
+
numberOfChannels: number;
|
|
38
|
+
sampleRate: number;
|
|
39
|
+
duration: number;
|
|
40
|
+
} | null;
|
|
41
|
+
destroy(): void;
|
|
42
|
+
}
|
|
43
|
+
export interface AudioWaveSurferCreateOptions {
|
|
44
|
+
container: HTMLElement;
|
|
45
|
+
url: string;
|
|
46
|
+
height: number;
|
|
47
|
+
normalize: boolean;
|
|
48
|
+
waveColor: string;
|
|
49
|
+
progressColor: string;
|
|
50
|
+
cursorColor: string;
|
|
51
|
+
/** Precomputed peaks + duration: WaveSurfer then skips decodeAudioData
|
|
52
|
+
* and streams playback through a media element (large-file mode). */
|
|
53
|
+
peaks?: number[][];
|
|
54
|
+
duration?: number;
|
|
55
|
+
}
|
|
56
|
+
export interface AudioWaveformLibrary {
|
|
57
|
+
createWaveSurfer(options: AudioWaveSurferCreateOptions): AudioWaveSurferHandle;
|
|
58
|
+
createRegions?(): AudioRegionsHandle;
|
|
59
|
+
createTimeline?(options: {
|
|
60
|
+
container: HTMLElement;
|
|
61
|
+
}): AudioPluginHandle;
|
|
62
|
+
createSpectrogram?(options: {
|
|
63
|
+
container: HTMLElement;
|
|
64
|
+
labels: boolean;
|
|
65
|
+
height: number;
|
|
66
|
+
splitChannels: boolean;
|
|
67
|
+
}): AudioPluginHandle;
|
|
68
|
+
}
|
|
69
|
+
export interface AudioViewerDeps {
|
|
70
|
+
loadWaveform(): Promise<AudioWaveformLibrary>;
|
|
71
|
+
/** Optional WASM decode/analysis engine (viewers/audio/engine.ts):
|
|
72
|
+
* browser-decode failures fall back to it, and files larger than
|
|
73
|
+
* `engineAnalyzeBytes` get WASM-computed peaks instead of a full
|
|
74
|
+
* browser decode. */
|
|
75
|
+
engine?: AudioDecodeEngine;
|
|
76
|
+
}
|
|
77
|
+
export interface AudioMountOptions extends MediaMountOptions {
|
|
78
|
+
/** Waveform engine (WaveSurfer). Absent → basic `<audio>` player. */
|
|
79
|
+
deps?: AudioViewerDeps;
|
|
80
|
+
/** Files above this size use engine peak analysis (default 50 MiB). */
|
|
81
|
+
engineAnalyzeBytes?: number;
|
|
82
|
+
}
|
|
83
|
+
export declare const AUDIO_VIEWER_META: {
|
|
84
|
+
id: string;
|
|
85
|
+
displayNameKey: string;
|
|
86
|
+
extensions: string[];
|
|
87
|
+
priority: number;
|
|
88
|
+
requiredServices: readonly [];
|
|
89
|
+
optionalServices: readonly [];
|
|
90
|
+
inputOwnership: "borrows";
|
|
91
|
+
};
|
|
92
|
+
export declare function mountAudioViewer(input: ViewerInput, container: HTMLElement, ctx: AudioViewerContext, options?: AudioMountOptions): Promise<ViewerHandle>;
|