annotate src/app/analysis-item/AnalysisItem.ts @ 509:041468f553e1 tip master

Merge pull request #57 from LucasThompson/fix/session-stack-max-call-stack Fix accidental recursion in PersistentStack
author Lucas Thompson <LucasThompson@users.noreply.github.com>
date Mon, 27 Nov 2017 11:04:30 +0000
parents c39df81c4dae
children
rev   line source
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 }