dev@460
|
1 /**
|
dev@460
|
2 * Created by lucast on 08/06/2017.
|
dev@460
|
3 */
|
dev@460
|
4 import {KnownShapedFeature} from '../visualisations/FeatureUtilities';
|
dev@497
|
5 import {OneShotExtractionRequest as SimpleRequest} from 'piper-js/one-shot';
|
dev@460
|
6 export abstract class Item {
|
dev@460
|
7 id: string;
|
dev@460
|
8 hasSharedTimeline: boolean;
|
dev@460
|
9 title?: string;
|
dev@460
|
10 description?: string;
|
dev@460
|
11 progress?: number;
|
dev@460
|
12 }
|
dev@460
|
13
|
dev@460
|
14 export interface RootAudioItem extends Item {
|
dev@460
|
15 uri: string;
|
dev@460
|
16 mimeType?: string;
|
dev@460
|
17 isExportable?: boolean;
|
dev@460
|
18 }
|
dev@460
|
19 export interface LoadedRootAudioItem extends RootAudioItem {
|
dev@460
|
20 audioData: AudioBuffer;
|
dev@460
|
21 }
|
dev@460
|
22
|
dev@460
|
23 export interface AnalysisItem extends Item {
|
dev@460
|
24 parent: LoadedRootAudioItem;
|
dev@460
|
25 extractorKey: string;
|
dev@460
|
26 outputId: string;
|
dev@460
|
27 }
|
dev@460
|
28
|
dev@460
|
29 export type ExtractedAnalysisItem = AnalysisItem & KnownShapedFeature & {
|
dev@460
|
30 unit?: string
|
dev@460
|
31 };
|
dev@460
|
32
|
dev@460
|
33 export function isItem(item: Item): item is Item {
|
dev@460
|
34 return item.id != null && item.hasSharedTimeline != null;
|
dev@460
|
35 }
|
dev@460
|
36
|
dev@460
|
37 export function isPendingRootAudioItem(item: Item): item is RootAudioItem {
|
dev@460
|
38 return isItem(item) && typeof (item as RootAudioItem).uri === 'string';
|
dev@460
|
39 }
|
dev@460
|
40
|
dev@460
|
41 export function isLoadedRootAudioItem(item: Item): item is LoadedRootAudioItem {
|
dev@460
|
42 return item && isPendingRootAudioItem(item) &&
|
dev@460
|
43 (item as LoadedRootAudioItem).audioData instanceof AudioBuffer;
|
dev@460
|
44 }
|
dev@460
|
45
|
dev@460
|
46 export function isPendingAnalysisItem(item: Item): item is AnalysisItem {
|
dev@460
|
47 const downcast = (item as ExtractedAnalysisItem);
|
dev@460
|
48 return isLoadedRootAudioItem(downcast.parent)
|
dev@460
|
49 && typeof downcast.extractorKey === 'string';
|
dev@460
|
50 }
|
dev@460
|
51
|
dev@460
|
52 export function isExtractedAnalysisItem(it: Item): it is ExtractedAnalysisItem {
|
dev@460
|
53 const downcast = (it as ExtractedAnalysisItem);
|
dev@460
|
54 return isPendingAnalysisItem(it) &&
|
dev@460
|
55 downcast.shape != null &&
|
dev@460
|
56 downcast.collected != null;
|
dev@460
|
57 }
|
dev@460
|
58
|
dev@463
|
59 export function getRootAudioItem(item: Item): RootAudioItem {
|
dev@463
|
60 if (isPendingRootAudioItem(item)) {
|
dev@463
|
61 return item;
|
dev@463
|
62 }
|
dev@463
|
63 if (isPendingAnalysisItem(item)) {
|
dev@463
|
64 return item.parent;
|
dev@463
|
65 }
|
dev@463
|
66 throw new Error('Invalid item.');
|
dev@463
|
67 }
|
dev@463
|
68
|
dev@460
|
69 // these should probably be actual concrete types with their own getUri methods
|
dev@460
|
70 export function getRootUri(item: Item): string {
|
dev@463
|
71 return getRootAudioItem(item).uri;
|
dev@460
|
72 }
|
dev@460
|
73
|
dev@460
|
74 export function createExtractionRequest(item: AnalysisItem): SimpleRequest {
|
dev@460
|
75 return {
|
dev@460
|
76 audioData: [...Array(item.parent.audioData.numberOfChannels).keys()]
|
dev@460
|
77 .map(i => item.parent.audioData.getChannelData(i)),
|
dev@460
|
78 audioFormat: {
|
dev@460
|
79 sampleRate: item.parent.audioData.sampleRate,
|
dev@460
|
80 channelCount: item.parent.audioData.numberOfChannels,
|
dev@460
|
81 length: item.parent.audioData.length
|
dev@460
|
82 },
|
dev@460
|
83 key: item.extractorKey,
|
dev@460
|
84 outputId: item.outputId
|
dev@460
|
85 };
|
dev@460
|
86 }
|