Mercurial > hg > ugly-duckling
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/app/analysis-item/AnalysisItem.ts Fri Jun 30 10:41:30 2017 +0100 @@ -0,0 +1,82 @@ +/** + * Created by lucast on 08/06/2017. + */ +import {KnownShapedFeature} from '../visualisations/FeatureUtilities'; +import {SimpleRequest} from 'piper/HigherLevelUtilities'; +export abstract class Item { + id: string; + hasSharedTimeline: boolean; + title?: string; + description?: string; + progress?: number; +} + +export interface RootAudioItem extends Item { + uri: string; + mimeType?: string; + isExportable?: boolean; +} +export interface LoadedRootAudioItem extends RootAudioItem { + audioData: AudioBuffer; +} + +export interface AnalysisItem extends Item { + parent: LoadedRootAudioItem; + extractorKey: string; + outputId: string; +} + +export type ExtractedAnalysisItem = AnalysisItem & KnownShapedFeature & { + unit?: string +}; + +export function isItem(item: Item): item is Item { + return item.id != null && item.hasSharedTimeline != null; +} + +export function isPendingRootAudioItem(item: Item): item is RootAudioItem { + return isItem(item) && typeof (item as RootAudioItem).uri === 'string'; +} + +export function isLoadedRootAudioItem(item: Item): item is LoadedRootAudioItem { + return item && isPendingRootAudioItem(item) && + (item as LoadedRootAudioItem).audioData instanceof AudioBuffer; +} + +export function isPendingAnalysisItem(item: Item): item is AnalysisItem { + const downcast = (item as ExtractedAnalysisItem); + return isLoadedRootAudioItem(downcast.parent) + && typeof downcast.extractorKey === 'string'; +} + +export function isExtractedAnalysisItem(it: Item): it is ExtractedAnalysisItem { + const downcast = (it as ExtractedAnalysisItem); + return isPendingAnalysisItem(it) && + downcast.shape != null && + downcast.collected != null; +} + +// these should probably be actual concrete types with their own getUri methods +export function getRootUri(item: Item): string { + if (isPendingRootAudioItem(item)) { + return item.uri; + } + if (isPendingAnalysisItem(item)) { + return item.parent.uri; + } + throw new Error('Invalid item: No URI property set.'); +} + +export function createExtractionRequest(item: AnalysisItem): SimpleRequest { + return { + audioData: [...Array(item.parent.audioData.numberOfChannels).keys()] + .map(i => item.parent.audioData.getChannelData(i)), + audioFormat: { + sampleRate: item.parent.audioData.sampleRate, + channelCount: item.parent.audioData.numberOfChannels, + length: item.parent.audioData.length + }, + key: item.extractorKey, + outputId: item.outputId + }; +}