annotate src/app/analysis-item/AnalysisItem.ts @ 460:ccce2c09502e

Manually cherry-pick various refactoring efforts from feature/basic-session-loading
author Lucas Thompson <dev@lucas.im>
date Fri, 30 Jun 2017 10:41:30 +0100
parents
children c9c6b01e9b4f
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@460 5 import {SimpleRequest} from 'piper/HigherLevelUtilities';
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@460 59 // these should probably be actual concrete types with their own getUri methods
dev@460 60 export function getRootUri(item: Item): string {
dev@460 61 if (isPendingRootAudioItem(item)) {
dev@460 62 return item.uri;
dev@460 63 }
dev@460 64 if (isPendingAnalysisItem(item)) {
dev@460 65 return item.parent.uri;
dev@460 66 }
dev@460 67 throw new Error('Invalid item: No URI property set.');
dev@460 68 }
dev@460 69
dev@460 70 export function createExtractionRequest(item: AnalysisItem): SimpleRequest {
dev@460 71 return {
dev@460 72 audioData: [...Array(item.parent.audioData.numberOfChannels).keys()]
dev@460 73 .map(i => item.parent.audioData.getChannelData(i)),
dev@460 74 audioFormat: {
dev@460 75 sampleRate: item.parent.audioData.sampleRate,
dev@460 76 channelCount: item.parent.audioData.numberOfChannels,
dev@460 77 length: item.parent.audioData.length
dev@460 78 },
dev@460 79 key: item.extractorKey,
dev@460 80 outputId: item.outputId
dev@460 81 };
dev@460 82 }