dev@460: /** dev@460: * Created by lucast on 08/06/2017. dev@460: */ dev@460: import {KnownShapedFeature} from '../visualisations/FeatureUtilities'; dev@497: import {OneShotExtractionRequest as SimpleRequest} from 'piper-js/one-shot'; dev@460: export abstract class Item { dev@460: id: string; dev@460: hasSharedTimeline: boolean; dev@460: title?: string; dev@460: description?: string; dev@460: progress?: number; dev@460: } dev@460: dev@460: export interface RootAudioItem extends Item { dev@460: uri: string; dev@460: mimeType?: string; dev@460: isExportable?: boolean; dev@460: } dev@460: export interface LoadedRootAudioItem extends RootAudioItem { dev@460: audioData: AudioBuffer; dev@460: } dev@460: dev@460: export interface AnalysisItem extends Item { dev@460: parent: LoadedRootAudioItem; dev@460: extractorKey: string; dev@460: outputId: string; dev@460: } dev@460: dev@460: export type ExtractedAnalysisItem = AnalysisItem & KnownShapedFeature & { dev@460: unit?: string dev@460: }; dev@460: dev@460: export function isItem(item: Item): item is Item { dev@460: return item.id != null && item.hasSharedTimeline != null; dev@460: } dev@460: dev@460: export function isPendingRootAudioItem(item: Item): item is RootAudioItem { dev@460: return isItem(item) && typeof (item as RootAudioItem).uri === 'string'; dev@460: } dev@460: dev@460: export function isLoadedRootAudioItem(item: Item): item is LoadedRootAudioItem { dev@460: return item && isPendingRootAudioItem(item) && dev@460: (item as LoadedRootAudioItem).audioData instanceof AudioBuffer; dev@460: } dev@460: dev@460: export function isPendingAnalysisItem(item: Item): item is AnalysisItem { dev@460: const downcast = (item as ExtractedAnalysisItem); dev@460: return isLoadedRootAudioItem(downcast.parent) dev@460: && typeof downcast.extractorKey === 'string'; dev@460: } dev@460: dev@460: export function isExtractedAnalysisItem(it: Item): it is ExtractedAnalysisItem { dev@460: const downcast = (it as ExtractedAnalysisItem); dev@460: return isPendingAnalysisItem(it) && dev@460: downcast.shape != null && dev@460: downcast.collected != null; dev@460: } dev@460: dev@463: export function getRootAudioItem(item: Item): RootAudioItem { dev@463: if (isPendingRootAudioItem(item)) { dev@463: return item; dev@463: } dev@463: if (isPendingAnalysisItem(item)) { dev@463: return item.parent; dev@463: } dev@463: throw new Error('Invalid item.'); dev@463: } dev@463: dev@460: // these should probably be actual concrete types with their own getUri methods dev@460: export function getRootUri(item: Item): string { dev@463: return getRootAudioItem(item).uri; dev@460: } dev@460: dev@460: export function createExtractionRequest(item: AnalysisItem): SimpleRequest { dev@460: return { dev@460: audioData: [...Array(item.parent.audioData.numberOfChannels).keys()] dev@460: .map(i => item.parent.audioData.getChannelData(i)), dev@460: audioFormat: { dev@460: sampleRate: item.parent.audioData.sampleRate, dev@460: channelCount: item.parent.audioData.numberOfChannels, dev@460: length: item.parent.audioData.length dev@460: }, dev@460: key: item.extractorKey, dev@460: outputId: item.outputId dev@460: }; dev@460: }