speechrecorderng 2.23.2 → 2.23.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/speechrecorder/script/script.mjs +1 -1
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +15 -16
- package/esm2020/lib/spr.module.version.mjs +2 -2
- package/fesm2015/speechrecorderng.mjs +15 -16
- package/fesm2015/speechrecorderng.mjs.map +1 -1
- package/fesm2020/speechrecorderng.mjs +15 -16
- package/fesm2020/speechrecorderng.mjs.map +1 -1
- package/lib/speechrecorder/script/script.d.ts +4 -2
- package/lib/speechrecorder/session/sessionmanager.d.ts +1 -0
- package/lib/spr.module.version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speechrecorderng.mjs","sources":["../../../projects/speechrecorderng/src/lib/action/action.ts","../../../projects/speechrecorderng/src/lib/audio/playback/player.ts","../../../projects/speechrecorderng/src/lib/utils/ua-parser.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/project/project.ts","../../../projects/speechrecorderng/src/lib/audio/capture/capture.ts","../../../projects/speechrecorderng/src/lib/audio/impl/wavformat.ts","../../../projects/speechrecorderng/src/lib/io/BinaryWriter.ts","../../../projects/speechrecorderng/src/lib/utils/utils.ts","../../../projects/speechrecorderng/src/lib/audio/impl/wavwriter.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/script/script.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/recording.ts","../../../projects/speechrecorderng/src/lib/net/uploader.ts","../../../projects/speechrecorderng/src/lib/spr.config.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/project/project.service.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/session.service.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.ts","../../../projects/speechrecorderng/src/lib/math/2d/geometry.ts","../../../projects/speechrecorderng/src/lib/ui/canvas_layer_comp.ts","../../../projects/speechrecorderng/src/lib/audio/persistor.ts","../../../projects/speechrecorderng/src/lib/audio/ui/common.ts","../../../projects/speechrecorderng/src/lib/audio/ui/audio_canvas_layer_comp.ts","../../../projects/speechrecorderng/src/lib/audio/ui/audiosignal.ts","../../../projects/speechrecorderng/src/lib/math/complex.ts","../../../projects/speechrecorderng/src/lib/math/dft.ts","../../../projects/speechrecorderng/src/lib/dsp/utils.ts","../../../projects/speechrecorderng/src/lib/math/utils.ts","../../../projects/speechrecorderng/src/lib/utils/css_utils.ts","../../../projects/speechrecorderng/src/lib/audio/ui/sonagram.ts","../../../projects/speechrecorderng/src/lib/audio/ui/container.ts","../../../projects/speechrecorderng/src/lib/audio/ui/audio_display_scroll_pane.ts","../../../projects/speechrecorderng/src/lib/audio/ui/audio_display_control.ts","../../../projects/speechrecorderng/src/lib/audio/audio_display.ts","../../../projects/speechrecorderng/src/lib/utils/scrollIntoViewToBottom.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/progress.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/prompting.ts","../../../projects/speechrecorderng/src/lib/io/stream.ts","../../../projects/speechrecorderng/src/lib/audio/io/stream.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/session_finished_dialog.ts","../../../projects/speechrecorderng/src/lib/ui/message_dialog.ts","../../../projects/speechrecorderng/src/lib/audio/context.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/item.ts","../../../projects/speechrecorderng/src/lib/audio/ui/livelevel.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/controlpanel.ts","../../../projects/speechrecorderng/src/lib/audio/dsp/level_measure.ts","../../../projects/speechrecorderng/src/lib/ui/recordingitem_display.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/basicrecorder.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/recordings/recordings.service.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/spruploader.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/warning_bar.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/sessionmanager.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/script/script.service.ts","../../../projects/speechrecorderng/src/lib/speechrecorderng.component.ts","../../../projects/speechrecorderng/src/lib/audio/ui/scroll_pane_horizontal.ts","../../../projects/speechrecorderng/src/lib/audio/audio_player.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recording-file.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recordingfile-service.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recording-file-meta.component.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recording-file-navi.component.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recording-file-view.component.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.ts","../../../projects/speechrecorderng/src/lib/media/utils.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recording_list.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recorder_combi_pane.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/audiorecorder.ts","../../../projects/speechrecorderng/src/lib/speechrecorderng.module.ts","../../../projects/speechrecorderng/src/lib/spr.module.version.ts","../../../projects/speechrecorderng/src/public-api.ts","../../../projects/speechrecorderng/src/speechrecorderng.ts"],"sourcesContent":["\r\n export class ActionEvent<T> {\r\n get value(): T|null {\r\n return this._value;\r\n }\r\n constructor(private _value:T|null=null) {\r\n\r\n }\r\n }\r\n\r\n export interface ActionEventListener<T>{\r\n (ae:ActionEvent<T>):void;\r\n }\r\n\r\n export class Action<T> {\r\n get value(): T|null {\r\n return this._value;\r\n }\r\n\r\n private _name:string;\r\n private _value:T|null;\r\n _disabled=true;\r\n private _onAction:ActionEventListener<T>|null=null;\r\n listeners:Array<ActionEventListener<T>>;\r\n private controls:HTMLInputElement[];\r\n\r\n constructor(name:string,value:T|null=null) {\r\n this._name = name;\r\n this._value=value\r\n this.listeners = new Array<ActionEventListener<T>>();\r\n this.controls = [];\r\n }\r\n\r\n get name():string {\r\n return this._name;\r\n }\r\n\r\n\r\n get onAction():ActionEventListener<T>|null {\r\n return this._onAction;\r\n }\r\n\r\n set onAction(value:ActionEventListener<T>|null) {\r\n this._onAction = value;\r\n }\r\n\r\n protected createActionEvent(value: T|null=null):ActionEvent<T> {\r\n // default:\r\n return new ActionEvent(value);\r\n }\r\n\r\n perform(value: T|null=null):void {\r\n this._value=value\r\n if (!this.disabled && this._onAction) {\r\n let ae=this.createActionEvent(value)\r\n this._onAction(ae);\r\n }\r\n }\r\n\r\n set disabled(disabled:boolean) {\r\n this._disabled = disabled;\r\n for (let c of this.controls) {\r\n c.disabled = this._disabled;\r\n }\r\n //let disStr=this.disabled?\"disabled\":\"enabled\";\r\n //console.log(this._name+\": \"+disStr);\r\n }\r\n\r\n get disabled():boolean {\r\n return this._disabled;\r\n }\r\n\r\n addControl(ctrl: HTMLInputElement, actionEventName?: string) {\r\n if (ctrl) {\r\n if (this.controls.indexOf(ctrl) < 0) {\r\n ctrl.disabled = this.disabled;\r\n this.controls.push(ctrl);\r\n if (actionEventName) {\r\n ctrl.addEventListener(actionEventName, (e) => {\r\n this.perform();\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n removeControl(ctrl:HTMLInputElement) {\r\n var i = this.controls.indexOf(ctrl);\r\n if (i >= 0) {\r\n this.controls = this.controls.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n","import { Action } from '../../action/action'\r\nimport { AudioClip } from '../persistor'\r\n\r\n export enum EventType {CLOSED,READY,STARTED,POS_UPDATE, STOPPED, ENDED}\r\n\r\n export class AudioPlayerEvent{\r\n\r\n private _type:EventType;\r\n private _timePosition:number | undefined;\r\n\r\n constructor(type:EventType, timePosition?:number) {\r\n this._type = type;\r\n this._timePosition = timePosition;\r\n }\r\n\r\n get type() {\r\n return this._type;\r\n }\r\n\r\n get timePosition() {\r\n return this._timePosition;\r\n }\r\n }\r\n export interface AudioPlayerListener {\r\n audioPlayerUpdate(e:AudioPlayerEvent):void;\r\n }\r\n\r\n export class AudioPlayer {\r\n get autoPlayOnSelectToggleAction(): Action<boolean> {\r\n return this._autoPlayOnSelectToggleAction;\r\n }\r\n public static DEFAULT_BUFSIZE:number = 8192;\r\n private running=false;\r\n private _startAction:Action<void>;\r\n private _startSelectionAction:Action<void>;\r\n private _autoPlayOnSelectToggleAction:Action<boolean>\r\n private _stopAction:Action<void>;\r\n bufSize:number;\r\n context:AudioContext;\r\n listener:AudioPlayerListener;\r\n _audioClip:AudioClip|null=null;\r\n _audioBuffer:AudioBuffer | null=null;\r\n sourceBufferNode:AudioBufferSourceNode|null=null;\r\n buffPos:number;\r\n private zeroBufCnt:number;\r\n n:any;\r\n zb:Float32Array;\r\n private playStartTime:number|null=null;\r\n\r\n private timerVar:number|null=null;\r\n\r\n constructor(context:AudioContext, listener:AudioPlayerListener) {\r\n this.context=context;\r\n this.listener=listener;\r\n this.bufSize = AudioPlayer.DEFAULT_BUFSIZE;\r\n this.n=navigator;\r\n this.buffPos=0;\r\n this.zeroBufCnt=0;\r\n this.zb = new Float32Array(this.bufSize);\r\n this._startAction = new Action('Start');\r\n this._startAction.disabled = true;\r\n this._startAction.onAction = ()=>this.start();\r\n this._startSelectionAction=new Action('Start selected')\r\n this._startSelectionAction.disabled=true\r\n this._startSelectionAction.onAction = ()=>this.startSelected();\r\n this._autoPlayOnSelectToggleAction=new Action<boolean>(\"Autoplay on select\",false);\r\n this._stopAction = new Action('Stop');\r\n this._stopAction.disabled = true;\r\n this._stopAction.onAction = ()=>this.stop();\r\n }\r\n\r\n get startAction() {\r\n return this._startAction;\r\n }\r\n\r\n get startSelectionAction(){\r\n return this._startSelectionAction\r\n }\r\n\r\n get stopAction() {\r\n return this._stopAction;\r\n }\r\n\r\n set audioClip(audioClip:AudioClip| null) {\r\n\r\n var length = 0;\r\n var chs = 0;\r\n if (audioClip && audioClip.buffer) {\r\n chs = audioClip.buffer.numberOfChannels;\r\n if (chs > 0) {\r\n length = audioClip.buffer.length;\r\n if (chs > this.context.destination.maxChannelCount) {\r\n // TODO exception\r\n }\r\n }\r\n this.audioBuffer = audioClip.buffer;\r\n audioClip.addSelectionObserver((ac)=> {\r\n this._startSelectionAction.disabled = this.startSelectionDisabled()\r\n if (!this.startSelectionAction.disabled && this._autoPlayOnSelectToggleAction.value) {\r\n this.startSelected()\r\n }\r\n }\r\n )\r\n }else{\r\n this.audioBuffer=null;\r\n }\r\n this._audioClip=audioClip\r\n\r\n }\r\n\r\n set audioBuffer(audioBuffer:AudioBuffer | null) {\r\n this.stop();\r\n this._audioBuffer = audioBuffer;\r\n if (audioBuffer && this.context) {\r\n this._startAction.disabled = false;\r\n this._startSelectionAction.disabled=this.startSelectionDisabled()\r\n if(this.listener){\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.READY));\r\n }\r\n }else{\r\n this._startAction.disabled = true;\r\n this._startSelectionAction.disabled=true\r\n if(this.listener){\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.CLOSED));\r\n }\r\n }\r\n }\r\n get audioBuffer():AudioBuffer| null{\r\n return this._audioBuffer;\r\n }\r\n\r\n start() {\r\n if(!this._startAction.disabled && !this.running) {\r\n this.context.resume();\r\n this.sourceBufferNode = this.context.createBufferSource();\r\n this.sourceBufferNode.buffer = this._audioBuffer;\r\n this.sourceBufferNode.connect(this.context.destination);\r\n this.sourceBufferNode.onended = () => this.onended();\r\n\r\n this.playStartTime = this.context.currentTime;\r\n this.running=true;\r\n this.sourceBufferNode.start();\r\n\r\n this.playStartTime = this.context.currentTime;\r\n this._startAction.disabled = true;\r\n this._startSelectionAction.disabled=true\r\n this._stopAction.disabled = false;\r\n //this.timerVar = window.setInterval((e)=>this.updatePlayPosition(), 200);\r\n if (this.listener) {\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STARTED));\r\n }\r\n }\r\n }\r\n\r\n startSelectionDisabled(){\r\n return !(this._audioClip && this.context && !this.startAction.disabled && this._audioClip.selection )\r\n }\r\n\r\n startSelected() {\r\n if(!this._startAction.disabled && !this.running) {\r\n this.context.resume();\r\n this.sourceBufferNode = this.context.createBufferSource();\r\n\r\n this.sourceBufferNode.buffer = this._audioBuffer;\r\n this.sourceBufferNode.connect(this.context.destination);\r\n this.sourceBufferNode.onended = () => this.onended();\r\n\r\n this.playStartTime = this.context.currentTime;\r\n this.running=true;\r\n // unfortunately Web Audio API uses time values not frames\r\n let ac=this._audioClip\r\n let offset=0\r\n if(ac && ac.selection){\r\n let s=ac.selection\r\n let sr=ac.buffer.sampleRate\r\n offset=s.leftFrame/sr\r\n let stopPosInsecs=s.rightFrame/sr\r\n let dur=stopPosInsecs-offset\r\n // TODO check valid values\r\n this.sourceBufferNode.start(0,offset,dur)\r\n }else {\r\n this.sourceBufferNode.start();\r\n }\r\n this.playStartTime = this.context.currentTime-offset;\r\n this._startAction.disabled = true;\r\n this._startSelectionAction.disabled=true\r\n this._stopAction.disabled = false;\r\n //this.timerVar = window.setInterval((e)=>this.updatePlayPosition(), 200);\r\n if (this.listener) {\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STARTED));\r\n }\r\n }\r\n }\r\n\r\n stop(){\r\n if(this.running) {\r\n if (this.sourceBufferNode) {\r\n this.sourceBufferNode.stop();\r\n }\r\n if(this.timerVar!==null) {\r\n window.clearInterval(this.timerVar);\r\n }\r\n this.running=false;\r\n if (this.listener) {\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STOPPED));\r\n }\r\n }\r\n\r\n }\r\n\r\n onended() {\r\n if(this.timerVar!=null) {\r\n window.clearInterval(this.timerVar);\r\n }\r\n this._startAction.disabled = !(this.audioBuffer);\r\n this._startSelectionAction.disabled=this.startSelectionDisabled()\r\n this._stopAction.disabled = true;\r\n this.running=false;\r\n if (this.listener) {\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.ENDED));\r\n }\r\n }\r\n\r\n get playPositionTime():number|null {\r\n let ppt=null;\r\n if(this.playStartTime!==null) {\r\n ppt= this.context.currentTime - this.playStartTime;\r\n }\r\n return ppt;\r\n }\r\n\r\n get playPositionFrames():number|null {\r\n let ppFrs:number|null=null;\r\n if(this._audioBuffer ) {\r\n let ppTime = this.playPositionTime;\r\n if(ppTime!==null) {\r\n ppFrs = this._audioBuffer.sampleRate * ppTime;\r\n }\r\n }\r\n return ppFrs;\r\n }\r\n\r\n }\r\n\r\n","export class UserAgentComponent{\r\n constructor(public name:string,public version:string|null,public comment?:string) {\r\n\r\n }\r\n\r\n toString():string{\r\n let s='['+this.name+']';\r\n if(this.version){\r\n s=s+' ['+this.version+']';\r\n }\r\n if(this.comment){\r\n s=s+' ['+this.comment+']';\r\n }\r\n return s;\r\n }\r\n}\r\nexport const NAME_FIREFOX='Firefox';\r\nexport const NAME_CHROME='Chrome';\r\nexport const NAME_SAFARI='Safari';\r\nexport const NAME_EDGE='Edge';\r\n\r\n\r\n\r\nexport enum Browser {Firefox='Firefox',Chrome='Chrome',Safari='Safari',Edge='Edge'}\r\n\r\nexport const OS_WINDOWS='Windows';\r\nexport const OS_ANDROID='Android';\r\n\r\nexport enum Platform {Windows='Windows',Android='Android',macOS='MAC OS X'}\r\n\r\nexport class UserAgent{\r\n\r\n constructor(private _detectedPlatform:Platform|null,private _detectedBrowser:Browser|null) {\r\n }\r\n\r\n get detectedBrowser(): Browser | null {\r\n return this._detectedBrowser;\r\n }\r\n\r\n get detectedPlatform(): Platform | null {\r\n return this._detectedPlatform;\r\n }\r\n\r\n}\r\n\r\nexport class UserAgentBuilder {\r\n static instance:UserAgentBuilder|undefined=undefined;\r\n private comps:Array<UserAgentComponent>=new Array<UserAgentComponent>();\r\n private userAgent!:UserAgent;\r\n\r\n private build() {\r\n\r\n // // @ts-ignore\r\n // if(navigator.userAgentData){\r\n // // maybe we can use this in the future\r\n // console.info(\"Browser provides userAgentData:\");\r\n //\r\n // console.info(\"Brands:\");\r\n // // @ts-ignore\r\n // navigator.userAgentData.brands.forEach((br=>{\r\n // console.info(br.brand +\" \"+br.version);\r\n // }))\r\n // // @ts-ignore\r\n // console.info(\"Platform: \"+navigator.userAgentData.platform);\r\n // // @ts-ignore\r\n // console.info(\"Mobile:\"+navigator.userAgentData.mobile);\r\n // // @ts-ignore\r\n // //console.info(navigator.userAgentData.toJSON());\r\n // }else {\r\n // console.info(\"Browser does not provide userAgentData.\");\r\n // }\r\n\r\n let ua=navigator.userAgent;\r\n\r\n this.comps = new Array<UserAgentComponent>();\r\n\r\n let pp = 0;\r\n while (pp < ua.length) {\r\n //parse name/version\r\n let name: string | null = null\r\n let version: string | null = null;\r\n let comment: string | undefined;\r\n\r\n let blPos = ua.indexOf(' ', pp);\r\n let prt: string;\r\n if (blPos == -1) {\r\n prt = ua.substr(pp);\r\n pp += prt.length;\r\n } else {\r\n prt = ua.substr(pp, blPos - pp);\r\n pp = blPos + 1;\r\n }\r\n let sepPos = prt.indexOf('/');\r\n if (sepPos > 0) {\r\n name = prt.substr(0, sepPos);\r\n version = prt.substr(sepPos + 1);\r\n } else {\r\n name = prt;\r\n }\r\n while (ua[pp] === ' ' && pp < ua.length) {\r\n pp++;\r\n }\r\n if (ua[pp] === '(') {\r\n pp++;\r\n let commEnd = ua.indexOf(')', pp);\r\n comment = ua.substr(pp, commEnd - pp);\r\n pp = commEnd + 1;\r\n }\r\n while (ua[pp] === ' ' && pp < ua.length) {\r\n pp++;\r\n }\r\n this.comps.push(new UserAgentComponent(name, version, comment));\r\n }\r\n\r\n let detPlatf:Platform|null=null;\r\n if(this.runsOnOS(Platform.Android)){\r\n detPlatf=Platform.Android;\r\n }else if(this.runsOnOS(Platform.Windows)){\r\n detPlatf=Platform.Windows;\r\n }else if(this.runsOnOS(Platform.macOS)){\r\n detPlatf=Platform.macOS;\r\n }\r\n\r\n\r\n let detBr:Browser|null=null;\r\n if(this.matchesBrowser(Browser.Firefox)){\r\n detBr=Browser.Firefox;\r\n }else if(this.matchesBrowser(Browser.Chrome)){\r\n detBr=Browser.Chrome;\r\n }else if(this.matchesBrowser(Browser.Safari)){\r\n detBr=Browser.Safari;\r\n }\r\n\r\n this.userAgent=new UserAgent(detPlatf,detBr);\r\n\r\n }\r\n\r\n private matchesBrowser(browserName:string){\r\n for(let ci=0;ci<this.comps.length;ci++){\r\n let bn=this.comps[ci].name\r\n let bnRe=new RegExp(browserName,'i');\r\n if(bn.match(bnRe)){\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private runsOnOS(os:string):boolean{\r\n for(let ci=0;ci<this.comps.length;ci++){\r\n let cc=this.comps[ci].comment\r\n if(cc){\r\n var osRe = new RegExp(os,'i');\r\n if(cc.match(osRe)){\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n static userAgent():UserAgent{\r\n if(!this.instance){\r\n this.instance=new UserAgentBuilder();\r\n }\r\n this.instance.build();\r\n return this.instance.userAgent;\r\n\r\n }\r\n\r\n}\r\n","\r\nexport interface AudioFormat {\r\n channels: number;\r\n}\r\n\r\nexport interface MediaCaptureFormat {\r\n audioChannelCount: number;\r\n}\r\n\r\nexport interface AudioDevice {\r\n name : string,\r\n playback : boolean,\r\n regex : boolean\r\n}\r\n\r\n\r\nexport enum ConstraintType {Exact='EXACT',Ideal='IDEAL'};\r\n\r\nexport enum Platform {Linux='LINUX',macOS='MACOS',Windows='WINDOWS',Android='ANDROID'}\r\nexport enum BrowserBase {Chromium='CHROMIUM'};\r\nexport enum Browser {Firefox='FIREFOX',Chromium='CHROMIUM',Chrome='CHROME',Edge='EDGE',Opera='OPERA'}\r\n\r\nexport interface AutoGainControlConfig {\r\n value: boolean,\r\n //constraintType : ConstraintType,\r\n platform: Platform,\r\n //browserBase:BrowserBase,\r\n //browser:Browser\r\n}\r\n\r\nexport interface Project {\r\n name: string,\r\n audioFormat?: AudioFormat,\r\n mediaCaptureFormat?: MediaCaptureFormat,\r\n autoGainControlConfigs?:Array<AutoGainControlConfig>,\r\n audioDevices?: Array<AudioDevice>\r\n}\r\n\r\n\r\nexport class ProjectUtil {\r\n\r\n public static readonly DEFAULT_AUDIO_CHANNEL_COUNT=2;\r\n\r\n static audioChannelCount(project:Project): number{\r\n let chs=ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;\r\n if(project.mediaCaptureFormat){\r\n chs=project.mediaCaptureFormat.audioChannelCount;\r\n }else if(project.audioFormat){\r\n chs=project.audioFormat.channels;\r\n }\r\n return chs;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n","import {SequenceAudioFloat32OutStream} from \"../io/stream\";\r\nimport {Browser, Platform, UserAgentBuilder} from \"../../utils/ua-parser\";\r\n\r\nimport {AutoGainControlConfig, Platform as CfgPlatform} from \"../../speechrecorder/project/project\";\r\n\r\n\r\nexport const CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC=false;\r\n\r\nconst DEBUG_TRACE_LEVEL=0;\r\n\r\nconst ENABLE_AUDIO_WORKLET=true;\r\n\r\n// Super dirty way to load this module\r\n// Copy content of interceptor_worklet.js to this string\r\nconst awpStr=\"class AudioCaptureInterceptorProcessor extends AudioWorkletProcessor{\\n\" +\r\n \"\\n\" +\r\n \" BUFFER_QUANTUMS=64;\\n\" +\r\n \" QUANTUM_FRAME_LEN=128;\\n\" +\r\n \" BUFFER_FRAME_LEN=this.QUANTUM_FRAME_LEN*this.BUFFER_QUANTUMS;\\n\" +\r\n \" buffer=null;\\n\" +\r\n \" bufferPos=0;\\n\" +\r\n \" bufferPosBytes=0;\\n\" +\r\n \" constructor() {\\n\" +\r\n \" super();\\n\" +\r\n \"\\n\" +\r\n \" }\\n\" +\r\n \"\\n\" +\r\n \" process(\\n\" +\r\n \" inputs,\\n\" +\r\n \" outputs,\\n\" +\r\n \" parameters\\n\" +\r\n \" ){\\n\" +\r\n \"\\n\" +\r\n \" let inputsCnt=inputs.length;\\n\" +\r\n \" let channelCount=0;\\n\" +\r\n \" let inputLen=0;\\n\" +\r\n \" let inputLenBytes=0;\\n\" +\r\n \" if(inputsCnt>0) {\\n\" +\r\n \" let input0 = inputs[0];\\n\" +\r\n \" channelCount = input0.length;\\n\" +\r\n \" if (channelCount > 0) {\\n\" +\r\n \" let input0ch0=input0[0];\\n\" +\r\n \" inputLen=input0ch0.length;\\n\" +\r\n \" inputLenBytes=input0ch0.buffer.length;\\n\" +\r\n \" }\\n\" +\r\n \" }\\n\" +\r\n \" if (!this.buffer || this.buffer.length < channelCount) {\\n\" +\r\n \" this.buffer = new Array(channelCount);\\n\" +\r\n \" this.bufferPos = 0\\n\" +\r\n \" for (let bch = 0; bch < channelCount; bch++) {\\n\" +\r\n \" this.buffer[bch] = new Float32Array(this.BUFFER_FRAME_LEN);\\n\" +\r\n \" this.bufferPos = 0;\\n\" +\r\n \" this.bufferPosBytes=0;\\n\" +\r\n \" }\\n\" +\r\n \" }\\n\" +\r\n \" let bufAvail = this.BUFFER_FRAME_LEN - this.bufferPos;\\n\" +\r\n \" // check if buffer has to be transferred\\n\" +\r\n \" if (inputLen > bufAvail) {\\n\" +\r\n \" let ada=new Array(channelCount);\\n\" +\r\n \" for (let ch = 0; ch < channelCount; ch++) {\\n\" +\r\n \" ada[ch]=this.buffer[ch].buffer.slice(0);\\n\" +\r\n \" }\\n\" +\r\n \" this.port.postMessage({\\n\" +\r\n \" data: ada,\\n\" +\r\n \" chs: channelCount,\\n\" +\r\n \" len: this.bufferPos\\n\" +\r\n \" }, ada);\\n\" +\r\n \" // buffer transferred, reset\\n\" +\r\n \" this.bufferPos = 0;\\n\" +\r\n \" this.bufferPosBytes=0;\\n\" +\r\n \" }\\n\" +\r\n \"\\n\" +\r\n \" for(let ii=0;ii<inputsCnt;ii++) {\\n\" +\r\n \" for (let ch = 0; ch < channelCount; ch++) {\\n\" +\r\n \" // Mute outputs\\n\" +\r\n \" //outputs[ii][ch].fill(0);\\n\" +\r\n \" let chSamples = inputs[ii][ch];\\n\" +\r\n \" this.buffer[ch].set(chSamples,this.bufferPos);\\n\" +\r\n \" }\\n\" +\r\n \" this.bufferPos+=inputLen;\\n\" +\r\n \" this.bufferPosBytes+=inputLenBytes;\\n\" +\r\n \" }\\n\" +\r\n \" \\n\" +\r\n \" return true;\\n\" +\r\n \" }\\n\" +\r\n \"}\\n\" +\r\n \"\\n\" +\r\n \"registerProcessor('capture-interceptor',AudioCaptureInterceptorProcessor);\\n\";\r\n\r\n\r\n\r\n\r\nexport interface AudioCaptureListener {\r\n opened(): void;\r\n\r\n started(): void;\r\n\r\n stopped(): void;\r\n\r\n closed(): void;\r\n\r\n error(msg?:string,advice?:string): void;\r\n}\r\n\r\nexport class AudioCapture {\r\n get opened(): boolean {\r\n return this._opened;\r\n }\r\n\r\n static BUFFER_SIZE: number = 8192;\r\n context: AudioContext;\r\n stream!: MediaStream;\r\n channelCount!: number;\r\n mediaStream: any;\r\n agcStatus:boolean|null=null;\r\n bufferingNode: AudioNode|null=null;\r\n listener!: AudioCaptureListener;\r\n data!: Array<Array<Float32Array>>;\r\n currentSampleRate!: number;\r\n n: Navigator;\r\n audioOutStream: SequenceAudioFloat32OutStream | null=null;\r\n private disconnectStreams = true;\r\n private _opened=false;\r\n private capturing = false;\r\n\r\n framesRecorded: number=0;\r\n\r\n constructor(context: AudioContext) {\r\n this.context = context;\r\n this.n = navigator;\r\n }\r\n\r\n private initData() {\r\n this.data = new Array<Array<Float32Array>>();\r\n for (let i = 0; i < this.channelCount; i++) {\r\n this.data.push(new Array<Float32Array>());\r\n }\r\n this.framesRecorded = 0;\r\n }\r\n\r\n listDevices() {\r\n navigator.mediaDevices.enumerateDevices().then((l: MediaDeviceInfo[]) => this.printDevices(l));\r\n }\r\n\r\n private dummySession():Promise<MediaStream>{\r\n // workaround to request permissions:\r\n // Start a dummy session\r\n let mediaStrCnstrs = <MediaStreamConstraints>{audio:\r\n {echoCancelation: false}\r\n };\r\n return navigator.mediaDevices.getUserMedia(mediaStrCnstrs);\r\n\r\n }\r\n\r\n\r\n private stopAllSessionTracks(mediaStream:MediaStream){\r\n let ats = mediaStream.getTracks();\r\n for (let atIdx = 0; atIdx < ats.length; atIdx++) {\r\n //console.debug(\"Stop dummy session track: #\" + atIdx)\r\n ats[atIdx].stop();\r\n }\r\n }\r\n\r\n deviceInfos(cb: (deviceInfos: MediaDeviceInfo[] | null) => any, retry = true,dummyStream?:MediaStream) {\r\n\r\n navigator.mediaDevices.enumerateDevices().then((l: MediaDeviceInfo[]) => {\r\n let labelsAvailable = false;\r\n for (let i = 0; i < l.length; i++) {\r\n let di = l[i];\r\n if (di.label) {\r\n labelsAvailable = true;\r\n }\r\n }\r\n if (!labelsAvailable) {\r\n //console.debug(\"Media device enumeration: No labels.\")\r\n if (retry) {\r\n console.info(\"Starting dummy session to request audio permissions...\")\r\n\r\n this.dummySession().then((s: MediaStream) => {\r\n // and stop it immediately\r\n\r\n if(s) {\r\n //console.debug(\"Got dummy session stream: \" + s + \" .\")\r\n }else{\r\n //console.debug(\"No dummy stream\")\r\n }\r\n // retry (only once)\r\n this.deviceInfos(cb, false,s);\r\n },reason => {\r\n //console.debug(\"Dummy session rejected.\")\r\n // TODO error callback\r\n cb(null);\r\n });\r\n } else {\r\n cb(null);\r\n }\r\n } else {\r\n // success\r\n cb(l);\r\n }\r\n if(dummyStream){\r\n this.stopAllSessionTracks(dummyStream);\r\n }\r\n },(reason)=> {\r\n //rejected\r\n //console.debug(\"Media device enumeration rejected.\")\r\n if (retry) {\r\n //console.debug(\"Starting dummy session to request audio permissions...\")\r\n this.dummySession().then((s: MediaStream) => {\r\n // and stop it immediately\r\n //console.debug(\"Dummy session.\")\r\n if(s) {\r\n //console.debug(\"Got dummy session stream: \" + s + \" .\")\r\n }else{\r\n //console.debug(\"No dummy stream\")\r\n }\r\n // retry (only once)\r\n this.deviceInfos(cb, false,s);\r\n }, reason => {\r\n //console.debug(\"Dummy session rejected.\")\r\n // TODO error callback\r\n cb(null);\r\n });\r\n } else {\r\n cb(null);\r\n }\r\n if(dummyStream){\r\n this.stopAllSessionTracks(dummyStream);\r\n }\r\n });\r\n\r\n\r\n\r\n }\r\n\r\n\r\n printDevices(l: MediaDeviceInfo[]): void {\r\n let selDeviceId = '___dummy___';\r\n for (let i = 0; i < l.length; i++) {\r\n let di = l[i];\r\n\r\n console.log(\"Audio device: Id: \" + di.deviceId + \" groupId: \" + di.groupId + \" label: \" + di.label + \" kind: \" + di.kind);\r\n }\r\n }\r\n\r\n open(channelCount: number, selDeviceId?: ConstrainDOMString|undefined,autoGainControlConfigs?:Array<AutoGainControlConfig>|null|undefined){\r\n this.context.resume().then(()=>{\r\n this._open(channelCount,selDeviceId,autoGainControlConfigs);\r\n })\r\n }\r\n\r\n _open(channelCount: number, selDeviceId?: ConstrainDOMString|undefined,autoGainControlConfigs?:Array<AutoGainControlConfig>|null|undefined) {\r\n this.channelCount = channelCount;\r\n this.framesRecorded = 0;\r\n //var msc = new AudioStreamConstr();\r\n // var msc={};\r\n //msc.video = false;\r\n //msc.audio = true;\r\n\r\n // Chrome and Firefox stereo channels are identical !!\r\n // And even worse: The data coming from the source is already preprocessed on FF and Chrome. It contains DSP artifacts!!\r\n\r\n // https://bugs.chromium.org/p/chromium/issues/detail?id=387737\r\n // The workaround to set these constraints does _NOT_ help:\r\n //var msc={audio: {echoCancellation: false,channelCount: 2, googAudioMirroring: false},video: false};\r\n\r\n // Safari at least version 11: Support for media streams\r\n // TODO test if input is unprocessed\r\n\r\n let msc:MediaStreamConstraints;\r\n console.info('User agent: '+navigator.userAgent);\r\n\r\n\r\n let ua=UserAgentBuilder.userAgent();\r\n\r\n // ua.components.forEach((c)=>{\r\n // console.info(\"UA_Comp: \"+c.toString());\r\n // })\r\n\r\n let agcCfg:AutoGainControlConfig|null=null;\r\n\r\n let autoGainControl=false;\r\n let chromeEchoCancellation=false;\r\n if(autoGainControlConfigs){\r\n for(let agcc of autoGainControlConfigs){\r\n if(agcc.platform===CfgPlatform.Android && ua.detectedPlatform===Platform.Android){\r\n agcCfg=agcc;\r\n break;\r\n }\r\n if(agcc.platform===CfgPlatform.Windows && ua.detectedPlatform===Platform.Windows){\r\n agcCfg=agcc;\r\n break;\r\n }\r\n }\r\n if(agcCfg){\r\n // TODO use EXACT/IDEAL constraint\r\n autoGainControl=agcCfg.value;\r\n if(CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC){\r\n chromeEchoCancellation=agcCfg.value;\r\n }\r\n // TODO query real AGC status\r\n this.agcStatus=agcCfg.value;\r\n }else{\r\n this.agcStatus=false;\r\n }\r\n }\r\n\r\n // default\r\n msc = {\r\n audio: {\r\n deviceId: selDeviceId,\r\n echoCancellation: false,\r\n channelCount: channelCount,\r\n autoGainControl: autoGainControl\r\n },\r\n video: false\r\n };\r\n\r\n if (ua.detectedBrowser===Browser.Edge) {\r\n\r\n // Microsoft Edge sends unmodified audio\r\n // The constraint can follow the specification\r\n console.info(\"Setting media track constraints for Microsoft Edge.\");\r\n msc = {\r\n audio: {\r\n deviceId: selDeviceId,\r\n echoCancellation: false,\r\n channelCount: channelCount,\r\n autoGainControl: autoGainControl\r\n },\r\n video: false\r\n };\r\n } else if (ua.detectedBrowser===Browser.Chrome) {\r\n // Google Chrome: we need to switch of each of the preprocessing units including the\r\n console.info(\"Setting media track constraints for Google Chrome.\");\r\n\r\n // Chrome 60 -> 61 changed\r\n // it works now without mandatory/optional sub-objects\r\n\r\n\r\n // Requires at least Chrome 61\r\n msc = {\r\n audio: {\r\n deviceId: selDeviceId,\r\n channelCount: channelCount,\r\n echoCancellation: {exact:chromeEchoCancellation},\r\n autoGainControl: {exact:autoGainControl},\r\n sampleSize:{min: 16},\r\n },\r\n video: false,\r\n }\r\n\r\n } else if (ua.detectedBrowser===Browser.Firefox) {\r\n console.info(\"Setting media track constraints for Mozilla Firefox.\");\r\n // Firefox\r\n msc = {\r\n audio: {\r\n deviceId: selDeviceId,\r\n channelCount: channelCount,\r\n echoCancellation: false,\r\n autoGainControl: autoGainControl,\r\n noiseSuppression: false\r\n },\r\n video: false,\r\n }\r\n\r\n } else if (ua.detectedBrowser===Browser.Safari) {\r\n console.info(\"Setting media track constraints for Safari browser.\")\r\n console.info(\"Apply workaround for Safari: Avoid disconnect of streams.\");\r\n\r\n this.disconnectStreams = false;\r\n msc = {\r\n audio: {\r\n deviceId: selDeviceId,\r\n channelCount: channelCount,\r\n echoCancellation: false\r\n },\r\n video: false,\r\n }\r\n\r\n } else {\r\n\r\n // TODO default constraints or error Browser not supported\r\n }\r\n\r\n\r\n\r\n console.debug(\"Audio capture, AGC: \"+this.agcStatus)\r\n\r\n\r\n let ump = navigator.mediaDevices.getUserMedia(msc);\r\n ump.then((s) => {\r\n this.stream = s;\r\n\r\n let aTracks = s.getAudioTracks();\r\n\r\n for (let i = 0; i < aTracks.length; i++) {\r\n let aTrack = aTracks[i];\r\n\r\n console.info(\"Track audio info: id: \" + aTrack.id + \" kind: \" + aTrack.kind + \" label: \\\"\" + aTrack.label + \"\\\"\");\r\n let mtrSts=aTrack.getSettings();\r\n\r\n // Typescript lib.dom.ts MediaTrackSettings.channelCount is missing\r\n // https://github.com/mdn/browser-compat-data/blob/5493d8f937e05b2ddbd41b99f5bdfad4a1f2ed85/api/MediaTrackSettings.json\r\n //@ts-ignore\r\n console.info(\"Track audio settings: Ch cnt: \"+mtrSts.channelCount+\", AGC: \"+mtrSts.autoGainControl+\", Echo cancell.: \"+mtrSts.echoCancellation);\r\n if(mtrSts.autoGainControl){\r\n this.agcStatus=mtrSts.autoGainControl;\r\n }\r\n }\r\n\r\n let vTracks = s.getVideoTracks();\r\n for (let i = 0; i < vTracks.length; i++) {\r\n let vTrack = vTracks[i];\r\n console.info(\"Track video info: id: \" + vTrack.id + \" kind: \" + vTrack.kind + \" label: \" + vTrack.label);\r\n }\r\n this.mediaStream = this.context.createMediaStreamSource(s);\r\n // stream channel count ( is always 2 !)\r\n let streamChannelCount: number = this.mediaStream.channelCount;\r\n console.info(\"Stream channel count: \"+streamChannelCount);\r\n // is not set!!\r\n //this.currentSampleRate = this.mediaStream.sampleRate;\r\n this.currentSampleRate = this.context.sampleRate;\r\n console.info(\"Source audio node: channels: \" + streamChannelCount + \" samplerate: \" + this.currentSampleRate);\r\n if (this.audioOutStream) {\r\n this.audioOutStream.setFormat(this.channelCount, this.currentSampleRate);\r\n }\r\n // W3C -> new name is createScriptProcessor\r\n //\r\n // Again deprecated, but AudioWorker not yet implemented in stable releases (June 2016)\r\n // AudioWorker is now AudioWorkletProcessor ... (May 2017)\r\n\r\n // Update 12-2020:\r\n // The ScriptProcessorNode Interface - DEPRECATED\r\n\r\n // Update 06-2021\r\n // AudioWorkletProcessor is here to stay. Web Audio API has now Recommendation status !\r\n\r\n if(ENABLE_AUDIO_WORKLET && this.context.audioWorklet){\r\n //const workletFileName = ('file-loader!./interceptor_worklet.js');\r\n //const workletFileName = 'http://localhost:4200/assets/interceptor_worklet.js';\r\n //console.log(awpStr);\r\n let audioWorkletModuleBlob= new Blob([awpStr], {type: 'text/javascript'});\r\n\r\n let audioWorkletModuleBlobUrl=window.URL.createObjectURL(audioWorkletModuleBlob);\r\n\r\n this.context.audioWorklet.addModule(audioWorkletModuleBlobUrl).then(()=> {\r\n const awn = new AudioWorkletNode(this.context, 'capture-interceptor');\r\n awn.onprocessorerror=(ev:Event)=>{\r\n let msg='Unknwon error';\r\n if(ev instanceof ErrorEvent){\r\n msg=ev.message;\r\n }\r\n console.error(\"Capture audio worklet error: \"+msg);\r\n if(this.listener){\r\n this.listener.error(msg);\r\n }\r\n }\r\n let awnPt = awn.port;\r\n if (awnPt) {\r\n awnPt.onmessage = (ev: MessageEvent<any>) => {\r\n if (this.capturing) {\r\n let dt=ev.data;\r\n let chs = dt.chs;\r\n let adaLen = dt.data.length;\r\n if(DEBUG_TRACE_LEVEL>8) {\r\n console.debug('Received data from worklet: ' +chs + ' ' + dt.len +' Data chs: '+adaLen);\r\n }\r\n //let chunkLen = adaLen / chs;\r\n let chunkLen = adaLen;\r\n let chunk = new Array<Float32Array>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n if (this.data && this.data[ch]) {\r\n let adaPos = ch * chunkLen;\r\n if(dt.data[ch]) {\r\n let fa = new Float32Array(dt.data[ch]);\r\n this.data[ch].push(fa);\r\n chunk[ch] = fa;\r\n // Use samples of channel 0 to count frames (samples)\r\n if (ch == 0) {\r\n this.framesRecorded += fa.length;\r\n }\r\n }else{\r\n if(DEBUG_TRACE_LEVEL>8) {\r\n console.debug('Channel '+ch+' data not set!!');\r\n }\r\n }\r\n }\r\n }\r\n if (this.audioOutStream) {\r\n this.audioOutStream.write(chunk);\r\n }\r\n }\r\n };\r\n }\r\n this.bufferingNode = awn;\r\n this._opened = true;\r\n if (this.listener) {\r\n this.listener.opened();\r\n }\r\n }\r\n ).catch((error: any)=>{\r\n console.log('Could not add module '+error);\r\n });\r\n\r\n }else if(this.context.createScriptProcessor) {\r\n // The ScriptProcessorNode Interface - DEPRECATED Only as fallback\r\n // TODO should we use streamChannelCount or channelCount here ?\r\n let scriptProcessorNode= this.context.createScriptProcessor(AudioCapture.BUFFER_SIZE, streamChannelCount, streamChannelCount);\r\n this.bufferingNode=scriptProcessorNode;\r\n let c = 0;\r\n if(scriptProcessorNode.onaudioprocess){\r\n scriptProcessorNode.onaudioprocess = (e: AudioProcessingEvent) => {\r\n\r\n if (this.capturing) {\r\n let inBuffer = e.inputBuffer;\r\n let duration = inBuffer.duration;\r\n // only process requested count of channels\r\n let currentBuffers = new Array<Float32Array>(channelCount);\r\n for (let ch: number = 0; ch < channelCount; ch++) {\r\n let chSamples = inBuffer.getChannelData(ch);\r\n let chSamplesCopy = chSamples.slice(0);\r\n currentBuffers[ch] = chSamplesCopy.slice(0);\r\n this.data[ch].push(chSamplesCopy);\r\n if(DEBUG_TRACE_LEVEL>8){\r\n console.debug(\"Process \"+chSamplesCopy.length+\" samples.\");\r\n }\r\n this.framesRecorded += chSamplesCopy.length;\r\n }\r\n c++;\r\n if (this.audioOutStream) {\r\n this.audioOutStream.write(currentBuffers);\r\n }\r\n }\r\n };\r\n this._opened = true;\r\n if (this.listener) {\r\n this.listener.opened();\r\n }\r\n }else{\r\n this.listener.error('Browser does not support audio processing (ScriptProcessor.onaudioprocess method not found)!');\r\n }\r\n }else{\r\n this.listener.error('Browser does not support audio processing (neither AudioWorkletProcessor nor ScriptProcessor)!');\r\n }\r\n }, (e) => {\r\n console.error(e + \" Error name: \" +e.name);\r\n if (this.listener) {\r\n if('NotAllowedError' === e.name){\r\n this.listener.error('Not allowed to use your microphone.','Please make sure that microphone access is allowed for this web page and reload the page.');\r\n }else if('NotReadableError' === e.name){\r\n this.listener.error('Could not read from your audio device.','Please make sure your audio device is working.');\r\n }else if('OverconstrainedError' === e.name){\r\n let eMsg=e.msg?e.msg:'Overconstrained media device request error.';\r\n this.listener.error(eMsg);\r\n } else {\r\n this.listener.error();\r\n }\r\n }\r\n }\r\n )\r\n }\r\n\r\n start() {\r\n\r\n this.initData();\r\n if (this.audioOutStream) {\r\n this.audioOutStream.nextStream()\r\n }\r\n this.capturing = true;\r\n if(this.bufferingNode) {\r\n this.mediaStream.connect(this.bufferingNode);\r\n this.bufferingNode.connect(this.context.destination);\r\n }\r\n if (this.listener) {\r\n this.listener.started();\r\n }\r\n\r\n }\r\n\r\n stop() {\r\n\r\n if (this.disconnectStreams && this.bufferingNode) {\r\n this.mediaStream.disconnect(this.bufferingNode);\r\n this.bufferingNode.disconnect(this.context.destination);\r\n }\r\n\r\n if (this.audioOutStream) {\r\n this.audioOutStream.flush();\r\n }\r\n this.capturing = false;\r\n if (this.listener) {\r\n this.listener.stopped();\r\n }\r\n }\r\n\r\n\r\n close() {\r\n this.mediaStream.disconnect();\r\n if (this.stream) {\r\n //this.stream.stop();\r\n //'MediaStream.stop()' is deprecated and will be removed in M47, around November 2015. Please use 'MediaStream.active' instead.\r\n //this.stream.active=false;\r\n var mts = this.stream.getTracks();\r\n for (var i = 0; i < mts.length; i++) {\r\n mts[i].stop();\r\n }\r\n }\r\n this._opened=false;\r\n }\r\n\r\n audioBuffer(): AudioBuffer {\r\n var frameLen: number = 0;\r\n var ch0Data = this.data[0];\r\n\r\n for (var ch0Chk of ch0Data) {\r\n frameLen += ch0Chk.length;\r\n }\r\n var ab = this.context.createBuffer(this.channelCount, frameLen, this.context.sampleRate);\r\n for (var ch = 0; ch < this.channelCount; ch++) {\r\n\r\n var chD = ab.getChannelData(ch);\r\n var pos = 0;\r\n for (var chChk of this.data[ch]) {\r\n var bufLen = chChk.length;\r\n chD.set(chChk, pos);\r\n pos += bufLen;\r\n }\r\n }\r\n return ab;\r\n }\r\n}\r\n\r\n","\n\n export class WavFileFormat {\n static RIFF_KEY:string = 'RIFF';\n static WAV_KEY:string = 'WAVE';\n static PCM:number = 0x0001;\n }\n\n\n\n\n","\n export class BinaryByteWriter {\n static DEFAULT_SIZE_INC = 1024;\n buf: ArrayBuffer;\n private _pos: number;\n\n constructor() {\n const size = BinaryByteWriter.DEFAULT_SIZE_INC;\n this.buf = new ArrayBuffer(size);\n this._pos = 0;\n }\n\n get pos(): number {\n return this._pos;\n }\n\n ensureCapacity(numBytes: number) {\n\n while ( this._pos + numBytes >= this.buf.byteLength ) {\n // buffer increment\n let inc = BinaryByteWriter.DEFAULT_SIZE_INC;\n if (inc < numBytes) {\n inc = numBytes;\n }\n const newSize = this.buf.byteLength + inc;\n\n const arrOld = new Uint8Array(this.buf, 0, this._pos);\n const arrNew = new Uint8Array(newSize);\n arrNew.set(arrOld);\n this.buf = arrNew.buffer;\n }\n }\n\n writeUint8(val: number): void {\n this.ensureCapacity(1);\n const valView = new DataView(this.buf, this._pos, 1);\n valView.setUint8(0, val);\n this._pos++;\n }\n\n writeUint16(val: number, le: boolean): void {\n this.ensureCapacity(2);\n const valView = new DataView(this.buf, this._pos, 2);\n valView.setUint16(0, val, le);\n this._pos += 2;\n\n }\n writeInt16(val: number, le: boolean): void {\n this.ensureCapacity(2);\n const valView = new DataView(this.buf, this._pos, 2);\n valView.setInt16(0, val, le);\n this._pos += 2;\n }\n\n\n writeUint32(val: number, le: boolean): void {\n this.ensureCapacity(4);\n const valView = new DataView(this.buf, this._pos, 4);\n valView.setUint32(0, val, le);\n this._pos += 4;\n }\n\n writeInt32(val: number, le: boolean): void {\n this.ensureCapacity(4);\n const valView = new DataView(this.buf, this._pos, 4);\n valView.setInt32(0, val, le);\n this._pos += 4;\n }\n finish(): Uint8Array {\n const finalArr = new Uint8Array(this._pos);\n const dv = new DataView(this.buf, 0, this._pos);\n for (let i = 0; i < this._pos; i++) {\n finalArr[i] = dv.getUint8(i);\n }\n return finalArr;\n }\n\n writeAscii(text: string): void {\n let i;\n for (i = 0; i < text.length; i++) {\n const asciiCode = text.charCodeAt(i);\n if (asciiCode < 0 || asciiCode > 255) {\n throw new Error('Not an ASCII character at char ' + i + ' in ' + text);\n }\n this.writeUint8(asciiCode);\n }\n }\n\n }\n\n","\r\n export class UUID {\r\n\r\n static generate():string {\r\n return UUID.s4() + UUID.s4() + '-' + UUID.s4() + '-' + UUID.s4() + '-' +\r\n UUID.s4() + '-' + UUID.s4() + UUID.s4() + UUID.s4();\r\n }\r\n\r\n private static s4() {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n }\r\n }\r\n\r\n export class Arrays {\r\n\r\n static cloneNumberArray(numberArray: Array<number>): Array<number> {\r\n let len = numberArray.length;\r\n let cloneArr = new Array<number>(len);\r\n for (let c = 0; c < numberArray.length; c++) {\r\n cloneArr[c] = numberArray[c];\r\n }\r\n return cloneArr;\r\n }\r\n\r\n static swap<T>(items:Array<T>, i:number, j:number) {\r\n let tmp = items[i];\r\n items[i] = items[j];\r\n items[j] = tmp;\r\n }\r\n\r\n static shuffleArray<T>(orgArray:Array<T>):Array<T>{\r\n let shuffledArray = [...orgArray];\r\n for (let i = shuffledArray.length; i > 1; i--) {\r\n let rnd=Math.random();\r\n let rndArrIdx=Math.floor(rnd*i);\r\n Arrays.swap(shuffledArray, i - 1, rndArrIdx);\r\n }\r\n return shuffledArray;\r\n }\r\n }\r\n\r\n export class WorkerHelper {\r\n\r\n static DEBUG=false;\r\n static buildWorkerBlobURL(workerFct: Function): string {\r\n\r\n if(! (workerFct instanceof Function)) {\r\n throw new Error(\r\n 'Parameter workerFct is not a function! (XSS attack?).'\r\n )\r\n }\r\n let woFctNm = workerFct.name\r\n if (WorkerHelper.DEBUG) {\r\n console.info(\"Worker method name: \" + woFctNm)\r\n }\r\n\r\n let woFctStr = workerFct.toString()\r\n if (WorkerHelper.DEBUG) {\r\n console.info(\"Worker method string:\")\r\n console.info(woFctStr)\r\n }\r\n\r\n\r\n // Make sure code starts with \"function()\"\r\n\r\n // Chrome, Firefox: \"[wofctNm](){...}\", Safari: \"function [wofctNm](){...}\"\r\n // we need an anonymous function: \"function() {...}\"\r\n let piWoFctStr = woFctStr.replace(/^function +/, '');\r\n\r\n if(WorkerHelper.DEBUG){\r\n console.info(\"Worker platform independent function string:\")\r\n console.info(piWoFctStr)\r\n }\r\n\r\n // Convert to anonymous function\r\n let anonWoFctStr = piWoFctStr.replace(woFctNm + '()', 'function()')\r\n if(WorkerHelper.DEBUG){\r\n console.info(\"Worker anonymous function string:\")\r\n console.info(piWoFctStr)\r\n }\r\n // Self executing\r\n let ws = '(' + anonWoFctStr + ')();'\r\n if(WorkerHelper.DEBUG){\r\n console.info(\"Worker self executing anonymous function string:\")\r\n console.info(anonWoFctStr)\r\n }\r\n // Build the worker blob\r\n let wb = new Blob([ws], {type: 'text/javascript'});\r\n\r\n let workerBlobUrl=window.URL.createObjectURL(wb);\r\n return workerBlobUrl;\r\n }\r\n }\r\n","import { WavFileFormat } from './wavformat'\r\nimport { PCMAudioFormat } from '../format'\r\nimport { BinaryByteWriter } from '../../io/BinaryWriter'\r\nimport {WorkerHelper} from \"../../utils/utils\";\r\ndeclare function postMessage (message:any, transfer:Array<any>):void;\r\n\r\n\r\n export class WavWriter {\r\n\r\n static PCM:number = 1;\r\n static DEFAULT_SAMPLE_SIZE_BYTES:number = 2;\r\n private bw:BinaryByteWriter;\r\n private format:PCMAudioFormat|null=null;\r\n private dataLength:number|null=null;\r\n private workerURL: string|null=null;\r\n\r\n constructor() {\r\n this.bw = new BinaryByteWriter();\r\n }\r\n\r\n /*\r\n * Method used as worker code.\r\n */\r\n workerFunction() {\r\n self.onmessage = function (msg:MessageEvent) {\r\n\r\n let bufLen=msg.data.frameLength * msg.data.chs;\r\n let valView = new DataView(msg.data.buf,msg.data.bufPos);\r\n\r\n let bufPos = 0;\r\n let hDynIntRange = 1 << (msg.data.sampleSizeInBits - 1);\r\n for (let s = 0; s < msg.data.frameLength; s++) {\r\n // interleaved channel data\r\n\r\n for (let ch = 0; ch < msg.data.chs; ch++) {\r\n let srcPos=(ch*msg.data.frameLength)+s;\r\n let valFlt = msg.data.audioData[srcPos];\r\n let valInt = Math.round(valFlt * hDynIntRange);\r\n valView.setInt16(bufPos, valInt, true);\r\n bufPos+=2;\r\n }\r\n }\r\n postMessage({buf:msg.data.buf}, [msg.data.buf]);\r\n //self.close()\r\n }\r\n }\r\n\r\n\r\n writeFmtChunk(audioBuffer:AudioBuffer){\r\n\r\n this.bw.writeUint16(WavFileFormat.PCM,true);\r\n let frameSize=WavWriter.DEFAULT_SAMPLE_SIZE_BYTES*audioBuffer.numberOfChannels; // fixed 16-bit for now\r\n this.bw.writeUint16(audioBuffer.numberOfChannels,true);\r\n this.bw.writeUint32(audioBuffer.sampleRate,true);\r\n // dwAvgBytesPerSec\r\n this.bw.writeUint32(frameSize*audioBuffer.sampleRate,true);\r\n this.bw.writeUint16(frameSize,true);\r\n // sample size in bits (PCM format only)\r\n this.bw.writeUint16(WavWriter.DEFAULT_SAMPLE_SIZE_BYTES*8,true);\r\n }\r\n\r\n writeDataChunk(audioBuffer:AudioBuffer){\r\n\r\n let chData0=audioBuffer.getChannelData(0);\r\n let dataLen=chData0.length;\r\n let hDynIntRange=1 << ((WavWriter.DEFAULT_SAMPLE_SIZE_BYTES*8)-1);\r\n for(let s=0;s<dataLen;s++) {\r\n // interleaved channel data\r\n for (let ch = 0; ch < audioBuffer.numberOfChannels; ch++) {\r\n let chData = audioBuffer.getChannelData(ch);\r\n let valFlt=chData[s];\r\n let valInt=Math.round(valFlt*hDynIntRange);\r\n this.bw.writeInt16(valInt,true);\r\n }\r\n }\r\n\r\n }\r\n\r\n writeChunkHeader(name:string,chkLen:number){\r\n this.bw.writeAscii(name);\r\n this.bw.writeUint32(chkLen,true);\r\n }\r\n\r\n writeAsync(audioBuffer:AudioBuffer,callback: (wavFileData:Uint8Array)=> any){\r\n\r\n let dataChkByteLen=this.writeHeader(audioBuffer);\r\n if (!this.workerURL) {\r\n this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction)\r\n }\r\n let wo = new Worker(this.workerURL);\r\n\r\n let chs = audioBuffer.numberOfChannels;\r\n\r\n let frameLength = audioBuffer.getChannelData(0).length;\r\n let ad = new Float32Array(chs * frameLength);\r\n for (let ch = 0; ch < chs; ch++) {\r\n ad.set(audioBuffer.getChannelData(ch), ch * frameLength);\r\n }\r\n // ensureCapacity blocks !!!\r\n this.bw.ensureCapacity(dataChkByteLen);\r\n wo.onmessage = (me) => {\r\n callback(me.data.buf);\r\n wo.terminate();\r\n }\r\n //TODO Fixed sample size of 16 bits\r\n wo.postMessage({sampleSizeInBits:16, chs: chs, frameLength: frameLength, audioData: ad,buf:this.bw.buf,bufPos:this.bw.pos}, [ad.buffer,this.bw.buf]);\r\n\r\n }\r\n\r\n write(audioBuffer:AudioBuffer):Uint8Array{\r\n this.writeHeader(audioBuffer);\r\n this.writeDataChunk(audioBuffer);\r\n return this.bw.finish();\r\n }\r\n\r\n\r\n writeHeader(audioBuffer:AudioBuffer):number{\r\n\r\n this.bw.writeAscii(WavFileFormat.RIFF_KEY);\r\n let dataChkByteLen=audioBuffer.getChannelData(0).length*WavWriter.DEFAULT_SAMPLE_SIZE_BYTES*audioBuffer.numberOfChannels;\r\n let wavChunkByteLen=(4+4)*3+16+dataChkByteLen;\r\n let wavFileDataByteLen=wavChunkByteLen+8;\r\n\r\n this.bw.writeUint32(wavChunkByteLen,true); // must be set to file length-8 later\r\n this.bw.writeAscii(WavFileFormat.WAV_KEY);\r\n this.writeChunkHeader('fmt ',16);\r\n this.writeFmtChunk(audioBuffer);\r\n this.writeChunkHeader('data',dataChkByteLen);\r\n return dataChkByteLen;\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n","\r\nexport type Mode = \"MANUAL\" | \"AUTOPROGRESS\" | \"AUTORECORDING\";\r\nexport type PromptPhase = \"IDLE\" | \"PRERECORDING\" | \"PRERECORDINGONLY\" | \"RECORDING\";\r\n\r\nexport type Order = 'SEQUENTIAL' | 'RANDOM' | 'RANDOMIZED';\r\n\r\nexport type Decoration ='underline'\r\nexport type Style ='italic' | 'normal'\r\nexport type FontWeight='normal' | 'bold'\r\nexport type BlockType='p';\r\nexport type TextType='text' | 'font';\r\n\r\nexport interface Recinstructions{\r\n recinstructions:string;\r\n}\r\n\r\nexport interface Text {\r\n type: TextType,\r\n color? : string,\r\n decoration? : Decoration,\r\n size?: string,\r\n weight?: FontWeight,\r\n style?: Style,\r\n text : string | Text;\r\n}\r\n\r\nexport interface Block {\r\n type: BlockType,\r\n texts: Array<Text>\r\n}\r\nexport interface Body{\r\n blocks?: Array<Block>,\r\n}\r\n\r\nexport interface PromptDoc{\r\n body?: Body\r\n}\r\n\r\nexport interface Mediaitem {\r\n text?: string,\r\n src?: string,\r\n promptDoc?: PromptDoc,\r\n mimetype?:string,\r\n defaultVirtualViewBox?:VirtualViewBox,\r\n alt?:string\r\n}\r\n\r\nexport interface PromptItem {\r\n type?:string;\r\n itemcode?: string,\r\n prerecording: number,\r\n recduration?: number,\r\n postrecording: number,\r\n recinstructions?: Recinstructions,\r\n mediaitems: Array<Mediaitem>\r\n}\r\n\r\nexport interface Group {\r\n order?:Order;\r\n promptItems: Array<PromptItem>;\r\n _shuffledPromptItems: Array<PromptItem>;\r\n}\r\n\r\nexport interface Section {\r\n mode: Mode;\r\n promptphase: PromptPhase;\r\n order?: Order;\r\n training: boolean;\r\n groups: Array<Group>;\r\n _shuffledGroups: Array<Group>;\r\n}\r\n\r\nexport interface VirtualViewBox{\r\n height:number;\r\n}\r\n\r\nexport interface Script {\r\n virtualViewBox?:VirtualViewBox;\r\n sections: Array<Section>;\r\n}\r\n\r\nexport class PromptDocUtil{\r\n\r\n static toPlainTextString(promptDoc:PromptDoc):string{\r\n let pt=\"\";\r\n let b=promptDoc.body;\r\n if(b!=null) {\r\n let blks=b.blocks\r\n if(blks) {\r\n for(let bli=0;bli<blks.length;bli++){\r\n let blk=blks[bli];\r\n let txts=blk.texts;\r\n for(let ti=0;ti<txts.length;ti++){\r\n let txtEl=txts[ti];\r\n let txt =txtEl.text;\r\n if( txtEl.type === 'font'){\r\n if(typeof txt === 'string'){\r\n pt = pt.concat(<string>txt);\r\n }else{\r\n let subTxtEl=<Text>txt;\r\n let subTxt=subTxtEl.text;\r\n if(typeof subTxt === 'string') {\r\n pt=pt.concat(subTxt);\r\n }\r\n }\r\n }else if(typeof txt === 'string'){\r\n pt = pt.concat(<string>txt);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return pt;\r\n }\r\n}\r\n\r\nexport class MediaitemUtil {\r\n static toPlainTextString(mediaitem: Mediaitem): string|null {\r\n\r\n let txt = mediaitem.text;\r\n let pd = mediaitem.promptDoc;\r\n if (txt == null) {\r\n let pt = null;\r\n if (pd != null) {\r\n pt = PromptDocUtil.toPlainTextString(pd);\r\n }\r\n return pt;\r\n } else {\r\n return txt;\r\n }\r\n }\r\n\r\n static description(mi: Mediaitem): string {\r\n let description = \"\";\r\n\r\n if (mi.alt != null) {\r\n description = description.concat(mi.alt)\r\n } else {\r\n let src = mi.src;\r\n let mimeType = mi.mimetype;\r\n if (!mimeType) {\r\n mimeType = 'text/plain';\r\n }\r\n if (mimeType.startsWith(\"image\")) {\r\n description = description.concat(\"IMAGE: \");\r\n } else if (mimeType.startsWith(\"audio\")) {\r\n description = description.concat(\"AUDIO: \");\r\n } else if (mimeType.startsWith(\"video\")) {\r\n description = description.concat(\"VIDEO: \");\r\n }\r\n let promptText = MediaitemUtil.toPlainTextString(mi);\r\n if (promptText != null) {\r\n description = description.concat(promptText);\r\n } else if (src != null) {\r\n let srcPn;\r\n try {\r\n let srcUrl = new URL(src);\r\n srcPn=srcUrl.pathname;\r\n }catch{\r\n srcPn=src;\r\n }\r\n\r\n // Get filename without extension\r\n let srcFnM=srcPn.match(/([^\\/]*)$/);\r\n if(srcFnM && srcFnM.length==2){\r\n let srcFn=srcFnM[1];\r\n let srcFnNm=srcFn.replace(/[\\.][^\\.]*/,'');\r\n description = description.concat(srcFnNm);\r\n }\r\n }\r\n }\r\n return description;\r\n }\r\n}\r\n\r\nexport class PromptitemUtil {\r\n static toPlainTextString(promptItem: PromptItem): string {\r\n\r\n let mis = promptItem.mediaitems;\r\n let description = \"\";\r\n if (mis) {\r\n\r\n let misSize = mis.length;\r\n for (let i = 0; i < misSize; i++) {\r\n let mi = mis[i];\r\n description = description.concat(MediaitemUtil.description(mi));\r\n if (i + 1 < misSize) {\r\n // not last item\r\n description = description.concat(\", \");\r\n }\r\n }\r\n }\r\n return description;\r\n }\r\n}\r\n\r\n\r\n","import { UUID } from '../utils/utils'\r\nimport {PromptItem} from \"./script/script\";\r\n\r\nexport interface RecordingFileDescriptor {\r\n recording:PromptItem;\r\n version:number;\r\n}\r\n\r\nexport class RecordingFileDescriptorImpl {\r\n recording!:PromptItem;\r\n version!:number;\r\n constructor() {}\r\n}\r\n\r\nexport class RecordingFile {\r\n recordingFileId: string | number | null= null;\r\n uuid:string|null=null;\r\n date: string|null=null;\r\n _dateAsDateObj:Date|null=null;\r\n startedDate: string|null=null;\r\n _startedAsDateObj?:Date|null=null;\r\n audioBuffer:AudioBuffer|null=null;\r\n session:string|number|null=null;\r\n frames:number|null=null;\r\n editSampleRate:number|null=null;\r\n editStartFrame:number|null=null\r\n editEndFrame:number|null=null\r\n\r\n constructor(uuid:string,sessionId:string|number,audioBuffer:AudioBuffer|null) {\r\n this.session=sessionId;\r\n this.audioBuffer=audioBuffer;\r\n this.uuid=uuid;\r\n }\r\n\r\n filenameString():string{\r\n let fns:string='';\r\n if(this.session){\r\n fns+=this.session;\r\n fns+='_';\r\n }\r\n fns+=this.uuid;\r\n return fns;\r\n }\r\n}\r\n\r\n export class SprRecordingFile extends RecordingFile implements RecordingFileDescriptor{\r\n\r\n itemCode:string;\r\n\r\n recording!:PromptItem;\r\n version!:number;\r\n\r\n constructor(sessionId:string|number,itemcode:string,version:number,audioBuffer:AudioBuffer|null) {\r\n super(UUID.generate(),sessionId,audioBuffer);\r\n this.session=sessionId;\r\n this.itemCode=itemcode;\r\n this.version=version;\r\n this.audioBuffer=audioBuffer;\r\n }\r\n\r\n filenameString():string{\r\n let fns:string='';\r\n if(this.session){\r\n fns+=this.session;\r\n fns+='_';\r\n }\r\n if(this.itemCode){\r\n fns+=this.itemCode;\r\n fns+='_';\r\n }\r\n fns+=this.uuid;\r\n return fns;\r\n }\r\n }\r\n\r\n","\r\n import {HttpClient, HttpErrorResponse} from \"@angular/common/http\";\r\n import { timeout } from 'rxjs/operators'\r\n\r\n // state of an upload\r\n export enum UploadStatus {IDLE = 1, UPLOADING = 2, ABORT = 3, DONE = 0, ERR = -1}\r\n\r\n // state of the uploader\r\n // TRY_UPLOADING is uploading state after an error (for example if disconnected from server)\r\n export enum UploaderStatus { DONE = 0, UPLOADING = 1, TRY_UPLOADING = 2,NEXT = 3, ERR = -1}\r\n\r\n export class UploaderStatusChangeEvent {\r\n private _sizeQueued:number;\r\n private _sizeDone:number;\r\n private _status: UploaderStatus;\r\n\r\n\r\n constructor(sizeQueued: number, sizeDone: number, status: UploaderStatus) {\r\n this._sizeQueued = sizeQueued;\r\n this._sizeDone = sizeDone;\r\n this._status = status;\r\n }\r\n\r\n get sizeQueued():number {\r\n return this._sizeQueued;\r\n }\r\n\r\n get sizeDone():number {\r\n return this._sizeDone;\r\n }\r\n\r\n get status(): UploaderStatus {\r\n return this._status;\r\n }\r\n\r\n uploadDone(): boolean {\r\n return (this._sizeDone >= this._sizeQueued);\r\n }\r\n\r\n percentDone(): number {\r\n if (this._sizeQueued == 0) {\r\n // no data queued, we are \"done\"\r\n return 100;\r\n }\r\n let percent = Math.floor(this._sizeDone * 100 / this._sizeQueued);\r\n //console.log(\"Upload status: queued: \"+this._sizeQueued+\", done: \"+this._sizeDone+\", \"+percent+\"%\")\r\n return percent;\r\n }\r\n\r\n }\r\n\r\n export class Upload {\r\n\r\n private _data:Blob|FormData;\r\n private _url:string;\r\n status: UploadStatus;\r\n\r\n constructor(blob:Blob|FormData, url:string) {\r\n this._data = blob;\r\n this._url = url;\r\n this.status = UploadStatus.IDLE;\r\n }\r\n\r\n get url():string {\r\n return this._url;\r\n }\r\n\r\n get data():Blob|FormData {\r\n return this._data;\r\n }\r\n\r\n public toString = () : string => {\r\n let s=`Upload: Status: ${this.status}, URL: ${this._url}`;\r\n if(this._data instanceof Blob){\r\n s=s+`, Size: ${this._data.size}`;\r\n }else if(this._data instanceof FormData){\r\n // TODO (iterate through parts ??)\r\n }\r\n return s;\r\n }\r\n }\r\n\r\n export class Uploader {\r\n POST_MIN_TIMEOUT = 120000; // 2min plus ...\r\n POST_TIMEOUT_PER_KB = 1000; // ... 1s per kB\r\n\r\n RETRY_DELAY: number = 30000; // retry every 30s\r\n DEBUG_DELAY: number = 0;\r\n //DEBUG_DELAY:number=0;\r\n private status: UploaderStatus = UploaderStatus.DONE;\r\n private que: Array<Upload>;\r\n listener: ((ue: UploaderStatusChangeEvent) => void) | null = null;\r\n private _sizeQueued: number = 0;\r\n private _sizeDone: number = 0;\r\n\r\n private retryTimerRunning = false;\r\n private retryTimerId: number | null = null;\r\n\r\n private te:TextEncoder=new TextEncoder();\r\n\r\n constructor(private http: HttpClient, private withCredentials: boolean = false) {\r\n this.que = new Array<Upload>();\r\n }\r\n\r\n private dataSize(dt:Blob|FormData){\r\n let si=0;\r\n if(dt instanceof Blob){\r\n si=dt.size;\r\n }else if(dt instanceof FormData){\r\n dt.forEach((v,k)=>{\r\n if(v instanceof File){\r\n si+=v.size;\r\n }else if(typeof v ==='string'){\r\n // encode to UT-f8 to get upload size\r\n si+= this.te.encode().length;\r\n }\r\n })\r\n }\r\n return si;\r\n }\r\n\r\n private uploadDone(ul:Upload) {\r\n\r\n ul.status = UploadStatus.DONE;\r\n\r\n // remove upload from queue\r\n for (let i = 0; i < this.que.length; i++) {\r\n if (this.que[i] === ul) {\r\n // found, remove\r\n this.que.splice(i, 1);\r\n let ulSize = this.dataSize(ul.data);\r\n this._sizeDone += ulSize;\r\n break;\r\n }\r\n }\r\n // set to done for now...\r\n this.status = UploaderStatus.NEXT;\r\n // continue\r\n this.process();\r\n }\r\n\r\n private startUpload(ul:Upload) {\r\n\r\n ul.status = UploadStatus.UPLOADING;\r\n if (UploaderStatus.ERR === this.status) {\r\n this.status = UploaderStatus.TRY_UPLOADING;\r\n } else {\r\n this.status = UploaderStatus.UPLOADING;\r\n }\r\n\r\n let dSize=this.dataSize(ul.data);\r\n let timeoutForDataSize=dSize*this.POST_TIMEOUT_PER_KB/1000;\r\n let timeoVal:number=Math.round(this.POST_MIN_TIMEOUT+timeoutForDataSize)\r\n // pipe(timeout()) is not the same as xhr.timeout\r\n\r\n let uploadedUpload:Upload|null=null;\r\n //console.debug(\"Post upload: \"+ul)\r\n this.http.post(ul.url,ul.data,{withCredentials:this.withCredentials}).pipe(timeout(timeoVal)).subscribe(\r\n data => {\r\n uploadedUpload = ul;\r\n //console.debug('Next method called for upload: '+uploadedUpload)\r\n },(err: HttpErrorResponse) => {\r\n if (err.error instanceof Error) {\r\n // A client-side or network error occurred. Handle it accordingly.\r\n console.error('Upload error occurred:', err.error.message);\r\n } else {\r\n // The backend returned an unsuccessful response code.\r\n // The response body may contain clues as to what went wrong,\r\n console.error(`Upload error: Server returned code ${err.status}`);\r\n }\r\n this.processError(ul)\r\n },()=>{\r\n //console.debug('Upload complete method called')\r\n if(uploadedUpload) {\r\n if (this.DEBUG_DELAY>0) {\r\n window.setTimeout(() => {\r\n this.uploadDone(ul);\r\n }, this.DEBUG_DELAY);\r\n } else {\r\n this.uploadDone(uploadedUpload)\r\n }\r\n }else{\r\n console.error('Upload post complete, but upload not set in next method!')\r\n }\r\n });\r\n }\r\n\r\n private processError(ul:Upload) {\r\n //console.debug(\"Process upload error...\")\r\n ul.status=UploadStatus.ERR\r\n this.status = UploaderStatus.ERR;\r\n\r\n let ue = new UploaderStatusChangeEvent(this._sizeQueued, this._sizeDone, this.status);\r\n if (this.listener) {\r\n this.listener(ue);\r\n }\r\n\r\n // set retry timer\r\n this.retryTimerId=window.setTimeout(() => {\r\n this.retryTimerRunning=false;\r\n //console.debug(\"Upload retry timer exprired. Continue processing...\")\r\n this.process();\r\n }, this.RETRY_DELAY);\r\n\r\n this.retryTimerRunning=true;\r\n //console.debug(\"Started upload retry timer \"+this.RETRY_DELAY+\"ms ...\")\r\n }\r\n\r\n private process() {\r\n // clear retry timer if set\r\n if(this.retryTimerRunning){\r\n if(this.retryTimerId) {\r\n window.clearTimeout(this.retryTimerId)\r\n }\r\n this.retryTimerRunning=false\r\n //console.debug(\"Cleared retry timer.\")\r\n }\r\n\r\n let pul: Upload | null = null;\r\n\r\n //console.debug(\"Uploader status: \"+this.status)\r\n\r\n let s = this.que.length;\r\n //console.debug(s+\" uploads are in the queue.\")\r\n\r\n if (s>0 && UploaderStatus.UPLOADING != this.status && UploaderStatus.TRY_UPLOADING != this.status) {\r\n\r\n for (let i = 0; i < s; i++) {\r\n let ul = this.que[i];\r\n //console.log(\"Upload \"+ul+\" status:\"+ul.status)\r\n if (ul.status === UploadStatus.IDLE) {\r\n //console.log(\"Upload \"+ul+\" startUpload\")\r\n this.startUpload(ul);\r\n pul = ul;\r\n break;\r\n }\r\n }\r\n if (!pul) {\r\n //console.log(\"Check ERR uploads...\")\r\n // now failed uploads\r\n //console.debug(\"No regular upload found. Looking for error state uploads.\")\r\n for (let i = 0; i < s; i++) {\r\n let ul = this.que[i];\r\n //console.log(\"Upload \"+ul+\" status:\"+ul.status)\r\n if (ul.status === UploadStatus.ERR) {\r\n //console.log(\"Upload (ERR) \"+ul+\" startUpload\")\r\n //console.debug(\"Start error state upload \"+ul)\r\n this.startUpload(ul);\r\n pul = ul;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if(s==0){\r\n //console.debug(\"Upload done.\")\r\n this.status=UploaderStatus.DONE\r\n }\r\n let ue = new UploaderStatusChangeEvent(this._sizeQueued, this._sizeDone, this.status);\r\n if (this.listener) {\r\n this.listener(ue);\r\n }\r\n }\r\n\r\n queueUpload(ul: Upload) {\r\n if (ul) {\r\n let ulSize = this.dataSize(ul.data);\r\n this.que.push(ul);\r\n this._sizeQueued += ulSize;\r\n this.process();\r\n }\r\n }\r\n }\r\n\r\n\r\n","import {Injectable, InjectionToken} from \"@angular/core\";\r\n\r\nexport const SPEECHRECORDER_CONFIG = new InjectionToken<SpeechRecorderConfig>('speechrecorder.config');\r\n\r\n\r\nexport enum ApiType {\r\n NORMAL,FILES\r\n}\r\n@Injectable()\r\nexport class SpeechRecorderConfig{\r\n apiEndPoint?: string | null=null;\r\n apiType?: ApiType | null=null;\r\n withCredentials?: boolean=false;\r\n enableDownloadRecordings?: boolean=false;\r\n enableUploadRecordings?: boolean=true;\r\n constructor(){\r\n this.apiEndPoint=null;\r\n this.apiType=null;\r\n this.withCredentials=false;\r\n }\r\n}\r\n\r\n","/**\r\n * Created by klausj on 17.06.2017.\r\n */\r\nimport {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient} from \"@angular/common/http\";\r\nimport {ApiType, SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\nimport {Project} from \"./project\";\r\nimport {UUID} from \"../../utils/utils\";\r\nimport {Observable} from \"rxjs\";\r\nimport {PlatformLocation} from \"@angular/common\";\r\n\r\n\r\n\r\n@Injectable()\r\nexport class ProjectService {\r\n public static readonly PROJECT_API_CTX='project'\r\n private projectCtxUrl:string;\r\n private withCredentials:boolean=false;\r\n\r\n constructor(private http:HttpClient,private platformLoaction:PlatformLocation,@Inject(SPEECHRECORDER_CONFIG) private config?:SpeechRecorderConfig) {\r\n\r\n console.log(\"Base Href: \"+platformLoaction.getBaseHrefFromDOM());\r\n\r\n let apiEndPoint = ''\r\n\r\n if(config && config.apiEndPoint) {\r\n apiEndPoint=config.apiEndPoint;\r\n }\r\n if(apiEndPoint !== ''){\r\n apiEndPoint=apiEndPoint+'/'\r\n }\r\n if(config!=null && config.withCredentials!=null){\r\n this.withCredentials=config.withCredentials;\r\n }\r\n\r\n this.projectCtxUrl = apiEndPoint + ProjectService.PROJECT_API_CTX;\r\n\r\n }\r\n\r\n private appendRequestUUIDForDevelopmentServer(url:string):string{\r\n let resUrl=url;\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n resUrl = resUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n return resUrl\r\n }\r\n\r\n projectUrl(id:string):string{\r\n let encPrjId=encodeURIComponent(id);\r\n return this.appendRequestUUIDForDevelopmentServer(this.projectCtxUrl + '/' + encPrjId);\r\n }\r\n\r\n projectResourceUrl(projectId: string,relResourcePath:string):string{\r\n let encPrjId=encodeURIComponent(projectId);\r\n // Use encodeURI here since the relatice resource path from recording scripts is already a URI\r\n // encodeURIComponent function would encode the slashes and fetching the resource would fail\r\n let encRelResPath=encodeURI(relResourcePath);\r\n return this.projectCtxUrl + '/' + encPrjId +'/'+encRelResPath;\r\n }\r\n\r\n projectObservable(id:string):Observable<Project>{\r\n let prjUrl=this.projectUrl(id);\r\n return this.http.get<Project>(prjUrl,{withCredentials: this.withCredentials})\r\n }\r\n\r\n}\r\n\r\n\r\n","import {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient} from \"@angular/common/http\";\r\nimport {ApiType, SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\nimport {Session} from \"./session\";\r\nimport {UUID} from \"../../utils/utils\";\r\nimport {Observable} from \"rxjs\";\r\nimport {ProjectService} from \"../project/project.service\";\r\n\r\n\r\n\r\n@Injectable()\r\nexport class SessionService {\r\n get uploadCount(): number {\r\n return this._uploadCount;\r\n }\r\n public static readonly SESSION_API_CTX='session';\r\n private apiEndPoint='';\r\n private sessionsUrl:string;\r\n private withCredentials:boolean=false;\r\n private _uploadCount=0;\r\n\r\n constructor(private http:HttpClient,@Inject(SPEECHRECORDER_CONFIG) private config?:SpeechRecorderConfig) {\r\n\r\n if(config && config.apiEndPoint) {\r\n this.apiEndPoint=config.apiEndPoint;\r\n }\r\n if(this.apiEndPoint !== ''){\r\n this.apiEndPoint=this.apiEndPoint+'/'\r\n }\r\n if(config!=null && config.withCredentials!=null){\r\n this.withCredentials=config.withCredentials;\r\n }\r\n this.sessionsUrl = this.apiEndPoint + SessionService.SESSION_API_CTX;\r\n }\r\n\r\n sessionObserver(id: string): Observable<Session> {\r\n\r\n let sessUrl = this.sessionsUrl + '/' + id;\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n sessUrl = sessUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n return this.http.get<Session>(sessUrl,{ withCredentials: this.withCredentials });\r\n\r\n }\r\n\r\n patchSessionObserver(session:Session,body:any): Observable<Session> {\r\n\r\n let sesssUrl = this.apiEndPoint + ProjectService.PROJECT_API_CTX + '/' + session.project + '/' + SessionService.SESSION_API_CTX + '/' + session.sessionId\r\n\r\n let wrapObs = new Observable<Session>(subscriber => {\r\n this._uploadCount++;\r\n let obs = this.http.patch<Session>(sesssUrl, body, {withCredentials: this.withCredentials});\r\n obs.subscribe((value) => {\r\n subscriber.next(value);\r\n }, error => {\r\n this._uploadCount--;\r\n subscriber.error(error);\r\n }, () => {\r\n this._uploadCount--;\r\n subscriber.complete();\r\n });\r\n });\r\n return wrapObs;\r\n }\r\n\r\n // putSessionObserver(session: Session): Observable<Session> {\r\n //\r\n // let sesssUrl = this.apiEndPoint + ProjectService.PROJECT_API_CTX + '/' + session.project + '/' + SessionService.SESSION_API_CTX + '/' + session.session\r\n //\r\n // let wrapObs = new Observable<Session>(subscriber => {\r\n // this._uploadCount++;\r\n // let obs = this.http.put<Session>(sesssUrl, session, {withCredentials: this.withCredentials});\r\n // obs.subscribe((value) => {\r\n // subscriber.next(value);\r\n // }, error => {\r\n // this._uploadCount--;\r\n // subscriber.error(error);\r\n // }, () => {\r\n // this._uploadCount--;\r\n // subscriber.complete();\r\n // });\r\n // });\r\n // return wrapObs;\r\n // }\r\n //\r\n\r\n\r\n}\r\n\r\n\r\n\r\n","import {Component,Input} from '@angular/core'\r\nimport {StartStopSignal, State} from '../startstopsignal'\r\n\r\n@Component({\r\n\r\n selector: 'app-simpletrafficlight',\r\n\r\n template: `\r\n\r\n <div>\r\n <div class=\"circle {{lighttop}}\"></div>\r\n <div class=\"circle {{lightmid}}\"></div>\r\n <div class=\"circle {{lightbottom}}\"></div>\r\n </div>\r\n `\r\n ,\r\n styles: [`.circle {\r\n width: 50px;\r\n height: 50px;\r\n border-radius: 50%;\r\n margin: 5px;\r\n background: grey;\r\n }`, `.red {\r\n background: red;\r\n }\r\n `, `\r\n .yellow {\r\n background: yellow;\r\n }\r\n `, `\r\n .green {\r\n background: green;\r\n }\r\n `, `\r\n .black {\r\n background: black;\r\n }`,\r\n `:host {\r\n display: flex;\r\n flex-direction: column;\r\n background: black;\r\n \r\n padding: 2px;\r\n height: 170px;\r\n max-height: 170px;\r\n flex: 0 0 content;\r\n }\r\n `]\r\n})\r\nexport class SimpleTrafficLight implements StartStopSignal {\r\n\r\n lighttop!: string;\r\n lightmid!: string;\r\n lightbottom!: string;\r\n\r\n constructor() {\r\n this.status=State.OFF;\r\n }\r\n\r\n @Input()\r\n set status(status: State) {\r\n if (State.OFF === status) {\r\n this.lighttop = 'grey';\r\n this.lightmid = 'grey';\r\n this.lightbottom = 'grey';\r\n } else if (State.IDLE === status) {\r\n this.lighttop = 'red';\r\n this.lightmid = 'grey';\r\n this.lightbottom = 'grey';\r\n } else if (State.PRERECORDING == status) {\r\n this.lighttop = 'red';\r\n this.lightmid = 'yellow';\r\n this.lightbottom = 'grey';\r\n } else if (State.RECORDING == status) {\r\n this.lighttop = 'grey';\r\n this.lightmid = 'grey';\r\n this.lightbottom = 'green';\r\n } else if (State.POSTRECORDING == status) {\r\n this.lighttop = 'grey';\r\n this.lightmid = 'yellow';\r\n this.lightbottom = 'grey';\r\n }\r\n }\r\n}\r\n\r\n\r\n","export class Position{\r\n constructor(public left:number,public top:number){\r\n\r\n }\r\n toString():string{\r\n return this.left+\",\"+this.top\r\n }\r\n}\r\n\r\n\r\nexport class Dimension {\r\n constructor(public width:number,public height:number){\r\n\r\n }\r\n toString():string{\r\n return this.width+\"x\"+this.height\r\n }\r\n}\r\n\r\n\r\nexport class Rectangle{\r\n\r\n constructor(public position:Position,public dimension:Dimension){\r\n\r\n }\r\n toString():string{\r\n return this.position+\":\"+this.dimension\r\n }\r\n}\r\n","import {Position,Dimension, Rectangle} from \"../math/2d/geometry\";\r\nimport { Directive } from \"@angular/core\";\r\n\r\n@Directive()\r\nexport abstract class CanvasLayerComponent{\r\n\r\n protected bounds:Rectangle|null=null;\r\n protected virtualDimension!:Dimension;\r\n protected canvasLayers:Array<HTMLCanvasElement>;\r\n\r\n constructor(){\r\n\r\n // TODO make clear that first element is background canvas\r\n this.canvasLayers=new Array<HTMLCanvasElement>();\r\n }\r\n\r\n toXViewPortPixelPosition(virtualX:number){\r\n let pixelPos=virtualX;\r\n if(this.bounds){\r\n pixelPos=Math.round(virtualX-this.bounds.position.left);\r\n }\r\n return pixelPos;\r\n }\r\n\r\n toXVirtualPixelPosition(viewPortX:number){\r\n let pixelPos=viewPortX;\r\n if(this.bounds){\r\n pixelPos=Math.round(viewPortX+this.bounds.position.left);\r\n }\r\n return pixelPos;\r\n }\r\n\r\n toViewPortPosition(virtualPos:Position):Position{\r\n\r\n if(this.bounds){\r\n return new Position(virtualPos.left-this.bounds.position.left,virtualPos.top-this.bounds.position.top);\r\n }else{\r\n return virtualPos;\r\n }\r\n }\r\n\r\n\r\n}\r\n"," export class AudioClip {\r\n private _buffer: AudioBuffer;\r\n private _selection:Selection|null=null;\r\n private selectionObservers:Array<(audioClip:AudioClip)=>void>;\r\n\r\n constructor(buffer: AudioBuffer) {\r\n this.selectionObservers=new Array<(audioClip:AudioClip)=>void>()\r\n this._buffer = buffer;\r\n }\r\n\r\n get buffer() {\r\n return this._buffer;\r\n };\r\n\r\n get selection(): Selection|null{\r\n return this._selection;\r\n }\r\n\r\n set selection(value: Selection|null) {\r\n this._selection = value;\r\n // let obsCnt=this.selectionObservers.length\r\n // this.selectionObservers.forEach((obs)=> {\r\n // console.log(\"Calling observer\")\r\n // obs(this)\r\n // });\r\n for(let selObs of this.selectionObservers){\r\n selObs(this)\r\n }\r\n }\r\n\r\n addSelectionObserver(selectionObserver:(audioClip:AudioClip)=>void,init=false){\r\n let obsAlreadyInList=this.selectionObservers.find((obs)=>(obs===selectionObserver))\r\n if(!obsAlreadyInList) {\r\n this.selectionObservers.push(selectionObserver)\r\n }\r\n if(init){\r\n selectionObserver(this)\r\n }\r\n }\r\n\r\n removeSelectionObserver(selectionObserver:(audioClip:AudioClip)=>void){\r\n this.selectionObservers=this.selectionObservers.filter((obs)=>{obs!==selectionObserver})\r\n }\r\n }\r\n\r\n export interface Reader {\r\n read(data: Blob): AudioClip;\r\n }\r\n export interface Writer {\r\n write(audioData: AudioClip): Blob;\r\n }\r\n\r\n export class Selection{\r\n private _sampleRate:number;\r\n private _startFrame:number;\r\n private _endFrame:number;\r\n\r\n constructor(sampleRate:number,startFrame:number,endFrame:number){\r\n this._sampleRate=sampleRate;\r\n this._startFrame=startFrame\r\n this._endFrame=endFrame;\r\n }\r\n\r\n get sampleRate(): number {\r\n return this._sampleRate;\r\n }\r\n get endFrame():number{\r\n return this._endFrame;\r\n }\r\n get startFrame(): number {\r\n return this._startFrame;\r\n }\r\n\r\n get leftFrame(): number {\r\n return (this._startFrame <= this._endFrame) ? this._startFrame : this._endFrame\r\n }\r\n get rightFrame(): number {\r\n return (this._startFrame <= this._endFrame) ? this._endFrame : this._startFrame\r\n }\r\n\r\n equals(otherSelection:Selection|null|undefined):boolean{\r\n if(otherSelection) {\r\n return (this._sampleRate == otherSelection._sampleRate && this._startFrame === otherSelection._startFrame && this._endFrame === otherSelection._endFrame);\r\n }\r\n return false;\r\n }\r\n\r\n toString(){\r\n return \"Selection: from: \"+this.leftFrame+\" to: \"+this.rightFrame+\" frame. Refers to sample rate :\"+this._sampleRate;\r\n }\r\n }\r\n\r\n\r\n","\r\n export class Point {\r\n constructor(private _x:number,private _y:number) {\r\n }\r\n get x():number{\r\n return this._x;\r\n }\r\n get y():number{\r\n return this._y;\r\n }\r\n }\r\n export class Marker {\r\n name: string|null=null;\r\n framePosition: number|null=null;\r\n\r\n }\r\n\r\n\r\n","import {CanvasLayerComponent} from \"../../ui/canvas_layer_comp\";\r\nimport {Selection} from '../persistor'\r\nimport { ElementRef, EventEmitter, HostListener, Input, Output, ViewChild, Directive } from \"@angular/core\";\r\nimport {Marker} from \"./common\";\r\nimport {Dimension, Rectangle} from \"../../math/2d/geometry\";\r\n\r\n\r\nexport class ViewSelection{\r\n get startX(): number {\r\n return this._startX;\r\n }\r\n\r\n get endX(): number {\r\n return this._endX;\r\n }\r\n\r\n width():number{\r\n return this._endX-this._startX\r\n }\r\n\r\n constructor(private _startX:number, private _endX:number){}\r\n}\r\n\r\n@Directive()\r\nexport abstract class BasicAudioCanvasLayerComponent extends CanvasLayerComponent {\r\n protected _audioData: AudioBuffer|null=null;\r\n protected _bgColor:string|null='white';\r\n protected _selectColor='rgba(0%,0%,100%,25%)';\r\n\r\n /**\r\n * Returns pixel position depending on current zoom setting.\r\n * @param framePos audio frame (sample) position\r\n */\r\n frameToXPixelPosition(framePos: number): number | null {\r\n let pixelPos=null;\r\n if (this._audioData && this._audioData.numberOfChannels > 0) {\r\n let ch0 = this._audioData.getChannelData(0);\r\n let frameLength = ch0.length;\r\n let vw;\r\n if(this.bounds) {\r\n vw = this.bounds.dimension.width;\r\n }\r\n if (this.virtualDimension) {\r\n vw = this.virtualDimension.width;\r\n }\r\n if(vw !== undefined) {\r\n pixelPos = framePos * vw / frameLength;\r\n }\r\n }\r\n return pixelPos;\r\n}\r\n\r\n /**\r\n * Returns pixel position in view port (visible window of scroll pane).\r\n * @param framePos audio frame (sample) position\r\n */\r\n frameToViewPortXPixelPosition(framePos: number): number | null {\r\n let pixelPos=this.frameToXPixelPosition(framePos);\r\n if(pixelPos!=null){\r\n let vPixelPos = this.toXViewPortPixelPosition(pixelPos);\r\n return vPixelPos;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n viewPortXPixelToFramePosition(xViewPortPixelPos: number): number | null {\r\n let vpXramePos=null;\r\n if (this._audioData && this._audioData.numberOfChannels > 0) {\r\n let ch0 = this._audioData.getChannelData(0);\r\n let frameLength = ch0.length;\r\n let vw;\r\n if (this.bounds) {\r\n vw= this.bounds.dimension.width;\r\n }\r\n if (this.virtualDimension) {\r\n vw = this.virtualDimension.width;\r\n }\r\n if(vw!== undefined) {\r\n let xVirtualPixelPos = this.toXVirtualPixelPosition(xViewPortPixelPos)\r\n let framesPerPixel = frameLength / vw;\r\n let framePos = framesPerPixel * xVirtualPixelPos;\r\n if (framePos < 0) {\r\n framePos = 0\r\n }\r\n if (framePos >= frameLength) {\r\n framePos = frameLength - 1\r\n }\r\n vpXramePos = Math.round(framePos);\r\n }\r\n }\r\n return vpXramePos;\r\n }\r\n\r\n layoutBounds(bounds:Rectangle, virtualDimension:Dimension,redraw: boolean) {\r\n\r\n this.bounds=bounds;\r\n this.virtualDimension=virtualDimension;\r\n //this.canvasLayers.forEach(cl=>{\r\n for(let ci=0;ci<this.canvasLayers.length;ci++) {\r\n let cl = this.canvasLayers[ci];\r\n const leftStyle=bounds.position.left+ 'px';\r\n if(cl.style.left!=leftStyle) {\r\n cl.style.left = leftStyle;\r\n }\r\n const topStyle=bounds.position.top + 'px';\r\n if(cl.style.top!=topStyle) {\r\n cl.style.top = topStyle;\r\n }\r\n }\r\n if (bounds.dimension.width) {\r\n let intW=Math.floor(bounds.dimension.width);\r\n if (redraw) {\r\n // Do not set width of background canvas (causes flicker on start render)\r\n for(let ci=1;ci<this.canvasLayers.length;ci++) {\r\n let cl = this.canvasLayers[ci];\r\n if(cl.width!=intW) {\r\n cl.width = intW;\r\n }\r\n }\r\n }\r\n let wStr = intW.toString() + 'px';\r\n for(let ci=0;ci<this.canvasLayers.length;ci++) {\r\n let cl = this.canvasLayers[ci];\r\n if(cl.style.width!=wStr) {\r\n cl.style.width = wStr;\r\n }\r\n }\r\n }\r\n if (bounds.dimension.height) {\r\n let intH=Math.floor(bounds.dimension.height)\r\n if (redraw) {\r\n // Do not set height of background canvas (causes flicker on start render)\r\n for(let ci=1;ci<this.canvasLayers.length;ci++) {\r\n let cl = this.canvasLayers[ci];\r\n if(cl.height!=intH) {\r\n cl.height = intH;\r\n }\r\n }\r\n }\r\n let hStr = intH + 'px';\r\n for(let ci=0;ci<this.canvasLayers.length;ci++) {\r\n let cl = this.canvasLayers[ci];\r\n if(cl.style.height!=hStr){\r\n cl.style.height = hStr;\r\n }\r\n }\r\n }\r\n //});\r\n\r\n\r\n }\r\n}\r\n\r\n@Directive()\r\nexport abstract class AudioCanvasLayerComponent extends BasicAudioCanvasLayerComponent {\r\n _pointerPosition:Marker|null=null;\r\n\r\n protected selectStartX:number|null=null;\r\n\r\n @ViewChild('bg', { static: true }) bgCanvasRef!: ElementRef;\r\n bgCanvas!: HTMLCanvasElement;\r\n\r\n @ViewChild('cursor', { static: true }) cursorCanvasRef!: ElementRef;\r\n cursorCanvas!: HTMLCanvasElement;\r\n\r\n @HostListener('document:mouseup', ['$event'])\r\n onMouseup(me: MouseEvent) {\r\n this.selectionCommit(me)\r\n }\r\n\r\n layoutBounds(bounds:Rectangle, virtualDimension:Dimension,redraw: boolean,clear:boolean=true) {\r\n super.layoutBounds(bounds,virtualDimension,redraw)\r\n if (redraw) {\r\n this.startDraw(clear);\r\n }\r\n }\r\n\r\n @Input() set pointerPosition(pointerPosition:Marker|null){\r\n this._pointerPosition=pointerPosition\r\n this.drawCursorLayer()\r\n }\r\n\r\n _selecting: Selection|null =null;\r\n @Input() set selecting(selecting:Selection| null){\r\n this._selecting=selecting\r\n this.drawBg()\r\n this.drawCursorLayer()\r\n }\r\n\r\n get selecting():Selection|null{\r\n return this._selecting\r\n }\r\n\r\n _selection: Selection|null =null\r\n @Input() set selection(selection:Selection|null){\r\n this._selection=selection;\r\n this.selecting=null;\r\n this.drawBg()\r\n this.drawCursorLayer()\r\n }\r\n\r\n get selection():Selection|null{\r\n return this._selection\r\n }\r\n\r\n selectionStart(me:MouseEvent){\r\n this.selectStartX=me.offsetX;\r\n }\r\n\r\n selectionCommit(me:MouseEvent){\r\n let vs:ViewSelection|null=null;\r\n if(this.selectStartX!=null) {\r\n vs=new ViewSelection(this.selectStartX,me.offsetX)\r\n this.selectStartX=null;\r\n this.select(vs);\r\n }\r\n }\r\n\r\n abstract startDraw(clear:boolean):void;\r\n\r\n updateCursorCanvas(me:MouseEvent,showCursorPosition=true){\r\n\r\n if (this.cursorCanvas) {\r\n\r\n let w = this.cursorCanvas.width;\r\n let h = this.cursorCanvas.height;\r\n let g = this.cursorCanvas.getContext(\"2d\");\r\n\r\n // if (!showCursorPosition) {\r\n // this.selectStartX = null\r\n // this.selectingChange(null)\r\n // }\r\n if (me) {\r\n if (this.selectStartX) {\r\n this.pointerPositionChanged(null)\r\n this.selectingChange(new ViewSelection(this.selectStartX, me.offsetX));\r\n } else {\r\n if (showCursorPosition) {\r\n this.pointerPositionChanged(me.offsetX)\r\n }else{\r\n this.pointerPositionChanged(null)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n @Output() pointerPositionEventEmitter = new EventEmitter<Marker>();\r\n @Output() selectingEventEmitter = new EventEmitter<Selection>();\r\n @Output() selectedEventEmitter = new EventEmitter<Selection>();\r\n\r\n\r\n pointerPositionChanged(xPosition:number| null){\r\n let pointerPosition:Marker|undefined=undefined;\r\n if(xPosition){\r\n pointerPosition=new Marker();\r\n let vpXPos=this.viewPortXPixelToFramePosition(xPosition);\r\n if(vpXPos!=null) {\r\n pointerPosition.framePosition =vpXPos;\r\n }\r\n }\r\n this.pointerPositionEventEmitter.emit(pointerPosition);\r\n }\r\n\r\n selectingChange(viewSel:ViewSelection| null){\r\n let ns:Selection|undefined=undefined;\r\n if(viewSel) {\r\n let frameStart = this.viewPortXPixelToFramePosition(viewSel.startX)\r\n let frameEnd = this.viewPortXPixelToFramePosition(viewSel.endX)\r\n if(this._audioData && frameStart!=null && frameEnd!=null) {\r\n ns = new Selection(this._audioData.sampleRate, frameStart, frameEnd);\r\n }\r\n }\r\n this.selectingEventEmitter.emit(ns)\r\n }\r\n\r\n select(viewSel:ViewSelection| null){\r\n let ns:Selection|undefined=undefined;\r\n if(viewSel) {\r\n let frameStart = this.viewPortXPixelToFramePosition(viewSel.startX)\r\n let frameEnd = this.viewPortXPixelToFramePosition(viewSel.endX)\r\n if(this._audioData && frameStart!=null && frameEnd!=null) {\r\n ns = new Selection(this._audioData.sampleRate, frameStart, frameEnd);\r\n }\r\n }\r\n this.selectedEventEmitter.emit(ns)\r\n }\r\n\r\n viewSelection():ViewSelection|null{\r\n let vs:ViewSelection|null=null;\r\n let s:Selection|null=null;\r\n if(this._selecting){\r\n s=this._selecting\r\n }else if(this._selection){\r\n s=this._selection\r\n }\r\n if(s){\r\n let sf=s.startFrame;\r\n let ef=s.endFrame;\r\n let xs=this.frameToViewPortXPixelPosition(sf)\r\n let xe=this.frameToViewPortXPixelPosition(ef)\r\n if(xs!=null && xe!=null) {\r\n vs = new ViewSelection(xs, xe)\r\n }\r\n }\r\n return vs;\r\n }\r\n\r\n\r\n drawBg(){\r\n if(this.bgCanvas && this.bounds) {\r\n this.bgCanvas.style.left = Math.round(this.bounds.position.left).toString() + 'px';\r\n this.bgCanvas.width = Math.round(this.bounds.dimension.width);\r\n this.bgCanvas.height = Math.round(this.bounds.dimension.height);\r\n let g1 = this.bgCanvas.getContext(\"2d\");\r\n if (g1) {\r\n let w = this.bgCanvas.width;\r\n let h = this.bgCanvas.height;\r\n g1.clearRect(0, 0, w, h);\r\n if(this._bgColor) {\r\n g1.fillStyle = this._bgColor;\r\n g1.fillRect(0, 0, w, h);\r\n }\r\n let vs = this.viewSelection()\r\n if (vs) {\r\n g1.fillStyle = this._selectColor;\r\n g1.fillRect(vs.startX, 0, vs.width(), h);\r\n }\r\n }\r\n }\r\n }\r\n drawCursorLayer(){\r\n if (this.cursorCanvas) {\r\n let w = this.cursorCanvas.width;\r\n let h = this.cursorCanvas.height;\r\n let g = this.cursorCanvas.getContext(\"2d\");\r\n if(g) {\r\n g.clearRect(0, 0, w, h);\r\n // let s:Selection=null;\r\n // if(this._selecting){\r\n // s=this._selecting\r\n // }else if(this._selection){\r\n // s=this._selection\r\n // }\r\n // if(s){\r\n // let sf=s.startFrame\r\n // let ef=s.endFrame\r\n // let xs=this.frameToViewPortXPixelPosition(sf)\r\n // let xe=this.frameToViewPortXPixelPosition(ef)\r\n // let sw=xe-xs\r\n // g.fillStyle = 'rgba(0%,0%,100%,25%)';\r\n // g.fillRect(xs,0,sw,h);\r\n // }\r\n\r\n if(this._pointerPosition){\r\n\r\n let framePos=this._pointerPosition.framePosition\r\n if(framePos) {\r\n let xViewPortPixelpos = this.frameToViewPortXPixelPosition(framePos)\r\n if (xViewPortPixelpos) {\r\n\r\n g.fillStyle = 'yellow';\r\n g.strokeStyle = 'yellow';\r\n g.beginPath();\r\n g.moveTo(xViewPortPixelpos, 0);\r\n g.lineTo(xViewPortPixelpos, h);\r\n g.closePath();\r\n\r\n g.stroke();\r\n\r\n if (this._audioData) {\r\n g.font = '14px sans-serif';\r\n g.fillStyle = 'yellow';\r\n g.fillText(framePos.toString(), xViewPortPixelpos + 2, 50);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n","import {Component, ViewChild, ElementRef} from '@angular/core';\r\nimport {AudioCanvasLayerComponent} from \"./audio_canvas_layer_comp\";\r\nimport {WorkerHelper} from \"../../utils/utils\";\r\n\r\ndeclare function postMessage(message: any, transfer: Array<any>): void;\r\n\r\n@Component({\r\n\r\n selector: 'audio-signal',\r\n template: `\r\n <canvas #bg height=\"10\"></canvas>\r\n <canvas #audioSignal height=\"10\"></canvas>\r\n <canvas #cursor height=\"10\" (mousedown)=\"selectionStart($event)\" (mouseover)=\"updateCursorCanvas($event)\" (mousemove)=\"updateCursorCanvas($event)\"\r\n (mouseleave)=\"updateCursorCanvas($event, false)\"></canvas>\r\n <canvas #marker height=\"10\"></canvas>`,\r\n\r\n styles: [`:host{\r\n min-height: 0px;\r\n }`,`canvas {\r\n top: 0;\r\n left: 0;\r\n width: 0;\r\n height: 0;\r\n min-height: 0px;\r\n position: absolute;\r\n }`]\r\n\r\n})\r\nexport class AudioSignal extends AudioCanvasLayerComponent{\r\n\r\n n: any;\r\n ce!: HTMLDivElement;\r\n @ViewChild('audioSignal', { static: true }) audioSignalCanvasRef!: ElementRef;\r\n @ViewChild('marker', { static: true }) playPosCanvasRef!: ElementRef;\r\n signalCanvas!: HTMLCanvasElement;\r\n\r\n markerCanvas!: HTMLCanvasElement;\r\n\r\n private _playFramePosition: number|null=null;\r\n private worker: Worker | null;\r\n private workerURL: string;\r\n\r\n constructor(private ref: ElementRef) {\r\n super();\r\n this.worker = null;\r\n this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction)\r\n this._audioData = null;\r\n this._bgColor='black';\r\n this._selectColor='rgba(255,255,0,0.8)'\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.ce = this.ref.nativeElement;\r\n this.bgCanvas = this.bgCanvasRef.nativeElement;\r\n this.bgCanvas.style.zIndex = '1';\r\n this.signalCanvas = this.audioSignalCanvasRef.nativeElement;\r\n this.signalCanvas.style.zIndex = '2';\r\n this.markerCanvas = this.playPosCanvasRef.nativeElement;\r\n this.markerCanvas.style.zIndex = '3';\r\n this.cursorCanvas = this.cursorCanvasRef.nativeElement;\r\n this.cursorCanvas.style.zIndex = '4';\r\n\r\n this.canvasLayers[0]=this.bgCanvas;\r\n this.canvasLayers[1]=this.signalCanvas;\r\n this.canvasLayers[2]=this.cursorCanvas;\r\n this.canvasLayers[3]=this.markerCanvas;\r\n\r\n }\r\n\r\n get playFramePosition(): number |null{\r\n return this._playFramePosition;\r\n }\r\n\r\n set playFramePosition(playFramePosition: number|null) {\r\n this._playFramePosition = playFramePosition;\r\n this.drawPlayPosition();\r\n }\r\n\r\n\r\n\r\n drawPlayPosition() {\r\n if (this.markerCanvas) {\r\n let w = this.markerCanvas.width;\r\n let h = this.markerCanvas.height;\r\n let g = this.markerCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n if(this._playFramePosition) {\r\n let pixelPos = this.frameToViewPortXPixelPosition(this._playFramePosition);\r\n if (pixelPos) {\r\n g.fillStyle = 'red';\r\n g.strokeStyle = 'red';\r\n g.beginPath();\r\n g.moveTo(pixelPos, 0);\r\n g.lineTo(pixelPos, h);\r\n g.closePath();\r\n g.stroke();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /*\r\n * Method used as worker code.\r\n */\r\n workerFunction() {\r\n addEventListener('message', ({ data }) => {\r\n\r\n let audioData = data.audioData;\r\n let l= data.l;\r\n let w = data.w;\r\n let h = data.h;\r\n let vw = data.vw;\r\n let chs = data.chs;\r\n let frameLength = data.frameLength;\r\n let psMinMax= new Float32Array(0);\r\n\r\n if(audioData && w>=0 && vw>0) {\r\n\r\n let framesPerPixel = frameLength / vw;\r\n\r\n let y = 0;\r\n let pointsLen = w * chs;\r\n // one for min one for max\r\n let arrLen = pointsLen * 2;\r\n psMinMax = new Float32Array(arrLen);\r\n let chFramePos = 0;\r\n for (let ch = 0; ch < chs; ch++) {\r\n let x = 0;\r\n\r\n chFramePos = ch * frameLength;\r\n for (let pii = 0; pii < w; pii++) {\r\n let virtPii=l+pii;\r\n let pMin = Infinity;\r\n let pMax = -Infinity;\r\n let pixelFramePos = Math.round(chFramePos + (virtPii * framesPerPixel));\r\n\r\n // calculate pixel min/max amplitude\r\n for (let ai = 0; ai < framesPerPixel; ai++) {\r\n let framePos = pixelFramePos + ai;\r\n\r\n let a = 0;\r\n if(framePos>=0 && framePos<audioData.length){\r\n a=audioData[framePos];\r\n }\r\n if (a < pMin) {\r\n pMin = a;\r\n }\r\n if (a > pMax) {\r\n pMax = a;\r\n }\r\n }\r\n\r\n let psMinPos = ch * w + pii;\r\n psMinMax[psMinPos] = pMin;\r\n let psMaxPos = pointsLen + psMinPos;\r\n psMinMax[psMaxPos] = pMax;\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n\r\n postMessage({psMinMax: psMinMax, l:data.l,t:data.t,w: data.w, h: data.h, chs: data.chs}, [psMinMax.buffer]);\r\n })\r\n }\r\n\r\n startDraw(clear = true) {\r\n if (clear) {\r\n if(this.bounds) {\r\n this.signalCanvas.style.left = Math.round(this.bounds.position.left).toString() + 'px';\r\n this.signalCanvas.width = Math.round(this.bounds.dimension.width);\r\n this.signalCanvas.height = Math.round(this.bounds.dimension.height);\r\n\r\n let g = this.signalCanvas.getContext(\"2d\");\r\n if (g) {\r\n //g.clearRect(0, 0,w, h);\r\n g.fillStyle = \"black\";\r\n g.fillRect(0, 0, Math.round(this.bounds.dimension.width), Math.round(this.bounds.dimension.height));\r\n }\r\n }\r\n }\r\n this.startRender();\r\n this.drawCursorLayer()\r\n }\r\n\r\n\r\n private startRender() {\r\n\r\n if (this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n if (this.bounds && this.bounds.dimension) {\r\n\r\n let w = Math.round(this.bounds.dimension.width);\r\n let h = Math.round(this.bounds.dimension.height);\r\n\r\n if (this._audioData && w>0 && h>0) {\r\n //this.wo = new Worker('./audiosignal.worker.js',{type: 'module'});\r\n this.worker = new Worker(this.workerURL);\r\n //this.wo = new Worker('worker/audiosignal.worker.ts');\r\n\r\n //let Worker = require('worker!../../../workers/uploader/main');\r\n let chs = this._audioData.numberOfChannels;\r\n\r\n let frameLength = this._audioData.getChannelData(0).length;\r\n // if(frameLength != this.audioData.getChannelData(1).length){\r\n // alert(\"Ungleiche Länge\");\r\n // }\r\n let ad = new Float32Array(chs * frameLength);\r\n for (let ch = 0; ch < chs; ch++) {\r\n ad.set(this._audioData.getChannelData(ch), ch * frameLength);\r\n }\r\n //let start = Date.now();\r\n if (this.worker) {\r\n this.worker.onmessage = (me) => {\r\n //console.log(\"As rendertime: \", Date.now() - start);\r\n this.drawRendered(me);\r\n if (this.worker) {\r\n this.worker.terminate();\r\n }\r\n this.worker = null;\r\n }\r\n }\r\n this.worker.postMessage({\r\n l: Math.round(this.bounds.position.left),\r\n t: Math.round(this.bounds.position.top),\r\n w: w,\r\n h: h,\r\n vw: Math.round(this.virtualDimension.width),\r\n chs: chs,\r\n frameLength: frameLength,\r\n audioData: ad\r\n }, [ad.buffer]);\r\n } else {\r\n let g = this.signalCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n drawRendered(me: MessageEvent) {\r\n this.drawBg();\r\n this.signalCanvas.style.left=me.data.l.toString()+'px';\r\n this.signalCanvas.width = me.data.w;\r\n this.signalCanvas.height = me.data.h;\r\n let g = this.signalCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.clearRect(0, 0, me.data.w, me.data.h);\r\n //g.fillStyle = \"black\";\r\n //g.fillRect(0, 0, me.data.w, me.data.h);\r\n let pointsLen = me.data.w * me.data.chs;\r\n // one for min one for max\r\n let arrLen = pointsLen * 2;\r\n if (this._audioData) {\r\n let std = Date.now();\r\n\r\n let chH = me.data.h / me.data.chs;\r\n\r\n let y = 0;\r\n for (let ch = 0; ch < me.data.chs; ch++) {\r\n let x = 0;\r\n\r\n let psMinPos = ch * me.data.w;\r\n let psMaxPos = pointsLen + psMinPos;\r\n\r\n g.fillStyle = 'green';\r\n g.strokeStyle = 'green';\r\n\r\n // draw audio signal as single polygon\r\n g.beginPath();\r\n g.moveTo(0, y + (chH / 2) + me.data.psMinMax[psMaxPos] * chH / 2);\r\n\r\n for (let pii = 0; pii < me.data.w; pii++) {\r\n let psMax = me.data.psMinMax[psMaxPos + pii];\r\n let pv = psMax * chH / 2;\r\n let yd=y + (chH / 2) - pv;\r\n //console.log(\"LineTo: : \"+pii+\" \"+yd)\r\n g.lineTo(pii, yd);\r\n }\r\n let revPixelStart=me.data.w-1;\r\n\r\n for (let pii = revPixelStart; pii >= 0; pii--) {\r\n let psMin = me.data.psMinMax[psMinPos + pii];\r\n let pv = psMin * chH / 2;\r\n let yd=y + (chH / 2) - pv;\r\n //console.log(\"LineTo: : \"+pii+\" \"+yd)\r\n g.lineTo(pii, yd);\r\n }\r\n g.closePath();\r\n\r\n g.fill();\r\n g.stroke();\r\n y += chH;\r\n }\r\n\r\n //this.drawPlayPosition();\r\n }\r\n }\r\n }\r\n\r\n redraw() {\r\n this.drawBg()\r\n let g = this.signalCanvas.getContext(\"2d\");\r\n if (g) {\r\n let w = this.signalCanvas.width;\r\n let h = this.signalCanvas.height;\r\n g.clearRect(0, 0, w, h);\r\n //g.fillStyle = \"black\";\r\n //g.fillRect(0, 0, w, h);\r\n if (this._audioData) {\r\n let std = Date.now();\r\n let chs = this._audioData.numberOfChannels;\r\n let chH = h / chs;\r\n\r\n let frameLength = this._audioData.getChannelData(0).length;\r\n\r\n let framesPerPixel = frameLength / w;\r\n let y = 0;\r\n for (let ch = 0; ch < chs; ch++) {\r\n let x = 0;\r\n let psMin = new Float32Array(w);\r\n let psMax = new Float32Array(w);\r\n let framePos = 0;\r\n for (let pii = 0; pii < w; pii++) {\r\n let pMin = 0;\r\n let pMax = 0;\r\n\r\n // calculate pixel min/max amplitude\r\n for (let ai = 0; ai < framesPerPixel; ai++) {\r\n //let framePos=(pii*framesPerPixel)+ai;\r\n let a = this._audioData.getChannelData(ch)[framePos++];\r\n\r\n if (a < pMin) {\r\n pMin = a;\r\n }\r\n if (a > pMax) {\r\n pMax = a;\r\n }\r\n }\r\n psMin[pii] = pMin;\r\n psMax[pii] = pMax;\r\n //console.log(\"Min: \", pMin, \" max: \", pMax);\r\n\r\n }\r\n\r\n g.fillStyle = 'green';\r\n g.strokeStyle = 'green';\r\n\r\n // draw audio signal as single polygon\r\n g.beginPath();\r\n g.moveTo(0, y + (chH / 2) + psMin[0] * chH / 2);\r\n\r\n for (let pii = 0; pii < w; pii++) {\r\n let pv = psMin[pii] * chH / 2;\r\n //console.log(\"Min: \",pv);\r\n g.lineTo(pii, y + (chH / 2) + pv);\r\n }\r\n for (let pii = w; pii >= 0; pii--) {\r\n let pv = psMax[pii] * chH / 2;\r\n //console.log(\"Max: \",pv);\r\n g.lineTo(pii, y + (chH / 2) + pv);\r\n }\r\n g.closePath();\r\n //g.lineTo()\r\n g.fill();\r\n g.stroke();\r\n g.fillStyle = \"yellow\";\r\n g.stroke();\r\n y += chH;\r\n }\r\n\r\n //this.drawPlayPosition();\r\n }\r\n }\r\n }\r\n\r\n setData(audioData: AudioBuffer | null) {\r\n this._audioData = audioData;\r\n this.playFramePosition = 0;\r\n }\r\n}\r\n\r\n","\n export class Complex {\n\n real: number;\n img: number;\n\n public static fromPolarForm(magnitude: number, argument: number): Complex {\n const r = Math.cos(argument) * magnitude;\n const i = Math.sin(argument) * magnitude;\n return new Complex(r, i);\n }\n constructor(real: number, img: number) {\n this.real = real;\n this.img = img;\n }\n public magnitude(): number {\n return Math.sqrt((this.real * this.real) + (this.img * this.img));\n }\n\n public argument(): number {\n return Math.atan2(this.img, this.real);\n }\n\n public add(addC: Complex): Complex {\n return new Complex(this.real + addC.real, this.img + addC.img);\n }\n\n public sub(subC: Complex): Complex {\n return new Complex(this.real - subC.real, this.img - subC.img);\n }\n\n public mult(multC: Complex): Complex {\n const multR = (this.real * multC.real) - (this.img * multC.img);\n const multI = (this.real * multC.img) + (multC.real * this.img);\n return new Complex(multR, multI);\n }\n\n public multReal(multF: number): Complex {\n return new Complex(this.real * multF, this.img * multF);\n }\n\n public div(divisor: Complex): Complex {\n const divReal = divisor.real;\n const divImg = divisor.img;\n const div = (divReal * divReal) + (divImg * divImg);\n const divisionReal = ((this.real * divReal) + (this.img * divImg)) / div;\n const divisionImg = ((divReal * this.img) - (this.real * divImg)) / div;\n\n return new Complex(divisionReal, divisionImg);\n }\n\n public divReal(divisor: number): Complex {\n const div = divisor * divisor;\n const divsionReal = (this.real * divisor) / div;\n const divsionImg = (divisor * this.img) / div;\n\n return new Complex(divsionReal, divsionImg);\n }\n\n public conjugate(): Complex {\n return new Complex(this.real, -this.img);\n }\n\n public equals(c: Complex): boolean {\n if (c === null) {\n return false;\n }\n return (this.real === c.real && this.img === c.img);\n }\n\n public toString(): string {\n return 'Real: ' + this.real + ', Img: ' + this.img;\n }\n }\n","import { Complex } from './complex';\n\n export class DFTFloat32 {\n\n private n: number;\n private m: number;\n\n private cosLookup: Float32Array;\n private sinLookup: Float32Array;\n\n constructor(n: number) {\n this.n = n;\n this.m = Math.log(n) / Math.log(2);\n\n // if(n != (1 << m))throw new RuntimeException(\"length N must be power of 2\");\n\n // lookup tables\n this.cosLookup = new Float32Array(n / 2);\n this.sinLookup = new Float32Array(n / 2);\n\n for (let i = 0; i < n / 2; i++) {\n const arc = (-2 * Math.PI * i) / n;\n this.cosLookup[i] = Math.cos(arc);\n this.sinLookup[i] = Math.sin(arc);\n }\n }\n\n public processReal(srcBuf: Float32Array): Array<Complex> {\n const x = srcBuf.slice();\n const y = new Float32Array(srcBuf.length);\n for (let yi = 0; yi < y.length; yi++) {\n y[yi] = 0.0;\n }\n this.fftCooleyTukey(x, y);\n const rc = new Array<Complex>(x.length);\n for (let i = 0; i < x.length; i++) {\n rc[i] = new Complex(x[i], y[i]);\n }\n return rc;\n }\n\n public processRealMagnitude(srcBuf: Float32Array): Float32Array {\n const x = srcBuf.slice();\n const y = new Float32Array(srcBuf.length);\n for (let yi = 0; yi < y.length; yi++) {\n y[yi] = 0.0;\n }\n this.fftCooleyTukey(x, y);\n const rc = new Float32Array(x.length);\n for (let i = 0; i < x.length; i++) {\n const rcc = new Complex(x[i], y[i]);\n rc[i] = rcc.magnitude();\n }\n return rc;\n }\n\n public fftCooleyTukey(real: Float32Array, img: Float32Array): void {\n let i: number;\n let j = 0;\n let k: number;\n let n1: number;\n let n2: number = this.n / 2;\n let a: number;\n let c: number;\n let s: number;\n let t1: number;\n let t2: number;\n\n for (i = 1; i < this.n - 1; i++) {\n n1 = n2;\n while (j >= n1) {\n j = j - n1;\n n1 = n1 / 2;\n }\n j = j + n1;\n\n if (i < j) {\n t1 = real[i];\n real[i] = real[j];\n real[j] = t1;\n t1 = img[i];\n img[i] = img[j];\n img[j] = t1;\n }\n }\n\n n1 = 0;\n n2 = 1;\n for (i = 0; i < this.m; i++) {\n n1 = n2;\n n2 = n2 + n2;\n a = 0;\n for (j = 0; j < n1; j++) {\n c = this.cosLookup[a];\n s = this.sinLookup[a];\n a += ( 1 << (this.m - i - 1));\n\n for (k = j; k < this.n; k = k + n2) {\n t1 = c * real[k + n1] - s * img[k + n1];\n t2 = s * real[k + n1] + c * img[k + n1];\n real[k + n1] = real[k] - t1;\n img[k + n1] = img[k] - t2;\n real[k] = real[k] + t1;\n img[k] = img[k] + t2;\n }\n }\n }\n }\n\n\n public process(t: Array<Complex>): Array<Complex> {\n const reals: Float32Array = new Float32Array(this.n);\n const imgs: Float32Array = new Float32Array(this.n);\n const trans: Array<Complex> = new Array<Complex>(this.n);\n for (let i = 0; i < this.n; i++) {\n reals[i] = t[i].real;\n imgs[i] = t[i].img;\n }\n this.fftCooleyTukey(reals, imgs);\n for (let i = 0; i < this.n; i++) {\n trans[i] = new Complex(reals[i], imgs[i]);\n }\n return trans;\n\n\n }\n\n }\n export class DFT {\n\n private n: number;\n private m: number;\n\n private cosLookup: Array<number>;\n private sinLookup: Array<number>;\n\n constructor(n: number) {\n this.n = n;\n this.m = Math.log(n) / Math.log(2);\n\n // if(n != (1 << m))throw new RuntimeException(\"length N must be power of 2\");\n\n // lookup tables\n this.cosLookup = new Array<number>(n / 2);\n this.sinLookup = new Array<number>(n / 2);\n\n for (let i = 0; i < n / 2; i++) {\n const arc = (-2 * Math.PI * i) / n;\n this.cosLookup[i] = Math.cos(arc);\n this.sinLookup[i] = Math.sin(arc);\n }\n }\n\n public processReal(srcBuf: Array<number>): Array<Complex> {\n const x = srcBuf.slice();\n const y = new Array<number>(srcBuf.length);\n for (let yi = 0; yi < y.length; yi++) {\n y[yi] = 0.0;\n }\n this.fftCooleyTukey(x, y);\n const rc = new Array<Complex>(x.length);\n for (let i = 0; i < x.length; i++) {\n rc[i] = new Complex(x[i], y[i]);\n }\n return rc;\n }\n\n public fftCooleyTukey(real: Array<number>, img: Array<number>): void {\n let i: number;\n let j = 0;\n let k: number;\n let n1: number;\n let n2: number = this.n / 2;\n let a: number;\n let c: number;\n let s: number;\n let t1: number;\n let t2: number;\n\n for (i = 1; i < this.n - 1; i++) {\n n1 = n2;\n while (j >= n1) {\n j = j - n1;\n n1 = n1 / 2;\n }\n j = j + n1;\n\n if (i < j) {\n t1 = real[i];\n real[i] = real[j];\n real[j] = t1;\n t1 = img[i];\n img[i] = img[j];\n img[j] = t1;\n }\n }\n\n n1 = 0;\n n2 = 1;\n for (i = 0; i < this.m; i++) {\n n1 = n2;\n n2 = n2 + n2;\n a = 0;\n for (j = 0; j < n1; j++) {\n c = this.cosLookup[a];\n s = this.sinLookup[a];\n a += 1 << (this.m - i - 1);\n\n for (k = j; k < this.n; k = k + n2) {\n t1 = c * real[k + n1] - s * img[k + n1];\n t2 = s * real[k + n1] + c * img[k + n1];\n real[k + n1] = real[k] - t1;\n img[k + n1] = img[k] - t2;\n real[k] = real[k] + t1;\n img[k] = img[k] + t2;\n }\n }\n }\n }\n\n\n public process(t: Array<Complex>): Array<Complex> {\n const reals: Array<number> = new Array<number>(this.n);\n const imgs: Array<number> = new Array<number>(this.n);\n const trans: Array<Complex> = new Array<Complex>(this.n);\n for (let i = 0; i < this.n; i++) {\n reals[i] = t[i].real;\n imgs[i] = t[i].img;\n }\n this.fftCooleyTukey(reals, imgs);\n for (let i = 0; i < this.n; i++) {\n trans[i] = new Complex(reals[i], imgs[i]);\n }\n return trans;\n }\n\n }\n\n","\n export class DSPUtils {\n\n private static OCTAVE_FACTOR: number = 1.0 / (Math.log(2) / Math.log(10));\n\n /**\n * Get normalized amplitude level in dB\n * @param linearLevel a normalized positive linear level (1.0 corresponds to 0dB)\n * @return level in dB\n */\n public static toLevelInDB(linearLevel: number): number {\n if (linearLevel < 0) {\n throw new RangeError('Linear level argument must be positive.');\n }\n\n return 10 * Math.log(linearLevel) / Math.log(10);\n }\n\n\n public static toLinearLevel(dbLevel: number): number {\n return Math.pow(10, (dbLevel / 10));\n }\n\n /**\n * Get normalized amplitude power level in dB\n * @param linearLevel a normalized positive linear level (1.0 corresponds to 0dB)\n * @return power level in dB\n */\n public static toPowerLevelInDB(linearLevel: number): number {\n if (linearLevel < 0) {\n throw new RangeError('Linear level argument must be positive.');\n }\n return 20 * Math.log(linearLevel) / Math.log(10);\n }\n\n public static toPowerLinearLevel(dbLevel: number): number {\n return Math.pow(10, (dbLevel / 20));\n }\n\n public static toOctaves(fq: number): number {\n return DSPUtils.OCTAVE_FACTOR * Math.log(fq) / Math.log(10);\n }\n\n public static maxLevel(audioBuffer: AudioBuffer): number {\n let ml = 0.0;\n for (let ch = 0; ch < audioBuffer.numberOfChannels; ch++) {\n const chArr = audioBuffer.getChannelData(ch);\n for (let s = 0; s < chArr.length; s++) {\n const l = Math.abs(chArr[s]);\n if (l > ml) {\n ml = l;\n }\n }\n }\n return ml;\n }\n\n }\n","\n\n export class Utils {\n public static toHexString(val: number, radix: number, numberOfDigits: number): string {\n const intVal = Math.round(val);\n let str = intVal.toString(radix);\n const countFillChars = numberOfDigits - str.length;\n if (countFillChars > 0) {\n for (let i = 0; i < countFillChars; i++) {\n str = str + 0;\n }\n }\n return str;\n }\n }\n\n","import { Utils } from '../math/utils';\n\n export class CSSUtils {\n\n static toColorString(red: number, green: number, blue: number): string {\n return '#' + Utils.toHexString(red, 16, 2) + Utils.toHexString(green, 16, 2) + Utils.toHexString(blue, 16, 2);\n }\n }\n","import {DFTFloat32} from '../../math/dft';\r\nimport {DSPUtils} from '../../dsp/utils'\r\nimport {CSSUtils} from '../../utils/css_utils'\r\nimport {Marker, Point} from './common';\r\nimport {Component, ElementRef, ViewChild} from \"@angular/core\";\r\nimport {AudioCanvasLayerComponent} from \"./audio_canvas_layer_comp\";\r\nimport {WorkerHelper} from \"../../utils/utils\";\r\n\r\ndeclare function postMessage(message: any, transfer: Array<any>): void;\r\n\r\nconst DEFAULT_DFT_SIZE = 1024;\r\n\r\n@Component({\r\n\r\n selector: 'audio-sonagram',\r\n template: `\r\n <canvas #sonagram height=\"10\"></canvas>\r\n <canvas #bg height=\"10\"></canvas>\r\n <canvas #cursor height=\"10\" (mousedown)=\"selectionStart($event)\" (mouseover)=\"updateCursorCanvas($event)\" (mousemove)=\"updateCursorCanvas($event)\"\r\n (mouseleave)=\"updateCursorCanvas($event, false)\"></canvas>\r\n <canvas #marker height=\"10\"></canvas>`,\r\n\r\n styles: [`:host{\r\n min-height: 0px;\r\n }`,`canvas {\r\n top: 0;\r\n left: 0;\r\n width: 0;\r\n height: 0;\r\n min-height: 0px;\r\n position: absolute;\r\n }`]\r\n\r\n})\r\nexport class Sonagram extends AudioCanvasLayerComponent {\r\n\r\n dft: DFTFloat32;\r\n n: any;\r\n ce!: HTMLDivElement;\r\n sonagramCanvas!: HTMLCanvasElement;\r\n //cursorCanvas: HTMLCanvasElement;\r\n markerCanvas!: HTMLCanvasElement;\r\n @ViewChild('sonagram', { static: true }) sonagramCanvasRef!: ElementRef;\r\n\r\n @ViewChild('marker', { static: true }) markerCanvasRef!: ElementRef;\r\n markers: Array<Marker>;\r\n private _playFramePosition: number|null=null;\r\n\r\n private worker: Worker | null;\r\n private workerURL: string;\r\n private dftSize = DEFAULT_DFT_SIZE;\r\n\r\n constructor(private ref: ElementRef) {\r\n super();\r\n this.worker = null;\r\n this._audioData = null;\r\n this.markers = new Array<Marker>();\r\n this.dft = new DFTFloat32(this.dftSize);\r\n\r\n this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction)\r\n this._bgColor=null;\r\n this._selectColor='rgba(255,255,0,0.1)'\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.ce = this.ref.nativeElement;\r\n this.sonagramCanvas = this.sonagramCanvasRef.nativeElement;\r\n this.sonagramCanvas.style.zIndex = '1';\r\n this.bgCanvas = this.bgCanvasRef.nativeElement;\r\n this.bgCanvas.style.zIndex = '2';\r\n this.cursorCanvas = this.cursorCanvasRef.nativeElement;\r\n this.cursorCanvas.style.zIndex = '4';\r\n this.markerCanvas = this.markerCanvasRef.nativeElement;\r\n this.markerCanvas.style.zIndex = '3';\r\n\r\n this.canvasLayers[0] = this.sonagramCanvas;\r\n this.canvasLayers[1] = this.bgCanvas;\r\n this.canvasLayers[2] = this.cursorCanvas;\r\n this.canvasLayers[3] = this.markerCanvas;\r\n\r\n }\r\n\r\n get playFramePosition(): number|null {\r\n return this._playFramePosition;\r\n }\r\n\r\n set playFramePosition(playFramePosition: number|null) {\r\n this._playFramePosition = playFramePosition;\r\n // this.redraw();\r\n this.drawPlayPosition();\r\n }\r\n\r\n private canvasMousePos(c: HTMLCanvasElement, e: MouseEvent): Point {\r\n const cr = c.getBoundingClientRect();\r\n\r\n const x = e.x - cr.left;\r\n const y = e.y - cr.top;\r\n return new Point(x,y);\r\n }\r\n\r\n drawCursorPosition(e: MouseEvent, show: boolean) {\r\n\r\n if (this.cursorCanvas) {\r\n const w = this.cursorCanvas.width;\r\n const h = this.cursorCanvas.height;\r\n const g = this.cursorCanvas.getContext('2d');\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n if (show) {\r\n const pp = this.canvasMousePos(this.cursorCanvas, e);\r\n let xViewPortPixelpos = e.offsetX;\r\n\r\n g.fillStyle = 'yellow';\r\n g.strokeStyle = 'yellow';\r\n g.beginPath();\r\n g.moveTo(xViewPortPixelpos, 0);\r\n g.lineTo(xViewPortPixelpos, h);\r\n g.closePath();\r\n\r\n g.stroke();\r\n\r\n if (this._audioData) {\r\n\r\n let framePosRound = this.viewPortXPixelToFramePosition(xViewPortPixelpos);\r\n if(framePosRound!=null) {\r\n g.font = '14px sans-serif';\r\n g.fillStyle = 'yellow';\r\n g.fillText(framePosRound.toString(), xViewPortPixelpos + 2, 50);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n drawPlayPosition() {\r\n if (this.markerCanvas) {\r\n var w = this.markerCanvas.width;\r\n var h = this.markerCanvas.height;\r\n var g = this.markerCanvas.getContext(\"2d\");\r\n if (g) {\r\n\r\n g.clearRect(0, 0, w, h);\r\n if(this._playFramePosition!=null) {\r\n let pixelPos = this.frameToViewPortXPixelPosition(this._playFramePosition);\r\n if (pixelPos) {\r\n g.fillStyle = 'red';\r\n g.strokeStyle = 'red';\r\n g.beginPath();\r\n g.moveTo(pixelPos, 0);\r\n g.lineTo(pixelPos, h);\r\n g.closePath();\r\n g.stroke();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // layout() {\r\n //\r\n //\r\n // var offW = this.sonagramCanvas.offsetWidth;\r\n // var offH = this.sonagramCanvas.offsetHeight;\r\n // this.layoutBounds(0, 0, offW, offH, true);\r\n // }\r\n\r\n\r\n // layoutBounds(left: number, top: number, offW: number, offH: number, virtualWidth:number,redraw: boolean) {\r\n //\r\n // const leftStr = left.toString() + 'px';\r\n // this.sonagramCanvas.style.left = leftStr;\r\n // const topStr = top.toString() + 'px';\r\n // this.sonagramCanvas.style.top = topStr;\r\n // this.cursorCanvas.style.top = topStr;\r\n // this.markerCanvas.style.top = topStr;\r\n //\r\n // if (offW) {\r\n // const wStr = offW.toString() + 'px';\r\n // if (redraw) {\r\n //\r\n // this.cursorCanvas.width = offW;\r\n // this.markerCanvas.width = offW;\r\n // }\r\n // this.sonagramCanvas.style.width = wStr;\r\n // this.cursorCanvas.style.width = wStr;\r\n // this.markerCanvas.style.width = wStr;\r\n // }\r\n // if (offH) {\r\n // const hStr = offH.toString() + 'px';\r\n // if (redraw) {\r\n // this.cursorCanvas.height = offH;\r\n // this.markerCanvas.height = offH;\r\n // }\r\n // this.sonagramCanvas.style.height = hStr;\r\n // this.cursorCanvas.style.height = hStr;\r\n // this.markerCanvas.style.height = hStr;\r\n //\r\n // }\r\n // if (redraw) {\r\n // //this.redraw();\r\n // if (offW > 0) {\r\n // if (offH > 0) {\r\n // this.startDraw(left,top,offW, offH,virtualWidth);\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n\r\n /*\r\n * Method used as worker code.\r\n */\r\n workerFunction() {\r\n\r\n // Redefine some DSP classes for worker function\r\n // See e.g. audio.math.Complex\r\n class Complex {\r\n\r\n real: number;\r\n img: number;\r\n\r\n public static fromPolarForm(magnitude: number, argument: number): Complex {\r\n const r = Math.cos(argument) * magnitude;\r\n const i = Math.sin(argument) * magnitude;\r\n return new Complex(r, i);\r\n }\r\n\r\n constructor(real: number, img: number) {\r\n this.real = real;\r\n this.img = img;\r\n }\r\n\r\n public magnitude(): number {\r\n return Math.sqrt((this.real * this.real) + (this.img * this.img));\r\n }\r\n\r\n public argument(): number {\r\n return Math.atan2(this.img, this.real);\r\n }\r\n\r\n public add(addC: Complex): Complex {\r\n return new Complex(this.real + addC.real, this.img + addC.img);\r\n }\r\n\r\n public sub(subC: Complex): Complex {\r\n return new Complex(this.real - subC.real, this.img - subC.img);\r\n }\r\n\r\n public mult(multC: Complex): Complex {\r\n const multR = (this.real * multC.real) - (this.img * multC.img);\r\n const multI = (this.real * multC.img) + (multC.real * this.img);\r\n return new Complex(multR, multI);\r\n }\r\n\r\n public multReal(multF: number): Complex {\r\n return new Complex(this.real * multF, this.img * multF);\r\n }\r\n\r\n public div(divisor: Complex): Complex {\r\n const divReal = divisor.real;\r\n const divImg = divisor.img;\r\n const div = (divReal * divReal) + (divImg * divImg);\r\n const divisionReal = ((this.real * divReal) + (this.img * divImg)) / div;\r\n const divisionImg = ((divReal * this.img) - (this.real * divImg)) / div;\r\n\r\n return new Complex(divisionReal, divisionImg);\r\n }\r\n\r\n public divReal(divisor: number): Complex {\r\n const div = divisor * divisor;\r\n const divsionReal = (this.real * divisor) / div;\r\n const divsionImg = (divisor * this.img) / div;\r\n\r\n return new Complex(divsionReal, divsionImg);\r\n }\r\n\r\n public conjugate(): Complex {\r\n return new Complex(this.real, -this.img);\r\n }\r\n\r\n public equals(c: Complex): boolean {\r\n if (c === null) {\r\n return false;\r\n }\r\n return (this.real === c.real && this.img === c.img);\r\n }\r\n\r\n public toString(): string {\r\n return 'Real: ' + this.real + ', Img: ' + this.img;\r\n }\r\n }\r\n\r\n class DFTFloat32 {\r\n\r\n private n: number;\r\n private m: number;\r\n\r\n private cosLookup: Float32Array;\r\n private sinLookup: Float32Array;\r\n\r\n constructor(n: number) {\r\n this.n = n;\r\n this.m = Math.log(n) / Math.log(2);\r\n\r\n // if(n != (1 << m))throw new RuntimeException(\"length N must be power of 2\");\r\n\r\n // lookup tables\r\n this.cosLookup = new Float32Array(n / 2);\r\n this.sinLookup = new Float32Array(n / 2);\r\n\r\n for (let i = 0; i < n / 2; i++) {\r\n const arc = (-2 * Math.PI * i) / n;\r\n this.cosLookup[i] = Math.cos(arc);\r\n this.sinLookup[i] = Math.sin(arc);\r\n }\r\n }\r\n\r\n public processReal(srcBuf: Float32Array): Array<Complex> {\r\n const x = srcBuf.slice();\r\n const y = new Float32Array(srcBuf.length);\r\n for (let yi = 0; yi < y.length; yi++) {\r\n y[yi] = 0.0;\r\n }\r\n this.fftCooleyTukey(x, y);\r\n const rc = new Array<Complex>(x.length);\r\n for (let i = 0; i < x.length; i++) {\r\n rc[i] = new Complex(x[i], y[i]);\r\n }\r\n return rc;\r\n }\r\n\r\n public processRealMagnitude(srcBuf: Float32Array): Float32Array {\r\n const x = srcBuf.slice();\r\n const y = new Float32Array(srcBuf.length);\r\n for (let yi = 0; yi < y.length; yi++) {\r\n y[yi] = 0.0;\r\n }\r\n this.fftCooleyTukey(x, y);\r\n const rc = new Float32Array(x.length);\r\n for (let i = 0; i < x.length; i++) {\r\n const rcc = new Complex(x[i], y[i]);\r\n rc[i] = rcc.magnitude();\r\n }\r\n return rc;\r\n }\r\n\r\n public fftCooleyTukey(real: Float32Array, img: Float32Array): void {\r\n let i: number;\r\n let j = 0;\r\n let k: number;\r\n let n1: number;\r\n let n2: number = this.n / 2;\r\n let a: number;\r\n let c: number;\r\n let s: number;\r\n let t1: number;\r\n let t2: number;\r\n\r\n for (i = 1; i < this.n - 1; i++) {\r\n n1 = n2;\r\n while (j >= n1) {\r\n j = j - n1;\r\n n1 = n1 / 2;\r\n }\r\n j = j + n1;\r\n\r\n if (i < j) {\r\n t1 = real[i];\r\n real[i] = real[j];\r\n real[j] = t1;\r\n t1 = img[i];\r\n img[i] = img[j];\r\n img[j] = t1;\r\n }\r\n }\r\n\r\n n1 = 0;\r\n n2 = 1;\r\n for (i = 0; i < this.m; i++) {\r\n n1 = n2;\r\n n2 = n2 + n2;\r\n a = 0;\r\n for (j = 0; j < n1; j++) {\r\n c = this.cosLookup[a];\r\n s = this.sinLookup[a];\r\n a += (1 << (this.m - i - 1));\r\n\r\n for (k = j; k < this.n; k = k + n2) {\r\n t1 = c * real[k + n1] - s * img[k + n1];\r\n t2 = s * real[k + n1] + c * img[k + n1];\r\n real[k + n1] = real[k] - t1;\r\n img[k + n1] = img[k] - t2;\r\n real[k] = real[k] + t1;\r\n img[k] = img[k] + t2;\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n public process(t: Array<Complex>): Array<Complex> {\r\n const reals: Float32Array = new Float32Array(this.n);\r\n const imgs: Float32Array = new Float32Array(this.n);\r\n const trans: Array<Complex> = new Array<Complex>(this.n);\r\n for (let i = 0; i < this.n; i++) {\r\n reals[i] = t[i].real;\r\n imgs[i] = t[i].img;\r\n }\r\n this.fftCooleyTukey(reals, imgs);\r\n for (let i = 0; i < this.n; i++) {\r\n trans[i] = new Complex(reals[i], imgs[i]);\r\n }\r\n return trans;\r\n\r\n\r\n }\r\n\r\n }\r\n\r\n interface WindowFunction {\r\n getScale(i: number): number;\r\n }\r\n\r\n class GaussianWindow implements WindowFunction {\r\n\r\n public static DEFAULT_SIGMA = 0.3;\r\n // Gaussian window function,\r\n // http://reference.wolfram.com/language/ref/GaussianWindow.html\r\n // val=exp(-50*x*x/9) => sigma=0.3\r\n\r\n private buf: Float32Array;\r\n\r\n constructor(size: number, sigma: number = GaussianWindow.DEFAULT_SIGMA) {\r\n this.buf = new Float32Array(size);\r\n const center = (size - 1) / 2;\r\n for (let i = 0; i < size; i++) {\r\n const quot = (i - center) / (sigma * center);\r\n const exp = -0.5 * quot * quot;\r\n this.buf[i] = Math.exp(exp);\r\n }\r\n }\r\n\r\n getScale(i: number): number {\r\n return this.buf[i];\r\n }\r\n\r\n }\r\n\r\n self.onmessage = function (msg:MessageEvent) {\r\n\r\n let l = msg.data.l;\r\n let w = msg.data.w;\r\n let h = msg.data.h;\r\n let vw = msg.data.vw;\r\n let chs = msg.data.chs;\r\n let audioData = new Array(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n audioData[ch] = new Float32Array(msg.data['audioData'][ch]);\r\n }\r\n\r\n let frameLength = msg.data.frameLength;\r\n let dftSize = msg.data.dftSize;\r\n\r\n let dftBands = dftSize / 2;\r\n let dft = new DFTFloat32(dftSize);\r\n let wf = new GaussianWindow(dftSize);\r\n\r\n let arrSize=w*h*4;\r\n if(arrSize<0){\r\n arrSize=0\r\n }\r\n let imgData = new Uint8ClampedArray(arrSize);\r\n //console.log(\"Render method:\");\r\n if (audioData && arrSize>0) {\r\n let chH = Math.round(h / chs);\r\n let framesPerPixel = frameLength / vw;\r\n //console.log(\"Render: \", w, \"x\", h);\r\n\r\n let b = new Float32Array(dftSize);\r\n let sona = new Array(chs);\r\n\r\n let maxPsd = -Infinity;\r\n let p = 0;\r\n for (let ch = 0; ch < chs; ch++) {\r\n p = ch * frameLength;\r\n let chDataLen=audioData[ch].length;\r\n let x = 0;\r\n // initialize DFT array buffer\r\n sona[ch] = new Array(w);\r\n let framePos = 0;\r\n for (let pii = 0; pii < w; pii++) {\r\n let virtPii = l + pii;\r\n // Position of sample data frame is pixel position mapped to audio frame position.\r\n // Then \"center\" the frame by shifting left by half the DFT size (=dftBands)\r\n framePos = Math.round((virtPii * framesPerPixel)-dftBands);\r\n // fill DFT buffer with windowed sample values\r\n for (let i = 0; i < dftSize; i++) {\r\n let samplePos=framePos + i;\r\n // initialize for negative sample positions and out of bounds positions\r\n let chDat=0;\r\n\r\n // Set audio sample if available\r\n if(samplePos>=0 && samplePos < chDataLen) {\r\n chDat = audioData[ch][samplePos];\r\n }\r\n\r\n // apply Window\r\n b[i] = chDat * wf.getScale(i);\r\n }\r\n // Calc DFT magnitudes\r\n let spectr = dft.processRealMagnitude(b);\r\n\r\n // Get maximum value of spectral energy\r\n for (let s = 0; s < dftBands; s++) {\r\n let psd = (2 * Math.pow(spectr[s], 2)) / dftBands;\r\n if (psd > maxPsd) {\r\n maxPsd = psd;\r\n }\r\n }\r\n // Set render model data for this pixel\r\n sona[ch][pii] = spectr;\r\n }\r\n }\r\n //maxPsd = (2 * Math.pow(max, 2)) / dftBands;\r\n\r\n for (let ch = 0; ch < chs; ch++) {\r\n\r\n for (let pii = 0; pii < w; pii++) {\r\n let allBlack = true;\r\n for (let y = 0; y < chH; y++) {\r\n let freqIdx = Math.round(y * dftBands / chH);\r\n // calculate the one sided power spectral density PSD (f, t) in Pa2/Hz\r\n // PSD(f) proportional to 2|X(f)|2 / (t2 - t1)\r\n let val = sona[ch][pii][freqIdx];\r\n let psd = (2 * Math.pow(val, 2)) / dftBands;\r\n // Calculate logarithmic value\r\n //let psdLog = ips.dsp.DSPUtils.toLevelInDB(psd / maxPsd);\r\n let linearLevel = psd / maxPsd;\r\n let psdLog = 10 * Math.log(linearLevel) / Math.log(10);\r\n // Fixed dynamic Range value of 70dB for now\r\n let dynRangeInDb = 70;\r\n let scaledVal = (psdLog + dynRangeInDb) / dynRangeInDb;\r\n\r\n // are the following checks necessary for clamped array ?\r\n if (scaledVal > 1.0)\r\n scaledVal = 1;\r\n if (scaledVal < 0.0) {\r\n scaledVal = 0;\r\n }\r\n let rgbVal = Math.round(255 * scaledVal);\r\n if (rgbVal < 0) {\r\n //\t\t\t\t\t\t\tSystem.out.println(\"Neg RGB val: \"+rgbVal);\r\n rgbVal = 0;\r\n }\r\n if (rgbVal > 255) {\r\n rgbVal = 255;\r\n }\r\n rgbVal = 255 - rgbVal;\r\n if (rgbVal > 0) {\r\n allBlack = false;\r\n }\r\n let py = chH - y;\r\n let dataPos = ((((ch * chH) + py) * w) + pii) * 4;\r\n imgData[dataPos + 0] = rgbVal; //R\r\n imgData[dataPos + 1] = rgbVal; //G\r\n imgData[dataPos + 2] = rgbVal; //B\r\n imgData[dataPos + 3] = 255; //A (alpha: fully opaque)\r\n }\r\n // if (allBlack) {\r\n // console.log(\"Black: \", pii, \" \", ch);\r\n // }\r\n }\r\n }\r\n }\r\n postMessage({imgData: imgData, l: l, w: msg.data.w, h: msg.data.h, vw: vw}, [imgData.buffer]);\r\n }\r\n }\r\n\r\n startDraw(clear = true) {\r\n if (clear) {\r\n if(this.bounds) {\r\n this.sonagramCanvas.style.left = Math.round(this.bounds.position.left).toString() + 'px';\r\n let intW = Math.round(this.bounds.dimension.width)\r\n let intH = Math.round(this.bounds.dimension.height)\r\n this.sonagramCanvas.width = intW;\r\n this.sonagramCanvas.height = intH;\r\n\r\n let g = this.sonagramCanvas.getContext(\"2d\");\r\n if (g) {\r\n //g.clearRect(0, 0,w, h);\r\n g.fillStyle = \"white\";\r\n g.fillRect(0, 0, intW, intH);\r\n }\r\n }\r\n }\r\n this.startRender();\r\n this.drawCursorLayer()\r\n }\r\n\r\n private startRender() {\r\n\r\n if (this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n\r\n }\r\n if (this.bounds) {\r\n let w = Math.round(this.bounds.dimension.width);\r\n let h = Math.round(this.bounds.dimension.height);\r\n\r\n\r\n if (this._audioData && w>0 && h>0) {\r\n\r\n this.worker = new Worker(this.workerURL);\r\n //this.wo = new Worker('./worker/sonagram.worker', { type: `module` });\r\n\r\n let chs = this._audioData.numberOfChannels;\r\n\r\n let frameLength = this._audioData.getChannelData(0).length;\r\n let ada = new Array<ArrayBuffer>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n // Need a copy here for the worker, otherwise this.audioData is not accessible after posting to the worker\r\n ada[ch] = this._audioData.getChannelData(ch).buffer.slice(0);\r\n }\r\n let start = Date.now();\r\n if (this.worker) {\r\n this.worker.onmessage = (me) => {\r\n this.drawRendered(me);\r\n if (this.worker) {\r\n this.worker.terminate();\r\n }\r\n this.worker = null;\r\n }\r\n }\r\n if (this.markerCanvas) {\r\n let g = this.markerCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.fillText(\"Rendering...\", 10, 20);\r\n }\r\n\r\n }\r\n this.worker.postMessage({\r\n audioData: ada,\r\n l: Math.round(this.bounds.position.left),\r\n w: w,\r\n h: h,\r\n vw: Math.round(this.virtualDimension.width),\r\n chs: chs,\r\n frameLength: frameLength,\r\n dftSize: this.dftSize\r\n }, ada);\r\n } else {\r\n let g = this.sonagramCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n }\r\n }\r\n }\r\n }\r\n\r\n drawRendered(me: MessageEvent) {\r\n if (this.sonagramCanvas) {\r\n\r\n this.sonagramCanvas.width = me.data.w;\r\n this.sonagramCanvas.height = me.data.h;\r\n let g = this.sonagramCanvas.getContext(\"2d\");\r\n if (g) {\r\n let imgDataArr: Uint8ClampedArray = me.data.imgData;\r\n if (me.data.w > 0 && me.data.h > 0) {\r\n let imgData = g.createImageData(me.data.w, me.data.h);\r\n imgData.data.set(imgDataArr);\r\n g.putImageData(imgData, 0, 0);\r\n }\r\n }\r\n }\r\n this.drawBg()\r\n this.drawPlayPosition();\r\n }\r\n\r\n // synchronous draw (not used anymore)\r\n redraw() {\r\n\r\n let g = this.sonagramCanvas.getContext(\"2d\");\r\n\r\n let w = this.sonagramCanvas.width;\r\n let h = this.sonagramCanvas.height;\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n g.fillStyle = \"white\";\r\n g.fillRect(0, 0, w, h);\r\n if (this._audioData) {\r\n let spectSize = Math.floor(this.dftSize / 2)\r\n let chs = this._audioData.numberOfChannels;\r\n let chH = h / chs;\r\n\r\n let frameLength = this._audioData.getChannelData(0).length;\r\n\r\n let framesPerPixel = frameLength / w;\r\n let y = 0;\r\n // TODO\r\n let b = new Float32Array(this.dftSize)\r\n\r\n let sona = new Array<Array<Float32Array>>(chs);\r\n let max = 0;\r\n let maxPsd = -Infinity;\r\n for (let ch = 0; ch < chs; ch++) {\r\n let x = 0;\r\n sona[ch] = new Array<Float32Array>(w);\r\n\r\n let chData = this._audioData.getChannelData(ch);\r\n // TODO center buffer\r\n\r\n let framePos = 0;\r\n for (let pii = 0; pii < w; pii++) {\r\n framePos = Math.round(pii * framesPerPixel);\r\n // calculate DFT at pixel position\r\n for (let i = 0; i < this.dftSize; i++) {\r\n let chDat = chData[framePos + i];\r\n b[i] = chDat;\r\n }\r\n let spectr = this.dft.processRealMagnitude(b);\r\n sona[ch][pii] = spectr;\r\n // @ts-ignore\r\n let pMax = Math.max.apply(null, spectr);\r\n if (pMax > max) {\r\n max = pMax;\r\n }\r\n\r\n for (let s = 0; s < spectSize; s++) {\r\n let psd = (2 * Math.pow(spectr[s], 2)) / spectSize;\r\n if (psd > maxPsd) {\r\n maxPsd = psd;\r\n }\r\n }\r\n }\r\n }\r\n //console.log(\"max: \", max);\r\n maxPsd = (2 * Math.pow(max, 2)) / spectSize;\r\n for (let ch = 0; ch < chs; ch++) {\r\n\r\n let framePos = 0;\r\n for (let pii = 0; pii < w; pii++) {\r\n framePos = pii * framesPerPixel;\r\n\r\n for (let y = 0; y < h; y++) {\r\n let freqIdx = Math.round(y * spectSize / h);\r\n\r\n // calculate the one sided power spectral density PSD (f, t) in Pa2/Hz\r\n // PSD(f) proportional to 2|X(f)|2 / (t2 - t1)\r\n let val = sona[ch][pii][freqIdx];\r\n let psd = (2 * Math.pow(val, 2)) / spectSize;\r\n\r\n // Calculate logarithmic\r\n let psdLog = DSPUtils.toLevelInDB(psd / maxPsd);\r\n let dynRangeInDb = 70;\r\n let scaledVal = (psdLog + dynRangeInDb) / dynRangeInDb;\r\n\r\n if (scaledVal > 1)\r\n scaledVal = 1;\r\n if (scaledVal < 0) {\r\n scaledVal = 0;\r\n }\r\n let rgbVal = (255 * scaledVal);\r\n if (rgbVal < 0) {\r\n//\t\t\t\t\t\t\tSystem.out.println(\"Neg RGB val: \"+rgbVal);\r\n rgbVal = 0;\r\n }\r\n if (rgbVal > 255) {\r\n rgbVal = 255;\r\n }\r\n rgbVal = 255 - rgbVal;\r\n let colorStr = CSSUtils.toColorString(rgbVal, rgbVal, rgbVal);\r\n g.fillStyle = colorStr;\r\n g.fillRect(pii, chH - y, 1, 1);\r\n }\r\n }\r\n }\r\n this.drawPlayPosition();\r\n }\r\n }\r\n }\r\n\r\n\r\n setData(audioData: AudioBuffer | null) {\r\n this._audioData = audioData;\r\n this.playFramePosition = 0;\r\n //this.redraw();\r\n //this.startRender();\r\n }\r\n\r\n\r\n}\r\n\r\n","import {\r\n ElementRef, AfterViewInit, HostListener, Input, OnInit, Output, EventEmitter\r\n} from '@angular/core'\r\nimport {AudioSignal} from './audiosignal'\r\nimport {Sonagram} from './sonagram'\r\nimport {Marker, Point} from './common'\r\n\r\nimport {Component, ViewChild} from '@angular/core';\r\nimport {Position,Dimension, Rectangle} from \"../../math/2d/geometry\";\r\nimport {AudioClip,Selection} from \"../persistor\";\r\nimport {BasicAudioCanvasLayerComponent} from \"./audio_canvas_layer_comp\";\r\nimport {Element} from \"@angular/compiler\";\r\n\r\n/*\r\n ResizeObserver not yet available in official Typescript declaration\r\n Crreated declaration from IDL until its available.\r\n See specs:\r\n https://www.w3.org/TR/resize-observer\r\n\r\n */\r\n\r\ninterface ResizeObserverSize {\r\n readonly inlineSize:number;\r\n readonly blockSize:number;\r\n};\r\n\r\ndeclare interface ResizeObserverEntry{\r\n readonly target: Element;\r\n readonly contentRect: DOMRectReadOnly ;\r\n readonly borderBoxSize: Array<ResizeObserverSize> ;\r\n readonly contentBoxSize: Array<ResizeObserverSize> ;\r\n readonly devicePixelContentBoxSize: Array<ResizeObserverSize> ;\r\n}\r\n\r\ndeclare interface ResizeObserverCallback {\r\n (entries: Array<ResizeObserverEntry>, observer: ResizeObserver):void;\r\n}\r\n\r\ndeclare enum ResizeObserverBoxOptions {\r\n \"border-box\", \"content-box\", \"device-pixel-content-box\"\r\n};\r\n\r\n// // Declare Resizeobserver\r\n// declare class ResizeObserver{\r\n// constructor(callback: ResizeObserverCallback);\r\n// observe: (el:Element,opts: ResizeObserverBoxOptions | null)=>void;\r\n// unobserve: (el:Element)=>void;\r\n// disconnect: ()=>void;\r\n// }\r\n\r\n/*\r\n * Container component for audio display.\r\n * The display elements are children of a virtual canvas. The virtual canvas makes it possible to have high zoom factors with very wide virtual audio displays.\r\n * Only the visible part of the virtual canvas is implemented as a browser canvas and therefore consuming memory.\r\n * The visible part has the same width as the viewport of the scroll pane parent.\r\n * The virtual canvas itself is implemented as a HTML div element.\r\n * The layout of the component is updated on resize of the parent or changes of the zoom factor.\r\n */\r\n@Component({\r\n\r\n selector: 'app-audio',\r\n template: `\r\n <div #virtualCanvas>\r\n <canvas #divider (mousedown)=\"mousedown($event)\" (mouseover)=\"mouseover($event)\"\r\n (mouseleave)=\"mouseleave($event)\" height=\"10\"></canvas>\r\n <audio-signal [pointerPosition]=\"pointer\" [selecting]=\"selecting\" [selection]=\"selection\" (pointerPositionEventEmitter)=\"pointerPositionChanged($event)\" (selectingEventEmitter)=\"selectingChanged($event)\" (selectedEventEmitter)=\"selectionChanged($event)\"></audio-signal>\r\n <audio-sonagram [pointerPosition]=\"pointer\" [selecting]=\"selecting\" [selection]=\"selection\" (pointerPositionEventEmitter)=\"pointerPositionChanged($event)\" (selectingEventEmitter)=\"selectingChanged($event)\" (selectedEventEmitter)=\"selectionChanged($event)\"></audio-sonagram>\r\n </div>\r\n `,\r\n styles: [`div {\r\n\r\n margin: 0;\r\n padding: 0;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n position: relative; /* TODO container div position must not be 'static' (default) to act as reference for the canvases */\r\n box-sizing: border-box;\r\n transform: none;\r\n overflow: hidden;\r\n }`, `canvas{\r\n top: 0;\r\n left: 0;\r\n width: 0;\r\n height: 0;\r\n cursor: ns-resize;\r\n position: absolute;\r\n zIndex: 1;\r\n transform: none;\r\n }`, `audio-signal {\r\n top: 0;\r\n left: 0;\r\n position: absolute;\r\n zIndex: 1;\r\n transform: none;\r\n }`, `audio-sonagram {\r\n top: 0;\r\n left: 0;\r\n position: absolute;\r\n zIndex: 1;\r\n transform: none;\r\n }`]\r\n\r\n})\r\nexport class AudioClipUIContainer extends BasicAudioCanvasLayerComponent implements OnInit,AfterViewInit{\r\n\r\n private static DIVIDER_PIXEL_SIZE = 10;\r\n\r\n parentE: HTMLElement;\r\n\r\n // Divider canvas\r\n @ViewChild('divider', { static: true }) canvasRef!: ElementRef;\r\n dc!: HTMLCanvasElement;\r\n\r\n // Virtual container\r\n @ViewChild('virtualCanvas', { static: true }) ceRef!: ElementRef;\r\n ce!: HTMLDivElement;\r\n\r\n @ViewChild(AudioSignal, { static: true }) as!: AudioSignal;\r\n @ViewChild(Sonagram, { static: true }) so!: Sonagram;\r\n\r\n private _audioClip:AudioClip | null=null;\r\n pointer: Marker|null=null;\r\n selecting: Selection|null=null;\r\n selection: Selection|null=null;\r\n @Output() selectionEventEmitter = new EventEmitter<Selection>();\r\n private _playFramePosition: number|null=null;\r\n private dragStartMouseY: number | null = null;\r\n private dragStartY: number | null = null;\r\n private dividerPosition = 0.5;\r\n\r\n userAction=false;\r\n\r\n private _xZoom: number | null = null; // pixels per second\r\n\r\n get xZoom(): number | null {\r\n return this._xZoom;\r\n }\r\n\r\n set xZoom(value: number | null) {\r\n this.userAction=true;\r\n this._xZoom = value;\r\n this.layout()\r\n this.userAction=false;\r\n }\r\n\r\n // if true the complete audio file is shown, the display fits to the visible panel, the x-zoom factor is variable, this is the default\r\n private _fixFitToPanel = true;\r\n\r\n set fixFitToPanel(value: boolean) {\r\n this._fixFitToPanel = value;\r\n if (value) {\r\n // we don't need clip bounds\r\n this.bounds=null;\r\n this._xZoom = null;\r\n } else {\r\n // hold current zoom value\r\n //this._xZoom=this.ce.offsetWidth/this._audioData.duration;\r\n }\r\n this.layout()\r\n }\r\n\r\n constructor(private ref: ElementRef) {\r\n super()\r\n this.parentE = this.ref.nativeElement;\r\n }\r\n\r\n ngOnInit() {\r\n this.ce = this.ceRef.nativeElement;\r\n this.dc = this.canvasRef.nativeElement;\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.layout();\r\n let heightListener = new MutationObserver((mrs: Array<MutationRecord>, mo: MutationObserver) => {\r\n\r\n let layout=false;\r\n mrs.forEach((mr: MutationRecord) => {\r\n if (!this.userAction && 'attributes' === mr.type && ('class' === mr.attributeName || 'style' === mr.attributeName)) {\r\n layout=true;\r\n }\r\n });\r\n if(layout){\r\n // re-layout required\r\n this.layout(false);\r\n }\r\n });\r\n\r\n heightListener.observe(this.ce, {attributes: true, childList: true, characterData: true});\r\n heightListener.observe(this.dc, {attributes: true, childList: true, characterData: true});\r\n\r\n let resizeObserver = new ResizeObserver((entries,obs) => {\r\n //console.log(\"Resize observed:\");\r\n entries.forEach((e)=>{\r\n //console.log(e.contentRect.width+\"x\"+e.contentRect.height);\r\n this.layout();\r\n })\r\n });\r\n\r\n resizeObserver.observe(this.ce);\r\n\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: Event): void {\r\n this.layout();\r\n }\r\n\r\n mouseover(me: MouseEvent) {\r\n this.dividerCursorPosition(me, true);\r\n }\r\n\r\n mouseleave(me: MouseEvent) {\r\n this.dividerCursorPosition(me, false);\r\n }\r\n\r\n mousedown(me: MouseEvent) {\r\n this.dragStartMouseY = me.clientY;\r\n this.dragStartY = this.dc.offsetTop;\r\n this.dragStartMouseY = me.clientY;\r\n }\r\n\r\n @HostListener('document:mouseup', ['$event'])\r\n onMouseup(me: MouseEvent) {\r\n if (this.dragStartY != null) {\r\n this.userAction=true;\r\n this.dividerDrag(me);\r\n this.layout(false);\r\n this.dragStartY = null;\r\n this.userAction=false;\r\n }\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMousemove(me: MouseEvent) {\r\n if (this.dragStartY != null) {\r\n this.userAction=true;\r\n this.dividerDrag(me);\r\n this.layoutScaled();\r\n this.userAction=true;\r\n }\r\n }\r\n\r\n pointerPositionChanged(pp:Marker){\r\n this.pointer=pp\r\n }\r\n\r\n selectingChanged(s:Selection| null){\r\n this.selecting=s\r\n }\r\n\r\n selectionChanged(s:Selection){\r\n this.selection=s\r\n if(this._audioClip){\r\n this._audioClip.selection=s\r\n }\r\n this.selectionEventEmitter.emit(this.selection)\r\n }\r\n\r\n private canvasMousePos(c: HTMLCanvasElement, e: MouseEvent): Point {\r\n const cr = c.getBoundingClientRect();\r\n const x = e.x - cr.left;\r\n const y = e.y - cr.top;\r\n return new Point(x,y);\r\n }\r\n\r\n dividerCursorPosition(e: MouseEvent, show: boolean) {\r\n if (this.dc) {\r\n\r\n const w = this.dc.width;\r\n const h = this.dc.height;\r\n const g = this.dc.getContext('2d');\r\n\r\n const pp = this.canvasMousePos(this.dc, e);\r\n const offX = e.offsetX - this.dc.offsetLeft;\r\n const offY = e.offsetY - this.dc.offsetTop;\r\n\r\n }\r\n }\r\n\r\n dividerDrag(e: MouseEvent) {\r\n if (this.dc && this.dragStartMouseY && this.dragStartY) {\r\n\r\n const dragOffset = e.clientY - this.dragStartMouseY;\r\n const ceHeight = this.ce.offsetHeight;\r\n\r\n let newTop = (this.dragStartY + dragOffset);\r\n if (newTop < 0) {\r\n newTop = 0;\r\n }\r\n if (newTop > ceHeight - AudioClipUIContainer.DIVIDER_PIXEL_SIZE) {\r\n newTop = ceHeight - AudioClipUIContainer.DIVIDER_PIXEL_SIZE;\r\n }\r\n this.dc.style.top = newTop.toString() + 'px';\r\n this.dividerPosition = (this.dc.offsetTop + AudioClipUIContainer.DIVIDER_PIXEL_SIZE / 2) / ceHeight;\r\n if (this.dividerPosition > 1.0) {\r\n this.dividerPosition = 1.0;\r\n }\r\n if (this.dividerPosition < 0.0) {\r\n this.dividerPosition = 0.0;\r\n }\r\n this.drawDivider();\r\n }\r\n }\r\n\r\n\r\n drawDivider() {\r\n const w = this.dc.width;\r\n const h = this.dc.height;\r\n const g = this.dc.getContext('2d');\r\n if (g && w>10 && h>=1) {\r\n g.fillStyle = 'white';\r\n g.fillRect(0, 0, w, h);\r\n g.fillStyle = 'black';\r\n g.fillRect(5, 5, w - 10, 1);\r\n }\r\n }\r\n\r\n clipBounds(clipBounds: Rectangle) {\r\n this.bounds = clipBounds;\r\n this.layout();\r\n }\r\n\r\n currentXZoom(): number | null {\r\n let xz = this._xZoom;\r\n if (xz==null && this._audioData) {\r\n let ow = this.ce.offsetWidth;\r\n if (ow < 1) {\r\n // at least one pixel width to avoid x-zoom zero values\r\n ow = 1;\r\n }\r\n xz = ow / this._audioData.duration;\r\n }\r\n return xz;\r\n }\r\n\r\n private _layout(clear: boolean, redraw: boolean) {\r\n let ceBcr = this.ce.getBoundingClientRect();\r\n\r\n const ceBcrIntW = Math.floor(ceBcr.width);\r\n const ceBcrIntH = Math.floor(ceBcr.height);\r\n\r\n // height available for plugins (audiosignal and sonagram)\r\n let psH = ceBcrIntH - AudioClipUIContainer.DIVIDER_PIXEL_SIZE;\r\n if (psH < 0) {\r\n psH = 0;\r\n }\r\n // audio signal height\r\n const asH = Math.round(psH * this.dividerPosition);\r\n\r\n // sonagram height (rest: available height minus divider height minus audiosignal height)\r\n let soH = ceBcrIntH - AudioClipUIContainer.DIVIDER_PIXEL_SIZE - asH;\r\n if (soH < 0) {\r\n soH = 0;\r\n }\r\n\r\n // sonagram top position\r\n const soTop = asH + AudioClipUIContainer.DIVIDER_PIXEL_SIZE;\r\n\r\n // Visible bounds\r\n // left position\r\n let vbLeft = 0;\r\n // width\r\n let vbWidth = ceBcrIntW;\r\n if (!this._fixFitToPanel && this.bounds) {\r\n vbLeft = Math.round(this.bounds.position.left);\r\n vbWidth = Math.round(this.bounds.dimension.width);\r\n }\r\n\r\n // Divider\r\n // left position\r\n let vbLeftStyl = vbLeft + 'px';\r\n if (this.dc.style.left != vbLeftStyl) {\r\n this.dc.style.left = vbLeftStyl;\r\n }\r\n // top position\r\n const dTop = asH;\r\n const dTopStr = dTop + 'px';\r\n if (this.dc.style.top != dTopStr) {\r\n this.dc.style.top = dTopStr;\r\n }\r\n // width\r\n let vbWidthStyle = vbWidth + 'px';\r\n if (this.dc.style.width != vbWidthStyle) {\r\n this.dc.style.width = vbWidthStyle;\r\n }\r\n if (this.dc.width != vbWidth) {\r\n this.dc.width = vbWidth;\r\n }\r\n // height\r\n if(this.dc.height!=AudioClipUIContainer.DIVIDER_PIXEL_SIZE) {\r\n this.dc.height = AudioClipUIContainer.DIVIDER_PIXEL_SIZE;\r\n\r\n }\r\n let divPixelSizeStyle=AudioClipUIContainer.DIVIDER_PIXEL_SIZE.toString() + 'px';\r\n if(this.dc.style.height!=divPixelSizeStyle) {\r\n this.dc.style.height = divPixelSizeStyle;\r\n }\r\n\r\n this.drawDivider();\r\n\r\n\r\n // Virtual dimension, only width is used\r\n let virtualDim = new Dimension(ceBcrIntW, 0)\r\n\r\n // Visible bounds of container\r\n let br = new Rectangle(new Position(vbLeft, 0), new Dimension(vbWidth, ceBcrIntH));\r\n\r\n // Set container bounds\r\n this.layoutBounds(br, virtualDim, false);\r\n\r\n // Visible bounds of audiosignal\r\n let asR = new Rectangle(new Position(vbLeft, 0), new Dimension(vbWidth, asH));\r\n\r\n // Set audiosignal bounds\r\n this.as.layoutBounds(asR, virtualDim, redraw, clear);\r\n\r\n // Visible bounds of sonagram\r\n let soR = new Rectangle(new Position(vbLeft, soTop), new Dimension(vbWidth, soH));\r\n\r\n // Set sonagram bounds\r\n this.so.layoutBounds(soR, virtualDim, redraw, clear);\r\n }\r\n\r\n layoutScaled() {\r\n this._layout(false, false);\r\n }\r\n\r\n layout(clear=true) {\r\n\r\n if(this.ce && this.dc) {\r\n const clientW=this.ce.clientWidth;\r\n if(this._audioData){\r\n if(this._fixFitToPanel) {\r\n // Set the virtual canvas width to the visible width\r\n if(this.ce.style.width!='100%') {\r\n //console.log(\"set width to 100%\");\r\n this.ce.style.width = '100%';\r\n }\r\n }else{\r\n if (this._xZoom) {\r\n // Set the virtual canvas width according to the value of the user selected xZoom value\r\n const newClW = Math.round( this._xZoom*this._audioData.duration );\r\n this.ce.style.width = newClW + 'px';\r\n } else {\r\n // Set the virtual canvas width to the visible width only\r\n this.ce.style.width = clientW + 'px';\r\n }\r\n }\r\n }\r\n this._layout(clear,true);\r\n }\r\n }\r\n\r\n @Input()\r\n set audioData(audioData: AudioBuffer | null) {\r\n this._audioClip=null\r\n this._audioData=audioData;\r\n this.as.setData(audioData);\r\n this.so.setData(audioData);\r\n this.layout();\r\n }\r\n\r\n get audioData():AudioBuffer|null{\r\n return this._audioData\r\n }\r\n\r\n @Input()\r\n set audioClip(audioClip: AudioClip | null) {\r\n this._audioClip=audioClip\r\n let audioData:AudioBuffer|null=null;\r\n let sel:Selection|null=null;\r\n if(audioClip) {\r\n audioData = audioClip.buffer;\r\n if (this._audioClip) {\r\n this._audioClip.addSelectionObserver((clip) => {\r\n this.selection = clip.selection\r\n });\r\n }\r\n sel=audioClip.selection;\r\n }\r\n this._audioData = audioData;\r\n this.as.setData(this._audioData);\r\n this.so.setData(this._audioData);\r\n this.selecting=null\r\n this.selection=sel\r\n this.layout();\r\n }\r\n\r\n get playFramePosition(): number |null {\r\n return this._playFramePosition;\r\n }\r\n\r\n set playFramePosition(playFramePosition: number|null) {\r\n this._playFramePosition = playFramePosition;\r\n this.as.playFramePosition = playFramePosition;\r\n this.so.playFramePosition = playFramePosition;\r\n }\r\n}\r\n\r\n","import {\r\n Component,\r\n ViewChild,\r\n HostListener, ElementRef, Output, Input,\r\n} from '@angular/core'\r\n\r\n\r\nimport {AudioClipUIContainer} from '../ui/container'\r\nimport {Action} from \"../../action/action\";\r\nimport {Position,Dimension, Rectangle} from \"../../math/2d/geometry\";\r\nimport {AudioClip, Selection} from \"../persistor\";\r\n\r\n@Component({\r\n\r\n selector: 'audio-display-scroll-pane',\r\n\r\n template: `\r\n\r\n <app-audio #audioSignalContainer (selectionEventEmitter)=\"selectionChanged($event)\"></app-audio>\r\n\r\n `,\r\n styles: [\r\n `:host {\r\n flex: 2;\r\n width: 100%;\r\n background: darkgray;\r\n box-sizing: border-box;\r\n height: 100%;\r\n position: relative;\r\n overflow-x: scroll;\r\n overflow-y: auto;\r\n }`,\r\n `app-audio {\r\n\r\n margin: 0;\r\n padding: 0;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n\r\n /*position: absolute;*/\r\n box-sizing: border-box;\r\n }`]\r\n\r\n})\r\nexport class AudioDisplayScrollPane {\r\n\r\n private spEl!:HTMLElement;\r\n\r\n @Output() zoomInAction:Action<void>=new Action('+');\r\n @Output() zoomOutAction:Action<void>=new Action('-');\r\n @Output() zoomSelectedAction:Action<void>=new Action(\"Selected\");\r\n @Output() zoomFitToPanelAction:Action<void>=new Action(\"Fit to panel\");\r\n zoomFixFitToPanelAction:Action<void>=new Action(\"Fix fit to panel\");\r\n\r\n\r\n @ViewChild(AudioClipUIContainer, { static: true })\r\n private ac!: AudioClipUIContainer;\r\n\r\n\r\n\r\n constructor( private ref: ElementRef) {\r\n this.spEl = this.ref.nativeElement;\r\n\r\n this.zoomInAction.onAction = (e) => {\r\n this.ac.fixFitToPanel = false\r\n let oldXZoom = this.ac.currentXZoom()\r\n if(oldXZoom === null){\r\n return;\r\n }\r\n let newXzoom = oldXZoom * 2;\r\n this.ac.xZoom = newXzoom;\r\n\r\n let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));\r\n this.ac.clipBounds(cbr);\r\n this.zoomFitToPanelAction.disabled=false\r\n }\r\n this.zoomOutAction.onAction = (e) => {\r\n this.ac.fixFitToPanel = false\r\n let cbr1 = new Rectangle(new Position((this.spEl.scrollLeft / 2) - this.spEl.clientWidth, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));\r\n this.ac.clipBounds(cbr1);\r\n let oldXZoom = this.ac.currentXZoom()\r\n if(oldXZoom === null){\r\n return;\r\n }\r\n let newXzoom = oldXZoom / 2;\r\n this.ac.xZoom = newXzoom;\r\n\r\n let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));\r\n this.ac.clipBounds(cbr);\r\n this.zoomFitToPanelAction.disabled=false\r\n }\r\n\r\n this.zoomFitToPanelAction.onAction = (e) => {\r\n\r\n this.zoomFitToPanelAction.disabled=true\r\n\r\n // set container div width to this (viewport) width\r\n this.ac.ce.style.width=this.spEl.offsetWidth+'px';\r\n\r\n this.ac.fixFitToPanel=true;\r\n }\r\n\r\n this.zoomSelectedAction.onAction = (e) => {\r\n //alert(\"not implemented yet\")\r\n\r\n let s = this.ac.selection\r\n if (s) {\r\n // reset auto fit to panel mode\r\n this.ac.fixFitToPanel = false\r\n\r\n // calculate selection length in seconds\r\n if(this.ac.audioData) {\r\n let sr = this.ac.audioData.sampleRate;\r\n let selFrLen = s.endFrame - s.startFrame;\r\n let selLenInSecs = selFrLen / sr;\r\n // calculate corresponding xZoom value\r\n let newXZoom = this.spEl.clientWidth / selLenInSecs\r\n // apply xZoom\r\n this.ac.xZoom = newXZoom\r\n\r\n // Move viewport to show selection\r\n let x1 = this.ac.frameToXPixelPosition(s.startFrame);\r\n if (x1 !== null) {\r\n this.spEl.scrollLeft = x1;\r\n }\r\n }\r\n this.updateClipBounds()\r\n this.zoomFitToPanelAction.disabled = false\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n updateClipBounds(){\r\n let cbr=new Rectangle(new Position(this.spEl.scrollLeft,this.spEl.scrollTop), new Dimension(this.spEl.clientWidth,this.spEl.clientHeight));\r\n this.ac.clipBounds(cbr);\r\n }\r\n\r\n @HostListener('scroll', ['$event'])\r\n onScroll(se: Event) {\r\n this.updateClipBounds()\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: Event): void {\r\n this.updateClipBounds()\r\n }\r\n\r\n layout(){\r\n this.ac.layout();\r\n }\r\n\r\n selectionChanged(s:Selection| null){\r\n this.zoomSelectedAction.disabled=(s==null)\r\n }\r\n\r\n set audioData(audioData: AudioBuffer | null) {\r\n this.ac.audioData=audioData;\r\n this.zoomOutAction.disabled=(!audioData)\r\n this.zoomInAction.disabled=(!audioData)\r\n }\r\n\r\n @Input()\r\n set audioClip(audioClip: AudioClip | null) {\r\n\r\n let audioData:AudioBuffer|null=null;\r\n let sel:Selection|null=null;\r\n if(audioClip){\r\n audioData=audioClip.buffer;\r\n sel=audioClip.selection;\r\n audioClip.addSelectionObserver((clip)=>{\r\n this.zoomSelectedAction.disabled=(clip.selection==null)\r\n })\r\n }\r\n\r\n this.selectionChanged(sel)\r\n this.ac.audioClip=audioClip\r\n this.zoomOutAction.disabled=(!audioData)\r\n this.zoomInAction.disabled=(!audioData)\r\n window.setTimeout(()=>{\r\n this.layout();\r\n })\r\n }\r\n\r\n\r\n set playFramePosition(framePos:number){\r\n this.ac.playFramePosition=framePos;\r\n }\r\n\r\n\r\n}\r\n\r\n","import {Component, AfterContentInit, ChangeDetectorRef, Input, ViewChild} from '@angular/core'\r\nimport {Action} from \"../../action/action\";\r\nimport {MatCheckbox, MatCheckboxChange} from \"@angular/material/checkbox\";\r\nimport {AudioClip} from \"../persistor\";\r\n\r\n\r\n @Component({\r\n\r\n selector: 'audio-display-control',\r\n\r\n template: `\r\n <div #controlPanel style=\"display:flex;flex-direction: row;\">\r\n <fieldset>\r\n\r\n <legend>Play</legend>\r\n\r\n <button (click)=\"playStartAction?.perform()\" [disabled]=\"playStartAction?.disabled\"\r\n [style.color]=\"playStartAction?.disabled ? 'grey' : 'green'\" matTooltip=\"Play all\">\r\n <mat-icon>play_arrow</mat-icon>\r\n </button>\r\n <button (click)=\"playSelectionAction?.perform()\" [disabled]=\"playSelectionAction?.disabled\"\r\n [style.color]=\"playSelectionAction?.disabled ? 'grey' : 'green'\" matTooltip=\"Play selection\">\r\n <mat-icon>play_circle_outline</mat-icon>\r\n </button>\r\n <button (click)=\"playStopAction?.perform()\" [disabled]=\"playStopAction?.disabled\"\r\n [style.color]=\"playStopAction?.disabled ? 'grey' : 'yellow'\">\r\n <mat-icon>stop</mat-icon>\r\n </button> \r\n <mat-checkbox #autoplaySelectionCheckbox (change)=\"autoPlaySelectionChange($event)\">Autoplay on select\r\n </mat-checkbox>\r\n </fieldset>\r\n <fieldset>\r\n\r\n <legend>Zoom</legend>\r\n <button (click)=\"zoomFitToPanelAction?.perform()\"\r\n [disabled]=\"zoomFitToPanelAction?.disabled\">{{zoomFitToPanelAction?.name}}</button>\r\n <button (click)=\"zoomOutAction?.perform()\"\r\n [disabled]=\"zoomOutAction?.disabled\">{{zoomOutAction?.name}}</button>\r\n <button (click)=\"zoomInAction?.perform()\"\r\n [disabled]=\"zoomInAction?.disabled\">{{zoomInAction?.name}}</button>\r\n <button (click)=\"zoomSelectedAction?.perform()\"\r\n [disabled]=\"zoomSelectedAction?.disabled\">{{zoomSelectedAction?.name}}</button>\r\n </fieldset>\r\n <fieldset>\r\n <legend>Selection</legend>\r\n {{audioClip?.selection?.leftFrame}} <span\r\n *ngIf=\"audioClip?.selection\">to</span> {{audioClip?.selection?.rightFrame}}\r\n <button (click)=\"clearSelection()\" [disabled]=\"audioClip?.selection==null\"\r\n [style.color]=\"hasSelection() ? 'red' : 'grey'\" matTooltip=\"Clear selection\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n\r\n </fieldset>\r\n </div>`,\r\n styles: [\r\n `:host {\r\n flex: 0;\r\n\r\n }`]\r\n\r\n })\r\n\texport class AudioDisplayControl implements AfterContentInit {\r\n\r\n @Input() audioClip: AudioClip|null=null;\r\n\r\n @ViewChild(MatCheckbox, { static: true })\r\n private autoplaySelectedCheckbox: MatCheckbox|null=null;\r\n @Input() playStartAction: Action<void>|undefined;\r\n @Input() playSelectionAction: Action<void>|undefined;\r\n @Input() playStopAction: Action<void>|undefined;\r\n @Input() zoomInAction: Action<void>|null=null;\r\n @Input() zoomOutAction: Action<void>|null=null;\r\n @Input() zoomFitToPanelAction: Action<void>|undefined;\r\n @Input() zoomSelectedAction: Action<void>|undefined;\r\n @Input() autoPlayOnSelectToggleAction: Action<boolean>|undefined;\r\n\t status:string|null=null;\r\n\r\n\t\taudio:any;\r\n\r\n\t\tconstructor(private ref: ChangeDetectorRef) {\r\n\r\n\t\t}\r\n\r\n ngAfterContentInit() {\r\n\r\n\t\t}\r\n\r\n clearSelection(){\r\n if(this.audioClip!=null){\r\n this.audioClip.selection=null\r\n }\r\n }\r\n\r\n hasSelection():boolean{\r\n let hs=false;\r\n if(this.audioClip){\r\n hs=(this.audioClip.selection!=null);\r\n }\r\n return hs;\r\n }\r\n\r\n autoPlaySelectionChange(ch: MatCheckboxChange) {\r\n if (this.autoPlayOnSelectToggleAction) {\r\n this.autoPlayOnSelectToggleAction.perform(ch.checked)\r\n }\r\n }\r\n\r\n\t\terror(){\r\n\t\t\tthis.status = 'ERROR';\r\n\t\t}\r\n\r\n\r\n }\r\n\r\n","import {\r\n Component,\r\n ViewChild,\r\n ChangeDetectorRef,\r\n AfterViewInit, Input, OnInit, ElementRef,\r\n} from '@angular/core'\r\n\r\nimport {AudioClip, Selection} from './persistor'\r\nimport {ActivatedRoute} from \"@angular/router\";\r\nimport {Action} from \"../action/action\";\r\nimport {AudioDisplayScrollPane} from \"./ui/audio_display_scroll_pane\";\r\n\r\n@Component({\r\n\r\n selector: 'app-audiodisplay',\r\n\r\n template: `\r\n\r\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\r\n\r\n <audio-display-control [audioClip]=\"audioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [playStopAction]=\"playStopAction\"\r\n [autoPlayOnSelectToggleAction]=\"autoPlayOnSelectToggleAction\"\r\n [zoomInAction]=\"zoomInAction\"\r\n [zoomOutAction]=\"zoomOutAction\"\r\n [zoomSelectedAction]=\"zoomSelectedAction\"\r\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\r\n `,\r\n styles: [\r\n `:host {\r\n display: flex;\r\n flex-direction: column;\r\n position: absolute;\r\n bottom: 0px;\r\n height: 100%;\r\n width: 100%;\r\n overflow: hidden;\r\n padding: 20px;\r\n z-index: 5;\r\n box-sizing: border-box;\r\n background-color: rgba(230, 230, 230, 1.0)\r\n }`,`\r\n legend{\r\n margin-left: 1em; padding: 0.2em 0.8em;font-size: 0.8em;\r\n }`,`\r\n fieldset{\r\n border: 1px darkgray solid\r\n }\r\n `]\r\n\r\n})\r\nexport class AudioDisplay implements OnInit,AfterViewInit {\r\n\r\n parentE: HTMLElement;\r\n private _audioClip:AudioClip|null=null\r\n\r\n @Input()\r\n playStartAction: Action<void>|undefined;\r\n @Input()\r\n playStopAction: Action<void>|undefined;\r\n @Input()\r\n playSelectionAction:Action<void>|undefined;\r\n @Input()\r\n autoPlayOnSelectToggleAction!:Action<boolean>|undefined;\r\n\r\n zoomFitToPanelAction!:Action<void>;\r\n zoomSelectedAction!:Action<void>\r\n zoomInAction!:Action<void>;\r\n zoomOutAction!:Action<void>;\r\n\r\n clearSelectionAction!:Action<void>\r\n\r\n status: string;\r\n\r\n audio: any;\r\n\r\n @ViewChild(AudioDisplayScrollPane, { static: true })\r\n audioDisplayScrollPane!: AudioDisplayScrollPane;\r\n\r\n constructor(private route: ActivatedRoute, private ref: ChangeDetectorRef,private eRef:ElementRef) {\r\n //console.log(\"constructor: \"+this.ac);\r\n this.parentE=this.eRef.nativeElement;\r\n this.playStartAction = new Action(\"Start\");\r\n this.playSelectionAction=new Action(\"Play selected\");\r\n this.playStopAction = new Action(\"Stop\");\r\n this.status=\"Player created.\";\r\n\r\n }\r\n\r\n ngOnInit(){\r\n this.zoomSelectedAction=this.audioDisplayScrollPane.zoomSelectedAction\r\n this.zoomFitToPanelAction=this.audioDisplayScrollPane.zoomFitToPanelAction\r\n this.zoomOutAction=this.audioDisplayScrollPane.zoomOutAction\r\n this.zoomInAction=this.audioDisplayScrollPane.zoomInAction\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.layout();\r\n let heightListener=new MutationObserver((mrs:Array<MutationRecord>,mo:MutationObserver)=>{\r\n mrs.forEach((mr:MutationRecord)=>{\r\n if('attributes'===mr.type && ('class'===mr.attributeName || 'style'===mr.attributeName)){\r\n this.layout();\r\n }\r\n })\r\n });\r\n heightListener.observe(this.parentE,{attributes: true,childList: true, characterData: true});\r\n }\r\n\r\n\r\n layout(){\r\n this.audioDisplayScrollPane.layout();\r\n }\r\n\r\n\r\n started() {\r\n console.log(\"Play started\");\r\n this.status = 'Playing...';\r\n }\r\n\r\n\r\n @Input()\r\n set audioData(audioBuffer: AudioBuffer){\r\n this.audioDisplayScrollPane.audioData = audioBuffer;\r\n if(this.playStartAction) {\r\n this.playStartAction.disabled = (audioBuffer == null)\r\n }\r\n }\r\n\r\n @Input()\r\n set audioClip(audioClip: AudioClip | null) {\r\n\r\n let audioData:AudioBuffer|null=null;\r\n let sel:Selection|null=null;\r\n if(audioClip){\r\n audioData=audioClip.buffer;\r\n sel=audioClip.selection;\r\n }\r\n this._audioClip=audioClip\r\n this.audioDisplayScrollPane.audioClip = audioClip;\r\n //this.playStartAction.disabled = (audioData!==null)\r\n }\r\n\r\n get audioClip():AudioClip|null{\r\n return this._audioClip\r\n }\r\n\r\n set playFramePosition(playFramePosition:number){\r\n this.audioDisplayScrollPane.playFramePosition = playFramePosition\r\n }\r\n\r\n error() {\r\n this.status = 'ERROR';\r\n }\r\n\r\n}\r\n\r\n","\n\nimport {Directive, ElementRef, Input} from \"@angular/core\";\n@Directive({\n selector: \"[scrollIntoViewToBottom]\"\n})\nexport class ScrollIntoViewDirective{\n\n constructor(private elRef:ElementRef){}\n @Input()\n set scrollIntoViewToBottom(siv:boolean){\n if(siv){\n this.elRef.nativeElement.scrollIntoView(false);\n }\n }\n\n}\n","import {Component, EventEmitter, Input, Output} from '@angular/core'\r\nimport {Item} from './item';\r\n\r\n\r\n@Component({\r\n\r\n selector: 'app-sprprogress',\r\n\r\n template: `\r\n\r\n <table class=\"mat-typography\">\r\n <thead>\r\n <tr>\r\n <th>#</th><!--<th>Code</th>-->\r\n <th>Prompt</th>\r\n <th>Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngIf=\"items\">\r\n\r\n <tr *ngFor=\"let item of items; let itIdx=index;\"\r\n (click)=\"rowSelect=itIdx\" [class.selRow]=\"itIdx===selectedItemIdx\"\r\n [scrollIntoViewToBottom]=\"itIdx===selectedItemIdx\">\r\n <td>{{itIdx}}</td>\r\n <td class=\"promptDescriptor\">{{item.promptAsString}}</td>\r\n <td>\r\n <mat-icon *ngIf=\"item.recs && item.recs.length>0\">done</mat-icon>\r\n\r\n </td>\r\n </tr>\r\n </ng-container>\r\n\r\n </tbody>\r\n </table>\r\n `,\r\n styles: [`:host {\r\n overflow-x: hidden;\r\n overflow-y: scroll;\r\n padding: 10pt;\r\n /*flex: 0.1 0 300px; \r\n min-width: 300px; */\r\n flex: 0.1 0 content;\r\n background: white;\r\n /* Workaround for Firefox\r\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\r\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\r\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\r\n */\r\n /* min-height:0px; */\r\n min-height: 1px;\r\n }`,\r\n `table {\r\n min-height: 1px;\r\n border-collapse: collapse;\r\n /* Tables do not have a natural min size */\r\n /*min-width: 300px; */\r\n \r\n }\r\n\r\n table, th, td {\r\n border: 1px solid lightgrey;\r\n padding: 0.5em;\r\n \r\n }\r\n\r\n `, `\r\n .selRow {\r\n background: lightblue;\r\n }\r\n `,`.promptDescriptor{\r\n \r\n max-width: 200px;\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n }`]\r\n\r\n})\r\nexport class Progress {\r\n @Input() items: Array<Item>|null=null;\r\n @Input() selectedItemIdx = 0;\r\n @Input() enableDownload: boolean=false;\r\n @Output() onRowSelect = new EventEmitter<number>();\r\n @Output()\r\n set rowSelect(rowIdx:number){\r\n this.onRowSelect.emit(rowIdx);\r\n }\r\n\r\n @Output() onShowDoneAction = new EventEmitter<number>();\r\n @Output()\r\n set clickDone(rowIdx:number){\r\n if(this.items &&this.items[rowIdx] && this.items[rowIdx].recs) {\r\n this.onRowSelect.emit(rowIdx);\r\n this.onShowDoneAction.emit(rowIdx);\r\n }\r\n }\r\n\r\n @Output() onDownloadDoneAction = new EventEmitter<number>();\r\n @Output()\r\n set clickDownloadDone(rowIdx:number){\r\n if(this.items && this.items[rowIdx] && this.items[rowIdx].recs) {\r\n this.onRowSelect.emit(rowIdx);\r\n this.onDownloadDoneAction.emit(rowIdx);\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n ViewChild,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n HostListener,\r\n ElementRef,\r\n OnInit,\r\n Renderer2,\r\n HostBinding,\r\n AfterContentChecked\r\n} from \"@angular/core\";\r\n\r\nimport {SimpleTrafficLight} from \"../startstopsignal/ui/simpletrafficlight\";\r\nimport {State as StartStopSignalState} from \"../startstopsignal/startstopsignal\";\r\nimport {Item} from \"./item\";\r\nimport {Block, Text, Mediaitem, PromptItem} from \"../script/script\";\r\nimport {TransportActions} from \"./controlpanel\";\r\nimport {Action} from \"../../action/action\";\r\nimport {AudioDisplay} from \"../../audio/audio_display\";\r\nimport {ProjectService} from \"../project/project.service\";\r\nimport {AudioClip} from \"../../audio/persistor\";\r\n\r\n@Component({\r\n\r\n selector: 'spr-recinstructions',\r\n\r\n template: `\r\n\r\n {{displayText()}}\r\n `,\r\n styles: [`:host {\r\n\r\n justify-content: left; /* align horizontal center */\r\n align-items: flex-start; /* align vertical center */\r\n background: white;\r\n text-align: left;\r\n font-size: 1em;\r\n flex: 0;\r\n width: 100%;\r\n }\r\n `]\r\n})\r\nexport class Recinstructions {\r\n @Input() recinstructions: string|null| undefined;\r\n @Input() selectedItemIdx: number|null|undefined;\r\n @Input() itemCount: number|undefined;\r\n\r\n displayText():string{\r\n let riTxt:string='';\r\n if(this.itemCount && this.selectedItemIdx){\r\n riTxt=riTxt+this.selectedItemIdx+'/'+(this.itemCount-1);\r\n }\r\n if(this.recinstructions){\r\n riTxt=riTxt+': '+this.recinstructions;\r\n }\r\n return riTxt;\r\n }\r\n}\r\n\r\n@Component({\r\n\r\n selector: 'app-sprprompter',\r\n\r\n template: `\r\n\r\n <!--<ng-template [ngIf]=\"text\">{{text}}</ng-template>-->\r\n <!-- <img *ngIf=\"src\" #promptImage [src]=\"srcUrl()\" [height]=\"prompterHeight-20\" /> -->\r\n `,\r\n styles: [`:host {\r\n\r\n justify-content: center; /* align horizontal center */\r\n align-items: center; /* align vertical center */\r\n background: white;\r\n text-align: center;\r\n /* font-size: 2em; */\r\n line-height: 1.2em;\r\n font-weight: bold;\r\n /* Use only natural size of the prompt */\r\n /* The prompter compnent then ets aligned vertically centered */\r\n flex: 0 1;\r\n\r\n }`, `:host(.fill) {\r\n /* Use all space to scale images */\r\n flex: 3;\r\n width: 100%;\r\n height: 100%;\r\n max-height: 100%;\r\n max-width: 100%;\r\n /* A separate flex container might be necessayr to alighn centered */\r\n vertical-align: middle; /* TODO does not work, image is not vertically centered */\r\n }`]\r\n})\r\nexport class Prompter {\r\n @Input() projectName: string | undefined;\r\n private _promptMediaItems: Array<Mediaitem>|null|undefined=null\r\n\r\n @Input() prompterHeight: number=0;\r\n private _text: string|undefined|null = null;\r\n private _src: string|undefined|null = null;\r\n private _blocks: Array<Block>|undefined;\r\n mimetype!: string;\r\n private currPromptChild: HTMLElement|null = null;\r\n\r\n @HostBinding('class.fill') public prompterStyleFill = false;\r\n\r\n constructor(private elRef: ElementRef, private renderer: Renderer2, private projectService: ProjectService) {\r\n\r\n }\r\n\r\n get text() {\r\n return this._text;\r\n }\r\n\r\n get src() {\r\n return this._src;\r\n }\r\n\r\n srcUrl(): string|null{\r\n if (this.projectName && this._src) {\r\n return this.projectService.projectResourceUrl(this.projectName, this._src);\r\n }\r\n return null;\r\n }\r\n\r\n width():number|null{\r\n if(this.elRef){\r\n if(this.elRef.nativeElement){\r\n return this.elRef.nativeElement.clientWidth\r\n }\r\n }\r\n return null;\r\n }\r\n height():number|null{\r\n if(this.elRef){\r\n if(this.elRef.nativeElement){\r\n return this.elRef.nativeElement.clientHeight\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private appendTextElement(parentEl:HTMLElement,txt:Text){\r\n let t: string = <string>txt.text\r\n let txtNd = this.renderer.createText(t)\r\n if(txt.decoration || txt.color){\r\n let spEl = this.renderer.createElement('span')\r\n let styleStr=''\r\n if(txt.decoration) {\r\n styleStr = styleStr +'text-decoration: ' + txt.decoration+';'\r\n }\r\n if(txt.color){\r\n styleStr = styleStr +'color: ' + txt.color+';'\r\n }\r\n spEl.style=styleStr\r\n this.renderer.appendChild(parentEl, spEl)\r\n this.renderer.appendChild(spEl, txtNd)\r\n }else {\r\n this.renderer.appendChild(parentEl, txtNd)\r\n }\r\n }\r\n\r\n @Input() set promptMediaItems(pMis: Array<Mediaitem>|null) {\r\n this._promptMediaItems = pMis\r\n if (this.currPromptChild != null) {\r\n this.renderer.removeChild(this.elRef.nativeElement, this.currPromptChild)\r\n }\r\n if (this._promptMediaItems && this._promptMediaItems.length == 1) {\r\n let mi = this._promptMediaItems[0]\r\n this.mimetype = 'text/plain'\r\n if (mi.mimetype) {\r\n this.mimetype = mi.mimetype.trim();\r\n }\r\n if (this.mimetype === 'text/plain') {\r\n this._text = mi.text\r\n this._src = null;\r\n let prTxt='';\r\n if(this._text){\r\n prTxt=this._text;\r\n }\r\n this.currPromptChild = this.renderer.createText(prTxt);\r\n this.prompterStyleFill = false;\r\n this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild);\r\n } else if (this.mimetype === 'text/x-prompt') {\r\n //this.rendering=true\r\n this._text=null;\r\n this._src=null;\r\n this._blocks=new Array<Block>();\r\n let pd=mi.promptDoc\r\n if(pd){\r\n let pdBody=pd.body\r\n if(pdBody){\r\n this._blocks=pdBody.blocks;\r\n }\r\n }\r\n\r\n this.prompterStyleFill = false\r\n this.currPromptChild = this.renderer.createElement('div')\r\n if(this._blocks) {\r\n for (let bi = 0; bi < this._blocks.length; bi++) {\r\n let bl = this._blocks[bi]\r\n if ('p' === bl.type) {\r\n let pBlEl = this.renderer.createElement('p')\r\n this.renderer.appendChild(this.currPromptChild, pBlEl)\r\n for (let ti = 0; ti < bl.texts.length; ti++) {\r\n let txt = bl.texts[ti]\r\n if (txt) {\r\n if ('text' === txt.type) {\r\n this.appendTextElement(pBlEl, txt)\r\n } else if ('font' === txt.type) {\r\n let spEl = this.renderer.createElement('span')\r\n let styleStr = ''\r\n if (txt.style) {\r\n styleStr = styleStr + 'font-style: ' + txt.style + ';'\r\n }\r\n if (txt.size) {\r\n styleStr = styleStr + 'font-size: ' + txt.size + ';'\r\n }\r\n if (txt.weight) {\r\n styleStr = styleStr + 'font-weight: ' + txt.weight + ';'\r\n }\r\n spEl.style = styleStr\r\n this.renderer.appendChild(pBlEl, spEl)\r\n this.appendTextElement(spEl, <Text>txt.text)\r\n } else if ('linebreak' === txt.type) {\r\n let brEl = this.renderer.createElement('br')\r\n this.renderer.appendChild(pBlEl, brEl)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild)\r\n //this.rendering=false\r\n } else if (this.mimetype.startsWith('image')) {\r\n this._text = null;\r\n this._src = mi.src\r\n let promptImage = new Image()\r\n\r\n this.currPromptChild = promptImage\r\n this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild)\r\n this.renderer.setStyle(this.currPromptChild, \"max-width\", \"100%\")\r\n this.renderer.setStyle(this.currPromptChild, \"max-height\", \"100%\")\r\n this.prompterStyleFill = true\r\n // TODO vertical alignment\r\n // https://stackoverflow.com/questions/7273338/how-to-vertically-align-an-image-inside-a-div\r\n\r\n //console.log(promptImage.naturalWidth + \"x\"+promptImage.naturalHeight);\r\n promptImage.onload = (ev: Event) => {}\r\n let srcUrl=this.srcUrl();\r\n if(srcUrl) {\r\n promptImage.src = srcUrl;\r\n }\r\n }\r\n\r\n } else {\r\n this._text = null\r\n this._src = null\r\n }\r\n }\r\n}\r\n\r\nexport const VIRTUAL_HEIGHT = 600;\r\nexport const DEFAULT_PROMPT_FONTSIZE = 48;\r\nexport const MIN_FONT_SIZE=6;\r\nexport const FALLBACK_DEF_USER_AGENT_FONT_SIZE = 14;\r\n\r\n@Component({\r\n\r\n selector: 'app-sprpromptcontainer',\r\n\r\n template: `\r\n <app-sprprompter #prompter [projectName]=\"projectName\" [promptMediaItems]=\"mediaitems\" [style.font-size]=\"fontSize+'px'\" [style.visibility]=\"prDisplay\" [prompterHeight]=\"prompterHeight\"></app-sprprompter>\r\n `\r\n ,\r\n styles: [`:host {\r\n\r\n flex: 3; /* the container consumes all available space */\r\n padding: 10pt;\r\n height: 100%;\r\n max-height: 100%;\r\n\r\n justify-content: center; /* align horizontal center*/\r\n align-items: center; /* align vertical center */\r\n background: white;\r\n text-align: center;\r\n display: flex;\r\n flex-direction: column;\r\n min-height: 0px;\r\n width: 100%;\r\n }\r\n `]\r\n})\r\nexport class PromptContainer implements OnInit,AfterContentChecked {\r\n @Input() projectName: string | undefined;\r\n private _mediaitems: Array<Mediaitem>|null=null;\r\n\r\n prompterHeight: number = VIRTUAL_HEIGHT\r\n fontSize!: number;\r\n fontSizeChange=false\r\n contentChecked=false;\r\n prDisplay='hidden';\r\n defaultStyle!: CSSStyleDeclaration;\r\n defaultFontSizePx!: number;\r\n\r\n autoFontSize=false;\r\n @ViewChild(Prompter, { static: true }) prompter!: Prompter;\r\n\r\n constructor(private elRef:ElementRef){}\r\n\r\n ngOnInit() {\r\n\r\n // fallback\r\n this.defaultFontSizePx = FALLBACK_DEF_USER_AGENT_FONT_SIZE;\r\n // try to parse default user agent font size (no comment about DOM API design ;) )\r\n this.defaultStyle = window.getComputedStyle(this.elRef.nativeElement);\r\n let defFontSizeStr = this.defaultStyle.fontSize;\r\n if (defFontSizeStr) {\r\n defFontSizeStr = defFontSizeStr.trim();\r\n if (defFontSizeStr.endsWith('px')) {\r\n // parseFloat ignores non number characters at the end (again no comment ;) )\r\n this.defaultFontSizePx = parseFloat(defFontSizeStr);\r\n //console.info(\"Default font size: \"+this.defaultFontSizePx)\r\n }\r\n }\r\n this.contentChecked = false;\r\n }\r\n\r\n ngAfterContentChecked(): void {\r\n if(this.autoFontSize) {\r\n if (this.fontSizeChange) {\r\n //console.log(\"ngaftercontentchecked, call fontSizeToFit \");\r\n // check prompter size again\r\n this.fontSizeToFit()\r\n } else {\r\n // font size was checked, but we need to check again after angular content check\r\n if (!this.contentChecked) {\r\n this.contentChecked = true;\r\n //console.log(\"ngaftercontentchecked, not font size changed, call \");\r\n this.fontSizeToFit()\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n @Input() set mediaitems(mediaitems:Array<Mediaitem>|null){\r\n\r\n this._mediaitems = mediaitems\r\n\r\n let mimetype:string|null=null;\r\n if (this._mediaitems && this._mediaitems.length == 1) {\r\n let mi = this._mediaitems[0]\r\n mimetype = 'text/plain'\r\n if (mi.mimetype) {\r\n mimetype = mi.mimetype.trim();\r\n }\r\n if(mi.defaultVirtualViewBox){\r\n this.prompterHeight=mi.defaultVirtualViewBox.height\r\n }\r\n }else{\r\n this.prompterHeight=VIRTUAL_HEIGHT\r\n }\r\n this.prompter.promptMediaItems=this._mediaitems\r\n this.autoFontSize=(mimetype!=null && mimetype.startsWith('text/'));\r\n if(this.autoFontSize){\r\n this.fontSizeChange = true;\r\n this.contentChecked = false\r\n this.prDisplay = 'hidden'\r\n this.layout()\r\n }\r\n }\r\n\r\n get mediaitems():Array<Mediaitem>|null{\r\n return this._mediaitems;\r\n }\r\n\r\n\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: Event): void {\r\n //console.debug(\"onresize, call fontSizeToFit hook \");\r\n this.layout();\r\n }\r\n\r\n private layout() {\r\n if(this.autoFontSize && this.elRef) {\r\n\r\n this.fontSizeChange=true;\r\n this.contentChecked = false\r\n this.prDisplay = 'hidden'\r\n let elH = this.elRef.nativeElement.offsetHeight;\r\n // prompt text font size should scale according to prompt container height\r\n let scaledSize = Math.round((elH / this.prompterHeight) * DEFAULT_PROMPT_FONTSIZE);\r\n\r\n // min prompt font size is default user agent size\r\n let newSize = Math.max(scaledSize, this.defaultFontSizePx);\r\n if (this.fontSize !== newSize) {\r\n this.fontSize = newSize;\r\n }\r\n\r\n //console.log(\"layout, call fontSizeToFit hook \");\r\n window.setTimeout(() => this.fontSizeToFit())\r\n\r\n }\r\n }\r\n\r\n\r\n private fontSizeToFit(){\r\n if(this.prompter) {\r\n let pW=this.prompter.width();\r\n let pH=this.prompter.height();\r\n if (this._mediaitems && this.elRef && pW && pH) {\r\n let nEl = this.elRef.nativeElement\r\n //console.log(\"prompter: \" + this.prompter.width() + \"x\" + this.prompter.height()+ \" font size: \"+this.fontSize)\r\n if (this.fontSize >= MIN_FONT_SIZE && (pW > nEl.offsetWidth || pH > nEl.offsetHeight)) {\r\n // prompter oversizes prompter container. Decrease font size.\r\n // set invisible during font size checks\r\n this.prDisplay = 'hidden'\r\n // decrease font size\r\n this.fontSize = this.fontSize - 1\r\n // console.log(\"Decreased font size: \"+this.fontSize )\r\n // Set flags\r\n this.fontSizeChange = true\r\n this.contentChecked = false\r\n // hook the next check\r\n window.setTimeout(() => this.fontSizeToFit())\r\n } else {\r\n // prompter fits in prompter container, font size should be fine\r\n\r\n //console.log(\"prDisplay: \"+this.prDisplay)\r\n\r\n //if(this.contentChecked && ! this.fontSizeChange) {\r\n //console.log(\"Display!\")\r\n // set prompter visible now\r\n this.prDisplay = 'visible'\r\n //}\r\n this.fontSizeChange = false\r\n }\r\n //console.log(\"Prompt text width: \"+textSize.width+\" \"+this.elRef.nativeElement.offsetWidth+\"x\"+this.elRef.nativeElement.offsetHeight)\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n@Component({\r\n\r\n selector: 'app-sprpromptingcontainer',\r\n\r\n template: `\r\n <spr-recinstructions [selectedItemIdx]=\"selectedItemIdx\" [itemCount]=\"itemCount\"\r\n [recinstructions]=\"promptItem?.recinstructions?.recinstructions\"></spr-recinstructions>\r\n <app-sprpromptcontainer [projectName]=\"projectName\"\r\n [mediaitems]=\"showPrompt?(promptItem?promptItem.mediaitems:null):null\"></app-sprpromptcontainer>\r\n\r\n `\r\n ,\r\n styles: [`:host {\r\n position: relative;\r\n flex: 3; /* the container consumes all available space */\r\n padding: 10pt;\r\n justify-content: center; /* align horizontal center*/\r\n align-items: center; /* align vertical center */\r\n background: white;\r\n text-align: center;\r\n display: flex;\r\n flex-direction: column;\r\n min-height: 0px;\r\n }\r\n `]\r\n})\r\nexport class PromptingContainer {\r\n @Input() projectName: string | undefined;\r\n @Input() promptItem: PromptItem|null=null;\r\n @Input() showPrompt: boolean=false;\r\n @Input() selectedItemIdx!: number;\r\n @Input() itemCount: number|undefined;\r\n\r\n @Input() transportActions!: TransportActions;\r\n\r\n private e!: HTMLDivElement;\r\n private startX: number | null = null\r\n private touchStartTimeStamp: number | null=null;\r\n\r\n constructor(private ref: ElementRef) {\r\n type TouchStart = {}\r\n }\r\n\r\n ngOnInit() {\r\n this.e = this.ref.nativeElement;\r\n }\r\n\r\n @HostListener('touchstart', ['$event'])\r\n onTouchstart(ev: TouchEvent | any) {\r\n //console.log(\"Touch start! \")\r\n if (!(this.transportActions.fwdAction.disabled &&\r\n this.transportActions.bwdAction.disabled &&\r\n this.transportActions.nextAction.disabled)) {\r\n let targetTouchesLen = ev.targetTouches.length;\r\n //for(let ti=0;ti<ev.targetTouches.length;ti++){\r\n //let t=ev.targetTouches.item(ti);\r\n // All x values are the same ??\r\n //console.log(\"Touch #\"+ti+\": pageX: \"+t.pageX+\" clientX: \"+t.clientX+\" screenX: \"+t.screenX)\r\n //}\r\n if (targetTouchesLen == 1) {\r\n // single touch\r\n let t = ev.targetTouches.item(0);\r\n if (t) {\r\n this.startX = Math.round(t.screenX);\r\n this.touchStartTimeStamp = ev.timeStamp;\r\n this.e.style.transition = 'none';\r\n //console.log(\"Touch start x: \"+this.startX)\r\n //ev.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n @HostListener('touchend', ['$event'])\r\n onTouchEnd(ev: TouchEvent | any) {\r\n //console.log(\"Touch end!\")\r\n // Reset offset shift\r\n if (!(this.transportActions.fwdAction.disabled && this.transportActions.bwdAction.disabled &&\r\n this.transportActions.nextAction.disabled)) {\r\n\r\n let changedTouchesLen = ev.changedTouches.length;\r\n //console.log(changedTouchesLen+\" \"+this.startX)\r\n if (changedTouchesLen == 1 && this.startX) {\r\n // single touch\r\n let t = ev.changedTouches.item(0);\r\n if (t) {\r\n let deltaX = Math.round(t.clientX - this.startX);\r\n let touchMoveSpeed = 0;\r\n if (this.touchStartTimeStamp) {\r\n touchMoveSpeed = deltaX / (ev.timeStamp - this.touchStartTimeStamp);\r\n }\r\n let futureDeltaX = deltaX + (800 * touchMoveSpeed);\r\n //console.log(\"DeltaX: \" + deltaX + \" Future deltaX: \" + futureDeltaX + \" width: \" + this.e.offsetWidth)\r\n if (futureDeltaX > this.e.offsetWidth / 2) {\r\n //console.log(\"Swipe right detected!!\")\r\n //this.swipedRight.emit()\r\n if (!this.transportActions.bwdAction.disabled) {\r\n this.transportActions.bwdAction.perform();\r\n }\r\n this.e.style.left = -this.e.offsetLeft + \"px\";\r\n }\r\n if (-futureDeltaX > this.e.offsetWidth / 2) {\r\n //console.log(\"Swipe left detected!!\")\r\n this.e.style.left = -this.e.offsetLeft + \"px\";\r\n //this.swipedLeft.emit()\r\n if (!this.transportActions.nextAction.disabled) {\r\n this.transportActions.nextAction.perform();\r\n } else if (!this.transportActions.fwdAction.disabled) {\r\n this.transportActions.fwdAction.perform();\r\n }\r\n } else {\r\n }\r\n ev.preventDefault();\r\n }\r\n }\r\n\r\n // reset animated\r\n this.e.style.transition = \"left 0.8s\";\r\n }\r\n this.startX = null;\r\n this.touchStartTimeStamp = null;\r\n this.e.style.left = \"0px\";\r\n }\r\n\r\n @HostListener('touchmove', ['$event'])\r\n onTouchMove(ev: TouchEvent | any) {\r\n //console.log(\"Touch move!\")\r\n if (!(this.transportActions.fwdAction.disabled && this.transportActions.bwdAction.disabled &&\r\n this.transportActions.nextAction.disabled)) {\r\n let targetTouchesLen = ev.targetTouches.length;\r\n if (targetTouchesLen == 1 && this.startX) {\r\n // single touch\r\n let t = ev.targetTouches.item(0);\r\n if (t) {\r\n let deltaX = Math.round(t.screenX - this.startX);\r\n this.e.style.left = deltaX + \"px\";\r\n // console.log(\"Touch move delta x: \"+deltaX)\r\n }\r\n ev.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('touchcancel', ['$event'])\r\n onTouchCancel(ev: TouchEvent | any) {\r\n //console.log(\"Touch cancel!\")\r\n this.e.style.left = \"0px\";\r\n //ev.preventDefault();\r\n }\r\n\r\n}\r\n\r\n\r\n@Component({\r\n\r\n selector: 'app-sprprompting',\r\n\r\n template: `\r\n\r\n <app-simpletrafficlight [status]=\"startStopSignalState\"></app-simpletrafficlight>\r\n <app-sprpromptingcontainer [projectName]=\"projectName\" [promptItem]=\"promptItem\" [showPrompt]=\"showPrompt\"\r\n [itemCount]=\"items?.length\" [selectedItemIdx]=\"selectedItemIdx\"\r\n [transportActions]=\"transportActions\"></app-sprpromptingcontainer>\r\n <app-sprprogress fxHide.xs [items]=\"items\" [selectedItemIdx]=\"selectedItemIdx\"\r\n (onRowSelect)=\"itemSelect($event)\"></app-sprprogress>\r\n <div fxHide.xs #asCt [class.active]=\"!audioSignalCollapsed\">\r\n\r\n <app-audiodisplay #audioSignalContainer [class.active]=\"!audioSignalCollapsed\"\r\n [audioClip]=\"displayAudioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [autoPlayOnSelectToggleAction]=\"autoPlayOnSelectToggleAction\"\r\n [playStopAction]=\"playStopAction\"></app-audiodisplay>\r\n\r\n\r\n </div>\r\n\r\n\r\n\r\n `,\r\n styles: [`:host {\r\n position: relative;\r\n margin: 0;\r\n padding: 0;\r\n background: lightgrey;\r\n width: 100%; /* use all horizontal available space */\r\n flex: 1; /* ... and fill rest of vertical available space (other components have flex 0) */\r\n\r\n /* Workaround for Firefox\r\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\r\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\r\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\r\n */\r\n min-height: 0px;\r\n\r\n display: flex; /* flex container: left traffic light, right prompter (container) */\r\n flex-direction: row;\r\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\r\n }`, `\r\n app-simpletrafficlight {\r\n margin: 10px;\r\n min-height: 0px;\r\n z-index: 3;\r\n }\r\n `, `\r\n app-sprprogress {\r\n z-index: 3;\r\n }\r\n `, `\r\n div {\r\n display: none;\r\n position: absolute;\r\n\r\n\r\n /* height: 50%; */\r\n /* width: 100%; */\r\n\r\n /* overflow: hidden; */\r\n\r\n /* margin: 20px; */\r\n /* border: 20px; */\r\n z-index: 5;\r\n /*background-color: red; */\r\n }`, `\r\n div.active {\r\n display: flex;\r\n position: absolute;\r\n bottom: 0px;\r\n /*left: 0px; */\r\n\r\n height: 90%;\r\n width: 100%;\r\n\r\n overflow: hidden;\r\n\r\n padding: 0px;\r\n /* margin: 20px; */\r\n /* border: 20px; */\r\n z-index: 5;\r\n box-sizing: border-box;\r\n background-color: rgba(0, 0, 0, 0)\r\n\r\n }`\r\n ]\r\n\r\n})\r\n\r\nexport class Prompting {\r\n @ViewChild(SimpleTrafficLight, { static: true }) simpleTrafficLight!: SimpleTrafficLight;\r\n @ViewChild(AudioDisplay, { static: true }) audioDisplay!: AudioDisplay;\r\n @Input() projectName: string | undefined;\r\n @Input() startStopSignalState!: StartStopSignalState;\r\n @Input() promptItem: PromptItem | null=null;\r\n @Input() showPrompt: boolean=false;\r\n @Input() items: Array<Item>|null=null;\r\n @Input() selectedItemIdx!: number;\r\n @Input() transportActions!: TransportActions;\r\n @Input() enableDownload: boolean=false;\r\n\r\n @Input() audioSignalCollapsed: boolean=true;\r\n @Input() displayAudioClip: AudioClip | null=null;\r\n @Input() playStartAction: Action<void>|undefined;\r\n @Input() playSelectionAction: Action<void>|undefined;\r\n @Input() autoPlayOnSelectToggleAction:Action<boolean>|undefined;\r\n @Input() playStopAction: Action<void>|undefined;\r\n @Output() onItemSelect = new EventEmitter<number>();\r\n @Output() onNextItem = new EventEmitter();\r\n @Output() onPrevItem = new EventEmitter();\r\n\r\n itemSelect(rowIdx: number) {\r\n this.onItemSelect.emit(rowIdx);\r\n }\r\n\r\n nextItem() {\r\n this.onNextItem.emit();\r\n }\r\n\r\n prevItem() {\r\n this.onPrevItem.emit();\r\n }\r\n}\r\n\r\n","export interface Float32ArrayOutStream {\r\n\r\n write(buffers: Array<Float32Array>): number;\r\n\r\n flush(): void;\r\n\r\n close(): void;\r\n}\r\n\r\nexport class Float32ArrayChunkerOutStream implements Float32ArrayOutStream {\r\n\r\n private bufs = new Array<Float32Array>();\r\n private filled: number;\r\n\r\n private _channels: number=0;\r\n private _chunkSize: number=0;\r\n\r\n private receivedFrames: number;\r\n private sentFrames: number;\r\n\r\n constructor(private outStream: Float32ArrayOutStream) {\r\n this.filled = 0;\r\n this.receivedFrames = 0;\r\n this.sentFrames = 0;\r\n }\r\n\r\n private createBuffers() {\r\n this.bufs = new Array<Float32Array>(this._channels);\r\n for (let ch = 0; ch < this._channels; ch++) {\r\n this.bufs[ch] = new Float32Array(this._chunkSize);\r\n }\r\n }\r\n\r\n set chunkSize(chunkSize: number) {\r\n this._chunkSize = chunkSize;\r\n this.createBuffers();\r\n }\r\n\r\n set channels(channels: number) {\r\n this._channels = channels;\r\n this.createBuffers();\r\n }\r\n\r\n write(buffers: Array<Float32Array>): number {\r\n\r\n let copied = 0;\r\n if(buffers.length>0) {\r\n let buffersLen = buffers[0].length;\r\n this.receivedFrames += buffersLen;\r\n let avail = buffersLen;\r\n // Fill out buffers until all values copied\r\n\r\n while (avail > 0) {\r\n let toFill = this._chunkSize - this.filled;\r\n if (toFill > avail) {\r\n toFill = avail;\r\n }\r\n let sliceEnd = copied + toFill;\r\n\r\n // Firefox on Android sends only the first channel\r\n for (let ch = 0; ch < buffersLen; ch++) {\r\n if(buffers[ch]) {\r\n let cpPrt = buffers[ch].slice(copied, sliceEnd);\r\n let buf = this.bufs[ch];\r\n buf.set(cpPrt, this.filled);\r\n }\r\n }\r\n copied += toFill;\r\n avail -= toFill;\r\n this.filled += toFill;\r\n if (this.filled == this._chunkSize) {\r\n this.outStream.write(this.bufs);\r\n this.sentFrames += this.filled;\r\n this.filled = 0;\r\n\r\n }\r\n }\r\n }\r\n return copied;\r\n }\r\n\r\n flush(): void {\r\n if (this.filled > 0) {\r\n let restBufs = new Array<Float32Array>(this._channels);\r\n for (let ch = 0; ch < this._channels; ch++) {\r\n restBufs[ch] = this.bufs[ch].slice(0, this.filled);\r\n }\r\n this.outStream.write(restBufs);\r\n this.outStream.flush();\r\n this.sentFrames += this.filled;\r\n this.filled = 0;\r\n }\r\n }\r\n\r\n\r\n close(): void {\r\n this.outStream.close();\r\n }\r\n}\r\n","import {Float32ArrayChunkerOutStream, Float32ArrayOutStream} from \"../../io/stream\";\r\n\r\nexport interface AudioFloat32OutStream extends Float32ArrayOutStream{\r\n setFormat(channels: number,sampleRate:number):void;\r\n}\r\n\r\nexport interface SequenceAudioFloat32OutStream extends AudioFloat32OutStream{\r\n nextStream():void;\r\n}\r\n\r\n\r\n\r\nexport class SequenceAudioFloat32ChunkerOutStream extends Float32ArrayChunkerOutStream implements SequenceAudioFloat32OutStream{\r\n\r\n private sampleRate:number|null=null;\r\n private sequenceAudioFloat32OutStream:SequenceAudioFloat32OutStream;\r\n constructor(outStream:SequenceAudioFloat32OutStream, private chunkDurationSeconds:number){\r\n super(outStream);\r\n this.sequenceAudioFloat32OutStream=outStream;\r\n }\r\n\r\n setFormat(channels: number,sampleRate:number):void{\r\n this.channels=channels;\r\n this.sampleRate=sampleRate;\r\n this.chunkSize=Math.round(sampleRate*this.chunkDurationSeconds);\r\n this.sequenceAudioFloat32OutStream.setFormat(channels,sampleRate);\r\n }\r\n nextStream():void{\r\n this.sequenceAudioFloat32OutStream.nextStream();\r\n }\r\n}\r\n","\r\nimport {Component, Inject} from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\n\r\n@Component({\r\n selector: 'spr-session-finished-dialog',\r\n template: `<h1 mat-dialog-title><mat-icon [style.color]=\"'green'\">done_all</mat-icon> Session finished</h1>\r\n <div mat-dialog-content>\r\n\r\n <p>Thank you! The recording session is complete.</p>\r\n\r\n </div>\r\n <div mat-dialog-actions>\r\n <button mat-button (click)=\"closeDialog()\">OK</button>\r\n </div>\r\n `\r\n})\r\nexport class SessionFinishedDialog{\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<SessionFinishedDialog>,\r\n @Inject(MAT_DIALOG_DATA) public data: any) { }\r\n\r\n closeDialog(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n}\r\n","import {Component, Inject} from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\n\r\n@Component({\r\n selector: 'msg-dialog',\r\n template: `<h1 mat-dialog-title><mat-icon *ngIf=\"data.type==='error'\" [style.color]=\"'red'\">error</mat-icon>\r\n <mat-icon *ngIf=\"data.type==='warning'\" [style.color]=\"'yellow'\">warning</mat-icon>{{data.title}}</h1>\r\n <div mat-dialog-content>\r\n\r\n <p>{{data.msg}}</p>\r\n <p>{{data.advice}}</p>\r\n\r\n </div>\r\n <div mat-dialog-actions>\r\n <button mat-button (click)=\"closeDialog()\">OK</button>\r\n </div>\r\n `\r\n})\r\nexport class MessageDialog{\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<MessageDialog>,\r\n @Inject(MAT_DIALOG_DATA) public data: any) { }\r\n\r\n closeDialog(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n}\r\n","\r\nexport class AudioContextProvider\r\n{\r\n private static _audioContext:AudioContext| null=null;\r\n\r\n public static audioContextInstance():AudioContext|null\r\n {\r\n if (!this._audioContext) {\r\n let debugFail = false;\r\n if (!window.AudioContext || typeof window.AudioContext !== 'function' || debugFail) {\r\n throw new Error('Browser does not support Web Audio API!');\r\n this._audioContext=null;\r\n } else {\r\n this._audioContext= new window.AudioContext();\r\n }\r\n }\r\n return this._audioContext;\r\n }\r\n\r\n}\r\n","import {SprRecordingFile} from \"../recording\";\r\n\r\nexport class Item {\r\n recs: Array<SprRecordingFile> | null;\r\n\r\n constructor(private _promptAsString: string, private _training: boolean,private _recording:boolean) {\r\n this.recs = null;\r\n }\r\n\r\n get promptAsString():string{\r\n return this._promptAsString;\r\n }\r\n\r\n get training():boolean{\r\n return this._training;\r\n }\r\n\r\n get recording():boolean{\r\n return this._recording;\r\n }\r\n\r\n}\r\n","import {AfterViewInit, ChangeDetectorRef, Component, ElementRef, HostListener, Input, ViewChild} from \"@angular/core\"\r\nimport {LevelInfo, LevelInfos, LevelListener} from \"../dsp/level_measure\";\r\n\r\nexport const DEFAULT_WARN_DB_LEVEL = -2;\r\nexport const MIN_DB_LEVEL = -60.0;\r\nexport const CONSIDERED_SILENCE_DB_LEVEL = MIN_DB_LEVEL*2;\r\nexport const LINE_WIDTH = 2;\r\nexport const LINE_DISTANCE = 2;\r\nexport const LEVEL_INDICATOR_HEIGHT=3;\r\n\r\nexport const OVERFLOW_THRESHOLD = 0.25;\r\nexport const OVERFLOW_INCR_FACTOR = 0.5;\r\n\r\n\r\n@Component({\r\n\r\n selector: 'audio-levelbar',\r\n template: `\r\n <div #virtualCanvas>\r\n <canvas #levelbar></canvas>\r\n <canvas #markerCanvas></canvas>\r\n </div>\r\n `,\r\n styles: [`:host {\r\n\r\n width: 100%;\r\n background: darkgray;\r\n box-sizing: border-box;\r\n height: 100%;\r\n position: relative;\r\n overflow-x: scroll;\r\n overflow-y: auto;\r\n }`, `div {\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n\r\n /*position: absolute;*/\r\n box-sizing: border-box;\r\n }`, `canvas {\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n position: absolute;\r\n }`]\r\n\r\n})\r\nexport class LevelBar implements LevelListener,AfterViewInit {\r\n\r\n @ViewChild('virtualCanvas', { static: true }) virtualCanvasRef!: ElementRef;\r\n virtualCanvas!: HTMLDivElement;\r\n @ViewChild('levelbar', { static: true }) liveLevelCanvasRef!: ElementRef;\r\n liveLevelCanvas!: HTMLCanvasElement;\r\n @ViewChild('markerCanvas', { static: true }) markerCanvasRef!: ElementRef;\r\n markerCanvas!: HTMLCanvasElement;\r\n ce!: HTMLDivElement;\r\n dbValues: Array<Array<number>>;\r\n peakDbLvl = MIN_DB_LEVEL;\r\n private _streamingMode = false;\r\n private _staticLevelInfos: LevelInfos | null = null;\r\n private _playFramePosition: number|null=null;\r\n\r\n warnDBLevel = DEFAULT_WARN_DB_LEVEL;\r\n\r\n constructor(private ref: ElementRef, private changeDetectorRef: ChangeDetectorRef) {\r\n this.dbValues = new Array<Array<number>>();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.ce = this.ref.nativeElement;\r\n this.liveLevelCanvas = this.liveLevelCanvasRef.nativeElement;\r\n this.markerCanvas = this.markerCanvasRef.nativeElement;\r\n this.markerCanvas.style.zIndex = '4';\r\n this.virtualCanvas = this.virtualCanvasRef.nativeElement;\r\n this.layout();\r\n this.drawAll();\r\n }\r\n\r\n\r\n @HostListener('scroll', ['$event'])\r\n onScroll(se: Event) {\r\n setTimeout(()=>{\r\n this.updateViewportPosition();\r\n this.drawAll();\r\n this.drawPlayPosition();\r\n });\r\n }\r\n\r\n private updateViewportPosition(){\r\n // Move canvases to visible viewport position\r\n let viewPortStyleLeft=this.ce.scrollLeft + 'px';\r\n this.liveLevelCanvas.style.left = viewPortStyleLeft;\r\n this.markerCanvas.style.left = viewPortStyleLeft;\r\n }\r\n\r\n @Input()\r\n set streamingMode(streamingMode: boolean) {\r\n if (this._streamingMode !== streamingMode) {\r\n this._streamingMode = streamingMode;\r\n this.reset();\r\n this.layoutStatic();\r\n }\r\n }\r\n\r\n @Input()\r\n set displayLevelInfos(levelInfos: LevelInfos | null) {\r\n this._staticLevelInfos = levelInfos;\r\n if (levelInfos) {\r\n\r\n this.dbValues = levelInfos.bufferLevelInfos.map((li) => {\r\n return li.powerLevelsDB()\r\n });\r\n } else {\r\n this.dbValues = new Array<Array<number>>();\r\n }\r\n this.layoutStatic();\r\n }\r\n\r\n set channelCount(channelCount: number) {\r\n this.reset();\r\n }\r\n\r\n set playFramePosition(playFramePosition: number) {\r\n this._playFramePosition = playFramePosition;\r\n this.drawPlayPosition();\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: Event) {\r\n\r\n this.layout();\r\n this.drawAll();\r\n }\r\n\r\n layout() {\r\n\r\n // set Canvas size to viewport size\r\n this.liveLevelCanvas.width = this.ce.offsetWidth;\r\n this.liveLevelCanvas.height = this.ce.offsetHeight;\r\n\r\n this.markerCanvas.width = this.ce.offsetWidth;\r\n this.markerCanvas.height = this.ce.offsetHeight;\r\n\r\n // and move to viewport position\r\n this.updateViewportPosition();\r\n\r\n this.drawAll();\r\n this.drawPlayPosition();\r\n }\r\n\r\n update(levelInfos: LevelInfo) {\r\n if (this._streamingMode) {\r\n let dbVals = levelInfos.powerLevelsDB();\r\n let peakDBVal = levelInfos.powerLevelDB();\r\n if (this.peakDbLvl < peakDBVal) {\r\n this.peakDbLvl = peakDBVal;\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n this.dbValues.push(dbVals);\r\n let i = this.dbValues.length - 1;\r\n let x = i * (LINE_DISTANCE + LINE_WIDTH);\r\n this.drawPushValue(x, dbVals);\r\n this.checkWidth();\r\n }\r\n }\r\n\r\n streamFinished() {\r\n this.layoutStatic();\r\n }\r\n\r\n private layoutStatic() {\r\n\r\n let requiredWidth = Math.round(this.dbValues.length * (LINE_DISTANCE + LINE_WIDTH));\r\n if (this.virtualCanvas && this.ce) {\r\n\r\n this.virtualCanvas.style.width = requiredWidth + 'px';\r\n this.ce.scrollLeft = requiredWidth - this.ce.offsetWidth;\r\n this.layout();\r\n }\r\n\r\n }\r\n\r\n private checkWidth() {\r\n let requiredWidth = this.dbValues.length * (LINE_DISTANCE + LINE_WIDTH);\r\n if (this.virtualCanvas.offsetWidth - requiredWidth < this.ce.offsetWidth * OVERFLOW_THRESHOLD) {\r\n let newWidth = Math.floor(this.virtualCanvas.offsetWidth + (this.ce.offsetWidth * OVERFLOW_INCR_FACTOR));\r\n this.virtualCanvas.style.width = newWidth + 'px';\r\n this.ce.scrollLeft = newWidth - this.ce.offsetWidth;\r\n\r\n // do not call layout here it is triggered by the scroll event\r\n //this.layout();\r\n }\r\n }\r\n\r\n reset() {\r\n this.peakDbLvl = MIN_DB_LEVEL;\r\n this.dbValues = new Array<Array<number>>();\r\n this.layout();\r\n this.drawAll();\r\n this.drawPlayPosition();\r\n }\r\n\r\n private drawLevelBackground(g: CanvasRenderingContext2D, x: number, h: number){\r\n g.strokeStyle = 'black';\r\n g.fillStyle = 'black';\r\n g.fillRect(x,0,LINE_WIDTH+LINE_DISTANCE,h)\r\n }\r\n\r\n // private drawLevelLine(g: CanvasRenderingContext2D, x: number, h: number, dbVal: number) {\r\n // //translate to viewport\r\n // let xc = x - this.ce.scrollLeft;\r\n //\r\n // this.drawLevelBackground(g,xc,h);\r\n // g.lineWidth = LINE_WIDTH;\r\n // if (dbVal >= this.warnDBLevel) {\r\n // g.strokeStyle = 'red';\r\n // g.fillStyle = 'red';\r\n //\r\n // } else {\r\n // g.strokeStyle = '#00c853';\r\n // g.fillStyle = '#00c853';\r\n // }\r\n // g.beginPath();\r\n // g.moveTo(xc, h);\r\n // let pVal = ((dbVal - MIN_DB_LEVEL) / -MIN_DB_LEVEL) * h;\r\n //\r\n // g.lineTo(xc, h - pVal);\r\n // g.closePath();\r\n // g.stroke();\r\n //\r\n // }\r\n\r\n private drawLevelLines(g: CanvasRenderingContext2D, x: number, h: number, dbVals: Array<number>) {\r\n //translate to viewport\r\n let xc = x - this.ce.scrollLeft;\r\n this.drawLevelBackground(g,xc,h);\r\n\r\n let chH = Math.floor(h / dbVals.length);\r\n g.lineWidth = LINE_WIDTH;\r\n for (let ch = 0; ch < dbVals.length; ch++) {\r\n let dbVal = dbVals[ch];\r\n\r\n let y = Math.floor(ch * chH);\r\n if (dbVal >= this.warnDBLevel) {\r\n g.strokeStyle = 'red';\r\n g.fillStyle = 'red';\r\n } else if(dbVal < CONSIDERED_SILENCE_DB_LEVEL) {\r\n g.strokeStyle='grey';\r\n g.fillStyle='grey'\r\n } else{\r\n g.strokeStyle = '#00c853';\r\n g.fillStyle = '#00c853'\r\n }\r\n g.beginPath();\r\n g.moveTo(xc, y + chH);\r\n g.lineTo(xc, y + chH - LEVEL_INDICATOR_HEIGHT);\r\n let pnVal=((dbVal - MIN_DB_LEVEL) / -MIN_DB_LEVEL);\r\n let lvlIndicatorSpace=LEVEL_INDICATOR_HEIGHT+LINE_DISTANCE;\r\n let levelH=chH-lvlIndicatorSpace;\r\n let pVal = pnVal * levelH;\r\n if(pVal>levelH-1){\r\n pVal=levelH-1\r\n }else if(pVal<0){\r\n pVal=0\r\n }\r\n g.moveTo(xc, y + chH - lvlIndicatorSpace );\r\n g.lineTo(xc, y + chH - lvlIndicatorSpace - pVal);\r\n g.closePath();\r\n g.stroke();\r\n }\r\n }\r\n\r\n private drawPushValue(x: number, dbVals: Array<number>) {\r\n\r\n if (this.liveLevelCanvas) {\r\n let h = this.liveLevelCanvas.height;\r\n let g = this.liveLevelCanvas.getContext(\"2d\");\r\n if (g) {\r\n this.drawLevelLines(g, x, h, dbVals);\r\n }\r\n }\r\n }\r\n\r\n private drawAll() {\r\n if (this.liveLevelCanvas) {\r\n let w = this.liveLevelCanvas.width;\r\n let h = this.liveLevelCanvas.height;\r\n let g = this.liveLevelCanvas.getContext(\"2d\");\r\n if (g) {\r\n // clear canvas\r\n g.fillStyle = 'grey';\r\n g.fillRect(0, 0, w, h);\r\n\r\n g.lineWidth = LINE_WIDTH;\r\n\r\n if (this.dbValues.length > 0) {\r\n // draw only viewport part:\r\n\r\n // draw from x1 to x2\r\n let x1 = this.ce.scrollLeft;\r\n let x2 = x1 + this.ce.offsetWidth;\r\n\r\n // corresponds to this level values:\r\n let i1 = Math.floor(x1 / (LINE_DISTANCE + LINE_WIDTH));\r\n let i2 = Math.ceil(x2 / (LINE_DISTANCE + LINE_WIDTH));\r\n // some values around\r\n i1 -= 2;\r\n i2 += 2;\r\n // limits\r\n if (i1 < 0) {\r\n i1 = 0;\r\n }\r\n if (i2 > this.dbValues.length) {\r\n i2 = this.dbValues.length;\r\n }\r\n\r\n var c=0;\r\n for (let i = i1; i < i2; i++) {\r\n let x = i * (LINE_DISTANCE + LINE_WIDTH);\r\n let dbVals = this.dbValues[i];\r\n if (dbVals) {\r\n this.drawLevelLines(g, x, h, dbVals);\r\n c++;\r\n }\r\n\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n\r\n private framesPerPixel(): number | null {\r\n // one buffer\r\n if (this._staticLevelInfos) {\r\n let framesPerBuffer = this._staticLevelInfos.framesPerBuffer();\r\n let pixelsPerBuffer = LINE_DISTANCE + LINE_WIDTH;\r\n\r\n return framesPerBuffer / pixelsPerBuffer;\r\n }\r\n return null;\r\n }\r\n\r\n\r\n private drawPlayPosition() {\r\n if (this.markerCanvas) {\r\n let w = this.markerCanvas.width;\r\n let h = this.markerCanvas.height;\r\n let g = this.markerCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n let framesPerPixel = this.framesPerPixel();\r\n if (framesPerPixel && this._playFramePosition) {\r\n let x = this._playFramePosition / framesPerPixel;\r\n\r\n // Get position in viewport\r\n let xc = x - this.ce.scrollLeft;\r\n // Only draw if inside marker (viewport) canvas\r\n if(xc>=0 && xc<=w) {\r\n g.fillStyle = 'red';\r\n g.strokeStyle = 'red';\r\n g.lineWidth = LINE_WIDTH;\r\n g.beginPath();\r\n // paint over all channels\r\n g.moveTo(xc, 0);\r\n g.lineTo(xc, h);\r\n g.closePath();\r\n g.stroke();\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n}\r\n","import {Action} from '../../action/action'\r\nimport {\r\n Component, ViewChild, Input\r\n} from \"@angular/core\";\r\n\r\nimport { MatDialog} from \"@angular/material/dialog\";\r\nimport {ProgressSpinnerMode} from \"@angular/material/progress-spinner\";\r\n\r\n\r\n@Component({\r\n\r\n selector: 'app-sprstatusdisplay',\r\n\r\n template: `\r\n <p matTooltip=\"Status\">\r\n <mat-progress-spinner *ngIf=\"statusWaiting\" color=\"black\" mode=\"indeterminate\" [diameter]=\"30\" [strokeWidth]=\"5\"></mat-progress-spinner><mat-icon *ngIf=\"statusAlertType==='error'\" style=\"color:red\">report_problem</mat-icon>\r\n {{statusMsg}}\r\n </p>\r\n `,\r\n styles: [`:host {\r\n display: inline;\r\n text-align: left;\r\n font-size: smaller;\r\n }`, `\r\n p {\r\n padding: 4px;\r\n white-space:nowrap;\r\n display: inline-block;\r\n }\r\n `, `\r\n mat-progress-spinner {\r\n color: black;\r\n display: inline-block;\r\n }\r\n `, `\r\n span {\r\n color: red;\r\n }\r\n `]\r\n\r\n})\r\n\r\nexport class StatusDisplay {\r\n @Input() statusAlertType = 'info';\r\n @Input() statusMsg = 'Initialize...';\r\n @Input() statusWaiting =false;\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'app-uploadstatus',\r\n template: `\r\n <mat-progress-spinner [mode]=\"spinnerMode\" [color]=\"status\" [diameter]=\"30\" [strokeWidth]=\"5\" [value]=\"_value\" [matTooltip]=\"toolTipText\"></mat-progress-spinner>\r\n `,\r\n styles: [`:host {\r\n flex: 1;\r\n /* align-self: flex-start; */\r\n /*display: inline; */\r\n text-align: left;\r\n }`,`mat-progress-spinner{\r\n display: inline-block;\r\n }`]\r\n})\r\nexport class UploadStatus {\r\n private _awaitNewUpload=false;\r\n spinnerMode:ProgressSpinnerMode = 'determinate';\r\n _status!:string\r\n _value = 100\r\n displayValue:string|null=null\r\n toolTipText:string=''\r\n\r\n private _updateSpinner(){\r\n\r\n let uplMsg;\r\n if (this._awaitNewUpload || this._value === 0) {\r\n this.spinnerMode = 'indeterminate'\r\n this.displayValue=' '\r\n uplMsg='Preparing upload.'\r\n } else {\r\n this.spinnerMode = 'determinate'\r\n this.displayValue=this._value+'%'\r\n if(this._value===100){\r\n uplMsg = 'Upload complete'\r\n }else {\r\n uplMsg = 'Upload progress: ' + this.displayValue\r\n }\r\n }\r\n if(this.status==='warn'){\r\n uplMsg='Upload error occurred. Please check your network connection. '+uplMsg\r\n }\r\n this.toolTipText=uplMsg\r\n }\r\n\r\n @Input()\r\n set value(value: number) {\r\n this._value = value;\r\n this._updateSpinner()\r\n };\r\n\r\n @Input() set awaitNewUpload(awaitNewUpload:boolean){\r\n this._awaitNewUpload=awaitNewUpload\r\n this._updateSpinner()\r\n }\r\n\r\n @Input() set status(status:string){\r\n this._status=status\r\n this._updateSpinner()\r\n }\r\n\r\n get status():string{\r\n return this._status\r\n }\r\n\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'app-sprprogressdisplay',\r\n template: `\r\n <p>{{progressMsg}}</p>\r\n `,\r\n styles: [`:host {\r\n flex: 1;\r\n /* align-self: flex-start; */\r\n /*display: inline; */\r\n width: 100%;\r\n text-align: left;\r\n }`]\r\n})\r\nexport class ProgressDisplay {\r\n progressMsg = '[itemcode]';\r\n}\r\n\r\n\r\n\r\n\r\nexport class TransportActions {\r\n startAction: Action<void>;\r\n stopAction: Action<void>;\r\n nextAction: Action<void>;\r\n fwdNextAction: Action<void>;\r\n pauseAction: Action<void>;\r\n fwdAction: Action<void>;\r\n bwdAction: Action<void>;\r\n\r\n constructor() {\r\n this.startAction = new Action('Start');\r\n this.stopAction = new Action('Stop');\r\n this.nextAction = new Action('Next');\r\n this.pauseAction = new Action('Pause');\r\n this.fwdNextAction = new Action('Next recording');\r\n this.fwdAction = new Action('Forward');\r\n this.bwdAction = new Action('Backward');\r\n\r\n }\r\n}\r\n\r\n@Component({\r\n\r\n selector: 'app-sprtransport',\r\n\r\n template: `\r\n <button id=\"bwdBtn\" *ngIf=\"navigationEnabled\" (click)=\"actions.bwdAction.perform()\" [disabled]=\"bwdDisabled()\"\r\n mat-raised-button>\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n <button (click)=\"startStopNextPerform()\" [disabled]=\"startDisabled() && stopDisabled() && nextDisabled()\" mat-raised-button>\r\n <mat-icon [style.color]=\"startStopNextIconColor()\">{{startStopNextIconName()}}</mat-icon><mat-icon *ngIf=\"!nextDisabled()\" [style.color]=\"nextDisabled() ? 'grey' : 'black'\">chevron_right</mat-icon>\r\n <span fxShow.xs=\"false\">{{startStopNextName()}}</span>\r\n </button>\r\n <button *ngIf=\"pausingEnabled\" (click)=\"actions.pauseAction.perform()\" [disabled]=\"pauseDisabled()\" mat-raised-button>\r\n <mat-icon>pause</mat-icon>\r\n <span fxShow.xs=\"false\">Pause</span>\r\n </button>\r\n <button id=\"fwdNextBtn\" *ngIf=\"navigationEnabled\" fxHide.xs (click)=\"actions.fwdNextAction.perform()\" [disabled]=\"fwdNextDisabled()\" mat-raised-button>\r\n <mat-icon>redo</mat-icon>\r\n </button>\r\n <button id=\"fwdBtn\" *ngIf=\"navigationEnabled\" (click)=\"actions.fwdAction.perform()\" [disabled]=\"fwdDisabled()\" mat-raised-button>\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n\r\n `,\r\n styles: [`:host {\r\n flex: 20;\r\n align-self: center;\r\n width: 100%;\r\n text-align: center;\r\n align-content: center;\r\n margin: 0;\r\n\r\n }`, `\r\n div {\r\n display: inline;\r\n flex: 0;\r\n }`,`\r\n button {\r\n touch-action: manipulation;\r\n }`\r\n ]\r\n\r\n})\r\nexport class TransportPanel {\r\n\r\n @Input() readonly!:boolean;\r\n @Input() actions!: TransportActions;\r\n @Input() navigationEnabled=true;\r\n @Input() pausingEnabled=true;\r\n\r\n startStopNextButtonName!:string;\r\n startStopNextButtonIconName!:string;\r\n\r\n startDisabled() {\r\n return !this.actions || this.readonly || this.actions.startAction.disabled\r\n }\r\n\r\n stopDisabled() {\r\n return !this.actions || this.actions.stopAction.disabled\r\n }\r\n\r\n nextDisabled() {\r\n return !this.actions || this.actions.nextAction.disabled || !this.navigationEnabled;\r\n }\r\n\r\n pauseDisabled() {\r\n return !this.actions || this.actions.pauseAction.disabled || !this.pausingEnabled;\r\n }\r\n\r\n fwdDisabled() {\r\n return !this.actions || this.actions.fwdAction.disabled || !this.navigationEnabled;\r\n }\r\n\r\n fwdNextDisabled() {\r\n return !this.actions || this.actions.fwdNextAction.disabled || !this.navigationEnabled;\r\n }\r\n\r\n bwdDisabled() {\r\n return !this.actions || this.actions.bwdAction.disabled || !this.navigationEnabled;\r\n }\r\n\r\n startStopNextName():string{\r\n if(!this.nextDisabled()){\r\n this.startStopNextButtonName= \"Next\"\r\n }else if(!this.startDisabled()){\r\n this.startStopNextButtonName=\"Start\"\r\n }else if(!this.stopDisabled()) {\r\n this.startStopNextButtonName = \"Stop\"\r\n }\r\n return this.startStopNextButtonName;\r\n }\r\n startStopNextIconName():string{\r\n if(!this.startDisabled()){\r\n this.startStopNextButtonIconName=\"fiber_manual_record\"\r\n }else if(!this.stopDisabled()){\r\n this.startStopNextButtonIconName=\"stop\"\r\n }else if(!this.nextDisabled()){\r\n this.startStopNextButtonIconName=\"stop\"\r\n }\r\n return this.startStopNextButtonIconName\r\n }\r\n startStopNextIconColor():string{\r\n if(!this.startDisabled()){\r\n return \"red\"\r\n }else if(!this.stopDisabled() || !this.nextDisabled()){\r\n return \"yellow\"\r\n }else{\r\n return \"grey\";\r\n }\r\n }\r\n\r\n startStopNextPerform(){\r\n if(!this.startDisabled()){\r\n this.actions.startAction.perform();\r\n }else if(!this.stopDisabled()){\r\n this.actions.stopAction.perform();\r\n }else if(!this.nextDisabled()){\r\n this.actions.nextAction.perform();\r\n }\r\n }\r\n\r\n}\r\n\r\n@Component({\r\n\r\n selector: 'app-readystateindicator',\r\n\r\n template: `\r\n <mat-icon [matTooltip]=\"readyStateToolTip\">{{hourGlassIconName}}</mat-icon>\r\n `,\r\n styles: []\r\n})\r\nexport class ReadyStateIndicator {\r\n _ready=true\r\n hourGlassIconName='hourglass_empty'\r\n readyStateToolTip:string=''\r\n\r\n constructor() {}\r\n\r\n @Input() set ready(ready:boolean){\r\n this._ready=ready\r\n this.hourGlassIconName=this._ready?'hourglass_empty':'hourglass_full'\r\n this.readyStateToolTip=this._ready?'Audio processing and upload done. You can leave the page without data loss.':'Please wait until audio processing and upload have finished. Please do not leave the page.'\r\n }\r\n\r\n get ready():boolean{\r\n return this._ready\r\n }\r\n\r\n}\r\n\r\n@Component({\r\n\r\n selector: 'app-sprcontrolpanel',\r\n\r\n template: `\r\n <div fxHide.xs fxLayout=\"row\" >\r\n <app-sprstatusdisplay fxFlex=\"0 0 0\" [statusMsg]=\"statusMsg\" [statusAlertType]=\"statusAlertType\" [statusWaiting]=\"statusWaiting\"\r\n class=\"hidden-xs\"></app-sprstatusdisplay>\r\n <app-sprtransport fxFlex=\"10 0 0\" [readonly]=\"readonly\" [actions]=\"transportActions\" [navigationEnabled]=\"navigationEnabled\"></app-sprtransport>\r\n <app-uploadstatus fxFlex=\"0 0 0\" *ngIf=\"enableUploadRecordings\" [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processing\"></app-uploadstatus>\r\n <app-readystateindicator [ready]=\"_ready\"></app-readystateindicator>\r\n </div>\r\n <div fxShow.xs fxHide fxLayout=\"column\">\r\n <div fxLayout=\"row\" fxFlexFill>\r\n <app-sprstatusdisplay fxFlex=\"10 0 0\" fxFlexAlign=\"left\" [statusMsg]=\"statusMsg\" [statusAlertType]=\"statusAlertType\" [statusWaiting]=\"statusWaiting\"\r\n class=\"hidden-xs\"></app-sprstatusdisplay>\r\n <app-uploadstatus fxFlex=\"0 0 0\" *ngIf=\"enableUploadRecordings\" [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processing\"></app-uploadstatus>\r\n <app-readystateindicator [ready]=\"_ready\"></app-readystateindicator>\r\n </div>\r\n <app-sprtransport [readonly]=\"readonly\" [actions]=\"transportActions\" [navigationEnabled]=\"navigationEnabled\"></app-sprtransport>\r\n\r\n </div>\r\n `,\r\n styles: [`div {\r\n align-content: center;\r\n align-items: center;\r\n margin: 0;\r\n padding: 20px;\r\n min-height: min-content; /* important */\r\n }`]\r\n})\r\nexport class ControlPanel {\r\n @ViewChild(StatusDisplay, { static: true }) statusDisplay!: StatusDisplay;\r\n @ViewChild(TransportPanel, { static: true }) transportPanel!: TransportPanel;\r\n\r\n @Input() readonly!:boolean\r\n @Input() transportActions!: TransportActions\r\n @Input() processing=false\r\n @Input() statusMsg!: string;\r\n @Input() statusAlertType!: string;\r\n @Input() statusWaiting!: boolean;\r\n @Input() uploadStatus!: string;\r\n @Input() uploadProgress!: number;\r\n @Input() currentRecording: AudioBuffer| null| undefined;\r\n @Input() enableUploadRecordings!: boolean;\r\n @Input() navigationEnabled=true;\r\n\r\n _ready=true\r\n\r\n constructor(public dialog: MatDialog) {\r\n\r\n }\r\n\r\n @Input() set ready(ready:boolean){\r\n this._ready=ready\r\n }\r\n\r\n get ready():boolean{\r\n return this._ready\r\n }\r\n\r\n}\r\n\r\n\r\n","import {DSPUtils} from \"../../dsp/utils\";\r\nimport {SequenceAudioFloat32OutStream} from \"../io/stream\";\r\nimport {Arrays, WorkerHelper} from \"../../utils/utils\";\r\n\r\nexport const MIN_DB_LEVEL = -40.0;\r\n\r\n\r\n\r\nexport class LevelInfo {\r\n\r\n private readonly _minLinLevels: Array<number>;\r\n private readonly _maxLinLevels: Array<number>;\r\n\r\n constructor(public readonly channelCount: number,\r\n public startFrame: number = 0,\r\n public frameLength: number = 0,\r\n minLinLevels?: Array<number>,\r\n maxLinLevels?: Array<number>) {\r\n this._minLinLevels = this.checkOrInitArray(minLinLevels);\r\n this._maxLinLevels = this.checkOrInitArray(maxLinLevels);\r\n }\r\n\r\n get minLinLevels() {\r\n return this._minLinLevels;\r\n }\r\n\r\n get maxLinLevels() {\r\n return this._maxLinLevels;\r\n }\r\n\r\n private checkOrInitArray(arr: Array<number> | undefined): Array<number> {\r\n if (arr) {\r\n if (arr.length !== this.channelCount)\r\n throw new Error(\"Level arrays must be equal to channel count \" + this.channelCount);\r\n return arr;\r\n } else {\r\n return new Array<number>(this.channelCount)\r\n }\r\n }\r\n\r\n merge(levelInfo: LevelInfo) {\r\n if (levelInfo === null) {\r\n return;\r\n }\r\n if (this.channelCount !== levelInfo.channelCount) {\r\n throw new Error(\"Channel count of level info to merge must be equal. (\" + this.channelCount + \" != \" + levelInfo.channelCount + \")\");\r\n }\r\n\r\n let endFrame = this.startFrame + this.frameLength;\r\n let mergeEndFrame = levelInfo.startFrame + levelInfo.frameLength;\r\n\r\n if (levelInfo.startFrame < this.startFrame) {\r\n this.startFrame = levelInfo.startFrame;\r\n }\r\n\r\n if (mergeEndFrame > endFrame) {\r\n this.frameLength = mergeEndFrame - this.startFrame;\r\n }\r\n\r\n for (let ch = 0; ch < this.channelCount; ch++) {\r\n\r\n if (levelInfo.minLinLevels[ch] < this.minLinLevels[ch]) {\r\n this.minLinLevels[ch] = levelInfo.minLinLevels[ch];\r\n }\r\n if (levelInfo.maxLinLevels[ch] > this.maxLinLevels[ch]) {\r\n this.maxLinLevels[ch] = levelInfo.maxLinLevels[ch];\r\n }\r\n }\r\n }\r\n\r\n levelsLin(): Array<number> {\r\n let lvlsLin = new Array<number>(this.channelCount);\r\n for (let ch = 0; ch < this.channelCount; ch++) {\r\n lvlsLin[ch] = Math.max(Math.abs(this.minLinLevels[ch]), Math.abs(this.maxLinLevels[ch]));\r\n }\r\n return lvlsLin;\r\n }\r\n\r\n powerLevelsDB(): Array<number> {\r\n let lvlsDb = new Array<number>(this.channelCount);\r\n for (let ch = 0; ch < this.channelCount; ch++) {\r\n lvlsDb[ch] = DSPUtils.toPowerLevelInDB(this.levelsLin()[ch]);\r\n }\r\n return lvlsDb;\r\n }\r\n\r\n powerLevelDB(): number {\r\n let pLvlsDb = this.powerLevelsDB();\r\n return Math.max(...pLvlsDb);\r\n }\r\n\r\n clone(): LevelInfo {\r\n return new LevelInfo(this.channelCount, this.startFrame, this.frameLength, Arrays.cloneNumberArray(this.minLinLevels),\r\n Arrays.cloneNumberArray(this.maxLinLevels));\r\n }\r\n}\r\n\r\nexport class LevelInfos {\r\n constructor(public readonly bufferLevelInfos: Array<LevelInfo>, public readonly peakLevelInfo: LevelInfo) {\r\n }\r\n\r\n framesPerBuffer():number{\r\n if(this.bufferLevelInfos.length>0){\r\n return this.bufferLevelInfos[0].frameLength;\r\n }\r\n return this.peakLevelInfo.frameLength/this.bufferLevelInfos.length;\r\n }\r\n}\r\n\r\n\r\nexport interface LevelListener {\r\n channelCount: number;\r\n\r\n update(levelInfo: LevelInfo, peakLevelInfo: LevelInfo): void;\r\n\r\n streamFinished(): void;\r\n\r\n reset(): void;\r\n}\r\n\r\nexport interface PeakLevelListener {\r\n update(peakLevel:number): void;\r\n}\r\n\r\nexport interface PeakLevelListener {\r\n\r\n update(levelInfo: LevelInfo, peakLevelInfo: LevelInfo): void;\r\n\r\n streamFinished(): void;\r\n\r\n reset(): void;\r\n}\r\n\r\nexport class PeakLevelInterceptor implements LevelListener{\r\n get peakDbLvl(): number {\r\n return this._peakDbLvl;\r\n }\r\n get channelCount(): number {\r\n return this._channelCount;\r\n }\r\n\r\n set channelCount(value: number) {\r\n this._channelCount = value;\r\n if(this.levelListener){\r\n this.levelListener.channelCount=value;\r\n }\r\n }\r\n\r\n private _channelCount: number=0;\r\n\r\n private _peakDbLvl = MIN_DB_LEVEL;\r\n\r\n\r\n\r\n constructor(private levelListener?:LevelListener) {}\r\n\r\n update(levelInfo: LevelInfo, peakLevelInfo: LevelInfo): void{\r\n let peakDBVal = levelInfo.powerLevelDB();\r\n if (this.peakDbLvl < peakDBVal) {\r\n this._peakDbLvl = peakDBVal;\r\n }\r\n }\r\n\r\n streamFinished(): void{\r\n if(this.levelListener){\r\n this.levelListener.streamFinished();\r\n }\r\n }\r\n\r\n reset(): void{\r\n this._peakDbLvl = MIN_DB_LEVEL;\r\n if(this.levelListener){\r\n this.levelListener.reset();\r\n }\r\n }\r\n}\r\n\r\ndeclare function postMessage(message: any, transfer?: Array<any>): void;\r\n\r\n\r\nexport class LevelMeasure {\r\n\r\n private readonly workerURL: string;\r\n private worker: Worker|null=null;\r\n\r\n constructor() {\r\n this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction)\r\n }\r\n\r\n calcBufferLevelInfos(audioBuffer: AudioBuffer, bufferTimeLength: number): Promise<LevelInfos> {\r\n return new Promise<LevelInfos>((resolve)=>{\r\n let chs = audioBuffer.numberOfChannels;\r\n let bufferFrameLength=Math.round(audioBuffer.sampleRate*bufferTimeLength);\r\n let buffers = new Array<any>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n let adCh=audioBuffer.getChannelData(ch);\r\n let adChCopy=new Float32Array(adCh.length);\r\n adChCopy.set(adCh);\r\n buffers[ch] = adChCopy.buffer;\r\n }\r\n\r\n this.worker = new Worker(this.workerURL);\r\n this.worker.onmessage = (me) => {\r\n\r\n let linLevelArrs=new Array<Float32Array>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n linLevelArrs[ch] = new Float32Array(me.data.linLevelBuffers[ch]);\r\n }\r\n\r\n let bufferCount=Math.ceil(me.data.frameLength/me.data.bufferFrameLength);\r\n let framePos=0;\r\n let bufferLevelInfos=new Array<LevelInfo>();\r\n let peakLevelInfo=new LevelInfo(chs);\r\n for(let bi=0;bi<bufferCount;bi++) {\r\n let minLevels = new Array<number>(chs);\r\n let maxLevels = new Array<number>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n let linLvlArrPos=bi*2;\r\n minLevels[ch]=linLevelArrs[ch][linLvlArrPos];\r\n maxLevels[ch]=linLevelArrs[ch][linLvlArrPos+1];\r\n }\r\n let bli = new LevelInfo(chs, framePos, me.data.bufferFrameLength, minLevels, maxLevels);\r\n bufferLevelInfos.push(bli);\r\n peakLevelInfo.merge(bli);\r\n }\r\n this.terminateWorker();\r\n resolve(new LevelInfos(bufferLevelInfos, peakLevelInfo));\r\n };\r\n\r\n this.worker.postMessage({bufferFrameLength:bufferFrameLength,audioData: buffers, chs: chs}, buffers);\r\n\r\n });\r\n\r\n }\r\n\r\n\r\n private terminateWorker() {\r\n this.worker?.terminate();\r\n\r\n }\r\n\r\n /*\r\n * Method used as worker code.\r\n */\r\n workerFunction() {\r\n self.onmessage = function (msg:MessageEvent) {\r\n\r\n let chs = msg.data.chs;\r\n let bufferFrameLength = msg.data.bufferFrameLength;\r\n\r\n let audioData = new Array<Float32Array>(chs);\r\n let linLevels = new Array<Float32Array>(chs);\r\n\r\n for (let ch = 0; ch < chs; ch++) {\r\n audioData[ch] = new Float32Array(msg.data.audioData[ch]);\r\n }\r\n let frameLength = audioData[0].length;\r\n let bufferCount=Math.ceil(frameLength/bufferFrameLength);\r\n for (let ch = 0; ch < chs; ch++) {\r\n linLevels[ch] = new Float32Array(bufferCount*2);\r\n }\r\n if (audioData && chs > 0) {\r\n for (let ch = 0; ch < chs; ch++) {\r\n let chData = audioData[ch];\r\n\r\n for (let s = 0; s < frameLength; s++) {\r\n let bi = Math.floor(s / bufferFrameLength);\r\n let lvlArrPos = bi * 2;\r\n //let bs = s % bufferFrameLength;\r\n let chSample=chData[s];\r\n if (chSample < linLevels[ch][lvlArrPos]) {\r\n linLevels[ch][lvlArrPos] = chSample;\r\n }\r\n lvlArrPos++;\r\n if (chSample > linLevels[ch][lvlArrPos]) {\r\n linLevels[ch][lvlArrPos] = chSample;\r\n }\r\n }\r\n }\r\n const linLevelBufs = new Array<any>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n linLevelBufs[ch] = linLevels[ch].buffer;\r\n }\r\n postMessage({bufferFrameLength:bufferFrameLength,frameLength:frameLength,linLevelBuffers: linLevelBufs}, linLevelBufs);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\nexport class StreamLevelMeasure implements SequenceAudioFloat32OutStream {\r\n\r\n currentLevelInfos: LevelInfo|null=null;\r\n peakLevelInfo: LevelInfo|null=null;\r\n\r\n private readonly workerURL: string;\r\n private worker: Worker|null=null;\r\n private channelCount: number=0;\r\n private bufferIndex: number = 0;\r\n private frameCount: number = 0;\r\n\r\n levelListener: LevelListener|null=null;\r\n peakLevelListener: ((peakLvlInDb:number)=>void)|null=null;\r\n private peakLevelInDb:number=MIN_DB_LEVEL;\r\n\r\n constructor() {\r\n this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction)\r\n }\r\n\r\n setFormat(channels: number, sampleRate: number) {\r\n this.channelCount = channels;\r\n this.currentLevelInfos = new LevelInfo(this.channelCount);\r\n this.peakLevelInfo = new LevelInfo(this.channelCount);\r\n this.worker = new Worker(this.workerURL);\r\n this.worker.onmessage = (me) => {\r\n let streamFinished = me.data.streamFinished;\r\n if (streamFinished) {\r\n if (this.levelListener) {\r\n this.levelListener.streamFinished()\r\n }\r\n } else {\r\n\r\n let minLevels = new Array<number>(this.channelCount);\r\n let maxLevels = new Array<number>(this.channelCount);\r\n for (let ch = 0; ch < this.channelCount; ch++) {\r\n let fls = new Float32Array(me.data.linLevelBuffers[ch]);\r\n minLevels[ch] = fls[0];\r\n maxLevels[ch] = fls[1];\r\n }\r\n let bi = new LevelInfo(this.channelCount, this.frameCount, me.data.fraemLength, minLevels, maxLevels);\r\n this.updateLevels(bi);\r\n }\r\n }\r\n }\r\n\r\n\r\n nextStream() {\r\n this.reset();\r\n }\r\n\r\n private reset() {\r\n this.currentLevelInfos = new LevelInfo(this.channelCount);\r\n this.peakLevelInfo = new LevelInfo(this.channelCount);\r\n if (this.levelListener) {\r\n this.levelListener.reset();\r\n this.levelListener.channelCount = this.channelCount;\r\n }\r\n if (this.peakLevelListener) {\r\n this.peakLevelInDb=MIN_DB_LEVEL;\r\n this.peakLevelListener(this.peakLevelInDb);\r\n }\r\n }\r\n\r\n write(bufferData: Array<Float32Array>): number {\r\n let bufArrCopies = new Array<Float32Array>(bufferData.length);\r\n let buffers = new Array<any>(bufferData.length);\r\n for (let ch = 0; ch < bufferData.length; ch++) {\r\n bufArrCopies[ch] = bufferData[ch].slice();\r\n buffers[ch] = bufArrCopies[ch].buffer;\r\n }\r\n this.worker?.postMessage({\r\n streamFinished: false,\r\n audioData: buffers,\r\n chs: this.channelCount,\r\n bufferIndex: this.bufferIndex\r\n }, buffers);\r\n this.bufferIndex++;\r\n return bufArrCopies[0].length;\r\n }\r\n\r\n flush() {\r\n this.worker?.postMessage({streamFinished: true});\r\n\r\n }\r\n\r\n close() {\r\n this.worker?.terminate();\r\n }\r\n\r\n /*\r\n * Method used as worker code.\r\n */\r\n workerFunction() {\r\n self.onmessage = function (msg:MessageEvent) {\r\n let streamFinished = msg.data.streamFinished;\r\n if (streamFinished) {\r\n postMessage({streamFinished: true});\r\n } else {\r\n let chs = msg.data.chs;\r\n let frameLength = null;\r\n let audioData = new Array<Float32Array>(chs);\r\n let linLevels = new Array<Float32Array>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n linLevels[ch] = new Float32Array(2);\r\n audioData[ch] = new Float32Array(msg.data.audioData[ch]);\r\n }\r\n\r\n if (audioData) {\r\n for (let ch = 0; ch < chs; ch++) {\r\n let chData = audioData[ch];\r\n if (frameLength === null) {\r\n frameLength = chData.length;\r\n }\r\n for (let s = 0; s < frameLength; s++) {\r\n let chSample=chData[s];\r\n if (chSample < linLevels[ch][0]) {\r\n linLevels[ch][0] = chSample;\r\n }\r\n if (chSample > linLevels[ch][1]) {\r\n linLevels[ch][1] = chSample;\r\n }\r\n }\r\n }\r\n }\r\n let linLevelBufs = new Array<any>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n linLevelBufs[ch] = linLevels[ch].buffer;\r\n }\r\n postMessage({streamFinished: false, frameLength: frameLength, linLevelBuffers: linLevelBufs}, linLevelBufs);\r\n }\r\n }\r\n }\r\n\r\n updateLevels(bufferLevelInfo: LevelInfo) {\r\n\r\n this.currentLevelInfos = bufferLevelInfo;\r\n if(this.peakLevelInfo) {\r\n this.peakLevelInfo.merge(bufferLevelInfo);\r\n if (this.levelListener) {\r\n this.levelListener.update(this.currentLevelInfos, this.peakLevelInfo.clone());\r\n }\r\n if(this.peakLevelListener){\r\n let peakDBVal = bufferLevelInfo.powerLevelDB();\r\n if (this.peakLevelInDb < peakDBVal) {\r\n this.peakLevelInDb = peakDBVal;\r\n // the event comes from outside of an Angular zone\r\n this.peakLevelListener(this.peakLevelInDb);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n stop() {\r\n this.worker?.terminate();\r\n }\r\n\r\n\r\n}\r\n","import {\r\n ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, OnDestroy, Output,\r\n ViewChild\r\n} from \"@angular/core\"\r\nimport {LevelInfo, LevelInfos, LevelListener} from \"../audio/dsp/level_measure\";\r\nimport {LevelBar} from \"../audio/ui/livelevel\";\r\nimport {Action} from \"../action/action\";\r\n\r\n\r\nexport const MIN_DB_LEVEL = -40.0;\r\nexport const DEFAULT_WARN_DB_LEVEL = -2;\r\n\r\n@Component({\r\n selector: 'spr-recordingitemcontrols',\r\n template: `\r\n <button matTooltip=\"Start playback\" (click)=\"playStartAction?.perform()\"\r\n [disabled]=\"playStartAction?.disabled\"\r\n [style.color]=\"playStartAction?.disabled ? 'grey' : 'green'\">\r\n <mat-icon>play_arrow</mat-icon>\r\n </button>\r\n <button matTooltip=\"Stop playback\" (click)=\"playStopAction?.perform()\"\r\n [disabled]=\"playStopAction?.disabled\"\r\n [style.color]=\"playStopAction?.disabled ? 'grey' : 'yellow'\">\r\n <mat-icon>stop</mat-icon>\r\n </button>\r\n <button fxHide.xs matTooltip=\"Toggle detailed audio display\" [disabled]=\"!audioLoaded\"\r\n (click)=\"showRecordingDetails()\">\r\n <mat-icon>{{(audioSignalCollapsed) ? \"expand_less\" : \"expand_more\"}}</mat-icon>\r\n </button>\r\n <button matTooltip=\"Download current recording\" *ngIf=\"enableDownload\" [disabled]=\"!audioLoaded\"\r\n (click)=\"downloadRecording()\">\r\n <mat-icon>file_download</mat-icon>\r\n </button>\r\n <div style=\"min-width: 14ch;padding:2px\"><table style=\"border-style: none\"><tr><td>Peak:</td><td><span matTooltip=\"Peak level\"\r\n [style.color]=\"(peakDbLvl > warnDbLevel)?'red':'black'\">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr>\r\n <tr *ngIf=\"_agc\"><td>AGC:</td><td><span matTooltip=\"Auto gain control\">{{agcString}}</span></td></tr></table></div>\r\n `,\r\n styles: [`:host {\r\n flex: 0; /* only required vertical space */\r\n width: 100%;\r\n background: darkgray;\r\n padding: 4px;\r\n box-sizing: border-box;\r\n height: 100%;\r\n\r\n display: flex; /* flex container: left level bar, right decimal peak level value */\r\n flex-direction: row;\r\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\r\n }`, `span {\r\n flex: 0;\r\n font-weight: bold;\r\n display: inline-block;\r\n white-space: nowrap;\r\n box-sizing: border-box;\r\n }`,`\r\n button {\r\n touch-action: manipulation;\r\n }`]\r\n\r\n})\r\nexport class RecordingItemControls implements OnDestroy {\r\n\r\n ce: HTMLDivElement|null=null;\r\n @Input() audioSignalCollapsed: boolean=true;\r\n private _displayAudioBuffer: AudioBuffer | null|undefined;\r\n @Input() enableDownload: boolean=false;\r\n\r\n @Input() peakDbLvl = MIN_DB_LEVEL;\r\n\r\n _displayLevelInfos: LevelInfos | null=null;\r\n\r\n _agc:boolean|null|undefined=undefined;\r\n agcString='n/a';\r\n\r\n @Input() set agc(agc:boolean|null|undefined){\r\n this._agc=agc;\r\n if(this._agc===undefined || this._agc===null){\r\n this.agcString='n/a';\r\n }else{\r\n if(this._agc===true){\r\n this.agcString='On';\r\n }else{\r\n this.agcString='Off';\r\n }\r\n }\r\n }\r\n\r\n @Output() onShowRecordingDetails: EventEmitter<void> = new EventEmitter<void>();\r\n @Output() onDownloadRecording: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n @Input() audioLoaded=false;\r\n //@Input() controlAudioPlayer: AudioPlayer;\r\n @Input() playStartAction:Action<void>|undefined;\r\n @Input() playStopAction:Action<void>|undefined;\r\n playStartEnabled = false;\r\n playStopEnabled = false;\r\n private updateTimerId: number|null=null;\r\n\r\n private destroyed = false;\r\n\r\n warnDbLevel = DEFAULT_WARN_DB_LEVEL;\r\n\r\n constructor(private ref: ElementRef, private changeDetectorRef: ChangeDetectorRef) {\r\n\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroyed = true;\r\n }\r\n\r\n showRecordingDetails() {\r\n this.onShowRecordingDetails.emit();\r\n }\r\n\r\n downloadRecording() {\r\n this.onDownloadRecording.emit();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.ce = this.ref.nativeElement;\r\n }\r\n\r\n @Input()\r\n set displayLevelInfos(levelInfos: LevelInfos | null) {\r\n this._displayLevelInfos = levelInfos;\r\n }\r\n\r\n error() {\r\n // this.status = 'ERROR';\r\n }\r\n\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'spr-recordingitemdisplay',\r\n template: `\r\n <div fxLayout=\"row\" fxLayout.xs=\"column\" [ngStyle]=\"{'height.px':100,'min-height.px': 100}\" [ngStyle.xs]=\"{'height.px':125,'min-height.px': 125}\">\r\n <audio-levelbar fxFlex=\"1 0 1\" [streamingMode]=\"streamingMode\" [displayLevelInfos]=\"_displayLevelInfos\"></audio-levelbar>\r\n <spr-recordingitemcontrols fxFlex=\"0 0 0\" [audioLoaded]=\"displayAudioBuffer!==null\" [playStartAction]=\"playStartAction\" [playStopAction]=\"playStopAction\" [peakDbLvl]=\"peakDbLvl\" [agc]=\"_agc\" (onShowRecordingDetails)=\"onShowRecordingDetails.emit()\"></spr-recordingitemcontrols>\r\n </div>\r\n `,\r\n styles: [`div {\r\n width: 100%;\r\n background: darkgray;\r\n padding: 4px;\r\n box-sizing: border-box;\r\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\r\n }`, `audio-levelbar {\r\n box-sizing: border-box;\r\n }`]\r\n\r\n})\r\nexport class RecordingItemDisplay implements LevelListener, OnDestroy {\r\n\r\n ce: HTMLDivElement|null=null;\r\n @ViewChild(LevelBar, { static: true }) liveLevel!: LevelBar;\r\n @Input() streamingMode: boolean=false;\r\n @Input() audioSignalCollapsed: boolean=true;\r\n private _displayAudioBuffer: AudioBuffer | null|undefined;\r\n @Input() enableDownload: boolean=false;\r\n\r\n peakDbLvl = MIN_DB_LEVEL;\r\n\r\n _displayLevelInfos: LevelInfos | null=null;\r\n\r\n _agc:boolean|null|undefined=undefined;\r\n agcString='n/a';\r\n\r\n @Input() set agc(agc:boolean|null|undefined){\r\n this._agc=agc;\r\n }\r\n\r\n @Output() onShowRecordingDetails: EventEmitter<void> = new EventEmitter<void>();\r\n @Output() onDownloadRecording: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n //@Input() controlAudioPlayer: AudioPlayer;\r\n @Input() playStartAction:Action<void>|undefined;\r\n @Input() playStopAction:Action<void>|undefined;\r\n playStartEnabled = false;\r\n playStopEnabled = false;\r\n private updateTimerId: number|null=null;\r\n\r\n private destroyed = false;\r\n\r\n warnDbLevel = DEFAULT_WARN_DB_LEVEL;\r\n\r\n constructor(private ref: ElementRef, private changeDetectorRef: ChangeDetectorRef) {\r\n\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroyed = true;\r\n }\r\n\r\n\r\n @Input()\r\n set displayAudioBuffer(displayAudioBuffer: AudioBuffer | null| undefined) {\r\n this._displayAudioBuffer = displayAudioBuffer;\r\n }\r\n\r\n get displayAudioBuffer() {\r\n return this._displayAudioBuffer;\r\n }\r\n\r\n showRecordingDetails() {\r\n this.onShowRecordingDetails.emit();\r\n }\r\n\r\n downloadRecording() {\r\n this.onDownloadRecording.emit();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.ce = this.ref.nativeElement;\r\n //this.controlAudioPlayer.listener=this;\r\n }\r\n\r\n @Input()\r\n set displayLevelInfos(levelInfos: LevelInfos | null) {\r\n this._displayLevelInfos = levelInfos;\r\n }\r\n\r\n set channelCount(channelCount: number) {\r\n this.reset();\r\n this.liveLevel.channelCount = channelCount;\r\n }\r\n\r\n set playFramePosition(playFramePosition: number) {\r\n this.liveLevel.playFramePosition=playFramePosition;\r\n }\r\n\r\n update(levelInfo: LevelInfo, peakLevelInfo: LevelInfo) {\r\n let peakDBVal = levelInfo.powerLevelDB();\r\n if (this.peakDbLvl < peakDBVal) {\r\n this.peakDbLvl = peakDBVal;\r\n // the event comes from outside of an Angular zone\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n this.liveLevel.update(levelInfo);\r\n }\r\n\r\n error() {\r\n // this.status = 'ERROR';\r\n }\r\n\r\n streamFinished() {\r\n this.liveLevel.streamFinished();\r\n }\r\n\r\n reset() {\r\n this.peakDbLvl = MIN_DB_LEVEL;\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n\r\n}\r\n","import {TransportActions} from \"./controlpanel\";\r\nimport {Browser, UserAgent, UserAgentBuilder} from \"../../utils/ua-parser\";\r\nimport {MatDialog} from \"@angular/material/dialog\";\r\nimport {MessageDialog} from \"../../ui/message_dialog\";\r\nimport {Session} from \"./session\";\r\nimport {SessionService} from \"./session.service\";\r\nimport {AudioCapture} from \"../../audio/capture/capture\";\r\nimport {AudioDevice, AutoGainControlConfig} from \"../project/project\";\r\nimport {LevelInfos, LevelMeasure, StreamLevelMeasure} from \"../../audio/dsp/level_measure\";\r\nimport {AudioPlayer} from \"../../audio/playback/player\";\r\nimport {Subscription} from \"rxjs\";\r\nimport {AudioClip} from \"../../audio/persistor\";\r\nimport {Action} from \"../../action/action\";\r\nimport {MIN_DB_LEVEL} from \"../../ui/recordingitem_display\";\r\n\r\nexport const FORCE_REQUEST_AUDIO_PERMISSIONS=false;\r\nexport const RECFILE_API_CTX = 'recfile';\r\nexport const MAX_RECORDING_TIME_MS = 1000 * 60 * 60 * 60; // 1 hour\r\n\r\nexport const LEVEL_BAR_INTERVALL_SECONDS = 0.1; // 100ms\r\n\r\nexport class BasicRecorder {\r\n protected userAgent:UserAgent;\r\n statusMsg: string='';\r\n statusAlertType!: string;\r\n statusWaiting: boolean=false;\r\n readonly=false;\r\n processingRecording=false;\r\n ac: AudioCapture|null=null;\r\n // Property audioDevices from project config: list of names of allowed audio devices.\r\n protected _audioDevices: Array<AudioDevice> | null| undefined;\r\n protected _selectedDeviceId:string|undefined=undefined;\r\n protected selCaptureDeviceId: ConstrainDOMString | null;\r\n protected _channelCount = 2;\r\n protected _autoGainControlConfigs: Array<AutoGainControlConfig> | null| undefined;\r\n\r\n _session: Session|null=null;\r\n\r\n transportActions: TransportActions;\r\n playStartAction: Action<void>;\r\n\r\n uploadProgress: number = 100;\r\n uploadStatus: string = 'ok'\r\n audioSignalCollapsed = true;\r\n\r\n protected streamLevelMeasure: StreamLevelMeasure;\r\n protected levelMeasure: LevelMeasure;\r\n peakLevelInDb:number=MIN_DB_LEVEL;\r\n displayLevelInfos: LevelInfos | null=null;\r\n protected _controlAudioPlayer!: AudioPlayer;\r\n displayAudioClip: AudioClip | null=null;\r\n protected audioFetchSubscription:Subscription|null=null;\r\n\r\n protected destroyed=false;\r\n\r\n protected navigationDisabled=true;\r\n\r\n constructor( public dialog: MatDialog,protected sessionService:SessionService) {\r\n this.userAgent=UserAgentBuilder.userAgent();\r\n console.debug(\"Detected platform: \"+this.userAgent.detectedPlatform);\r\n console.debug(\"Detected browser: \"+this.userAgent.detectedBrowser);\r\n this.transportActions = new TransportActions();\r\n this.playStartAction = new Action('Play');\r\n this.levelMeasure = new LevelMeasure();\r\n this.streamLevelMeasure = new StreamLevelMeasure();\r\n this.selCaptureDeviceId = null;\r\n }\r\n\r\n set audioDevices(audioDevices: Array<AudioDevice> | null | undefined) {\r\n this._audioDevices = audioDevices;\r\n }\r\n\r\n set autoGainControlConfigs(autoGainControlConfigs: Array<AutoGainControlConfig>|null|undefined){\r\n this._autoGainControlConfigs=autoGainControlConfigs;\r\n }\r\n\r\n set channelCount(channelCount: number) {\r\n this._channelCount = channelCount;\r\n }\r\n\r\n set session(session: Session|null) {\r\n this._session = session;\r\n }\r\n\r\n get session():Session|null{\r\n return this._session;\r\n }\r\n\r\n enableStartUserGesture() {\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Ready.';\r\n }\r\n\r\n start() {\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Starting session...';\r\n this.statusWaiting=false;\r\n if(this._session) {\r\n if (this._session.sealed) {\r\n this.readonly = true\r\n this.statusMsg = 'Session sealed!';\r\n //let dialogRef = this.dialog.open(SessionSealedDialog, {});\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: \"This session is sealed. Recordings cannot be added anymore.\",\r\n advise: 'Please ask your experimenter what to do (e.g start a new session).',\r\n }\r\n });\r\n } else {\r\n let body: any = {};\r\n if (this._session.status === \"CREATED\") {\r\n this._session.status = \"LOADED\";\r\n body.status = this._session.status;\r\n if (!this._session.loadedDate) {\r\n this._session.loadedDate = new Date();\r\n body.loadedDate = this._session.loadedDate;\r\n }\r\n } else {\r\n this._session.restartedDate = new Date();\r\n body.restartedDate = this._session.restartedDate;\r\n }\r\n this.sessionService.patchSessionObserver(this._session, body).subscribe()\r\n }\r\n }\r\n\r\n // Check browser compatibility\r\n if(this.userAgent.detectedBrowser===Browser.Safari && this._channelCount>1){\r\n let eMsg=\"Error: Safari browser does not support stereo recordings.\";\r\n console.error(eMsg);\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Browser not supported',\r\n msg: eMsg,\r\n advice: \"Please use a supported browser, e.g. Mozilla Firefox.\"\r\n }\r\n })\r\n }\r\n\r\n //console.log(\"Session ID: \"+this._session.session+ \" status: \"+this._session.status)\r\n this._selectedDeviceId=undefined;\r\n\r\n if (!this.readonly && this.ac && (FORCE_REQUEST_AUDIO_PERMISSIONS || (this._audioDevices && this._audioDevices.length > 0))) {\r\n this.statusMsg = 'Requesting audio permissions...';\r\n this.statusAlertType = 'info';\r\n\r\n this.ac.deviceInfos((mdis) => {\r\n let audioCaptureDeviceAvail: boolean = false;\r\n let audioPlayDeviceAvail: boolean = false;\r\n if (mdis) {\r\n if(this.ac) {\r\n this.ac.printDevices(mdis);\r\n }\r\n if (mdis.length > 0) {\r\n for (let mdii = 0; mdii < mdis.length; mdii++) {\r\n let mdi = mdis[mdii];\r\n let kind=mdi.kind;\r\n if(kind === \"audioinput\"){\r\n audioCaptureDeviceAvail=true;\r\n }else if(kind=== \"audiooutput\"){\r\n audioPlayDeviceAvail=true;\r\n }\r\n }\r\n }\r\n\r\n if (this._session && this._session.type !== 'TEST_DEF_A' && this._audioDevices && this._audioDevices.length > 0) {\r\n let fdi: MediaDeviceInfo | null = null;\r\n for (let adI = 0; adI < this._audioDevices.length; adI++) {\r\n let ad = this._audioDevices[adI];\r\n if (ad.playback) {\r\n // project audio device config for playback device\r\n // not used for now\r\n continue;\r\n }\r\n for (let mdii = 0; mdii < mdis.length; mdii++) {\r\n let mdi = mdis[mdii];\r\n let kind=mdi.kind;\r\n if(kind === \"audioinput\"){\r\n audioCaptureDeviceAvail=true;\r\n }else if(kind=== \"audiooutput\"){\r\n audioPlayDeviceAvail=true;\r\n }\r\n if (ad.regex) {\r\n //console.log(\"Match?: \\'\"+mdi.label+\"\\' \\'\"+ad.name+\"\\'\");\r\n if (mdi.label.match(ad.name)) {\r\n fdi = mdi;\r\n //console.log(\"Match!\");\r\n }\r\n } else {\r\n if (mdi.label.trim() === ad.name.trim()) {\r\n fdi = mdi;\r\n }\r\n }\r\n if (fdi) {\r\n break;\r\n }\r\n }\r\n if (fdi) {\r\n break;\r\n }\r\n }\r\n\r\n if (fdi) {\r\n // matching device found\r\n\r\n // Not able to open device here since Chrome 71\r\n // Chrome 71 requires a user gesture before the AudioContext can be resumed\r\n // sessionmanager.ts:712 Open session with default audio device for 1 channels\r\n // capture.ts:128 The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu\r\n // push../projects/speechrecorderng/src/lib/audio/capture/capture.ts.AudioCapture.open @ capture.ts:128\r\n\r\n //this.ac.open(this._channelCount, fdi.deviceId);\r\n console.info(\"Set selected audio device: \\'\" + fdi.label + \"\\' Id: \\'\" + fdi.deviceId + \"\\'\");\r\n this._selectedDeviceId = fdi.deviceId;\r\n\r\n this.enableStartUserGesture()\r\n } else {\r\n // device not found\r\n this.statusMsg = 'ERROR: Required audio device not available!';\r\n this.statusAlertType = 'error';\r\n this.readonly = true;\r\n\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Required audio device',\r\n msg: \"Required audio device not found\",\r\n advice: \"Please connect a suitable audio device for this project and retry (press the browser reload button).\"\r\n }\r\n })\r\n }\r\n }else{\r\n if(!audioCaptureDeviceAvail && !audioPlayDeviceAvail){\r\n // no device found\r\n this.statusMsg = 'ERROR: No audio device available!';\r\n this.statusAlertType = 'warn';\r\n //this.readonly = true;\r\n\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'warn',\r\n title: 'No audio device',\r\n msg: \"No audio device found\",\r\n advice: \"Please connect an audio device and retry (press the browser reload button) or try to continue anyway.\"\r\n }\r\n })\r\n }else {\r\n if (!this.readonly && !audioCaptureDeviceAvail) {\r\n // no device found\r\n this.statusMsg = 'WARNING: No audio capture device available!';\r\n this.statusAlertType = 'warning';\r\n //this.readonly = true;\r\n\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'warning',\r\n title: 'No audio capture device',\r\n msg: \"No audio capture device found\",\r\n advice: \"Please connect an audio capture device and retry (press the browser reload button) or try to continue anyway.\"\r\n }\r\n })\r\n }\r\n // Safari does not list playback devices\r\n if (!audioPlayDeviceAvail) {\r\n // Firefox does not enumerate audiooutput devices\r\n // Do not show this warning, because it would always appear on Firefox\r\n // When https://bugzilla.mozilla.org/show_bug.cgi?id=1498512 is fixed the warning can be enabled for Firefox as well\r\n\r\n // It is already implemneted but kept behind a preference setting https://bugzilla.mozilla.org/show_bug.cgi?id=1152401\r\n\r\n\r\n // Output devices are listed if about:config media.setsinkid.enabled=true\r\n // but default setting is false\r\n\r\n\r\n // Same problem with Safari\r\n\r\n if (!(this.userAgent.detectedBrowser===Browser.Safari || this.userAgent.detectedBrowser===Browser.Firefox)) {\r\n // no device found\r\n this.statusMsg = 'WARNING: No audio playback device available!';\r\n this.statusAlertType = 'warn';\r\n //this.readonly = true;\r\n\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'warn',\r\n title: 'No audio playback device',\r\n msg: \"No audio playback device found\",\r\n advice: \"Please connect an audio playback device and retry (press the browser reload button) or try to continue anyway.\"\r\n }\r\n })\r\n }\r\n }\r\n }\r\n\r\n // Not able to open device here since Chrome 71\r\n // Chrome 71 requires a user gesture before the AudioContext can be resumed\r\n // sessionmanager.ts:712 Open session with default audio device for 1 channels\r\n // capture.ts:128 The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu\r\n // push../projects/speechrecorderng/src/lib/audio/capture/capture.ts.AudioCapture.open @ capture.ts:128\r\n //console.log(\"Open session with default audio device for \"+this._channelCount+\" channels\");\r\n //this.ac.open(this._channelCount);\r\n\r\n // enable start gesture anyway\r\n this.enableStartUserGesture()\r\n }\r\n }\r\n\r\n });\r\n }\r\n }\r\n\r\n closed() {\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Session closed.';\r\n }\r\n\r\n error(msg='An unknown error occured during recording.',advice:string='Please retry.') {\r\n this.statusMsg = 'ERROR: Recording.';\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Recording error',\r\n msg: msg,\r\n advice: advice\r\n }\r\n });\r\n }\r\n\r\n}\r\n","/**\r\n * Created by klausj on 17.06.2017.\r\n */\r\nimport {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient, HttpErrorResponse, HttpHeaders, HttpResponse} from \"@angular/common/http\";\r\nimport {ApiType, SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\n\r\nimport {UUID} from \"../../utils/utils\";\r\nimport {SprRecordingFile, RecordingFileDescriptorImpl, RecordingFile} from \"../recording\";\r\nimport {ProjectService} from \"../project/project.service\";\r\nimport {SessionService} from \"../session/session.service\";\r\nimport {Observable} from \"rxjs\";\r\n\r\n\r\nexport const REC_API_CTX='recfile'\r\n\r\n\r\n\r\n@Injectable()\r\nexport class RecordingService {\r\n\r\n public static readonly REC_API_CTX = 'recfile'\r\n public static readonly RECORDING_API_CTX='recordingfile'\r\n private apiEndPoint: string;\r\n private withCredentials: boolean = false;\r\n\r\n //private debugDelay:number=10000;\r\n private debugDelay:number=0;\r\n\r\n constructor(private http: HttpClient, @Inject(SPEECHRECORDER_CONFIG) private config?: SpeechRecorderConfig) {\r\n\r\n this.apiEndPoint = ''\r\n\r\n if (config && config.apiEndPoint) {\r\n this.apiEndPoint = config.apiEndPoint;\r\n }\r\n if (this.apiEndPoint !== '') {\r\n this.apiEndPoint = this.apiEndPoint + '/'\r\n }\r\n if (config != null && config.withCredentials != null) {\r\n this.withCredentials = config.withCredentials;\r\n }\r\n }\r\n\r\n private recordingFilesUrl():string{\r\n let recFilesUrl = this.apiEndPoint + RecordingService.RECORDING_API_CTX;\r\n return recFilesUrl;\r\n }\r\n\r\n private sessionRecordingFilesUrl(projectName: string, sessId: string | number):string{\r\n let encPrjName=encodeURIComponent(projectName);\r\n let encSessId=encodeURIComponent(sessId);\r\n let recFilesUrl = this.apiEndPoint + ProjectService.PROJECT_API_CTX + '/' + encPrjName + '/' +\r\n SessionService.SESSION_API_CTX + '/' + encSessId + '/' + RecordingService.RECORDING_API_CTX;\r\n return recFilesUrl;\r\n }\r\n\r\n private sessionRecFilesUrl(projectName: string, sessId: string | number):string{\r\n let encPrjName=encodeURIComponent(projectName);\r\n let encSessId=encodeURIComponent(sessId);\r\n let recFilesUrl = this.apiEndPoint + ProjectService.PROJECT_API_CTX + '/' + encPrjName + '/' +\r\n SessionService.SESSION_API_CTX + '/' + encSessId + '/' + RecordingService.REC_API_CTX;\r\n return recFilesUrl;\r\n }\r\n\r\n private sessionRecFilesReqUrl(projectName: string, sessId: string | number):string{\r\n let recFilesUrl=this.sessionRecFilesUrl(projectName,sessId);\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n recFilesUrl = recFilesUrl + '.json?requestUUID=' + UUID.generate();\r\n }\r\n return recFilesUrl;\r\n }\r\n\r\n recordingFileDescrList(projectName: string, sessId: string | number):Observable<Array<RecordingFileDescriptorImpl>> {\r\n let recFilesReqUrl = this.sessionRecFilesReqUrl(projectName,sessId);\r\n let wobs = this.http.get<Array<RecordingFileDescriptorImpl>>(recFilesReqUrl,{withCredentials:this.withCredentials});\r\n return wobs;\r\n }\r\n\r\n recordingFileList(projectName: string, sessId: string | number):Observable<Array<RecordingFile>> {\r\n let recFilesReqUrl = this.sessionRecFilesReqUrl(projectName,sessId);\r\n let wobs = this.http.get<Array<RecordingFile>>(recFilesReqUrl,{withCredentials:this.withCredentials});\r\n return wobs;\r\n }\r\n\r\n sprRecordingFileList(projectName: string, sessId: string | number):Observable<Array<SprRecordingFile>> {\r\n let recFilesReqUrl = this.sessionRecFilesReqUrl(projectName,sessId);\r\n let wobs = this.http.get<Array<SprRecordingFile>>(recFilesReqUrl,{withCredentials:this.withCredentials});\r\n return wobs;\r\n }\r\n\r\n private audioRequest(audioUrl:string): Observable<HttpResponse<ArrayBuffer>> {\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();\r\n }\r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'audio/wav');\r\n return this.http.get(audioUrl, {\r\n headers: headers,\r\n observe: 'response',\r\n responseType: 'arraybuffer',\r\n withCredentials: this.withCredentials\r\n });\r\n\r\n }\r\n\r\n private fetchAudiofile(projectName: string, sessId: string | number, recFileId: string|number): Observable<HttpResponse<ArrayBuffer>> {\r\n let recFilesUrl=this.sessionRecordingFilesUrl(projectName,sessId);\r\n let encRecFileId=encodeURIComponent(recFileId);\r\n let recUrl = recFilesUrl + '/' + encRecFileId;\r\n return this.audioRequest(recUrl);\r\n }\r\n\r\n private fetchSprAudiofile(projectName: string, sessId: string | number, itemcode: string,version:number): Observable<HttpResponse<ArrayBuffer>> {\r\n let recFilesUrl=this.sessionRecFilesUrl(projectName,sessId);\r\n let encItemcode=encodeURIComponent(itemcode);\r\n let recUrl = recFilesUrl + '/' + encItemcode +'/'+version;\r\n return this.audioRequest(recUrl);\r\n }\r\n\r\n fetchAndApplyRecordingFile(aCtx: AudioContext, projectName: string, recordingFile:RecordingFile):Observable<RecordingFile|null> {\r\n\r\n let wobs = new Observable<RecordingFile|null>(observer=>{\r\n if(recordingFile.session && recordingFile.recordingFileId) {\r\n let obs = this.fetchAudiofile(projectName, recordingFile.session, recordingFile.recordingFileId);\r\n obs.subscribe(resp => {\r\n //console.log(\"Fetched audio file. HTTP response status: \"+resp.status+\", type: \"+resp.type+\", byte length: \"+ resp.body.byteLength);\r\n\r\n // Do not use Promise version, which does not work with Safari 13 (13.0.5)\r\n if (resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n recordingFile.audioBuffer = ab;\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }\r\n }, error => {\r\n observer.error(error);\r\n observer.complete();\r\n })\r\n } else {\r\n observer.error('Fetching audio file: response has no body');\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n } else {\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n }else{\r\n observer.error();\r\n }\r\n });\r\n\r\n return wobs;\r\n }\r\n\r\n fetchAndApplySprRecordingFile(aCtx: AudioContext, projectName: string, recordingFile:SprRecordingFile):Observable<SprRecordingFile|null> {\r\n\r\n let wobs = new Observable<SprRecordingFile|null>(observer=>{\r\n if(recordingFile.session) {\r\n let obs = this.fetchSprAudiofile(projectName, recordingFile.session, recordingFile.itemCode, recordingFile.version);\r\n obs.subscribe(resp => {\r\n //console.log(\"Fetched audio file. HTTP response status: \"+resp.status+\", type: \"+resp.type+\", byte length: \"+ resp.body.byteLength);\r\n\r\n // Do not use Promise version, which does not work with Safari 13 (13.0.5)\r\n if (resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n recordingFile.audioBuffer = ab;\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }\r\n }, error => {\r\n observer.error(error);\r\n observer.complete();\r\n })\r\n } else {\r\n observer.error('Fetching audio file: response has no body');\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n } else {\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n }else{\r\n observer.error();\r\n }\r\n });\r\n\r\n return wobs;\r\n }\r\n\r\n fetchRecordingFile(aCtx: AudioContext, projectName: string, sessId: string | number, itemcode: string,version:number):Observable<SprRecordingFile|null> {\r\n\r\n let wobs = new Observable<SprRecordingFile | null>(observer=>{\r\n let obs = this.fetchSprAudiofile(projectName, sessId, itemcode,version);\r\n\r\n\r\n obs.subscribe(resp => {\r\n // Do not use Promise version, which does not work with Safari 13\r\n if(resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n let rf = new SprRecordingFile(sessId, itemcode, version, ab);\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n\r\n observer.next(rf);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(rf);\r\n observer.complete();\r\n }\r\n });\r\n }else{\r\n observer.error();\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n }else{\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n });\r\n\r\n return wobs;\r\n }\r\n}\r\n\r\n\r\n\r\n","\nimport {Uploader} from \"../net/uploader\";\nimport {Inject, Injectable} from \"@angular/core\";\nimport {HttpClient} from \"@angular/common/http\";\nimport {SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../spr.config\";\n\n@Injectable()\n export class SpeechRecorderUploader extends Uploader{\n\n constructor(private httpClient:HttpClient,@Inject(SPEECHRECORDER_CONFIG) private config?:SpeechRecorderConfig){\n super(httpClient,(config)?config.withCredentials:false);\n }\n}\n","import {Component, Input} from \"@angular/core\";\r\nimport {SessionService} from \"./session.service\";\r\n\r\n@Component({\r\n\r\n selector: 'app-warningbar',\r\n providers: [SessionService],\r\n template: `\r\n <div [class]=\"displayClass\">{{warningText}}</div>\r\n\r\n `,\r\n styles: [`:host {\r\n\r\n flex: 0 0 content;\r\n background: orange;\r\n\r\n }`,`\r\n .off {\r\n display: none;\r\n }\r\n `,`\r\n .on {\r\n padding: 2px;\r\n display: inline-block;\r\n width: 100%;\r\n font-weight: bold;\r\n font-size: larger;\r\n text-align: center;\r\n }\r\n ` ]\r\n})\r\nexport class WarningBar {\r\n @Input() warningText!:string;\r\n @Input() set show(show:boolean){\r\n if(show){\r\n this.displayClass='on'\r\n }else{\r\n this.displayClass='off'\r\n }\r\n }\r\n displayClass:string='off';\r\n}\r\n","import {AudioCapture, AudioCaptureListener} from '../../audio/capture/capture';\r\nimport {AudioPlayer, AudioPlayerEvent, EventType} from '../../audio/playback/player'\r\nimport {WavWriter} from '../../audio/impl/wavwriter'\r\nimport {Group, PromptItem, PromptitemUtil, Script, Section} from '../script/script';\r\nimport {SprRecordingFile, RecordingFileDescriptorImpl} from '../recording'\r\nimport {Upload} from '../../net/uploader';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Renderer2,\r\n ViewChild\r\n} from \"@angular/core\";\r\nimport {SessionService} from \"./session.service\";\r\nimport {State as StartStopSignalState} from \"../startstopsignal/startstopsignal\";\r\nimport {MatDialog} from \"@angular/material/dialog\";\r\nimport {SpeechRecorderUploader} from \"../spruploader\";\r\nimport {SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\nimport {Prompting} from \"./prompting\";\r\nimport {SequenceAudioFloat32ChunkerOutStream} from \"../../audio/io/stream\";\r\nimport {SessionFinishedDialog} from \"./session_finished_dialog\";\r\nimport {MessageDialog} from \"../../ui/message_dialog\";\r\nimport {RecordingService} from \"../recordings/recordings.service\";\r\nimport {AudioContextProvider} from \"../../audio/context\";\r\nimport {AudioClip} from \"../../audio/persistor\";\r\nimport {Item} from \"./item\";\r\nimport {LevelBar} from \"../../audio/ui/livelevel\";\r\nimport {BasicRecorder, LEVEL_BAR_INTERVALL_SECONDS, MAX_RECORDING_TIME_MS, RECFILE_API_CTX} from \"./basicrecorder\";\r\n\r\nconst DEFAULT_PRE_REC_DELAY=1000;\r\nconst DEFAULT_POST_REC_DELAY=500;\r\n\r\nexport const enum Status {\r\n BLOCKED, IDLE, PRE_RECORDING, RECORDING, POST_REC_STOP, POST_REC_PAUSE, STOPPING_STOP, STOPPING_PAUSE, ERROR\r\n}\r\n\r\n@Component({\r\n selector: 'app-sprrecordingsession',\r\n providers: [SessionService],\r\n template: `\r\n <app-warningbar [show]=\"isTestSession()\" warningText=\"Test recording only!\"></app-warningbar>\r\n <app-warningbar [show]=\"isDefaultAudioTestSession()\" warningText=\"This test uses default audio device! Regular sessions may require a particular audio device (microphone)!\"></app-warningbar>\r\n <app-sprprompting [projectName]=\"projectName\"\r\n [startStopSignalState]=\"startStopSignalState\" [promptItem]=\"promptItem\" [showPrompt]=\"showPrompt\"\r\n [items]=\"items\"\r\n [transportActions]=\"transportActions\"\r\n [selectedItemIdx]=\"promptIndex\" (onItemSelect)=\"itemSelect($event)\" (onNextItem)=\"nextItem()\" (onPrevItem)=\"prevItem()\"\r\n [audioSignalCollapsed]=\"audioSignalCollapsed\" [displayAudioClip]=\"displayAudioClip\"\r\n [playStartAction]=\"controlAudioPlayer?.startAction\"\r\n [playSelectionAction]=\"controlAudioPlayer?.startSelectionAction\"\r\n [autoPlayOnSelectToggleAction]=\"controlAudioPlayer?.autoPlayOnSelectToggleAction\"\r\n [playStopAction]=\"controlAudioPlayer?.stopAction\">\r\n\r\n </app-sprprompting>\r\n <mat-progress-bar [value]=\"progressPercentValue()\" fxShow=\"false\" fxShow.xs=\"true\" ></mat-progress-bar>\r\n\r\n\r\n <div fxLayout=\"row\" fxLayout.xs=\"column\" [ngStyle]=\"{'height.px':100,'min-height.px': 100}\" [ngStyle.xs]=\"{'height.px':125,'min-height.px': 125}\">\r\n <audio-levelbar fxFlex=\"1 0 1\" [streamingMode]=\"isRecording()\" [displayLevelInfos]=\"displayLevelInfos\"></audio-levelbar>\r\n <div fxLayout=\"row\">\r\n <spr-recordingitemcontrols fxFlex=\"10 0 1\"\r\n [audioLoaded]=\"displayAudioClip?.buffer!==null\"\r\n [playStartAction]=\"controlAudioPlayer?.startAction\"\r\n [playStopAction]=\"controlAudioPlayer?.stopAction\"\r\n [peakDbLvl]=\"peakLevelInDb\"\r\n [agc]=\"this.ac?.agcStatus\"\r\n (onShowRecordingDetails)=\"audioSignalCollapsed=!audioSignalCollapsed\">\r\n </spr-recordingitemcontrols>\r\n <app-uploadstatus class=\"ricontrols dark\" fxHide fxShow.xs fxFlex=\"0 0 0\" *ngIf=\"enableUploadRecordings\" [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processingRecording\"></app-uploadstatus>\r\n <app-readystateindicator class=\"ricontrols dark\" fxHide fxShow.xs fxFlex=\"0 0 0\" [ready]=\"dataSaved && !isActive()\"></app-readystateindicator>\r\n </div>\r\n </div>\r\n <div #controlpanel class=\"controlpanel\" fxLayout=\"row\">\r\n <div fxFlex=\"1 1 30%\" fxLayoutAlign=\"start center\">\r\n <app-sprstatusdisplay fxHide.xs [statusMsg]=\"statusMsg\" [statusAlertType]=\"statusAlertType\" [statusWaiting]=\"statusWaiting\"></app-sprstatusdisplay>\r\n </div>\r\n <app-sprtransport fxFlex=\"10 0 30%\" fxLayoutAlign=\"center center\" [readonly]=\"readonly\" [actions]=\"transportActions\" [navigationEnabled]=\"items==null || items.length>1\"></app-sprtransport>\r\n <div fxFlex=\"1 1 30%\" fxLayoutAlign=\"end center\" fxLayout=\"row\">\r\n <app-uploadstatus class=\"ricontrols\" fxHide.xs fxLayoutAlign=\"end center\" *ngIf=\"enableUploadRecordings\" [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processingRecording\"></app-uploadstatus>\r\n <app-readystateindicator class=\"ricontrols\" fxLayoutAlign=\"end center\" fxHide.xs [ready]=\"dataSaved && !isActive()\"></app-readystateindicator>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`:host {\r\n flex: 2;\r\n background: lightgrey;\r\n display: flex; /* Vertical flex container: Bottom transport panel, above prompting panel */\r\n flex-direction: column;\r\n margin: 0;\r\n padding: 0;\r\n min-height: 0px;\r\n\r\n /* Prevents horizontal scroll bar on swipe right */\r\n overflow: hidden;\r\n }`,`.ricontrols {\r\n padding: 4px;\r\n box-sizing: border-box;\r\n height: 100%;\r\n }`,`.dark {\r\n background: darkgray;\r\n }`,`.controlpanel {\r\n align-content: center;\r\n align-items: center;\r\n margin: 0;\r\n padding: 20px;\r\n min-height: min-content; /* important */\r\n }`]\r\n})\r\nexport class SessionManager extends BasicRecorder implements AfterViewInit,OnDestroy, AudioCaptureListener {\r\n\r\n @Input() projectName:string|undefined;\r\n enableUploadRecordings: boolean = true;\r\n enableDownloadRecordings: boolean = false;\r\n status: Status = Status.BLOCKED;\r\n\r\n @ViewChild(Prompting, { static: true }) prompting!: Prompting;\r\n @ViewChild(LevelBar, { static: true }) liveLevelDisplay!: LevelBar;\r\n\r\n @Input() dataSaved=true\r\n\r\n startStopSignalState!: StartStopSignalState;\r\n\r\n private updateTimerId: any;\r\n private preRecTimerId: number|null=null;\r\n private preRecTimerRunning: boolean|null=null;\r\n private postRecTimerId: number|null=null;\r\n private postRecTimerRunning: boolean|null=null;\r\n private maxRecTimerId: number|null=null;\r\n private maxRecTimerRunning: boolean|null=null;\r\n\r\n dnlLnk!: HTMLAnchorElement;\r\n\r\n audio: any;\r\n _script!: Script;\r\n private _promptIndex=0;\r\n private section!: Section;\r\n group!: Group;\r\n promptItem!:PromptItem;\r\n showPrompt!: boolean;\r\n\r\n // index of current section\r\n sectIdx!: number;\r\n // index of current group in section\r\n groupIdxInSection!: number;\r\n // index of current prompt item in group\r\n promptItemIdxInGroup!: number;\r\n\r\n private autorecording!: boolean;\r\n\r\n items: Array<Item>|null=null;\r\n //selectedItemIdx: number;\r\n private _displayRecFile: SprRecordingFile | null=null;\r\n private displayRecFileVersion!: number;\r\n\r\n promptItemCount!: number;\r\n\r\n constructor(private changeDetectorRef: ChangeDetectorRef,\r\n private renderer: Renderer2,\r\n public dialog: MatDialog,\r\n protected sessionService:SessionService,\r\n private recFileService:RecordingService,\r\n private uploader: SpeechRecorderUploader,\r\n @Inject(SPEECHRECORDER_CONFIG) public config?: SpeechRecorderConfig) {\r\n super(dialog,sessionService);\r\n this.status = Status.IDLE;\r\n this.audio = document.getElementById('audio');\r\n if (this.config && this.config.enableUploadRecordings !== undefined) {\r\n this.enableUploadRecordings = this.config.enableUploadRecordings;\r\n }\r\n if (this.config && this.config.enableDownloadRecordings !== undefined) {\r\n this.enableDownloadRecordings = this.config.enableDownloadRecordings;\r\n }\r\n this.init();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.streamLevelMeasure.levelListener = this.liveLevelDisplay;\r\n this.streamLevelMeasure.peakLevelListener=(peakLvlInDb)=>{\r\n this.peakLevelInDb=peakLvlInDb;\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n }\r\n ngOnDestroy() {\r\n this.destroyed=true;\r\n // TODO stop capture /playback\r\n }\r\n\r\n private init() {\r\n this.sectIdx = 0;\r\n this.groupIdxInSection = 0;\r\n this.promptItemIdxInGroup = 0;\r\n this.autorecording = false;\r\n this.transportActions.startAction.disabled = true;\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n this.playStartAction.disabled = true;\r\n let context:AudioContext|null=null;\r\n try {\r\n context = AudioContextProvider.audioContextInstance()\r\n } catch (err) {\r\n this.status = Status.ERROR;\r\n let errMsg = 'Unknown error';\r\n if(err instanceof Error){\r\n errMsg=err.message;\r\n }\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n }\r\n if(context) {\r\n console.info(\"State of audio context: \" + context.state)\r\n }else{\r\n console.info(\"No audio context available!\");\r\n }\r\n if (!context || !navigator.mediaDevices) {\r\n this.status = Status.ERROR;\r\n let errMsg = 'Browser does not support Media streams!';\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n } else {\r\n this.ac = new AudioCapture(context);\r\n if (this.ac) {\r\n this.transportActions.startAction.onAction = () => this.startItem();\r\n this.ac.listener = this;\r\n this.ac.audioOutStream = new SequenceAudioFloat32ChunkerOutStream(this.streamLevelMeasure, LEVEL_BAR_INTERVALL_SECONDS);\r\n // Don't list the devices here. If we do not have audio permissions we only get anonymized devices without labels.\r\n //this.ac.listDevices();\r\n } else {\r\n this.transportActions.startAction.disabled = true;\r\n let errMsg = 'Browser does not support Media/Audio API!';\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n }\r\n this.transportActions.stopAction.onAction = () => this.stopItem();\r\n this.transportActions.nextAction.onAction = () => this.stopItem();\r\n this.transportActions.pauseAction.onAction = () => this.pauseItem();\r\n this.transportActions.fwdAction.onAction = () => this.nextItem();\r\n this.transportActions.fwdNextAction.onAction = () => this.nextUnrecordedItem();\r\n this.transportActions.bwdAction.onAction = () => this.prevItem();\r\n this.playStartAction.onAction = () => this.controlAudioPlayer.start();\r\n\r\n }\r\n\r\n this.startStopSignalState = StartStopSignalState.OFF;\r\n\r\n}\r\n\r\n @HostListener('window:keypress', ['$event'])\r\n onKeyPress(ke: KeyboardEvent) {\r\n if (ke.key == ' ') {\r\n this.transportActions.startAction.perform();\r\n this.transportActions.nextAction.perform();\r\n }\r\n }\r\n\r\n @HostListener('window:keydown', ['$event'])\r\n onKeyDown(ke: KeyboardEvent) {\r\n if (ke.key == ' ') {\r\n this.transportActions.stopAction.perform();\r\n }\r\n if (ke.key == 'p') {\r\n this.transportActions.pauseAction.perform();\r\n }\r\n\r\n if (ke.key == 'Escape') {\r\n if(!this.audioSignalCollapsed){\r\n this.audioSignalCollapsed=true;\r\n }\r\n this.transportActions.stopAction.perform();\r\n this.transportActions.pauseAction.perform();\r\n }\r\n\r\n if (ke.key == 'MediaPlayPause') {\r\n this.playStartAction.perform();\r\n }\r\n if (ke.key === 'ArrowRight') {\r\n this.transportActions.fwdAction.perform();\r\n }\r\n if (ke.key === 'ArrowLeft') {\r\n this.transportActions.bwdAction.perform();\r\n }\r\n }\r\n\r\n progressPercentValue():number {\r\n let v=100;\r\n if(this.items) {\r\n v=this.promptIndex * 100 / (this.items.length - 1);\r\n }\r\n return v;\r\n }\r\n isTestSession():boolean {\r\n return ((this._session!=null) && (this._session.type === 'TEST' || this._session.type==='TEST_DEF_A' || this._session.type === 'SINUS_TEST'));\r\n }\r\n\r\n isDefaultAudioTestSession():boolean {\r\n return ((this._session!=null) && (this._session.type==='TEST_DEF_A'));\r\n }\r\n\r\n isDefaultAudioTestSessionOverwriteingProjectRequirements():boolean {\r\n return ((this._session!=null) && (this._session.type==='TEST_DEF_A') && (this.audioDevices!=null) && this.audioDevices.length>0)\r\n }\r\n\r\n\r\n set controlAudioPlayer(controlAudioPlayer: AudioPlayer) {\r\n if (this._controlAudioPlayer) {\r\n //this._controlAudioPlayer.listener=null;\r\n }\r\n this._controlAudioPlayer = controlAudioPlayer;\r\n if (this._controlAudioPlayer) {\r\n this._controlAudioPlayer.listener = this;\r\n }\r\n }\r\n\r\n get controlAudioPlayer(): AudioPlayer {\r\n return this._controlAudioPlayer;\r\n }\r\n\r\n set script(script: any) {\r\n this._script = script;\r\n this.loadScript();\r\n }\r\n\r\n update(e: AudioPlayerEvent) {\r\n if (e.type == EventType.STARTED) {\r\n this.playStartAction.disabled = true;\r\n this.updateTimerId = window.setInterval(() => {\r\n //this.audioSignal.playFramePosition = this.ap.playPositionFrames;\r\n }, 50);\r\n } else if (e.type == EventType.STOPPED || e.type == EventType.ENDED) {\r\n window.clearInterval(this.updateTimerId);\r\n // this.audioSignal.playFramePosition = this.ap.playPositionFrames;\r\n this.playStartAction.disabled = (!(this.displayRecFile));\r\n\r\n }\r\n }\r\n\r\n get promptIndex():number{\r\n return this._promptIndex;\r\n }\r\n\r\n set promptIndex(promptIndex:number){\r\n if(promptIndex<0 || promptIndex>=this.promptItemCount){\r\n throw new Error(\"Prompt index out of range\")\r\n }\r\n let i = 0;\r\n let sections=this._script.sections;\r\n let found=false;\r\n for (let si = 0; si < sections.length && !found; si++) {\r\n let section = sections[si];\r\n let gs = section._shuffledGroups;\r\n for (let gi = 0; gi < gs.length; gi++) {\r\n let pis=gs[gi]._shuffledPromptItems;\r\n\r\n let pisSize = pis.length;\r\n if (promptIndex < i + pisSize) {\r\n this.sectIdx = si;\r\n this.groupIdxInSection=gi;\r\n this.promptItemIdxInGroup = promptIndex - i;\r\n found=true;\r\n break;\r\n } else {\r\n i += pisSize;\r\n }\r\n }\r\n }\r\n if(found){\r\n this._promptIndex=promptIndex;\r\n }else{\r\n throw new Error(\"Internal error: Prompt index not found\")\r\n }\r\n this.applyItem();\r\n }\r\n\r\n itemSelect(itemIdx: number) {\r\n if (this.status === Status.IDLE) {\r\n this.promptIndex=itemIdx;\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n startItem() {\r\n this.transportActions.startAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n if(this.readonly){\r\n return\r\n }\r\n this.transportActions.fwdAction.disabled = true\r\n this.transportActions.fwdNextAction.disabled = true\r\n this.transportActions.bwdAction.disabled = true\r\n this.displayRecFile = null;\r\n this.displayRecFileVersion = 0;\r\n this.displayAudioClip = null;\r\n this.showRecording();\r\n if (this.section.mode === 'AUTORECORDING') {\r\n this.autorecording = true;\r\n }\r\n\r\n if(this.ac!=null) {\r\n if (!this.ac.opened) {\r\n if (this._selectedDeviceId) {\r\n console.log(\"Open session with audio device Id: \\'\" + this._selectedDeviceId + \"\\' for \" + this._channelCount + \" channels\");\r\n } else {\r\n console.log(\"Open session with default audio device for \" + this._channelCount + \" channels\");\r\n }\r\n this.ac.open(this._channelCount, this._selectedDeviceId,this._autoGainControlConfigs);\r\n } else {\r\n this.ac.start();\r\n }\r\n }\r\n }\r\n\r\n\r\n private loadScript() {\r\n this.promptItemCount = 0;\r\n\r\n this.items = new Array<Item>();\r\n let ln = 0;\r\n\r\n //TODO randomize not supported\r\n for (let si = 0; si < this._script.sections.length; si++) {\r\n let section = this._script.sections[si];\r\n let gs = section._shuffledGroups;\r\n for(let gi=0;gi<gs.length;gi++) {\r\n\r\n let pis = gs[gi]._shuffledPromptItems;\r\n\r\n let pisLen = pis.length;\r\n this.promptItemCount += pisLen;\r\n for (let piSectIdx = 0; piSectIdx < pisLen; piSectIdx++) {\r\n let pi = pis[piSectIdx];\r\n let promptAsStr = PromptitemUtil.toPlainTextString(pi);\r\n\r\n let it = new Item(promptAsStr, section.training,(!pi.type || pi.type==='recording'));\r\n this.items.push(it);\r\n ln++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n promptIndexByItemcode(itemcode:string):number|null{\r\n let pix = 0;\r\n\r\n for (let si = 0; si < this._script.sections.length; si++) {\r\n let section = this._script.sections[si];\r\n let gs = section._shuffledGroups;\r\n for(let gi=0;gi<gs.length;gi++) {\r\n let pis=gs[gi]._shuffledPromptItems;\r\n let pisLen = pis.length;\r\n for (let piSectIdx = 0; piSectIdx < pisLen; piSectIdx++) {\r\n let pi = pis[piSectIdx];\r\n let ic=pi.itemcode;\r\n if(ic === itemcode){\r\n return pix;\r\n }\r\n pix++;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n clearPrompt() {\r\n //this.prompting.promptContainer.prompter.promptText='';\r\n //this.mediaitem = null;\r\n this.showPrompt = false;\r\n this.changeDetectorRef.detectChanges()\r\n }\r\n\r\n applyPrompt() {\r\n //this.prompting.promptContainer.prompter.promptText=this.promptUnit.mediaitems[0].text;\r\n //this.promptText = this.promptUnit.mediaitems[0].text;\r\n //this.mediaitem=this.promptUnit.mediaitems[0];\r\n this.showPrompt = true;\r\n this.changeDetectorRef.detectChanges()\r\n }\r\n\r\n downloadRecording() {\r\n if (this.displayRecFile) {\r\n let ab: AudioBuffer|null = this.displayRecFile.audioBuffer;\r\n let ww = new WavWriter();\r\n if(ab) {\r\n let wavFile = ww.writeAsync(ab, (wavFile) => {\r\n let blob = new Blob([wavFile], {type: 'audio/wav'});\r\n let rfUrl = URL.createObjectURL(blob);\r\n\r\n let dataDnlLnk = this.renderer.createElement('a');\r\n //dataDnlLnk.name = 'Recording';\r\n dataDnlLnk.href = rfUrl;\r\n\r\n this.renderer.appendChild(document.body, dataDnlLnk);\r\n\r\n // download property not yet in TS def\r\n if (this.displayRecFile) {\r\n let fn = this.displayRecFile.filenameString();\r\n fn += '_' + this.displayRecFileVersion;\r\n fn += '.wav';\r\n dataDnlLnk.download = fn;\r\n dataDnlLnk.click();\r\n }\r\n this.renderer.removeChild(document.body, dataDnlLnk);\r\n });\r\n }\r\n }\r\n }\r\n\r\n set displayRecFile(displayRecFile: SprRecordingFile | null) {\r\n this._displayRecFile = displayRecFile;\r\n if (this._displayRecFile) {\r\n let ab: AudioBuffer|null = this._displayRecFile.audioBuffer;\r\n if(ab) {\r\n this.displayAudioClip = new AudioClip(ab);\r\n this.controlAudioPlayer.audioClip = this.displayAudioClip;\r\n }else {\r\n // clear for now ...\r\n this.displayAudioClip = null;\r\n this.controlAudioPlayer.audioClip = null;\r\n if (this._controlAudioPlayer && this._session) {\r\n //... and try to fetch from server\r\n this.audioFetchSubscription = this.recFileService.fetchAndApplySprRecordingFile(this._controlAudioPlayer.context, this._session.project, this._displayRecFile).subscribe((rf) => {\r\n let fab = null;\r\n if (rf && this._displayRecFile) {\r\n fab = this._displayRecFile.audioBuffer;\r\n } else {\r\n this.statusMsg = 'Recording file could not be loaded.'\r\n this.statusAlertType = 'error'\r\n }\r\n if (fab){\r\n this.displayAudioClip = new AudioClip(fab);\r\n }\r\n this.controlAudioPlayer.audioClip =this.displayAudioClip\r\n this.showRecording();\r\n\r\n }, err => {\r\n console.error(\"Could not load recording file from server: \" + err)\r\n this.statusMsg = 'Recording file could not be loaded: ' + err\r\n this.statusAlertType = 'error'\r\n })\r\n }else{\r\n this.statusMsg = 'Recording file could not be decoded. Audio context unavailable.'\r\n this.statusAlertType = 'error'\r\n }\r\n }\r\n\r\n } else {\r\n this.displayAudioClip = null;\r\n this.controlAudioPlayer.audioClip = null;\r\n }\r\n }\r\n\r\n get displayRecFile(): SprRecordingFile | null {\r\n return this._displayRecFile;\r\n }\r\n\r\n showRecording() {\r\n this.controlAudioPlayer.stop();\r\n\r\n if (this.displayAudioClip) {\r\n\r\n this.levelMeasure.calcBufferLevelInfos(this.displayAudioClip.buffer, LEVEL_BAR_INTERVALL_SECONDS).then((levelInfos) => {\r\n this.displayLevelInfos = levelInfos;\r\n this.changeDetectorRef.detectChanges();\r\n });\r\n this.playStartAction.disabled = false;\r\n\r\n } else {\r\n\r\n // TODO\r\n // Setting to null does not trigger a change if it was null before (happens after nextitem() in AUTOPROGRESS mode)\r\n // The level bar display does not clear, it shows the last captured stream\r\n this.displayLevelInfos = null;\r\n\r\n this.playStartAction.disabled = true;\r\n\r\n // Collapse audio signal display if open\r\n if (!this.audioSignalCollapsed) {\r\n this.audioSignalCollapsed = true;\r\n }\r\n }\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n\r\n isRecordingItem():boolean{\r\n return(this.promptItem!=null && this.promptItem.type!=='nonrecording')\r\n }\r\n\r\n updateStartActionDisableState(){\r\n this.transportActions.startAction.disabled=!(this.ac && this.isRecordingItem());\r\n }\r\n\r\n applyItem(temporary=false) {\r\n\r\n this.section = this._script.sections[this.sectIdx]\r\n this.group = this.section._shuffledGroups[this.groupIdxInSection];\r\n this.promptItem = this.group._shuffledPromptItems[this.promptItemIdxInGroup];\r\n\r\n //this.selectedItemIdx = this.promptIndex;\r\n\r\n if(this.audioFetchSubscription){\r\n this.audioFetchSubscription.unsubscribe()\r\n }\r\n\r\n this.clearPrompt();\r\n\r\n let isNonrecording=(this.promptItem.type==='nonrecording')\r\n\r\n if (isNonrecording || !this.section.promptphase || this.section.promptphase === 'IDLE') {\r\n this.applyPrompt();\r\n }\r\n\r\n if(isNonrecording){\r\n this.startStopSignalState = StartStopSignalState.OFF;\r\n }else {\r\n if (this.items) {\r\n let it = this.items[this.promptIndex];\r\n if (!it.recs) {\r\n it.recs = new Array<SprRecordingFile>();\r\n }\r\n\r\n let recentRecFile: SprRecordingFile | null = null;\r\n let availRecfiles: number = it.recs.length;\r\n if (availRecfiles > 0) {\r\n let rfVers: number = availRecfiles - 1;\r\n recentRecFile = it.recs[rfVers];\r\n this.displayRecFile = recentRecFile;\r\n this.displayRecFileVersion = rfVers;\r\n\r\n } else {\r\n this.displayRecFile = null;\r\n this.displayRecFileVersion = 0;\r\n }\r\n }\r\n if (!temporary) {\r\n this.showRecording();\r\n }\r\n if(!this.readonly) {\r\n this.startStopSignalState = StartStopSignalState.IDLE;\r\n }\r\n }\r\n this.updateStartActionDisableState()\r\n this.updateNavigationActions()\r\n }\r\n\r\n\r\n start() {\r\n super.start();\r\n if(this.promptItemCount>0) {\r\n this.promptIndex = 0;\r\n }\r\n this.enableNavigation()\r\n }\r\n\r\n isRecording(): boolean {\r\n return (this.status === Status.PRE_RECORDING || this.status === Status.RECORDING);\r\n }\r\n\r\n isActive(): boolean{\r\n return (!(this.status === Status.BLOCKED || this.status=== Status.IDLE || this.status===Status.ERROR) || this.processingRecording || this.sessionService.uploadCount>0)\r\n }\r\n\r\n prevItem() {\r\n let newPrIdx=this._promptIndex;\r\n newPrIdx--;\r\n if(newPrIdx<0){\r\n newPrIdx=this.promptItemCount-1;\r\n }\r\n this.promptIndex=newPrIdx;\r\n //this.updateNavigationActions()\r\n }\r\n\r\n\r\n nextItem() {\r\n let newPrIdx=this._promptIndex;\r\n newPrIdx++;\r\n if(newPrIdx>=this.promptItemCount){\r\n newPrIdx=0;\r\n }\r\n this.promptIndex=newPrIdx;\r\n //this.updateNavigationActions();\r\n }\r\n\r\n private updateNavigationActions(){\r\n let fwdNxtActionDisabled=true;\r\n if(this.items){\r\n let currRecs=this.items[this._promptIndex].recs;\r\n fwdNxtActionDisabled= ! (currRecs!=null && currRecs.length>0);\r\n }\r\n this.transportActions.fwdNextAction.disabled = this.navigationDisabled || fwdNxtActionDisabled;\r\n this.transportActions.fwdAction.disabled = this.navigationDisabled;\r\n this.transportActions.bwdAction.disabled = this.navigationDisabled;\r\n }\r\n\r\n nextUnrecordedItem() {\r\n let newPrIdx = this._promptIndex;\r\n newPrIdx++;\r\n if (newPrIdx >= this.promptItemCount) {\r\n newPrIdx = 0;\r\n }\r\n if(this.items!=null) {\r\n let itRecs=this.items[newPrIdx].recs;\r\n while (itRecs!=null && (itRecs.length > 0) && newPrIdx < this.promptItemCount) {\r\n newPrIdx++;\r\n itRecs=this.items[newPrIdx].recs;\r\n }\r\n if (!itRecs || itRecs.length == 0) {\r\n this.promptIndex = newPrIdx;\r\n }\r\n }\r\n }\r\n\r\n enableStartUserGesture() {\r\n super.enableStartUserGesture();\r\n this.transportActions.startAction.disabled=!(this.ac && this.isRecordingItem());\r\n }\r\n\r\n enableNavigation(){\r\n this.navigationDisabled=false;\r\n this.updateNavigationActions();\r\n }\r\n\r\n opened() {\r\n if(this.ac) {\r\n this.ac.start();\r\n }\r\n }\r\n\r\n started() {\r\n this.status = Status.PRE_RECORDING;\r\n this.transportActions.startAction.disabled = true;\r\n this.startStopSignalState = StartStopSignalState.PRERECORDING;\r\n if(this._session) {\r\n if (this._session.status === \"LOADED\") {\r\n let body: any = {};\r\n if (this.section.training) {\r\n this._session.status = \"STARTED_TRAINING\"\r\n body.status = this._session.status;\r\n if (!this._session.startedTrainingDate) {\r\n this._session.startedTrainingDate = new Date();\r\n body.startedTrainingDate = this._session.startedTrainingDate;\r\n }\r\n } else {\r\n this._session.status = \"STARTED\"\r\n body.status = this._session.status;\r\n if (!this._session.startedDate) {\r\n this._session.startedDate = new Date();\r\n body.startedDate = this._session.startedDate;\r\n }\r\n }\r\n this.sessionService.patchSessionObserver(this._session, body).subscribe()\r\n }\r\n }\r\n if (this.section.promptphase === 'PRERECORDING' || this.section.promptphase === 'PRERECORDINGONLY') {\r\n this.applyPrompt();\r\n }\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Recording...';\r\n\r\n let preDelay = DEFAULT_PRE_REC_DELAY;\r\n if (this.promptItem.prerecording) {\r\n preDelay = this.promptItem.prerecording;\r\n }\r\n\r\n let postDelay=DEFAULT_POST_REC_DELAY;\r\n if(this.promptItem.postrecording){\r\n postDelay=this.promptItem.postrecording;\r\n }\r\n\r\n let maxRecordingTimeMs = MAX_RECORDING_TIME_MS;\r\n if (this.promptItem.recduration!==null && this.promptItem.recduration!==undefined) {\r\n maxRecordingTimeMs = preDelay+this.promptItem.recduration+postDelay;\r\n }\r\n this.maxRecTimerId = window.setTimeout(() => {\r\n this.stopRecordingMaxRec()\r\n }, maxRecordingTimeMs);\r\n this.maxRecTimerRunning = true;\r\n\r\n\r\n\r\n this.preRecTimerId = window.setTimeout(() => {\r\n\r\n this.preRecTimerRunning = false;\r\n this.status = Status.RECORDING;\r\n this.startStopSignalState = StartStopSignalState.RECORDING;\r\n if (this.section.mode === 'AUTORECORDING') {\r\n this.transportActions.nextAction.disabled = false;\r\n this.transportActions.pauseAction.disabled = false;\r\n } else {\r\n this.transportActions.stopAction.disabled = false;\r\n }\r\n if (this.section.promptphase === 'RECORDING') {\r\n this.applyPrompt();\r\n }\r\n if (this.section.promptphase === 'PRERECORDINGONLY'){\r\n this.clearPrompt();\r\n }\r\n\r\n }, preDelay);\r\n this.preRecTimerRunning = true;\r\n }\r\n\r\n stopItem() {\r\n this.status = Status.POST_REC_STOP;\r\n this.startStopSignalState = StartStopSignalState.POSTRECORDING;\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n let postDelay = 500;\r\n if (this.promptItem.postrecording) {\r\n postDelay = this.promptItem.postrecording;\r\n }\r\n this.postRecTimerId = window.setTimeout(() => {\r\n this.postRecTimerRunning = false;\r\n this.status = Status.STOPPING_STOP;\r\n this.stopRecording();\r\n }, postDelay);\r\n this.postRecTimerRunning = true;\r\n }\r\n\r\n pauseItem() {\r\n this.status = Status.POST_REC_PAUSE;\r\n this.transportActions.pauseAction.disabled = true;\r\n this.startStopSignalState = StartStopSignalState.POSTRECORDING;\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n let postDelay = 500;\r\n if (this.promptItem.postrecording) {\r\n postDelay = this.promptItem.postrecording;\r\n }\r\n\r\n\r\n this.postRecTimerId = window.setTimeout(() => {\r\n this.postRecTimerRunning = false;\r\n this.status = Status.STOPPING_PAUSE;\r\n this.stopRecording();\r\n }, postDelay);\r\n this.postRecTimerRunning = true;\r\n }\r\n\r\n stopRecording() {\r\n if (this.maxRecTimerRunning) {\r\n if(this.maxRecTimerId) {\r\n window.clearTimeout(this.maxRecTimerId);\r\n }\r\n this.maxRecTimerRunning = false;\r\n }\r\n if(this.ac) {\r\n this.ac.stop();\r\n }\r\n }\r\n\r\n stopRecordingMaxRec(){\r\n if(this.postRecTimerRunning){\r\n if(this.postRecTimerId) {\r\n window.clearTimeout(this.postRecTimerId);\r\n }\r\n this.postRecTimerRunning=false;\r\n }\r\n this.maxRecTimerRunning = false;\r\n this.status = Status.STOPPING_STOP;\r\n if(this.ac) {\r\n this.ac.stop();\r\n }\r\n }\r\n\r\n addRecordingFileByDescriptor(rfd:RecordingFileDescriptorImpl){\r\n if(rfd.recording && rfd.recording.itemcode) {\r\n let prIdx = this.promptIndexByItemcode(rfd.recording.itemcode);\r\n if (this.items!=null && prIdx !== null) {\r\n let it = this.items[prIdx];\r\n if (it && this._session) {\r\n if (!it.recs) {\r\n it.recs = new Array<SprRecordingFile>();\r\n }\r\n let rf = new SprRecordingFile(this._session.sessionId, rfd.recording.itemcode, rfd.version, null);\r\n it.recs[rfd.version] = rf;\r\n\r\n } else {\r\n //console.debug(\"WARN: No recording item with code: \\\"\" +rfd.recording.itemcode+ \"\\\" found.\");\r\n }\r\n } else {\r\n //console.debug(\"WARN: No recording item with code: \\\"\" +rfd.recording.itemcode+ \"\\\" found.\");\r\n }\r\n }\r\n }\r\n\r\n addRecordingFileByPromptIndex(promptIndex:number, rf:SprRecordingFile){\r\n\r\n }\r\n\r\n\r\n stopped() {\r\n this.updateStartActionDisableState()\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Recorded.';\r\n this.startStopSignalState = StartStopSignalState.IDLE;\r\n\r\n let ad:AudioBuffer|null = null;\r\n if(this.ac!=null){\r\n ad=this.ac.audioBuffer();\r\n }\r\n let ic = this.promptItem.itemcode;\r\n let rf=null;\r\n if (this._session && ic) {\r\n let sessId: string | number = this._session.sessionId;\r\n let cpIdx = this.promptIndex;\r\n if (this.items) {\r\n let it=this.items[cpIdx];\r\n if (!it.recs) {\r\n it.recs = new Array<SprRecordingFile>();\r\n }\r\n rf = new SprRecordingFile(sessId, ic, it.recs.length, ad);\r\n it.recs.push(rf);\r\n }\r\n if (this.enableUploadRecordings) {\r\n // TODO use SpeechRecorderconfig resp. RecfileService\r\n // convert asynchronously to 16-bit integer PCM\r\n // TODO could we avoid conversion to save CPU resources and transfer float PCM directly?\r\n // TODO duplicate conversion for manual download\r\n //console.log(\"Build wav writer...\");\r\n this.processingRecording=true\r\n if(ad && rf) {\r\n let ww = new WavWriter();\r\n //new REST API URL\r\n let apiEndPoint = '';\r\n if (this.config && this.config.apiEndPoint) {\r\n apiEndPoint = this.config.apiEndPoint;\r\n }\r\n if (apiEndPoint !== '') {\r\n apiEndPoint = apiEndPoint + '/'\r\n }\r\n let sessionsUrl = apiEndPoint + SessionService.SESSION_API_CTX;\r\n let recUrl: string = sessionsUrl + '/' + rf.session + '/' + RECFILE_API_CTX + '/' + rf.itemCode;\r\n ww.writeAsync(ad, (wavFile) => {\r\n this.postRecording(wavFile, recUrl);\r\n this.processingRecording = false\r\n });\r\n }\r\n }\r\n }\r\n\r\n // check complete session\r\n let complete = true;\r\n if(this.items) {\r\n // search backwards, to gain faster detection of incomplete state\r\n for (let ri = this.items.length - 1; ri >= 0; ri--) {\r\n let it = this.items[ri];\r\n if (it.recording && !it.training && (!it.recs || it.recs.length == 0)) {\r\n complete = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let autoStart = (this.status === Status.STOPPING_STOP);\r\n this.status = Status.IDLE;\r\n let startNext=false;\r\n if (complete) {\r\n if(this._session!=null) {\r\n if (!this._session.sealed && this._session.status !== \"COMPLETED\") {\r\n let body: any = {}\r\n this._session.status = \"COMPLETED\";\r\n body.status = this._session.status;\r\n if (!this._session.completedDate) {\r\n this._session.completedDate = new Date();\r\n body.completedDate = this._session.completedDate;\r\n }\r\n this.sessionService.patchSessionObserver(this._session, body).subscribe()\r\n }\r\n }\r\n this.statusMsg = 'Session complete!';\r\n let dialogRef = this.dialog.open(SessionFinishedDialog, {});\r\n\r\n // enable navigation\r\n this.transportActions.fwdAction.disabled = false\r\n this.transportActions.bwdAction.disabled = false\r\n } else {\r\n\r\n if (this.section.mode === 'AUTOPROGRESS' || this.section.mode === 'AUTORECORDING') {\r\n this.nextItem();\r\n }\r\n\r\n if (this.section.mode === 'AUTORECORDING' && this.autorecording && autoStart) {\r\n startNext=true;\r\n } else {\r\n this.navigationDisabled = false;\r\n this.updateNavigationActions();\r\n }\r\n }\r\n // apply recorded item\r\n this.applyItem(startNext);\r\n if(startNext){\r\n this.startItem();\r\n }\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n postRecording(wavFile: Uint8Array, recUrl: string) {\r\n let wavBlob = new Blob([wavFile], {type: 'audio/wav'});\r\n let ul = new Upload(wavBlob, recUrl);\r\n this.uploader.queueUpload(ul);\r\n }\r\n\r\n stop() {\r\n if(this.ac!=null){\r\n this.ac.close();\r\n }\r\n }\r\n\r\n private updateControlPlaybackPosition() {\r\n if (this._controlAudioPlayer.playPositionFrames) {\r\n this.prompting.audioDisplay.playFramePosition = this._controlAudioPlayer.playPositionFrames;\r\n this.liveLevelDisplay.playFramePosition = this._controlAudioPlayer.playPositionFrames;\r\n }\r\n }\r\n\r\n audioPlayerUpdate(e: AudioPlayerEvent) {\r\n if (EventType.READY === e.type) {\r\n\r\n } else if (EventType.STARTED === e.type) {\r\n //this.status = 'Playback...';\r\n this.updateTimerId = window.setInterval(() => this.updateControlPlaybackPosition(), 50);\r\n\r\n } else if (EventType.ENDED === e.type) {\r\n //.status='Ready.';\r\n window.clearInterval(this.updateTimerId);\r\n\r\n }\r\n\r\n if(!this.destroyed) {\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n }\r\n}\r\n\r\n","/**\r\n * Created by klausj on 17.06.2017.\r\n */\r\nimport {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient} from \"@angular/common/http\";\r\nimport {ApiType, SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\nimport {Script} from \"./script\";\r\nimport {UUID} from \"../../utils/utils\";\r\nimport {Observable} from \"rxjs\";\r\n\r\n\r\nexport const SCRIPT_API_CTX='script'\r\n\r\n@Injectable()\r\nexport class ScriptService {\r\n private scriptCtxUrl:string;\r\n private withCredentials:boolean=false;\r\n\r\n constructor(private http:HttpClient,@Inject(SPEECHRECORDER_CONFIG) private config?:SpeechRecorderConfig) {\r\n\r\n let apiEndPoint = ''\r\n\r\n if(config && config.apiEndPoint) {\r\n apiEndPoint=config.apiEndPoint;\r\n }\r\n if(apiEndPoint !== ''){\r\n apiEndPoint=apiEndPoint+'/'\r\n }\r\n if(config!=null && config.withCredentials!=null){\r\n this.withCredentials=config.withCredentials;\r\n }\r\n this.scriptCtxUrl = apiEndPoint + SCRIPT_API_CTX;\r\n }\r\n\r\n scriptObservable(id:string | number):Observable<Script>{\r\n let encScriptId=encodeURIComponent(id);\r\n let scriptUrl = this.scriptCtxUrl + '/' + encScriptId;\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n scriptUrl = scriptUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n return this.http.get<Script>(scriptUrl,{withCredentials: this.withCredentials })\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n","import {Component, ViewChild, ChangeDetectorRef, AfterViewInit, OnInit} from '@angular/core'\r\nimport {\r\n AudioPlayerListener, AudioPlayerEvent, EventType as PlaybackEventType,\r\n AudioPlayer\r\n} from './audio/playback/player';\r\nimport {Group, Order, PromptItem, Script} from './speechrecorder/script/script'\r\nimport { SessionManager,Status as SessionManagerStatus} from './speechrecorder/session/sessionmanager';\r\nimport { UploaderStatusChangeEvent, UploaderStatus } from './net/uploader';\r\nimport {ActivatedRoute, Params, Router} from \"@angular/router\";\r\nimport {SessionService} from \"./speechrecorder/session/session.service\";\r\nimport {ScriptService} from \"./speechrecorder/script/script.service\";\r\nimport {SpeechRecorderUploader} from \"./speechrecorder/spruploader\";\r\nimport {Session} from \"./speechrecorder/session/session\";\r\nimport {Project, ProjectUtil} from \"./speechrecorder/project/project\";\r\nimport {ProjectService} from \"./speechrecorder/project/project.service\";\r\nimport {AudioContextProvider} from \"./audio/context\";\r\nimport {RecordingService} from \"./speechrecorder/recordings/recordings.service\";\r\nimport {RecordingFileDescriptorImpl} from \"./speechrecorder/recording\";\r\nimport {Arrays} from \"./utils/utils\";\r\n\r\nexport enum Mode {SINGLE_SESSION,DEMO}\r\n\r\n@Component({\r\n\r\n selector: 'app-speechrecorder',\r\n providers: [SessionService],\r\n template: `\r\n <app-sprrecordingsession [projectName]=\"project?.name\" [dataSaved]=\"dataSaved\"></app-sprrecordingsession>\r\n `,\r\n styles: [`:host{\r\n flex: 2;\r\n display: flex;\r\n flex-direction: column;\r\n min-height:0;\r\n\r\n }`]\r\n\r\n})\r\nexport class SpeechrecorderngComponent implements OnInit,AfterViewInit,AudioPlayerListener {\r\n\r\n\t mode!:Mode;\r\n\t\tcontrolAudioPlayer!:AudioPlayer;\r\n\t\taudio:any;\r\n\r\n\t_project:Project|null=null;\r\n sessionId!: string;\r\n session!:Session;\r\n\r\n script!:Script;\r\n dataSaved: boolean = true;\r\n @ViewChild(SessionManager, { static: true }) sm!:SessionManager;\r\n\r\n\t\tconstructor(private route: ActivatedRoute,\r\n private router: Router,\r\n private changeDetectorRef: ChangeDetectorRef,\r\n private sessionsService:SessionService,\r\n private projectService:ProjectService,\r\n private scriptService:ScriptService,\r\n private recFilesService:RecordingService,\r\n private uploader:SpeechRecorderUploader) {\r\n\t\t}\r\n\r\n ngOnInit() {\r\n\t\t try {\r\n let audioContext = AudioContextProvider.audioContextInstance();\r\n if(audioContext) {\r\n this.controlAudioPlayer = new AudioPlayer(audioContext, this);\r\n }\r\n this.sm.controlAudioPlayer=this.controlAudioPlayer;\r\n this.sm.statusAlertType='info';\r\n this.sm.statusMsg = 'Player initialized.';\r\n }catch(err){\r\n let errMsg='Unknown error';\r\n if(err instanceof Error){\r\n errMsg=err.message;\r\n }\r\n this.sm.statusMsg=errMsg;\r\n this.sm.statusAlertType='error';\r\n console.error(errMsg)\r\n }\r\n }\r\n ngAfterViewInit(){\r\n\r\n\t\t if(this.sm.status!== SessionManagerStatus.ERROR) {\r\n let initSuccess = this.init();\r\n if (initSuccess) {\r\n this.route.queryParams.subscribe((params: Params) => {\r\n if (params['sessionId']) {\r\n this.fetchSession(params['sessionId']);\r\n }\r\n });\r\n\r\n this.route.params.subscribe((params: Params) => {\r\n let routeParamsId = params['id'];\r\n if (routeParamsId) {\r\n this.fetchSession(routeParamsId);\r\n }\r\n })\r\n }\r\n }\r\n }\r\n\r\n fetchSession(sessionId:string){\r\n\r\n\r\n\t\t //Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'statusMsg: Player initialized.'. Current value: 'statusMsg: Fetching session info...'.\r\n // params.subscribe seems not to be asynchronous\r\n\r\n // this.sm.statusAlertType='info';\r\n // this.sm.statusMsg = 'Fetching session info...';\r\n // this.sm.statusWaiting=true;\r\n let sessObs= this.sessionsService.sessionObserver(sessionId);\r\n\r\n if(sessObs) {\r\n sessObs.subscribe(sess => {\r\n this.setSession(sess);\r\n this.sm.statusAlertType='info';\r\n this.sm.statusMsg = 'Received session info.';\r\n this.sm.statusWaiting=false;\r\n if (sess.project) {\r\n //console.debug(\"Session associated project: \"+sess.project)\r\n this.projectService.projectObservable(sess.project).subscribe(project=>{\r\n this.project=project;\r\n this.fetchScript(sess);\r\n },reason =>{\r\n this.sm.statusMsg=reason;\r\n this.sm.statusAlertType='error';\r\n this.sm.statusWaiting=false;\r\n console.error(\"Error fetching project config: \"+reason)\r\n });\r\n\r\n } else {\r\n console.info(\"Session has no associated project. Using default configuration.\")\r\n this.fetchScript(sess);\r\n }\r\n },\r\n (reason) => {\r\n this.sm.statusMsg = reason;\r\n this.sm.statusAlertType = 'error';\r\n this.sm.statusWaiting=false;\r\n console.error(\"Error fetching session \" + reason)\r\n });\r\n }\r\n }\r\n\r\n\r\n fetchScript(sess:Session){\r\n if(sess.script){\r\n this.sm.statusAlertType='info';\r\n this.sm.statusMsg = 'Fetching recording script...';\r\n this.sm.statusWaiting=true;\r\n this.scriptService.scriptObservable(sess.script).subscribe(script=>{\r\n this.sm.statusAlertType='info';\r\n this.sm.statusMsg = 'Received recording script.';\r\n this.sm.statusWaiting=false;\r\n this.setScript(script)\r\n this.sm.session=sess;\r\n this.fetchRecordings(sess,this.script)\r\n },reason =>{\r\n let errMsg=\"Error fetching recording script: \"+reason\r\n console.error(errMsg)\r\n this.sm.statusMsg=errMsg;\r\n this.sm.statusAlertType='error';\r\n this.sm.statusWaiting=false;\r\n });\r\n }else{\r\n let errMsg=\"No recording script is defined for this session with ID \"+sess.sessionId;\r\n console.error(this.sm.statusMsg)\r\n this.sm.statusMsg=errMsg;\r\n this.sm.statusAlertType='error';\r\n\r\n }\r\n }\r\n\r\n\r\n fetchRecordings(sess:Session,script:Script){\r\n this.sm.statusAlertType='info';\r\n this.sm.statusMsg = 'Fetching infos of recordings...';\r\n this.sm.statusWaiting=true;\r\n let prNm:string|null=null;\r\n if(this.project) {\r\n let rfsObs = this.recFilesService.recordingFileDescrList(this.project.name, sess.sessionId);\r\n rfsObs.subscribe((rfs: Array<RecordingFileDescriptorImpl>) => {\r\n this.sm.statusAlertType = 'info';\r\n this.sm.statusMsg = 'Received infos of recordings.';\r\n this.sm.statusWaiting = false;\r\n if (rfs) {\r\n if (rfs instanceof Array) {\r\n rfs.forEach((rf) => {\r\n //console.debug(\"Already recorded: \" + rf+ \" \"+rf.recording.itemcode);\r\n this.sm.addRecordingFileByDescriptor(rf);\r\n })\r\n } else {\r\n console.error('Expected type array for list of already recorded files ')\r\n }\r\n } else {\r\n //console.debug(\"Recording file list: \" + rfs);\r\n }\r\n }, () => {\r\n // we start the session anyway\r\n this.startSession()\r\n }, () => {\r\n this.startSession()\r\n })\r\n }else{\r\n // TODO\r\n }\r\n }\r\n\r\n\r\n private startSession(){\r\n this.sm.statusWaiting=false;\r\n\t\t this.sm.start();\r\n }\r\n\r\n\r\n setSession(session:any){\r\n\t\t if(session) {\r\n // console.debug(\"Session ID: \" + session.sessionId);\r\n }else{\r\n //console.debug(\"Session Undefined\");\r\n }\r\n }\r\n\r\n ready():boolean{\r\n\t\t return this.dataSaved && !this.sm.isActive()\r\n }\r\n\r\n\t\tinit():boolean {\r\n\r\n\t\t\tvar n = <any>navigator;\r\n\t\t\t//var getUserMediaFnct= n.getUserMedia || n.webkitGetUserMedia ||\r\n\t\t\t//\tn.mozGetUserMedia || n.msGetUserMedia;\r\n\t\t\tvar w = <any>window;\r\n\t\t\t// TODO test onyl !!\r\n\r\n // let debugFail=true;\r\n\t\t// \tAudioContext = w.AudioContext || w.webkitAudioContext;\r\n\t\t// \tif (typeof AudioContext !== 'function' || debugFail) {\r\n // this.sm.statusAlertType='error';\r\n\t\t// \t\tthis.sm.statusMsg = 'ERROR: Browser does not support Web Audio API!';\r\n\t\t// \t\treturn false;\r\n\t\t// \t} else {\r\n\t\t// \t\tvar context = new AudioContext();\r\n //\r\n\t\t// \t\tif (typeof navigator.mediaDevices.getUserMedia !== 'function') {\r\n // this.sm.statusAlertType='error';\r\n\t\t// \t\t\tthis.sm.statusMsg= 'ERROR: Browser does not support Media streams!';\r\n // return false;\r\n\t\t// \t\t} else {\r\n //\r\n\r\n //this.sm = new SessionManager(new SimpleTrafficLight(), this.uploader);\r\n\t\t\t\t\t//this.sm.init();\r\n\t\t\t\t\t//this.ap = new AudioPlayer(context,this);\r\n\t\t\t\t\t//this.sm.listener=this;\r\n\t\t\t//\t}\r\n\t\t//\t}\r\n this.uploader.listener = (ue) => {\r\n this.uploadUpdate(ue);\r\n }\r\n\r\n window.addEventListener('beforeunload', (e) => {\r\n console.debug(\"Before page unload event\");\r\n\r\n if (this.ready()) {\r\n return;\r\n } else {\r\n // all this attempts to customize the message do not work anymore (for security reasons)!!\r\n var message = \"Please do not leave the page, until all recordings are uploaded!\";\r\n alert(message);\r\n e = e || window.event;\r\n\r\n if (e) {\r\n e.returnValue = message;\r\n e.cancelBubble = true;\r\n if (e.stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n if (e.preventDefault) {\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n return message;\r\n }\r\n });\r\n\t\t\treturn true;\r\n }\r\n\r\n uploadUpdate(ue: UploaderStatusChangeEvent) {\r\n let upStatus = ue.status;\r\n this.dataSaved = (UploaderStatus.DONE === upStatus);\r\n let percentUpl = ue.percentDone();\r\n if (UploaderStatus.ERR === upStatus) {\r\n this.sm.uploadStatus = 'warn'\r\n } else {\r\n if (percentUpl < 50) {\r\n this.sm.uploadStatus = 'accent'\r\n } else {\r\n this.sm.uploadStatus = 'success'\r\n }\r\n this.sm.uploadProgress = percentUpl;\r\n }\r\n\r\n this.changeDetectorRef.detectChanges()\r\n }\r\n\r\n configure() {\r\n\r\n\r\n\r\n this.loadProjectCfg(() => {\r\n // display project name\r\n let prName: string = '[Unknown]';\r\n if (this.project && this.project.name) {\r\n prName = this.project.name;\r\n }\r\n //this.titleEl.innerText = prName;\r\n\r\n });\r\n\r\n }\r\n\r\n\r\n private randomize(script:Script){\r\n\t\t script.sections.forEach((s)=>{\r\n\t\t if('RANDOM'===s.order) {\r\n s._shuffledGroups = Arrays.shuffleArray<Group>(s.groups);\r\n }else{\r\n\t\t s._shuffledGroups=s.groups;\r\n }\r\n\t\t s._shuffledGroups.forEach((g)=>{\r\n\t\t if('RANDOM'===g.order){\r\n\t\t g._shuffledPromptItems=Arrays.shuffleArray<PromptItem>(g.promptItems);\r\n }else{\r\n\t\t g._shuffledPromptItems=g.promptItems;\r\n }\r\n });\r\n });\r\n }\r\n\r\n setScript(script:Script){\r\n this.script=script;\r\n this.randomize(this.script);\r\n this.sm.script = this.script;\r\n }\r\n\r\n\r\n set project(project: Project|null) {\r\n this._project = project;\r\n let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;\r\n\r\n if (project) {\r\n console.info(\"Project name: \" + project.name)\r\n this.sm.audioDevices = project.audioDevices;\r\n chCnt = ProjectUtil.audioChannelCount(project);\r\n console.info(\"Project requested recording channel count: \" + chCnt);\r\n this.sm.autoGainControlConfigs=project.autoGainControlConfigs;\r\n } else {\r\n console.error(\"Empty project configuration!\")\r\n }\r\n this.sm.channelCount = chCnt;\r\n\r\n }\r\n\r\n get project():Project|null{\r\n\t\t return this._project;\r\n }\r\n\r\n\r\n\r\n\r\n loadProjectCfg(callback: ()=> any){\r\n let projUrl: string | null = null;\r\n\r\n if (this.sessionId === null) {\r\n if (window.location.hostname === 'localhost' || this.mode === Mode.DEMO) {\r\n // debug or demo mode\r\n projUrl = 'test/Demo1.json?' + new Date().getTime();\r\n }\r\n } else {\r\n // load RESTful by sessionId\r\n projUrl = window.location.protocol + '//' + window.location.hostname + ':' + window.location.port + '/wikispeech/rest/projects/?sessionId=' + this.sessionId;\r\n\r\n }\r\n if(projUrl) {\r\n var pLoader = new XMLHttpRequest();\r\n pLoader.open(\"GET\", projUrl, true);\r\n pLoader.setRequestHeader('Accept', 'application/json');\r\n pLoader.responseType = \"json\";\r\n pLoader.onload = (e) => {\r\n\r\n this.project = pLoader.response.project;\r\n\r\n callback();\r\n }\r\n pLoader.onerror = (e) => {\r\n console.error(\"Error downloading project data ...\");\r\n }\r\n pLoader.send();\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n // loadScript(callback: ()=>any){\r\n // var scrLoader = new XMLHttpRequest();\r\n // let hn:string =window.location.hostname;\r\n // let pn:string =window.location.pathname;\r\n // let pr:string =window.location.protocol;\r\n // let po:string =window.location.port;\r\n //\r\n // let sessionId:string=this.session.sessionId;\r\n //\r\n // let scrUrl:string | null = null;\r\n //\r\n // if (hn === 'localhost' || this.mode===Mode.DEMO) {\r\n // // local debug mode\r\n // // FF caches\r\n // scrUrl = 'test/' + this.session.script.toString() + '.json?' + new Date().getTime();\r\n //\r\n // } else {\r\n // let scrPath:string = '/wikispeech/session/scripts/servlet';\r\n // let scrQu:string = 'sessionId=' + sessionId;\r\n // scrUrl = pr + '//' + hn + ':' + po + scrPath;\r\n // if (scrQu) {\r\n // scrUrl = scrUrl + '?' + scrQu;\r\n // }\r\n // }\r\n //\r\n // scrLoader.open(\"GET\",scrUrl , true);\r\n // scrLoader.setRequestHeader('Accept','application/json');\r\n // scrLoader.responseType = \"json\";\r\n // scrLoader.onload = (e) => {\r\n //\r\n // this.script = scrLoader.response;\r\n //\r\n //\r\n // this.sm.script = this.script;\r\n //\r\n // callback();\r\n // }\r\n // scrLoader.onerror = (e) => {\r\n // console.log(\"Error downloading recording script data ...\");\r\n // }\r\n // scrLoader.send();\r\n // }\r\n\r\n start(){\r\n\r\n //this.configure();\r\n\r\n }\r\n\r\n\t\taudioPlayerUpdate(e:AudioPlayerEvent){\r\n\t\t\tif(PlaybackEventType.STARTED===e.type){\r\n\t\t\t\t//this.startBtn.disabled=true;\r\n\t\t\t\t//this.stopBtn.disabled=true;\r\n this.sm.statusAlertType='info';\r\n\t\t\t\tthis.sm.statusMsg='Playback...';\r\n\r\n } else if (PlaybackEventType.ENDED === e.type) {\r\n\t\t\t\t//this.startBtn.disabled=false;\r\n\t\t\t\t//this.stopBtn.disabled=true;\r\n this.sm.statusAlertType='info';\r\n\t\t\t\tthis.sm.statusMsg='Ready.';\r\n\t\t\t}\r\n\t\t}\r\n\t\terror(){\r\n\t\t this.sm.statusAlertType='error';\r\n\t\t\tthis.sm.statusMsg='ERROR: Recording.';\r\n\t\t}\r\n\t}\r\n\r\n\r\n//\r\n//\r\n// function speechrecorderInit() {\r\n// \tvar spr = new ips.apps.speeechrecorder.SpeechRecorder();\r\n// \tspr.init();\r\n// spr.start();\r\n//\r\n//\r\n// }\r\n","import {Component} from \"@angular/core\";\n\n@Component({\n\n selector: 'scroll-pane-horizontal',\n template: '',\n styles: [\n `:host {\n width: 100%;\n background: darkgray;\n box-sizing: border-box;\n height: 100%;\n position: relative;\n overflow-x: scroll;\n overflow-y: auto;\n }`]\n\n})\nexport class ScrollPaneHorizontal{\n\n}\n","import {\r\n Component,\r\n ViewChild,\r\n ChangeDetectorRef,\r\n AfterViewInit, Input, AfterContentInit, OnInit, AfterContentChecked, AfterViewChecked, ElementRef,\r\n} from '@angular/core'\r\n\r\nimport {AudioClip, Selection} from './persistor'\r\nimport {AudioPlayer, AudioPlayerListener, AudioPlayerEvent, EventType} from './playback/player'\r\nimport {ActivatedRoute, Params} from \"@angular/router\";\r\nimport {Action} from \"../action/action\";\r\nimport {AudioDisplayScrollPane} from \"./ui/audio_display_scroll_pane\";\r\nimport {AudioContextProvider} from \"./context\";\r\n\r\n@Component({\r\n\r\n selector: 'app-audiodisplayplayer',\r\n\r\n template: `\r\n\r\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\r\n\r\n <audio-display-control [audioClip]=\"audioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [playStopAction]=\"playStopAction\"\r\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\r\n [zoomInAction]=\"zoomInAction\"\r\n [zoomOutAction]=\"zoomOutAction\"\r\n [zoomSelectedAction]=\"zoomSelectedAction\"\r\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control><p>{{status}}\r\n `,\r\n styles: [\r\n `:host {\r\n display: flex;\r\n flex-direction: column;\r\n position: absolute;\r\n bottom: 0px;\r\n height: 100%;\r\n width: 100%;\r\n overflow: hidden;\r\n padding: 20px;\r\n z-index: 5;\r\n box-sizing: border-box;\r\n background-color: rgba(0, 0, 0, 0.75)\r\n }`]\r\n\r\n})\r\nexport class AudioDisplayPlayer implements AudioPlayerListener, OnInit,AfterContentInit,AfterContentChecked,AfterViewInit,AfterViewChecked {\r\n private _audioUrl: string|null=null;\r\n\r\n parentE: HTMLElement;\r\n\r\n @Input()\r\n playStartAction: Action<void>;\r\n @Input()\r\n playStopAction: Action<void>;\r\n @Input()\r\n playSelectionAction:Action<void>\r\n @Input()\r\n autoPlayOnSelectToggleAction!:Action<boolean>;\r\n\r\n zoomFitToPanelAction!:Action<void>;\r\n zoomSelectedAction!:Action<void>;\r\n zoomInAction!:Action<void>;\r\n zoomOutAction!:Action<void>;\r\n\r\n\r\n aCtx: AudioContext|null=null;\r\n private _audioClip:AudioClip|null=null;\r\n ap: AudioPlayer|undefined;\r\n status: string;\r\n\r\n currentLoader: XMLHttpRequest | null=null;\r\n\r\n audio: any;\r\n updateTimerId: any;\r\n\r\n\r\n @ViewChild(AudioDisplayScrollPane, { static: true })\r\n private audioDisplayScrollPane!: AudioDisplayScrollPane;\r\n\r\n constructor(protected route: ActivatedRoute, protected ref: ChangeDetectorRef,protected eRef:ElementRef) {\r\n //console.log(\"constructor: \"+this.ac);\r\n this.parentE=this.eRef.nativeElement;\r\n this.playStartAction = new Action(\"Start\");\r\n this.playSelectionAction=new Action(\"Play selected\");\r\n this.playStopAction = new Action(\"Stop\");\r\n this.status=\"Player created.\";\r\n\r\n }\r\n\r\n ngOnInit(){\r\n //console.log(\"OnInit: \"+this.ac);\r\n this.zoomSelectedAction=this.audioDisplayScrollPane.zoomSelectedAction\r\n this.zoomFitToPanelAction=this.audioDisplayScrollPane.zoomFitToPanelAction;\r\n this.zoomOutAction=this.audioDisplayScrollPane.zoomOutAction;\r\n this.zoomInAction=this.audioDisplayScrollPane.zoomInAction;\r\n try {\r\n this.aCtx = AudioContextProvider.audioContextInstance();\r\n if(this.aCtx) {\r\n this.ap = new AudioPlayer(this.aCtx, this);\r\n }\r\n }catch(err){\r\n if(err instanceof Error) {\r\n this.status = err.message;\r\n }\r\n }\r\n }\r\n\r\n ngAfterContentInit(){\r\n //console.log(\"AfterContentInit: \"+this.ac);\r\n }\r\n\r\n ngAfterContentChecked(){\r\n //console.log(\"AfterContentChecked: \"+this.ac);\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.aCtx && this.ap) {\r\n this.playStartAction.onAction = () => this.ap?.start();\r\n this.playSelectionAction.onAction = () => this.ap?.startSelected();\r\n this.playStopAction.onAction = () => this.ap?.stop();\r\n }\r\n this.layout();\r\n let heightListener=new MutationObserver((mrs:Array<MutationRecord>,mo:MutationObserver)=>{\r\n mrs.forEach((mr:MutationRecord)=>{\r\n if('attributes'===mr.type && ('class'===mr.attributeName || 'style'===mr.attributeName)){\r\n this.layout();\r\n }\r\n })\r\n });\r\n heightListener.observe(this.parentE,{attributes: true,childList: true, characterData: true});\r\n this.route.queryParams.subscribe((params: Params) => {\r\n if (params['url']) {\r\n this.audioUrl = params['url'];\r\n }\r\n });\r\n }\r\n\r\n\r\n ngAfterViewChecked(){\r\n //console.log(\"AfterViewChecked: \"+this.ac);\r\n }\r\n\r\n\r\n init() {\r\n\r\n\r\n }\r\n\r\n layout(){\r\n this.audioDisplayScrollPane.layout();\r\n }\r\n\r\n get audioUrl(): string|null {\r\n return this._audioUrl;\r\n }\r\n\r\n set audioUrl(value: string|null) {\r\n if(this.ap) {\r\n this.ap.stop();\r\n }\r\n this._audioUrl = value;\r\n this.load();\r\n }\r\n\r\n\r\n started() {\r\n //console.debug(\"Play started\");\r\n this.status = 'Playing...';\r\n }\r\n\r\n private load() {\r\n\r\n if (this.currentLoader) {\r\n this.currentLoader.abort();\r\n this.currentLoader = null;\r\n }\r\n if(this._audioUrl) {\r\n //this.statusMsg.innerHTML = 'Connecting...';\r\n this.currentLoader = new XMLHttpRequest();\r\n this.currentLoader.open(\"GET\", this._audioUrl, true);\r\n this.currentLoader.responseType = \"arraybuffer\";\r\n this.currentLoader.onload = (e) => {\r\n if (this.currentLoader) {\r\n\r\n var data = this.currentLoader.response; // not responseText\r\n //console.debug(\"Received data \", data.byteLength);\r\n this.currentLoader = null;\r\n this.loaded(data);\r\n }\r\n }\r\n this.currentLoader.onerror = (e) => {\r\n console.error(\"Error downloading ...\");\r\n //this.statusMsg.innerHTML = 'Error loading audio file!';\r\n this.currentLoader = null;\r\n }\r\n //this.statusMsg.innerHTML = 'Loading...';\r\n\r\n this.currentLoader.send();\r\n }\r\n }\r\n\r\n private loaded(data: ArrayBuffer) {\r\n\r\n //console.debug(\"Loaded\");\r\n this.status = 'Audio file loaded.';\r\n //console.debug(\"Received data \", data.byteLength);\r\n\r\n // Do not use Promise version, which does not work with Safari 13\r\n if(this.aCtx) {\r\n this.aCtx.decodeAudioData(data, (audioBuffer) => {\r\n //console.debug(\"Audio Buffer Samplerate: \", audioBuffer.sampleRate)\r\n this.audioClip = new AudioClip(audioBuffer)\r\n });\r\n }\r\n }\r\n\r\n @Input()\r\n set audioData(audioBuffer: AudioBuffer){\r\n this.audioDisplayScrollPane.audioData = audioBuffer;\r\n if(audioBuffer) {\r\n let clip = new AudioClip(audioBuffer);\r\n if (this.ap){\r\n this.ap.audioClip = clip;\r\n this.playStartAction.disabled = false\r\n }\r\n }else{\r\n this.playStartAction.disabled = true\r\n if (this.ap){\r\n this.ap.audioClip = null;\r\n }\r\n }\r\n this.playSelectionAction.disabled=true\r\n }\r\n\r\n startSelectionDisabled(){\r\n return !(this._audioClip && this.ap!=null && !this.playStartAction.disabled && this._audioClip.selection )\r\n }\r\n\r\n @Input()\r\n set audioClip(audioClip: AudioClip | null) {\r\n this._audioClip=audioClip\r\n let audioData:AudioBuffer|null=null;\r\n let sel:Selection|null=null;\r\n if(audioClip){\r\n audioData=audioClip.buffer;\r\n sel=audioClip.selection;\r\n if(this._audioClip) {\r\n this._audioClip.addSelectionObserver((ac) => {\r\n\r\n this.playSelectionAction.disabled = this.startSelectionDisabled()\r\n // if(this.ap && ac.selection && this.autoplaySelectedCheckbox.checked){\r\n // this.ap.startSelected()\r\n // }\r\n\r\n })\r\n }\r\n }\r\n if(audioData) {\r\n this.playStartAction.disabled =(!this.ap)\r\n this.playSelectionAction.disabled=this.startSelectionDisabled()\r\n }else{\r\n this.playStartAction.disabled = true\r\n this.playSelectionAction.disabled=true\r\n }\r\n\r\n this.audioDisplayScrollPane.audioClip=audioClip\r\n if(this.ap) {\r\n this.ap.audioClip = audioClip\r\n }\r\n }\r\n\r\n get audioClip():AudioClip|null{\r\n return this._audioClip\r\n }\r\n\r\n updatePlayPosition() {\r\n\r\n if (this.ap && this.ap.playPositionFrames) {\r\n this.audioDisplayScrollPane.playFramePosition = this.ap.playPositionFrames;\r\n }\r\n }\r\n\r\n audioPlayerUpdate(e: AudioPlayerEvent) {\r\n if (EventType.STARTED === e.type) {\r\n this.status = 'Playback...';\r\n this.updateTimerId = window.setInterval(() => this.updatePlayPosition(), 50);\r\n this.playStartAction.disabled = true;\r\n this.playSelectionAction.disabled=true\r\n this.playStopAction.disabled = false;\r\n } else if (EventType.ENDED === e.type) {\r\n this.status = 'Ready.';\r\n window.clearInterval(this.updateTimerId);\r\n this.playStartAction.disabled = false;\r\n this.playSelectionAction.disabled=this.startSelectionDisabled()\r\n this.playStopAction.disabled = true;\r\n }\r\n\r\n this.ref.detectChanges();\r\n\r\n }\r\n\r\n error() {\r\n this.status = 'ERROR';\r\n }\r\n\r\n}\r\n\r\n","import {PromptitemUtil} from \"../../script/script\";\r\nimport {RecordingFile, SprRecordingFile} from \"../../recording\";\r\n\r\n\r\n// export class RecordingFile {\r\n//\r\n// get recordingFileId(): string | number {\r\n// return this._recordingFileId;\r\n// }\r\n//\r\n// frames:number=null\r\n// editStartFrame:number=null\r\n// editEndFrame:number=null\r\n//\r\n// recording:PromptItem;\r\n//\r\n// session:number|string;\r\n//\r\n// get audioBuffer(): AudioBuffer {\r\n// return this._audioBuffer;\r\n// }\r\n//\r\n// set audioBuffer(value: AudioBuffer) {\r\n// this._audioBuffer = value;\r\n// }\r\n// private _recordingFileId:string | number;\r\n// private _audioBuffer:AudioBuffer;\r\n//\r\n// constructor(recordingFileId: string| number, audioBuffer:AudioBuffer){\r\n// this._recordingFileId=recordingFileId;\r\n// this._audioBuffer=audioBuffer;\r\n// }\r\n//\r\n//\r\n// }\r\n\r\nexport class RecordingFileUtil {\r\n public static recordingAsPlainText(recordingFile:SprRecordingFile) {\r\n if (recordingFile) {\r\n let r = recordingFile.recording;\r\n if (r) {\r\n return PromptitemUtil.toPlainTextString(r);\r\n }\r\n }\r\n return \"n/a\";\r\n }\r\n\r\n public static framePosForSampleRate(framePosSampleRate:number|null,framePos:number|null,sampleRate:number):number|null{\r\n let fpFSr=null;\r\n\r\n // TODO transitional until editSampleRates are set in the database\r\n if(framePosSampleRate==null){\r\n framePosSampleRate=sampleRate;\r\n }\r\n if(framePosSampleRate!=null && framePos!=null) {\r\n if (framePosSampleRate === sampleRate) {\r\n fpFSr=framePos;\r\n } else {\r\n fpFSr=Math.round((framePos * sampleRate) / framePosSampleRate);\r\n }\r\n }\r\n return fpFSr;\r\n }\r\n\r\n public static editStartFrameForSampleRate(recordingFile:RecordingFile, sampleRate:number):number | null{\r\n let esffSr=RecordingFileUtil.framePosForSampleRate(recordingFile.editSampleRate,recordingFile.editStartFrame,sampleRate);\r\n return esffSr;\r\n }\r\n\r\n public static editEndFrameForSampleRate(recordingFile:RecordingFile, sampleRate:number):number | null{\r\n let eeffSr=RecordingFileUtil.framePosForSampleRate(recordingFile.editSampleRate,recordingFile.editEndFrame,sampleRate);\r\n return eeffSr;\r\n }\r\n}\r\n","import {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient, HttpErrorResponse, HttpHeaders, HttpResponse} from \"@angular/common/http\";\r\n\r\n\r\nimport {Observable} from \"rxjs\";\r\n\r\n\r\nimport {ApiType, SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../../spr.config\";\r\nimport {UUID} from \"../../../utils/utils\";\r\nimport {RecordingFile, SprRecordingFile} from \"../../recording\";\r\n\r\n\r\n@Injectable()\r\nexport class RecordingFileService {\r\n\r\n public static readonly RECOFILE_API_CTX = 'recordingfile'\r\n private apiEndPoint: string;\r\n private withCredentials: boolean = false;\r\n\r\n //private debugDelay:number=10000;\r\n private debugDelay:number=0;\r\n\r\n constructor(private http: HttpClient, @Inject(SPEECHRECORDER_CONFIG) private config?: SpeechRecorderConfig) {\r\n //constructor(private http: HttpClient) {\r\n // TODO test only\r\n this.apiEndPoint = ''\r\n // this.apiEndPoint = '/wikispeech/api/v1'\r\n\r\n if (config && config.apiEndPoint) {\r\n this.apiEndPoint = config.apiEndPoint;\r\n }\r\n if (this.apiEndPoint !== '') {\r\n this.apiEndPoint = this.apiEndPoint + '/'\r\n }\r\n if (config != null && config.withCredentials != null) {\r\n this.withCredentials = config.withCredentials;\r\n }\r\n //this.withCredentials=true\r\n\r\n //this.recordingCtxUrl = apiEndPoint + REC_API_CTX;\r\n\r\n\r\n }\r\n\r\n private recoFileUrl(recordingFileId: string | number):string{\r\n let encRecfileId=encodeURIComponent(recordingFileId);\r\n let recUrl = this.apiEndPoint + RecordingFileService.RECOFILE_API_CTX + '/' + encRecfileId;\r\n\r\n return recUrl;\r\n }\r\n\r\n private fetchAudiofile(recordingFileId: string | number): Observable<HttpResponse<ArrayBuffer>> {\r\n let recUrl = this.recoFileUrl(recordingFileId);\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n recUrl = recUrl + '.wav';\r\n }\r\n let headers = new HttpHeaders({\r\n 'Accept': 'audio/wav'\r\n });\r\n\r\n return this.http.get(recUrl, {\r\n observe: 'response',\r\n headers: headers,\r\n responseType: 'arraybuffer',\r\n withCredentials: this.withCredentials\r\n });\r\n }\r\n\r\n private recordingFileDescrObserver(recordingFileId: string | number): Observable<RecordingFile> {\r\n\r\n let recUrl = this.recoFileUrl(recordingFileId);\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n recUrl = recUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n return this.http.get<RecordingFile>(recUrl,{ withCredentials: this.withCredentials });\r\n }\r\n\r\n private sprRecordingFileDescrObserver(recordingFileId: string | number): Observable<SprRecordingFile> {\r\n\r\n let recUrl = this.recoFileUrl(recordingFileId);\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n recUrl = recUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n return this.http.get<SprRecordingFile>(recUrl,{ withCredentials: this.withCredentials });\r\n }\r\n\r\n\r\n private fetchSessionAudiofileById(projectName: string, sessId: string | number, recordingFileId: string | number): Observable<HttpResponse<ArrayBuffer>> {\r\n\r\n let recUrl = this.recoFileUrl(recordingFileId);\r\n // if (this.config && this.config.apiType === ApiType.FILES) {\r\n // // for development and demo\r\n // // append UUID to make request URL unique to avoid localhost server caching\r\n // recUrl = recUrl + '.wav?requestUUID=' + UUID.generate();\r\n // }\r\n return this.http.get(recUrl, {\r\n observe: 'response',\r\n responseType: 'arraybuffer',\r\n withCredentials: this.withCredentials\r\n });\r\n }\r\n\r\n\r\n // TODO test\r\n\r\n fetchAndApplyRecordingFile(aCtx: AudioContext, recordingFile:SprRecordingFile):Observable<SprRecordingFile|null> {\r\n\r\n let wobs = new Observable<SprRecordingFile|null>(observer=>{\r\n if(recordingFile.recordingFileId) {\r\n let obs = this.fetchAudiofile(recordingFile.recordingFileId);\r\n\r\n obs.subscribe(resp => {\r\n // Do not use Promise version, which does not work with Safari 13\r\n if(resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n recordingFile.audioBuffer = ab;\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }\r\n })\r\n }else{\r\n observer.error('Received no audio data!');\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n } else {\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n }else{\r\n observer.error();\r\n }\r\n });\r\n\r\n return wobs;\r\n }\r\n\r\n fetchRecordingFile(aCtx: AudioContext, recordingFileId: string | number): Observable<RecordingFile | null> {\r\n\r\n let wobs = new Observable<RecordingFile | null>(observer => {\r\n let rf: RecordingFile|null = null;\r\n let rfDescrObs = this.recordingFileDescrObserver(recordingFileId);\r\n rfDescrObs.subscribe(value => {\r\n rf = value;\r\n }, (error) => {\r\n observer.error(error);\r\n }, () => {\r\n let rfAudioObs = this.fetchAudiofile(recordingFileId);\r\n rfAudioObs.subscribe(resp => {\r\n // Do not use Promise version, which does not work with Safari 13\r\n if(resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n if(rf) {\r\n rf.audioBuffer = ab\r\n }else{\r\n observer.error('Recording file object null');\r\n }\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n observer.next(rf);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(rf);\r\n observer.complete();\r\n }\r\n })\r\n }else{\r\n observer.error('Received no audio data');\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n } else {\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n\r\n });\r\n });\r\n\r\n return wobs;\r\n }\r\n\r\n fetchSprRecordingFile(aCtx: AudioContext, recordingFileId: string | number): Observable<SprRecordingFile | null> {\r\n\r\n let wobs = new Observable<SprRecordingFile | null>(observer => {\r\n let rf: SprRecordingFile|null = null;\r\n let rfDescrObs = this.sprRecordingFileDescrObserver(recordingFileId);\r\n rfDescrObs.subscribe(value => {\r\n rf = value;\r\n }, (error) => {\r\n observer.error(error);\r\n }, () => {\r\n let rfAudioObs = this.fetchAudiofile(recordingFileId);\r\n rfAudioObs.subscribe(resp => {\r\n // Do not use Promise version, which does not work with Safari 13\r\n if(resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n if(rf) {\r\n rf.audioBuffer = ab\r\n }else{\r\n observer.error('Recording file object null');\r\n }\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n observer.next(rf);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(rf);\r\n observer.complete();\r\n }\r\n })\r\n }else{\r\n observer.error('Received no audio data');\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n } else {\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n\r\n });\r\n });\r\n\r\n return wobs;\r\n }\r\n\r\n saveEditSelection(recordingFileId: string | number,editSampleRate:number|null,editStartFrame:number|null,editEndFrame:number|null): Observable<SprRecordingFile | null> {\r\n let recUrl = this.apiEndPoint + RecordingFileService.RECOFILE_API_CTX + '/' + recordingFileId;\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n recUrl = recUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n console.log(\"Path request URL: \"+recUrl)\r\n return this.http.patch<SprRecordingFile>(recUrl,{editSampleRate:editSampleRate,editStartFrame:editStartFrame,editEndFrame:editEndFrame},{ withCredentials: this.withCredentials });\r\n }\r\n\r\n}\r\n\r\n\r\n","import {Component, Input, OnInit} from '@angular/core';\r\nimport {RecordingFileUtil} from \"./recording-file\";\r\nimport {RecordingFile, SprRecordingFile} from \"../../recording\";\r\n\r\n@Component({\r\n selector: 'app-recording-file-meta',\r\n template: `\r\n <mat-card>\r\n <mat-card-title>Recording file ID: {{recordingFile?.recordingFileId}}</mat-card-title>\r\n <mat-card-content>\r\n <table>\r\n <tr *ngIf=\"itemCode\">\r\n <td>Itemcode:</td>\r\n <td>{{itemCode}}</td>\r\n </tr>\r\n <tr *ngIf=\"uuid && !itemCode\">\r\n <td>UUID:</td>\r\n <td>{{uuid}}</td>\r\n </tr>\r\n <tr *ngIf=\"recordingFile?.startedDate\">\r\n <td>Started:</td>\r\n <td>{{recordingFile?.startedDate}}</td>\r\n </tr>\r\n <tr *ngIf=\"!recordingFile?.startedDate && recordingFile?.date\">\r\n <td>Date:</td>\r\n <td>{{recordingFile?.date}}</td>\r\n </tr>\r\n <tr *ngIf=\"itemCode\">\r\n <td>Prompt:</td>\r\n <td>{{recordingAsPlainText()}}</td>\r\n </tr>\r\n\r\n <tr *ngIf=\"sessionId\">\r\n <td>Session:</td>\r\n <td>{{sessionId}}</td>\r\n </tr>\r\n </table>\r\n </mat-card-content>\r\n </mat-card>\r\n `,\r\n styles: []\r\n})\r\nexport class RecordingFileMetaComponent{\r\n\r\n\r\n @Input() sessionId:string | number | null=null;\r\n\r\n private _recordingFile:SprRecordingFile|null=null;\r\n\r\n get recordingFile(): SprRecordingFile | null {\r\n return this._recordingFile;\r\n }\r\n\r\n @Input() set recordingFile(recordingFile:SprRecordingFile|null){\r\n this._recordingFile=recordingFile;\r\n if(this._recordingFile) {\r\n this.itemCode = this._recordingFile.itemCode;\r\n if(!this.itemCode && this._recordingFile.recording?.itemcode){\r\n this.itemCode=this._recordingFile.recording.itemcode;\r\n }\r\n if (this.itemCode) {\r\n\r\n this.uuid = null;\r\n console.debug(\"SprRecordingFile: \"+this.itemCode+ \" UUID: \"+this.uuid)\r\n } else {\r\n this.itemCode = null;\r\n this.uuid = this._recordingFile?.uuid;\r\n console.debug(\"RecordingFile: \"+this.itemCode+ \" UUID: \"+this.uuid)\r\n }\r\n }else{\r\n this.itemCode=null;\r\n this.uuid=null;\r\n }\r\n }\r\n\r\n itemCode:string|null=null;\r\n uuid:string|null|undefined=null;\r\n\r\n recordingAsPlainText(){\r\n let t=null;\r\n if(this._recordingFile) {\r\n t = RecordingFileUtil.recordingAsPlainText(this._recordingFile);\r\n }\r\n return t;\r\n }\r\n}\r\n","import {Component, Input, OnInit, ViewChild} from '@angular/core';\r\nimport {Action} from \"../../../action/action\";\r\n\r\n@Component({\r\n selector: 'app-recording-file-navi',\r\n template: `\r\n <div #controlPanel style=\"display:flex;flex-direction: row;\">\r\n <div #navi style=\"flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap\">\r\n <fieldset>\r\n <legend>Versions</legend>\r\n <mat-progress-spinner *ngIf=\"naviInfoLoading\" mode=\"indeterminate\" [diameter]=\"15\"></mat-progress-spinner>\r\n <select *ngIf=\"!naviInfoLoading\" [disabled]=\"versions==null || versions.length==1\" (change)=\"selectVersionChange($event)\">\r\n <option *ngFor=\"let v of versions; let i = index\" [selected]=\"v===version\" value=\"{{v}}\">{{v}}<span *ngIf=\"i==0\"> (latest)</span></option>\r\n </select>\r\n </fieldset>\r\n <fieldset>\r\n <legend>Navigate</legend>\r\n <mat-progress-spinner *ngIf=\"naviInfoLoading\" mode=\"indeterminate\" [diameter]=\"15\"></mat-progress-spinner>\r\n <div *ngIf=\"!naviInfoLoading\" style=\"flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap\">\r\n <button (click)=\"firstAction?.perform()\" [disabled]=\"!firstAction || firstAction?.disabled\" matTooltip=\"First recording file\">\r\n <mat-icon>first_page</mat-icon>\r\n </button>\r\n <button (click)=\"prevAction?.perform()\" [disabled]=\"!prevAction || prevAction?.disabled\" matTooltip=\"Previous recording file\">\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n <button (click)=\"nextAction?.perform()\" [disabled]=\"!nextAction || nextAction?.disabled\" matTooltip=\"Next recording file\">\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n <button (click)=\"lastAction?.perform()\" [disabled]=\"!lastAction || lastAction?.disabled\" matTooltip=\"Last recording file\">\r\n <mat-icon>last_page</mat-icon>\r\n </button>\r\n </div>\r\n <p *ngIf=\"items && itemPos!==null && itemPos!==undefined\">Item {{itemPos+1}} of {{items}}</p>\r\n <p>(List ordered by date)</p>\r\n </fieldset>\r\n </div>\r\n </div>\r\n `,\r\n styles: [\r\n `:host {\r\n flex: 0;\r\n\r\n }`]\r\n})\r\nexport class RecordingFileNaviComponent implements OnInit {\r\n @Input() firstAction: Action<void>|undefined;\r\n @Input() prevAction: Action<void>|undefined;\r\n @Input() nextAction: Action<void>|undefined;\r\n @Input() lastAction: Action<void>|undefined;\r\n @Input() items:number | null|undefined;\r\n @Input() itemPos:number | null|undefined;\r\n @Input() selectVersion: Action<number>|undefined;\r\n @Input() versions: Array<number>|null=null;\r\n @Input() version: number|null=null;\r\n\r\n @Input() naviInfoLoading=false;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n selectVersionChange(ev:Event){\r\n //console.debug(\"Change event: \"+ev.target.value+ \", as Nr: \"+versionNr);\r\n\r\n const selEl = ev.target as HTMLSelectElement;\r\n let versionNr = parseInt(selEl.value);\r\n if(this.selectVersion) {\r\n this.selectVersion.perform(versionNr);\r\n }\r\n }\r\n\r\n}\r\n","import {\r\n Component,\r\n ViewChild,\r\n ChangeDetectorRef,\r\n AfterViewInit, Input, ElementRef, OnInit,\r\n} from '@angular/core'\r\n\r\n\r\nimport {ActivatedRoute, Params, Route, Router} from \"@angular/router\";\r\n\r\n\r\nimport {RecordingFileService} from \"./recordingfile-service\";\r\nimport {MatDialog} from \"@angular/material/dialog\";\r\nimport {AudioDisplayPlayer} from \"../../../audio/audio_player\";\r\n\r\nimport {AudioDisplayScrollPane} from \"../../../audio/ui/audio_display_scroll_pane\";\r\nimport {AudioContextProvider} from \"../../../audio/context\";\r\nimport {AudioClip} from \"../../../audio/persistor\";\r\nimport {Selection} from \"../../../audio/persistor\";\r\n\r\nimport {Action, ActionEvent} from \"../../../action/action\";\r\nimport {SessionService} from \"../session.service\";\r\nimport {RecordingService} from \"../../recordings/recordings.service\";\r\nimport {RecordingFile, SprRecordingFile} from \"../../recording\";\r\nimport {RecordingFileUtil} from \"./recording-file\";\r\n\r\n\r\nexport class ItemcodeIndex{\r\n [itemcode: string]: Array<SprRecordingFile>;\r\n}\r\n\r\n@Component({\r\n\r\n selector: 'app-audiodisplayplayer',\r\n\r\n template: `\r\n\r\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\r\n <div class=\"ctrlview\">\r\n <app-recording-file-meta [sessionId]=\"sessionId\" [recordingFile]=\"recordingFile\"></app-recording-file-meta>\r\n\r\n <audio-display-control [audioClip]=\"audioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [playStopAction]=\"playStopAction\"\r\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\r\n [zoomInAction]=\"zoomInAction\"\r\n [zoomOutAction]=\"zoomOutAction\"\r\n [zoomSelectedAction]=\"zoomSelectedAction\"\r\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\r\n <app-recording-file-navi [items]=\"availRecFiles?.length\" [itemPos]=\"posInList\" [version]=\"recordingFileVersion\" [versions]=\"versions\" [firstAction]=\"firstAction\" [prevAction]=\"prevAction\" [nextAction]=\"nextAction\" [lastAction]=\"lastAction\" [selectVersion]=\"toVersionAction\" [naviInfoLoading]=\"naviInfoLoading\"></app-recording-file-navi>\r\n </div>\r\n `,\r\n styles: [\r\n `:host {\r\n flex: 2;\r\n display: flex;\r\n flex-direction: column;\r\n min-height:0;\r\n overflow: hidden;\r\n padding: 20px;\r\n z-index: 5;\r\n box-sizing: border-box;\r\n background-color: white;\r\n }`,`\r\n .ctrlview{\r\n display: flex;\r\n flex-direction: row;\r\n\r\n }\r\n `,`\r\n audio-display-control{\r\n\r\n flex: 3;\r\n }\r\n `]\r\n\r\n})\r\nexport class RecordingFileViewComponent extends AudioDisplayPlayer implements OnInit,AfterViewInit {\r\n\r\n //protected _recordingFileId: string | number = null;\r\n\r\n sessionId: string | number | null= null;\r\n sessionIdFromRoute:string|null=null;\r\n\r\n availRecFiles!: Array<Array<SprRecordingFile>>;\r\n versions: Array<number>|null=null;\r\n\r\n recordingFile: SprRecordingFile|null=null;\r\n recordingFileVersion:number|null=null;\r\n private routedByQueryParam=false;\r\n posInList: number|null=null;\r\n\r\n\r\n @ViewChild(AudioDisplayScrollPane)\r\n private ac!: AudioDisplayScrollPane;\r\n\r\n firstAction: Action<void>;\r\n prevAction: Action<void>;\r\n nextAction: Action<void>;\r\n lastAction: Action<void>;\r\n toVersionAction: Action<number>;\r\n\r\n naviInfoLoading=false;\r\n\r\n constructor(protected recordingFileService: RecordingFileService, protected recordingService: RecordingService, protected sessionService: SessionService, protected router:Router,protected route: ActivatedRoute, protected ref: ChangeDetectorRef, protected eRef: ElementRef, protected dialog: MatDialog) {\r\n super(route, ref, eRef)\r\n this.parentE = this.eRef.nativeElement;\r\n this.firstAction = new Action<void>('First');\r\n this.firstAction.onAction= ()=>{\r\n this.posInList=0;\r\n this.navigateToRecordingFile();\r\n }\r\n this.prevAction = new Action<void>('Previous');\r\n this.prevAction.onAction= ()=>this.prevFile();\r\n this.nextAction = new Action<void>('Next');\r\n this.nextAction.onAction= ()=>this.nextFile();\r\n this.lastAction = new Action<void>('Last');\r\n this.lastAction.onAction= ()=>{\r\n if(this.availRecFiles) {\r\n this.posInList = this.availRecFiles.length - 1;\r\n this.navigateToRecordingFile();\r\n }\r\n }\r\n\r\n this.toVersionAction=new Action<number>('To version');\r\n this.toVersionAction.onAction= (ae)=>this.toVersion(ae);\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n super.ngAfterViewInit()\r\n this.route.queryParams.subscribe((params: Params) => {\r\n let rfIdP = params['recordingFileId'];\r\n let sIdP = params['sessionId'];\r\n if (sIdP) {\r\n this.sessionIdFromRoute=sIdP;\r\n }\r\n if (rfIdP) {\r\n this.routedByQueryParam=true;\r\n this.loadRecFile(rfIdP);\r\n }\r\n });\r\n this.route.params.subscribe((params: Params) => {\r\n let rfIdP = params['recordingFileId'];\r\n let sIdP = params['sessionId'];\r\n if (sIdP) {\r\n this.sessionIdFromRoute=sIdP;\r\n }\r\n if (rfIdP) {\r\n this.routedByQueryParam=false;\r\n this.loadRecFile(rfIdP);\r\n }\r\n });\r\n // if(this.sessionId){\r\n // this.loadSession(this.sessionId);\r\n // }\r\n }\r\n\r\n\r\n private navigateToId(rfId:number| string){\r\n\r\n if(this.routedByQueryParam){\r\n this.router.navigate([], {relativeTo: this.route, queryParams:{'recordingFileId':rfId}})\r\n }else {\r\n this.router.navigate(['../' + rfId], {relativeTo: this.route});\r\n }\r\n }\r\n\r\n private navigateToRecordingFile(){\r\n if(this.posInList!=null) {\r\n let latestNextRf = this.availRecFiles[this.posInList][0];\r\n let lnRfId = latestNextRf.recordingFileId;\r\n if(lnRfId) {\r\n this.navigateToId(lnRfId);\r\n }\r\n }\r\n }\r\n\r\n toVersion(ae: ActionEvent<number>) {\r\n let toRfId = null;\r\n let version = ae.value;\r\n if(this.posInList!=null) {\r\n let cRfs = this.availRecFiles[this.posInList];\r\n let availVersionCnt = cRfs.length;\r\n for (let cRf of cRfs) {\r\n if(cRf.version !=null) {\r\n if (cRf.version === version) {\r\n toRfId = cRf.recordingFileId;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (toRfId != null) {\r\n this.navigateToId(toRfId);\r\n }\r\n }\r\n\r\n\r\n prevFile() {\r\n if(this.posInList!=null) {\r\n this.posInList--;\r\n }\r\n this.navigateToRecordingFile()\r\n }\r\n nextFile() {\r\n if(this.posInList!=null) {\r\n this.posInList++;\r\n }\r\n this.navigateToRecordingFile()\r\n }\r\n\r\n private positionInList():number | null{\r\n if (this.availRecFiles && this.recordingFile) {\r\n let cic=this.recordingFile.itemCode;\r\n if(!cic && this.recordingFile.recording && this.recordingFile.recording.itemcode){\r\n cic=this.recordingFile.recording.itemcode;\r\n }\r\n if (cic) {\r\n let itemCnt = this.availRecFiles.length\r\n for (let rfdi = 0; rfdi < itemCnt; rfdi++) {\r\n let arRf = this.availRecFiles[rfdi][0];\r\n if (arRf.recording) {\r\n let ar = arRf.recording;\r\n if (cic === ar.itemcode) {\r\n return rfdi;\r\n }\r\n }\r\n }\r\n }else{\r\n let itemCnt = this.availRecFiles.length\r\n for (let rfdi = 0; rfdi < itemCnt; rfdi++) {\r\n let arRf = this.availRecFiles[rfdi][0];\r\n if (this.recordingFile.uuid === arRf.uuid) {\r\n return rfdi;\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private updatePos(){\r\n this.posInList=this.positionInList();\r\n this.toVersionAction.disabled=true;\r\n if(this.availRecFiles){\r\n let avRfsLen=this.availRecFiles.length;\r\n if(this.posInList !=null && avRfsLen>this.posInList) {\r\n let arfs = this.availRecFiles[this.posInList];\r\n if (arfs) {\r\n this.versions = new Array<number>();\r\n for (let arf of arfs) {\r\n if(arf.recording?.itemcode) {\r\n this.versions.push(arf.version)\r\n }\r\n }\r\n\r\n this.toVersionAction.disabled=(this.versions.length<2);\r\n }\r\n }\r\n }\r\n\r\n if(this.recordingFile){\r\n if(this.recordingFile.version){\r\n this.recordingFileVersion=this.recordingFile.version;\r\n }else{\r\n this.recordingFileVersion=0;\r\n }\r\n }else{\r\n this.recordingFileVersion=null;\r\n }\r\n this.updateActions()\r\n }\r\n\r\n protected loadRecFile(rfId:number | string) {\r\n this.ap?.stop();\r\n this.audioClip =null;\r\n this.recordingFile=null;\r\n this.posInList=null;\r\n this.updateActions();\r\n let audioContext = AudioContextProvider.audioContextInstance();\r\n if(audioContext) {\r\n this.recordingFileService.fetchSprRecordingFile(audioContext, rfId).subscribe(value => {\r\n this.status = 'Audio file loaded.';\r\n let clip = null;\r\n this.recordingFile = value;\r\n if (this.recordingFile) {\r\n let ab = this.recordingFile.audioBuffer;\r\n if (ab) {\r\n clip = new AudioClip(ab);\r\n\r\n let esffsr = null;\r\n let eeffsr = null;\r\n let esr = null;\r\n\r\n if (clip.buffer != null) {\r\n esr = ab.sampleRate;\r\n if (esr != null) {\r\n esffsr = RecordingFileUtil.editStartFrameForSampleRate(this.recordingFile, esr);\r\n eeffsr = RecordingFileUtil.editEndFrameForSampleRate(this.recordingFile, esr);\r\n }\r\n let sel: Selection | null = null;\r\n if (esffsr != null) {\r\n if (eeffsr != null) {\r\n sel = new Selection(ab.sampleRate, esffsr, eeffsr);\r\n } else {\r\n let ch0 = ab.getChannelData(0);\r\n let frameLength = ch0.length;\r\n sel = new Selection(esr, esffsr, frameLength);\r\n }\r\n } else if (eeffsr != null) {\r\n sel = new Selection(esr, 0, eeffsr);\r\n }\r\n clip.selection = sel\r\n }\r\n }\r\n }\r\n this.audioClip = clip\r\n this.loadedRecfile();\r\n\r\n }, error1 => {\r\n this.status = 'Error loading audio file!';\r\n });\r\n }\r\n }\r\n\r\n protected loadedRecfile() {\r\n if(this.recordingFile && !this.sessionId) {\r\n let sId=this.recordingFile.session\r\n if(!sId){\r\n sId=this.sessionIdFromRoute;\r\n }\r\n if (sId) {\r\n this.loadSession(sId);\r\n }\r\n }\r\n\r\n this.updatePos();\r\n this.ref.detectChanges();\r\n }\r\n\r\n private updateActions(){\r\n let itemCnt:number|null=null;\r\n if(this.availRecFiles) {\r\n itemCnt = this.availRecFiles.length;\r\n }\r\n this.firstAction.disabled=(this.posInList==null || this.posInList == 0);\r\n this.prevAction.disabled=(this.posInList==null || this.posInList == 0);\r\n this.nextAction.disabled=(this.posInList==null || itemCnt==null || this.posInList >= itemCnt - 1);\r\n this.lastAction.disabled=(this.posInList==null || itemCnt==null || this.posInList >= itemCnt - 1);\r\n }\r\n\r\n private loadSession(sessionId: string| number) {\r\n // load session and recording file meta data only when on init and when session changes\r\n if (<string>sessionId != <string>this.sessionId) {\r\n // tell UI that we are working...\r\n this.naviInfoLoading=true;\r\n this.sessionService.sessionObserver(<string>sessionId).subscribe((s) => {\r\n // received session data\r\n this.sessionId = s.sessionId;\r\n // fetch recording file meta data list\r\n this.recordingService.sprRecordingFileList(s.project, s.sessionId).subscribe((rfds) => {\r\n this.availRecFiles = new Array<Array<SprRecordingFile>>();\r\n // build structure indexed by itemcode\r\n let icIdx = new ItemcodeIndex();\r\n for (let rfdi = 0; rfdi < rfds.length; rfdi++) {\r\n let rfd = rfds[rfdi];\r\n if (rfd.date) {\r\n // convert date string for faster sorting later\r\n let rfdd = new Date(rfd.date);\r\n rfd._dateAsDateObj = rfdd;\r\n }\r\n let ic = rfd.itemCode;\r\n\r\n if (!ic) {\r\n let r = rfd.recording;\r\n if (r && r.itemcode) {\r\n ic = r.itemcode;\r\n }\r\n }\r\n if (ic) {\r\n let exRfsForIc = icIdx[ic];\r\n if (exRfsForIc == null) {\r\n // itemcode not yet stored\r\n let arfd = new Array<SprRecordingFile>();\r\n arfd.push(rfd);\r\n icIdx[ic] = arfd;\r\n this.availRecFiles.push(arfd);\r\n } else {\r\n // rec file with itemcode already exists, add (push) this version ...\r\n exRfsForIc.push(rfd);\r\n // .. and sort latest version (highest version number) to lowest index\r\n exRfsForIc.sort((rfd1, rfd2) => {\r\n return rfd2.version - rfd1.version;\r\n })\r\n }\r\n\r\n } else {\r\n let arfd = new Array<SprRecordingFile>();\r\n arfd.push(rfd);\r\n this.availRecFiles.push(arfd);\r\n }\r\n }\r\n // have unsorted itemcode indexed recording files here\r\n // sort them ordered by date of latest version ascending\r\n this.availRecFiles.sort((rfs1, rfs2) => {\r\n let d1 = rfs2[0]._dateAsDateObj;\r\n let d2 = rfs1[0]._dateAsDateObj;\r\n if (d1 == null) {\r\n if (d2 == null) {\r\n return 0;\r\n } else {\r\n // Sort entries whose dates are not set to the end\r\n return -1;\r\n }\r\n } else {\r\n if (d2 == null) {\r\n // Sort entries whose dates are not set to the end\r\n return 1;\r\n } else {\r\n // Compare date by time in milliseconds value\r\n return d2.getTime() - d1.getTime();\r\n }\r\n }\r\n });\r\n for(let avRf of this.availRecFiles){\r\n if(avRf[0] && avRf[0].recording) {\r\n let os = avRf[0].recording.itemcode + ': versions: ';\r\n for (let avRfV of avRf) {\r\n os += avRfV.version + '/';\r\n }\r\n console.debug(os);\r\n }\r\n }\r\n this.updatePos()\r\n this.naviInfoLoading=false;\r\n this.ref.detectChanges();\r\n });\r\n });\r\n }\r\n }\r\n}\r\n\r\n","import {\r\n Component,\r\n ChangeDetectorRef,\r\n AfterViewInit,\r\n ElementRef\r\n} from '@angular/core'\r\n\r\n\r\nimport {ActivatedRoute, Router} from \"@angular/router\";\r\nimport {RecordingFileService} from \"./recordingfile-service\";\r\nimport {MatDialog} from \"@angular/material/dialog\";\r\nimport {Selection} from \"../../../audio/persistor\";\r\nimport {MessageDialog} from \"../../../ui/message_dialog\";\r\nimport {Action} from \"../../../action/action\";\r\nimport {RecordingFileViewComponent} from \"./recording-file-view.component\";\r\nimport {SessionService} from \"../session.service\";\r\nimport {RecordingService} from \"../../recordings/recordings.service\";\r\nimport {MatSnackBar} from \"@angular/material/snack-bar\";\r\n\r\n@Component({\r\n\r\n selector: 'app-audiodisplayplayer',\r\n\r\n template: `\r\n <h1>Recording file editing</h1>\r\n <p>On export or delivery the editing selection of the recording file is cut out. If no editing selection is applied the original file is exported.</p>\r\n\r\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\r\n <div class=\"ctrlview\">\r\n <app-recording-file-meta [sessionId]=\"sessionId\" [recordingFile]=\"recordingFile\"></app-recording-file-meta>\r\n <audio-display-control [audioClip]=\"audioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [playStopAction]=\"playStopAction\"\r\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\r\n [zoomInAction]=\"zoomInAction\"\r\n [zoomOutAction]=\"zoomOutAction\"\r\n [zoomSelectedAction]=\"zoomSelectedAction\"\r\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\r\n <app-recording-file-navi [items]=\"availRecFiles?.length\" [itemPos]=\"posInList\" [version]=\"recordingFileVersion\" [versions]=\"versions\" [firstAction]=\"firstAction\" [prevAction]=\"prevAction\" [nextAction]=\"nextAction\" [lastAction]=\"lastAction\" [selectVersion]=\"toVersionAction\" [naviInfoLoading]=\"naviInfoLoading\"></app-recording-file-navi>\r\n </div>\r\n\r\n <button mat-raised-button color=\"accent\" (click)=\"applySelection()\" [disabled]=\"editSaved\">{{this.applyButtonText()}}</button>\r\n `,\r\n styles: [\r\n `:host {\r\n flex: 2;\r\n display: flex;\r\n flex-direction: column;\r\n min-height:0;\r\n overflow: hidden;\r\n padding: 20px;\r\n z-index: 5;\r\n box-sizing: border-box;\r\n background-color: white;\r\n }`,`\r\n .ctrlview{\r\n display: flex;\r\n flex-direction: row;\r\n }\r\n `,`\r\n audio-display-control{\r\n\r\n flex: 3;\r\n }\r\n `]\r\n\r\n})\r\nexport class RecordingFileUI extends RecordingFileViewComponent implements AfterViewInit {\r\n\r\n savedEditSelection:Selection|null=null;\r\n editSaved:boolean=true\r\n\r\n constructor(protected recordingFileService:RecordingFileService,protected recordingService:RecordingService,protected sessionService:SessionService,protected router:Router,protected route: ActivatedRoute, protected ref: ChangeDetectorRef,protected eRef:ElementRef, protected dialog:MatDialog,private snackBar: MatSnackBar) {\r\n super(recordingFileService,recordingService,sessionService,router,route,ref,eRef,dialog)\r\n this.parentE=this.eRef.nativeElement;\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n super.ngAfterViewInit()\r\n }\r\n\r\n applyButtonText():string {\r\n if(this.audioClip) {\r\n let s = this.audioClip.selection\r\n if (s) {\r\n return \"Apply current selection as editing selection\";\r\n }else{\r\n return \"Cancel out editing selection\";\r\n }\r\n }\r\n // just as fallback\r\n return \"Apply selection\";\r\n }\r\n\r\n protected loadRecFile(rfId:number | string) {\r\n this.editSaved = true;\r\n super.loadRecFile(rfId);\r\n }\r\n\r\nprotected loadedRecfile() {\r\n super.loadedRecfile();\r\n if(this.audioClip) {\r\n this.audioClip.addSelectionObserver((clip) => {\r\n let s = clip.selection\r\n this.editSaved = ((this.savedEditSelection == null && s == null) || this.savedEditSelection != null && this.savedEditSelection.equals(s))\r\n });\r\n }\r\n this.savedEditSelection = this.audioClip?this.audioClip.selection:null;\r\n this.editSaved = true\r\n}\r\n\r\n applySelection(){\r\n if(this.audioClip) {\r\n let ab=this.audioClip.buffer;\r\n let s = this.audioClip.selection\r\n if (ab && this.recordingFile?.recordingFileId) {\r\n\r\n let sr= null;\r\n let sf=null;\r\n let ef=null;\r\n if(s) {\r\n sr= ab.sampleRate;\r\n sf = s.startFrame;\r\n ef = s.endFrame;\r\n }\r\n this.recordingFileService.saveEditSelection(this.recordingFile.recordingFileId, sr, sf, ef).subscribe((value) => {\r\n },\r\n () => {\r\n this.dialog.open(MessageDialog, {\r\n\r\n data: {\r\n type: 'error',\r\n title: 'Save selection edit error',\r\n msg: \"Could not save edit selection to WikiSpeech server!\",\r\n advice: \"Please check network connection and server state.\"\r\n }\r\n })\r\n },\r\n () => {\r\n // Or use returned selection value from server?\r\n this.savedEditSelection = s\r\n this.editSaved = true\r\n this.snackBar.open('Selection edit saved successfully.', 'OK', {duration: 1500})\r\n });\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n","\r\n export class MediaUtils {\r\n\r\n static toMediaTime(timeInSeconds:number):string{\r\n let rest=timeInSeconds;\r\n let hours=Math.floor(timeInSeconds/3600);\r\n rest-=hours*3600;\r\n let minutes=Math.floor(rest/60);\r\n rest-=minutes*60;\r\n let seconds=Math.floor(rest);\r\n rest-=seconds;\r\n let millis=Math.round(rest*1000);\r\n return hours.toString().padStart(2,'0')+':'+minutes.toString().padStart(2,'0')+':'+seconds.toString().padStart(2,'0')+'.'+millis.toString().padStart(3,'0');\r\n }\r\n }\r\n","import {AfterViewInit, Component, EventEmitter, Input, Output} from \"@angular/core\";\r\nimport {RecordingFile, SprRecordingFile} from \"../recording\";\r\nimport {MediaUtils} from \"../../media/utils\";\r\nimport {MatTable, MatTableDataSource} from \"@angular/material/table\";\r\nimport {Observable, Subject} from \"rxjs\";\r\n\r\n@Component({\r\n\r\n selector: 'app-recordinglist',\r\n\r\n template: `\r\n <mat-card>\r\n <mat-card-header>\r\n <h2>Recording list</h2>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <table mat-table [dataSource]=\"recordingListDataSource\" class=\"mat-elevation-z0\">\r\n <tr mat-header-row *matHeaderRowDef=\"cols;sticky:true\"></tr>\r\n <tr mat-row *matRowDef=\"let element; columns: cols;\" [scrollIntoViewToBottom]=\"element.uuid===selectedRecordingFile?.uuid\"></tr>\r\n <ng-container matColumnDef=\"index\">\r\n <th mat-header-cell *matHeaderCellDef mat-header>#</th>\r\n <td mat-cell class=\"monospaced\" *matCellDef=\"let element;let i = index\">{{recordingListDataSource.data.length-i}}</td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"startedDate\">\r\n <th mat-header-cell *matHeaderCellDef mat-header>Started</th>\r\n <td mat-cell class=\"monospaced\" *matCellDef=\"let element\">{{element.startedDate | date:'YYYY-MM-dd HH:mm:ss'}}</td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"length\">\r\n <th mat-header-cell *matHeaderCellDef mat-header>Length</th>\r\n <td mat-cell class=\"monospaced\" *matCellDef=\"let element\">{{lengthTimeFormatted(element)}}</td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"action\">\r\n <th mat-header-cell *matHeaderCellDef>Action</th>\r\n <td mat-cell *matCellDef=\"let element\"><button mat-stroked-button color=\"primary\" (click)=\"selectRecordingFile(element)\" [disabled]=\"selectDisabled || element.uuid===selectedRecordingFile?.uuid\"><mat-icon>edit_attributes</mat-icon> Select</button></td>\r\n </ng-container>\r\n </table>\r\n </mat-card-content>\r\n </mat-card>\r\n\r\n `,\r\n styles: [`:host {\r\n position: relative;\r\n margin: 0;\r\n padding: 0;\r\n background: lightgrey;\r\n width: 100%; /* use all horizontal available space */\r\n flex: 1; /* ... and fill rest of vertical available space (other components have flex 0) */\r\n overflow-y: auto;\r\n\r\n /* Workaround for Firefox\r\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\r\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\r\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\r\n */\r\n min-height: 0px;\r\n\r\n }`,`\r\n .selected{\r\n font-weight: bold;\r\n }\r\n `],\r\n styleUrls: ['../../speechrecorder_mat.scss']\r\n\r\n})\r\nexport class RecordingList implements AfterViewInit{\r\n private recordingList:Array<RecordingFile>=new Array<RecordingFile>();\r\n //recordingListSubject:Subject<Array<RecordingFile>> = new Subject<Array<RecordingFile>>();\r\n recordingListDataSource:MatTableDataSource<RecordingFile>;\r\n //cols=['index','length','samples','samplerate','action'];\r\n cols=['index','startedDate','length','action'];\r\n @Input() selectDisabled:boolean=false;\r\n @Output() selectedRecordingFileChanged = new EventEmitter<RecordingFile>();\r\n @Input() selectedRecordingFile:RecordingFile|null=null;\r\n\r\n constructor() {\r\n this.recordingListDataSource=new MatTableDataSource<RecordingFile>();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.buildDataSource();\r\n }\r\n\r\n private buildDataSource(){\r\n this.recordingList.sort((a, b) => {\r\n let cmp:number=0;\r\n let aD:Date|null=null;\r\n let bD:Date|null=null;\r\n if(a._startedAsDateObj && b._startedAsDateObj){\r\n aD=a._startedAsDateObj\r\n bD=b._startedAsDateObj\r\n }else if(a.startedDate && b.startedDate){\r\n aD=new Date(a.startedDate);\r\n bD=new Date(b.startedDate);\r\n }else if(a.date && b.date) {\r\n aD=new Date(a.date);\r\n bD=new Date(b.date);\r\n }\r\n if(aD!==null && bD!==null){\r\n cmp=bD.getTime()-aD.getTime();\r\n }\r\n return cmp;\r\n });\r\n this.recordingListDataSource.data=this.recordingList;\r\n }\r\n\r\n push(rf:RecordingFile){\r\n this.recordingList.push(rf);\r\n this.buildDataSource();\r\n }\r\n\r\n selectRecordingFile(rf:RecordingFile){\r\n this.selectedRecordingFileChanged.emit(rf);\r\n }\r\n\r\n selectTop() {\r\n if (this.recordingList.length > 0) {\r\n this.selectRecordingFile(this.recordingList[0]);\r\n }\r\n }\r\n\r\n lengthTimeFormatted(rf:RecordingFile){\r\n let str='--:--:--';\r\n if(rf.frames && rf.audioBuffer) {\r\n str=MediaUtils.toMediaTime(rf.frames / rf.audioBuffer?.sampleRate);\r\n }\r\n return str;\r\n }\r\n}\r\n","import {AfterViewInit, Component, EventEmitter, Input, Output, ViewChild} from \"@angular/core\";\r\nimport {RecordingFile, SprRecordingFile} from \"../recording\";\r\nimport {MediaUtils} from \"../../media/utils\";\r\nimport {MatTable, MatTableDataSource} from \"@angular/material/table\";\r\nimport {Observable, Subject} from \"rxjs\";\r\nimport {RecordingList} from \"./recording_list\";\r\nimport {AudioClip} from \"../../audio/persistor\";\r\nimport {Action} from \"../../action/action\";\r\nimport {AudioDisplay} from \"../../audio/audio_display\";\r\n\r\n@Component({\r\n\r\n selector: 'app-recordercombipane',\r\n\r\n template: `\r\n <div class=\"scrollList\">\r\n <app-recordinglist [selectedRecordingFile]=\"selectedRecordingFile\" [selectDisabled]=\"selectDisabled\" (selectedRecordingFileChanged)=\"selectRecordingFile($event)\"></app-recordinglist>\r\n </div>\r\n <div class=\"collapsable\" fxHide.xs #asCt [class.active]=\"!audioSignalCollapsed\">\r\n <app-audiodisplay #audioSignalContainer [class.active]=\"!audioSignalCollapsed\"\r\n [audioClip]=\"displayAudioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [autoPlayOnSelectToggleAction]=\"autoPlayOnSelectToggleAction\"\r\n [playStopAction]=\"playStopAction\"></app-audiodisplay>\r\n </div>\r\n `,\r\n styles: [`:host {\r\n background-color: yellow;\r\n position: relative;\r\n margin: 0;\r\n padding: 0;\r\n background: lightgrey;\r\n width: 100%; /* use all horizontal available space */\r\n flex: 1; /* ... and fill rest of vertical available space (other components have flex 0) */\r\n /* Workaround for Firefox\r\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\r\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\r\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\r\n */\r\n min-height: 0px;\r\n\r\n }`,`.scrollList{\r\n margin: 0;\r\n padding: 0;\r\n background: lightgrey;\r\n width: 100%; \r\n height: 100%;\r\n overflow-y: auto;\r\n }`, `\r\n .collapsable {\r\n display: none;\r\n position: absolute;\r\n z-index: 5;\r\n }`, `\r\n .collapsable.active {\r\n display: flex;\r\n position: absolute;\r\n bottom: 0px;\r\n height: 90%;\r\n width: 100%;\r\n overflow: hidden;\r\n padding: 0px;\r\n z-index: 200; /* Needs a higher value then the sticky Material table header (which is z-index: 100) */\r\n box-sizing: border-box;\r\n background-color: rgba(0, 0, 0, 0)\r\n }`],\r\n styleUrls: ['../../speechrecorder_mat.scss']\r\n\r\n})\r\nexport class RecorderCombiPane implements AfterViewInit{\r\n\r\n @ViewChild(RecordingList) recordingListComp!:RecordingList;\r\n @Input() selectDisabled:boolean=false;\r\n @Output() selectedRecordingFileChanged = new EventEmitter<RecordingFile>();\r\n @Input() selectedRecordingFile:RecordingFile|null=null;\r\n\r\n @ViewChild(AudioDisplay, { static: true }) audioDisplay!: AudioDisplay;\r\n @Input() audioSignalCollapsed: boolean=true;\r\n @Input() displayAudioClip: AudioClip | null=null;\r\n @Input() playStartAction: Action<void>|undefined;\r\n @Input() playSelectionAction: Action<void>|undefined;\r\n @Input() autoPlayOnSelectToggleAction:Action<boolean>|undefined;\r\n @Input() playStopAction: Action<void>|undefined;\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n }\r\n\r\n push(rf:RecordingFile){\r\n this.recordingListComp.push(rf);\r\n\r\n }\r\n\r\n selectRecordingFile(rf:RecordingFile){\r\n this.selectedRecordingFileChanged.emit(rf);\r\n }\r\n\r\n selectTop() {\r\n this.recordingListComp.selectTop();\r\n }\r\n\r\n}\r\n","import {AudioCapture, AudioCaptureListener} from '../../audio/capture/capture';\r\nimport {AudioPlayer, AudioPlayerEvent, EventType} from '../../audio/playback/player'\r\nimport {WavWriter} from '../../audio/impl/wavwriter'\r\nimport {RecordingFile, RecordingFileDescriptorImpl, SprRecordingFile} from '../recording'\r\nimport {\r\n Component, ViewChild, ChangeDetectorRef, Inject,\r\n AfterViewInit, HostListener, OnDestroy, Input, Renderer2\r\n} from \"@angular/core\";\r\nimport {SessionService} from \"./session.service\";\r\nimport { MatDialog } from \"@angular/material/dialog\";\r\nimport {SpeechRecorderUploader} from \"../spruploader\";\r\nimport {SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\nimport {Session} from \"./session\";\r\nimport { Project, ProjectUtil} from \"../project/project\";\r\nimport {SequenceAudioFloat32ChunkerOutStream} from \"../../audio/io/stream\";\r\nimport {MessageDialog} from \"../../ui/message_dialog\";\r\nimport {RecordingService} from \"../recordings/recordings.service\";\r\n\r\nimport {AudioContextProvider} from \"../../audio/context\";\r\nimport {AudioClip} from \"../../audio/persistor\";\r\n\r\nimport {Upload, UploaderStatus, UploaderStatusChangeEvent} from \"../../net/uploader\";\r\nimport {ActivatedRoute, Params} from \"@angular/router\";\r\nimport {ProjectService} from \"../project/project.service\";\r\nimport {UUID} from \"../../utils/utils\";\r\nimport {LevelBar} from \"../../audio/ui/livelevel\";\r\nimport {RecorderCombiPane} from \"./recorder_combi_pane\";\r\nimport {BasicRecorder, LEVEL_BAR_INTERVALL_SECONDS, MAX_RECORDING_TIME_MS, RECFILE_API_CTX} from \"./basicrecorder\";\r\n\r\n\r\nexport const enum Status {\r\n BLOCKED, IDLE, RECORDING, STOPPING_STOP, ERROR\r\n}\r\n\r\nexport class Item {\r\n promptAsString: string;\r\n training: boolean;\r\n recs: Array<RecordingFile> | null;\r\n\r\n constructor(promptAsString: string, training: boolean) {\r\n this.promptAsString = promptAsString;\r\n this.training = training;\r\n this.recs = null;\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'app-audiorecorder',\r\n providers: [SessionService],\r\n template: `\r\n <app-warningbar [show]=\"isTestSession()\" warningText=\"Test recording only!\"></app-warningbar>\r\n <app-warningbar [show]=\"isDefaultAudioTestSession()\"\r\n warningText=\"This test uses default audio device! Regular sessions may require a particular audio device (microphone)!\"></app-warningbar>\r\n <app-recordercombipane (selectedRecordingFileChanged)=\"selectRecordingFile($event)\"\r\n [audioSignalCollapsed]=\"audioSignalCollapsed\"\r\n [selectedRecordingFile]=\"displayRecFile\"\r\n [selectDisabled]=\"isActive()\"\r\n [displayAudioClip]=\"displayAudioClip\"\r\n [playStartAction]=\"controlAudioPlayer.startAction\"\r\n [playStopAction]=\"controlAudioPlayer.stopAction\"\r\n [playSelectionAction]=\"controlAudioPlayer.startSelectionAction\"\r\n [autoPlayOnSelectToggleAction]=\"controlAudioPlayer.autoPlayOnSelectToggleAction\"\r\n ></app-recordercombipane>\r\n\r\n <div fxLayout=\"row\" fxLayout.xs=\"column\" [ngStyle]=\"{'height.px':100,'min-height.px': 100}\"\r\n [ngStyle.xs]=\"{'height.px':125,'min-height.px': 125}\">\r\n <audio-levelbar fxFlex=\"1 0 1\" [streamingMode]=\"isRecording()\"\r\n [displayLevelInfos]=\"displayLevelInfos\"></audio-levelbar>\r\n <div fxLayout=\"row\">\r\n <spr-recordingitemcontrols fxFlex=\"10 0 1\"\r\n [audioLoaded]=\"displayAudioClip?.buffer!==null\"\r\n [playStartAction]=\"controlAudioPlayer?.startAction\"\r\n [playStopAction]=\"controlAudioPlayer?.stopAction\"\r\n [peakDbLvl]=\"peakLevelInDb\"\r\n [agc]=\"this.ac?.agcStatus\"\r\n (onShowRecordingDetails)=\"audioSignalCollapsed=!audioSignalCollapsed\">\r\n </spr-recordingitemcontrols>\r\n <app-uploadstatus class=\"ricontrols dark\" fxHide fxShow.xs fxFlex=\"0 0 0\" *ngIf=\"enableUploadRecordings\"\r\n [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processingRecording\"></app-uploadstatus>\r\n <app-readystateindicator class=\"ricontrols dark\" fxHide fxShow.xs fxFlex=\"0 0 0\"\r\n [ready]=\"dataSaved && !isActive()\"></app-readystateindicator>\r\n </div>\r\n </div>\r\n <div #controlpanel class=\"controlpanel\" fxLayout=\"row\">\r\n <app-sprstatusdisplay fxHide.xs fxFlex=\"30% 1 30%\" [statusMsg]=\"statusMsg\" [statusAlertType]=\"statusAlertType\"\r\n [statusWaiting]=\"statusWaiting\"\r\n class=\"hidden-xs\"></app-sprstatusdisplay>\r\n <div fxFlex=\"100% 0 100%\" class=\"startstop\">\r\n <div style=\"align-content: center\">\r\n <button (click)=\"startStopPerform()\" [disabled]=\"startDisabled() && stopDisabled()\" mat-raised-button class=\"bigbutton\">\r\n <mat-icon [style.color]=\"startStopNextIconColor()\" inline=\"true\">{{startStopNextIconName()}}</mat-icon>\r\n <span style=\"font-weight: bolder;font-size: 14px\">{{startStopNextName()}}</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div fxFlex=\"30% 1 30%\" >\r\n <div fxFlex=\"1 1 auto\"></div>\r\n <app-uploadstatus class=\"ricontrols\" fxHide.xs fxFlex=\"0 0 0\" *ngIf=\"enableUploadRecordings\"\r\n [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processingRecording\"></app-uploadstatus>\r\n <app-readystateindicator class=\"ricontrols\" fxHide.xs\r\n [ready]=\"dataSaved && !isActive()\"></app-readystateindicator>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`:host {\r\n flex: 2;\r\n background: lightgrey;\r\n display: flex; /* Vertical flex container: Bottom transport panel, above prompting panel */\r\n flex-direction: column;\r\n margin: 0;\r\n padding: 0;\r\n min-height: 0px;\r\n\r\n /* Prevents horizontal scroll bar on swipe right */\r\n overflow: hidden;\r\n }`,`.ricontrols {\r\n padding: 4px;\r\n box-sizing: border-box;\r\n height: 100%;\r\n }`,`.dark {\r\n background: darkgray;\r\n }`,`.controlpanel {\r\n align-content: center;\r\n align-items: center;\r\n margin: 0;\r\n padding: 20px;\r\n min-height: min-content; /* important */\r\n }`,`.startstop {\r\n width: 100%;\r\n text-align: center;\r\n align-content: center;\r\n align-items: center;\r\n }`,`.bigbutton {\r\n min-width: 70px;\r\n min-height: 50px;\r\n font-size: 50px;\r\n border-radius: 20px;\r\n }`\r\n ]\r\n})\r\nexport class AudioRecorder extends BasicRecorder implements AfterViewInit,OnDestroy, AudioCaptureListener {\r\n\r\n _project:Project|null=null;\r\n @Input() projectName:string|null=null;\r\n enableUploadRecordings: boolean = true;\r\n enableDownloadRecordings: boolean = false;\r\n status: Status = Status.BLOCKED;\r\n\r\n @ViewChild(RecorderCombiPane, { static: true }) recorderCombiPane!: RecorderCombiPane;\r\n @ViewChild(LevelBar, { static: true }) liveLevelDisplay!: LevelBar;\r\n\r\n @Input() dataSaved=true\r\n\r\n private startedDate:Date|null=null;\r\n private maxRecTimerId: number|null=null;\r\n private maxRecTimerRunning: boolean=false;\r\n private updateTimerId: any;\r\n\r\n startStopNextButtonName!:string;\r\n startStopNextButtonIconName!:string;\r\n\r\n audio: any;\r\n\r\n private _promptIndex:number|null=null;\r\n\r\n //items: Array<Item>|null=null;\r\n //selectedItemIdx: number;\r\n private _displayRecFile: RecordingFile | null=null;\r\n private displayRecFileVersion: number=0;\r\n\r\n\r\n\r\n constructor(private changeDetectorRef: ChangeDetectorRef,\r\n private route: ActivatedRoute,\r\n private renderer: Renderer2,\r\n public dialog: MatDialog,\r\n private projectService:ProjectService,\r\n protected sessionService:SessionService,\r\n private recFileService:RecordingService,\r\n private uploader: SpeechRecorderUploader,\r\n @Inject(SPEECHRECORDER_CONFIG) public config?: SpeechRecorderConfig) {\r\n super(dialog,sessionService);\r\n this.status = Status.IDLE;\r\n\r\n this.audio = document.getElementById('audio');\r\n\r\n if (this.config && this.config.enableUploadRecordings != null) {\r\n this.enableUploadRecordings = this.config.enableUploadRecordings;\r\n }\r\n if (this.config && this.config.enableDownloadRecordings != null) {\r\n this.enableDownloadRecordings = this.config.enableDownloadRecordings;\r\n }\r\n this.init();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.route.queryParams.subscribe((params: Params) => {\r\n if (params['sessionId']) {\r\n this.fetchSession(params['sessionId']);\r\n }\r\n });\r\n this.streamLevelMeasure.levelListener = this.liveLevelDisplay;\r\n this.streamLevelMeasure.peakLevelListener=(peakLvlInDb)=>{\r\n this.peakLevelInDb=peakLvlInDb;\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n }\r\n ngOnDestroy() {\r\n this.destroyed=true;\r\n // TODO stop capture /playback\r\n }\r\n\r\n private init() {\r\n\r\n this.transportActions.startAction.disabled = true;\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n this.playStartAction.disabled = true;\r\n\r\n let context:AudioContext|null=null;\r\n try {\r\n context = AudioContextProvider.audioContextInstance()\r\n } catch (err) {\r\n this.status = Status.ERROR;\r\n let errMsg = 'Unknown error';\r\n if(err instanceof Error){\r\n errMsg=err.message;\r\n }\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n }\r\n if(context) {\r\n console.info(\"State of audio context: \" + context.state)\r\n }else{\r\n console.info(\"No audio context available!\");\r\n }\r\n if (!context || !navigator.mediaDevices) {\r\n this.status = Status.ERROR;\r\n let errMsg = 'Browser does not support Media streams!';\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n } else {\r\n this.controlAudioPlayer = new AudioPlayer(context, this);\r\n this.ac = new AudioCapture(context);\r\n if (this.ac) {\r\n this.transportActions.startAction.onAction = () => this.startItem();\r\n this.ac.listener = this;\r\n this.ac.audioOutStream = new SequenceAudioFloat32ChunkerOutStream(this.streamLevelMeasure, LEVEL_BAR_INTERVALL_SECONDS);\r\n // Don't list the devices here. If we do not have audio permissions we only get anonymized devices without labels.\r\n //this.ac.listDevices();\r\n } else {\r\n this.transportActions.startAction.disabled = true;\r\n let errMsg = 'Browser does not support Media/Audio API!';\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n }\r\n this.transportActions.stopAction.onAction = () => this.stopItem();\r\n this.transportActions.nextAction.onAction = () => this.stopItem();\r\n //this.transportActions.pauseAction.onAction = () => this.pauseItem();\r\n\r\n this.playStartAction.onAction = () => this.controlAudioPlayer.start();\r\n\r\n }\r\n this.uploader.listener = (ue) => {\r\n this.uploadUpdate(ue);\r\n }\r\n}\r\n\r\n @HostListener('window:keypress', ['$event'])\r\n onKeyPress(ke: KeyboardEvent) {\r\n if (ke.key == ' ') {\r\n //this.transportActions.startAction.perform();\r\n //this.transportActions.nextAction.perform();\r\n }\r\n }\r\n\r\n @HostListener('window:keydown', ['$event'])\r\n onKeyDown(ke: KeyboardEvent) {\r\n if (ke.key == ' ') {\r\n if(!this.transportActions.startAction.disabled){\r\n this.transportActions.startAction.perform();\r\n }else if(!this.transportActions.stopAction.disabled) {\r\n this.transportActions.stopAction.perform();\r\n }\r\n }\r\n if (ke.key == 'p') {\r\n this.transportActions.pauseAction.perform();\r\n }\r\n if (ke.key == 'Escape') {\r\n if (!this.audioSignalCollapsed) {\r\n this.audioSignalCollapsed = true;\r\n }\r\n this.transportActions.stopAction.perform();\r\n this.transportActions.pauseAction.perform();\r\n }\r\n\r\n if (ke.key == 'MediaPlayPause') {\r\n this.playStartAction.perform();\r\n }\r\n if (ke.key === 'ArrowRight') {\r\n this.transportActions.fwdAction.perform();\r\n }\r\n if (ke.key === 'ArrowLeft') {\r\n this.transportActions.bwdAction.perform();\r\n }\r\n }\r\n\r\n isTestSession():boolean {\r\n return ((this._session!=null) && (this._session.type === 'TEST' || this._session.type==='TEST_DEF_A' || this._session.type === 'SINUS_TEST'));\r\n }\r\n\r\n isDefaultAudioTestSession():boolean {\r\n return ((this._session!=null) && (this._session.type==='TEST_DEF_A'));\r\n }\r\n\r\n isDefaultAudioTestSessionOverwriteingProjectRequirements():boolean {\r\n return ((this._session!=null) && (this._session.type==='TEST_DEF_A') && (this.audioDevices!=null) && this.audioDevices.length>0)\r\n }\r\n\r\n fetchSession(sessionId:string){\r\n\r\n\r\n //Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'statusMsg: Player initialized.'. Current value: 'statusMsg: Fetching session info...'.\r\n // params.subscribe seems not to be asynchronous\r\n\r\n // this.sm.statusAlertType='info';\r\n // this.sm.statusMsg = 'Fetching session info...';\r\n // this.sm.statusWaiting=true;\r\n let sessObs= this.sessionService.sessionObserver(sessionId);\r\n\r\n if(sessObs) {\r\n sessObs.subscribe(sess => {\r\n //this.setSession(sess);\r\n this.statusAlertType='info';\r\n this.statusMsg = 'Received session info.';\r\n this.statusWaiting=false;\r\n this.session=sess;\r\n if (sess.project) {\r\n //console.debug(\"Session associated project: \"+sess.project)\r\n this.projectService.projectObservable(sess.project).subscribe(project=>{\r\n this.project=project;\r\n this.fetchRecordings(sess);\r\n },reason =>{\r\n this.statusMsg=reason;\r\n this.statusAlertType='error';\r\n this.statusWaiting=false;\r\n console.error(\"Error fetching project config: \"+reason)\r\n });\r\n\r\n } else {\r\n console.info(\"Session has no associated project. Using default configuration.\")\r\n }\r\n },\r\n (reason) => {\r\n this.statusMsg = reason;\r\n this.statusAlertType = 'error';\r\n this.statusWaiting=false;\r\n console.error(\"Error fetching session \" + reason)\r\n });\r\n }\r\n }\r\n\r\n fetchRecordings(sess:Session){\r\n this.statusAlertType='info';\r\n this.statusMsg = 'Fetching infos of recordings...';\r\n this.statusWaiting=true;\r\n let prNm:string|null=null;\r\n if(this.project) {\r\n let rfsObs = this.recFileService.recordingFileList(this.project.name, sess.sessionId);\r\n rfsObs.subscribe((rfs: Array<RecordingFile>) => {\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Received infos of recordings.';\r\n this.statusWaiting = false;\r\n if (rfs) {\r\n if (rfs instanceof Array) {\r\n rfs.forEach((rf) => {\r\n if(rf.startedDate){\r\n rf._startedAsDateObj=new Date(rf.startedDate);\r\n }\r\n if(rf.date){\r\n rf._dateAsDateObj=new Date(rf.date);\r\n }\r\n this.recorderCombiPane.push(rf);\r\n })\r\n } else {\r\n console.error('Expected type array for list of already recorded files ')\r\n }\r\n\r\n } else {\r\n //console.debug(\"Recording file list: \" + rfs);\r\n }\r\n }, () => {\r\n // Failed fetching existing, but we start the session anyway\r\n this.start()\r\n }, () => {\r\n // Normal start\r\n this.start()\r\n })\r\n }else{\r\n // No project def -> error\r\n this.statusAlertType = 'error';\r\n this.statusMsg = 'No project definiton.';\r\n this.statusWaiting = false;\r\n console.error(this.statusMsg);\r\n }\r\n }\r\n\r\n\r\n set project(project: Project|null) {\r\n this._project = project;\r\n let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;\r\n\r\n if (project) {\r\n console.info(\"Project name: \" + project.name)\r\n this.audioDevices = project.audioDevices;\r\n chCnt = ProjectUtil.audioChannelCount(project);\r\n console.info(\"Project requested recording channel count: \" + chCnt);\r\n this.autoGainControlConfigs=project.autoGainControlConfigs;\r\n } else {\r\n console.error(\"Empty project configuration!\")\r\n }\r\n this.channelCount = chCnt;\r\n }\r\n\r\n get project():Project|null{\r\n return this._project;\r\n }\r\n\r\n selectRecordingFile(rf:RecordingFile){\r\n this.displayRecFile=rf;\r\n }\r\n\r\n uploadUpdate(ue: UploaderStatusChangeEvent) {\r\n let upStatus = ue.status;\r\n this.dataSaved = (UploaderStatus.DONE === upStatus);\r\n let percentUpl = ue.percentDone();\r\n if (UploaderStatus.ERR === upStatus) {\r\n this.uploadStatus = 'warn'\r\n } else {\r\n if (percentUpl < 50) {\r\n this.uploadStatus = 'accent'\r\n } else {\r\n this.uploadStatus = 'success'\r\n }\r\n this.uploadProgress = percentUpl;\r\n }\r\n\r\n this.changeDetectorRef.detectChanges()\r\n }\r\n\r\n set controlAudioPlayer(controlAudioPlayer: AudioPlayer) {\r\n if (this._controlAudioPlayer) {\r\n //this._controlAudioPlayer.listener=null;\r\n }\r\n this._controlAudioPlayer = controlAudioPlayer;\r\n if (this._controlAudioPlayer) {\r\n this._controlAudioPlayer.listener = this;\r\n }\r\n }\r\n\r\n get controlAudioPlayer(): AudioPlayer {\r\n return this._controlAudioPlayer;\r\n }\r\n\r\n update(e: AudioPlayerEvent) {\r\n if (e.type == EventType.STARTED) {\r\n this.playStartAction.disabled = true;\r\n this.updateTimerId = window.setInterval(() => {\r\n //this.audioSignal.playFramePosition = this.ap.playPositionFrames;\r\n }, 50);\r\n } else if (e.type == EventType.STOPPED || e.type == EventType.ENDED) {\r\n window.clearInterval(this.updateTimerId);\r\n // this.audioSignal.playFramePosition = this.ap.playPositionFrames;\r\n this.playStartAction.disabled = (!(this.displayRecFile));\r\n\r\n }\r\n }\r\n\r\n startDisabled() {\r\n return !this.transportActions || this.readonly || this.transportActions.startAction.disabled\r\n }\r\n\r\n stopDisabled() {\r\n return !this.transportActions || this.transportActions.stopAction.disabled\r\n }\r\n\r\n startStopNextName():string{\r\n if(!this.startDisabled()){\r\n this.startStopNextButtonName=\"Start\"\r\n }else if(!this.stopDisabled()) {\r\n this.startStopNextButtonName = \"Stop\"\r\n }\r\n return this.startStopNextButtonName;\r\n }\r\n startStopNextIconName():string{\r\n if(!this.startDisabled()){\r\n this.startStopNextButtonIconName=\"fiber_manual_record\"\r\n }else if(!this.stopDisabled()){\r\n this.startStopNextButtonIconName=\"stop\"\r\n }\r\n return this.startStopNextButtonIconName\r\n }\r\n startStopNextIconColor():string{\r\n if(!this.startDisabled()){\r\n return \"red\"\r\n }else if(!this.stopDisabled()){\r\n return \"yellow\"\r\n }else{\r\n return \"grey\";\r\n }\r\n }\r\n\r\n startStopPerform(){\r\n if(!this.startDisabled()){\r\n this.transportActions.startAction.perform();\r\n }else if(!this.stopDisabled()){\r\n this.transportActions.stopAction.perform();\r\n }\r\n }\r\n\r\n startItem() {\r\n this.transportActions.startAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n if (this.readonly) {\r\n return\r\n }\r\n this.transportActions.fwdAction.disabled = true\r\n this.transportActions.fwdNextAction.disabled = true\r\n this.transportActions.bwdAction.disabled = true\r\n this.displayRecFile = null;\r\n this.displayRecFileVersion = 0;\r\n this.displayAudioClip = null;\r\n this.showRecording();\r\n\r\n if (this.ac) {\r\n if (!this.ac.opened) {\r\n if (this._selectedDeviceId) {\r\n console.log(\"Open session with audio device Id: \\'\" + this._selectedDeviceId + \"\\' for \" + this._channelCount + \" channels\");\r\n } else {\r\n console.log(\"Open session with default audio device for \" + this._channelCount + \" channels\");\r\n }\r\n this.ac.open(this._channelCount, this._selectedDeviceId,this._autoGainControlConfigs);\r\n } else {\r\n this.ac.start();\r\n }\r\n }\r\n }\r\n\r\n\r\n downloadRecording() {\r\n if (this.displayRecFile) {\r\n let ab: AudioBuffer | null = this.displayRecFile.audioBuffer;\r\n let ww = new WavWriter();\r\n if (ab) {\r\n let wavFile = ww.writeAsync(ab, (wavFile) => {\r\n let blob = new Blob([wavFile], {type: 'audio/wav'});\r\n let rfUrl = URL.createObjectURL(blob);\r\n\r\n let dataDnlLnk = this.renderer.createElement('a');\r\n //dataDnlLnk.name = 'Recording';\r\n dataDnlLnk.href = rfUrl;\r\n\r\n this.renderer.appendChild(document.body, dataDnlLnk);\r\n\r\n // download property not yet in TS def\r\n if (this.displayRecFile) {\r\n let fn = this.displayRecFile.filenameString();\r\n fn += '_' + this.displayRecFileVersion;\r\n fn += '.wav';\r\n dataDnlLnk.download = fn;\r\n dataDnlLnk.click();\r\n }\r\n this.renderer.removeChild(document.body, dataDnlLnk);\r\n });\r\n }\r\n }\r\n }\r\n\r\n set displayRecFile(displayRecFile: RecordingFile | null) {\r\n this._displayRecFile = displayRecFile;\r\n if (this._displayRecFile) {\r\n let ab: AudioBuffer| null = this._displayRecFile.audioBuffer;\r\n if(ab) {\r\n this.displayAudioClip = new AudioClip(ab);\r\n this.controlAudioPlayer.audioClip = this.displayAudioClip;\r\n }else {\r\n // clear for now ...\r\n this.displayAudioClip = null;\r\n this.controlAudioPlayer.audioClip = null;\r\n\r\n if (this._controlAudioPlayer && this._session) {\r\n //... and try to fetch from server\r\n this.audioFetchSubscription = this.recFileService.fetchAndApplyRecordingFile(this._controlAudioPlayer.context, this._session.project, this._displayRecFile).subscribe((rf) => {\r\n let fab = null;\r\n if (rf && this._displayRecFile) {\r\n fab = this._displayRecFile.audioBuffer;\r\n } else {\r\n this.statusMsg = 'Recording file could not be loaded.'\r\n this.statusAlertType = 'error'\r\n }\r\n if (fab){\r\n this.displayAudioClip = new AudioClip(fab);\r\n }\r\n this.controlAudioPlayer.audioClip =this.displayAudioClip\r\n this.showRecording();\r\n\r\n }, err => {\r\n console.error(\"Could not load recording file from server: \" + err)\r\n this.statusMsg = 'Recording file could not be loaded: ' + err\r\n this.statusAlertType = 'error'\r\n })\r\n }else{\r\n this.statusMsg = 'Recording file could not be decoded. Audio context unavailable.'\r\n this.statusAlertType = 'error'\r\n }\r\n }\r\n\r\n } else {\r\n this.displayAudioClip = null;\r\n this.controlAudioPlayer.audioClip = null;\r\n }\r\n this.showRecording();\r\n }\r\n\r\n get displayRecFile(): RecordingFile | null {\r\n return this._displayRecFile;\r\n }\r\n\r\n showRecording() {\r\n this.controlAudioPlayer.stop();\r\n\r\n if (this.displayAudioClip) {\r\n\r\n this.levelMeasure.calcBufferLevelInfos(this.displayAudioClip.buffer, LEVEL_BAR_INTERVALL_SECONDS).then((levelInfos) => {\r\n this.displayLevelInfos = levelInfos;\r\n this.changeDetectorRef.detectChanges();\r\n });\r\n this.playStartAction.disabled = false;\r\n\r\n } else {\r\n\r\n // TODO\r\n // Setting to null does not trigger a change if it was null before (happens after nextitem() in AUTOPROGRESS mode)\r\n // The level bar display does not clear, it shows the last captured stream\r\n this.displayLevelInfos = null;\r\n\r\n this.playStartAction.disabled = true;\r\n\r\n // Collapse audio signal display if open\r\n if (!this.audioSignalCollapsed) {\r\n this.audioSignalCollapsed = true;\r\n }\r\n }\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n updateStartActionDisableState(){\r\n this.transportActions.startAction.disabled=!(this.ac);\r\n }\r\n\r\n start() {\r\n super.start();\r\n this.recorderCombiPane.selectTop();\r\n this.enableNavigation();\r\n this.updateStartActionDisableState();\r\n }\r\n\r\n isRecording(): boolean {\r\n return (this.status === Status.RECORDING);\r\n }\r\n\r\n isActive(): boolean{\r\n return (!(this.status === Status.BLOCKED || this.status=== Status.IDLE || this.status===Status.ERROR) || this.processingRecording || this.sessionService.uploadCount>0)\r\n }\r\n\r\n private updateNavigationActions(){\r\n\r\n this.transportActions.fwdAction.disabled = this.navigationDisabled;\r\n this.transportActions.bwdAction.disabled = this.navigationDisabled;\r\n }\r\n\r\n enableStartUserGesture() {\r\n super.enableStartUserGesture();\r\n this.transportActions.startAction.disabled=!(this.ac);\r\n }\r\n\r\n enableNavigation(){\r\n this.navigationDisabled=false;\r\n this.updateNavigationActions();\r\n }\r\n\r\n opened() {\r\n if(this.ac) {\r\n this.ac.start();\r\n }\r\n }\r\n\r\n started() {\r\n this.startedDate=new Date();\r\n this.transportActions.startAction.disabled = true;\r\n\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Recording...';\r\n\r\n let maxRecordingTimeMs = MAX_RECORDING_TIME_MS;\r\n this.maxRecTimerId = window.setTimeout(() => {\r\n this.stopRecordingMaxRec()\r\n }, maxRecordingTimeMs);\r\n this.maxRecTimerRunning = true;\r\n\r\n this.status = Status.RECORDING;\r\n this.transportActions.stopAction.disabled = false;\r\n }\r\n\r\n stopItem() {\r\n\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.status = Status.STOPPING_STOP;\r\n this.stopRecording();\r\n\r\n }\r\n\r\n stopRecording() {\r\n if (this.maxRecTimerRunning && this.maxRecTimerId!=null) {\r\n window.clearTimeout(this.maxRecTimerId);\r\n this.maxRecTimerRunning = false;\r\n }\r\n if(this.ac) {\r\n this.ac.stop();\r\n }\r\n }\r\n\r\n stopRecordingMaxRec(){\r\n\r\n this.maxRecTimerRunning = false;\r\n this.status = Status.STOPPING_STOP;\r\n if(this.ac) {\r\n this.ac.stop();\r\n }\r\n }\r\n\r\n // addRecordingFileByDescriptor(rfd:RecordingFileDescriptorImpl){\r\n // let prIdx=0;\r\n // if(this.items) {\r\n // let it = this.items[prIdx];\r\n // if (it) {\r\n // if (!it.recs) {\r\n // it.recs = new Array<SprRecordingFile>();\r\n // }\r\n //\r\n // } else {\r\n // //console.debug(\"WARN: No recording item with code: \\\"\" +rfd.recording.itemcode+ \"\\\" found.\");\r\n // }\r\n // }\r\n // }\r\n //\r\n // addRecordingFileByPromptIndex(promptIndex:number, rf:SprRecordingFile){\r\n //\r\n // }\r\n\r\n\r\n stopped() {\r\n this.updateStartActionDisableState()\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Recorded.';\r\n\r\n let ad:AudioBuffer;\r\n if(this.ac) {\r\n ad = this.ac.audioBuffer();\r\n let sessId: string | number = 0;\r\n if(this._session){\r\n sessId=this._session.sessionId;\r\n }\r\n let rf = new RecordingFile(UUID.generate(),sessId,ad);\r\n rf._startedAsDateObj=this.startedDate;\r\n if(rf._startedAsDateObj) {\r\n rf.startedDate = rf._startedAsDateObj.toString();\r\n }\r\n let apiEndPoint = '';\r\n\r\n if (this.config && this.config.apiEndPoint) {\r\n apiEndPoint = this.config.apiEndPoint;\r\n }\r\n if (apiEndPoint !== '') {\r\n apiEndPoint = apiEndPoint + '/'\r\n }\r\n\r\n let sessionsUrl = apiEndPoint + SessionService.SESSION_API_CTX;\r\n let recUrl: string = sessionsUrl + '/' + rf.session + '/' + RECFILE_API_CTX + '/' + rf.uuid;\r\n //\r\n //\r\n //\r\n // // convert asynchronously to 16-bit integer PCM\r\n // // TODO could we avoid conversion to save CPU resources and transfer float PCM directly?\r\n // // TODO duplicate conversion for manual download\r\n // //console.log(\"Build wav writer...\");\r\n this.processingRecording=true\r\n let ww = new WavWriter();\r\n ww.writeAsync(ad, (wavFile) => {\r\n //this.postRecording(wavFile, recUrl);\r\n //rf._dateAsDateObj=new Date();\r\n rf.frames=ad.length;\r\n this.displayRecFile=rf;\r\n //this.recordingListComp.recordingList.push(rf);\r\n this.recorderCombiPane.push(rf);\r\n this.postRecordingMultipart(wavFile, rf.uuid,rf.session,rf._startedAsDateObj,recUrl);\r\n this.processingRecording=false;\r\n this.changeDetectorRef.detectChanges();\r\n });\r\n // }\r\n }\r\n\r\n // check complete session\r\n let complete = true;\r\n\r\n let autoStart = (this.status === Status.STOPPING_STOP);\r\n this.status = Status.IDLE;\r\n let startNext=false;\r\n\r\n this.navigationDisabled = false;\r\n this.updateNavigationActions();\r\n\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n postRecording(wavFile: Uint8Array, recUrl: string) {\r\n let wavBlob = new Blob([wavFile], {type: 'audio/wav'});\r\n let ul = new Upload(wavBlob, recUrl);\r\n this.uploader.queueUpload(ul);\r\n }\r\n\r\n postRecordingMultipart(wavFile: Uint8Array, uuid:string|null,sessionId:string|number|null,startedDate:Date|null|undefined,recUrl: string) {\r\n let wavBlob = new Blob([wavFile], {type: 'audio/wav'});\r\n\r\n let fd=new FormData();\r\n if(uuid) {\r\n fd.set('uuid', uuid);\r\n }\r\n if(sessionId!==null) {\r\n fd.set('sessionId', sessionId.toString());\r\n }\r\n if(startedDate){\r\n fd.set('startedDate',startedDate.toJSON());\r\n }\r\n fd.set('audio',wavBlob);\r\n let ul = new Upload(fd, recUrl);\r\n this.uploader.queueUpload(ul);\r\n }\r\n\r\n stop() {\r\n if(this.ac) {\r\n this.ac.close();\r\n }\r\n }\r\n\r\n private updateControlPlaybackPosition() {\r\n if (this._controlAudioPlayer.playPositionFrames) {\r\n this.recorderCombiPane.audioDisplay.playFramePosition = this._controlAudioPlayer.playPositionFrames;\r\n this.liveLevelDisplay.playFramePosition = this._controlAudioPlayer.playPositionFrames;\r\n }\r\n }\r\n\r\n audioPlayerUpdate(e: AudioPlayerEvent) {\r\n if (EventType.READY === e.type) {\r\n\r\n } else if (EventType.STARTED === e.type) {\r\n //this.status = 'Playback...';\r\n this.updateTimerId = window.setInterval(() => this.updateControlPlaybackPosition(), 50);\r\n\r\n } else if (EventType.ENDED === e.type) {\r\n //.status='Ready.';\r\n window.clearInterval(this.updateTimerId);\r\n\r\n }\r\n\r\n if(!this.destroyed) {\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n }\r\n}\r\n\r\n","import {ModuleWithProviders, NgModule} from '@angular/core';\r\nimport {SpeechrecorderngComponent} from \"./speechrecorderng.component\";\r\nimport {SimpleTrafficLight} from \"./speechrecorder/startstopsignal/ui/simpletrafficlight\";\r\n\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {Progress} from \"./speechrecorder/session/progress\";\r\nimport {\r\n PromptContainer, Prompter, Prompting, PromptingContainer, Recinstructions,\r\n} from \"./speechrecorder/session/prompting\";\r\nimport {SessionManager} from \"./speechrecorder/session/sessionmanager\";\r\nimport {WarningBar} from \"./speechrecorder/session/warning_bar\";\r\nimport {ScrollIntoViewDirective} from \"./utils/scrollIntoViewToBottom\";\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatDialogModule } from \"@angular/material/dialog\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatProgressBarModule } from \"@angular/material/progress-bar\";\r\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport {HttpClientModule} from \"@angular/common/http\";\r\nimport {SessionService} from \"./speechrecorder/session/session.service\";\r\nimport {ScriptService} from \"./speechrecorder/script/script.service\";\r\nimport {RouterModule, Routes} from \"@angular/router\";\r\nimport {SpeechRecorderConfig, SPEECHRECORDER_CONFIG} from \"./spr.config\";\r\nimport {SpeechRecorderUploader} from \"./speechrecorder/spruploader\";\r\nimport {ProjectService} from \"./speechrecorder/project/project.service\";\r\nimport {\r\n ControlPanel,\r\n ProgressDisplay,\r\n ReadyStateIndicator,\r\n StatusDisplay,\r\n TransportPanel,\r\n UploadStatus\r\n} from \"./speechrecorder/session/controlpanel\";\r\nimport {FlexLayoutModule} from \"@angular/flex-layout\";\r\nimport {SessionFinishedDialog} from \"./speechrecorder/session/session_finished_dialog\";\r\nimport {MessageDialog} from \"./ui/message_dialog\";\r\nimport {RecordingItemControls, RecordingItemDisplay} from \"./ui/recordingitem_display\";\r\nimport {RecordingService} from \"./speechrecorder/recordings/recordings.service\";\r\nimport {ScrollPaneHorizontal} from \"./audio/ui/scroll_pane_horizontal\";\r\nimport {AudioClipUIContainer} from \"./audio/ui/container\";\r\nimport {AudioSignal} from \"./audio/ui/audiosignal\";\r\nimport {Sonagram} from \"./audio/ui/sonagram\";\r\nimport {AudioDisplayPlayer} from \"./audio/audio_player\";\r\nimport {AudioDisplay} from \"./audio/audio_display\";\r\nimport {AudioDisplayControl} from \"./audio/ui/audio_display_control\";\r\nimport {LevelBar} from \"./audio/ui/livelevel\";\r\nimport {AudioDisplayScrollPane} from \"./audio/ui/audio_display_scroll_pane\";\r\nimport {UUID} from \"./utils/utils\";\r\nimport {MatCheckboxModule} from \"@angular/material/checkbox\";\r\nimport {MatCard, MatCardModule} from \"@angular/material/card\";\r\nimport {MatDividerModule} from \"@angular/material/divider\";\r\nimport {MatGridListModule} from \"@angular/material/grid-list\";\r\nimport {RecordingFileUI} from \"./speechrecorder/session/recordingfile/recording-file-u-i.component\";\r\nimport {RecordingFileService} from \"./speechrecorder/session/recordingfile/recordingfile-service\";\r\nimport {RecordingFileViewComponent} from \"./speechrecorder/session/recordingfile/recording-file-view.component\";\r\nimport {MatTableModule} from \"@angular/material/table\";\r\nimport { RecordingFileNaviComponent } from './speechrecorder/session/recordingfile/recording-file-navi.component';\r\nimport {RecordingFileMetaComponent} from \"./speechrecorder/session/recordingfile/recording-file-meta.component\";\r\nimport {MatSelectModule} from \"@angular/material/select\";\r\nimport {MatInputModule} from \"@angular/material/input\";\r\nimport {MatSnackBarModule} from \"@angular/material/snack-bar\";\r\nimport {AudioRecorder} from \"./speechrecorder/session/audiorecorder\";\r\nimport {RecordingList} from \"./speechrecorder/session/recording_list\";\r\nimport {RecorderCombiPane} from \"./speechrecorder/session/recorder_combi_pane\";\r\n\r\n\r\n\r\nexport const SPR_ROUTES: Routes = [\r\n { path: 'spr/session/:id', component: SpeechrecorderngComponent },\r\n { path: 'recorder', component: AudioRecorder },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_view/:recordingFileId', component: RecordingFileViewComponent },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_edit/:recordingFileId', component: RecordingFileUI },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_view', component: RecordingFileViewComponent },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_edit', component: RecordingFileUI },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile/:recordingFileId', component: RecordingFileUI },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile', component: RecordingFileUI },\r\n { path: 'spr/db/recordingfile/_view/:recordingFileId', component: RecordingFileViewComponent },\r\n { path: 'spr/db/recordingfile/_edit/:recordingFileId', component: RecordingFileUI },\r\n { path: 'spr/db/recordingfile/_view/', component: RecordingFileViewComponent },\r\n { path: 'spr/db/recordingfile/_view', component: RecordingFileViewComponent },\r\n { path: 'spr/db/recordingfile/_edit', component: RecordingFileUI },\r\n { path: 'spr/db/recordingfile/:recordingFileId', component: RecordingFileUI },\r\n { path: 'spr/db/recordingfile', component: RecordingFileUI },\r\n { path: 'spr', component: SpeechrecorderngComponent }\r\n];\r\n\r\n@NgModule({\r\n declarations: [AudioSignal, Sonagram, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, Progress, SimpleTrafficLight, Recinstructions, Prompter, PromptContainer, PromptingContainer, Prompting, StatusDisplay,\r\n ProgressDisplay, RecordingItemDisplay, RecordingItemControls, UploadStatus, TransportPanel, ReadyStateIndicator, ControlPanel, WarningBar, AudioRecorder,SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent,RecordingList,RecorderCombiPane,AudioRecorder],\r\n exports: [MessageDialog, SpeechrecorderngComponent, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar,AudioRecorder],\r\n imports: [RouterModule.forChild(SPR_ROUTES), FlexLayoutModule, CommonModule, MatIconModule, MatButtonModule, MatDialogModule, MatProgressBarModule, MatProgressSpinnerModule, MatTooltipModule, HttpClientModule, MatCheckboxModule, MatCardModule, MatDividerModule, MatGridListModule, MatTableModule, MatInputModule, MatSelectModule, MatSnackBarModule],\r\n providers: [SessionService, ProjectService, ScriptService, RecordingService, RecordingFileService, SpeechRecorderUploader]\r\n})\r\nexport class SpeechrecorderngModule{\r\n\r\n static forRoot(config: SpeechRecorderConfig): ModuleWithProviders<SpeechrecorderngModule> {\r\n return {\r\n ngModule: SpeechrecorderngModule,\r\n providers: [\r\n {provide: SPEECHRECORDER_CONFIG, useValue: config }\r\n ]\r\n };\r\n }\r\n}\r\n","export const VERSION='2.23.2'","/*\r\n * Public API Surface of speechrecorderng\r\n */\r\n\r\n\r\nimport {AudioDisplayControl} from \"./lib/audio/ui/audio_display_control\";\r\n\r\nexport {SpeechrecorderngModule} from './lib/speechrecorderng.module'\r\nexport {VERSION} from './lib/spr.module.version'\r\nexport {SPEECHRECORDER_CONFIG} from './lib/spr.config'\r\n\r\nexport {UUID} from \"./lib/utils/utils\"\r\nexport {Action} from \"./lib/action/action\";\r\n\r\nexport {MessageDialog} from \"./lib/ui/message_dialog\"\r\n\r\nexport {AudioClip,Selection} from './lib/audio/persistor'\r\nexport {AudioPlayer, AudioPlayerListener, AudioPlayerEvent, EventType} from './lib/audio/playback/player'\r\nexport {AudioRecorder} from './lib/speechrecorder/session/audiorecorder'\r\nexport {AudioDisplay} from './lib/audio/audio_display'\r\nexport {AudioDisplayPlayer} from './lib/audio/audio_player'\r\nexport {AudioClipUIContainer} from './lib/audio/ui/container'\r\nexport {ScrollPaneHorizontal} from './lib/audio/ui/scroll_pane_horizontal'\r\nexport {AudioDisplayScrollPane} from \"./lib/audio/ui/audio_display_scroll_pane\";\r\nexport {AudioContextProvider} from \"./lib/audio/context\";\r\nexport {AudioDisplayControl} from \"./lib/audio/ui/audio_display_control\"\r\nexport {LevelBar} from './lib/audio/ui/livelevel'\r\n\r\nexport {ProjectService} from './lib/speechrecorder/project/project.service'\r\nexport {Session} from './lib/speechrecorder/session/session'\r\nexport {SessionService} from './lib/speechrecorder/session/session.service'\r\nexport {ScriptService} from './lib/speechrecorder/script/script.service'\r\nexport {Script,Section,Group,PromptItem,Mediaitem,PromptPhase,Mode} from './lib/speechrecorder/script/script'\r\nexport {RecordingService} from './lib/speechrecorder/recordings/recordings.service'\r\nexport {SprRecordingFile} from './lib/speechrecorder/recording'\r\nexport {RecordingFileService} from './lib/speechrecorder/session/recordingfile/recordingfile-service'\r\nexport {RecordingFileViewComponent} from './lib/speechrecorder/session/recordingfile/recording-file-view.component'\r\nexport {RecordingFileUI} from './lib/speechrecorder/session/recordingfile/recording-file-u-i.component'\r\nexport {SpeechRecorderConfig,ApiType} from './lib/spr.config'\r\nexport {SpeechrecorderngComponent} from './lib/speechrecorderng.component'\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Browser","Platform","CfgPlatform","UploadStatus","Item","DEFAULT_WARN_DB_LEVEL","MIN_DB_LEVEL","PlaybackEventType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"speechrecorderng.mjs","sources":["../../../projects/speechrecorderng/src/lib/action/action.ts","../../../projects/speechrecorderng/src/lib/audio/playback/player.ts","../../../projects/speechrecorderng/src/lib/utils/ua-parser.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/project/project.ts","../../../projects/speechrecorderng/src/lib/audio/capture/capture.ts","../../../projects/speechrecorderng/src/lib/audio/impl/wavformat.ts","../../../projects/speechrecorderng/src/lib/io/BinaryWriter.ts","../../../projects/speechrecorderng/src/lib/utils/utils.ts","../../../projects/speechrecorderng/src/lib/audio/impl/wavwriter.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/script/script.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/recording.ts","../../../projects/speechrecorderng/src/lib/net/uploader.ts","../../../projects/speechrecorderng/src/lib/spr.config.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/project/project.service.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/session.service.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.ts","../../../projects/speechrecorderng/src/lib/math/2d/geometry.ts","../../../projects/speechrecorderng/src/lib/ui/canvas_layer_comp.ts","../../../projects/speechrecorderng/src/lib/audio/persistor.ts","../../../projects/speechrecorderng/src/lib/audio/ui/common.ts","../../../projects/speechrecorderng/src/lib/audio/ui/audio_canvas_layer_comp.ts","../../../projects/speechrecorderng/src/lib/audio/ui/audiosignal.ts","../../../projects/speechrecorderng/src/lib/math/complex.ts","../../../projects/speechrecorderng/src/lib/math/dft.ts","../../../projects/speechrecorderng/src/lib/dsp/utils.ts","../../../projects/speechrecorderng/src/lib/math/utils.ts","../../../projects/speechrecorderng/src/lib/utils/css_utils.ts","../../../projects/speechrecorderng/src/lib/audio/ui/sonagram.ts","../../../projects/speechrecorderng/src/lib/audio/ui/container.ts","../../../projects/speechrecorderng/src/lib/audio/ui/audio_display_scroll_pane.ts","../../../projects/speechrecorderng/src/lib/audio/ui/audio_display_control.ts","../../../projects/speechrecorderng/src/lib/audio/audio_display.ts","../../../projects/speechrecorderng/src/lib/utils/scrollIntoViewToBottom.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/progress.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/prompting.ts","../../../projects/speechrecorderng/src/lib/io/stream.ts","../../../projects/speechrecorderng/src/lib/audio/io/stream.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/session_finished_dialog.ts","../../../projects/speechrecorderng/src/lib/ui/message_dialog.ts","../../../projects/speechrecorderng/src/lib/audio/context.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/item.ts","../../../projects/speechrecorderng/src/lib/audio/ui/livelevel.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/controlpanel.ts","../../../projects/speechrecorderng/src/lib/audio/dsp/level_measure.ts","../../../projects/speechrecorderng/src/lib/ui/recordingitem_display.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/basicrecorder.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/recordings/recordings.service.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/spruploader.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/warning_bar.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/sessionmanager.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/script/script.service.ts","../../../projects/speechrecorderng/src/lib/speechrecorderng.component.ts","../../../projects/speechrecorderng/src/lib/audio/ui/scroll_pane_horizontal.ts","../../../projects/speechrecorderng/src/lib/audio/audio_player.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recording-file.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recordingfile-service.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recording-file-meta.component.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recording-file-navi.component.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recording-file-view.component.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.ts","../../../projects/speechrecorderng/src/lib/media/utils.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recording_list.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/recorder_combi_pane.ts","../../../projects/speechrecorderng/src/lib/speechrecorder/session/audiorecorder.ts","../../../projects/speechrecorderng/src/lib/speechrecorderng.module.ts","../../../projects/speechrecorderng/src/lib/spr.module.version.ts","../../../projects/speechrecorderng/src/public-api.ts","../../../projects/speechrecorderng/src/speechrecorderng.ts"],"sourcesContent":["\r\n export class ActionEvent<T> {\r\n get value(): T|null {\r\n return this._value;\r\n }\r\n constructor(private _value:T|null=null) {\r\n\r\n }\r\n }\r\n\r\n export interface ActionEventListener<T>{\r\n (ae:ActionEvent<T>):void;\r\n }\r\n\r\n export class Action<T> {\r\n get value(): T|null {\r\n return this._value;\r\n }\r\n\r\n private _name:string;\r\n private _value:T|null;\r\n _disabled=true;\r\n private _onAction:ActionEventListener<T>|null=null;\r\n listeners:Array<ActionEventListener<T>>;\r\n private controls:HTMLInputElement[];\r\n\r\n constructor(name:string,value:T|null=null) {\r\n this._name = name;\r\n this._value=value\r\n this.listeners = new Array<ActionEventListener<T>>();\r\n this.controls = [];\r\n }\r\n\r\n get name():string {\r\n return this._name;\r\n }\r\n\r\n\r\n get onAction():ActionEventListener<T>|null {\r\n return this._onAction;\r\n }\r\n\r\n set onAction(value:ActionEventListener<T>|null) {\r\n this._onAction = value;\r\n }\r\n\r\n protected createActionEvent(value: T|null=null):ActionEvent<T> {\r\n // default:\r\n return new ActionEvent(value);\r\n }\r\n\r\n perform(value: T|null=null):void {\r\n this._value=value\r\n if (!this.disabled && this._onAction) {\r\n let ae=this.createActionEvent(value)\r\n this._onAction(ae);\r\n }\r\n }\r\n\r\n set disabled(disabled:boolean) {\r\n this._disabled = disabled;\r\n for (let c of this.controls) {\r\n c.disabled = this._disabled;\r\n }\r\n //let disStr=this.disabled?\"disabled\":\"enabled\";\r\n //console.log(this._name+\": \"+disStr);\r\n }\r\n\r\n get disabled():boolean {\r\n return this._disabled;\r\n }\r\n\r\n addControl(ctrl: HTMLInputElement, actionEventName?: string) {\r\n if (ctrl) {\r\n if (this.controls.indexOf(ctrl) < 0) {\r\n ctrl.disabled = this.disabled;\r\n this.controls.push(ctrl);\r\n if (actionEventName) {\r\n ctrl.addEventListener(actionEventName, (e) => {\r\n this.perform();\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n removeControl(ctrl:HTMLInputElement) {\r\n var i = this.controls.indexOf(ctrl);\r\n if (i >= 0) {\r\n this.controls = this.controls.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n","import { Action } from '../../action/action'\r\nimport { AudioClip } from '../persistor'\r\n\r\n export enum EventType {CLOSED,READY,STARTED,POS_UPDATE, STOPPED, ENDED}\r\n\r\n export class AudioPlayerEvent{\r\n\r\n private _type:EventType;\r\n private _timePosition:number | undefined;\r\n\r\n constructor(type:EventType, timePosition?:number) {\r\n this._type = type;\r\n this._timePosition = timePosition;\r\n }\r\n\r\n get type() {\r\n return this._type;\r\n }\r\n\r\n get timePosition() {\r\n return this._timePosition;\r\n }\r\n }\r\n export interface AudioPlayerListener {\r\n audioPlayerUpdate(e:AudioPlayerEvent):void;\r\n }\r\n\r\n export class AudioPlayer {\r\n get autoPlayOnSelectToggleAction(): Action<boolean> {\r\n return this._autoPlayOnSelectToggleAction;\r\n }\r\n public static DEFAULT_BUFSIZE:number = 8192;\r\n private running=false;\r\n private _startAction:Action<void>;\r\n private _startSelectionAction:Action<void>;\r\n private _autoPlayOnSelectToggleAction:Action<boolean>\r\n private _stopAction:Action<void>;\r\n bufSize:number;\r\n context:AudioContext;\r\n listener:AudioPlayerListener;\r\n _audioClip:AudioClip|null=null;\r\n _audioBuffer:AudioBuffer | null=null;\r\n sourceBufferNode:AudioBufferSourceNode|null=null;\r\n buffPos:number;\r\n private zeroBufCnt:number;\r\n n:any;\r\n zb:Float32Array;\r\n private playStartTime:number|null=null;\r\n\r\n private timerVar:number|null=null;\r\n\r\n constructor(context:AudioContext, listener:AudioPlayerListener) {\r\n this.context=context;\r\n this.listener=listener;\r\n this.bufSize = AudioPlayer.DEFAULT_BUFSIZE;\r\n this.n=navigator;\r\n this.buffPos=0;\r\n this.zeroBufCnt=0;\r\n this.zb = new Float32Array(this.bufSize);\r\n this._startAction = new Action('Start');\r\n this._startAction.disabled = true;\r\n this._startAction.onAction = ()=>this.start();\r\n this._startSelectionAction=new Action('Start selected')\r\n this._startSelectionAction.disabled=true\r\n this._startSelectionAction.onAction = ()=>this.startSelected();\r\n this._autoPlayOnSelectToggleAction=new Action<boolean>(\"Autoplay on select\",false);\r\n this._stopAction = new Action('Stop');\r\n this._stopAction.disabled = true;\r\n this._stopAction.onAction = ()=>this.stop();\r\n }\r\n\r\n get startAction() {\r\n return this._startAction;\r\n }\r\n\r\n get startSelectionAction(){\r\n return this._startSelectionAction\r\n }\r\n\r\n get stopAction() {\r\n return this._stopAction;\r\n }\r\n\r\n set audioClip(audioClip:AudioClip| null) {\r\n\r\n var length = 0;\r\n var chs = 0;\r\n if (audioClip && audioClip.buffer) {\r\n chs = audioClip.buffer.numberOfChannels;\r\n if (chs > 0) {\r\n length = audioClip.buffer.length;\r\n if (chs > this.context.destination.maxChannelCount) {\r\n // TODO exception\r\n }\r\n }\r\n this.audioBuffer = audioClip.buffer;\r\n audioClip.addSelectionObserver((ac)=> {\r\n this._startSelectionAction.disabled = this.startSelectionDisabled()\r\n if (!this.startSelectionAction.disabled && this._autoPlayOnSelectToggleAction.value) {\r\n this.startSelected()\r\n }\r\n }\r\n )\r\n }else{\r\n this.audioBuffer=null;\r\n }\r\n this._audioClip=audioClip\r\n\r\n }\r\n\r\n set audioBuffer(audioBuffer:AudioBuffer | null) {\r\n this.stop();\r\n this._audioBuffer = audioBuffer;\r\n if (audioBuffer && this.context) {\r\n this._startAction.disabled = false;\r\n this._startSelectionAction.disabled=this.startSelectionDisabled()\r\n if(this.listener){\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.READY));\r\n }\r\n }else{\r\n this._startAction.disabled = true;\r\n this._startSelectionAction.disabled=true\r\n if(this.listener){\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.CLOSED));\r\n }\r\n }\r\n }\r\n get audioBuffer():AudioBuffer| null{\r\n return this._audioBuffer;\r\n }\r\n\r\n start() {\r\n if(!this._startAction.disabled && !this.running) {\r\n this.context.resume();\r\n this.sourceBufferNode = this.context.createBufferSource();\r\n this.sourceBufferNode.buffer = this._audioBuffer;\r\n this.sourceBufferNode.connect(this.context.destination);\r\n this.sourceBufferNode.onended = () => this.onended();\r\n\r\n this.playStartTime = this.context.currentTime;\r\n this.running=true;\r\n this.sourceBufferNode.start();\r\n\r\n this.playStartTime = this.context.currentTime;\r\n this._startAction.disabled = true;\r\n this._startSelectionAction.disabled=true\r\n this._stopAction.disabled = false;\r\n //this.timerVar = window.setInterval((e)=>this.updatePlayPosition(), 200);\r\n if (this.listener) {\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STARTED));\r\n }\r\n }\r\n }\r\n\r\n startSelectionDisabled(){\r\n return !(this._audioClip && this.context && !this.startAction.disabled && this._audioClip.selection )\r\n }\r\n\r\n startSelected() {\r\n if(!this._startAction.disabled && !this.running) {\r\n this.context.resume();\r\n this.sourceBufferNode = this.context.createBufferSource();\r\n\r\n this.sourceBufferNode.buffer = this._audioBuffer;\r\n this.sourceBufferNode.connect(this.context.destination);\r\n this.sourceBufferNode.onended = () => this.onended();\r\n\r\n this.playStartTime = this.context.currentTime;\r\n this.running=true;\r\n // unfortunately Web Audio API uses time values not frames\r\n let ac=this._audioClip\r\n let offset=0\r\n if(ac && ac.selection){\r\n let s=ac.selection\r\n let sr=ac.buffer.sampleRate\r\n offset=s.leftFrame/sr\r\n let stopPosInsecs=s.rightFrame/sr\r\n let dur=stopPosInsecs-offset\r\n // TODO check valid values\r\n this.sourceBufferNode.start(0,offset,dur)\r\n }else {\r\n this.sourceBufferNode.start();\r\n }\r\n this.playStartTime = this.context.currentTime-offset;\r\n this._startAction.disabled = true;\r\n this._startSelectionAction.disabled=true\r\n this._stopAction.disabled = false;\r\n //this.timerVar = window.setInterval((e)=>this.updatePlayPosition(), 200);\r\n if (this.listener) {\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STARTED));\r\n }\r\n }\r\n }\r\n\r\n stop(){\r\n if(this.running) {\r\n if (this.sourceBufferNode) {\r\n this.sourceBufferNode.stop();\r\n }\r\n if(this.timerVar!==null) {\r\n window.clearInterval(this.timerVar);\r\n }\r\n this.running=false;\r\n if (this.listener) {\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STOPPED));\r\n }\r\n }\r\n\r\n }\r\n\r\n onended() {\r\n if(this.timerVar!=null) {\r\n window.clearInterval(this.timerVar);\r\n }\r\n this._startAction.disabled = !(this.audioBuffer);\r\n this._startSelectionAction.disabled=this.startSelectionDisabled()\r\n this._stopAction.disabled = true;\r\n this.running=false;\r\n if (this.listener) {\r\n this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.ENDED));\r\n }\r\n }\r\n\r\n get playPositionTime():number|null {\r\n let ppt=null;\r\n if(this.playStartTime!==null) {\r\n ppt= this.context.currentTime - this.playStartTime;\r\n }\r\n return ppt;\r\n }\r\n\r\n get playPositionFrames():number|null {\r\n let ppFrs:number|null=null;\r\n if(this._audioBuffer ) {\r\n let ppTime = this.playPositionTime;\r\n if(ppTime!==null) {\r\n ppFrs = this._audioBuffer.sampleRate * ppTime;\r\n }\r\n }\r\n return ppFrs;\r\n }\r\n\r\n }\r\n\r\n","export class UserAgentComponent{\r\n constructor(public name:string,public version:string|null,public comment?:string) {\r\n\r\n }\r\n\r\n toString():string{\r\n let s='['+this.name+']';\r\n if(this.version){\r\n s=s+' ['+this.version+']';\r\n }\r\n if(this.comment){\r\n s=s+' ['+this.comment+']';\r\n }\r\n return s;\r\n }\r\n}\r\nexport const NAME_FIREFOX='Firefox';\r\nexport const NAME_CHROME='Chrome';\r\nexport const NAME_SAFARI='Safari';\r\nexport const NAME_EDGE='Edge';\r\n\r\n\r\n\r\nexport enum Browser {Firefox='Firefox',Chrome='Chrome',Safari='Safari',Edge='Edge'}\r\n\r\nexport const OS_WINDOWS='Windows';\r\nexport const OS_ANDROID='Android';\r\n\r\nexport enum Platform {Windows='Windows',Android='Android',macOS='MAC OS X'}\r\n\r\nexport class UserAgent{\r\n\r\n constructor(private _detectedPlatform:Platform|null,private _detectedBrowser:Browser|null) {\r\n }\r\n\r\n get detectedBrowser(): Browser | null {\r\n return this._detectedBrowser;\r\n }\r\n\r\n get detectedPlatform(): Platform | null {\r\n return this._detectedPlatform;\r\n }\r\n\r\n}\r\n\r\nexport class UserAgentBuilder {\r\n static instance:UserAgentBuilder|undefined=undefined;\r\n private comps:Array<UserAgentComponent>=new Array<UserAgentComponent>();\r\n private userAgent!:UserAgent;\r\n\r\n private build() {\r\n\r\n // // @ts-ignore\r\n // if(navigator.userAgentData){\r\n // // maybe we can use this in the future\r\n // console.info(\"Browser provides userAgentData:\");\r\n //\r\n // console.info(\"Brands:\");\r\n // // @ts-ignore\r\n // navigator.userAgentData.brands.forEach((br=>{\r\n // console.info(br.brand +\" \"+br.version);\r\n // }))\r\n // // @ts-ignore\r\n // console.info(\"Platform: \"+navigator.userAgentData.platform);\r\n // // @ts-ignore\r\n // console.info(\"Mobile:\"+navigator.userAgentData.mobile);\r\n // // @ts-ignore\r\n // //console.info(navigator.userAgentData.toJSON());\r\n // }else {\r\n // console.info(\"Browser does not provide userAgentData.\");\r\n // }\r\n\r\n let ua=navigator.userAgent;\r\n\r\n this.comps = new Array<UserAgentComponent>();\r\n\r\n let pp = 0;\r\n while (pp < ua.length) {\r\n //parse name/version\r\n let name: string | null = null\r\n let version: string | null = null;\r\n let comment: string | undefined;\r\n\r\n let blPos = ua.indexOf(' ', pp);\r\n let prt: string;\r\n if (blPos == -1) {\r\n prt = ua.substr(pp);\r\n pp += prt.length;\r\n } else {\r\n prt = ua.substr(pp, blPos - pp);\r\n pp = blPos + 1;\r\n }\r\n let sepPos = prt.indexOf('/');\r\n if (sepPos > 0) {\r\n name = prt.substr(0, sepPos);\r\n version = prt.substr(sepPos + 1);\r\n } else {\r\n name = prt;\r\n }\r\n while (ua[pp] === ' ' && pp < ua.length) {\r\n pp++;\r\n }\r\n if (ua[pp] === '(') {\r\n pp++;\r\n let commEnd = ua.indexOf(')', pp);\r\n comment = ua.substr(pp, commEnd - pp);\r\n pp = commEnd + 1;\r\n }\r\n while (ua[pp] === ' ' && pp < ua.length) {\r\n pp++;\r\n }\r\n this.comps.push(new UserAgentComponent(name, version, comment));\r\n }\r\n\r\n let detPlatf:Platform|null=null;\r\n if(this.runsOnOS(Platform.Android)){\r\n detPlatf=Platform.Android;\r\n }else if(this.runsOnOS(Platform.Windows)){\r\n detPlatf=Platform.Windows;\r\n }else if(this.runsOnOS(Platform.macOS)){\r\n detPlatf=Platform.macOS;\r\n }\r\n\r\n\r\n let detBr:Browser|null=null;\r\n if(this.matchesBrowser(Browser.Firefox)){\r\n detBr=Browser.Firefox;\r\n }else if(this.matchesBrowser(Browser.Chrome)){\r\n detBr=Browser.Chrome;\r\n }else if(this.matchesBrowser(Browser.Safari)){\r\n detBr=Browser.Safari;\r\n }\r\n\r\n this.userAgent=new UserAgent(detPlatf,detBr);\r\n\r\n }\r\n\r\n private matchesBrowser(browserName:string){\r\n for(let ci=0;ci<this.comps.length;ci++){\r\n let bn=this.comps[ci].name\r\n let bnRe=new RegExp(browserName,'i');\r\n if(bn.match(bnRe)){\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private runsOnOS(os:string):boolean{\r\n for(let ci=0;ci<this.comps.length;ci++){\r\n let cc=this.comps[ci].comment\r\n if(cc){\r\n var osRe = new RegExp(os,'i');\r\n if(cc.match(osRe)){\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n static userAgent():UserAgent{\r\n if(!this.instance){\r\n this.instance=new UserAgentBuilder();\r\n }\r\n this.instance.build();\r\n return this.instance.userAgent;\r\n\r\n }\r\n\r\n}\r\n","\r\nexport interface AudioFormat {\r\n channels: number;\r\n}\r\n\r\nexport interface MediaCaptureFormat {\r\n audioChannelCount: number;\r\n}\r\n\r\nexport interface AudioDevice {\r\n name : string,\r\n playback : boolean,\r\n regex : boolean\r\n}\r\n\r\n\r\nexport enum ConstraintType {Exact='EXACT',Ideal='IDEAL'};\r\n\r\nexport enum Platform {Linux='LINUX',macOS='MACOS',Windows='WINDOWS',Android='ANDROID'}\r\nexport enum BrowserBase {Chromium='CHROMIUM'};\r\nexport enum Browser {Firefox='FIREFOX',Chromium='CHROMIUM',Chrome='CHROME',Edge='EDGE',Opera='OPERA'}\r\n\r\nexport interface AutoGainControlConfig {\r\n value: boolean,\r\n //constraintType : ConstraintType,\r\n platform: Platform,\r\n //browserBase:BrowserBase,\r\n //browser:Browser\r\n}\r\n\r\nexport interface Project {\r\n name: string,\r\n audioFormat?: AudioFormat,\r\n mediaCaptureFormat?: MediaCaptureFormat,\r\n autoGainControlConfigs?:Array<AutoGainControlConfig>,\r\n audioDevices?: Array<AudioDevice>\r\n}\r\n\r\n\r\nexport class ProjectUtil {\r\n\r\n public static readonly DEFAULT_AUDIO_CHANNEL_COUNT=2;\r\n\r\n static audioChannelCount(project:Project): number{\r\n let chs=ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;\r\n if(project.mediaCaptureFormat){\r\n chs=project.mediaCaptureFormat.audioChannelCount;\r\n }else if(project.audioFormat){\r\n chs=project.audioFormat.channels;\r\n }\r\n return chs;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n","import {SequenceAudioFloat32OutStream} from \"../io/stream\";\r\nimport {Browser, Platform, UserAgentBuilder} from \"../../utils/ua-parser\";\r\n\r\nimport {AutoGainControlConfig, Platform as CfgPlatform} from \"../../speechrecorder/project/project\";\r\n\r\n\r\nexport const CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC=false;\r\n\r\nconst DEBUG_TRACE_LEVEL=0;\r\n\r\nconst ENABLE_AUDIO_WORKLET=true;\r\n\r\n// Super dirty way to load this module\r\n// Copy content of interceptor_worklet.js to this string\r\nconst awpStr=\"class AudioCaptureInterceptorProcessor extends AudioWorkletProcessor{\\n\" +\r\n \"\\n\" +\r\n \" BUFFER_QUANTUMS=64;\\n\" +\r\n \" QUANTUM_FRAME_LEN=128;\\n\" +\r\n \" BUFFER_FRAME_LEN=this.QUANTUM_FRAME_LEN*this.BUFFER_QUANTUMS;\\n\" +\r\n \" buffer=null;\\n\" +\r\n \" bufferPos=0;\\n\" +\r\n \" bufferPosBytes=0;\\n\" +\r\n \" constructor() {\\n\" +\r\n \" super();\\n\" +\r\n \"\\n\" +\r\n \" }\\n\" +\r\n \"\\n\" +\r\n \" process(\\n\" +\r\n \" inputs,\\n\" +\r\n \" outputs,\\n\" +\r\n \" parameters\\n\" +\r\n \" ){\\n\" +\r\n \"\\n\" +\r\n \" let inputsCnt=inputs.length;\\n\" +\r\n \" let channelCount=0;\\n\" +\r\n \" let inputLen=0;\\n\" +\r\n \" let inputLenBytes=0;\\n\" +\r\n \" if(inputsCnt>0) {\\n\" +\r\n \" let input0 = inputs[0];\\n\" +\r\n \" channelCount = input0.length;\\n\" +\r\n \" if (channelCount > 0) {\\n\" +\r\n \" let input0ch0=input0[0];\\n\" +\r\n \" inputLen=input0ch0.length;\\n\" +\r\n \" inputLenBytes=input0ch0.buffer.length;\\n\" +\r\n \" }\\n\" +\r\n \" }\\n\" +\r\n \" if (!this.buffer || this.buffer.length < channelCount) {\\n\" +\r\n \" this.buffer = new Array(channelCount);\\n\" +\r\n \" this.bufferPos = 0\\n\" +\r\n \" for (let bch = 0; bch < channelCount; bch++) {\\n\" +\r\n \" this.buffer[bch] = new Float32Array(this.BUFFER_FRAME_LEN);\\n\" +\r\n \" this.bufferPos = 0;\\n\" +\r\n \" this.bufferPosBytes=0;\\n\" +\r\n \" }\\n\" +\r\n \" }\\n\" +\r\n \" let bufAvail = this.BUFFER_FRAME_LEN - this.bufferPos;\\n\" +\r\n \" // check if buffer has to be transferred\\n\" +\r\n \" if (inputLen > bufAvail) {\\n\" +\r\n \" let ada=new Array(channelCount);\\n\" +\r\n \" for (let ch = 0; ch < channelCount; ch++) {\\n\" +\r\n \" ada[ch]=this.buffer[ch].buffer.slice(0);\\n\" +\r\n \" }\\n\" +\r\n \" this.port.postMessage({\\n\" +\r\n \" data: ada,\\n\" +\r\n \" chs: channelCount,\\n\" +\r\n \" len: this.bufferPos\\n\" +\r\n \" }, ada);\\n\" +\r\n \" // buffer transferred, reset\\n\" +\r\n \" this.bufferPos = 0;\\n\" +\r\n \" this.bufferPosBytes=0;\\n\" +\r\n \" }\\n\" +\r\n \"\\n\" +\r\n \" for(let ii=0;ii<inputsCnt;ii++) {\\n\" +\r\n \" for (let ch = 0; ch < channelCount; ch++) {\\n\" +\r\n \" // Mute outputs\\n\" +\r\n \" //outputs[ii][ch].fill(0);\\n\" +\r\n \" let chSamples = inputs[ii][ch];\\n\" +\r\n \" this.buffer[ch].set(chSamples,this.bufferPos);\\n\" +\r\n \" }\\n\" +\r\n \" this.bufferPos+=inputLen;\\n\" +\r\n \" this.bufferPosBytes+=inputLenBytes;\\n\" +\r\n \" }\\n\" +\r\n \" \\n\" +\r\n \" return true;\\n\" +\r\n \" }\\n\" +\r\n \"}\\n\" +\r\n \"\\n\" +\r\n \"registerProcessor('capture-interceptor',AudioCaptureInterceptorProcessor);\\n\";\r\n\r\n\r\n\r\n\r\nexport interface AudioCaptureListener {\r\n opened(): void;\r\n\r\n started(): void;\r\n\r\n stopped(): void;\r\n\r\n closed(): void;\r\n\r\n error(msg?:string,advice?:string): void;\r\n}\r\n\r\nexport class AudioCapture {\r\n get opened(): boolean {\r\n return this._opened;\r\n }\r\n\r\n static BUFFER_SIZE: number = 8192;\r\n context: AudioContext;\r\n stream!: MediaStream;\r\n channelCount!: number;\r\n mediaStream: any;\r\n agcStatus:boolean|null=null;\r\n bufferingNode: AudioNode|null=null;\r\n listener!: AudioCaptureListener;\r\n data!: Array<Array<Float32Array>>;\r\n currentSampleRate!: number;\r\n n: Navigator;\r\n audioOutStream: SequenceAudioFloat32OutStream | null=null;\r\n private disconnectStreams = true;\r\n private _opened=false;\r\n private capturing = false;\r\n\r\n framesRecorded: number=0;\r\n\r\n constructor(context: AudioContext) {\r\n this.context = context;\r\n this.n = navigator;\r\n }\r\n\r\n private initData() {\r\n this.data = new Array<Array<Float32Array>>();\r\n for (let i = 0; i < this.channelCount; i++) {\r\n this.data.push(new Array<Float32Array>());\r\n }\r\n this.framesRecorded = 0;\r\n }\r\n\r\n listDevices() {\r\n navigator.mediaDevices.enumerateDevices().then((l: MediaDeviceInfo[]) => this.printDevices(l));\r\n }\r\n\r\n private dummySession():Promise<MediaStream>{\r\n // workaround to request permissions:\r\n // Start a dummy session\r\n let mediaStrCnstrs = <MediaStreamConstraints>{audio:\r\n {echoCancelation: false}\r\n };\r\n return navigator.mediaDevices.getUserMedia(mediaStrCnstrs);\r\n\r\n }\r\n\r\n\r\n private stopAllSessionTracks(mediaStream:MediaStream){\r\n let ats = mediaStream.getTracks();\r\n for (let atIdx = 0; atIdx < ats.length; atIdx++) {\r\n //console.debug(\"Stop dummy session track: #\" + atIdx)\r\n ats[atIdx].stop();\r\n }\r\n }\r\n\r\n deviceInfos(cb: (deviceInfos: MediaDeviceInfo[] | null) => any, retry = true,dummyStream?:MediaStream) {\r\n\r\n navigator.mediaDevices.enumerateDevices().then((l: MediaDeviceInfo[]) => {\r\n let labelsAvailable = false;\r\n for (let i = 0; i < l.length; i++) {\r\n let di = l[i];\r\n if (di.label) {\r\n labelsAvailable = true;\r\n }\r\n }\r\n if (!labelsAvailable) {\r\n //console.debug(\"Media device enumeration: No labels.\")\r\n if (retry) {\r\n console.info(\"Starting dummy session to request audio permissions...\")\r\n\r\n this.dummySession().then((s: MediaStream) => {\r\n // and stop it immediately\r\n\r\n if(s) {\r\n //console.debug(\"Got dummy session stream: \" + s + \" .\")\r\n }else{\r\n //console.debug(\"No dummy stream\")\r\n }\r\n // retry (only once)\r\n this.deviceInfos(cb, false,s);\r\n },reason => {\r\n //console.debug(\"Dummy session rejected.\")\r\n // TODO error callback\r\n cb(null);\r\n });\r\n } else {\r\n cb(null);\r\n }\r\n } else {\r\n // success\r\n cb(l);\r\n }\r\n if(dummyStream){\r\n this.stopAllSessionTracks(dummyStream);\r\n }\r\n },(reason)=> {\r\n //rejected\r\n //console.debug(\"Media device enumeration rejected.\")\r\n if (retry) {\r\n //console.debug(\"Starting dummy session to request audio permissions...\")\r\n this.dummySession().then((s: MediaStream) => {\r\n // and stop it immediately\r\n //console.debug(\"Dummy session.\")\r\n if(s) {\r\n //console.debug(\"Got dummy session stream: \" + s + \" .\")\r\n }else{\r\n //console.debug(\"No dummy stream\")\r\n }\r\n // retry (only once)\r\n this.deviceInfos(cb, false,s);\r\n }, reason => {\r\n //console.debug(\"Dummy session rejected.\")\r\n // TODO error callback\r\n cb(null);\r\n });\r\n } else {\r\n cb(null);\r\n }\r\n if(dummyStream){\r\n this.stopAllSessionTracks(dummyStream);\r\n }\r\n });\r\n\r\n\r\n\r\n }\r\n\r\n\r\n printDevices(l: MediaDeviceInfo[]): void {\r\n let selDeviceId = '___dummy___';\r\n for (let i = 0; i < l.length; i++) {\r\n let di = l[i];\r\n\r\n console.log(\"Audio device: Id: \" + di.deviceId + \" groupId: \" + di.groupId + \" label: \" + di.label + \" kind: \" + di.kind);\r\n }\r\n }\r\n\r\n open(channelCount: number, selDeviceId?: ConstrainDOMString|undefined,autoGainControlConfigs?:Array<AutoGainControlConfig>|null|undefined){\r\n this.context.resume().then(()=>{\r\n this._open(channelCount,selDeviceId,autoGainControlConfigs);\r\n })\r\n }\r\n\r\n _open(channelCount: number, selDeviceId?: ConstrainDOMString|undefined,autoGainControlConfigs?:Array<AutoGainControlConfig>|null|undefined) {\r\n this.channelCount = channelCount;\r\n this.framesRecorded = 0;\r\n //var msc = new AudioStreamConstr();\r\n // var msc={};\r\n //msc.video = false;\r\n //msc.audio = true;\r\n\r\n // Chrome and Firefox stereo channels are identical !!\r\n // And even worse: The data coming from the source is already preprocessed on FF and Chrome. It contains DSP artifacts!!\r\n\r\n // https://bugs.chromium.org/p/chromium/issues/detail?id=387737\r\n // The workaround to set these constraints does _NOT_ help:\r\n //var msc={audio: {echoCancellation: false,channelCount: 2, googAudioMirroring: false},video: false};\r\n\r\n // Safari at least version 11: Support for media streams\r\n // TODO test if input is unprocessed\r\n\r\n let msc:MediaStreamConstraints;\r\n console.info('User agent: '+navigator.userAgent);\r\n\r\n\r\n let ua=UserAgentBuilder.userAgent();\r\n\r\n // ua.components.forEach((c)=>{\r\n // console.info(\"UA_Comp: \"+c.toString());\r\n // })\r\n\r\n let agcCfg:AutoGainControlConfig|null=null;\r\n\r\n let autoGainControl=false;\r\n let chromeEchoCancellation=false;\r\n if(autoGainControlConfigs){\r\n for(let agcc of autoGainControlConfigs){\r\n if(agcc.platform===CfgPlatform.Android && ua.detectedPlatform===Platform.Android){\r\n agcCfg=agcc;\r\n break;\r\n }\r\n if(agcc.platform===CfgPlatform.Windows && ua.detectedPlatform===Platform.Windows){\r\n agcCfg=agcc;\r\n break;\r\n }\r\n }\r\n if(agcCfg){\r\n // TODO use EXACT/IDEAL constraint\r\n autoGainControl=agcCfg.value;\r\n if(CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC){\r\n chromeEchoCancellation=agcCfg.value;\r\n }\r\n // TODO query real AGC status\r\n this.agcStatus=agcCfg.value;\r\n }else{\r\n this.agcStatus=false;\r\n }\r\n }\r\n\r\n // default\r\n msc = {\r\n audio: {\r\n deviceId: selDeviceId,\r\n echoCancellation: false,\r\n channelCount: channelCount,\r\n autoGainControl: autoGainControl\r\n },\r\n video: false\r\n };\r\n\r\n if (ua.detectedBrowser===Browser.Edge) {\r\n\r\n // Microsoft Edge sends unmodified audio\r\n // The constraint can follow the specification\r\n console.info(\"Setting media track constraints for Microsoft Edge.\");\r\n msc = {\r\n audio: {\r\n deviceId: selDeviceId,\r\n echoCancellation: false,\r\n channelCount: channelCount,\r\n autoGainControl: autoGainControl\r\n },\r\n video: false\r\n };\r\n } else if (ua.detectedBrowser===Browser.Chrome) {\r\n // Google Chrome: we need to switch of each of the preprocessing units including the\r\n console.info(\"Setting media track constraints for Google Chrome.\");\r\n\r\n // Chrome 60 -> 61 changed\r\n // it works now without mandatory/optional sub-objects\r\n\r\n\r\n // Requires at least Chrome 61\r\n msc = {\r\n audio: {\r\n deviceId: selDeviceId,\r\n channelCount: channelCount,\r\n echoCancellation: {exact:chromeEchoCancellation},\r\n autoGainControl: {exact:autoGainControl},\r\n sampleSize:{min: 16},\r\n },\r\n video: false,\r\n }\r\n\r\n } else if (ua.detectedBrowser===Browser.Firefox) {\r\n console.info(\"Setting media track constraints for Mozilla Firefox.\");\r\n // Firefox\r\n msc = {\r\n audio: {\r\n deviceId: selDeviceId,\r\n channelCount: channelCount,\r\n echoCancellation: false,\r\n autoGainControl: autoGainControl,\r\n noiseSuppression: false\r\n },\r\n video: false,\r\n }\r\n\r\n } else if (ua.detectedBrowser===Browser.Safari) {\r\n console.info(\"Setting media track constraints for Safari browser.\")\r\n console.info(\"Apply workaround for Safari: Avoid disconnect of streams.\");\r\n\r\n this.disconnectStreams = false;\r\n msc = {\r\n audio: {\r\n deviceId: selDeviceId,\r\n channelCount: channelCount,\r\n echoCancellation: false\r\n },\r\n video: false,\r\n }\r\n\r\n } else {\r\n\r\n // TODO default constraints or error Browser not supported\r\n }\r\n\r\n\r\n\r\n console.debug(\"Audio capture, AGC: \"+this.agcStatus)\r\n\r\n\r\n let ump = navigator.mediaDevices.getUserMedia(msc);\r\n ump.then((s) => {\r\n this.stream = s;\r\n\r\n let aTracks = s.getAudioTracks();\r\n\r\n for (let i = 0; i < aTracks.length; i++) {\r\n let aTrack = aTracks[i];\r\n\r\n console.info(\"Track audio info: id: \" + aTrack.id + \" kind: \" + aTrack.kind + \" label: \\\"\" + aTrack.label + \"\\\"\");\r\n let mtrSts=aTrack.getSettings();\r\n\r\n // Typescript lib.dom.ts MediaTrackSettings.channelCount is missing\r\n // https://github.com/mdn/browser-compat-data/blob/5493d8f937e05b2ddbd41b99f5bdfad4a1f2ed85/api/MediaTrackSettings.json\r\n //@ts-ignore\r\n console.info(\"Track audio settings: Ch cnt: \"+mtrSts.channelCount+\", AGC: \"+mtrSts.autoGainControl+\", Echo cancell.: \"+mtrSts.echoCancellation);\r\n if(mtrSts.autoGainControl){\r\n this.agcStatus=mtrSts.autoGainControl;\r\n }\r\n }\r\n\r\n let vTracks = s.getVideoTracks();\r\n for (let i = 0; i < vTracks.length; i++) {\r\n let vTrack = vTracks[i];\r\n console.info(\"Track video info: id: \" + vTrack.id + \" kind: \" + vTrack.kind + \" label: \" + vTrack.label);\r\n }\r\n this.mediaStream = this.context.createMediaStreamSource(s);\r\n // stream channel count ( is always 2 !)\r\n let streamChannelCount: number = this.mediaStream.channelCount;\r\n console.info(\"Stream channel count: \"+streamChannelCount);\r\n // is not set!!\r\n //this.currentSampleRate = this.mediaStream.sampleRate;\r\n this.currentSampleRate = this.context.sampleRate;\r\n console.info(\"Source audio node: channels: \" + streamChannelCount + \" samplerate: \" + this.currentSampleRate);\r\n if (this.audioOutStream) {\r\n this.audioOutStream.setFormat(this.channelCount, this.currentSampleRate);\r\n }\r\n // W3C -> new name is createScriptProcessor\r\n //\r\n // Again deprecated, but AudioWorker not yet implemented in stable releases (June 2016)\r\n // AudioWorker is now AudioWorkletProcessor ... (May 2017)\r\n\r\n // Update 12-2020:\r\n // The ScriptProcessorNode Interface - DEPRECATED\r\n\r\n // Update 06-2021\r\n // AudioWorkletProcessor is here to stay. Web Audio API has now Recommendation status !\r\n\r\n if(ENABLE_AUDIO_WORKLET && this.context.audioWorklet){\r\n //const workletFileName = ('file-loader!./interceptor_worklet.js');\r\n //const workletFileName = 'http://localhost:4200/assets/interceptor_worklet.js';\r\n //console.log(awpStr);\r\n let audioWorkletModuleBlob= new Blob([awpStr], {type: 'text/javascript'});\r\n\r\n let audioWorkletModuleBlobUrl=window.URL.createObjectURL(audioWorkletModuleBlob);\r\n\r\n this.context.audioWorklet.addModule(audioWorkletModuleBlobUrl).then(()=> {\r\n const awn = new AudioWorkletNode(this.context, 'capture-interceptor');\r\n awn.onprocessorerror=(ev:Event)=>{\r\n let msg='Unknwon error';\r\n if(ev instanceof ErrorEvent){\r\n msg=ev.message;\r\n }\r\n console.error(\"Capture audio worklet error: \"+msg);\r\n if(this.listener){\r\n this.listener.error(msg);\r\n }\r\n }\r\n let awnPt = awn.port;\r\n if (awnPt) {\r\n awnPt.onmessage = (ev: MessageEvent<any>) => {\r\n if (this.capturing) {\r\n let dt=ev.data;\r\n let chs = dt.chs;\r\n let adaLen = dt.data.length;\r\n if(DEBUG_TRACE_LEVEL>8) {\r\n console.debug('Received data from worklet: ' +chs + ' ' + dt.len +' Data chs: '+adaLen);\r\n }\r\n //let chunkLen = adaLen / chs;\r\n let chunkLen = adaLen;\r\n let chunk = new Array<Float32Array>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n if (this.data && this.data[ch]) {\r\n let adaPos = ch * chunkLen;\r\n if(dt.data[ch]) {\r\n let fa = new Float32Array(dt.data[ch]);\r\n this.data[ch].push(fa);\r\n chunk[ch] = fa;\r\n // Use samples of channel 0 to count frames (samples)\r\n if (ch == 0) {\r\n this.framesRecorded += fa.length;\r\n }\r\n }else{\r\n if(DEBUG_TRACE_LEVEL>8) {\r\n console.debug('Channel '+ch+' data not set!!');\r\n }\r\n }\r\n }\r\n }\r\n if (this.audioOutStream) {\r\n this.audioOutStream.write(chunk);\r\n }\r\n }\r\n };\r\n }\r\n this.bufferingNode = awn;\r\n this._opened = true;\r\n if (this.listener) {\r\n this.listener.opened();\r\n }\r\n }\r\n ).catch((error: any)=>{\r\n console.log('Could not add module '+error);\r\n });\r\n\r\n }else if(this.context.createScriptProcessor) {\r\n // The ScriptProcessorNode Interface - DEPRECATED Only as fallback\r\n // TODO should we use streamChannelCount or channelCount here ?\r\n let scriptProcessorNode= this.context.createScriptProcessor(AudioCapture.BUFFER_SIZE, streamChannelCount, streamChannelCount);\r\n this.bufferingNode=scriptProcessorNode;\r\n let c = 0;\r\n if(scriptProcessorNode.onaudioprocess){\r\n scriptProcessorNode.onaudioprocess = (e: AudioProcessingEvent) => {\r\n\r\n if (this.capturing) {\r\n let inBuffer = e.inputBuffer;\r\n let duration = inBuffer.duration;\r\n // only process requested count of channels\r\n let currentBuffers = new Array<Float32Array>(channelCount);\r\n for (let ch: number = 0; ch < channelCount; ch++) {\r\n let chSamples = inBuffer.getChannelData(ch);\r\n let chSamplesCopy = chSamples.slice(0);\r\n currentBuffers[ch] = chSamplesCopy.slice(0);\r\n this.data[ch].push(chSamplesCopy);\r\n if(DEBUG_TRACE_LEVEL>8){\r\n console.debug(\"Process \"+chSamplesCopy.length+\" samples.\");\r\n }\r\n this.framesRecorded += chSamplesCopy.length;\r\n }\r\n c++;\r\n if (this.audioOutStream) {\r\n this.audioOutStream.write(currentBuffers);\r\n }\r\n }\r\n };\r\n this._opened = true;\r\n if (this.listener) {\r\n this.listener.opened();\r\n }\r\n }else{\r\n this.listener.error('Browser does not support audio processing (ScriptProcessor.onaudioprocess method not found)!');\r\n }\r\n }else{\r\n this.listener.error('Browser does not support audio processing (neither AudioWorkletProcessor nor ScriptProcessor)!');\r\n }\r\n }, (e) => {\r\n console.error(e + \" Error name: \" +e.name);\r\n if (this.listener) {\r\n if('NotAllowedError' === e.name){\r\n this.listener.error('Not allowed to use your microphone.','Please make sure that microphone access is allowed for this web page and reload the page.');\r\n }else if('NotReadableError' === e.name){\r\n this.listener.error('Could not read from your audio device.','Please make sure your audio device is working.');\r\n }else if('OverconstrainedError' === e.name){\r\n let eMsg=e.msg?e.msg:'Overconstrained media device request error.';\r\n this.listener.error(eMsg);\r\n } else {\r\n this.listener.error();\r\n }\r\n }\r\n }\r\n )\r\n }\r\n\r\n start() {\r\n\r\n this.initData();\r\n if (this.audioOutStream) {\r\n this.audioOutStream.nextStream()\r\n }\r\n this.capturing = true;\r\n if(this.bufferingNode) {\r\n this.mediaStream.connect(this.bufferingNode);\r\n this.bufferingNode.connect(this.context.destination);\r\n }\r\n if (this.listener) {\r\n this.listener.started();\r\n }\r\n\r\n }\r\n\r\n stop() {\r\n\r\n if (this.disconnectStreams && this.bufferingNode) {\r\n this.mediaStream.disconnect(this.bufferingNode);\r\n this.bufferingNode.disconnect(this.context.destination);\r\n }\r\n\r\n if (this.audioOutStream) {\r\n this.audioOutStream.flush();\r\n }\r\n this.capturing = false;\r\n if (this.listener) {\r\n this.listener.stopped();\r\n }\r\n }\r\n\r\n\r\n close() {\r\n this.mediaStream.disconnect();\r\n if (this.stream) {\r\n //this.stream.stop();\r\n //'MediaStream.stop()' is deprecated and will be removed in M47, around November 2015. Please use 'MediaStream.active' instead.\r\n //this.stream.active=false;\r\n var mts = this.stream.getTracks();\r\n for (var i = 0; i < mts.length; i++) {\r\n mts[i].stop();\r\n }\r\n }\r\n this._opened=false;\r\n }\r\n\r\n audioBuffer(): AudioBuffer {\r\n var frameLen: number = 0;\r\n var ch0Data = this.data[0];\r\n\r\n for (var ch0Chk of ch0Data) {\r\n frameLen += ch0Chk.length;\r\n }\r\n var ab = this.context.createBuffer(this.channelCount, frameLen, this.context.sampleRate);\r\n for (var ch = 0; ch < this.channelCount; ch++) {\r\n\r\n var chD = ab.getChannelData(ch);\r\n var pos = 0;\r\n for (var chChk of this.data[ch]) {\r\n var bufLen = chChk.length;\r\n chD.set(chChk, pos);\r\n pos += bufLen;\r\n }\r\n }\r\n return ab;\r\n }\r\n}\r\n\r\n","\n\n export class WavFileFormat {\n static RIFF_KEY:string = 'RIFF';\n static WAV_KEY:string = 'WAVE';\n static PCM:number = 0x0001;\n }\n\n\n\n\n","\n export class BinaryByteWriter {\n static DEFAULT_SIZE_INC = 1024;\n buf: ArrayBuffer;\n private _pos: number;\n\n constructor() {\n const size = BinaryByteWriter.DEFAULT_SIZE_INC;\n this.buf = new ArrayBuffer(size);\n this._pos = 0;\n }\n\n get pos(): number {\n return this._pos;\n }\n\n ensureCapacity(numBytes: number) {\n\n while ( this._pos + numBytes >= this.buf.byteLength ) {\n // buffer increment\n let inc = BinaryByteWriter.DEFAULT_SIZE_INC;\n if (inc < numBytes) {\n inc = numBytes;\n }\n const newSize = this.buf.byteLength + inc;\n\n const arrOld = new Uint8Array(this.buf, 0, this._pos);\n const arrNew = new Uint8Array(newSize);\n arrNew.set(arrOld);\n this.buf = arrNew.buffer;\n }\n }\n\n writeUint8(val: number): void {\n this.ensureCapacity(1);\n const valView = new DataView(this.buf, this._pos, 1);\n valView.setUint8(0, val);\n this._pos++;\n }\n\n writeUint16(val: number, le: boolean): void {\n this.ensureCapacity(2);\n const valView = new DataView(this.buf, this._pos, 2);\n valView.setUint16(0, val, le);\n this._pos += 2;\n\n }\n writeInt16(val: number, le: boolean): void {\n this.ensureCapacity(2);\n const valView = new DataView(this.buf, this._pos, 2);\n valView.setInt16(0, val, le);\n this._pos += 2;\n }\n\n\n writeUint32(val: number, le: boolean): void {\n this.ensureCapacity(4);\n const valView = new DataView(this.buf, this._pos, 4);\n valView.setUint32(0, val, le);\n this._pos += 4;\n }\n\n writeInt32(val: number, le: boolean): void {\n this.ensureCapacity(4);\n const valView = new DataView(this.buf, this._pos, 4);\n valView.setInt32(0, val, le);\n this._pos += 4;\n }\n finish(): Uint8Array {\n const finalArr = new Uint8Array(this._pos);\n const dv = new DataView(this.buf, 0, this._pos);\n for (let i = 0; i < this._pos; i++) {\n finalArr[i] = dv.getUint8(i);\n }\n return finalArr;\n }\n\n writeAscii(text: string): void {\n let i;\n for (i = 0; i < text.length; i++) {\n const asciiCode = text.charCodeAt(i);\n if (asciiCode < 0 || asciiCode > 255) {\n throw new Error('Not an ASCII character at char ' + i + ' in ' + text);\n }\n this.writeUint8(asciiCode);\n }\n }\n\n }\n\n","\r\n export class UUID {\r\n\r\n static generate():string {\r\n return UUID.s4() + UUID.s4() + '-' + UUID.s4() + '-' + UUID.s4() + '-' +\r\n UUID.s4() + '-' + UUID.s4() + UUID.s4() + UUID.s4();\r\n }\r\n\r\n private static s4() {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n }\r\n }\r\n\r\n export class Arrays {\r\n\r\n static cloneNumberArray(numberArray: Array<number>): Array<number> {\r\n let len = numberArray.length;\r\n let cloneArr = new Array<number>(len);\r\n for (let c = 0; c < numberArray.length; c++) {\r\n cloneArr[c] = numberArray[c];\r\n }\r\n return cloneArr;\r\n }\r\n\r\n static swap<T>(items:Array<T>, i:number, j:number) {\r\n let tmp = items[i];\r\n items[i] = items[j];\r\n items[j] = tmp;\r\n }\r\n\r\n static shuffleArray<T>(orgArray:Array<T>):Array<T>{\r\n let shuffledArray = [...orgArray];\r\n for (let i = shuffledArray.length; i > 1; i--) {\r\n let rnd=Math.random();\r\n let rndArrIdx=Math.floor(rnd*i);\r\n Arrays.swap(shuffledArray, i - 1, rndArrIdx);\r\n }\r\n return shuffledArray;\r\n }\r\n }\r\n\r\n export class WorkerHelper {\r\n\r\n static DEBUG=false;\r\n static buildWorkerBlobURL(workerFct: Function): string {\r\n\r\n if(! (workerFct instanceof Function)) {\r\n throw new Error(\r\n 'Parameter workerFct is not a function! (XSS attack?).'\r\n )\r\n }\r\n let woFctNm = workerFct.name\r\n if (WorkerHelper.DEBUG) {\r\n console.info(\"Worker method name: \" + woFctNm)\r\n }\r\n\r\n let woFctStr = workerFct.toString()\r\n if (WorkerHelper.DEBUG) {\r\n console.info(\"Worker method string:\")\r\n console.info(woFctStr)\r\n }\r\n\r\n\r\n // Make sure code starts with \"function()\"\r\n\r\n // Chrome, Firefox: \"[wofctNm](){...}\", Safari: \"function [wofctNm](){...}\"\r\n // we need an anonymous function: \"function() {...}\"\r\n let piWoFctStr = woFctStr.replace(/^function +/, '');\r\n\r\n if(WorkerHelper.DEBUG){\r\n console.info(\"Worker platform independent function string:\")\r\n console.info(piWoFctStr)\r\n }\r\n\r\n // Convert to anonymous function\r\n let anonWoFctStr = piWoFctStr.replace(woFctNm + '()', 'function()')\r\n if(WorkerHelper.DEBUG){\r\n console.info(\"Worker anonymous function string:\")\r\n console.info(piWoFctStr)\r\n }\r\n // Self executing\r\n let ws = '(' + anonWoFctStr + ')();'\r\n if(WorkerHelper.DEBUG){\r\n console.info(\"Worker self executing anonymous function string:\")\r\n console.info(anonWoFctStr)\r\n }\r\n // Build the worker blob\r\n let wb = new Blob([ws], {type: 'text/javascript'});\r\n\r\n let workerBlobUrl=window.URL.createObjectURL(wb);\r\n return workerBlobUrl;\r\n }\r\n }\r\n","import { WavFileFormat } from './wavformat'\r\nimport { PCMAudioFormat } from '../format'\r\nimport { BinaryByteWriter } from '../../io/BinaryWriter'\r\nimport {WorkerHelper} from \"../../utils/utils\";\r\ndeclare function postMessage (message:any, transfer:Array<any>):void;\r\n\r\n\r\n export class WavWriter {\r\n\r\n static PCM:number = 1;\r\n static DEFAULT_SAMPLE_SIZE_BYTES:number = 2;\r\n private bw:BinaryByteWriter;\r\n private format:PCMAudioFormat|null=null;\r\n private dataLength:number|null=null;\r\n private workerURL: string|null=null;\r\n\r\n constructor() {\r\n this.bw = new BinaryByteWriter();\r\n }\r\n\r\n /*\r\n * Method used as worker code.\r\n */\r\n workerFunction() {\r\n self.onmessage = function (msg:MessageEvent) {\r\n\r\n let bufLen=msg.data.frameLength * msg.data.chs;\r\n let valView = new DataView(msg.data.buf,msg.data.bufPos);\r\n\r\n let bufPos = 0;\r\n let hDynIntRange = 1 << (msg.data.sampleSizeInBits - 1);\r\n for (let s = 0; s < msg.data.frameLength; s++) {\r\n // interleaved channel data\r\n\r\n for (let ch = 0; ch < msg.data.chs; ch++) {\r\n let srcPos=(ch*msg.data.frameLength)+s;\r\n let valFlt = msg.data.audioData[srcPos];\r\n let valInt = Math.round(valFlt * hDynIntRange);\r\n valView.setInt16(bufPos, valInt, true);\r\n bufPos+=2;\r\n }\r\n }\r\n postMessage({buf:msg.data.buf}, [msg.data.buf]);\r\n //self.close()\r\n }\r\n }\r\n\r\n\r\n writeFmtChunk(audioBuffer:AudioBuffer){\r\n\r\n this.bw.writeUint16(WavFileFormat.PCM,true);\r\n let frameSize=WavWriter.DEFAULT_SAMPLE_SIZE_BYTES*audioBuffer.numberOfChannels; // fixed 16-bit for now\r\n this.bw.writeUint16(audioBuffer.numberOfChannels,true);\r\n this.bw.writeUint32(audioBuffer.sampleRate,true);\r\n // dwAvgBytesPerSec\r\n this.bw.writeUint32(frameSize*audioBuffer.sampleRate,true);\r\n this.bw.writeUint16(frameSize,true);\r\n // sample size in bits (PCM format only)\r\n this.bw.writeUint16(WavWriter.DEFAULT_SAMPLE_SIZE_BYTES*8,true);\r\n }\r\n\r\n writeDataChunk(audioBuffer:AudioBuffer){\r\n\r\n let chData0=audioBuffer.getChannelData(0);\r\n let dataLen=chData0.length;\r\n let hDynIntRange=1 << ((WavWriter.DEFAULT_SAMPLE_SIZE_BYTES*8)-1);\r\n for(let s=0;s<dataLen;s++) {\r\n // interleaved channel data\r\n for (let ch = 0; ch < audioBuffer.numberOfChannels; ch++) {\r\n let chData = audioBuffer.getChannelData(ch);\r\n let valFlt=chData[s];\r\n let valInt=Math.round(valFlt*hDynIntRange);\r\n this.bw.writeInt16(valInt,true);\r\n }\r\n }\r\n\r\n }\r\n\r\n writeChunkHeader(name:string,chkLen:number){\r\n this.bw.writeAscii(name);\r\n this.bw.writeUint32(chkLen,true);\r\n }\r\n\r\n writeAsync(audioBuffer:AudioBuffer,callback: (wavFileData:Uint8Array)=> any){\r\n\r\n let dataChkByteLen=this.writeHeader(audioBuffer);\r\n if (!this.workerURL) {\r\n this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction)\r\n }\r\n let wo = new Worker(this.workerURL);\r\n\r\n let chs = audioBuffer.numberOfChannels;\r\n\r\n let frameLength = audioBuffer.getChannelData(0).length;\r\n let ad = new Float32Array(chs * frameLength);\r\n for (let ch = 0; ch < chs; ch++) {\r\n ad.set(audioBuffer.getChannelData(ch), ch * frameLength);\r\n }\r\n // ensureCapacity blocks !!!\r\n this.bw.ensureCapacity(dataChkByteLen);\r\n wo.onmessage = (me) => {\r\n callback(me.data.buf);\r\n wo.terminate();\r\n }\r\n //TODO Fixed sample size of 16 bits\r\n wo.postMessage({sampleSizeInBits:16, chs: chs, frameLength: frameLength, audioData: ad,buf:this.bw.buf,bufPos:this.bw.pos}, [ad.buffer,this.bw.buf]);\r\n\r\n }\r\n\r\n write(audioBuffer:AudioBuffer):Uint8Array{\r\n this.writeHeader(audioBuffer);\r\n this.writeDataChunk(audioBuffer);\r\n return this.bw.finish();\r\n }\r\n\r\n\r\n writeHeader(audioBuffer:AudioBuffer):number{\r\n\r\n this.bw.writeAscii(WavFileFormat.RIFF_KEY);\r\n let dataChkByteLen=audioBuffer.getChannelData(0).length*WavWriter.DEFAULT_SAMPLE_SIZE_BYTES*audioBuffer.numberOfChannels;\r\n let wavChunkByteLen=(4+4)*3+16+dataChkByteLen;\r\n let wavFileDataByteLen=wavChunkByteLen+8;\r\n\r\n this.bw.writeUint32(wavChunkByteLen,true); // must be set to file length-8 later\r\n this.bw.writeAscii(WavFileFormat.WAV_KEY);\r\n this.writeChunkHeader('fmt ',16);\r\n this.writeFmtChunk(audioBuffer);\r\n this.writeChunkHeader('data',dataChkByteLen);\r\n return dataChkByteLen;\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n","\r\nexport type Mode = \"MANUAL\" | \"AUTOPROGRESS\" | \"AUTORECORDING\";\r\nexport type PromptPhase = \"IDLE\" | \"PRERECORDING\" | \"PRERECORDINGONLY\" | \"RECORDING\";\r\n\r\nexport type Order = 'SEQUENTIAL' | 'RANDOM' | 'RANDOMIZED';\r\n\r\nexport type Decoration ='underline'\r\nexport type Style ='italic' | 'normal'\r\nexport type FontWeight='normal' | 'bold'\r\nexport type BlockType='p';\r\nexport type TextType='text' | 'font';\r\n\r\nexport interface Recinstructions{\r\n recinstructions:string;\r\n}\r\n\r\nexport interface Text {\r\n type: TextType,\r\n color? : string,\r\n decoration? : Decoration,\r\n size?: string,\r\n weight?: FontWeight,\r\n style?: Style,\r\n text : string | Text;\r\n}\r\n\r\nexport interface Block {\r\n type: BlockType,\r\n texts: Array<Text>\r\n}\r\nexport interface Body{\r\n blocks?: Array<Block>,\r\n}\r\n\r\nexport interface PromptDoc{\r\n body?: Body\r\n}\r\n\r\nexport interface Mediaitem {\r\n text?: string,\r\n src?: string,\r\n promptDoc?: PromptDoc,\r\n mimetype?:string,\r\n defaultVirtualViewBox?:VirtualViewBox,\r\n alt?:string\r\n}\r\n\r\nexport interface PromptItem {\r\n type?:string;\r\n itemcode?: string,\r\n prerecdelay?: number,\r\n prerecording?: number,\r\n recduration?: number,\r\n postrecording?: number,\r\n postrecdelay?: number,\r\n recinstructions?: Recinstructions,\r\n mediaitems: Array<Mediaitem>\r\n}\r\n\r\nexport interface Group {\r\n order?:Order;\r\n promptItems: Array<PromptItem>;\r\n _shuffledPromptItems: Array<PromptItem>;\r\n}\r\n\r\nexport interface Section {\r\n mode: Mode;\r\n promptphase: PromptPhase;\r\n order?: Order;\r\n training: boolean;\r\n groups: Array<Group>;\r\n _shuffledGroups: Array<Group>;\r\n}\r\n\r\nexport interface VirtualViewBox{\r\n height:number;\r\n}\r\n\r\nexport interface Script {\r\n virtualViewBox?:VirtualViewBox;\r\n sections: Array<Section>;\r\n}\r\n\r\nexport class PromptDocUtil{\r\n\r\n static toPlainTextString(promptDoc:PromptDoc):string{\r\n let pt=\"\";\r\n let b=promptDoc.body;\r\n if(b!=null) {\r\n let blks=b.blocks\r\n if(blks) {\r\n for(let bli=0;bli<blks.length;bli++){\r\n let blk=blks[bli];\r\n let txts=blk.texts;\r\n for(let ti=0;ti<txts.length;ti++){\r\n let txtEl=txts[ti];\r\n let txt =txtEl.text;\r\n if( txtEl.type === 'font'){\r\n if(typeof txt === 'string'){\r\n pt = pt.concat(<string>txt);\r\n }else{\r\n let subTxtEl=<Text>txt;\r\n let subTxt=subTxtEl.text;\r\n if(typeof subTxt === 'string') {\r\n pt=pt.concat(subTxt);\r\n }\r\n }\r\n }else if(typeof txt === 'string'){\r\n pt = pt.concat(<string>txt);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return pt;\r\n }\r\n}\r\n\r\nexport class MediaitemUtil {\r\n static toPlainTextString(mediaitem: Mediaitem): string|null {\r\n\r\n let txt = mediaitem.text;\r\n let pd = mediaitem.promptDoc;\r\n if (txt == null) {\r\n let pt = null;\r\n if (pd != null) {\r\n pt = PromptDocUtil.toPlainTextString(pd);\r\n }\r\n return pt;\r\n } else {\r\n return txt;\r\n }\r\n }\r\n\r\n static description(mi: Mediaitem): string {\r\n let description = \"\";\r\n\r\n if (mi.alt != null) {\r\n description = description.concat(mi.alt)\r\n } else {\r\n let src = mi.src;\r\n let mimeType = mi.mimetype;\r\n if (!mimeType) {\r\n mimeType = 'text/plain';\r\n }\r\n if (mimeType.startsWith(\"image\")) {\r\n description = description.concat(\"IMAGE: \");\r\n } else if (mimeType.startsWith(\"audio\")) {\r\n description = description.concat(\"AUDIO: \");\r\n } else if (mimeType.startsWith(\"video\")) {\r\n description = description.concat(\"VIDEO: \");\r\n }\r\n let promptText = MediaitemUtil.toPlainTextString(mi);\r\n if (promptText != null) {\r\n description = description.concat(promptText);\r\n } else if (src != null) {\r\n let srcPn;\r\n try {\r\n let srcUrl = new URL(src);\r\n srcPn=srcUrl.pathname;\r\n }catch{\r\n srcPn=src;\r\n }\r\n\r\n // Get filename without extension\r\n let srcFnM=srcPn.match(/([^\\/]*)$/);\r\n if(srcFnM && srcFnM.length==2){\r\n let srcFn=srcFnM[1];\r\n let srcFnNm=srcFn.replace(/[\\.][^\\.]*/,'');\r\n description = description.concat(srcFnNm);\r\n }\r\n }\r\n }\r\n return description;\r\n }\r\n}\r\n\r\nexport class PromptitemUtil {\r\n static toPlainTextString(promptItem: PromptItem): string {\r\n\r\n let mis = promptItem.mediaitems;\r\n let description = \"\";\r\n if (mis) {\r\n\r\n let misSize = mis.length;\r\n for (let i = 0; i < misSize; i++) {\r\n let mi = mis[i];\r\n description = description.concat(MediaitemUtil.description(mi));\r\n if (i + 1 < misSize) {\r\n // not last item\r\n description = description.concat(\", \");\r\n }\r\n }\r\n }\r\n return description;\r\n }\r\n}\r\n\r\n\r\n","import { UUID } from '../utils/utils'\r\nimport {PromptItem} from \"./script/script\";\r\n\r\nexport interface RecordingFileDescriptor {\r\n recording:PromptItem;\r\n version:number;\r\n}\r\n\r\nexport class RecordingFileDescriptorImpl {\r\n recording!:PromptItem;\r\n version!:number;\r\n constructor() {}\r\n}\r\n\r\nexport class RecordingFile {\r\n recordingFileId: string | number | null= null;\r\n uuid:string|null=null;\r\n date: string|null=null;\r\n _dateAsDateObj:Date|null=null;\r\n startedDate: string|null=null;\r\n _startedAsDateObj?:Date|null=null;\r\n audioBuffer:AudioBuffer|null=null;\r\n session:string|number|null=null;\r\n frames:number|null=null;\r\n editSampleRate:number|null=null;\r\n editStartFrame:number|null=null\r\n editEndFrame:number|null=null\r\n\r\n constructor(uuid:string,sessionId:string|number,audioBuffer:AudioBuffer|null) {\r\n this.session=sessionId;\r\n this.audioBuffer=audioBuffer;\r\n this.uuid=uuid;\r\n }\r\n\r\n filenameString():string{\r\n let fns:string='';\r\n if(this.session){\r\n fns+=this.session;\r\n fns+='_';\r\n }\r\n fns+=this.uuid;\r\n return fns;\r\n }\r\n}\r\n\r\n export class SprRecordingFile extends RecordingFile implements RecordingFileDescriptor{\r\n\r\n itemCode:string;\r\n\r\n recording!:PromptItem;\r\n version!:number;\r\n\r\n constructor(sessionId:string|number,itemcode:string,version:number,audioBuffer:AudioBuffer|null) {\r\n super(UUID.generate(),sessionId,audioBuffer);\r\n this.session=sessionId;\r\n this.itemCode=itemcode;\r\n this.version=version;\r\n this.audioBuffer=audioBuffer;\r\n }\r\n\r\n filenameString():string{\r\n let fns:string='';\r\n if(this.session){\r\n fns+=this.session;\r\n fns+='_';\r\n }\r\n if(this.itemCode){\r\n fns+=this.itemCode;\r\n fns+='_';\r\n }\r\n fns+=this.uuid;\r\n return fns;\r\n }\r\n }\r\n\r\n","\r\n import {HttpClient, HttpErrorResponse} from \"@angular/common/http\";\r\n import { timeout } from 'rxjs/operators'\r\n\r\n // state of an upload\r\n export enum UploadStatus {IDLE = 1, UPLOADING = 2, ABORT = 3, DONE = 0, ERR = -1}\r\n\r\n // state of the uploader\r\n // TRY_UPLOADING is uploading state after an error (for example if disconnected from server)\r\n export enum UploaderStatus { DONE = 0, UPLOADING = 1, TRY_UPLOADING = 2,NEXT = 3, ERR = -1}\r\n\r\n export class UploaderStatusChangeEvent {\r\n private _sizeQueued:number;\r\n private _sizeDone:number;\r\n private _status: UploaderStatus;\r\n\r\n\r\n constructor(sizeQueued: number, sizeDone: number, status: UploaderStatus) {\r\n this._sizeQueued = sizeQueued;\r\n this._sizeDone = sizeDone;\r\n this._status = status;\r\n }\r\n\r\n get sizeQueued():number {\r\n return this._sizeQueued;\r\n }\r\n\r\n get sizeDone():number {\r\n return this._sizeDone;\r\n }\r\n\r\n get status(): UploaderStatus {\r\n return this._status;\r\n }\r\n\r\n uploadDone(): boolean {\r\n return (this._sizeDone >= this._sizeQueued);\r\n }\r\n\r\n percentDone(): number {\r\n if (this._sizeQueued == 0) {\r\n // no data queued, we are \"done\"\r\n return 100;\r\n }\r\n let percent = Math.floor(this._sizeDone * 100 / this._sizeQueued);\r\n //console.log(\"Upload status: queued: \"+this._sizeQueued+\", done: \"+this._sizeDone+\", \"+percent+\"%\")\r\n return percent;\r\n }\r\n\r\n }\r\n\r\n export class Upload {\r\n\r\n private _data:Blob|FormData;\r\n private _url:string;\r\n status: UploadStatus;\r\n\r\n constructor(blob:Blob|FormData, url:string) {\r\n this._data = blob;\r\n this._url = url;\r\n this.status = UploadStatus.IDLE;\r\n }\r\n\r\n get url():string {\r\n return this._url;\r\n }\r\n\r\n get data():Blob|FormData {\r\n return this._data;\r\n }\r\n\r\n public toString = () : string => {\r\n let s=`Upload: Status: ${this.status}, URL: ${this._url}`;\r\n if(this._data instanceof Blob){\r\n s=s+`, Size: ${this._data.size}`;\r\n }else if(this._data instanceof FormData){\r\n // TODO (iterate through parts ??)\r\n }\r\n return s;\r\n }\r\n }\r\n\r\n export class Uploader {\r\n POST_MIN_TIMEOUT = 120000; // 2min plus ...\r\n POST_TIMEOUT_PER_KB = 1000; // ... 1s per kB\r\n\r\n RETRY_DELAY: number = 30000; // retry every 30s\r\n DEBUG_DELAY: number = 0;\r\n //DEBUG_DELAY:number=0;\r\n private status: UploaderStatus = UploaderStatus.DONE;\r\n private que: Array<Upload>;\r\n listener: ((ue: UploaderStatusChangeEvent) => void) | null = null;\r\n private _sizeQueued: number = 0;\r\n private _sizeDone: number = 0;\r\n\r\n private retryTimerRunning = false;\r\n private retryTimerId: number | null = null;\r\n\r\n private te:TextEncoder=new TextEncoder();\r\n\r\n constructor(private http: HttpClient, private withCredentials: boolean = false) {\r\n this.que = new Array<Upload>();\r\n }\r\n\r\n private dataSize(dt:Blob|FormData){\r\n let si=0;\r\n if(dt instanceof Blob){\r\n si=dt.size;\r\n }else if(dt instanceof FormData){\r\n dt.forEach((v,k)=>{\r\n if(v instanceof File){\r\n si+=v.size;\r\n }else if(typeof v ==='string'){\r\n // encode to UT-f8 to get upload size\r\n si+= this.te.encode().length;\r\n }\r\n })\r\n }\r\n return si;\r\n }\r\n\r\n private uploadDone(ul:Upload) {\r\n\r\n ul.status = UploadStatus.DONE;\r\n\r\n // remove upload from queue\r\n for (let i = 0; i < this.que.length; i++) {\r\n if (this.que[i] === ul) {\r\n // found, remove\r\n this.que.splice(i, 1);\r\n let ulSize = this.dataSize(ul.data);\r\n this._sizeDone += ulSize;\r\n break;\r\n }\r\n }\r\n // set to done for now...\r\n this.status = UploaderStatus.NEXT;\r\n // continue\r\n this.process();\r\n }\r\n\r\n private startUpload(ul:Upload) {\r\n\r\n ul.status = UploadStatus.UPLOADING;\r\n if (UploaderStatus.ERR === this.status) {\r\n this.status = UploaderStatus.TRY_UPLOADING;\r\n } else {\r\n this.status = UploaderStatus.UPLOADING;\r\n }\r\n\r\n let dSize=this.dataSize(ul.data);\r\n let timeoutForDataSize=dSize*this.POST_TIMEOUT_PER_KB/1000;\r\n let timeoVal:number=Math.round(this.POST_MIN_TIMEOUT+timeoutForDataSize)\r\n // pipe(timeout()) is not the same as xhr.timeout\r\n\r\n let uploadedUpload:Upload|null=null;\r\n //console.debug(\"Post upload: \"+ul)\r\n this.http.post(ul.url,ul.data,{withCredentials:this.withCredentials}).pipe(timeout(timeoVal)).subscribe(\r\n data => {\r\n uploadedUpload = ul;\r\n //console.debug('Next method called for upload: '+uploadedUpload)\r\n },(err: HttpErrorResponse) => {\r\n if (err.error instanceof Error) {\r\n // A client-side or network error occurred. Handle it accordingly.\r\n console.error('Upload error occurred:', err.error.message);\r\n } else {\r\n // The backend returned an unsuccessful response code.\r\n // The response body may contain clues as to what went wrong,\r\n console.error(`Upload error: Server returned code ${err.status}`);\r\n }\r\n this.processError(ul)\r\n },()=>{\r\n //console.debug('Upload complete method called')\r\n if(uploadedUpload) {\r\n if (this.DEBUG_DELAY>0) {\r\n window.setTimeout(() => {\r\n this.uploadDone(ul);\r\n }, this.DEBUG_DELAY);\r\n } else {\r\n this.uploadDone(uploadedUpload)\r\n }\r\n }else{\r\n console.error('Upload post complete, but upload not set in next method!')\r\n }\r\n });\r\n }\r\n\r\n private processError(ul:Upload) {\r\n //console.debug(\"Process upload error...\")\r\n ul.status=UploadStatus.ERR\r\n this.status = UploaderStatus.ERR;\r\n\r\n let ue = new UploaderStatusChangeEvent(this._sizeQueued, this._sizeDone, this.status);\r\n if (this.listener) {\r\n this.listener(ue);\r\n }\r\n\r\n // set retry timer\r\n this.retryTimerId=window.setTimeout(() => {\r\n this.retryTimerRunning=false;\r\n //console.debug(\"Upload retry timer exprired. Continue processing...\")\r\n this.process();\r\n }, this.RETRY_DELAY);\r\n\r\n this.retryTimerRunning=true;\r\n //console.debug(\"Started upload retry timer \"+this.RETRY_DELAY+\"ms ...\")\r\n }\r\n\r\n private process() {\r\n // clear retry timer if set\r\n if(this.retryTimerRunning){\r\n if(this.retryTimerId) {\r\n window.clearTimeout(this.retryTimerId)\r\n }\r\n this.retryTimerRunning=false\r\n //console.debug(\"Cleared retry timer.\")\r\n }\r\n\r\n let pul: Upload | null = null;\r\n\r\n //console.debug(\"Uploader status: \"+this.status)\r\n\r\n let s = this.que.length;\r\n //console.debug(s+\" uploads are in the queue.\")\r\n\r\n if (s>0 && UploaderStatus.UPLOADING != this.status && UploaderStatus.TRY_UPLOADING != this.status) {\r\n\r\n for (let i = 0; i < s; i++) {\r\n let ul = this.que[i];\r\n //console.log(\"Upload \"+ul+\" status:\"+ul.status)\r\n if (ul.status === UploadStatus.IDLE) {\r\n //console.log(\"Upload \"+ul+\" startUpload\")\r\n this.startUpload(ul);\r\n pul = ul;\r\n break;\r\n }\r\n }\r\n if (!pul) {\r\n //console.log(\"Check ERR uploads...\")\r\n // now failed uploads\r\n //console.debug(\"No regular upload found. Looking for error state uploads.\")\r\n for (let i = 0; i < s; i++) {\r\n let ul = this.que[i];\r\n //console.log(\"Upload \"+ul+\" status:\"+ul.status)\r\n if (ul.status === UploadStatus.ERR) {\r\n //console.log(\"Upload (ERR) \"+ul+\" startUpload\")\r\n //console.debug(\"Start error state upload \"+ul)\r\n this.startUpload(ul);\r\n pul = ul;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if(s==0){\r\n //console.debug(\"Upload done.\")\r\n this.status=UploaderStatus.DONE\r\n }\r\n let ue = new UploaderStatusChangeEvent(this._sizeQueued, this._sizeDone, this.status);\r\n if (this.listener) {\r\n this.listener(ue);\r\n }\r\n }\r\n\r\n queueUpload(ul: Upload) {\r\n if (ul) {\r\n let ulSize = this.dataSize(ul.data);\r\n this.que.push(ul);\r\n this._sizeQueued += ulSize;\r\n this.process();\r\n }\r\n }\r\n }\r\n\r\n\r\n","import {Injectable, InjectionToken} from \"@angular/core\";\r\n\r\nexport const SPEECHRECORDER_CONFIG = new InjectionToken<SpeechRecorderConfig>('speechrecorder.config');\r\n\r\n\r\nexport enum ApiType {\r\n NORMAL,FILES\r\n}\r\n@Injectable()\r\nexport class SpeechRecorderConfig{\r\n apiEndPoint?: string | null=null;\r\n apiType?: ApiType | null=null;\r\n withCredentials?: boolean=false;\r\n enableDownloadRecordings?: boolean=false;\r\n enableUploadRecordings?: boolean=true;\r\n constructor(){\r\n this.apiEndPoint=null;\r\n this.apiType=null;\r\n this.withCredentials=false;\r\n }\r\n}\r\n\r\n","/**\r\n * Created by klausj on 17.06.2017.\r\n */\r\nimport {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient} from \"@angular/common/http\";\r\nimport {ApiType, SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\nimport {Project} from \"./project\";\r\nimport {UUID} from \"../../utils/utils\";\r\nimport {Observable} from \"rxjs\";\r\nimport {PlatformLocation} from \"@angular/common\";\r\n\r\n\r\n\r\n@Injectable()\r\nexport class ProjectService {\r\n public static readonly PROJECT_API_CTX='project'\r\n private projectCtxUrl:string;\r\n private withCredentials:boolean=false;\r\n\r\n constructor(private http:HttpClient,private platformLoaction:PlatformLocation,@Inject(SPEECHRECORDER_CONFIG) private config?:SpeechRecorderConfig) {\r\n\r\n console.log(\"Base Href: \"+platformLoaction.getBaseHrefFromDOM());\r\n\r\n let apiEndPoint = ''\r\n\r\n if(config && config.apiEndPoint) {\r\n apiEndPoint=config.apiEndPoint;\r\n }\r\n if(apiEndPoint !== ''){\r\n apiEndPoint=apiEndPoint+'/'\r\n }\r\n if(config!=null && config.withCredentials!=null){\r\n this.withCredentials=config.withCredentials;\r\n }\r\n\r\n this.projectCtxUrl = apiEndPoint + ProjectService.PROJECT_API_CTX;\r\n\r\n }\r\n\r\n private appendRequestUUIDForDevelopmentServer(url:string):string{\r\n let resUrl=url;\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n resUrl = resUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n return resUrl\r\n }\r\n\r\n projectUrl(id:string):string{\r\n let encPrjId=encodeURIComponent(id);\r\n return this.appendRequestUUIDForDevelopmentServer(this.projectCtxUrl + '/' + encPrjId);\r\n }\r\n\r\n projectResourceUrl(projectId: string,relResourcePath:string):string{\r\n let encPrjId=encodeURIComponent(projectId);\r\n // Use encodeURI here since the relatice resource path from recording scripts is already a URI\r\n // encodeURIComponent function would encode the slashes and fetching the resource would fail\r\n let encRelResPath=encodeURI(relResourcePath);\r\n return this.projectCtxUrl + '/' + encPrjId +'/'+encRelResPath;\r\n }\r\n\r\n projectObservable(id:string):Observable<Project>{\r\n let prjUrl=this.projectUrl(id);\r\n return this.http.get<Project>(prjUrl,{withCredentials: this.withCredentials})\r\n }\r\n\r\n}\r\n\r\n\r\n","import {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient} from \"@angular/common/http\";\r\nimport {ApiType, SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\nimport {Session} from \"./session\";\r\nimport {UUID} from \"../../utils/utils\";\r\nimport {Observable} from \"rxjs\";\r\nimport {ProjectService} from \"../project/project.service\";\r\n\r\n\r\n\r\n@Injectable()\r\nexport class SessionService {\r\n get uploadCount(): number {\r\n return this._uploadCount;\r\n }\r\n public static readonly SESSION_API_CTX='session';\r\n private apiEndPoint='';\r\n private sessionsUrl:string;\r\n private withCredentials:boolean=false;\r\n private _uploadCount=0;\r\n\r\n constructor(private http:HttpClient,@Inject(SPEECHRECORDER_CONFIG) private config?:SpeechRecorderConfig) {\r\n\r\n if(config && config.apiEndPoint) {\r\n this.apiEndPoint=config.apiEndPoint;\r\n }\r\n if(this.apiEndPoint !== ''){\r\n this.apiEndPoint=this.apiEndPoint+'/'\r\n }\r\n if(config!=null && config.withCredentials!=null){\r\n this.withCredentials=config.withCredentials;\r\n }\r\n this.sessionsUrl = this.apiEndPoint + SessionService.SESSION_API_CTX;\r\n }\r\n\r\n sessionObserver(id: string): Observable<Session> {\r\n\r\n let sessUrl = this.sessionsUrl + '/' + id;\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n sessUrl = sessUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n return this.http.get<Session>(sessUrl,{ withCredentials: this.withCredentials });\r\n\r\n }\r\n\r\n patchSessionObserver(session:Session,body:any): Observable<Session> {\r\n\r\n let sesssUrl = this.apiEndPoint + ProjectService.PROJECT_API_CTX + '/' + session.project + '/' + SessionService.SESSION_API_CTX + '/' + session.sessionId\r\n\r\n let wrapObs = new Observable<Session>(subscriber => {\r\n this._uploadCount++;\r\n let obs = this.http.patch<Session>(sesssUrl, body, {withCredentials: this.withCredentials});\r\n obs.subscribe((value) => {\r\n subscriber.next(value);\r\n }, error => {\r\n this._uploadCount--;\r\n subscriber.error(error);\r\n }, () => {\r\n this._uploadCount--;\r\n subscriber.complete();\r\n });\r\n });\r\n return wrapObs;\r\n }\r\n\r\n // putSessionObserver(session: Session): Observable<Session> {\r\n //\r\n // let sesssUrl = this.apiEndPoint + ProjectService.PROJECT_API_CTX + '/' + session.project + '/' + SessionService.SESSION_API_CTX + '/' + session.session\r\n //\r\n // let wrapObs = new Observable<Session>(subscriber => {\r\n // this._uploadCount++;\r\n // let obs = this.http.put<Session>(sesssUrl, session, {withCredentials: this.withCredentials});\r\n // obs.subscribe((value) => {\r\n // subscriber.next(value);\r\n // }, error => {\r\n // this._uploadCount--;\r\n // subscriber.error(error);\r\n // }, () => {\r\n // this._uploadCount--;\r\n // subscriber.complete();\r\n // });\r\n // });\r\n // return wrapObs;\r\n // }\r\n //\r\n\r\n\r\n}\r\n\r\n\r\n\r\n","import {Component,Input} from '@angular/core'\r\nimport {StartStopSignal, State} from '../startstopsignal'\r\n\r\n@Component({\r\n\r\n selector: 'app-simpletrafficlight',\r\n\r\n template: `\r\n\r\n <div>\r\n <div class=\"circle {{lighttop}}\"></div>\r\n <div class=\"circle {{lightmid}}\"></div>\r\n <div class=\"circle {{lightbottom}}\"></div>\r\n </div>\r\n `\r\n ,\r\n styles: [`.circle {\r\n width: 50px;\r\n height: 50px;\r\n border-radius: 50%;\r\n margin: 5px;\r\n background: grey;\r\n }`, `.red {\r\n background: red;\r\n }\r\n `, `\r\n .yellow {\r\n background: yellow;\r\n }\r\n `, `\r\n .green {\r\n background: green;\r\n }\r\n `, `\r\n .black {\r\n background: black;\r\n }`,\r\n `:host {\r\n display: flex;\r\n flex-direction: column;\r\n background: black;\r\n \r\n padding: 2px;\r\n height: 170px;\r\n max-height: 170px;\r\n flex: 0 0 content;\r\n }\r\n `]\r\n})\r\nexport class SimpleTrafficLight implements StartStopSignal {\r\n\r\n lighttop!: string;\r\n lightmid!: string;\r\n lightbottom!: string;\r\n\r\n constructor() {\r\n this.status=State.OFF;\r\n }\r\n\r\n @Input()\r\n set status(status: State) {\r\n if (State.OFF === status) {\r\n this.lighttop = 'grey';\r\n this.lightmid = 'grey';\r\n this.lightbottom = 'grey';\r\n } else if (State.IDLE === status) {\r\n this.lighttop = 'red';\r\n this.lightmid = 'grey';\r\n this.lightbottom = 'grey';\r\n } else if (State.PRERECORDING == status) {\r\n this.lighttop = 'red';\r\n this.lightmid = 'yellow';\r\n this.lightbottom = 'grey';\r\n } else if (State.RECORDING == status) {\r\n this.lighttop = 'grey';\r\n this.lightmid = 'grey';\r\n this.lightbottom = 'green';\r\n } else if (State.POSTRECORDING == status) {\r\n this.lighttop = 'grey';\r\n this.lightmid = 'yellow';\r\n this.lightbottom = 'grey';\r\n }\r\n }\r\n}\r\n\r\n\r\n","export class Position{\r\n constructor(public left:number,public top:number){\r\n\r\n }\r\n toString():string{\r\n return this.left+\",\"+this.top\r\n }\r\n}\r\n\r\n\r\nexport class Dimension {\r\n constructor(public width:number,public height:number){\r\n\r\n }\r\n toString():string{\r\n return this.width+\"x\"+this.height\r\n }\r\n}\r\n\r\n\r\nexport class Rectangle{\r\n\r\n constructor(public position:Position,public dimension:Dimension){\r\n\r\n }\r\n toString():string{\r\n return this.position+\":\"+this.dimension\r\n }\r\n}\r\n","import {Position,Dimension, Rectangle} from \"../math/2d/geometry\";\r\nimport { Directive } from \"@angular/core\";\r\n\r\n@Directive()\r\nexport abstract class CanvasLayerComponent{\r\n\r\n protected bounds:Rectangle|null=null;\r\n protected virtualDimension!:Dimension;\r\n protected canvasLayers:Array<HTMLCanvasElement>;\r\n\r\n constructor(){\r\n\r\n // TODO make clear that first element is background canvas\r\n this.canvasLayers=new Array<HTMLCanvasElement>();\r\n }\r\n\r\n toXViewPortPixelPosition(virtualX:number){\r\n let pixelPos=virtualX;\r\n if(this.bounds){\r\n pixelPos=Math.round(virtualX-this.bounds.position.left);\r\n }\r\n return pixelPos;\r\n }\r\n\r\n toXVirtualPixelPosition(viewPortX:number){\r\n let pixelPos=viewPortX;\r\n if(this.bounds){\r\n pixelPos=Math.round(viewPortX+this.bounds.position.left);\r\n }\r\n return pixelPos;\r\n }\r\n\r\n toViewPortPosition(virtualPos:Position):Position{\r\n\r\n if(this.bounds){\r\n return new Position(virtualPos.left-this.bounds.position.left,virtualPos.top-this.bounds.position.top);\r\n }else{\r\n return virtualPos;\r\n }\r\n }\r\n\r\n\r\n}\r\n"," export class AudioClip {\r\n private _buffer: AudioBuffer;\r\n private _selection:Selection|null=null;\r\n private selectionObservers:Array<(audioClip:AudioClip)=>void>;\r\n\r\n constructor(buffer: AudioBuffer) {\r\n this.selectionObservers=new Array<(audioClip:AudioClip)=>void>()\r\n this._buffer = buffer;\r\n }\r\n\r\n get buffer() {\r\n return this._buffer;\r\n };\r\n\r\n get selection(): Selection|null{\r\n return this._selection;\r\n }\r\n\r\n set selection(value: Selection|null) {\r\n this._selection = value;\r\n // let obsCnt=this.selectionObservers.length\r\n // this.selectionObservers.forEach((obs)=> {\r\n // console.log(\"Calling observer\")\r\n // obs(this)\r\n // });\r\n for(let selObs of this.selectionObservers){\r\n selObs(this)\r\n }\r\n }\r\n\r\n addSelectionObserver(selectionObserver:(audioClip:AudioClip)=>void,init=false){\r\n let obsAlreadyInList=this.selectionObservers.find((obs)=>(obs===selectionObserver))\r\n if(!obsAlreadyInList) {\r\n this.selectionObservers.push(selectionObserver)\r\n }\r\n if(init){\r\n selectionObserver(this)\r\n }\r\n }\r\n\r\n removeSelectionObserver(selectionObserver:(audioClip:AudioClip)=>void){\r\n this.selectionObservers=this.selectionObservers.filter((obs)=>{obs!==selectionObserver})\r\n }\r\n }\r\n\r\n export interface Reader {\r\n read(data: Blob): AudioClip;\r\n }\r\n export interface Writer {\r\n write(audioData: AudioClip): Blob;\r\n }\r\n\r\n export class Selection{\r\n private _sampleRate:number;\r\n private _startFrame:number;\r\n private _endFrame:number;\r\n\r\n constructor(sampleRate:number,startFrame:number,endFrame:number){\r\n this._sampleRate=sampleRate;\r\n this._startFrame=startFrame\r\n this._endFrame=endFrame;\r\n }\r\n\r\n get sampleRate(): number {\r\n return this._sampleRate;\r\n }\r\n get endFrame():number{\r\n return this._endFrame;\r\n }\r\n get startFrame(): number {\r\n return this._startFrame;\r\n }\r\n\r\n get leftFrame(): number {\r\n return (this._startFrame <= this._endFrame) ? this._startFrame : this._endFrame\r\n }\r\n get rightFrame(): number {\r\n return (this._startFrame <= this._endFrame) ? this._endFrame : this._startFrame\r\n }\r\n\r\n equals(otherSelection:Selection|null|undefined):boolean{\r\n if(otherSelection) {\r\n return (this._sampleRate == otherSelection._sampleRate && this._startFrame === otherSelection._startFrame && this._endFrame === otherSelection._endFrame);\r\n }\r\n return false;\r\n }\r\n\r\n toString(){\r\n return \"Selection: from: \"+this.leftFrame+\" to: \"+this.rightFrame+\" frame. Refers to sample rate :\"+this._sampleRate;\r\n }\r\n }\r\n\r\n\r\n","\r\n export class Point {\r\n constructor(private _x:number,private _y:number) {\r\n }\r\n get x():number{\r\n return this._x;\r\n }\r\n get y():number{\r\n return this._y;\r\n }\r\n }\r\n export class Marker {\r\n name: string|null=null;\r\n framePosition: number|null=null;\r\n\r\n }\r\n\r\n\r\n","import {CanvasLayerComponent} from \"../../ui/canvas_layer_comp\";\r\nimport {Selection} from '../persistor'\r\nimport { ElementRef, EventEmitter, HostListener, Input, Output, ViewChild, Directive } from \"@angular/core\";\r\nimport {Marker} from \"./common\";\r\nimport {Dimension, Rectangle} from \"../../math/2d/geometry\";\r\n\r\n\r\nexport class ViewSelection{\r\n get startX(): number {\r\n return this._startX;\r\n }\r\n\r\n get endX(): number {\r\n return this._endX;\r\n }\r\n\r\n width():number{\r\n return this._endX-this._startX\r\n }\r\n\r\n constructor(private _startX:number, private _endX:number){}\r\n}\r\n\r\n@Directive()\r\nexport abstract class BasicAudioCanvasLayerComponent extends CanvasLayerComponent {\r\n protected _audioData: AudioBuffer|null=null;\r\n protected _bgColor:string|null='white';\r\n protected _selectColor='rgba(0%,0%,100%,25%)';\r\n\r\n /**\r\n * Returns pixel position depending on current zoom setting.\r\n * @param framePos audio frame (sample) position\r\n */\r\n frameToXPixelPosition(framePos: number): number | null {\r\n let pixelPos=null;\r\n if (this._audioData && this._audioData.numberOfChannels > 0) {\r\n let ch0 = this._audioData.getChannelData(0);\r\n let frameLength = ch0.length;\r\n let vw;\r\n if(this.bounds) {\r\n vw = this.bounds.dimension.width;\r\n }\r\n if (this.virtualDimension) {\r\n vw = this.virtualDimension.width;\r\n }\r\n if(vw !== undefined) {\r\n pixelPos = framePos * vw / frameLength;\r\n }\r\n }\r\n return pixelPos;\r\n}\r\n\r\n /**\r\n * Returns pixel position in view port (visible window of scroll pane).\r\n * @param framePos audio frame (sample) position\r\n */\r\n frameToViewPortXPixelPosition(framePos: number): number | null {\r\n let pixelPos=this.frameToXPixelPosition(framePos);\r\n if(pixelPos!=null){\r\n let vPixelPos = this.toXViewPortPixelPosition(pixelPos);\r\n return vPixelPos;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n viewPortXPixelToFramePosition(xViewPortPixelPos: number): number | null {\r\n let vpXramePos=null;\r\n if (this._audioData && this._audioData.numberOfChannels > 0) {\r\n let ch0 = this._audioData.getChannelData(0);\r\n let frameLength = ch0.length;\r\n let vw;\r\n if (this.bounds) {\r\n vw= this.bounds.dimension.width;\r\n }\r\n if (this.virtualDimension) {\r\n vw = this.virtualDimension.width;\r\n }\r\n if(vw!== undefined) {\r\n let xVirtualPixelPos = this.toXVirtualPixelPosition(xViewPortPixelPos)\r\n let framesPerPixel = frameLength / vw;\r\n let framePos = framesPerPixel * xVirtualPixelPos;\r\n if (framePos < 0) {\r\n framePos = 0\r\n }\r\n if (framePos >= frameLength) {\r\n framePos = frameLength - 1\r\n }\r\n vpXramePos = Math.round(framePos);\r\n }\r\n }\r\n return vpXramePos;\r\n }\r\n\r\n layoutBounds(bounds:Rectangle, virtualDimension:Dimension,redraw: boolean) {\r\n\r\n this.bounds=bounds;\r\n this.virtualDimension=virtualDimension;\r\n //this.canvasLayers.forEach(cl=>{\r\n for(let ci=0;ci<this.canvasLayers.length;ci++) {\r\n let cl = this.canvasLayers[ci];\r\n const leftStyle=bounds.position.left+ 'px';\r\n if(cl.style.left!=leftStyle) {\r\n cl.style.left = leftStyle;\r\n }\r\n const topStyle=bounds.position.top + 'px';\r\n if(cl.style.top!=topStyle) {\r\n cl.style.top = topStyle;\r\n }\r\n }\r\n if (bounds.dimension.width) {\r\n let intW=Math.floor(bounds.dimension.width);\r\n if (redraw) {\r\n // Do not set width of background canvas (causes flicker on start render)\r\n for(let ci=1;ci<this.canvasLayers.length;ci++) {\r\n let cl = this.canvasLayers[ci];\r\n if(cl.width!=intW) {\r\n cl.width = intW;\r\n }\r\n }\r\n }\r\n let wStr = intW.toString() + 'px';\r\n for(let ci=0;ci<this.canvasLayers.length;ci++) {\r\n let cl = this.canvasLayers[ci];\r\n if(cl.style.width!=wStr) {\r\n cl.style.width = wStr;\r\n }\r\n }\r\n }\r\n if (bounds.dimension.height) {\r\n let intH=Math.floor(bounds.dimension.height)\r\n if (redraw) {\r\n // Do not set height of background canvas (causes flicker on start render)\r\n for(let ci=1;ci<this.canvasLayers.length;ci++) {\r\n let cl = this.canvasLayers[ci];\r\n if(cl.height!=intH) {\r\n cl.height = intH;\r\n }\r\n }\r\n }\r\n let hStr = intH + 'px';\r\n for(let ci=0;ci<this.canvasLayers.length;ci++) {\r\n let cl = this.canvasLayers[ci];\r\n if(cl.style.height!=hStr){\r\n cl.style.height = hStr;\r\n }\r\n }\r\n }\r\n //});\r\n\r\n\r\n }\r\n}\r\n\r\n@Directive()\r\nexport abstract class AudioCanvasLayerComponent extends BasicAudioCanvasLayerComponent {\r\n _pointerPosition:Marker|null=null;\r\n\r\n protected selectStartX:number|null=null;\r\n\r\n @ViewChild('bg', { static: true }) bgCanvasRef!: ElementRef;\r\n bgCanvas!: HTMLCanvasElement;\r\n\r\n @ViewChild('cursor', { static: true }) cursorCanvasRef!: ElementRef;\r\n cursorCanvas!: HTMLCanvasElement;\r\n\r\n @HostListener('document:mouseup', ['$event'])\r\n onMouseup(me: MouseEvent) {\r\n this.selectionCommit(me)\r\n }\r\n\r\n layoutBounds(bounds:Rectangle, virtualDimension:Dimension,redraw: boolean,clear:boolean=true) {\r\n super.layoutBounds(bounds,virtualDimension,redraw)\r\n if (redraw) {\r\n this.startDraw(clear);\r\n }\r\n }\r\n\r\n @Input() set pointerPosition(pointerPosition:Marker|null){\r\n this._pointerPosition=pointerPosition\r\n this.drawCursorLayer()\r\n }\r\n\r\n _selecting: Selection|null =null;\r\n @Input() set selecting(selecting:Selection| null){\r\n this._selecting=selecting\r\n this.drawBg()\r\n this.drawCursorLayer()\r\n }\r\n\r\n get selecting():Selection|null{\r\n return this._selecting\r\n }\r\n\r\n _selection: Selection|null =null\r\n @Input() set selection(selection:Selection|null){\r\n this._selection=selection;\r\n this.selecting=null;\r\n this.drawBg()\r\n this.drawCursorLayer()\r\n }\r\n\r\n get selection():Selection|null{\r\n return this._selection\r\n }\r\n\r\n selectionStart(me:MouseEvent){\r\n this.selectStartX=me.offsetX;\r\n }\r\n\r\n selectionCommit(me:MouseEvent){\r\n let vs:ViewSelection|null=null;\r\n if(this.selectStartX!=null) {\r\n vs=new ViewSelection(this.selectStartX,me.offsetX)\r\n this.selectStartX=null;\r\n this.select(vs);\r\n }\r\n }\r\n\r\n abstract startDraw(clear:boolean):void;\r\n\r\n updateCursorCanvas(me:MouseEvent,showCursorPosition=true){\r\n\r\n if (this.cursorCanvas) {\r\n\r\n let w = this.cursorCanvas.width;\r\n let h = this.cursorCanvas.height;\r\n let g = this.cursorCanvas.getContext(\"2d\");\r\n\r\n // if (!showCursorPosition) {\r\n // this.selectStartX = null\r\n // this.selectingChange(null)\r\n // }\r\n if (me) {\r\n if (this.selectStartX) {\r\n this.pointerPositionChanged(null)\r\n this.selectingChange(new ViewSelection(this.selectStartX, me.offsetX));\r\n } else {\r\n if (showCursorPosition) {\r\n this.pointerPositionChanged(me.offsetX)\r\n }else{\r\n this.pointerPositionChanged(null)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n @Output() pointerPositionEventEmitter = new EventEmitter<Marker>();\r\n @Output() selectingEventEmitter = new EventEmitter<Selection>();\r\n @Output() selectedEventEmitter = new EventEmitter<Selection>();\r\n\r\n\r\n pointerPositionChanged(xPosition:number| null){\r\n let pointerPosition:Marker|undefined=undefined;\r\n if(xPosition){\r\n pointerPosition=new Marker();\r\n let vpXPos=this.viewPortXPixelToFramePosition(xPosition);\r\n if(vpXPos!=null) {\r\n pointerPosition.framePosition =vpXPos;\r\n }\r\n }\r\n this.pointerPositionEventEmitter.emit(pointerPosition);\r\n }\r\n\r\n selectingChange(viewSel:ViewSelection| null){\r\n let ns:Selection|undefined=undefined;\r\n if(viewSel) {\r\n let frameStart = this.viewPortXPixelToFramePosition(viewSel.startX)\r\n let frameEnd = this.viewPortXPixelToFramePosition(viewSel.endX)\r\n if(this._audioData && frameStart!=null && frameEnd!=null) {\r\n ns = new Selection(this._audioData.sampleRate, frameStart, frameEnd);\r\n }\r\n }\r\n this.selectingEventEmitter.emit(ns)\r\n }\r\n\r\n select(viewSel:ViewSelection| null){\r\n let ns:Selection|undefined=undefined;\r\n if(viewSel) {\r\n let frameStart = this.viewPortXPixelToFramePosition(viewSel.startX)\r\n let frameEnd = this.viewPortXPixelToFramePosition(viewSel.endX)\r\n if(this._audioData && frameStart!=null && frameEnd!=null) {\r\n ns = new Selection(this._audioData.sampleRate, frameStart, frameEnd);\r\n }\r\n }\r\n this.selectedEventEmitter.emit(ns)\r\n }\r\n\r\n viewSelection():ViewSelection|null{\r\n let vs:ViewSelection|null=null;\r\n let s:Selection|null=null;\r\n if(this._selecting){\r\n s=this._selecting\r\n }else if(this._selection){\r\n s=this._selection\r\n }\r\n if(s){\r\n let sf=s.startFrame;\r\n let ef=s.endFrame;\r\n let xs=this.frameToViewPortXPixelPosition(sf)\r\n let xe=this.frameToViewPortXPixelPosition(ef)\r\n if(xs!=null && xe!=null) {\r\n vs = new ViewSelection(xs, xe)\r\n }\r\n }\r\n return vs;\r\n }\r\n\r\n\r\n drawBg(){\r\n if(this.bgCanvas && this.bounds) {\r\n this.bgCanvas.style.left = Math.round(this.bounds.position.left).toString() + 'px';\r\n this.bgCanvas.width = Math.round(this.bounds.dimension.width);\r\n this.bgCanvas.height = Math.round(this.bounds.dimension.height);\r\n let g1 = this.bgCanvas.getContext(\"2d\");\r\n if (g1) {\r\n let w = this.bgCanvas.width;\r\n let h = this.bgCanvas.height;\r\n g1.clearRect(0, 0, w, h);\r\n if(this._bgColor) {\r\n g1.fillStyle = this._bgColor;\r\n g1.fillRect(0, 0, w, h);\r\n }\r\n let vs = this.viewSelection()\r\n if (vs) {\r\n g1.fillStyle = this._selectColor;\r\n g1.fillRect(vs.startX, 0, vs.width(), h);\r\n }\r\n }\r\n }\r\n }\r\n drawCursorLayer(){\r\n if (this.cursorCanvas) {\r\n let w = this.cursorCanvas.width;\r\n let h = this.cursorCanvas.height;\r\n let g = this.cursorCanvas.getContext(\"2d\");\r\n if(g) {\r\n g.clearRect(0, 0, w, h);\r\n // let s:Selection=null;\r\n // if(this._selecting){\r\n // s=this._selecting\r\n // }else if(this._selection){\r\n // s=this._selection\r\n // }\r\n // if(s){\r\n // let sf=s.startFrame\r\n // let ef=s.endFrame\r\n // let xs=this.frameToViewPortXPixelPosition(sf)\r\n // let xe=this.frameToViewPortXPixelPosition(ef)\r\n // let sw=xe-xs\r\n // g.fillStyle = 'rgba(0%,0%,100%,25%)';\r\n // g.fillRect(xs,0,sw,h);\r\n // }\r\n\r\n if(this._pointerPosition){\r\n\r\n let framePos=this._pointerPosition.framePosition\r\n if(framePos) {\r\n let xViewPortPixelpos = this.frameToViewPortXPixelPosition(framePos)\r\n if (xViewPortPixelpos) {\r\n\r\n g.fillStyle = 'yellow';\r\n g.strokeStyle = 'yellow';\r\n g.beginPath();\r\n g.moveTo(xViewPortPixelpos, 0);\r\n g.lineTo(xViewPortPixelpos, h);\r\n g.closePath();\r\n\r\n g.stroke();\r\n\r\n if (this._audioData) {\r\n g.font = '14px sans-serif';\r\n g.fillStyle = 'yellow';\r\n g.fillText(framePos.toString(), xViewPortPixelpos + 2, 50);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n","import {Component, ViewChild, ElementRef} from '@angular/core';\r\nimport {AudioCanvasLayerComponent} from \"./audio_canvas_layer_comp\";\r\nimport {WorkerHelper} from \"../../utils/utils\";\r\n\r\ndeclare function postMessage(message: any, transfer: Array<any>): void;\r\n\r\n@Component({\r\n\r\n selector: 'audio-signal',\r\n template: `\r\n <canvas #bg height=\"10\"></canvas>\r\n <canvas #audioSignal height=\"10\"></canvas>\r\n <canvas #cursor height=\"10\" (mousedown)=\"selectionStart($event)\" (mouseover)=\"updateCursorCanvas($event)\" (mousemove)=\"updateCursorCanvas($event)\"\r\n (mouseleave)=\"updateCursorCanvas($event, false)\"></canvas>\r\n <canvas #marker height=\"10\"></canvas>`,\r\n\r\n styles: [`:host{\r\n min-height: 0px;\r\n }`,`canvas {\r\n top: 0;\r\n left: 0;\r\n width: 0;\r\n height: 0;\r\n min-height: 0px;\r\n position: absolute;\r\n }`]\r\n\r\n})\r\nexport class AudioSignal extends AudioCanvasLayerComponent{\r\n\r\n n: any;\r\n ce!: HTMLDivElement;\r\n @ViewChild('audioSignal', { static: true }) audioSignalCanvasRef!: ElementRef;\r\n @ViewChild('marker', { static: true }) playPosCanvasRef!: ElementRef;\r\n signalCanvas!: HTMLCanvasElement;\r\n\r\n markerCanvas!: HTMLCanvasElement;\r\n\r\n private _playFramePosition: number|null=null;\r\n private worker: Worker | null;\r\n private workerURL: string;\r\n\r\n constructor(private ref: ElementRef) {\r\n super();\r\n this.worker = null;\r\n this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction)\r\n this._audioData = null;\r\n this._bgColor='black';\r\n this._selectColor='rgba(255,255,0,0.8)'\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.ce = this.ref.nativeElement;\r\n this.bgCanvas = this.bgCanvasRef.nativeElement;\r\n this.bgCanvas.style.zIndex = '1';\r\n this.signalCanvas = this.audioSignalCanvasRef.nativeElement;\r\n this.signalCanvas.style.zIndex = '2';\r\n this.markerCanvas = this.playPosCanvasRef.nativeElement;\r\n this.markerCanvas.style.zIndex = '3';\r\n this.cursorCanvas = this.cursorCanvasRef.nativeElement;\r\n this.cursorCanvas.style.zIndex = '4';\r\n\r\n this.canvasLayers[0]=this.bgCanvas;\r\n this.canvasLayers[1]=this.signalCanvas;\r\n this.canvasLayers[2]=this.cursorCanvas;\r\n this.canvasLayers[3]=this.markerCanvas;\r\n\r\n }\r\n\r\n get playFramePosition(): number |null{\r\n return this._playFramePosition;\r\n }\r\n\r\n set playFramePosition(playFramePosition: number|null) {\r\n this._playFramePosition = playFramePosition;\r\n this.drawPlayPosition();\r\n }\r\n\r\n\r\n\r\n drawPlayPosition() {\r\n if (this.markerCanvas) {\r\n let w = this.markerCanvas.width;\r\n let h = this.markerCanvas.height;\r\n let g = this.markerCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n if(this._playFramePosition) {\r\n let pixelPos = this.frameToViewPortXPixelPosition(this._playFramePosition);\r\n if (pixelPos) {\r\n g.fillStyle = 'red';\r\n g.strokeStyle = 'red';\r\n g.beginPath();\r\n g.moveTo(pixelPos, 0);\r\n g.lineTo(pixelPos, h);\r\n g.closePath();\r\n g.stroke();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /*\r\n * Method used as worker code.\r\n */\r\n workerFunction() {\r\n addEventListener('message', ({ data }) => {\r\n\r\n let audioData = data.audioData;\r\n let l= data.l;\r\n let w = data.w;\r\n let h = data.h;\r\n let vw = data.vw;\r\n let chs = data.chs;\r\n let frameLength = data.frameLength;\r\n let psMinMax= new Float32Array(0);\r\n\r\n if(audioData && w>=0 && vw>0) {\r\n\r\n let framesPerPixel = frameLength / vw;\r\n\r\n let y = 0;\r\n let pointsLen = w * chs;\r\n // one for min one for max\r\n let arrLen = pointsLen * 2;\r\n psMinMax = new Float32Array(arrLen);\r\n let chFramePos = 0;\r\n for (let ch = 0; ch < chs; ch++) {\r\n let x = 0;\r\n\r\n chFramePos = ch * frameLength;\r\n for (let pii = 0; pii < w; pii++) {\r\n let virtPii=l+pii;\r\n let pMin = Infinity;\r\n let pMax = -Infinity;\r\n let pixelFramePos = Math.round(chFramePos + (virtPii * framesPerPixel));\r\n\r\n // calculate pixel min/max amplitude\r\n for (let ai = 0; ai < framesPerPixel; ai++) {\r\n let framePos = pixelFramePos + ai;\r\n\r\n let a = 0;\r\n if(framePos>=0 && framePos<audioData.length){\r\n a=audioData[framePos];\r\n }\r\n if (a < pMin) {\r\n pMin = a;\r\n }\r\n if (a > pMax) {\r\n pMax = a;\r\n }\r\n }\r\n\r\n let psMinPos = ch * w + pii;\r\n psMinMax[psMinPos] = pMin;\r\n let psMaxPos = pointsLen + psMinPos;\r\n psMinMax[psMaxPos] = pMax;\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n\r\n postMessage({psMinMax: psMinMax, l:data.l,t:data.t,w: data.w, h: data.h, chs: data.chs}, [psMinMax.buffer]);\r\n })\r\n }\r\n\r\n startDraw(clear = true) {\r\n if (clear) {\r\n if(this.bounds) {\r\n this.signalCanvas.style.left = Math.round(this.bounds.position.left).toString() + 'px';\r\n this.signalCanvas.width = Math.round(this.bounds.dimension.width);\r\n this.signalCanvas.height = Math.round(this.bounds.dimension.height);\r\n\r\n let g = this.signalCanvas.getContext(\"2d\");\r\n if (g) {\r\n //g.clearRect(0, 0,w, h);\r\n g.fillStyle = \"black\";\r\n g.fillRect(0, 0, Math.round(this.bounds.dimension.width), Math.round(this.bounds.dimension.height));\r\n }\r\n }\r\n }\r\n this.startRender();\r\n this.drawCursorLayer()\r\n }\r\n\r\n\r\n private startRender() {\r\n\r\n if (this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n if (this.bounds && this.bounds.dimension) {\r\n\r\n let w = Math.round(this.bounds.dimension.width);\r\n let h = Math.round(this.bounds.dimension.height);\r\n\r\n if (this._audioData && w>0 && h>0) {\r\n //this.wo = new Worker('./audiosignal.worker.js',{type: 'module'});\r\n this.worker = new Worker(this.workerURL);\r\n //this.wo = new Worker('worker/audiosignal.worker.ts');\r\n\r\n //let Worker = require('worker!../../../workers/uploader/main');\r\n let chs = this._audioData.numberOfChannels;\r\n\r\n let frameLength = this._audioData.getChannelData(0).length;\r\n // if(frameLength != this.audioData.getChannelData(1).length){\r\n // alert(\"Ungleiche Länge\");\r\n // }\r\n let ad = new Float32Array(chs * frameLength);\r\n for (let ch = 0; ch < chs; ch++) {\r\n ad.set(this._audioData.getChannelData(ch), ch * frameLength);\r\n }\r\n //let start = Date.now();\r\n if (this.worker) {\r\n this.worker.onmessage = (me) => {\r\n //console.log(\"As rendertime: \", Date.now() - start);\r\n this.drawRendered(me);\r\n if (this.worker) {\r\n this.worker.terminate();\r\n }\r\n this.worker = null;\r\n }\r\n }\r\n this.worker.postMessage({\r\n l: Math.round(this.bounds.position.left),\r\n t: Math.round(this.bounds.position.top),\r\n w: w,\r\n h: h,\r\n vw: Math.round(this.virtualDimension.width),\r\n chs: chs,\r\n frameLength: frameLength,\r\n audioData: ad\r\n }, [ad.buffer]);\r\n } else {\r\n let g = this.signalCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n drawRendered(me: MessageEvent) {\r\n this.drawBg();\r\n this.signalCanvas.style.left=me.data.l.toString()+'px';\r\n this.signalCanvas.width = me.data.w;\r\n this.signalCanvas.height = me.data.h;\r\n let g = this.signalCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.clearRect(0, 0, me.data.w, me.data.h);\r\n //g.fillStyle = \"black\";\r\n //g.fillRect(0, 0, me.data.w, me.data.h);\r\n let pointsLen = me.data.w * me.data.chs;\r\n // one for min one for max\r\n let arrLen = pointsLen * 2;\r\n if (this._audioData) {\r\n let std = Date.now();\r\n\r\n let chH = me.data.h / me.data.chs;\r\n\r\n let y = 0;\r\n for (let ch = 0; ch < me.data.chs; ch++) {\r\n let x = 0;\r\n\r\n let psMinPos = ch * me.data.w;\r\n let psMaxPos = pointsLen + psMinPos;\r\n\r\n g.fillStyle = 'green';\r\n g.strokeStyle = 'green';\r\n\r\n // draw audio signal as single polygon\r\n g.beginPath();\r\n g.moveTo(0, y + (chH / 2) + me.data.psMinMax[psMaxPos] * chH / 2);\r\n\r\n for (let pii = 0; pii < me.data.w; pii++) {\r\n let psMax = me.data.psMinMax[psMaxPos + pii];\r\n let pv = psMax * chH / 2;\r\n let yd=y + (chH / 2) - pv;\r\n //console.log(\"LineTo: : \"+pii+\" \"+yd)\r\n g.lineTo(pii, yd);\r\n }\r\n let revPixelStart=me.data.w-1;\r\n\r\n for (let pii = revPixelStart; pii >= 0; pii--) {\r\n let psMin = me.data.psMinMax[psMinPos + pii];\r\n let pv = psMin * chH / 2;\r\n let yd=y + (chH / 2) - pv;\r\n //console.log(\"LineTo: : \"+pii+\" \"+yd)\r\n g.lineTo(pii, yd);\r\n }\r\n g.closePath();\r\n\r\n g.fill();\r\n g.stroke();\r\n y += chH;\r\n }\r\n\r\n //this.drawPlayPosition();\r\n }\r\n }\r\n }\r\n\r\n redraw() {\r\n this.drawBg()\r\n let g = this.signalCanvas.getContext(\"2d\");\r\n if (g) {\r\n let w = this.signalCanvas.width;\r\n let h = this.signalCanvas.height;\r\n g.clearRect(0, 0, w, h);\r\n //g.fillStyle = \"black\";\r\n //g.fillRect(0, 0, w, h);\r\n if (this._audioData) {\r\n let std = Date.now();\r\n let chs = this._audioData.numberOfChannels;\r\n let chH = h / chs;\r\n\r\n let frameLength = this._audioData.getChannelData(0).length;\r\n\r\n let framesPerPixel = frameLength / w;\r\n let y = 0;\r\n for (let ch = 0; ch < chs; ch++) {\r\n let x = 0;\r\n let psMin = new Float32Array(w);\r\n let psMax = new Float32Array(w);\r\n let framePos = 0;\r\n for (let pii = 0; pii < w; pii++) {\r\n let pMin = 0;\r\n let pMax = 0;\r\n\r\n // calculate pixel min/max amplitude\r\n for (let ai = 0; ai < framesPerPixel; ai++) {\r\n //let framePos=(pii*framesPerPixel)+ai;\r\n let a = this._audioData.getChannelData(ch)[framePos++];\r\n\r\n if (a < pMin) {\r\n pMin = a;\r\n }\r\n if (a > pMax) {\r\n pMax = a;\r\n }\r\n }\r\n psMin[pii] = pMin;\r\n psMax[pii] = pMax;\r\n //console.log(\"Min: \", pMin, \" max: \", pMax);\r\n\r\n }\r\n\r\n g.fillStyle = 'green';\r\n g.strokeStyle = 'green';\r\n\r\n // draw audio signal as single polygon\r\n g.beginPath();\r\n g.moveTo(0, y + (chH / 2) + psMin[0] * chH / 2);\r\n\r\n for (let pii = 0; pii < w; pii++) {\r\n let pv = psMin[pii] * chH / 2;\r\n //console.log(\"Min: \",pv);\r\n g.lineTo(pii, y + (chH / 2) + pv);\r\n }\r\n for (let pii = w; pii >= 0; pii--) {\r\n let pv = psMax[pii] * chH / 2;\r\n //console.log(\"Max: \",pv);\r\n g.lineTo(pii, y + (chH / 2) + pv);\r\n }\r\n g.closePath();\r\n //g.lineTo()\r\n g.fill();\r\n g.stroke();\r\n g.fillStyle = \"yellow\";\r\n g.stroke();\r\n y += chH;\r\n }\r\n\r\n //this.drawPlayPosition();\r\n }\r\n }\r\n }\r\n\r\n setData(audioData: AudioBuffer | null) {\r\n this._audioData = audioData;\r\n this.playFramePosition = 0;\r\n }\r\n}\r\n\r\n","\n export class Complex {\n\n real: number;\n img: number;\n\n public static fromPolarForm(magnitude: number, argument: number): Complex {\n const r = Math.cos(argument) * magnitude;\n const i = Math.sin(argument) * magnitude;\n return new Complex(r, i);\n }\n constructor(real: number, img: number) {\n this.real = real;\n this.img = img;\n }\n public magnitude(): number {\n return Math.sqrt((this.real * this.real) + (this.img * this.img));\n }\n\n public argument(): number {\n return Math.atan2(this.img, this.real);\n }\n\n public add(addC: Complex): Complex {\n return new Complex(this.real + addC.real, this.img + addC.img);\n }\n\n public sub(subC: Complex): Complex {\n return new Complex(this.real - subC.real, this.img - subC.img);\n }\n\n public mult(multC: Complex): Complex {\n const multR = (this.real * multC.real) - (this.img * multC.img);\n const multI = (this.real * multC.img) + (multC.real * this.img);\n return new Complex(multR, multI);\n }\n\n public multReal(multF: number): Complex {\n return new Complex(this.real * multF, this.img * multF);\n }\n\n public div(divisor: Complex): Complex {\n const divReal = divisor.real;\n const divImg = divisor.img;\n const div = (divReal * divReal) + (divImg * divImg);\n const divisionReal = ((this.real * divReal) + (this.img * divImg)) / div;\n const divisionImg = ((divReal * this.img) - (this.real * divImg)) / div;\n\n return new Complex(divisionReal, divisionImg);\n }\n\n public divReal(divisor: number): Complex {\n const div = divisor * divisor;\n const divsionReal = (this.real * divisor) / div;\n const divsionImg = (divisor * this.img) / div;\n\n return new Complex(divsionReal, divsionImg);\n }\n\n public conjugate(): Complex {\n return new Complex(this.real, -this.img);\n }\n\n public equals(c: Complex): boolean {\n if (c === null) {\n return false;\n }\n return (this.real === c.real && this.img === c.img);\n }\n\n public toString(): string {\n return 'Real: ' + this.real + ', Img: ' + this.img;\n }\n }\n","import { Complex } from './complex';\n\n export class DFTFloat32 {\n\n private n: number;\n private m: number;\n\n private cosLookup: Float32Array;\n private sinLookup: Float32Array;\n\n constructor(n: number) {\n this.n = n;\n this.m = Math.log(n) / Math.log(2);\n\n // if(n != (1 << m))throw new RuntimeException(\"length N must be power of 2\");\n\n // lookup tables\n this.cosLookup = new Float32Array(n / 2);\n this.sinLookup = new Float32Array(n / 2);\n\n for (let i = 0; i < n / 2; i++) {\n const arc = (-2 * Math.PI * i) / n;\n this.cosLookup[i] = Math.cos(arc);\n this.sinLookup[i] = Math.sin(arc);\n }\n }\n\n public processReal(srcBuf: Float32Array): Array<Complex> {\n const x = srcBuf.slice();\n const y = new Float32Array(srcBuf.length);\n for (let yi = 0; yi < y.length; yi++) {\n y[yi] = 0.0;\n }\n this.fftCooleyTukey(x, y);\n const rc = new Array<Complex>(x.length);\n for (let i = 0; i < x.length; i++) {\n rc[i] = new Complex(x[i], y[i]);\n }\n return rc;\n }\n\n public processRealMagnitude(srcBuf: Float32Array): Float32Array {\n const x = srcBuf.slice();\n const y = new Float32Array(srcBuf.length);\n for (let yi = 0; yi < y.length; yi++) {\n y[yi] = 0.0;\n }\n this.fftCooleyTukey(x, y);\n const rc = new Float32Array(x.length);\n for (let i = 0; i < x.length; i++) {\n const rcc = new Complex(x[i], y[i]);\n rc[i] = rcc.magnitude();\n }\n return rc;\n }\n\n public fftCooleyTukey(real: Float32Array, img: Float32Array): void {\n let i: number;\n let j = 0;\n let k: number;\n let n1: number;\n let n2: number = this.n / 2;\n let a: number;\n let c: number;\n let s: number;\n let t1: number;\n let t2: number;\n\n for (i = 1; i < this.n - 1; i++) {\n n1 = n2;\n while (j >= n1) {\n j = j - n1;\n n1 = n1 / 2;\n }\n j = j + n1;\n\n if (i < j) {\n t1 = real[i];\n real[i] = real[j];\n real[j] = t1;\n t1 = img[i];\n img[i] = img[j];\n img[j] = t1;\n }\n }\n\n n1 = 0;\n n2 = 1;\n for (i = 0; i < this.m; i++) {\n n1 = n2;\n n2 = n2 + n2;\n a = 0;\n for (j = 0; j < n1; j++) {\n c = this.cosLookup[a];\n s = this.sinLookup[a];\n a += ( 1 << (this.m - i - 1));\n\n for (k = j; k < this.n; k = k + n2) {\n t1 = c * real[k + n1] - s * img[k + n1];\n t2 = s * real[k + n1] + c * img[k + n1];\n real[k + n1] = real[k] - t1;\n img[k + n1] = img[k] - t2;\n real[k] = real[k] + t1;\n img[k] = img[k] + t2;\n }\n }\n }\n }\n\n\n public process(t: Array<Complex>): Array<Complex> {\n const reals: Float32Array = new Float32Array(this.n);\n const imgs: Float32Array = new Float32Array(this.n);\n const trans: Array<Complex> = new Array<Complex>(this.n);\n for (let i = 0; i < this.n; i++) {\n reals[i] = t[i].real;\n imgs[i] = t[i].img;\n }\n this.fftCooleyTukey(reals, imgs);\n for (let i = 0; i < this.n; i++) {\n trans[i] = new Complex(reals[i], imgs[i]);\n }\n return trans;\n\n\n }\n\n }\n export class DFT {\n\n private n: number;\n private m: number;\n\n private cosLookup: Array<number>;\n private sinLookup: Array<number>;\n\n constructor(n: number) {\n this.n = n;\n this.m = Math.log(n) / Math.log(2);\n\n // if(n != (1 << m))throw new RuntimeException(\"length N must be power of 2\");\n\n // lookup tables\n this.cosLookup = new Array<number>(n / 2);\n this.sinLookup = new Array<number>(n / 2);\n\n for (let i = 0; i < n / 2; i++) {\n const arc = (-2 * Math.PI * i) / n;\n this.cosLookup[i] = Math.cos(arc);\n this.sinLookup[i] = Math.sin(arc);\n }\n }\n\n public processReal(srcBuf: Array<number>): Array<Complex> {\n const x = srcBuf.slice();\n const y = new Array<number>(srcBuf.length);\n for (let yi = 0; yi < y.length; yi++) {\n y[yi] = 0.0;\n }\n this.fftCooleyTukey(x, y);\n const rc = new Array<Complex>(x.length);\n for (let i = 0; i < x.length; i++) {\n rc[i] = new Complex(x[i], y[i]);\n }\n return rc;\n }\n\n public fftCooleyTukey(real: Array<number>, img: Array<number>): void {\n let i: number;\n let j = 0;\n let k: number;\n let n1: number;\n let n2: number = this.n / 2;\n let a: number;\n let c: number;\n let s: number;\n let t1: number;\n let t2: number;\n\n for (i = 1; i < this.n - 1; i++) {\n n1 = n2;\n while (j >= n1) {\n j = j - n1;\n n1 = n1 / 2;\n }\n j = j + n1;\n\n if (i < j) {\n t1 = real[i];\n real[i] = real[j];\n real[j] = t1;\n t1 = img[i];\n img[i] = img[j];\n img[j] = t1;\n }\n }\n\n n1 = 0;\n n2 = 1;\n for (i = 0; i < this.m; i++) {\n n1 = n2;\n n2 = n2 + n2;\n a = 0;\n for (j = 0; j < n1; j++) {\n c = this.cosLookup[a];\n s = this.sinLookup[a];\n a += 1 << (this.m - i - 1);\n\n for (k = j; k < this.n; k = k + n2) {\n t1 = c * real[k + n1] - s * img[k + n1];\n t2 = s * real[k + n1] + c * img[k + n1];\n real[k + n1] = real[k] - t1;\n img[k + n1] = img[k] - t2;\n real[k] = real[k] + t1;\n img[k] = img[k] + t2;\n }\n }\n }\n }\n\n\n public process(t: Array<Complex>): Array<Complex> {\n const reals: Array<number> = new Array<number>(this.n);\n const imgs: Array<number> = new Array<number>(this.n);\n const trans: Array<Complex> = new Array<Complex>(this.n);\n for (let i = 0; i < this.n; i++) {\n reals[i] = t[i].real;\n imgs[i] = t[i].img;\n }\n this.fftCooleyTukey(reals, imgs);\n for (let i = 0; i < this.n; i++) {\n trans[i] = new Complex(reals[i], imgs[i]);\n }\n return trans;\n }\n\n }\n\n","\n export class DSPUtils {\n\n private static OCTAVE_FACTOR: number = 1.0 / (Math.log(2) / Math.log(10));\n\n /**\n * Get normalized amplitude level in dB\n * @param linearLevel a normalized positive linear level (1.0 corresponds to 0dB)\n * @return level in dB\n */\n public static toLevelInDB(linearLevel: number): number {\n if (linearLevel < 0) {\n throw new RangeError('Linear level argument must be positive.');\n }\n\n return 10 * Math.log(linearLevel) / Math.log(10);\n }\n\n\n public static toLinearLevel(dbLevel: number): number {\n return Math.pow(10, (dbLevel / 10));\n }\n\n /**\n * Get normalized amplitude power level in dB\n * @param linearLevel a normalized positive linear level (1.0 corresponds to 0dB)\n * @return power level in dB\n */\n public static toPowerLevelInDB(linearLevel: number): number {\n if (linearLevel < 0) {\n throw new RangeError('Linear level argument must be positive.');\n }\n return 20 * Math.log(linearLevel) / Math.log(10);\n }\n\n public static toPowerLinearLevel(dbLevel: number): number {\n return Math.pow(10, (dbLevel / 20));\n }\n\n public static toOctaves(fq: number): number {\n return DSPUtils.OCTAVE_FACTOR * Math.log(fq) / Math.log(10);\n }\n\n public static maxLevel(audioBuffer: AudioBuffer): number {\n let ml = 0.0;\n for (let ch = 0; ch < audioBuffer.numberOfChannels; ch++) {\n const chArr = audioBuffer.getChannelData(ch);\n for (let s = 0; s < chArr.length; s++) {\n const l = Math.abs(chArr[s]);\n if (l > ml) {\n ml = l;\n }\n }\n }\n return ml;\n }\n\n }\n","\n\n export class Utils {\n public static toHexString(val: number, radix: number, numberOfDigits: number): string {\n const intVal = Math.round(val);\n let str = intVal.toString(radix);\n const countFillChars = numberOfDigits - str.length;\n if (countFillChars > 0) {\n for (let i = 0; i < countFillChars; i++) {\n str = str + 0;\n }\n }\n return str;\n }\n }\n\n","import { Utils } from '../math/utils';\n\n export class CSSUtils {\n\n static toColorString(red: number, green: number, blue: number): string {\n return '#' + Utils.toHexString(red, 16, 2) + Utils.toHexString(green, 16, 2) + Utils.toHexString(blue, 16, 2);\n }\n }\n","import {DFTFloat32} from '../../math/dft';\r\nimport {DSPUtils} from '../../dsp/utils'\r\nimport {CSSUtils} from '../../utils/css_utils'\r\nimport {Marker, Point} from './common';\r\nimport {Component, ElementRef, ViewChild} from \"@angular/core\";\r\nimport {AudioCanvasLayerComponent} from \"./audio_canvas_layer_comp\";\r\nimport {WorkerHelper} from \"../../utils/utils\";\r\n\r\ndeclare function postMessage(message: any, transfer: Array<any>): void;\r\n\r\nconst DEFAULT_DFT_SIZE = 1024;\r\n\r\n@Component({\r\n\r\n selector: 'audio-sonagram',\r\n template: `\r\n <canvas #sonagram height=\"10\"></canvas>\r\n <canvas #bg height=\"10\"></canvas>\r\n <canvas #cursor height=\"10\" (mousedown)=\"selectionStart($event)\" (mouseover)=\"updateCursorCanvas($event)\" (mousemove)=\"updateCursorCanvas($event)\"\r\n (mouseleave)=\"updateCursorCanvas($event, false)\"></canvas>\r\n <canvas #marker height=\"10\"></canvas>`,\r\n\r\n styles: [`:host{\r\n min-height: 0px;\r\n }`,`canvas {\r\n top: 0;\r\n left: 0;\r\n width: 0;\r\n height: 0;\r\n min-height: 0px;\r\n position: absolute;\r\n }`]\r\n\r\n})\r\nexport class Sonagram extends AudioCanvasLayerComponent {\r\n\r\n dft: DFTFloat32;\r\n n: any;\r\n ce!: HTMLDivElement;\r\n sonagramCanvas!: HTMLCanvasElement;\r\n //cursorCanvas: HTMLCanvasElement;\r\n markerCanvas!: HTMLCanvasElement;\r\n @ViewChild('sonagram', { static: true }) sonagramCanvasRef!: ElementRef;\r\n\r\n @ViewChild('marker', { static: true }) markerCanvasRef!: ElementRef;\r\n markers: Array<Marker>;\r\n private _playFramePosition: number|null=null;\r\n\r\n private worker: Worker | null;\r\n private workerURL: string;\r\n private dftSize = DEFAULT_DFT_SIZE;\r\n\r\n constructor(private ref: ElementRef) {\r\n super();\r\n this.worker = null;\r\n this._audioData = null;\r\n this.markers = new Array<Marker>();\r\n this.dft = new DFTFloat32(this.dftSize);\r\n\r\n this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction)\r\n this._bgColor=null;\r\n this._selectColor='rgba(255,255,0,0.1)'\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.ce = this.ref.nativeElement;\r\n this.sonagramCanvas = this.sonagramCanvasRef.nativeElement;\r\n this.sonagramCanvas.style.zIndex = '1';\r\n this.bgCanvas = this.bgCanvasRef.nativeElement;\r\n this.bgCanvas.style.zIndex = '2';\r\n this.cursorCanvas = this.cursorCanvasRef.nativeElement;\r\n this.cursorCanvas.style.zIndex = '4';\r\n this.markerCanvas = this.markerCanvasRef.nativeElement;\r\n this.markerCanvas.style.zIndex = '3';\r\n\r\n this.canvasLayers[0] = this.sonagramCanvas;\r\n this.canvasLayers[1] = this.bgCanvas;\r\n this.canvasLayers[2] = this.cursorCanvas;\r\n this.canvasLayers[3] = this.markerCanvas;\r\n\r\n }\r\n\r\n get playFramePosition(): number|null {\r\n return this._playFramePosition;\r\n }\r\n\r\n set playFramePosition(playFramePosition: number|null) {\r\n this._playFramePosition = playFramePosition;\r\n // this.redraw();\r\n this.drawPlayPosition();\r\n }\r\n\r\n private canvasMousePos(c: HTMLCanvasElement, e: MouseEvent): Point {\r\n const cr = c.getBoundingClientRect();\r\n\r\n const x = e.x - cr.left;\r\n const y = e.y - cr.top;\r\n return new Point(x,y);\r\n }\r\n\r\n drawCursorPosition(e: MouseEvent, show: boolean) {\r\n\r\n if (this.cursorCanvas) {\r\n const w = this.cursorCanvas.width;\r\n const h = this.cursorCanvas.height;\r\n const g = this.cursorCanvas.getContext('2d');\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n if (show) {\r\n const pp = this.canvasMousePos(this.cursorCanvas, e);\r\n let xViewPortPixelpos = e.offsetX;\r\n\r\n g.fillStyle = 'yellow';\r\n g.strokeStyle = 'yellow';\r\n g.beginPath();\r\n g.moveTo(xViewPortPixelpos, 0);\r\n g.lineTo(xViewPortPixelpos, h);\r\n g.closePath();\r\n\r\n g.stroke();\r\n\r\n if (this._audioData) {\r\n\r\n let framePosRound = this.viewPortXPixelToFramePosition(xViewPortPixelpos);\r\n if(framePosRound!=null) {\r\n g.font = '14px sans-serif';\r\n g.fillStyle = 'yellow';\r\n g.fillText(framePosRound.toString(), xViewPortPixelpos + 2, 50);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n drawPlayPosition() {\r\n if (this.markerCanvas) {\r\n var w = this.markerCanvas.width;\r\n var h = this.markerCanvas.height;\r\n var g = this.markerCanvas.getContext(\"2d\");\r\n if (g) {\r\n\r\n g.clearRect(0, 0, w, h);\r\n if(this._playFramePosition!=null) {\r\n let pixelPos = this.frameToViewPortXPixelPosition(this._playFramePosition);\r\n if (pixelPos) {\r\n g.fillStyle = 'red';\r\n g.strokeStyle = 'red';\r\n g.beginPath();\r\n g.moveTo(pixelPos, 0);\r\n g.lineTo(pixelPos, h);\r\n g.closePath();\r\n g.stroke();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // layout() {\r\n //\r\n //\r\n // var offW = this.sonagramCanvas.offsetWidth;\r\n // var offH = this.sonagramCanvas.offsetHeight;\r\n // this.layoutBounds(0, 0, offW, offH, true);\r\n // }\r\n\r\n\r\n // layoutBounds(left: number, top: number, offW: number, offH: number, virtualWidth:number,redraw: boolean) {\r\n //\r\n // const leftStr = left.toString() + 'px';\r\n // this.sonagramCanvas.style.left = leftStr;\r\n // const topStr = top.toString() + 'px';\r\n // this.sonagramCanvas.style.top = topStr;\r\n // this.cursorCanvas.style.top = topStr;\r\n // this.markerCanvas.style.top = topStr;\r\n //\r\n // if (offW) {\r\n // const wStr = offW.toString() + 'px';\r\n // if (redraw) {\r\n //\r\n // this.cursorCanvas.width = offW;\r\n // this.markerCanvas.width = offW;\r\n // }\r\n // this.sonagramCanvas.style.width = wStr;\r\n // this.cursorCanvas.style.width = wStr;\r\n // this.markerCanvas.style.width = wStr;\r\n // }\r\n // if (offH) {\r\n // const hStr = offH.toString() + 'px';\r\n // if (redraw) {\r\n // this.cursorCanvas.height = offH;\r\n // this.markerCanvas.height = offH;\r\n // }\r\n // this.sonagramCanvas.style.height = hStr;\r\n // this.cursorCanvas.style.height = hStr;\r\n // this.markerCanvas.style.height = hStr;\r\n //\r\n // }\r\n // if (redraw) {\r\n // //this.redraw();\r\n // if (offW > 0) {\r\n // if (offH > 0) {\r\n // this.startDraw(left,top,offW, offH,virtualWidth);\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n\r\n /*\r\n * Method used as worker code.\r\n */\r\n workerFunction() {\r\n\r\n // Redefine some DSP classes for worker function\r\n // See e.g. audio.math.Complex\r\n class Complex {\r\n\r\n real: number;\r\n img: number;\r\n\r\n public static fromPolarForm(magnitude: number, argument: number): Complex {\r\n const r = Math.cos(argument) * magnitude;\r\n const i = Math.sin(argument) * magnitude;\r\n return new Complex(r, i);\r\n }\r\n\r\n constructor(real: number, img: number) {\r\n this.real = real;\r\n this.img = img;\r\n }\r\n\r\n public magnitude(): number {\r\n return Math.sqrt((this.real * this.real) + (this.img * this.img));\r\n }\r\n\r\n public argument(): number {\r\n return Math.atan2(this.img, this.real);\r\n }\r\n\r\n public add(addC: Complex): Complex {\r\n return new Complex(this.real + addC.real, this.img + addC.img);\r\n }\r\n\r\n public sub(subC: Complex): Complex {\r\n return new Complex(this.real - subC.real, this.img - subC.img);\r\n }\r\n\r\n public mult(multC: Complex): Complex {\r\n const multR = (this.real * multC.real) - (this.img * multC.img);\r\n const multI = (this.real * multC.img) + (multC.real * this.img);\r\n return new Complex(multR, multI);\r\n }\r\n\r\n public multReal(multF: number): Complex {\r\n return new Complex(this.real * multF, this.img * multF);\r\n }\r\n\r\n public div(divisor: Complex): Complex {\r\n const divReal = divisor.real;\r\n const divImg = divisor.img;\r\n const div = (divReal * divReal) + (divImg * divImg);\r\n const divisionReal = ((this.real * divReal) + (this.img * divImg)) / div;\r\n const divisionImg = ((divReal * this.img) - (this.real * divImg)) / div;\r\n\r\n return new Complex(divisionReal, divisionImg);\r\n }\r\n\r\n public divReal(divisor: number): Complex {\r\n const div = divisor * divisor;\r\n const divsionReal = (this.real * divisor) / div;\r\n const divsionImg = (divisor * this.img) / div;\r\n\r\n return new Complex(divsionReal, divsionImg);\r\n }\r\n\r\n public conjugate(): Complex {\r\n return new Complex(this.real, -this.img);\r\n }\r\n\r\n public equals(c: Complex): boolean {\r\n if (c === null) {\r\n return false;\r\n }\r\n return (this.real === c.real && this.img === c.img);\r\n }\r\n\r\n public toString(): string {\r\n return 'Real: ' + this.real + ', Img: ' + this.img;\r\n }\r\n }\r\n\r\n class DFTFloat32 {\r\n\r\n private n: number;\r\n private m: number;\r\n\r\n private cosLookup: Float32Array;\r\n private sinLookup: Float32Array;\r\n\r\n constructor(n: number) {\r\n this.n = n;\r\n this.m = Math.log(n) / Math.log(2);\r\n\r\n // if(n != (1 << m))throw new RuntimeException(\"length N must be power of 2\");\r\n\r\n // lookup tables\r\n this.cosLookup = new Float32Array(n / 2);\r\n this.sinLookup = new Float32Array(n / 2);\r\n\r\n for (let i = 0; i < n / 2; i++) {\r\n const arc = (-2 * Math.PI * i) / n;\r\n this.cosLookup[i] = Math.cos(arc);\r\n this.sinLookup[i] = Math.sin(arc);\r\n }\r\n }\r\n\r\n public processReal(srcBuf: Float32Array): Array<Complex> {\r\n const x = srcBuf.slice();\r\n const y = new Float32Array(srcBuf.length);\r\n for (let yi = 0; yi < y.length; yi++) {\r\n y[yi] = 0.0;\r\n }\r\n this.fftCooleyTukey(x, y);\r\n const rc = new Array<Complex>(x.length);\r\n for (let i = 0; i < x.length; i++) {\r\n rc[i] = new Complex(x[i], y[i]);\r\n }\r\n return rc;\r\n }\r\n\r\n public processRealMagnitude(srcBuf: Float32Array): Float32Array {\r\n const x = srcBuf.slice();\r\n const y = new Float32Array(srcBuf.length);\r\n for (let yi = 0; yi < y.length; yi++) {\r\n y[yi] = 0.0;\r\n }\r\n this.fftCooleyTukey(x, y);\r\n const rc = new Float32Array(x.length);\r\n for (let i = 0; i < x.length; i++) {\r\n const rcc = new Complex(x[i], y[i]);\r\n rc[i] = rcc.magnitude();\r\n }\r\n return rc;\r\n }\r\n\r\n public fftCooleyTukey(real: Float32Array, img: Float32Array): void {\r\n let i: number;\r\n let j = 0;\r\n let k: number;\r\n let n1: number;\r\n let n2: number = this.n / 2;\r\n let a: number;\r\n let c: number;\r\n let s: number;\r\n let t1: number;\r\n let t2: number;\r\n\r\n for (i = 1; i < this.n - 1; i++) {\r\n n1 = n2;\r\n while (j >= n1) {\r\n j = j - n1;\r\n n1 = n1 / 2;\r\n }\r\n j = j + n1;\r\n\r\n if (i < j) {\r\n t1 = real[i];\r\n real[i] = real[j];\r\n real[j] = t1;\r\n t1 = img[i];\r\n img[i] = img[j];\r\n img[j] = t1;\r\n }\r\n }\r\n\r\n n1 = 0;\r\n n2 = 1;\r\n for (i = 0; i < this.m; i++) {\r\n n1 = n2;\r\n n2 = n2 + n2;\r\n a = 0;\r\n for (j = 0; j < n1; j++) {\r\n c = this.cosLookup[a];\r\n s = this.sinLookup[a];\r\n a += (1 << (this.m - i - 1));\r\n\r\n for (k = j; k < this.n; k = k + n2) {\r\n t1 = c * real[k + n1] - s * img[k + n1];\r\n t2 = s * real[k + n1] + c * img[k + n1];\r\n real[k + n1] = real[k] - t1;\r\n img[k + n1] = img[k] - t2;\r\n real[k] = real[k] + t1;\r\n img[k] = img[k] + t2;\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n public process(t: Array<Complex>): Array<Complex> {\r\n const reals: Float32Array = new Float32Array(this.n);\r\n const imgs: Float32Array = new Float32Array(this.n);\r\n const trans: Array<Complex> = new Array<Complex>(this.n);\r\n for (let i = 0; i < this.n; i++) {\r\n reals[i] = t[i].real;\r\n imgs[i] = t[i].img;\r\n }\r\n this.fftCooleyTukey(reals, imgs);\r\n for (let i = 0; i < this.n; i++) {\r\n trans[i] = new Complex(reals[i], imgs[i]);\r\n }\r\n return trans;\r\n\r\n\r\n }\r\n\r\n }\r\n\r\n interface WindowFunction {\r\n getScale(i: number): number;\r\n }\r\n\r\n class GaussianWindow implements WindowFunction {\r\n\r\n public static DEFAULT_SIGMA = 0.3;\r\n // Gaussian window function,\r\n // http://reference.wolfram.com/language/ref/GaussianWindow.html\r\n // val=exp(-50*x*x/9) => sigma=0.3\r\n\r\n private buf: Float32Array;\r\n\r\n constructor(size: number, sigma: number = GaussianWindow.DEFAULT_SIGMA) {\r\n this.buf = new Float32Array(size);\r\n const center = (size - 1) / 2;\r\n for (let i = 0; i < size; i++) {\r\n const quot = (i - center) / (sigma * center);\r\n const exp = -0.5 * quot * quot;\r\n this.buf[i] = Math.exp(exp);\r\n }\r\n }\r\n\r\n getScale(i: number): number {\r\n return this.buf[i];\r\n }\r\n\r\n }\r\n\r\n self.onmessage = function (msg:MessageEvent) {\r\n\r\n let l = msg.data.l;\r\n let w = msg.data.w;\r\n let h = msg.data.h;\r\n let vw = msg.data.vw;\r\n let chs = msg.data.chs;\r\n let audioData = new Array(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n audioData[ch] = new Float32Array(msg.data['audioData'][ch]);\r\n }\r\n\r\n let frameLength = msg.data.frameLength;\r\n let dftSize = msg.data.dftSize;\r\n\r\n let dftBands = dftSize / 2;\r\n let dft = new DFTFloat32(dftSize);\r\n let wf = new GaussianWindow(dftSize);\r\n\r\n let arrSize=w*h*4;\r\n if(arrSize<0){\r\n arrSize=0\r\n }\r\n let imgData = new Uint8ClampedArray(arrSize);\r\n //console.log(\"Render method:\");\r\n if (audioData && arrSize>0) {\r\n let chH = Math.round(h / chs);\r\n let framesPerPixel = frameLength / vw;\r\n //console.log(\"Render: \", w, \"x\", h);\r\n\r\n let b = new Float32Array(dftSize);\r\n let sona = new Array(chs);\r\n\r\n let maxPsd = -Infinity;\r\n let p = 0;\r\n for (let ch = 0; ch < chs; ch++) {\r\n p = ch * frameLength;\r\n let chDataLen=audioData[ch].length;\r\n let x = 0;\r\n // initialize DFT array buffer\r\n sona[ch] = new Array(w);\r\n let framePos = 0;\r\n for (let pii = 0; pii < w; pii++) {\r\n let virtPii = l + pii;\r\n // Position of sample data frame is pixel position mapped to audio frame position.\r\n // Then \"center\" the frame by shifting left by half the DFT size (=dftBands)\r\n framePos = Math.round((virtPii * framesPerPixel)-dftBands);\r\n // fill DFT buffer with windowed sample values\r\n for (let i = 0; i < dftSize; i++) {\r\n let samplePos=framePos + i;\r\n // initialize for negative sample positions and out of bounds positions\r\n let chDat=0;\r\n\r\n // Set audio sample if available\r\n if(samplePos>=0 && samplePos < chDataLen) {\r\n chDat = audioData[ch][samplePos];\r\n }\r\n\r\n // apply Window\r\n b[i] = chDat * wf.getScale(i);\r\n }\r\n // Calc DFT magnitudes\r\n let spectr = dft.processRealMagnitude(b);\r\n\r\n // Get maximum value of spectral energy\r\n for (let s = 0; s < dftBands; s++) {\r\n let psd = (2 * Math.pow(spectr[s], 2)) / dftBands;\r\n if (psd > maxPsd) {\r\n maxPsd = psd;\r\n }\r\n }\r\n // Set render model data for this pixel\r\n sona[ch][pii] = spectr;\r\n }\r\n }\r\n //maxPsd = (2 * Math.pow(max, 2)) / dftBands;\r\n\r\n for (let ch = 0; ch < chs; ch++) {\r\n\r\n for (let pii = 0; pii < w; pii++) {\r\n let allBlack = true;\r\n for (let y = 0; y < chH; y++) {\r\n let freqIdx = Math.round(y * dftBands / chH);\r\n // calculate the one sided power spectral density PSD (f, t) in Pa2/Hz\r\n // PSD(f) proportional to 2|X(f)|2 / (t2 - t1)\r\n let val = sona[ch][pii][freqIdx];\r\n let psd = (2 * Math.pow(val, 2)) / dftBands;\r\n // Calculate logarithmic value\r\n //let psdLog = ips.dsp.DSPUtils.toLevelInDB(psd / maxPsd);\r\n let linearLevel = psd / maxPsd;\r\n let psdLog = 10 * Math.log(linearLevel) / Math.log(10);\r\n // Fixed dynamic Range value of 70dB for now\r\n let dynRangeInDb = 70;\r\n let scaledVal = (psdLog + dynRangeInDb) / dynRangeInDb;\r\n\r\n // are the following checks necessary for clamped array ?\r\n if (scaledVal > 1.0)\r\n scaledVal = 1;\r\n if (scaledVal < 0.0) {\r\n scaledVal = 0;\r\n }\r\n let rgbVal = Math.round(255 * scaledVal);\r\n if (rgbVal < 0) {\r\n //\t\t\t\t\t\t\tSystem.out.println(\"Neg RGB val: \"+rgbVal);\r\n rgbVal = 0;\r\n }\r\n if (rgbVal > 255) {\r\n rgbVal = 255;\r\n }\r\n rgbVal = 255 - rgbVal;\r\n if (rgbVal > 0) {\r\n allBlack = false;\r\n }\r\n let py = chH - y;\r\n let dataPos = ((((ch * chH) + py) * w) + pii) * 4;\r\n imgData[dataPos + 0] = rgbVal; //R\r\n imgData[dataPos + 1] = rgbVal; //G\r\n imgData[dataPos + 2] = rgbVal; //B\r\n imgData[dataPos + 3] = 255; //A (alpha: fully opaque)\r\n }\r\n // if (allBlack) {\r\n // console.log(\"Black: \", pii, \" \", ch);\r\n // }\r\n }\r\n }\r\n }\r\n postMessage({imgData: imgData, l: l, w: msg.data.w, h: msg.data.h, vw: vw}, [imgData.buffer]);\r\n }\r\n }\r\n\r\n startDraw(clear = true) {\r\n if (clear) {\r\n if(this.bounds) {\r\n this.sonagramCanvas.style.left = Math.round(this.bounds.position.left).toString() + 'px';\r\n let intW = Math.round(this.bounds.dimension.width)\r\n let intH = Math.round(this.bounds.dimension.height)\r\n this.sonagramCanvas.width = intW;\r\n this.sonagramCanvas.height = intH;\r\n\r\n let g = this.sonagramCanvas.getContext(\"2d\");\r\n if (g) {\r\n //g.clearRect(0, 0,w, h);\r\n g.fillStyle = \"white\";\r\n g.fillRect(0, 0, intW, intH);\r\n }\r\n }\r\n }\r\n this.startRender();\r\n this.drawCursorLayer()\r\n }\r\n\r\n private startRender() {\r\n\r\n if (this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n\r\n }\r\n if (this.bounds) {\r\n let w = Math.round(this.bounds.dimension.width);\r\n let h = Math.round(this.bounds.dimension.height);\r\n\r\n\r\n if (this._audioData && w>0 && h>0) {\r\n\r\n this.worker = new Worker(this.workerURL);\r\n //this.wo = new Worker('./worker/sonagram.worker', { type: `module` });\r\n\r\n let chs = this._audioData.numberOfChannels;\r\n\r\n let frameLength = this._audioData.getChannelData(0).length;\r\n let ada = new Array<ArrayBuffer>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n // Need a copy here for the worker, otherwise this.audioData is not accessible after posting to the worker\r\n ada[ch] = this._audioData.getChannelData(ch).buffer.slice(0);\r\n }\r\n let start = Date.now();\r\n if (this.worker) {\r\n this.worker.onmessage = (me) => {\r\n this.drawRendered(me);\r\n if (this.worker) {\r\n this.worker.terminate();\r\n }\r\n this.worker = null;\r\n }\r\n }\r\n if (this.markerCanvas) {\r\n let g = this.markerCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.fillText(\"Rendering...\", 10, 20);\r\n }\r\n\r\n }\r\n this.worker.postMessage({\r\n audioData: ada,\r\n l: Math.round(this.bounds.position.left),\r\n w: w,\r\n h: h,\r\n vw: Math.round(this.virtualDimension.width),\r\n chs: chs,\r\n frameLength: frameLength,\r\n dftSize: this.dftSize\r\n }, ada);\r\n } else {\r\n let g = this.sonagramCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n }\r\n }\r\n }\r\n }\r\n\r\n drawRendered(me: MessageEvent) {\r\n if (this.sonagramCanvas) {\r\n\r\n this.sonagramCanvas.width = me.data.w;\r\n this.sonagramCanvas.height = me.data.h;\r\n let g = this.sonagramCanvas.getContext(\"2d\");\r\n if (g) {\r\n let imgDataArr: Uint8ClampedArray = me.data.imgData;\r\n if (me.data.w > 0 && me.data.h > 0) {\r\n let imgData = g.createImageData(me.data.w, me.data.h);\r\n imgData.data.set(imgDataArr);\r\n g.putImageData(imgData, 0, 0);\r\n }\r\n }\r\n }\r\n this.drawBg()\r\n this.drawPlayPosition();\r\n }\r\n\r\n // synchronous draw (not used anymore)\r\n redraw() {\r\n\r\n let g = this.sonagramCanvas.getContext(\"2d\");\r\n\r\n let w = this.sonagramCanvas.width;\r\n let h = this.sonagramCanvas.height;\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n g.fillStyle = \"white\";\r\n g.fillRect(0, 0, w, h);\r\n if (this._audioData) {\r\n let spectSize = Math.floor(this.dftSize / 2)\r\n let chs = this._audioData.numberOfChannels;\r\n let chH = h / chs;\r\n\r\n let frameLength = this._audioData.getChannelData(0).length;\r\n\r\n let framesPerPixel = frameLength / w;\r\n let y = 0;\r\n // TODO\r\n let b = new Float32Array(this.dftSize)\r\n\r\n let sona = new Array<Array<Float32Array>>(chs);\r\n let max = 0;\r\n let maxPsd = -Infinity;\r\n for (let ch = 0; ch < chs; ch++) {\r\n let x = 0;\r\n sona[ch] = new Array<Float32Array>(w);\r\n\r\n let chData = this._audioData.getChannelData(ch);\r\n // TODO center buffer\r\n\r\n let framePos = 0;\r\n for (let pii = 0; pii < w; pii++) {\r\n framePos = Math.round(pii * framesPerPixel);\r\n // calculate DFT at pixel position\r\n for (let i = 0; i < this.dftSize; i++) {\r\n let chDat = chData[framePos + i];\r\n b[i] = chDat;\r\n }\r\n let spectr = this.dft.processRealMagnitude(b);\r\n sona[ch][pii] = spectr;\r\n // @ts-ignore\r\n let pMax = Math.max.apply(null, spectr);\r\n if (pMax > max) {\r\n max = pMax;\r\n }\r\n\r\n for (let s = 0; s < spectSize; s++) {\r\n let psd = (2 * Math.pow(spectr[s], 2)) / spectSize;\r\n if (psd > maxPsd) {\r\n maxPsd = psd;\r\n }\r\n }\r\n }\r\n }\r\n //console.log(\"max: \", max);\r\n maxPsd = (2 * Math.pow(max, 2)) / spectSize;\r\n for (let ch = 0; ch < chs; ch++) {\r\n\r\n let framePos = 0;\r\n for (let pii = 0; pii < w; pii++) {\r\n framePos = pii * framesPerPixel;\r\n\r\n for (let y = 0; y < h; y++) {\r\n let freqIdx = Math.round(y * spectSize / h);\r\n\r\n // calculate the one sided power spectral density PSD (f, t) in Pa2/Hz\r\n // PSD(f) proportional to 2|X(f)|2 / (t2 - t1)\r\n let val = sona[ch][pii][freqIdx];\r\n let psd = (2 * Math.pow(val, 2)) / spectSize;\r\n\r\n // Calculate logarithmic\r\n let psdLog = DSPUtils.toLevelInDB(psd / maxPsd);\r\n let dynRangeInDb = 70;\r\n let scaledVal = (psdLog + dynRangeInDb) / dynRangeInDb;\r\n\r\n if (scaledVal > 1)\r\n scaledVal = 1;\r\n if (scaledVal < 0) {\r\n scaledVal = 0;\r\n }\r\n let rgbVal = (255 * scaledVal);\r\n if (rgbVal < 0) {\r\n//\t\t\t\t\t\t\tSystem.out.println(\"Neg RGB val: \"+rgbVal);\r\n rgbVal = 0;\r\n }\r\n if (rgbVal > 255) {\r\n rgbVal = 255;\r\n }\r\n rgbVal = 255 - rgbVal;\r\n let colorStr = CSSUtils.toColorString(rgbVal, rgbVal, rgbVal);\r\n g.fillStyle = colorStr;\r\n g.fillRect(pii, chH - y, 1, 1);\r\n }\r\n }\r\n }\r\n this.drawPlayPosition();\r\n }\r\n }\r\n }\r\n\r\n\r\n setData(audioData: AudioBuffer | null) {\r\n this._audioData = audioData;\r\n this.playFramePosition = 0;\r\n //this.redraw();\r\n //this.startRender();\r\n }\r\n\r\n\r\n}\r\n\r\n","import {\r\n ElementRef, AfterViewInit, HostListener, Input, OnInit, Output, EventEmitter\r\n} from '@angular/core'\r\nimport {AudioSignal} from './audiosignal'\r\nimport {Sonagram} from './sonagram'\r\nimport {Marker, Point} from './common'\r\n\r\nimport {Component, ViewChild} from '@angular/core';\r\nimport {Position,Dimension, Rectangle} from \"../../math/2d/geometry\";\r\nimport {AudioClip,Selection} from \"../persistor\";\r\nimport {BasicAudioCanvasLayerComponent} from \"./audio_canvas_layer_comp\";\r\nimport {Element} from \"@angular/compiler\";\r\n\r\n/*\r\n ResizeObserver not yet available in official Typescript declaration\r\n Crreated declaration from IDL until its available.\r\n See specs:\r\n https://www.w3.org/TR/resize-observer\r\n\r\n */\r\n\r\ninterface ResizeObserverSize {\r\n readonly inlineSize:number;\r\n readonly blockSize:number;\r\n};\r\n\r\ndeclare interface ResizeObserverEntry{\r\n readonly target: Element;\r\n readonly contentRect: DOMRectReadOnly ;\r\n readonly borderBoxSize: Array<ResizeObserverSize> ;\r\n readonly contentBoxSize: Array<ResizeObserverSize> ;\r\n readonly devicePixelContentBoxSize: Array<ResizeObserverSize> ;\r\n}\r\n\r\ndeclare interface ResizeObserverCallback {\r\n (entries: Array<ResizeObserverEntry>, observer: ResizeObserver):void;\r\n}\r\n\r\ndeclare enum ResizeObserverBoxOptions {\r\n \"border-box\", \"content-box\", \"device-pixel-content-box\"\r\n};\r\n\r\n// // Declare Resizeobserver\r\n// declare class ResizeObserver{\r\n// constructor(callback: ResizeObserverCallback);\r\n// observe: (el:Element,opts: ResizeObserverBoxOptions | null)=>void;\r\n// unobserve: (el:Element)=>void;\r\n// disconnect: ()=>void;\r\n// }\r\n\r\n/*\r\n * Container component for audio display.\r\n * The display elements are children of a virtual canvas. The virtual canvas makes it possible to have high zoom factors with very wide virtual audio displays.\r\n * Only the visible part of the virtual canvas is implemented as a browser canvas and therefore consuming memory.\r\n * The visible part has the same width as the viewport of the scroll pane parent.\r\n * The virtual canvas itself is implemented as a HTML div element.\r\n * The layout of the component is updated on resize of the parent or changes of the zoom factor.\r\n */\r\n@Component({\r\n\r\n selector: 'app-audio',\r\n template: `\r\n <div #virtualCanvas>\r\n <canvas #divider (mousedown)=\"mousedown($event)\" (mouseover)=\"mouseover($event)\"\r\n (mouseleave)=\"mouseleave($event)\" height=\"10\"></canvas>\r\n <audio-signal [pointerPosition]=\"pointer\" [selecting]=\"selecting\" [selection]=\"selection\" (pointerPositionEventEmitter)=\"pointerPositionChanged($event)\" (selectingEventEmitter)=\"selectingChanged($event)\" (selectedEventEmitter)=\"selectionChanged($event)\"></audio-signal>\r\n <audio-sonagram [pointerPosition]=\"pointer\" [selecting]=\"selecting\" [selection]=\"selection\" (pointerPositionEventEmitter)=\"pointerPositionChanged($event)\" (selectingEventEmitter)=\"selectingChanged($event)\" (selectedEventEmitter)=\"selectionChanged($event)\"></audio-sonagram>\r\n </div>\r\n `,\r\n styles: [`div {\r\n\r\n margin: 0;\r\n padding: 0;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n position: relative; /* TODO container div position must not be 'static' (default) to act as reference for the canvases */\r\n box-sizing: border-box;\r\n transform: none;\r\n overflow: hidden;\r\n }`, `canvas{\r\n top: 0;\r\n left: 0;\r\n width: 0;\r\n height: 0;\r\n cursor: ns-resize;\r\n position: absolute;\r\n zIndex: 1;\r\n transform: none;\r\n }`, `audio-signal {\r\n top: 0;\r\n left: 0;\r\n position: absolute;\r\n zIndex: 1;\r\n transform: none;\r\n }`, `audio-sonagram {\r\n top: 0;\r\n left: 0;\r\n position: absolute;\r\n zIndex: 1;\r\n transform: none;\r\n }`]\r\n\r\n})\r\nexport class AudioClipUIContainer extends BasicAudioCanvasLayerComponent implements OnInit,AfterViewInit{\r\n\r\n private static DIVIDER_PIXEL_SIZE = 10;\r\n\r\n parentE: HTMLElement;\r\n\r\n // Divider canvas\r\n @ViewChild('divider', { static: true }) canvasRef!: ElementRef;\r\n dc!: HTMLCanvasElement;\r\n\r\n // Virtual container\r\n @ViewChild('virtualCanvas', { static: true }) ceRef!: ElementRef;\r\n ce!: HTMLDivElement;\r\n\r\n @ViewChild(AudioSignal, { static: true }) as!: AudioSignal;\r\n @ViewChild(Sonagram, { static: true }) so!: Sonagram;\r\n\r\n private _audioClip:AudioClip | null=null;\r\n pointer: Marker|null=null;\r\n selecting: Selection|null=null;\r\n selection: Selection|null=null;\r\n @Output() selectionEventEmitter = new EventEmitter<Selection>();\r\n private _playFramePosition: number|null=null;\r\n private dragStartMouseY: number | null = null;\r\n private dragStartY: number | null = null;\r\n private dividerPosition = 0.5;\r\n\r\n userAction=false;\r\n\r\n private _xZoom: number | null = null; // pixels per second\r\n\r\n get xZoom(): number | null {\r\n return this._xZoom;\r\n }\r\n\r\n set xZoom(value: number | null) {\r\n this.userAction=true;\r\n this._xZoom = value;\r\n this.layout()\r\n this.userAction=false;\r\n }\r\n\r\n // if true the complete audio file is shown, the display fits to the visible panel, the x-zoom factor is variable, this is the default\r\n private _fixFitToPanel = true;\r\n\r\n set fixFitToPanel(value: boolean) {\r\n this._fixFitToPanel = value;\r\n if (value) {\r\n // we don't need clip bounds\r\n this.bounds=null;\r\n this._xZoom = null;\r\n } else {\r\n // hold current zoom value\r\n //this._xZoom=this.ce.offsetWidth/this._audioData.duration;\r\n }\r\n this.layout()\r\n }\r\n\r\n constructor(private ref: ElementRef) {\r\n super()\r\n this.parentE = this.ref.nativeElement;\r\n }\r\n\r\n ngOnInit() {\r\n this.ce = this.ceRef.nativeElement;\r\n this.dc = this.canvasRef.nativeElement;\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.layout();\r\n let heightListener = new MutationObserver((mrs: Array<MutationRecord>, mo: MutationObserver) => {\r\n\r\n let layout=false;\r\n mrs.forEach((mr: MutationRecord) => {\r\n if (!this.userAction && 'attributes' === mr.type && ('class' === mr.attributeName || 'style' === mr.attributeName)) {\r\n layout=true;\r\n }\r\n });\r\n if(layout){\r\n // re-layout required\r\n this.layout(false);\r\n }\r\n });\r\n\r\n heightListener.observe(this.ce, {attributes: true, childList: true, characterData: true});\r\n heightListener.observe(this.dc, {attributes: true, childList: true, characterData: true});\r\n\r\n let resizeObserver = new ResizeObserver((entries,obs) => {\r\n //console.log(\"Resize observed:\");\r\n entries.forEach((e)=>{\r\n //console.log(e.contentRect.width+\"x\"+e.contentRect.height);\r\n this.layout();\r\n })\r\n });\r\n\r\n resizeObserver.observe(this.ce);\r\n\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: Event): void {\r\n this.layout();\r\n }\r\n\r\n mouseover(me: MouseEvent) {\r\n this.dividerCursorPosition(me, true);\r\n }\r\n\r\n mouseleave(me: MouseEvent) {\r\n this.dividerCursorPosition(me, false);\r\n }\r\n\r\n mousedown(me: MouseEvent) {\r\n this.dragStartMouseY = me.clientY;\r\n this.dragStartY = this.dc.offsetTop;\r\n this.dragStartMouseY = me.clientY;\r\n }\r\n\r\n @HostListener('document:mouseup', ['$event'])\r\n onMouseup(me: MouseEvent) {\r\n if (this.dragStartY != null) {\r\n this.userAction=true;\r\n this.dividerDrag(me);\r\n this.layout(false);\r\n this.dragStartY = null;\r\n this.userAction=false;\r\n }\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMousemove(me: MouseEvent) {\r\n if (this.dragStartY != null) {\r\n this.userAction=true;\r\n this.dividerDrag(me);\r\n this.layoutScaled();\r\n this.userAction=true;\r\n }\r\n }\r\n\r\n pointerPositionChanged(pp:Marker){\r\n this.pointer=pp\r\n }\r\n\r\n selectingChanged(s:Selection| null){\r\n this.selecting=s\r\n }\r\n\r\n selectionChanged(s:Selection){\r\n this.selection=s\r\n if(this._audioClip){\r\n this._audioClip.selection=s\r\n }\r\n this.selectionEventEmitter.emit(this.selection)\r\n }\r\n\r\n private canvasMousePos(c: HTMLCanvasElement, e: MouseEvent): Point {\r\n const cr = c.getBoundingClientRect();\r\n const x = e.x - cr.left;\r\n const y = e.y - cr.top;\r\n return new Point(x,y);\r\n }\r\n\r\n dividerCursorPosition(e: MouseEvent, show: boolean) {\r\n if (this.dc) {\r\n\r\n const w = this.dc.width;\r\n const h = this.dc.height;\r\n const g = this.dc.getContext('2d');\r\n\r\n const pp = this.canvasMousePos(this.dc, e);\r\n const offX = e.offsetX - this.dc.offsetLeft;\r\n const offY = e.offsetY - this.dc.offsetTop;\r\n\r\n }\r\n }\r\n\r\n dividerDrag(e: MouseEvent) {\r\n if (this.dc && this.dragStartMouseY && this.dragStartY) {\r\n\r\n const dragOffset = e.clientY - this.dragStartMouseY;\r\n const ceHeight = this.ce.offsetHeight;\r\n\r\n let newTop = (this.dragStartY + dragOffset);\r\n if (newTop < 0) {\r\n newTop = 0;\r\n }\r\n if (newTop > ceHeight - AudioClipUIContainer.DIVIDER_PIXEL_SIZE) {\r\n newTop = ceHeight - AudioClipUIContainer.DIVIDER_PIXEL_SIZE;\r\n }\r\n this.dc.style.top = newTop.toString() + 'px';\r\n this.dividerPosition = (this.dc.offsetTop + AudioClipUIContainer.DIVIDER_PIXEL_SIZE / 2) / ceHeight;\r\n if (this.dividerPosition > 1.0) {\r\n this.dividerPosition = 1.0;\r\n }\r\n if (this.dividerPosition < 0.0) {\r\n this.dividerPosition = 0.0;\r\n }\r\n this.drawDivider();\r\n }\r\n }\r\n\r\n\r\n drawDivider() {\r\n const w = this.dc.width;\r\n const h = this.dc.height;\r\n const g = this.dc.getContext('2d');\r\n if (g && w>10 && h>=1) {\r\n g.fillStyle = 'white';\r\n g.fillRect(0, 0, w, h);\r\n g.fillStyle = 'black';\r\n g.fillRect(5, 5, w - 10, 1);\r\n }\r\n }\r\n\r\n clipBounds(clipBounds: Rectangle) {\r\n this.bounds = clipBounds;\r\n this.layout();\r\n }\r\n\r\n currentXZoom(): number | null {\r\n let xz = this._xZoom;\r\n if (xz==null && this._audioData) {\r\n let ow = this.ce.offsetWidth;\r\n if (ow < 1) {\r\n // at least one pixel width to avoid x-zoom zero values\r\n ow = 1;\r\n }\r\n xz = ow / this._audioData.duration;\r\n }\r\n return xz;\r\n }\r\n\r\n private _layout(clear: boolean, redraw: boolean) {\r\n let ceBcr = this.ce.getBoundingClientRect();\r\n\r\n const ceBcrIntW = Math.floor(ceBcr.width);\r\n const ceBcrIntH = Math.floor(ceBcr.height);\r\n\r\n // height available for plugins (audiosignal and sonagram)\r\n let psH = ceBcrIntH - AudioClipUIContainer.DIVIDER_PIXEL_SIZE;\r\n if (psH < 0) {\r\n psH = 0;\r\n }\r\n // audio signal height\r\n const asH = Math.round(psH * this.dividerPosition);\r\n\r\n // sonagram height (rest: available height minus divider height minus audiosignal height)\r\n let soH = ceBcrIntH - AudioClipUIContainer.DIVIDER_PIXEL_SIZE - asH;\r\n if (soH < 0) {\r\n soH = 0;\r\n }\r\n\r\n // sonagram top position\r\n const soTop = asH + AudioClipUIContainer.DIVIDER_PIXEL_SIZE;\r\n\r\n // Visible bounds\r\n // left position\r\n let vbLeft = 0;\r\n // width\r\n let vbWidth = ceBcrIntW;\r\n if (!this._fixFitToPanel && this.bounds) {\r\n vbLeft = Math.round(this.bounds.position.left);\r\n vbWidth = Math.round(this.bounds.dimension.width);\r\n }\r\n\r\n // Divider\r\n // left position\r\n let vbLeftStyl = vbLeft + 'px';\r\n if (this.dc.style.left != vbLeftStyl) {\r\n this.dc.style.left = vbLeftStyl;\r\n }\r\n // top position\r\n const dTop = asH;\r\n const dTopStr = dTop + 'px';\r\n if (this.dc.style.top != dTopStr) {\r\n this.dc.style.top = dTopStr;\r\n }\r\n // width\r\n let vbWidthStyle = vbWidth + 'px';\r\n if (this.dc.style.width != vbWidthStyle) {\r\n this.dc.style.width = vbWidthStyle;\r\n }\r\n if (this.dc.width != vbWidth) {\r\n this.dc.width = vbWidth;\r\n }\r\n // height\r\n if(this.dc.height!=AudioClipUIContainer.DIVIDER_PIXEL_SIZE) {\r\n this.dc.height = AudioClipUIContainer.DIVIDER_PIXEL_SIZE;\r\n\r\n }\r\n let divPixelSizeStyle=AudioClipUIContainer.DIVIDER_PIXEL_SIZE.toString() + 'px';\r\n if(this.dc.style.height!=divPixelSizeStyle) {\r\n this.dc.style.height = divPixelSizeStyle;\r\n }\r\n\r\n this.drawDivider();\r\n\r\n\r\n // Virtual dimension, only width is used\r\n let virtualDim = new Dimension(ceBcrIntW, 0)\r\n\r\n // Visible bounds of container\r\n let br = new Rectangle(new Position(vbLeft, 0), new Dimension(vbWidth, ceBcrIntH));\r\n\r\n // Set container bounds\r\n this.layoutBounds(br, virtualDim, false);\r\n\r\n // Visible bounds of audiosignal\r\n let asR = new Rectangle(new Position(vbLeft, 0), new Dimension(vbWidth, asH));\r\n\r\n // Set audiosignal bounds\r\n this.as.layoutBounds(asR, virtualDim, redraw, clear);\r\n\r\n // Visible bounds of sonagram\r\n let soR = new Rectangle(new Position(vbLeft, soTop), new Dimension(vbWidth, soH));\r\n\r\n // Set sonagram bounds\r\n this.so.layoutBounds(soR, virtualDim, redraw, clear);\r\n }\r\n\r\n layoutScaled() {\r\n this._layout(false, false);\r\n }\r\n\r\n layout(clear=true) {\r\n\r\n if(this.ce && this.dc) {\r\n const clientW=this.ce.clientWidth;\r\n if(this._audioData){\r\n if(this._fixFitToPanel) {\r\n // Set the virtual canvas width to the visible width\r\n if(this.ce.style.width!='100%') {\r\n //console.log(\"set width to 100%\");\r\n this.ce.style.width = '100%';\r\n }\r\n }else{\r\n if (this._xZoom) {\r\n // Set the virtual canvas width according to the value of the user selected xZoom value\r\n const newClW = Math.round( this._xZoom*this._audioData.duration );\r\n this.ce.style.width = newClW + 'px';\r\n } else {\r\n // Set the virtual canvas width to the visible width only\r\n this.ce.style.width = clientW + 'px';\r\n }\r\n }\r\n }\r\n this._layout(clear,true);\r\n }\r\n }\r\n\r\n @Input()\r\n set audioData(audioData: AudioBuffer | null) {\r\n this._audioClip=null\r\n this._audioData=audioData;\r\n this.as.setData(audioData);\r\n this.so.setData(audioData);\r\n this.layout();\r\n }\r\n\r\n get audioData():AudioBuffer|null{\r\n return this._audioData\r\n }\r\n\r\n @Input()\r\n set audioClip(audioClip: AudioClip | null) {\r\n this._audioClip=audioClip\r\n let audioData:AudioBuffer|null=null;\r\n let sel:Selection|null=null;\r\n if(audioClip) {\r\n audioData = audioClip.buffer;\r\n if (this._audioClip) {\r\n this._audioClip.addSelectionObserver((clip) => {\r\n this.selection = clip.selection\r\n });\r\n }\r\n sel=audioClip.selection;\r\n }\r\n this._audioData = audioData;\r\n this.as.setData(this._audioData);\r\n this.so.setData(this._audioData);\r\n this.selecting=null\r\n this.selection=sel\r\n this.layout();\r\n }\r\n\r\n get playFramePosition(): number |null {\r\n return this._playFramePosition;\r\n }\r\n\r\n set playFramePosition(playFramePosition: number|null) {\r\n this._playFramePosition = playFramePosition;\r\n this.as.playFramePosition = playFramePosition;\r\n this.so.playFramePosition = playFramePosition;\r\n }\r\n}\r\n\r\n","import {\r\n Component,\r\n ViewChild,\r\n HostListener, ElementRef, Output, Input,\r\n} from '@angular/core'\r\n\r\n\r\nimport {AudioClipUIContainer} from '../ui/container'\r\nimport {Action} from \"../../action/action\";\r\nimport {Position,Dimension, Rectangle} from \"../../math/2d/geometry\";\r\nimport {AudioClip, Selection} from \"../persistor\";\r\n\r\n@Component({\r\n\r\n selector: 'audio-display-scroll-pane',\r\n\r\n template: `\r\n\r\n <app-audio #audioSignalContainer (selectionEventEmitter)=\"selectionChanged($event)\"></app-audio>\r\n\r\n `,\r\n styles: [\r\n `:host {\r\n flex: 2;\r\n width: 100%;\r\n background: darkgray;\r\n box-sizing: border-box;\r\n height: 100%;\r\n position: relative;\r\n overflow-x: scroll;\r\n overflow-y: auto;\r\n }`,\r\n `app-audio {\r\n\r\n margin: 0;\r\n padding: 0;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n\r\n /*position: absolute;*/\r\n box-sizing: border-box;\r\n }`]\r\n\r\n})\r\nexport class AudioDisplayScrollPane {\r\n\r\n private spEl!:HTMLElement;\r\n\r\n @Output() zoomInAction:Action<void>=new Action('+');\r\n @Output() zoomOutAction:Action<void>=new Action('-');\r\n @Output() zoomSelectedAction:Action<void>=new Action(\"Selected\");\r\n @Output() zoomFitToPanelAction:Action<void>=new Action(\"Fit to panel\");\r\n zoomFixFitToPanelAction:Action<void>=new Action(\"Fix fit to panel\");\r\n\r\n\r\n @ViewChild(AudioClipUIContainer, { static: true })\r\n private ac!: AudioClipUIContainer;\r\n\r\n\r\n\r\n constructor( private ref: ElementRef) {\r\n this.spEl = this.ref.nativeElement;\r\n\r\n this.zoomInAction.onAction = (e) => {\r\n this.ac.fixFitToPanel = false\r\n let oldXZoom = this.ac.currentXZoom()\r\n if(oldXZoom === null){\r\n return;\r\n }\r\n let newXzoom = oldXZoom * 2;\r\n this.ac.xZoom = newXzoom;\r\n\r\n let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));\r\n this.ac.clipBounds(cbr);\r\n this.zoomFitToPanelAction.disabled=false\r\n }\r\n this.zoomOutAction.onAction = (e) => {\r\n this.ac.fixFitToPanel = false\r\n let cbr1 = new Rectangle(new Position((this.spEl.scrollLeft / 2) - this.spEl.clientWidth, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));\r\n this.ac.clipBounds(cbr1);\r\n let oldXZoom = this.ac.currentXZoom()\r\n if(oldXZoom === null){\r\n return;\r\n }\r\n let newXzoom = oldXZoom / 2;\r\n this.ac.xZoom = newXzoom;\r\n\r\n let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));\r\n this.ac.clipBounds(cbr);\r\n this.zoomFitToPanelAction.disabled=false\r\n }\r\n\r\n this.zoomFitToPanelAction.onAction = (e) => {\r\n\r\n this.zoomFitToPanelAction.disabled=true\r\n\r\n // set container div width to this (viewport) width\r\n this.ac.ce.style.width=this.spEl.offsetWidth+'px';\r\n\r\n this.ac.fixFitToPanel=true;\r\n }\r\n\r\n this.zoomSelectedAction.onAction = (e) => {\r\n //alert(\"not implemented yet\")\r\n\r\n let s = this.ac.selection\r\n if (s) {\r\n // reset auto fit to panel mode\r\n this.ac.fixFitToPanel = false\r\n\r\n // calculate selection length in seconds\r\n if(this.ac.audioData) {\r\n let sr = this.ac.audioData.sampleRate;\r\n let selFrLen = s.endFrame - s.startFrame;\r\n let selLenInSecs = selFrLen / sr;\r\n // calculate corresponding xZoom value\r\n let newXZoom = this.spEl.clientWidth / selLenInSecs\r\n // apply xZoom\r\n this.ac.xZoom = newXZoom\r\n\r\n // Move viewport to show selection\r\n let x1 = this.ac.frameToXPixelPosition(s.startFrame);\r\n if (x1 !== null) {\r\n this.spEl.scrollLeft = x1;\r\n }\r\n }\r\n this.updateClipBounds()\r\n this.zoomFitToPanelAction.disabled = false\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n updateClipBounds(){\r\n let cbr=new Rectangle(new Position(this.spEl.scrollLeft,this.spEl.scrollTop), new Dimension(this.spEl.clientWidth,this.spEl.clientHeight));\r\n this.ac.clipBounds(cbr);\r\n }\r\n\r\n @HostListener('scroll', ['$event'])\r\n onScroll(se: Event) {\r\n this.updateClipBounds()\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: Event): void {\r\n this.updateClipBounds()\r\n }\r\n\r\n layout(){\r\n this.ac.layout();\r\n }\r\n\r\n selectionChanged(s:Selection| null){\r\n this.zoomSelectedAction.disabled=(s==null)\r\n }\r\n\r\n set audioData(audioData: AudioBuffer | null) {\r\n this.ac.audioData=audioData;\r\n this.zoomOutAction.disabled=(!audioData)\r\n this.zoomInAction.disabled=(!audioData)\r\n }\r\n\r\n @Input()\r\n set audioClip(audioClip: AudioClip | null) {\r\n\r\n let audioData:AudioBuffer|null=null;\r\n let sel:Selection|null=null;\r\n if(audioClip){\r\n audioData=audioClip.buffer;\r\n sel=audioClip.selection;\r\n audioClip.addSelectionObserver((clip)=>{\r\n this.zoomSelectedAction.disabled=(clip.selection==null)\r\n })\r\n }\r\n\r\n this.selectionChanged(sel)\r\n this.ac.audioClip=audioClip\r\n this.zoomOutAction.disabled=(!audioData)\r\n this.zoomInAction.disabled=(!audioData)\r\n window.setTimeout(()=>{\r\n this.layout();\r\n })\r\n }\r\n\r\n\r\n set playFramePosition(framePos:number){\r\n this.ac.playFramePosition=framePos;\r\n }\r\n\r\n\r\n}\r\n\r\n","import {Component, AfterContentInit, ChangeDetectorRef, Input, ViewChild} from '@angular/core'\r\nimport {Action} from \"../../action/action\";\r\nimport {MatCheckbox, MatCheckboxChange} from \"@angular/material/checkbox\";\r\nimport {AudioClip} from \"../persistor\";\r\n\r\n\r\n @Component({\r\n\r\n selector: 'audio-display-control',\r\n\r\n template: `\r\n <div #controlPanel style=\"display:flex;flex-direction: row;\">\r\n <fieldset>\r\n\r\n <legend>Play</legend>\r\n\r\n <button (click)=\"playStartAction?.perform()\" [disabled]=\"playStartAction?.disabled\"\r\n [style.color]=\"playStartAction?.disabled ? 'grey' : 'green'\" matTooltip=\"Play all\">\r\n <mat-icon>play_arrow</mat-icon>\r\n </button>\r\n <button (click)=\"playSelectionAction?.perform()\" [disabled]=\"playSelectionAction?.disabled\"\r\n [style.color]=\"playSelectionAction?.disabled ? 'grey' : 'green'\" matTooltip=\"Play selection\">\r\n <mat-icon>play_circle_outline</mat-icon>\r\n </button>\r\n <button (click)=\"playStopAction?.perform()\" [disabled]=\"playStopAction?.disabled\"\r\n [style.color]=\"playStopAction?.disabled ? 'grey' : 'yellow'\">\r\n <mat-icon>stop</mat-icon>\r\n </button> \r\n <mat-checkbox #autoplaySelectionCheckbox (change)=\"autoPlaySelectionChange($event)\">Autoplay on select\r\n </mat-checkbox>\r\n </fieldset>\r\n <fieldset>\r\n\r\n <legend>Zoom</legend>\r\n <button (click)=\"zoomFitToPanelAction?.perform()\"\r\n [disabled]=\"zoomFitToPanelAction?.disabled\">{{zoomFitToPanelAction?.name}}</button>\r\n <button (click)=\"zoomOutAction?.perform()\"\r\n [disabled]=\"zoomOutAction?.disabled\">{{zoomOutAction?.name}}</button>\r\n <button (click)=\"zoomInAction?.perform()\"\r\n [disabled]=\"zoomInAction?.disabled\">{{zoomInAction?.name}}</button>\r\n <button (click)=\"zoomSelectedAction?.perform()\"\r\n [disabled]=\"zoomSelectedAction?.disabled\">{{zoomSelectedAction?.name}}</button>\r\n </fieldset>\r\n <fieldset>\r\n <legend>Selection</legend>\r\n {{audioClip?.selection?.leftFrame}} <span\r\n *ngIf=\"audioClip?.selection\">to</span> {{audioClip?.selection?.rightFrame}}\r\n <button (click)=\"clearSelection()\" [disabled]=\"audioClip?.selection==null\"\r\n [style.color]=\"hasSelection() ? 'red' : 'grey'\" matTooltip=\"Clear selection\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n\r\n </fieldset>\r\n </div>`,\r\n styles: [\r\n `:host {\r\n flex: 0;\r\n\r\n }`]\r\n\r\n })\r\n\texport class AudioDisplayControl implements AfterContentInit {\r\n\r\n @Input() audioClip: AudioClip|null=null;\r\n\r\n @ViewChild(MatCheckbox, { static: true })\r\n private autoplaySelectedCheckbox: MatCheckbox|null=null;\r\n @Input() playStartAction: Action<void>|undefined;\r\n @Input() playSelectionAction: Action<void>|undefined;\r\n @Input() playStopAction: Action<void>|undefined;\r\n @Input() zoomInAction: Action<void>|null=null;\r\n @Input() zoomOutAction: Action<void>|null=null;\r\n @Input() zoomFitToPanelAction: Action<void>|undefined;\r\n @Input() zoomSelectedAction: Action<void>|undefined;\r\n @Input() autoPlayOnSelectToggleAction: Action<boolean>|undefined;\r\n\t status:string|null=null;\r\n\r\n\t\taudio:any;\r\n\r\n\t\tconstructor(private ref: ChangeDetectorRef) {\r\n\r\n\t\t}\r\n\r\n ngAfterContentInit() {\r\n\r\n\t\t}\r\n\r\n clearSelection(){\r\n if(this.audioClip!=null){\r\n this.audioClip.selection=null\r\n }\r\n }\r\n\r\n hasSelection():boolean{\r\n let hs=false;\r\n if(this.audioClip){\r\n hs=(this.audioClip.selection!=null);\r\n }\r\n return hs;\r\n }\r\n\r\n autoPlaySelectionChange(ch: MatCheckboxChange) {\r\n if (this.autoPlayOnSelectToggleAction) {\r\n this.autoPlayOnSelectToggleAction.perform(ch.checked)\r\n }\r\n }\r\n\r\n\t\terror(){\r\n\t\t\tthis.status = 'ERROR';\r\n\t\t}\r\n\r\n\r\n }\r\n\r\n","import {\r\n Component,\r\n ViewChild,\r\n ChangeDetectorRef,\r\n AfterViewInit, Input, OnInit, ElementRef,\r\n} from '@angular/core'\r\n\r\nimport {AudioClip, Selection} from './persistor'\r\nimport {ActivatedRoute} from \"@angular/router\";\r\nimport {Action} from \"../action/action\";\r\nimport {AudioDisplayScrollPane} from \"./ui/audio_display_scroll_pane\";\r\n\r\n@Component({\r\n\r\n selector: 'app-audiodisplay',\r\n\r\n template: `\r\n\r\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\r\n\r\n <audio-display-control [audioClip]=\"audioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [playStopAction]=\"playStopAction\"\r\n [autoPlayOnSelectToggleAction]=\"autoPlayOnSelectToggleAction\"\r\n [zoomInAction]=\"zoomInAction\"\r\n [zoomOutAction]=\"zoomOutAction\"\r\n [zoomSelectedAction]=\"zoomSelectedAction\"\r\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\r\n `,\r\n styles: [\r\n `:host {\r\n display: flex;\r\n flex-direction: column;\r\n position: absolute;\r\n bottom: 0px;\r\n height: 100%;\r\n width: 100%;\r\n overflow: hidden;\r\n padding: 20px;\r\n z-index: 5;\r\n box-sizing: border-box;\r\n background-color: rgba(230, 230, 230, 1.0)\r\n }`,`\r\n legend{\r\n margin-left: 1em; padding: 0.2em 0.8em;font-size: 0.8em;\r\n }`,`\r\n fieldset{\r\n border: 1px darkgray solid\r\n }\r\n `]\r\n\r\n})\r\nexport class AudioDisplay implements OnInit,AfterViewInit {\r\n\r\n parentE: HTMLElement;\r\n private _audioClip:AudioClip|null=null\r\n\r\n @Input()\r\n playStartAction: Action<void>|undefined;\r\n @Input()\r\n playStopAction: Action<void>|undefined;\r\n @Input()\r\n playSelectionAction:Action<void>|undefined;\r\n @Input()\r\n autoPlayOnSelectToggleAction!:Action<boolean>|undefined;\r\n\r\n zoomFitToPanelAction!:Action<void>;\r\n zoomSelectedAction!:Action<void>\r\n zoomInAction!:Action<void>;\r\n zoomOutAction!:Action<void>;\r\n\r\n clearSelectionAction!:Action<void>\r\n\r\n status: string;\r\n\r\n audio: any;\r\n\r\n @ViewChild(AudioDisplayScrollPane, { static: true })\r\n audioDisplayScrollPane!: AudioDisplayScrollPane;\r\n\r\n constructor(private route: ActivatedRoute, private ref: ChangeDetectorRef,private eRef:ElementRef) {\r\n //console.log(\"constructor: \"+this.ac);\r\n this.parentE=this.eRef.nativeElement;\r\n this.playStartAction = new Action(\"Start\");\r\n this.playSelectionAction=new Action(\"Play selected\");\r\n this.playStopAction = new Action(\"Stop\");\r\n this.status=\"Player created.\";\r\n\r\n }\r\n\r\n ngOnInit(){\r\n this.zoomSelectedAction=this.audioDisplayScrollPane.zoomSelectedAction\r\n this.zoomFitToPanelAction=this.audioDisplayScrollPane.zoomFitToPanelAction\r\n this.zoomOutAction=this.audioDisplayScrollPane.zoomOutAction\r\n this.zoomInAction=this.audioDisplayScrollPane.zoomInAction\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.layout();\r\n let heightListener=new MutationObserver((mrs:Array<MutationRecord>,mo:MutationObserver)=>{\r\n mrs.forEach((mr:MutationRecord)=>{\r\n if('attributes'===mr.type && ('class'===mr.attributeName || 'style'===mr.attributeName)){\r\n this.layout();\r\n }\r\n })\r\n });\r\n heightListener.observe(this.parentE,{attributes: true,childList: true, characterData: true});\r\n }\r\n\r\n\r\n layout(){\r\n this.audioDisplayScrollPane.layout();\r\n }\r\n\r\n\r\n started() {\r\n console.log(\"Play started\");\r\n this.status = 'Playing...';\r\n }\r\n\r\n\r\n @Input()\r\n set audioData(audioBuffer: AudioBuffer){\r\n this.audioDisplayScrollPane.audioData = audioBuffer;\r\n if(this.playStartAction) {\r\n this.playStartAction.disabled = (audioBuffer == null)\r\n }\r\n }\r\n\r\n @Input()\r\n set audioClip(audioClip: AudioClip | null) {\r\n\r\n let audioData:AudioBuffer|null=null;\r\n let sel:Selection|null=null;\r\n if(audioClip){\r\n audioData=audioClip.buffer;\r\n sel=audioClip.selection;\r\n }\r\n this._audioClip=audioClip\r\n this.audioDisplayScrollPane.audioClip = audioClip;\r\n //this.playStartAction.disabled = (audioData!==null)\r\n }\r\n\r\n get audioClip():AudioClip|null{\r\n return this._audioClip\r\n }\r\n\r\n set playFramePosition(playFramePosition:number){\r\n this.audioDisplayScrollPane.playFramePosition = playFramePosition\r\n }\r\n\r\n error() {\r\n this.status = 'ERROR';\r\n }\r\n\r\n}\r\n\r\n","\n\nimport {Directive, ElementRef, Input} from \"@angular/core\";\n@Directive({\n selector: \"[scrollIntoViewToBottom]\"\n})\nexport class ScrollIntoViewDirective{\n\n constructor(private elRef:ElementRef){}\n @Input()\n set scrollIntoViewToBottom(siv:boolean){\n if(siv){\n this.elRef.nativeElement.scrollIntoView(false);\n }\n }\n\n}\n","import {Component, EventEmitter, Input, Output} from '@angular/core'\r\nimport {Item} from './item';\r\n\r\n\r\n@Component({\r\n\r\n selector: 'app-sprprogress',\r\n\r\n template: `\r\n\r\n <table class=\"mat-typography\">\r\n <thead>\r\n <tr>\r\n <th>#</th><!--<th>Code</th>-->\r\n <th>Prompt</th>\r\n <th>Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngIf=\"items\">\r\n\r\n <tr *ngFor=\"let item of items; let itIdx=index;\"\r\n (click)=\"rowSelect=itIdx\" [class.selRow]=\"itIdx===selectedItemIdx\"\r\n [scrollIntoViewToBottom]=\"itIdx===selectedItemIdx\">\r\n <td>{{itIdx}}</td>\r\n <td class=\"promptDescriptor\">{{item.promptAsString}}</td>\r\n <td>\r\n <mat-icon *ngIf=\"item.recs && item.recs.length>0\">done</mat-icon>\r\n\r\n </td>\r\n </tr>\r\n </ng-container>\r\n\r\n </tbody>\r\n </table>\r\n `,\r\n styles: [`:host {\r\n overflow-x: hidden;\r\n overflow-y: scroll;\r\n padding: 10pt;\r\n /*flex: 0.1 0 300px; \r\n min-width: 300px; */\r\n flex: 0.1 0 content;\r\n background: white;\r\n /* Workaround for Firefox\r\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\r\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\r\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\r\n */\r\n /* min-height:0px; */\r\n min-height: 1px;\r\n }`,\r\n `table {\r\n min-height: 1px;\r\n border-collapse: collapse;\r\n /* Tables do not have a natural min size */\r\n /*min-width: 300px; */\r\n \r\n }\r\n\r\n table, th, td {\r\n border: 1px solid lightgrey;\r\n padding: 0.5em;\r\n \r\n }\r\n\r\n `, `\r\n .selRow {\r\n background: lightblue;\r\n }\r\n `,`.promptDescriptor{\r\n \r\n max-width: 200px;\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n }`]\r\n\r\n})\r\nexport class Progress {\r\n @Input() items: Array<Item>|null=null;\r\n @Input() selectedItemIdx = 0;\r\n @Input() enableDownload: boolean=false;\r\n @Output() onRowSelect = new EventEmitter<number>();\r\n @Output()\r\n set rowSelect(rowIdx:number){\r\n this.onRowSelect.emit(rowIdx);\r\n }\r\n\r\n @Output() onShowDoneAction = new EventEmitter<number>();\r\n @Output()\r\n set clickDone(rowIdx:number){\r\n if(this.items &&this.items[rowIdx] && this.items[rowIdx].recs) {\r\n this.onRowSelect.emit(rowIdx);\r\n this.onShowDoneAction.emit(rowIdx);\r\n }\r\n }\r\n\r\n @Output() onDownloadDoneAction = new EventEmitter<number>();\r\n @Output()\r\n set clickDownloadDone(rowIdx:number){\r\n if(this.items && this.items[rowIdx] && this.items[rowIdx].recs) {\r\n this.onRowSelect.emit(rowIdx);\r\n this.onDownloadDoneAction.emit(rowIdx);\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n ViewChild,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n HostListener,\r\n ElementRef,\r\n OnInit,\r\n Renderer2,\r\n HostBinding,\r\n AfterContentChecked\r\n} from \"@angular/core\";\r\n\r\nimport {SimpleTrafficLight} from \"../startstopsignal/ui/simpletrafficlight\";\r\nimport {State as StartStopSignalState} from \"../startstopsignal/startstopsignal\";\r\nimport {Item} from \"./item\";\r\nimport {Block, Text, Mediaitem, PromptItem} from \"../script/script\";\r\nimport {TransportActions} from \"./controlpanel\";\r\nimport {Action} from \"../../action/action\";\r\nimport {AudioDisplay} from \"../../audio/audio_display\";\r\nimport {ProjectService} from \"../project/project.service\";\r\nimport {AudioClip} from \"../../audio/persistor\";\r\n\r\n@Component({\r\n\r\n selector: 'spr-recinstructions',\r\n\r\n template: `\r\n\r\n {{displayText()}}\r\n `,\r\n styles: [`:host {\r\n\r\n justify-content: left; /* align horizontal center */\r\n align-items: flex-start; /* align vertical center */\r\n background: white;\r\n text-align: left;\r\n font-size: 1em;\r\n flex: 0;\r\n width: 100%;\r\n }\r\n `]\r\n})\r\nexport class Recinstructions {\r\n @Input() recinstructions: string|null| undefined;\r\n @Input() selectedItemIdx: number|null|undefined;\r\n @Input() itemCount: number|undefined;\r\n\r\n displayText():string{\r\n let riTxt:string='';\r\n if(this.itemCount && this.selectedItemIdx){\r\n riTxt=riTxt+this.selectedItemIdx+'/'+(this.itemCount-1);\r\n }\r\n if(this.recinstructions){\r\n riTxt=riTxt+': '+this.recinstructions;\r\n }\r\n return riTxt;\r\n }\r\n}\r\n\r\n@Component({\r\n\r\n selector: 'app-sprprompter',\r\n\r\n template: `\r\n\r\n <!--<ng-template [ngIf]=\"text\">{{text}}</ng-template>-->\r\n <!-- <img *ngIf=\"src\" #promptImage [src]=\"srcUrl()\" [height]=\"prompterHeight-20\" /> -->\r\n `,\r\n styles: [`:host {\r\n\r\n justify-content: center; /* align horizontal center */\r\n align-items: center; /* align vertical center */\r\n background: white;\r\n text-align: center;\r\n /* font-size: 2em; */\r\n line-height: 1.2em;\r\n font-weight: bold;\r\n /* Use only natural size of the prompt */\r\n /* The prompter compnent then ets aligned vertically centered */\r\n flex: 0 1;\r\n\r\n }`, `:host(.fill) {\r\n /* Use all space to scale images */\r\n flex: 3;\r\n width: 100%;\r\n height: 100%;\r\n max-height: 100%;\r\n max-width: 100%;\r\n /* A separate flex container might be necessayr to alighn centered */\r\n vertical-align: middle; /* TODO does not work, image is not vertically centered */\r\n }`]\r\n})\r\nexport class Prompter {\r\n @Input() projectName: string | undefined;\r\n private _promptMediaItems: Array<Mediaitem>|null|undefined=null\r\n\r\n @Input() prompterHeight: number=0;\r\n private _text: string|undefined|null = null;\r\n private _src: string|undefined|null = null;\r\n private _blocks: Array<Block>|undefined;\r\n mimetype!: string;\r\n private currPromptChild: HTMLElement|null = null;\r\n\r\n @HostBinding('class.fill') public prompterStyleFill = false;\r\n\r\n constructor(private elRef: ElementRef, private renderer: Renderer2, private projectService: ProjectService) {\r\n\r\n }\r\n\r\n get text() {\r\n return this._text;\r\n }\r\n\r\n get src() {\r\n return this._src;\r\n }\r\n\r\n srcUrl(): string|null{\r\n if (this.projectName && this._src) {\r\n return this.projectService.projectResourceUrl(this.projectName, this._src);\r\n }\r\n return null;\r\n }\r\n\r\n width():number|null{\r\n if(this.elRef){\r\n if(this.elRef.nativeElement){\r\n return this.elRef.nativeElement.clientWidth\r\n }\r\n }\r\n return null;\r\n }\r\n height():number|null{\r\n if(this.elRef){\r\n if(this.elRef.nativeElement){\r\n return this.elRef.nativeElement.clientHeight\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private appendTextElement(parentEl:HTMLElement,txt:Text){\r\n let t: string = <string>txt.text\r\n let txtNd = this.renderer.createText(t)\r\n if(txt.decoration || txt.color){\r\n let spEl = this.renderer.createElement('span')\r\n let styleStr=''\r\n if(txt.decoration) {\r\n styleStr = styleStr +'text-decoration: ' + txt.decoration+';'\r\n }\r\n if(txt.color){\r\n styleStr = styleStr +'color: ' + txt.color+';'\r\n }\r\n spEl.style=styleStr\r\n this.renderer.appendChild(parentEl, spEl)\r\n this.renderer.appendChild(spEl, txtNd)\r\n }else {\r\n this.renderer.appendChild(parentEl, txtNd)\r\n }\r\n }\r\n\r\n @Input() set promptMediaItems(pMis: Array<Mediaitem>|null) {\r\n this._promptMediaItems = pMis\r\n if (this.currPromptChild != null) {\r\n this.renderer.removeChild(this.elRef.nativeElement, this.currPromptChild)\r\n }\r\n if (this._promptMediaItems && this._promptMediaItems.length == 1) {\r\n let mi = this._promptMediaItems[0]\r\n this.mimetype = 'text/plain'\r\n if (mi.mimetype) {\r\n this.mimetype = mi.mimetype.trim();\r\n }\r\n if (this.mimetype === 'text/plain') {\r\n this._text = mi.text\r\n this._src = null;\r\n let prTxt='';\r\n if(this._text){\r\n prTxt=this._text;\r\n }\r\n this.currPromptChild = this.renderer.createText(prTxt);\r\n this.prompterStyleFill = false;\r\n this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild);\r\n } else if (this.mimetype === 'text/x-prompt') {\r\n //this.rendering=true\r\n this._text=null;\r\n this._src=null;\r\n this._blocks=new Array<Block>();\r\n let pd=mi.promptDoc\r\n if(pd){\r\n let pdBody=pd.body\r\n if(pdBody){\r\n this._blocks=pdBody.blocks;\r\n }\r\n }\r\n\r\n this.prompterStyleFill = false\r\n this.currPromptChild = this.renderer.createElement('div')\r\n if(this._blocks) {\r\n for (let bi = 0; bi < this._blocks.length; bi++) {\r\n let bl = this._blocks[bi]\r\n if ('p' === bl.type) {\r\n let pBlEl = this.renderer.createElement('p')\r\n this.renderer.appendChild(this.currPromptChild, pBlEl)\r\n for (let ti = 0; ti < bl.texts.length; ti++) {\r\n let txt = bl.texts[ti]\r\n if (txt) {\r\n if ('text' === txt.type) {\r\n this.appendTextElement(pBlEl, txt)\r\n } else if ('font' === txt.type) {\r\n let spEl = this.renderer.createElement('span')\r\n let styleStr = ''\r\n if (txt.style) {\r\n styleStr = styleStr + 'font-style: ' + txt.style + ';'\r\n }\r\n if (txt.size) {\r\n styleStr = styleStr + 'font-size: ' + txt.size + ';'\r\n }\r\n if (txt.weight) {\r\n styleStr = styleStr + 'font-weight: ' + txt.weight + ';'\r\n }\r\n spEl.style = styleStr\r\n this.renderer.appendChild(pBlEl, spEl)\r\n this.appendTextElement(spEl, <Text>txt.text)\r\n } else if ('linebreak' === txt.type) {\r\n let brEl = this.renderer.createElement('br')\r\n this.renderer.appendChild(pBlEl, brEl)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild)\r\n //this.rendering=false\r\n } else if (this.mimetype.startsWith('image')) {\r\n this._text = null;\r\n this._src = mi.src\r\n let promptImage = new Image()\r\n\r\n this.currPromptChild = promptImage\r\n this.renderer.appendChild(this.elRef.nativeElement, this.currPromptChild)\r\n this.renderer.setStyle(this.currPromptChild, \"max-width\", \"100%\")\r\n this.renderer.setStyle(this.currPromptChild, \"max-height\", \"100%\")\r\n this.prompterStyleFill = true\r\n // TODO vertical alignment\r\n // https://stackoverflow.com/questions/7273338/how-to-vertically-align-an-image-inside-a-div\r\n\r\n //console.log(promptImage.naturalWidth + \"x\"+promptImage.naturalHeight);\r\n promptImage.onload = (ev: Event) => {}\r\n let srcUrl=this.srcUrl();\r\n if(srcUrl) {\r\n promptImage.src = srcUrl;\r\n }\r\n }\r\n\r\n } else {\r\n this._text = null\r\n this._src = null\r\n }\r\n }\r\n}\r\n\r\nexport const VIRTUAL_HEIGHT = 600;\r\nexport const DEFAULT_PROMPT_FONTSIZE = 48;\r\nexport const MIN_FONT_SIZE=6;\r\nexport const FALLBACK_DEF_USER_AGENT_FONT_SIZE = 14;\r\n\r\n@Component({\r\n\r\n selector: 'app-sprpromptcontainer',\r\n\r\n template: `\r\n <app-sprprompter #prompter [projectName]=\"projectName\" [promptMediaItems]=\"mediaitems\" [style.font-size]=\"fontSize+'px'\" [style.visibility]=\"prDisplay\" [prompterHeight]=\"prompterHeight\"></app-sprprompter>\r\n `\r\n ,\r\n styles: [`:host {\r\n\r\n flex: 3; /* the container consumes all available space */\r\n padding: 10pt;\r\n height: 100%;\r\n max-height: 100%;\r\n\r\n justify-content: center; /* align horizontal center*/\r\n align-items: center; /* align vertical center */\r\n background: white;\r\n text-align: center;\r\n display: flex;\r\n flex-direction: column;\r\n min-height: 0px;\r\n width: 100%;\r\n }\r\n `]\r\n})\r\nexport class PromptContainer implements OnInit,AfterContentChecked {\r\n @Input() projectName: string | undefined;\r\n private _mediaitems: Array<Mediaitem>|null=null;\r\n\r\n prompterHeight: number = VIRTUAL_HEIGHT\r\n fontSize!: number;\r\n fontSizeChange=false\r\n contentChecked=false;\r\n prDisplay='hidden';\r\n defaultStyle!: CSSStyleDeclaration;\r\n defaultFontSizePx!: number;\r\n\r\n autoFontSize=false;\r\n @ViewChild(Prompter, { static: true }) prompter!: Prompter;\r\n\r\n constructor(private elRef:ElementRef){}\r\n\r\n ngOnInit() {\r\n\r\n // fallback\r\n this.defaultFontSizePx = FALLBACK_DEF_USER_AGENT_FONT_SIZE;\r\n // try to parse default user agent font size (no comment about DOM API design ;) )\r\n this.defaultStyle = window.getComputedStyle(this.elRef.nativeElement);\r\n let defFontSizeStr = this.defaultStyle.fontSize;\r\n if (defFontSizeStr) {\r\n defFontSizeStr = defFontSizeStr.trim();\r\n if (defFontSizeStr.endsWith('px')) {\r\n // parseFloat ignores non number characters at the end (again no comment ;) )\r\n this.defaultFontSizePx = parseFloat(defFontSizeStr);\r\n //console.info(\"Default font size: \"+this.defaultFontSizePx)\r\n }\r\n }\r\n this.contentChecked = false;\r\n }\r\n\r\n ngAfterContentChecked(): void {\r\n if(this.autoFontSize) {\r\n if (this.fontSizeChange) {\r\n //console.log(\"ngaftercontentchecked, call fontSizeToFit \");\r\n // check prompter size again\r\n this.fontSizeToFit()\r\n } else {\r\n // font size was checked, but we need to check again after angular content check\r\n if (!this.contentChecked) {\r\n this.contentChecked = true;\r\n //console.log(\"ngaftercontentchecked, not font size changed, call \");\r\n this.fontSizeToFit()\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n @Input() set mediaitems(mediaitems:Array<Mediaitem>|null){\r\n\r\n this._mediaitems = mediaitems\r\n\r\n let mimetype:string|null=null;\r\n if (this._mediaitems && this._mediaitems.length == 1) {\r\n let mi = this._mediaitems[0]\r\n mimetype = 'text/plain'\r\n if (mi.mimetype) {\r\n mimetype = mi.mimetype.trim();\r\n }\r\n if(mi.defaultVirtualViewBox){\r\n this.prompterHeight=mi.defaultVirtualViewBox.height\r\n }\r\n }else{\r\n this.prompterHeight=VIRTUAL_HEIGHT\r\n }\r\n this.prompter.promptMediaItems=this._mediaitems\r\n this.autoFontSize=(mimetype!=null && mimetype.startsWith('text/'));\r\n if(this.autoFontSize){\r\n this.fontSizeChange = true;\r\n this.contentChecked = false\r\n this.prDisplay = 'hidden'\r\n this.layout()\r\n }\r\n }\r\n\r\n get mediaitems():Array<Mediaitem>|null{\r\n return this._mediaitems;\r\n }\r\n\r\n\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: Event): void {\r\n //console.debug(\"onresize, call fontSizeToFit hook \");\r\n this.layout();\r\n }\r\n\r\n private layout() {\r\n if(this.autoFontSize && this.elRef) {\r\n\r\n this.fontSizeChange=true;\r\n this.contentChecked = false\r\n this.prDisplay = 'hidden'\r\n let elH = this.elRef.nativeElement.offsetHeight;\r\n // prompt text font size should scale according to prompt container height\r\n let scaledSize = Math.round((elH / this.prompterHeight) * DEFAULT_PROMPT_FONTSIZE);\r\n\r\n // min prompt font size is default user agent size\r\n let newSize = Math.max(scaledSize, this.defaultFontSizePx);\r\n if (this.fontSize !== newSize) {\r\n this.fontSize = newSize;\r\n }\r\n\r\n //console.log(\"layout, call fontSizeToFit hook \");\r\n window.setTimeout(() => this.fontSizeToFit())\r\n\r\n }\r\n }\r\n\r\n\r\n private fontSizeToFit(){\r\n if(this.prompter) {\r\n let pW=this.prompter.width();\r\n let pH=this.prompter.height();\r\n if (this._mediaitems && this.elRef && pW && pH) {\r\n let nEl = this.elRef.nativeElement\r\n //console.log(\"prompter: \" + this.prompter.width() + \"x\" + this.prompter.height()+ \" font size: \"+this.fontSize)\r\n if (this.fontSize >= MIN_FONT_SIZE && (pW > nEl.offsetWidth || pH > nEl.offsetHeight)) {\r\n // prompter oversizes prompter container. Decrease font size.\r\n // set invisible during font size checks\r\n this.prDisplay = 'hidden'\r\n // decrease font size\r\n this.fontSize = this.fontSize - 1\r\n // console.log(\"Decreased font size: \"+this.fontSize )\r\n // Set flags\r\n this.fontSizeChange = true\r\n this.contentChecked = false\r\n // hook the next check\r\n window.setTimeout(() => this.fontSizeToFit())\r\n } else {\r\n // prompter fits in prompter container, font size should be fine\r\n\r\n //console.log(\"prDisplay: \"+this.prDisplay)\r\n\r\n //if(this.contentChecked && ! this.fontSizeChange) {\r\n //console.log(\"Display!\")\r\n // set prompter visible now\r\n this.prDisplay = 'visible'\r\n //}\r\n this.fontSizeChange = false\r\n }\r\n //console.log(\"Prompt text width: \"+textSize.width+\" \"+this.elRef.nativeElement.offsetWidth+\"x\"+this.elRef.nativeElement.offsetHeight)\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n@Component({\r\n\r\n selector: 'app-sprpromptingcontainer',\r\n\r\n template: `\r\n <spr-recinstructions [selectedItemIdx]=\"selectedItemIdx\" [itemCount]=\"itemCount\"\r\n [recinstructions]=\"promptItem?.recinstructions?.recinstructions\"></spr-recinstructions>\r\n <app-sprpromptcontainer [projectName]=\"projectName\"\r\n [mediaitems]=\"showPrompt?(promptItem?promptItem.mediaitems:null):null\"></app-sprpromptcontainer>\r\n\r\n `\r\n ,\r\n styles: [`:host {\r\n position: relative;\r\n flex: 3; /* the container consumes all available space */\r\n padding: 10pt;\r\n justify-content: center; /* align horizontal center*/\r\n align-items: center; /* align vertical center */\r\n background: white;\r\n text-align: center;\r\n display: flex;\r\n flex-direction: column;\r\n min-height: 0px;\r\n }\r\n `]\r\n})\r\nexport class PromptingContainer {\r\n @Input() projectName: string | undefined;\r\n @Input() promptItem: PromptItem|null=null;\r\n @Input() showPrompt: boolean=false;\r\n @Input() selectedItemIdx!: number;\r\n @Input() itemCount: number|undefined;\r\n\r\n @Input() transportActions!: TransportActions;\r\n\r\n private e!: HTMLDivElement;\r\n private startX: number | null = null\r\n private touchStartTimeStamp: number | null=null;\r\n\r\n constructor(private ref: ElementRef) {\r\n type TouchStart = {}\r\n }\r\n\r\n ngOnInit() {\r\n this.e = this.ref.nativeElement;\r\n }\r\n\r\n @HostListener('touchstart', ['$event'])\r\n onTouchstart(ev: TouchEvent | any) {\r\n //console.log(\"Touch start! \")\r\n if (!(this.transportActions.fwdAction.disabled &&\r\n this.transportActions.bwdAction.disabled &&\r\n this.transportActions.nextAction.disabled)) {\r\n let targetTouchesLen = ev.targetTouches.length;\r\n //for(let ti=0;ti<ev.targetTouches.length;ti++){\r\n //let t=ev.targetTouches.item(ti);\r\n // All x values are the same ??\r\n //console.log(\"Touch #\"+ti+\": pageX: \"+t.pageX+\" clientX: \"+t.clientX+\" screenX: \"+t.screenX)\r\n //}\r\n if (targetTouchesLen == 1) {\r\n // single touch\r\n let t = ev.targetTouches.item(0);\r\n if (t) {\r\n this.startX = Math.round(t.screenX);\r\n this.touchStartTimeStamp = ev.timeStamp;\r\n this.e.style.transition = 'none';\r\n //console.log(\"Touch start x: \"+this.startX)\r\n //ev.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n @HostListener('touchend', ['$event'])\r\n onTouchEnd(ev: TouchEvent | any) {\r\n //console.log(\"Touch end!\")\r\n // Reset offset shift\r\n if (!(this.transportActions.fwdAction.disabled && this.transportActions.bwdAction.disabled &&\r\n this.transportActions.nextAction.disabled)) {\r\n\r\n let changedTouchesLen = ev.changedTouches.length;\r\n //console.log(changedTouchesLen+\" \"+this.startX)\r\n if (changedTouchesLen == 1 && this.startX) {\r\n // single touch\r\n let t = ev.changedTouches.item(0);\r\n if (t) {\r\n let deltaX = Math.round(t.clientX - this.startX);\r\n let touchMoveSpeed = 0;\r\n if (this.touchStartTimeStamp) {\r\n touchMoveSpeed = deltaX / (ev.timeStamp - this.touchStartTimeStamp);\r\n }\r\n let futureDeltaX = deltaX + (800 * touchMoveSpeed);\r\n //console.log(\"DeltaX: \" + deltaX + \" Future deltaX: \" + futureDeltaX + \" width: \" + this.e.offsetWidth)\r\n if (futureDeltaX > this.e.offsetWidth / 2) {\r\n //console.log(\"Swipe right detected!!\")\r\n //this.swipedRight.emit()\r\n if (!this.transportActions.bwdAction.disabled) {\r\n this.transportActions.bwdAction.perform();\r\n }\r\n this.e.style.left = -this.e.offsetLeft + \"px\";\r\n }\r\n if (-futureDeltaX > this.e.offsetWidth / 2) {\r\n //console.log(\"Swipe left detected!!\")\r\n this.e.style.left = -this.e.offsetLeft + \"px\";\r\n //this.swipedLeft.emit()\r\n if (!this.transportActions.nextAction.disabled) {\r\n this.transportActions.nextAction.perform();\r\n } else if (!this.transportActions.fwdAction.disabled) {\r\n this.transportActions.fwdAction.perform();\r\n }\r\n } else {\r\n }\r\n ev.preventDefault();\r\n }\r\n }\r\n\r\n // reset animated\r\n this.e.style.transition = \"left 0.8s\";\r\n }\r\n this.startX = null;\r\n this.touchStartTimeStamp = null;\r\n this.e.style.left = \"0px\";\r\n }\r\n\r\n @HostListener('touchmove', ['$event'])\r\n onTouchMove(ev: TouchEvent | any) {\r\n //console.log(\"Touch move!\")\r\n if (!(this.transportActions.fwdAction.disabled && this.transportActions.bwdAction.disabled &&\r\n this.transportActions.nextAction.disabled)) {\r\n let targetTouchesLen = ev.targetTouches.length;\r\n if (targetTouchesLen == 1 && this.startX) {\r\n // single touch\r\n let t = ev.targetTouches.item(0);\r\n if (t) {\r\n let deltaX = Math.round(t.screenX - this.startX);\r\n this.e.style.left = deltaX + \"px\";\r\n // console.log(\"Touch move delta x: \"+deltaX)\r\n }\r\n ev.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('touchcancel', ['$event'])\r\n onTouchCancel(ev: TouchEvent | any) {\r\n //console.log(\"Touch cancel!\")\r\n this.e.style.left = \"0px\";\r\n //ev.preventDefault();\r\n }\r\n\r\n}\r\n\r\n\r\n@Component({\r\n\r\n selector: 'app-sprprompting',\r\n\r\n template: `\r\n\r\n <app-simpletrafficlight [status]=\"startStopSignalState\"></app-simpletrafficlight>\r\n <app-sprpromptingcontainer [projectName]=\"projectName\" [promptItem]=\"promptItem\" [showPrompt]=\"showPrompt\"\r\n [itemCount]=\"items?.length\" [selectedItemIdx]=\"selectedItemIdx\"\r\n [transportActions]=\"transportActions\"></app-sprpromptingcontainer>\r\n <app-sprprogress fxHide.xs [items]=\"items\" [selectedItemIdx]=\"selectedItemIdx\"\r\n (onRowSelect)=\"itemSelect($event)\"></app-sprprogress>\r\n <div fxHide.xs #asCt [class.active]=\"!audioSignalCollapsed\">\r\n\r\n <app-audiodisplay #audioSignalContainer [class.active]=\"!audioSignalCollapsed\"\r\n [audioClip]=\"displayAudioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [autoPlayOnSelectToggleAction]=\"autoPlayOnSelectToggleAction\"\r\n [playStopAction]=\"playStopAction\"></app-audiodisplay>\r\n\r\n\r\n </div>\r\n\r\n\r\n\r\n `,\r\n styles: [`:host {\r\n position: relative;\r\n margin: 0;\r\n padding: 0;\r\n background: lightgrey;\r\n width: 100%; /* use all horizontal available space */\r\n flex: 1; /* ... and fill rest of vertical available space (other components have flex 0) */\r\n\r\n /* Workaround for Firefox\r\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\r\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\r\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\r\n */\r\n min-height: 0px;\r\n\r\n display: flex; /* flex container: left traffic light, right prompter (container) */\r\n flex-direction: row;\r\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\r\n }`, `\r\n app-simpletrafficlight {\r\n margin: 10px;\r\n min-height: 0px;\r\n z-index: 3;\r\n }\r\n `, `\r\n app-sprprogress {\r\n z-index: 3;\r\n }\r\n `, `\r\n div {\r\n display: none;\r\n position: absolute;\r\n\r\n\r\n /* height: 50%; */\r\n /* width: 100%; */\r\n\r\n /* overflow: hidden; */\r\n\r\n /* margin: 20px; */\r\n /* border: 20px; */\r\n z-index: 5;\r\n /*background-color: red; */\r\n }`, `\r\n div.active {\r\n display: flex;\r\n position: absolute;\r\n bottom: 0px;\r\n /*left: 0px; */\r\n\r\n height: 90%;\r\n width: 100%;\r\n\r\n overflow: hidden;\r\n\r\n padding: 0px;\r\n /* margin: 20px; */\r\n /* border: 20px; */\r\n z-index: 5;\r\n box-sizing: border-box;\r\n background-color: rgba(0, 0, 0, 0)\r\n\r\n }`\r\n ]\r\n\r\n})\r\n\r\nexport class Prompting {\r\n @ViewChild(SimpleTrafficLight, { static: true }) simpleTrafficLight!: SimpleTrafficLight;\r\n @ViewChild(AudioDisplay, { static: true }) audioDisplay!: AudioDisplay;\r\n @Input() projectName: string | undefined;\r\n @Input() startStopSignalState!: StartStopSignalState;\r\n @Input() promptItem: PromptItem | null=null;\r\n @Input() showPrompt: boolean=false;\r\n @Input() items: Array<Item>|null=null;\r\n @Input() selectedItemIdx!: number;\r\n @Input() transportActions!: TransportActions;\r\n @Input() enableDownload: boolean=false;\r\n\r\n @Input() audioSignalCollapsed: boolean=true;\r\n @Input() displayAudioClip: AudioClip | null=null;\r\n @Input() playStartAction: Action<void>|undefined;\r\n @Input() playSelectionAction: Action<void>|undefined;\r\n @Input() autoPlayOnSelectToggleAction:Action<boolean>|undefined;\r\n @Input() playStopAction: Action<void>|undefined;\r\n @Output() onItemSelect = new EventEmitter<number>();\r\n @Output() onNextItem = new EventEmitter();\r\n @Output() onPrevItem = new EventEmitter();\r\n\r\n itemSelect(rowIdx: number) {\r\n this.onItemSelect.emit(rowIdx);\r\n }\r\n\r\n nextItem() {\r\n this.onNextItem.emit();\r\n }\r\n\r\n prevItem() {\r\n this.onPrevItem.emit();\r\n }\r\n}\r\n\r\n","export interface Float32ArrayOutStream {\r\n\r\n write(buffers: Array<Float32Array>): number;\r\n\r\n flush(): void;\r\n\r\n close(): void;\r\n}\r\n\r\nexport class Float32ArrayChunkerOutStream implements Float32ArrayOutStream {\r\n\r\n private bufs = new Array<Float32Array>();\r\n private filled: number;\r\n\r\n private _channels: number=0;\r\n private _chunkSize: number=0;\r\n\r\n private receivedFrames: number;\r\n private sentFrames: number;\r\n\r\n constructor(private outStream: Float32ArrayOutStream) {\r\n this.filled = 0;\r\n this.receivedFrames = 0;\r\n this.sentFrames = 0;\r\n }\r\n\r\n private createBuffers() {\r\n this.bufs = new Array<Float32Array>(this._channels);\r\n for (let ch = 0; ch < this._channels; ch++) {\r\n this.bufs[ch] = new Float32Array(this._chunkSize);\r\n }\r\n }\r\n\r\n set chunkSize(chunkSize: number) {\r\n this._chunkSize = chunkSize;\r\n this.createBuffers();\r\n }\r\n\r\n set channels(channels: number) {\r\n this._channels = channels;\r\n this.createBuffers();\r\n }\r\n\r\n write(buffers: Array<Float32Array>): number {\r\n\r\n let copied = 0;\r\n if(buffers.length>0) {\r\n let buffersLen = buffers[0].length;\r\n this.receivedFrames += buffersLen;\r\n let avail = buffersLen;\r\n // Fill out buffers until all values copied\r\n\r\n while (avail > 0) {\r\n let toFill = this._chunkSize - this.filled;\r\n if (toFill > avail) {\r\n toFill = avail;\r\n }\r\n let sliceEnd = copied + toFill;\r\n\r\n // Firefox on Android sends only the first channel\r\n for (let ch = 0; ch < buffersLen; ch++) {\r\n if(buffers[ch]) {\r\n let cpPrt = buffers[ch].slice(copied, sliceEnd);\r\n let buf = this.bufs[ch];\r\n buf.set(cpPrt, this.filled);\r\n }\r\n }\r\n copied += toFill;\r\n avail -= toFill;\r\n this.filled += toFill;\r\n if (this.filled == this._chunkSize) {\r\n this.outStream.write(this.bufs);\r\n this.sentFrames += this.filled;\r\n this.filled = 0;\r\n\r\n }\r\n }\r\n }\r\n return copied;\r\n }\r\n\r\n flush(): void {\r\n if (this.filled > 0) {\r\n let restBufs = new Array<Float32Array>(this._channels);\r\n for (let ch = 0; ch < this._channels; ch++) {\r\n restBufs[ch] = this.bufs[ch].slice(0, this.filled);\r\n }\r\n this.outStream.write(restBufs);\r\n this.outStream.flush();\r\n this.sentFrames += this.filled;\r\n this.filled = 0;\r\n }\r\n }\r\n\r\n\r\n close(): void {\r\n this.outStream.close();\r\n }\r\n}\r\n","import {Float32ArrayChunkerOutStream, Float32ArrayOutStream} from \"../../io/stream\";\r\n\r\nexport interface AudioFloat32OutStream extends Float32ArrayOutStream{\r\n setFormat(channels: number,sampleRate:number):void;\r\n}\r\n\r\nexport interface SequenceAudioFloat32OutStream extends AudioFloat32OutStream{\r\n nextStream():void;\r\n}\r\n\r\n\r\n\r\nexport class SequenceAudioFloat32ChunkerOutStream extends Float32ArrayChunkerOutStream implements SequenceAudioFloat32OutStream{\r\n\r\n private sampleRate:number|null=null;\r\n private sequenceAudioFloat32OutStream:SequenceAudioFloat32OutStream;\r\n constructor(outStream:SequenceAudioFloat32OutStream, private chunkDurationSeconds:number){\r\n super(outStream);\r\n this.sequenceAudioFloat32OutStream=outStream;\r\n }\r\n\r\n setFormat(channels: number,sampleRate:number):void{\r\n this.channels=channels;\r\n this.sampleRate=sampleRate;\r\n this.chunkSize=Math.round(sampleRate*this.chunkDurationSeconds);\r\n this.sequenceAudioFloat32OutStream.setFormat(channels,sampleRate);\r\n }\r\n nextStream():void{\r\n this.sequenceAudioFloat32OutStream.nextStream();\r\n }\r\n}\r\n","\r\nimport {Component, Inject} from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\n\r\n@Component({\r\n selector: 'spr-session-finished-dialog',\r\n template: `<h1 mat-dialog-title><mat-icon [style.color]=\"'green'\">done_all</mat-icon> Session finished</h1>\r\n <div mat-dialog-content>\r\n\r\n <p>Thank you! The recording session is complete.</p>\r\n\r\n </div>\r\n <div mat-dialog-actions>\r\n <button mat-button (click)=\"closeDialog()\">OK</button>\r\n </div>\r\n `\r\n})\r\nexport class SessionFinishedDialog{\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<SessionFinishedDialog>,\r\n @Inject(MAT_DIALOG_DATA) public data: any) { }\r\n\r\n closeDialog(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n}\r\n","import {Component, Inject} from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\n\r\n@Component({\r\n selector: 'msg-dialog',\r\n template: `<h1 mat-dialog-title><mat-icon *ngIf=\"data.type==='error'\" [style.color]=\"'red'\">error</mat-icon>\r\n <mat-icon *ngIf=\"data.type==='warning'\" [style.color]=\"'yellow'\">warning</mat-icon>{{data.title}}</h1>\r\n <div mat-dialog-content>\r\n\r\n <p>{{data.msg}}</p>\r\n <p>{{data.advice}}</p>\r\n\r\n </div>\r\n <div mat-dialog-actions>\r\n <button mat-button (click)=\"closeDialog()\">OK</button>\r\n </div>\r\n `\r\n})\r\nexport class MessageDialog{\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<MessageDialog>,\r\n @Inject(MAT_DIALOG_DATA) public data: any) { }\r\n\r\n closeDialog(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n}\r\n","\r\nexport class AudioContextProvider\r\n{\r\n private static _audioContext:AudioContext| null=null;\r\n\r\n public static audioContextInstance():AudioContext|null\r\n {\r\n if (!this._audioContext) {\r\n let debugFail = false;\r\n if (!window.AudioContext || typeof window.AudioContext !== 'function' || debugFail) {\r\n throw new Error('Browser does not support Web Audio API!');\r\n this._audioContext=null;\r\n } else {\r\n this._audioContext= new window.AudioContext();\r\n }\r\n }\r\n return this._audioContext;\r\n }\r\n\r\n}\r\n","import {SprRecordingFile} from \"../recording\";\r\n\r\nexport class Item {\r\n recs: Array<SprRecordingFile> | null;\r\n\r\n constructor(private _promptAsString: string, private _training: boolean,private _recording:boolean) {\r\n this.recs = null;\r\n }\r\n\r\n get promptAsString():string{\r\n return this._promptAsString;\r\n }\r\n\r\n get training():boolean{\r\n return this._training;\r\n }\r\n\r\n get recording():boolean{\r\n return this._recording;\r\n }\r\n\r\n}\r\n","import {AfterViewInit, ChangeDetectorRef, Component, ElementRef, HostListener, Input, ViewChild} from \"@angular/core\"\r\nimport {LevelInfo, LevelInfos, LevelListener} from \"../dsp/level_measure\";\r\n\r\nexport const DEFAULT_WARN_DB_LEVEL = -2;\r\nexport const MIN_DB_LEVEL = -60.0;\r\nexport const CONSIDERED_SILENCE_DB_LEVEL = MIN_DB_LEVEL*2;\r\nexport const LINE_WIDTH = 2;\r\nexport const LINE_DISTANCE = 2;\r\nexport const LEVEL_INDICATOR_HEIGHT=3;\r\n\r\nexport const OVERFLOW_THRESHOLD = 0.25;\r\nexport const OVERFLOW_INCR_FACTOR = 0.5;\r\n\r\n\r\n@Component({\r\n\r\n selector: 'audio-levelbar',\r\n template: `\r\n <div #virtualCanvas>\r\n <canvas #levelbar></canvas>\r\n <canvas #markerCanvas></canvas>\r\n </div>\r\n `,\r\n styles: [`:host {\r\n\r\n width: 100%;\r\n background: darkgray;\r\n box-sizing: border-box;\r\n height: 100%;\r\n position: relative;\r\n overflow-x: scroll;\r\n overflow-y: auto;\r\n }`, `div {\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n\r\n /*position: absolute;*/\r\n box-sizing: border-box;\r\n }`, `canvas {\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n position: absolute;\r\n }`]\r\n\r\n})\r\nexport class LevelBar implements LevelListener,AfterViewInit {\r\n\r\n @ViewChild('virtualCanvas', { static: true }) virtualCanvasRef!: ElementRef;\r\n virtualCanvas!: HTMLDivElement;\r\n @ViewChild('levelbar', { static: true }) liveLevelCanvasRef!: ElementRef;\r\n liveLevelCanvas!: HTMLCanvasElement;\r\n @ViewChild('markerCanvas', { static: true }) markerCanvasRef!: ElementRef;\r\n markerCanvas!: HTMLCanvasElement;\r\n ce!: HTMLDivElement;\r\n dbValues: Array<Array<number>>;\r\n peakDbLvl = MIN_DB_LEVEL;\r\n private _streamingMode = false;\r\n private _staticLevelInfos: LevelInfos | null = null;\r\n private _playFramePosition: number|null=null;\r\n\r\n warnDBLevel = DEFAULT_WARN_DB_LEVEL;\r\n\r\n constructor(private ref: ElementRef, private changeDetectorRef: ChangeDetectorRef) {\r\n this.dbValues = new Array<Array<number>>();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.ce = this.ref.nativeElement;\r\n this.liveLevelCanvas = this.liveLevelCanvasRef.nativeElement;\r\n this.markerCanvas = this.markerCanvasRef.nativeElement;\r\n this.markerCanvas.style.zIndex = '4';\r\n this.virtualCanvas = this.virtualCanvasRef.nativeElement;\r\n this.layout();\r\n this.drawAll();\r\n }\r\n\r\n\r\n @HostListener('scroll', ['$event'])\r\n onScroll(se: Event) {\r\n setTimeout(()=>{\r\n this.updateViewportPosition();\r\n this.drawAll();\r\n this.drawPlayPosition();\r\n });\r\n }\r\n\r\n private updateViewportPosition(){\r\n // Move canvases to visible viewport position\r\n let viewPortStyleLeft=this.ce.scrollLeft + 'px';\r\n this.liveLevelCanvas.style.left = viewPortStyleLeft;\r\n this.markerCanvas.style.left = viewPortStyleLeft;\r\n }\r\n\r\n @Input()\r\n set streamingMode(streamingMode: boolean) {\r\n if (this._streamingMode !== streamingMode) {\r\n this._streamingMode = streamingMode;\r\n this.reset();\r\n this.layoutStatic();\r\n }\r\n }\r\n\r\n @Input()\r\n set displayLevelInfos(levelInfos: LevelInfos | null) {\r\n this._staticLevelInfos = levelInfos;\r\n if (levelInfos) {\r\n\r\n this.dbValues = levelInfos.bufferLevelInfos.map((li) => {\r\n return li.powerLevelsDB()\r\n });\r\n } else {\r\n this.dbValues = new Array<Array<number>>();\r\n }\r\n this.layoutStatic();\r\n }\r\n\r\n set channelCount(channelCount: number) {\r\n this.reset();\r\n }\r\n\r\n set playFramePosition(playFramePosition: number) {\r\n this._playFramePosition = playFramePosition;\r\n this.drawPlayPosition();\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: Event) {\r\n\r\n this.layout();\r\n this.drawAll();\r\n }\r\n\r\n layout() {\r\n\r\n // set Canvas size to viewport size\r\n this.liveLevelCanvas.width = this.ce.offsetWidth;\r\n this.liveLevelCanvas.height = this.ce.offsetHeight;\r\n\r\n this.markerCanvas.width = this.ce.offsetWidth;\r\n this.markerCanvas.height = this.ce.offsetHeight;\r\n\r\n // and move to viewport position\r\n this.updateViewportPosition();\r\n\r\n this.drawAll();\r\n this.drawPlayPosition();\r\n }\r\n\r\n update(levelInfos: LevelInfo) {\r\n if (this._streamingMode) {\r\n let dbVals = levelInfos.powerLevelsDB();\r\n let peakDBVal = levelInfos.powerLevelDB();\r\n if (this.peakDbLvl < peakDBVal) {\r\n this.peakDbLvl = peakDBVal;\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n this.dbValues.push(dbVals);\r\n let i = this.dbValues.length - 1;\r\n let x = i * (LINE_DISTANCE + LINE_WIDTH);\r\n this.drawPushValue(x, dbVals);\r\n this.checkWidth();\r\n }\r\n }\r\n\r\n streamFinished() {\r\n this.layoutStatic();\r\n }\r\n\r\n private layoutStatic() {\r\n\r\n let requiredWidth = Math.round(this.dbValues.length * (LINE_DISTANCE + LINE_WIDTH));\r\n if (this.virtualCanvas && this.ce) {\r\n\r\n this.virtualCanvas.style.width = requiredWidth + 'px';\r\n this.ce.scrollLeft = requiredWidth - this.ce.offsetWidth;\r\n this.layout();\r\n }\r\n\r\n }\r\n\r\n private checkWidth() {\r\n let requiredWidth = this.dbValues.length * (LINE_DISTANCE + LINE_WIDTH);\r\n if (this.virtualCanvas.offsetWidth - requiredWidth < this.ce.offsetWidth * OVERFLOW_THRESHOLD) {\r\n let newWidth = Math.floor(this.virtualCanvas.offsetWidth + (this.ce.offsetWidth * OVERFLOW_INCR_FACTOR));\r\n this.virtualCanvas.style.width = newWidth + 'px';\r\n this.ce.scrollLeft = newWidth - this.ce.offsetWidth;\r\n\r\n // do not call layout here it is triggered by the scroll event\r\n //this.layout();\r\n }\r\n }\r\n\r\n reset() {\r\n this.peakDbLvl = MIN_DB_LEVEL;\r\n this.dbValues = new Array<Array<number>>();\r\n this.layout();\r\n this.drawAll();\r\n this.drawPlayPosition();\r\n }\r\n\r\n private drawLevelBackground(g: CanvasRenderingContext2D, x: number, h: number){\r\n g.strokeStyle = 'black';\r\n g.fillStyle = 'black';\r\n g.fillRect(x,0,LINE_WIDTH+LINE_DISTANCE,h)\r\n }\r\n\r\n // private drawLevelLine(g: CanvasRenderingContext2D, x: number, h: number, dbVal: number) {\r\n // //translate to viewport\r\n // let xc = x - this.ce.scrollLeft;\r\n //\r\n // this.drawLevelBackground(g,xc,h);\r\n // g.lineWidth = LINE_WIDTH;\r\n // if (dbVal >= this.warnDBLevel) {\r\n // g.strokeStyle = 'red';\r\n // g.fillStyle = 'red';\r\n //\r\n // } else {\r\n // g.strokeStyle = '#00c853';\r\n // g.fillStyle = '#00c853';\r\n // }\r\n // g.beginPath();\r\n // g.moveTo(xc, h);\r\n // let pVal = ((dbVal - MIN_DB_LEVEL) / -MIN_DB_LEVEL) * h;\r\n //\r\n // g.lineTo(xc, h - pVal);\r\n // g.closePath();\r\n // g.stroke();\r\n //\r\n // }\r\n\r\n private drawLevelLines(g: CanvasRenderingContext2D, x: number, h: number, dbVals: Array<number>) {\r\n //translate to viewport\r\n let xc = x - this.ce.scrollLeft;\r\n this.drawLevelBackground(g,xc,h);\r\n\r\n let chH = Math.floor(h / dbVals.length);\r\n g.lineWidth = LINE_WIDTH;\r\n for (let ch = 0; ch < dbVals.length; ch++) {\r\n let dbVal = dbVals[ch];\r\n\r\n let y = Math.floor(ch * chH);\r\n if (dbVal >= this.warnDBLevel) {\r\n g.strokeStyle = 'red';\r\n g.fillStyle = 'red';\r\n } else if(dbVal < CONSIDERED_SILENCE_DB_LEVEL) {\r\n g.strokeStyle='grey';\r\n g.fillStyle='grey'\r\n } else{\r\n g.strokeStyle = '#00c853';\r\n g.fillStyle = '#00c853'\r\n }\r\n g.beginPath();\r\n g.moveTo(xc, y + chH);\r\n g.lineTo(xc, y + chH - LEVEL_INDICATOR_HEIGHT);\r\n let pnVal=((dbVal - MIN_DB_LEVEL) / -MIN_DB_LEVEL);\r\n let lvlIndicatorSpace=LEVEL_INDICATOR_HEIGHT+LINE_DISTANCE;\r\n let levelH=chH-lvlIndicatorSpace;\r\n let pVal = pnVal * levelH;\r\n if(pVal>levelH-1){\r\n pVal=levelH-1\r\n }else if(pVal<0){\r\n pVal=0\r\n }\r\n g.moveTo(xc, y + chH - lvlIndicatorSpace );\r\n g.lineTo(xc, y + chH - lvlIndicatorSpace - pVal);\r\n g.closePath();\r\n g.stroke();\r\n }\r\n }\r\n\r\n private drawPushValue(x: number, dbVals: Array<number>) {\r\n\r\n if (this.liveLevelCanvas) {\r\n let h = this.liveLevelCanvas.height;\r\n let g = this.liveLevelCanvas.getContext(\"2d\");\r\n if (g) {\r\n this.drawLevelLines(g, x, h, dbVals);\r\n }\r\n }\r\n }\r\n\r\n private drawAll() {\r\n if (this.liveLevelCanvas) {\r\n let w = this.liveLevelCanvas.width;\r\n let h = this.liveLevelCanvas.height;\r\n let g = this.liveLevelCanvas.getContext(\"2d\");\r\n if (g) {\r\n // clear canvas\r\n g.fillStyle = 'grey';\r\n g.fillRect(0, 0, w, h);\r\n\r\n g.lineWidth = LINE_WIDTH;\r\n\r\n if (this.dbValues.length > 0) {\r\n // draw only viewport part:\r\n\r\n // draw from x1 to x2\r\n let x1 = this.ce.scrollLeft;\r\n let x2 = x1 + this.ce.offsetWidth;\r\n\r\n // corresponds to this level values:\r\n let i1 = Math.floor(x1 / (LINE_DISTANCE + LINE_WIDTH));\r\n let i2 = Math.ceil(x2 / (LINE_DISTANCE + LINE_WIDTH));\r\n // some values around\r\n i1 -= 2;\r\n i2 += 2;\r\n // limits\r\n if (i1 < 0) {\r\n i1 = 0;\r\n }\r\n if (i2 > this.dbValues.length) {\r\n i2 = this.dbValues.length;\r\n }\r\n\r\n var c=0;\r\n for (let i = i1; i < i2; i++) {\r\n let x = i * (LINE_DISTANCE + LINE_WIDTH);\r\n let dbVals = this.dbValues[i];\r\n if (dbVals) {\r\n this.drawLevelLines(g, x, h, dbVals);\r\n c++;\r\n }\r\n\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n\r\n private framesPerPixel(): number | null {\r\n // one buffer\r\n if (this._staticLevelInfos) {\r\n let framesPerBuffer = this._staticLevelInfos.framesPerBuffer();\r\n let pixelsPerBuffer = LINE_DISTANCE + LINE_WIDTH;\r\n\r\n return framesPerBuffer / pixelsPerBuffer;\r\n }\r\n return null;\r\n }\r\n\r\n\r\n private drawPlayPosition() {\r\n if (this.markerCanvas) {\r\n let w = this.markerCanvas.width;\r\n let h = this.markerCanvas.height;\r\n let g = this.markerCanvas.getContext(\"2d\");\r\n if (g) {\r\n g.clearRect(0, 0, w, h);\r\n let framesPerPixel = this.framesPerPixel();\r\n if (framesPerPixel && this._playFramePosition) {\r\n let x = this._playFramePosition / framesPerPixel;\r\n\r\n // Get position in viewport\r\n let xc = x - this.ce.scrollLeft;\r\n // Only draw if inside marker (viewport) canvas\r\n if(xc>=0 && xc<=w) {\r\n g.fillStyle = 'red';\r\n g.strokeStyle = 'red';\r\n g.lineWidth = LINE_WIDTH;\r\n g.beginPath();\r\n // paint over all channels\r\n g.moveTo(xc, 0);\r\n g.lineTo(xc, h);\r\n g.closePath();\r\n g.stroke();\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n}\r\n","import {Action} from '../../action/action'\r\nimport {\r\n Component, ViewChild, Input\r\n} from \"@angular/core\";\r\n\r\nimport { MatDialog} from \"@angular/material/dialog\";\r\nimport {ProgressSpinnerMode} from \"@angular/material/progress-spinner\";\r\n\r\n\r\n@Component({\r\n\r\n selector: 'app-sprstatusdisplay',\r\n\r\n template: `\r\n <p matTooltip=\"Status\">\r\n <mat-progress-spinner *ngIf=\"statusWaiting\" color=\"black\" mode=\"indeterminate\" [diameter]=\"30\" [strokeWidth]=\"5\"></mat-progress-spinner><mat-icon *ngIf=\"statusAlertType==='error'\" style=\"color:red\">report_problem</mat-icon>\r\n {{statusMsg}}\r\n </p>\r\n `,\r\n styles: [`:host {\r\n display: inline;\r\n text-align: left;\r\n font-size: smaller;\r\n }`, `\r\n p {\r\n padding: 4px;\r\n white-space:nowrap;\r\n display: inline-block;\r\n }\r\n `, `\r\n mat-progress-spinner {\r\n color: black;\r\n display: inline-block;\r\n }\r\n `, `\r\n span {\r\n color: red;\r\n }\r\n `]\r\n\r\n})\r\n\r\nexport class StatusDisplay {\r\n @Input() statusAlertType = 'info';\r\n @Input() statusMsg = 'Initialize...';\r\n @Input() statusWaiting =false;\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'app-uploadstatus',\r\n template: `\r\n <mat-progress-spinner [mode]=\"spinnerMode\" [color]=\"status\" [diameter]=\"30\" [strokeWidth]=\"5\" [value]=\"_value\" [matTooltip]=\"toolTipText\"></mat-progress-spinner>\r\n `,\r\n styles: [`:host {\r\n flex: 1;\r\n /* align-self: flex-start; */\r\n /*display: inline; */\r\n text-align: left;\r\n }`,`mat-progress-spinner{\r\n display: inline-block;\r\n }`]\r\n})\r\nexport class UploadStatus {\r\n private _awaitNewUpload=false;\r\n spinnerMode:ProgressSpinnerMode = 'determinate';\r\n _status!:string\r\n _value = 100\r\n displayValue:string|null=null\r\n toolTipText:string=''\r\n\r\n private _updateSpinner(){\r\n\r\n let uplMsg;\r\n if (this._awaitNewUpload || this._value === 0) {\r\n this.spinnerMode = 'indeterminate'\r\n this.displayValue=' '\r\n uplMsg='Preparing upload.'\r\n } else {\r\n this.spinnerMode = 'determinate'\r\n this.displayValue=this._value+'%'\r\n if(this._value===100){\r\n uplMsg = 'Upload complete'\r\n }else {\r\n uplMsg = 'Upload progress: ' + this.displayValue\r\n }\r\n }\r\n if(this.status==='warn'){\r\n uplMsg='Upload error occurred. Please check your network connection. '+uplMsg\r\n }\r\n this.toolTipText=uplMsg\r\n }\r\n\r\n @Input()\r\n set value(value: number) {\r\n this._value = value;\r\n this._updateSpinner()\r\n };\r\n\r\n @Input() set awaitNewUpload(awaitNewUpload:boolean){\r\n this._awaitNewUpload=awaitNewUpload\r\n this._updateSpinner()\r\n }\r\n\r\n @Input() set status(status:string){\r\n this._status=status\r\n this._updateSpinner()\r\n }\r\n\r\n get status():string{\r\n return this._status\r\n }\r\n\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'app-sprprogressdisplay',\r\n template: `\r\n <p>{{progressMsg}}</p>\r\n `,\r\n styles: [`:host {\r\n flex: 1;\r\n /* align-self: flex-start; */\r\n /*display: inline; */\r\n width: 100%;\r\n text-align: left;\r\n }`]\r\n})\r\nexport class ProgressDisplay {\r\n progressMsg = '[itemcode]';\r\n}\r\n\r\n\r\n\r\n\r\nexport class TransportActions {\r\n startAction: Action<void>;\r\n stopAction: Action<void>;\r\n nextAction: Action<void>;\r\n fwdNextAction: Action<void>;\r\n pauseAction: Action<void>;\r\n fwdAction: Action<void>;\r\n bwdAction: Action<void>;\r\n\r\n constructor() {\r\n this.startAction = new Action('Start');\r\n this.stopAction = new Action('Stop');\r\n this.nextAction = new Action('Next');\r\n this.pauseAction = new Action('Pause');\r\n this.fwdNextAction = new Action('Next recording');\r\n this.fwdAction = new Action('Forward');\r\n this.bwdAction = new Action('Backward');\r\n\r\n }\r\n}\r\n\r\n@Component({\r\n\r\n selector: 'app-sprtransport',\r\n\r\n template: `\r\n <button id=\"bwdBtn\" *ngIf=\"navigationEnabled\" (click)=\"actions.bwdAction.perform()\" [disabled]=\"bwdDisabled()\"\r\n mat-raised-button>\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n <button (click)=\"startStopNextPerform()\" [disabled]=\"startDisabled() && stopDisabled() && nextDisabled()\" mat-raised-button>\r\n <mat-icon [style.color]=\"startStopNextIconColor()\">{{startStopNextIconName()}}</mat-icon><mat-icon *ngIf=\"!nextDisabled()\" [style.color]=\"nextDisabled() ? 'grey' : 'black'\">chevron_right</mat-icon>\r\n <span fxShow.xs=\"false\">{{startStopNextName()}}</span>\r\n </button>\r\n <button *ngIf=\"pausingEnabled\" (click)=\"actions.pauseAction.perform()\" [disabled]=\"pauseDisabled()\" mat-raised-button>\r\n <mat-icon>pause</mat-icon>\r\n <span fxShow.xs=\"false\">Pause</span>\r\n </button>\r\n <button id=\"fwdNextBtn\" *ngIf=\"navigationEnabled\" fxHide.xs (click)=\"actions.fwdNextAction.perform()\" [disabled]=\"fwdNextDisabled()\" mat-raised-button>\r\n <mat-icon>redo</mat-icon>\r\n </button>\r\n <button id=\"fwdBtn\" *ngIf=\"navigationEnabled\" (click)=\"actions.fwdAction.perform()\" [disabled]=\"fwdDisabled()\" mat-raised-button>\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n\r\n `,\r\n styles: [`:host {\r\n flex: 20;\r\n align-self: center;\r\n width: 100%;\r\n text-align: center;\r\n align-content: center;\r\n margin: 0;\r\n\r\n }`, `\r\n div {\r\n display: inline;\r\n flex: 0;\r\n }`,`\r\n button {\r\n touch-action: manipulation;\r\n }`\r\n ]\r\n\r\n})\r\nexport class TransportPanel {\r\n\r\n @Input() readonly!:boolean;\r\n @Input() actions!: TransportActions;\r\n @Input() navigationEnabled=true;\r\n @Input() pausingEnabled=true;\r\n\r\n startStopNextButtonName!:string;\r\n startStopNextButtonIconName!:string;\r\n\r\n startDisabled() {\r\n return !this.actions || this.readonly || this.actions.startAction.disabled\r\n }\r\n\r\n stopDisabled() {\r\n return !this.actions || this.actions.stopAction.disabled\r\n }\r\n\r\n nextDisabled() {\r\n return !this.actions || this.actions.nextAction.disabled || !this.navigationEnabled;\r\n }\r\n\r\n pauseDisabled() {\r\n return !this.actions || this.actions.pauseAction.disabled || !this.pausingEnabled;\r\n }\r\n\r\n fwdDisabled() {\r\n return !this.actions || this.actions.fwdAction.disabled || !this.navigationEnabled;\r\n }\r\n\r\n fwdNextDisabled() {\r\n return !this.actions || this.actions.fwdNextAction.disabled || !this.navigationEnabled;\r\n }\r\n\r\n bwdDisabled() {\r\n return !this.actions || this.actions.bwdAction.disabled || !this.navigationEnabled;\r\n }\r\n\r\n startStopNextName():string{\r\n if(!this.nextDisabled()){\r\n this.startStopNextButtonName= \"Next\"\r\n }else if(!this.startDisabled()){\r\n this.startStopNextButtonName=\"Start\"\r\n }else if(!this.stopDisabled()) {\r\n this.startStopNextButtonName = \"Stop\"\r\n }\r\n return this.startStopNextButtonName;\r\n }\r\n startStopNextIconName():string{\r\n if(!this.startDisabled()){\r\n this.startStopNextButtonIconName=\"fiber_manual_record\"\r\n }else if(!this.stopDisabled()){\r\n this.startStopNextButtonIconName=\"stop\"\r\n }else if(!this.nextDisabled()){\r\n this.startStopNextButtonIconName=\"stop\"\r\n }\r\n return this.startStopNextButtonIconName\r\n }\r\n startStopNextIconColor():string{\r\n if(!this.startDisabled()){\r\n return \"red\"\r\n }else if(!this.stopDisabled() || !this.nextDisabled()){\r\n return \"yellow\"\r\n }else{\r\n return \"grey\";\r\n }\r\n }\r\n\r\n startStopNextPerform(){\r\n if(!this.startDisabled()){\r\n this.actions.startAction.perform();\r\n }else if(!this.stopDisabled()){\r\n this.actions.stopAction.perform();\r\n }else if(!this.nextDisabled()){\r\n this.actions.nextAction.perform();\r\n }\r\n }\r\n\r\n}\r\n\r\n@Component({\r\n\r\n selector: 'app-readystateindicator',\r\n\r\n template: `\r\n <mat-icon [matTooltip]=\"readyStateToolTip\">{{hourGlassIconName}}</mat-icon>\r\n `,\r\n styles: []\r\n})\r\nexport class ReadyStateIndicator {\r\n _ready=true\r\n hourGlassIconName='hourglass_empty'\r\n readyStateToolTip:string=''\r\n\r\n constructor() {}\r\n\r\n @Input() set ready(ready:boolean){\r\n this._ready=ready\r\n this.hourGlassIconName=this._ready?'hourglass_empty':'hourglass_full'\r\n this.readyStateToolTip=this._ready?'Audio processing and upload done. You can leave the page without data loss.':'Please wait until audio processing and upload have finished. Please do not leave the page.'\r\n }\r\n\r\n get ready():boolean{\r\n return this._ready\r\n }\r\n\r\n}\r\n\r\n@Component({\r\n\r\n selector: 'app-sprcontrolpanel',\r\n\r\n template: `\r\n <div fxHide.xs fxLayout=\"row\" >\r\n <app-sprstatusdisplay fxFlex=\"0 0 0\" [statusMsg]=\"statusMsg\" [statusAlertType]=\"statusAlertType\" [statusWaiting]=\"statusWaiting\"\r\n class=\"hidden-xs\"></app-sprstatusdisplay>\r\n <app-sprtransport fxFlex=\"10 0 0\" [readonly]=\"readonly\" [actions]=\"transportActions\" [navigationEnabled]=\"navigationEnabled\"></app-sprtransport>\r\n <app-uploadstatus fxFlex=\"0 0 0\" *ngIf=\"enableUploadRecordings\" [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processing\"></app-uploadstatus>\r\n <app-readystateindicator [ready]=\"_ready\"></app-readystateindicator>\r\n </div>\r\n <div fxShow.xs fxHide fxLayout=\"column\">\r\n <div fxLayout=\"row\" fxFlexFill>\r\n <app-sprstatusdisplay fxFlex=\"10 0 0\" fxFlexAlign=\"left\" [statusMsg]=\"statusMsg\" [statusAlertType]=\"statusAlertType\" [statusWaiting]=\"statusWaiting\"\r\n class=\"hidden-xs\"></app-sprstatusdisplay>\r\n <app-uploadstatus fxFlex=\"0 0 0\" *ngIf=\"enableUploadRecordings\" [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processing\"></app-uploadstatus>\r\n <app-readystateindicator [ready]=\"_ready\"></app-readystateindicator>\r\n </div>\r\n <app-sprtransport [readonly]=\"readonly\" [actions]=\"transportActions\" [navigationEnabled]=\"navigationEnabled\"></app-sprtransport>\r\n\r\n </div>\r\n `,\r\n styles: [`div {\r\n align-content: center;\r\n align-items: center;\r\n margin: 0;\r\n padding: 20px;\r\n min-height: min-content; /* important */\r\n }`]\r\n})\r\nexport class ControlPanel {\r\n @ViewChild(StatusDisplay, { static: true }) statusDisplay!: StatusDisplay;\r\n @ViewChild(TransportPanel, { static: true }) transportPanel!: TransportPanel;\r\n\r\n @Input() readonly!:boolean\r\n @Input() transportActions!: TransportActions\r\n @Input() processing=false\r\n @Input() statusMsg!: string;\r\n @Input() statusAlertType!: string;\r\n @Input() statusWaiting!: boolean;\r\n @Input() uploadStatus!: string;\r\n @Input() uploadProgress!: number;\r\n @Input() currentRecording: AudioBuffer| null| undefined;\r\n @Input() enableUploadRecordings!: boolean;\r\n @Input() navigationEnabled=true;\r\n\r\n _ready=true\r\n\r\n constructor(public dialog: MatDialog) {\r\n\r\n }\r\n\r\n @Input() set ready(ready:boolean){\r\n this._ready=ready\r\n }\r\n\r\n get ready():boolean{\r\n return this._ready\r\n }\r\n\r\n}\r\n\r\n\r\n","import {DSPUtils} from \"../../dsp/utils\";\r\nimport {SequenceAudioFloat32OutStream} from \"../io/stream\";\r\nimport {Arrays, WorkerHelper} from \"../../utils/utils\";\r\n\r\nexport const MIN_DB_LEVEL = -40.0;\r\n\r\n\r\n\r\nexport class LevelInfo {\r\n\r\n private readonly _minLinLevels: Array<number>;\r\n private readonly _maxLinLevels: Array<number>;\r\n\r\n constructor(public readonly channelCount: number,\r\n public startFrame: number = 0,\r\n public frameLength: number = 0,\r\n minLinLevels?: Array<number>,\r\n maxLinLevels?: Array<number>) {\r\n this._minLinLevels = this.checkOrInitArray(minLinLevels);\r\n this._maxLinLevels = this.checkOrInitArray(maxLinLevels);\r\n }\r\n\r\n get minLinLevels() {\r\n return this._minLinLevels;\r\n }\r\n\r\n get maxLinLevels() {\r\n return this._maxLinLevels;\r\n }\r\n\r\n private checkOrInitArray(arr: Array<number> | undefined): Array<number> {\r\n if (arr) {\r\n if (arr.length !== this.channelCount)\r\n throw new Error(\"Level arrays must be equal to channel count \" + this.channelCount);\r\n return arr;\r\n } else {\r\n return new Array<number>(this.channelCount)\r\n }\r\n }\r\n\r\n merge(levelInfo: LevelInfo) {\r\n if (levelInfo === null) {\r\n return;\r\n }\r\n if (this.channelCount !== levelInfo.channelCount) {\r\n throw new Error(\"Channel count of level info to merge must be equal. (\" + this.channelCount + \" != \" + levelInfo.channelCount + \")\");\r\n }\r\n\r\n let endFrame = this.startFrame + this.frameLength;\r\n let mergeEndFrame = levelInfo.startFrame + levelInfo.frameLength;\r\n\r\n if (levelInfo.startFrame < this.startFrame) {\r\n this.startFrame = levelInfo.startFrame;\r\n }\r\n\r\n if (mergeEndFrame > endFrame) {\r\n this.frameLength = mergeEndFrame - this.startFrame;\r\n }\r\n\r\n for (let ch = 0; ch < this.channelCount; ch++) {\r\n\r\n if (levelInfo.minLinLevels[ch] < this.minLinLevels[ch]) {\r\n this.minLinLevels[ch] = levelInfo.minLinLevels[ch];\r\n }\r\n if (levelInfo.maxLinLevels[ch] > this.maxLinLevels[ch]) {\r\n this.maxLinLevels[ch] = levelInfo.maxLinLevels[ch];\r\n }\r\n }\r\n }\r\n\r\n levelsLin(): Array<number> {\r\n let lvlsLin = new Array<number>(this.channelCount);\r\n for (let ch = 0; ch < this.channelCount; ch++) {\r\n lvlsLin[ch] = Math.max(Math.abs(this.minLinLevels[ch]), Math.abs(this.maxLinLevels[ch]));\r\n }\r\n return lvlsLin;\r\n }\r\n\r\n powerLevelsDB(): Array<number> {\r\n let lvlsDb = new Array<number>(this.channelCount);\r\n for (let ch = 0; ch < this.channelCount; ch++) {\r\n lvlsDb[ch] = DSPUtils.toPowerLevelInDB(this.levelsLin()[ch]);\r\n }\r\n return lvlsDb;\r\n }\r\n\r\n powerLevelDB(): number {\r\n let pLvlsDb = this.powerLevelsDB();\r\n return Math.max(...pLvlsDb);\r\n }\r\n\r\n clone(): LevelInfo {\r\n return new LevelInfo(this.channelCount, this.startFrame, this.frameLength, Arrays.cloneNumberArray(this.minLinLevels),\r\n Arrays.cloneNumberArray(this.maxLinLevels));\r\n }\r\n}\r\n\r\nexport class LevelInfos {\r\n constructor(public readonly bufferLevelInfos: Array<LevelInfo>, public readonly peakLevelInfo: LevelInfo) {\r\n }\r\n\r\n framesPerBuffer():number{\r\n if(this.bufferLevelInfos.length>0){\r\n return this.bufferLevelInfos[0].frameLength;\r\n }\r\n return this.peakLevelInfo.frameLength/this.bufferLevelInfos.length;\r\n }\r\n}\r\n\r\n\r\nexport interface LevelListener {\r\n channelCount: number;\r\n\r\n update(levelInfo: LevelInfo, peakLevelInfo: LevelInfo): void;\r\n\r\n streamFinished(): void;\r\n\r\n reset(): void;\r\n}\r\n\r\nexport interface PeakLevelListener {\r\n update(peakLevel:number): void;\r\n}\r\n\r\nexport interface PeakLevelListener {\r\n\r\n update(levelInfo: LevelInfo, peakLevelInfo: LevelInfo): void;\r\n\r\n streamFinished(): void;\r\n\r\n reset(): void;\r\n}\r\n\r\nexport class PeakLevelInterceptor implements LevelListener{\r\n get peakDbLvl(): number {\r\n return this._peakDbLvl;\r\n }\r\n get channelCount(): number {\r\n return this._channelCount;\r\n }\r\n\r\n set channelCount(value: number) {\r\n this._channelCount = value;\r\n if(this.levelListener){\r\n this.levelListener.channelCount=value;\r\n }\r\n }\r\n\r\n private _channelCount: number=0;\r\n\r\n private _peakDbLvl = MIN_DB_LEVEL;\r\n\r\n\r\n\r\n constructor(private levelListener?:LevelListener) {}\r\n\r\n update(levelInfo: LevelInfo, peakLevelInfo: LevelInfo): void{\r\n let peakDBVal = levelInfo.powerLevelDB();\r\n if (this.peakDbLvl < peakDBVal) {\r\n this._peakDbLvl = peakDBVal;\r\n }\r\n }\r\n\r\n streamFinished(): void{\r\n if(this.levelListener){\r\n this.levelListener.streamFinished();\r\n }\r\n }\r\n\r\n reset(): void{\r\n this._peakDbLvl = MIN_DB_LEVEL;\r\n if(this.levelListener){\r\n this.levelListener.reset();\r\n }\r\n }\r\n}\r\n\r\ndeclare function postMessage(message: any, transfer?: Array<any>): void;\r\n\r\n\r\nexport class LevelMeasure {\r\n\r\n private readonly workerURL: string;\r\n private worker: Worker|null=null;\r\n\r\n constructor() {\r\n this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction)\r\n }\r\n\r\n calcBufferLevelInfos(audioBuffer: AudioBuffer, bufferTimeLength: number): Promise<LevelInfos> {\r\n return new Promise<LevelInfos>((resolve)=>{\r\n let chs = audioBuffer.numberOfChannels;\r\n let bufferFrameLength=Math.round(audioBuffer.sampleRate*bufferTimeLength);\r\n let buffers = new Array<any>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n let adCh=audioBuffer.getChannelData(ch);\r\n let adChCopy=new Float32Array(adCh.length);\r\n adChCopy.set(adCh);\r\n buffers[ch] = adChCopy.buffer;\r\n }\r\n\r\n this.worker = new Worker(this.workerURL);\r\n this.worker.onmessage = (me) => {\r\n\r\n let linLevelArrs=new Array<Float32Array>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n linLevelArrs[ch] = new Float32Array(me.data.linLevelBuffers[ch]);\r\n }\r\n\r\n let bufferCount=Math.ceil(me.data.frameLength/me.data.bufferFrameLength);\r\n let framePos=0;\r\n let bufferLevelInfos=new Array<LevelInfo>();\r\n let peakLevelInfo=new LevelInfo(chs);\r\n for(let bi=0;bi<bufferCount;bi++) {\r\n let minLevels = new Array<number>(chs);\r\n let maxLevels = new Array<number>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n let linLvlArrPos=bi*2;\r\n minLevels[ch]=linLevelArrs[ch][linLvlArrPos];\r\n maxLevels[ch]=linLevelArrs[ch][linLvlArrPos+1];\r\n }\r\n let bli = new LevelInfo(chs, framePos, me.data.bufferFrameLength, minLevels, maxLevels);\r\n bufferLevelInfos.push(bli);\r\n peakLevelInfo.merge(bli);\r\n }\r\n this.terminateWorker();\r\n resolve(new LevelInfos(bufferLevelInfos, peakLevelInfo));\r\n };\r\n\r\n this.worker.postMessage({bufferFrameLength:bufferFrameLength,audioData: buffers, chs: chs}, buffers);\r\n\r\n });\r\n\r\n }\r\n\r\n\r\n private terminateWorker() {\r\n this.worker?.terminate();\r\n\r\n }\r\n\r\n /*\r\n * Method used as worker code.\r\n */\r\n workerFunction() {\r\n self.onmessage = function (msg:MessageEvent) {\r\n\r\n let chs = msg.data.chs;\r\n let bufferFrameLength = msg.data.bufferFrameLength;\r\n\r\n let audioData = new Array<Float32Array>(chs);\r\n let linLevels = new Array<Float32Array>(chs);\r\n\r\n for (let ch = 0; ch < chs; ch++) {\r\n audioData[ch] = new Float32Array(msg.data.audioData[ch]);\r\n }\r\n let frameLength = audioData[0].length;\r\n let bufferCount=Math.ceil(frameLength/bufferFrameLength);\r\n for (let ch = 0; ch < chs; ch++) {\r\n linLevels[ch] = new Float32Array(bufferCount*2);\r\n }\r\n if (audioData && chs > 0) {\r\n for (let ch = 0; ch < chs; ch++) {\r\n let chData = audioData[ch];\r\n\r\n for (let s = 0; s < frameLength; s++) {\r\n let bi = Math.floor(s / bufferFrameLength);\r\n let lvlArrPos = bi * 2;\r\n //let bs = s % bufferFrameLength;\r\n let chSample=chData[s];\r\n if (chSample < linLevels[ch][lvlArrPos]) {\r\n linLevels[ch][lvlArrPos] = chSample;\r\n }\r\n lvlArrPos++;\r\n if (chSample > linLevels[ch][lvlArrPos]) {\r\n linLevels[ch][lvlArrPos] = chSample;\r\n }\r\n }\r\n }\r\n const linLevelBufs = new Array<any>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n linLevelBufs[ch] = linLevels[ch].buffer;\r\n }\r\n postMessage({bufferFrameLength:bufferFrameLength,frameLength:frameLength,linLevelBuffers: linLevelBufs}, linLevelBufs);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\nexport class StreamLevelMeasure implements SequenceAudioFloat32OutStream {\r\n\r\n currentLevelInfos: LevelInfo|null=null;\r\n peakLevelInfo: LevelInfo|null=null;\r\n\r\n private readonly workerURL: string;\r\n private worker: Worker|null=null;\r\n private channelCount: number=0;\r\n private bufferIndex: number = 0;\r\n private frameCount: number = 0;\r\n\r\n levelListener: LevelListener|null=null;\r\n peakLevelListener: ((peakLvlInDb:number)=>void)|null=null;\r\n private peakLevelInDb:number=MIN_DB_LEVEL;\r\n\r\n constructor() {\r\n this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction)\r\n }\r\n\r\n setFormat(channels: number, sampleRate: number) {\r\n this.channelCount = channels;\r\n this.currentLevelInfos = new LevelInfo(this.channelCount);\r\n this.peakLevelInfo = new LevelInfo(this.channelCount);\r\n this.worker = new Worker(this.workerURL);\r\n this.worker.onmessage = (me) => {\r\n let streamFinished = me.data.streamFinished;\r\n if (streamFinished) {\r\n if (this.levelListener) {\r\n this.levelListener.streamFinished()\r\n }\r\n } else {\r\n\r\n let minLevels = new Array<number>(this.channelCount);\r\n let maxLevels = new Array<number>(this.channelCount);\r\n for (let ch = 0; ch < this.channelCount; ch++) {\r\n let fls = new Float32Array(me.data.linLevelBuffers[ch]);\r\n minLevels[ch] = fls[0];\r\n maxLevels[ch] = fls[1];\r\n }\r\n let bi = new LevelInfo(this.channelCount, this.frameCount, me.data.fraemLength, minLevels, maxLevels);\r\n this.updateLevels(bi);\r\n }\r\n }\r\n }\r\n\r\n\r\n nextStream() {\r\n this.reset();\r\n }\r\n\r\n private reset() {\r\n this.currentLevelInfos = new LevelInfo(this.channelCount);\r\n this.peakLevelInfo = new LevelInfo(this.channelCount);\r\n if (this.levelListener) {\r\n this.levelListener.reset();\r\n this.levelListener.channelCount = this.channelCount;\r\n }\r\n if (this.peakLevelListener) {\r\n this.peakLevelInDb=MIN_DB_LEVEL;\r\n this.peakLevelListener(this.peakLevelInDb);\r\n }\r\n }\r\n\r\n write(bufferData: Array<Float32Array>): number {\r\n let bufArrCopies = new Array<Float32Array>(bufferData.length);\r\n let buffers = new Array<any>(bufferData.length);\r\n for (let ch = 0; ch < bufferData.length; ch++) {\r\n bufArrCopies[ch] = bufferData[ch].slice();\r\n buffers[ch] = bufArrCopies[ch].buffer;\r\n }\r\n this.worker?.postMessage({\r\n streamFinished: false,\r\n audioData: buffers,\r\n chs: this.channelCount,\r\n bufferIndex: this.bufferIndex\r\n }, buffers);\r\n this.bufferIndex++;\r\n return bufArrCopies[0].length;\r\n }\r\n\r\n flush() {\r\n this.worker?.postMessage({streamFinished: true});\r\n\r\n }\r\n\r\n close() {\r\n this.worker?.terminate();\r\n }\r\n\r\n /*\r\n * Method used as worker code.\r\n */\r\n workerFunction() {\r\n self.onmessage = function (msg:MessageEvent) {\r\n let streamFinished = msg.data.streamFinished;\r\n if (streamFinished) {\r\n postMessage({streamFinished: true});\r\n } else {\r\n let chs = msg.data.chs;\r\n let frameLength = null;\r\n let audioData = new Array<Float32Array>(chs);\r\n let linLevels = new Array<Float32Array>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n linLevels[ch] = new Float32Array(2);\r\n audioData[ch] = new Float32Array(msg.data.audioData[ch]);\r\n }\r\n\r\n if (audioData) {\r\n for (let ch = 0; ch < chs; ch++) {\r\n let chData = audioData[ch];\r\n if (frameLength === null) {\r\n frameLength = chData.length;\r\n }\r\n for (let s = 0; s < frameLength; s++) {\r\n let chSample=chData[s];\r\n if (chSample < linLevels[ch][0]) {\r\n linLevels[ch][0] = chSample;\r\n }\r\n if (chSample > linLevels[ch][1]) {\r\n linLevels[ch][1] = chSample;\r\n }\r\n }\r\n }\r\n }\r\n let linLevelBufs = new Array<any>(chs);\r\n for (let ch = 0; ch < chs; ch++) {\r\n linLevelBufs[ch] = linLevels[ch].buffer;\r\n }\r\n postMessage({streamFinished: false, frameLength: frameLength, linLevelBuffers: linLevelBufs}, linLevelBufs);\r\n }\r\n }\r\n }\r\n\r\n updateLevels(bufferLevelInfo: LevelInfo) {\r\n\r\n this.currentLevelInfos = bufferLevelInfo;\r\n if(this.peakLevelInfo) {\r\n this.peakLevelInfo.merge(bufferLevelInfo);\r\n if (this.levelListener) {\r\n this.levelListener.update(this.currentLevelInfos, this.peakLevelInfo.clone());\r\n }\r\n if(this.peakLevelListener){\r\n let peakDBVal = bufferLevelInfo.powerLevelDB();\r\n if (this.peakLevelInDb < peakDBVal) {\r\n this.peakLevelInDb = peakDBVal;\r\n // the event comes from outside of an Angular zone\r\n this.peakLevelListener(this.peakLevelInDb);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n stop() {\r\n this.worker?.terminate();\r\n }\r\n\r\n\r\n}\r\n","import {\r\n ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, OnDestroy, Output,\r\n ViewChild\r\n} from \"@angular/core\"\r\nimport {LevelInfo, LevelInfos, LevelListener} from \"../audio/dsp/level_measure\";\r\nimport {LevelBar} from \"../audio/ui/livelevel\";\r\nimport {Action} from \"../action/action\";\r\n\r\n\r\nexport const MIN_DB_LEVEL = -40.0;\r\nexport const DEFAULT_WARN_DB_LEVEL = -2;\r\n\r\n@Component({\r\n selector: 'spr-recordingitemcontrols',\r\n template: `\r\n <button matTooltip=\"Start playback\" (click)=\"playStartAction?.perform()\"\r\n [disabled]=\"playStartAction?.disabled\"\r\n [style.color]=\"playStartAction?.disabled ? 'grey' : 'green'\">\r\n <mat-icon>play_arrow</mat-icon>\r\n </button>\r\n <button matTooltip=\"Stop playback\" (click)=\"playStopAction?.perform()\"\r\n [disabled]=\"playStopAction?.disabled\"\r\n [style.color]=\"playStopAction?.disabled ? 'grey' : 'yellow'\">\r\n <mat-icon>stop</mat-icon>\r\n </button>\r\n <button fxHide.xs matTooltip=\"Toggle detailed audio display\" [disabled]=\"!audioLoaded\"\r\n (click)=\"showRecordingDetails()\">\r\n <mat-icon>{{(audioSignalCollapsed) ? \"expand_less\" : \"expand_more\"}}</mat-icon>\r\n </button>\r\n <button matTooltip=\"Download current recording\" *ngIf=\"enableDownload\" [disabled]=\"!audioLoaded\"\r\n (click)=\"downloadRecording()\">\r\n <mat-icon>file_download</mat-icon>\r\n </button>\r\n <div style=\"min-width: 14ch;padding:2px\"><table style=\"border-style: none\"><tr><td>Peak:</td><td><span matTooltip=\"Peak level\"\r\n [style.color]=\"(peakDbLvl > warnDbLevel)?'red':'black'\">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr>\r\n <tr *ngIf=\"_agc\"><td>AGC:</td><td><span matTooltip=\"Auto gain control\">{{agcString}}</span></td></tr></table></div>\r\n `,\r\n styles: [`:host {\r\n flex: 0; /* only required vertical space */\r\n width: 100%;\r\n background: darkgray;\r\n padding: 4px;\r\n box-sizing: border-box;\r\n height: 100%;\r\n\r\n display: flex; /* flex container: left level bar, right decimal peak level value */\r\n flex-direction: row;\r\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\r\n }`, `span {\r\n flex: 0;\r\n font-weight: bold;\r\n display: inline-block;\r\n white-space: nowrap;\r\n box-sizing: border-box;\r\n }`,`\r\n button {\r\n touch-action: manipulation;\r\n }`]\r\n\r\n})\r\nexport class RecordingItemControls implements OnDestroy {\r\n\r\n ce: HTMLDivElement|null=null;\r\n @Input() audioSignalCollapsed: boolean=true;\r\n private _displayAudioBuffer: AudioBuffer | null|undefined;\r\n @Input() enableDownload: boolean=false;\r\n\r\n @Input() peakDbLvl = MIN_DB_LEVEL;\r\n\r\n _displayLevelInfos: LevelInfos | null=null;\r\n\r\n _agc:boolean|null|undefined=undefined;\r\n agcString='n/a';\r\n\r\n @Input() set agc(agc:boolean|null|undefined){\r\n this._agc=agc;\r\n if(this._agc===undefined || this._agc===null){\r\n this.agcString='n/a';\r\n }else{\r\n if(this._agc===true){\r\n this.agcString='On';\r\n }else{\r\n this.agcString='Off';\r\n }\r\n }\r\n }\r\n\r\n @Output() onShowRecordingDetails: EventEmitter<void> = new EventEmitter<void>();\r\n @Output() onDownloadRecording: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n @Input() audioLoaded=false;\r\n //@Input() controlAudioPlayer: AudioPlayer;\r\n @Input() playStartAction:Action<void>|undefined;\r\n @Input() playStopAction:Action<void>|undefined;\r\n playStartEnabled = false;\r\n playStopEnabled = false;\r\n private updateTimerId: number|null=null;\r\n\r\n private destroyed = false;\r\n\r\n warnDbLevel = DEFAULT_WARN_DB_LEVEL;\r\n\r\n constructor(private ref: ElementRef, private changeDetectorRef: ChangeDetectorRef) {\r\n\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroyed = true;\r\n }\r\n\r\n showRecordingDetails() {\r\n this.onShowRecordingDetails.emit();\r\n }\r\n\r\n downloadRecording() {\r\n this.onDownloadRecording.emit();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.ce = this.ref.nativeElement;\r\n }\r\n\r\n @Input()\r\n set displayLevelInfos(levelInfos: LevelInfos | null) {\r\n this._displayLevelInfos = levelInfos;\r\n }\r\n\r\n error() {\r\n // this.status = 'ERROR';\r\n }\r\n\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'spr-recordingitemdisplay',\r\n template: `\r\n <div fxLayout=\"row\" fxLayout.xs=\"column\" [ngStyle]=\"{'height.px':100,'min-height.px': 100}\" [ngStyle.xs]=\"{'height.px':125,'min-height.px': 125}\">\r\n <audio-levelbar fxFlex=\"1 0 1\" [streamingMode]=\"streamingMode\" [displayLevelInfos]=\"_displayLevelInfos\"></audio-levelbar>\r\n <spr-recordingitemcontrols fxFlex=\"0 0 0\" [audioLoaded]=\"displayAudioBuffer!==null\" [playStartAction]=\"playStartAction\" [playStopAction]=\"playStopAction\" [peakDbLvl]=\"peakDbLvl\" [agc]=\"_agc\" (onShowRecordingDetails)=\"onShowRecordingDetails.emit()\"></spr-recordingitemcontrols>\r\n </div>\r\n `,\r\n styles: [`div {\r\n width: 100%;\r\n background: darkgray;\r\n padding: 4px;\r\n box-sizing: border-box;\r\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\r\n }`, `audio-levelbar {\r\n box-sizing: border-box;\r\n }`]\r\n\r\n})\r\nexport class RecordingItemDisplay implements LevelListener, OnDestroy {\r\n\r\n ce: HTMLDivElement|null=null;\r\n @ViewChild(LevelBar, { static: true }) liveLevel!: LevelBar;\r\n @Input() streamingMode: boolean=false;\r\n @Input() audioSignalCollapsed: boolean=true;\r\n private _displayAudioBuffer: AudioBuffer | null|undefined;\r\n @Input() enableDownload: boolean=false;\r\n\r\n peakDbLvl = MIN_DB_LEVEL;\r\n\r\n _displayLevelInfos: LevelInfos | null=null;\r\n\r\n _agc:boolean|null|undefined=undefined;\r\n agcString='n/a';\r\n\r\n @Input() set agc(agc:boolean|null|undefined){\r\n this._agc=agc;\r\n }\r\n\r\n @Output() onShowRecordingDetails: EventEmitter<void> = new EventEmitter<void>();\r\n @Output() onDownloadRecording: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n //@Input() controlAudioPlayer: AudioPlayer;\r\n @Input() playStartAction:Action<void>|undefined;\r\n @Input() playStopAction:Action<void>|undefined;\r\n playStartEnabled = false;\r\n playStopEnabled = false;\r\n private updateTimerId: number|null=null;\r\n\r\n private destroyed = false;\r\n\r\n warnDbLevel = DEFAULT_WARN_DB_LEVEL;\r\n\r\n constructor(private ref: ElementRef, private changeDetectorRef: ChangeDetectorRef) {\r\n\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroyed = true;\r\n }\r\n\r\n\r\n @Input()\r\n set displayAudioBuffer(displayAudioBuffer: AudioBuffer | null| undefined) {\r\n this._displayAudioBuffer = displayAudioBuffer;\r\n }\r\n\r\n get displayAudioBuffer() {\r\n return this._displayAudioBuffer;\r\n }\r\n\r\n showRecordingDetails() {\r\n this.onShowRecordingDetails.emit();\r\n }\r\n\r\n downloadRecording() {\r\n this.onDownloadRecording.emit();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.ce = this.ref.nativeElement;\r\n //this.controlAudioPlayer.listener=this;\r\n }\r\n\r\n @Input()\r\n set displayLevelInfos(levelInfos: LevelInfos | null) {\r\n this._displayLevelInfos = levelInfos;\r\n }\r\n\r\n set channelCount(channelCount: number) {\r\n this.reset();\r\n this.liveLevel.channelCount = channelCount;\r\n }\r\n\r\n set playFramePosition(playFramePosition: number) {\r\n this.liveLevel.playFramePosition=playFramePosition;\r\n }\r\n\r\n update(levelInfo: LevelInfo, peakLevelInfo: LevelInfo) {\r\n let peakDBVal = levelInfo.powerLevelDB();\r\n if (this.peakDbLvl < peakDBVal) {\r\n this.peakDbLvl = peakDBVal;\r\n // the event comes from outside of an Angular zone\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n this.liveLevel.update(levelInfo);\r\n }\r\n\r\n error() {\r\n // this.status = 'ERROR';\r\n }\r\n\r\n streamFinished() {\r\n this.liveLevel.streamFinished();\r\n }\r\n\r\n reset() {\r\n this.peakDbLvl = MIN_DB_LEVEL;\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n\r\n}\r\n","import {TransportActions} from \"./controlpanel\";\r\nimport {Browser, UserAgent, UserAgentBuilder} from \"../../utils/ua-parser\";\r\nimport {MatDialog} from \"@angular/material/dialog\";\r\nimport {MessageDialog} from \"../../ui/message_dialog\";\r\nimport {Session} from \"./session\";\r\nimport {SessionService} from \"./session.service\";\r\nimport {AudioCapture} from \"../../audio/capture/capture\";\r\nimport {AudioDevice, AutoGainControlConfig} from \"../project/project\";\r\nimport {LevelInfos, LevelMeasure, StreamLevelMeasure} from \"../../audio/dsp/level_measure\";\r\nimport {AudioPlayer} from \"../../audio/playback/player\";\r\nimport {Subscription} from \"rxjs\";\r\nimport {AudioClip} from \"../../audio/persistor\";\r\nimport {Action} from \"../../action/action\";\r\nimport {MIN_DB_LEVEL} from \"../../ui/recordingitem_display\";\r\n\r\nexport const FORCE_REQUEST_AUDIO_PERMISSIONS=false;\r\nexport const RECFILE_API_CTX = 'recfile';\r\nexport const MAX_RECORDING_TIME_MS = 1000 * 60 * 60 * 60; // 1 hour\r\n\r\nexport const LEVEL_BAR_INTERVALL_SECONDS = 0.1; // 100ms\r\n\r\nexport class BasicRecorder {\r\n protected userAgent:UserAgent;\r\n statusMsg: string='';\r\n statusAlertType!: string;\r\n statusWaiting: boolean=false;\r\n readonly=false;\r\n processingRecording=false;\r\n ac: AudioCapture|null=null;\r\n // Property audioDevices from project config: list of names of allowed audio devices.\r\n protected _audioDevices: Array<AudioDevice> | null| undefined;\r\n protected _selectedDeviceId:string|undefined=undefined;\r\n protected selCaptureDeviceId: ConstrainDOMString | null;\r\n protected _channelCount = 2;\r\n protected _autoGainControlConfigs: Array<AutoGainControlConfig> | null| undefined;\r\n\r\n _session: Session|null=null;\r\n\r\n transportActions: TransportActions;\r\n playStartAction: Action<void>;\r\n\r\n uploadProgress: number = 100;\r\n uploadStatus: string = 'ok'\r\n audioSignalCollapsed = true;\r\n\r\n protected streamLevelMeasure: StreamLevelMeasure;\r\n protected levelMeasure: LevelMeasure;\r\n peakLevelInDb:number=MIN_DB_LEVEL;\r\n displayLevelInfos: LevelInfos | null=null;\r\n protected _controlAudioPlayer!: AudioPlayer;\r\n displayAudioClip: AudioClip | null=null;\r\n protected audioFetchSubscription:Subscription|null=null;\r\n\r\n protected destroyed=false;\r\n\r\n protected navigationDisabled=true;\r\n\r\n constructor( public dialog: MatDialog,protected sessionService:SessionService) {\r\n this.userAgent=UserAgentBuilder.userAgent();\r\n console.debug(\"Detected platform: \"+this.userAgent.detectedPlatform);\r\n console.debug(\"Detected browser: \"+this.userAgent.detectedBrowser);\r\n this.transportActions = new TransportActions();\r\n this.playStartAction = new Action('Play');\r\n this.levelMeasure = new LevelMeasure();\r\n this.streamLevelMeasure = new StreamLevelMeasure();\r\n this.selCaptureDeviceId = null;\r\n }\r\n\r\n set audioDevices(audioDevices: Array<AudioDevice> | null | undefined) {\r\n this._audioDevices = audioDevices;\r\n }\r\n\r\n set autoGainControlConfigs(autoGainControlConfigs: Array<AutoGainControlConfig>|null|undefined){\r\n this._autoGainControlConfigs=autoGainControlConfigs;\r\n }\r\n\r\n set channelCount(channelCount: number) {\r\n this._channelCount = channelCount;\r\n }\r\n\r\n set session(session: Session|null) {\r\n this._session = session;\r\n }\r\n\r\n get session():Session|null{\r\n return this._session;\r\n }\r\n\r\n enableStartUserGesture() {\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Ready.';\r\n }\r\n\r\n start() {\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Starting session...';\r\n this.statusWaiting=false;\r\n if(this._session) {\r\n if (this._session.sealed) {\r\n this.readonly = true\r\n this.statusMsg = 'Session sealed!';\r\n //let dialogRef = this.dialog.open(SessionSealedDialog, {});\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: \"This session is sealed. Recordings cannot be added anymore.\",\r\n advise: 'Please ask your experimenter what to do (e.g start a new session).',\r\n }\r\n });\r\n } else {\r\n let body: any = {};\r\n if (this._session.status === \"CREATED\") {\r\n this._session.status = \"LOADED\";\r\n body.status = this._session.status;\r\n if (!this._session.loadedDate) {\r\n this._session.loadedDate = new Date();\r\n body.loadedDate = this._session.loadedDate;\r\n }\r\n } else {\r\n this._session.restartedDate = new Date();\r\n body.restartedDate = this._session.restartedDate;\r\n }\r\n this.sessionService.patchSessionObserver(this._session, body).subscribe()\r\n }\r\n }\r\n\r\n // Check browser compatibility\r\n if(this.userAgent.detectedBrowser===Browser.Safari && this._channelCount>1){\r\n let eMsg=\"Error: Safari browser does not support stereo recordings.\";\r\n console.error(eMsg);\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Browser not supported',\r\n msg: eMsg,\r\n advice: \"Please use a supported browser, e.g. Mozilla Firefox.\"\r\n }\r\n })\r\n }\r\n\r\n //console.log(\"Session ID: \"+this._session.session+ \" status: \"+this._session.status)\r\n this._selectedDeviceId=undefined;\r\n\r\n if (!this.readonly && this.ac && (FORCE_REQUEST_AUDIO_PERMISSIONS || (this._audioDevices && this._audioDevices.length > 0))) {\r\n this.statusMsg = 'Requesting audio permissions...';\r\n this.statusAlertType = 'info';\r\n\r\n this.ac.deviceInfos((mdis) => {\r\n let audioCaptureDeviceAvail: boolean = false;\r\n let audioPlayDeviceAvail: boolean = false;\r\n if (mdis) {\r\n if(this.ac) {\r\n this.ac.printDevices(mdis);\r\n }\r\n if (mdis.length > 0) {\r\n for (let mdii = 0; mdii < mdis.length; mdii++) {\r\n let mdi = mdis[mdii];\r\n let kind=mdi.kind;\r\n if(kind === \"audioinput\"){\r\n audioCaptureDeviceAvail=true;\r\n }else if(kind=== \"audiooutput\"){\r\n audioPlayDeviceAvail=true;\r\n }\r\n }\r\n }\r\n\r\n if (this._session && this._session.type !== 'TEST_DEF_A' && this._audioDevices && this._audioDevices.length > 0) {\r\n let fdi: MediaDeviceInfo | null = null;\r\n for (let adI = 0; adI < this._audioDevices.length; adI++) {\r\n let ad = this._audioDevices[adI];\r\n if (ad.playback) {\r\n // project audio device config for playback device\r\n // not used for now\r\n continue;\r\n }\r\n for (let mdii = 0; mdii < mdis.length; mdii++) {\r\n let mdi = mdis[mdii];\r\n let kind=mdi.kind;\r\n if(kind === \"audioinput\"){\r\n audioCaptureDeviceAvail=true;\r\n }else if(kind=== \"audiooutput\"){\r\n audioPlayDeviceAvail=true;\r\n }\r\n if (ad.regex) {\r\n //console.log(\"Match?: \\'\"+mdi.label+\"\\' \\'\"+ad.name+\"\\'\");\r\n if (mdi.label.match(ad.name)) {\r\n fdi = mdi;\r\n //console.log(\"Match!\");\r\n }\r\n } else {\r\n if (mdi.label.trim() === ad.name.trim()) {\r\n fdi = mdi;\r\n }\r\n }\r\n if (fdi) {\r\n break;\r\n }\r\n }\r\n if (fdi) {\r\n break;\r\n }\r\n }\r\n\r\n if (fdi) {\r\n // matching device found\r\n\r\n // Not able to open device here since Chrome 71\r\n // Chrome 71 requires a user gesture before the AudioContext can be resumed\r\n // sessionmanager.ts:712 Open session with default audio device for 1 channels\r\n // capture.ts:128 The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu\r\n // push../projects/speechrecorderng/src/lib/audio/capture/capture.ts.AudioCapture.open @ capture.ts:128\r\n\r\n //this.ac.open(this._channelCount, fdi.deviceId);\r\n console.info(\"Set selected audio device: \\'\" + fdi.label + \"\\' Id: \\'\" + fdi.deviceId + \"\\'\");\r\n this._selectedDeviceId = fdi.deviceId;\r\n\r\n this.enableStartUserGesture()\r\n } else {\r\n // device not found\r\n this.statusMsg = 'ERROR: Required audio device not available!';\r\n this.statusAlertType = 'error';\r\n this.readonly = true;\r\n\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Required audio device',\r\n msg: \"Required audio device not found\",\r\n advice: \"Please connect a suitable audio device for this project and retry (press the browser reload button).\"\r\n }\r\n })\r\n }\r\n }else{\r\n if(!audioCaptureDeviceAvail && !audioPlayDeviceAvail){\r\n // no device found\r\n this.statusMsg = 'ERROR: No audio device available!';\r\n this.statusAlertType = 'warn';\r\n //this.readonly = true;\r\n\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'warn',\r\n title: 'No audio device',\r\n msg: \"No audio device found\",\r\n advice: \"Please connect an audio device and retry (press the browser reload button) or try to continue anyway.\"\r\n }\r\n })\r\n }else {\r\n if (!this.readonly && !audioCaptureDeviceAvail) {\r\n // no device found\r\n this.statusMsg = 'WARNING: No audio capture device available!';\r\n this.statusAlertType = 'warning';\r\n //this.readonly = true;\r\n\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'warning',\r\n title: 'No audio capture device',\r\n msg: \"No audio capture device found\",\r\n advice: \"Please connect an audio capture device and retry (press the browser reload button) or try to continue anyway.\"\r\n }\r\n })\r\n }\r\n // Safari does not list playback devices\r\n if (!audioPlayDeviceAvail) {\r\n // Firefox does not enumerate audiooutput devices\r\n // Do not show this warning, because it would always appear on Firefox\r\n // When https://bugzilla.mozilla.org/show_bug.cgi?id=1498512 is fixed the warning can be enabled for Firefox as well\r\n\r\n // It is already implemneted but kept behind a preference setting https://bugzilla.mozilla.org/show_bug.cgi?id=1152401\r\n\r\n\r\n // Output devices are listed if about:config media.setsinkid.enabled=true\r\n // but default setting is false\r\n\r\n\r\n // Same problem with Safari\r\n\r\n if (!(this.userAgent.detectedBrowser===Browser.Safari || this.userAgent.detectedBrowser===Browser.Firefox)) {\r\n // no device found\r\n this.statusMsg = 'WARNING: No audio playback device available!';\r\n this.statusAlertType = 'warn';\r\n //this.readonly = true;\r\n\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'warn',\r\n title: 'No audio playback device',\r\n msg: \"No audio playback device found\",\r\n advice: \"Please connect an audio playback device and retry (press the browser reload button) or try to continue anyway.\"\r\n }\r\n })\r\n }\r\n }\r\n }\r\n\r\n // Not able to open device here since Chrome 71\r\n // Chrome 71 requires a user gesture before the AudioContext can be resumed\r\n // sessionmanager.ts:712 Open session with default audio device for 1 channels\r\n // capture.ts:128 The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu\r\n // push../projects/speechrecorderng/src/lib/audio/capture/capture.ts.AudioCapture.open @ capture.ts:128\r\n //console.log(\"Open session with default audio device for \"+this._channelCount+\" channels\");\r\n //this.ac.open(this._channelCount);\r\n\r\n // enable start gesture anyway\r\n this.enableStartUserGesture()\r\n }\r\n }\r\n\r\n });\r\n }\r\n }\r\n\r\n closed() {\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Session closed.';\r\n }\r\n\r\n error(msg='An unknown error occured during recording.',advice:string='Please retry.') {\r\n this.statusMsg = 'ERROR: Recording.';\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Recording error',\r\n msg: msg,\r\n advice: advice\r\n }\r\n });\r\n }\r\n\r\n}\r\n","/**\r\n * Created by klausj on 17.06.2017.\r\n */\r\nimport {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient, HttpErrorResponse, HttpHeaders, HttpResponse} from \"@angular/common/http\";\r\nimport {ApiType, SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\n\r\nimport {UUID} from \"../../utils/utils\";\r\nimport {SprRecordingFile, RecordingFileDescriptorImpl, RecordingFile} from \"../recording\";\r\nimport {ProjectService} from \"../project/project.service\";\r\nimport {SessionService} from \"../session/session.service\";\r\nimport {Observable} from \"rxjs\";\r\n\r\n\r\nexport const REC_API_CTX='recfile'\r\n\r\n\r\n\r\n@Injectable()\r\nexport class RecordingService {\r\n\r\n public static readonly REC_API_CTX = 'recfile'\r\n public static readonly RECORDING_API_CTX='recordingfile'\r\n private apiEndPoint: string;\r\n private withCredentials: boolean = false;\r\n\r\n //private debugDelay:number=10000;\r\n private debugDelay:number=0;\r\n\r\n constructor(private http: HttpClient, @Inject(SPEECHRECORDER_CONFIG) private config?: SpeechRecorderConfig) {\r\n\r\n this.apiEndPoint = ''\r\n\r\n if (config && config.apiEndPoint) {\r\n this.apiEndPoint = config.apiEndPoint;\r\n }\r\n if (this.apiEndPoint !== '') {\r\n this.apiEndPoint = this.apiEndPoint + '/'\r\n }\r\n if (config != null && config.withCredentials != null) {\r\n this.withCredentials = config.withCredentials;\r\n }\r\n }\r\n\r\n private recordingFilesUrl():string{\r\n let recFilesUrl = this.apiEndPoint + RecordingService.RECORDING_API_CTX;\r\n return recFilesUrl;\r\n }\r\n\r\n private sessionRecordingFilesUrl(projectName: string, sessId: string | number):string{\r\n let encPrjName=encodeURIComponent(projectName);\r\n let encSessId=encodeURIComponent(sessId);\r\n let recFilesUrl = this.apiEndPoint + ProjectService.PROJECT_API_CTX + '/' + encPrjName + '/' +\r\n SessionService.SESSION_API_CTX + '/' + encSessId + '/' + RecordingService.RECORDING_API_CTX;\r\n return recFilesUrl;\r\n }\r\n\r\n private sessionRecFilesUrl(projectName: string, sessId: string | number):string{\r\n let encPrjName=encodeURIComponent(projectName);\r\n let encSessId=encodeURIComponent(sessId);\r\n let recFilesUrl = this.apiEndPoint + ProjectService.PROJECT_API_CTX + '/' + encPrjName + '/' +\r\n SessionService.SESSION_API_CTX + '/' + encSessId + '/' + RecordingService.REC_API_CTX;\r\n return recFilesUrl;\r\n }\r\n\r\n private sessionRecFilesReqUrl(projectName: string, sessId: string | number):string{\r\n let recFilesUrl=this.sessionRecFilesUrl(projectName,sessId);\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n recFilesUrl = recFilesUrl + '.json?requestUUID=' + UUID.generate();\r\n }\r\n return recFilesUrl;\r\n }\r\n\r\n recordingFileDescrList(projectName: string, sessId: string | number):Observable<Array<RecordingFileDescriptorImpl>> {\r\n let recFilesReqUrl = this.sessionRecFilesReqUrl(projectName,sessId);\r\n let wobs = this.http.get<Array<RecordingFileDescriptorImpl>>(recFilesReqUrl,{withCredentials:this.withCredentials});\r\n return wobs;\r\n }\r\n\r\n recordingFileList(projectName: string, sessId: string | number):Observable<Array<RecordingFile>> {\r\n let recFilesReqUrl = this.sessionRecFilesReqUrl(projectName,sessId);\r\n let wobs = this.http.get<Array<RecordingFile>>(recFilesReqUrl,{withCredentials:this.withCredentials});\r\n return wobs;\r\n }\r\n\r\n sprRecordingFileList(projectName: string, sessId: string | number):Observable<Array<SprRecordingFile>> {\r\n let recFilesReqUrl = this.sessionRecFilesReqUrl(projectName,sessId);\r\n let wobs = this.http.get<Array<SprRecordingFile>>(recFilesReqUrl,{withCredentials:this.withCredentials});\r\n return wobs;\r\n }\r\n\r\n private audioRequest(audioUrl:string): Observable<HttpResponse<ArrayBuffer>> {\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();\r\n }\r\n let headers = new HttpHeaders();\r\n headers = headers.set('Accept', 'audio/wav');\r\n return this.http.get(audioUrl, {\r\n headers: headers,\r\n observe: 'response',\r\n responseType: 'arraybuffer',\r\n withCredentials: this.withCredentials\r\n });\r\n\r\n }\r\n\r\n private fetchAudiofile(projectName: string, sessId: string | number, recFileId: string|number): Observable<HttpResponse<ArrayBuffer>> {\r\n let recFilesUrl=this.sessionRecordingFilesUrl(projectName,sessId);\r\n let encRecFileId=encodeURIComponent(recFileId);\r\n let recUrl = recFilesUrl + '/' + encRecFileId;\r\n return this.audioRequest(recUrl);\r\n }\r\n\r\n private fetchSprAudiofile(projectName: string, sessId: string | number, itemcode: string,version:number): Observable<HttpResponse<ArrayBuffer>> {\r\n let recFilesUrl=this.sessionRecFilesUrl(projectName,sessId);\r\n let encItemcode=encodeURIComponent(itemcode);\r\n let recUrl = recFilesUrl + '/' + encItemcode +'/'+version;\r\n return this.audioRequest(recUrl);\r\n }\r\n\r\n fetchAndApplyRecordingFile(aCtx: AudioContext, projectName: string, recordingFile:RecordingFile):Observable<RecordingFile|null> {\r\n\r\n let wobs = new Observable<RecordingFile|null>(observer=>{\r\n if(recordingFile.session && recordingFile.recordingFileId) {\r\n let obs = this.fetchAudiofile(projectName, recordingFile.session, recordingFile.recordingFileId);\r\n obs.subscribe(resp => {\r\n //console.log(\"Fetched audio file. HTTP response status: \"+resp.status+\", type: \"+resp.type+\", byte length: \"+ resp.body.byteLength);\r\n\r\n // Do not use Promise version, which does not work with Safari 13 (13.0.5)\r\n if (resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n recordingFile.audioBuffer = ab;\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }\r\n }, error => {\r\n observer.error(error);\r\n observer.complete();\r\n })\r\n } else {\r\n observer.error('Fetching audio file: response has no body');\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n } else {\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n }else{\r\n observer.error();\r\n }\r\n });\r\n\r\n return wobs;\r\n }\r\n\r\n fetchAndApplySprRecordingFile(aCtx: AudioContext, projectName: string, recordingFile:SprRecordingFile):Observable<SprRecordingFile|null> {\r\n\r\n let wobs = new Observable<SprRecordingFile|null>(observer=>{\r\n if(recordingFile.session) {\r\n let obs = this.fetchSprAudiofile(projectName, recordingFile.session, recordingFile.itemCode, recordingFile.version);\r\n obs.subscribe(resp => {\r\n //console.log(\"Fetched audio file. HTTP response status: \"+resp.status+\", type: \"+resp.type+\", byte length: \"+ resp.body.byteLength);\r\n\r\n // Do not use Promise version, which does not work with Safari 13 (13.0.5)\r\n if (resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n recordingFile.audioBuffer = ab;\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }\r\n }, error => {\r\n observer.error(error);\r\n observer.complete();\r\n })\r\n } else {\r\n observer.error('Fetching audio file: response has no body');\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n } else {\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n }else{\r\n observer.error();\r\n }\r\n });\r\n\r\n return wobs;\r\n }\r\n\r\n fetchRecordingFile(aCtx: AudioContext, projectName: string, sessId: string | number, itemcode: string,version:number):Observable<SprRecordingFile|null> {\r\n\r\n let wobs = new Observable<SprRecordingFile | null>(observer=>{\r\n let obs = this.fetchSprAudiofile(projectName, sessId, itemcode,version);\r\n\r\n\r\n obs.subscribe(resp => {\r\n // Do not use Promise version, which does not work with Safari 13\r\n if(resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n let rf = new SprRecordingFile(sessId, itemcode, version, ab);\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n\r\n observer.next(rf);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(rf);\r\n observer.complete();\r\n }\r\n });\r\n }else{\r\n observer.error();\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n }else{\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n });\r\n\r\n return wobs;\r\n }\r\n}\r\n\r\n\r\n\r\n","\nimport {Uploader} from \"../net/uploader\";\nimport {Inject, Injectable} from \"@angular/core\";\nimport {HttpClient} from \"@angular/common/http\";\nimport {SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../spr.config\";\n\n@Injectable()\n export class SpeechRecorderUploader extends Uploader{\n\n constructor(private httpClient:HttpClient,@Inject(SPEECHRECORDER_CONFIG) private config?:SpeechRecorderConfig){\n super(httpClient,(config)?config.withCredentials:false);\n }\n}\n","import {Component, Input} from \"@angular/core\";\r\nimport {SessionService} from \"./session.service\";\r\n\r\n@Component({\r\n\r\n selector: 'app-warningbar',\r\n providers: [SessionService],\r\n template: `\r\n <div [class]=\"displayClass\">{{warningText}}</div>\r\n\r\n `,\r\n styles: [`:host {\r\n\r\n flex: 0 0 content;\r\n background: orange;\r\n\r\n }`,`\r\n .off {\r\n display: none;\r\n }\r\n `,`\r\n .on {\r\n padding: 2px;\r\n display: inline-block;\r\n width: 100%;\r\n font-weight: bold;\r\n font-size: larger;\r\n text-align: center;\r\n }\r\n ` ]\r\n})\r\nexport class WarningBar {\r\n @Input() warningText!:string;\r\n @Input() set show(show:boolean){\r\n if(show){\r\n this.displayClass='on'\r\n }else{\r\n this.displayClass='off'\r\n }\r\n }\r\n displayClass:string='off';\r\n}\r\n","import {AudioCapture, AudioCaptureListener} from '../../audio/capture/capture';\r\nimport {AudioPlayer, AudioPlayerEvent, EventType} from '../../audio/playback/player'\r\nimport {WavWriter} from '../../audio/impl/wavwriter'\r\nimport {Group, PromptItem, PromptitemUtil, Script, Section} from '../script/script';\r\nimport {SprRecordingFile, RecordingFileDescriptorImpl} from '../recording'\r\nimport {Upload} from '../../net/uploader';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Renderer2,\r\n ViewChild\r\n} from \"@angular/core\";\r\nimport {SessionService} from \"./session.service\";\r\nimport {State as StartStopSignalState} from \"../startstopsignal/startstopsignal\";\r\nimport {MatDialog} from \"@angular/material/dialog\";\r\nimport {SpeechRecorderUploader} from \"../spruploader\";\r\nimport {SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\nimport {Prompting} from \"./prompting\";\r\nimport {SequenceAudioFloat32ChunkerOutStream} from \"../../audio/io/stream\";\r\nimport {SessionFinishedDialog} from \"./session_finished_dialog\";\r\nimport {MessageDialog} from \"../../ui/message_dialog\";\r\nimport {RecordingService} from \"../recordings/recordings.service\";\r\nimport {AudioContextProvider} from \"../../audio/context\";\r\nimport {AudioClip} from \"../../audio/persistor\";\r\nimport {Item} from \"./item\";\r\nimport {LevelBar} from \"../../audio/ui/livelevel\";\r\nimport {BasicRecorder, LEVEL_BAR_INTERVALL_SECONDS, MAX_RECORDING_TIME_MS, RECFILE_API_CTX} from \"./basicrecorder\";\r\n\r\nconst DEFAULT_PRE_REC_DELAY=1000;\r\nconst DEFAULT_POST_REC_DELAY=500;\r\n\r\nexport const enum Status {\r\n BLOCKED, IDLE, PRE_RECORDING, RECORDING, POST_REC_STOP, POST_REC_PAUSE, STOPPING_STOP, STOPPING_PAUSE, ERROR\r\n}\r\n\r\n@Component({\r\n selector: 'app-sprrecordingsession',\r\n providers: [SessionService],\r\n template: `\r\n <app-warningbar [show]=\"isTestSession()\" warningText=\"Test recording only!\"></app-warningbar>\r\n <app-warningbar [show]=\"isDefaultAudioTestSession()\" warningText=\"This test uses default audio device! Regular sessions may require a particular audio device (microphone)!\"></app-warningbar>\r\n <app-sprprompting [projectName]=\"projectName\"\r\n [startStopSignalState]=\"startStopSignalState\" [promptItem]=\"promptItem\" [showPrompt]=\"showPrompt\"\r\n [items]=\"items\"\r\n [transportActions]=\"transportActions\"\r\n [selectedItemIdx]=\"promptIndex\" (onItemSelect)=\"itemSelect($event)\" (onNextItem)=\"nextItem()\" (onPrevItem)=\"prevItem()\"\r\n [audioSignalCollapsed]=\"audioSignalCollapsed\" [displayAudioClip]=\"displayAudioClip\"\r\n [playStartAction]=\"controlAudioPlayer?.startAction\"\r\n [playSelectionAction]=\"controlAudioPlayer?.startSelectionAction\"\r\n [autoPlayOnSelectToggleAction]=\"controlAudioPlayer?.autoPlayOnSelectToggleAction\"\r\n [playStopAction]=\"controlAudioPlayer?.stopAction\">\r\n\r\n </app-sprprompting>\r\n <mat-progress-bar [value]=\"progressPercentValue()\" fxShow=\"false\" fxShow.xs=\"true\" ></mat-progress-bar>\r\n\r\n\r\n <div fxLayout=\"row\" fxLayout.xs=\"column\" [ngStyle]=\"{'height.px':100,'min-height.px': 100}\" [ngStyle.xs]=\"{'height.px':125,'min-height.px': 125}\">\r\n <audio-levelbar fxFlex=\"1 0 1\" [streamingMode]=\"isRecording()\" [displayLevelInfos]=\"displayLevelInfos\"></audio-levelbar>\r\n <div fxLayout=\"row\">\r\n <spr-recordingitemcontrols fxFlex=\"10 0 1\"\r\n [audioLoaded]=\"displayAudioClip?.buffer!==null\"\r\n [playStartAction]=\"controlAudioPlayer?.startAction\"\r\n [playStopAction]=\"controlAudioPlayer?.stopAction\"\r\n [peakDbLvl]=\"peakLevelInDb\"\r\n [agc]=\"this.ac?.agcStatus\"\r\n (onShowRecordingDetails)=\"audioSignalCollapsed=!audioSignalCollapsed\">\r\n </spr-recordingitemcontrols>\r\n <app-uploadstatus class=\"ricontrols dark\" fxHide fxShow.xs fxFlex=\"0 0 0\" *ngIf=\"enableUploadRecordings\" [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processingRecording\"></app-uploadstatus>\r\n <app-readystateindicator class=\"ricontrols dark\" fxHide fxShow.xs fxFlex=\"0 0 0\" [ready]=\"dataSaved && !isActive()\"></app-readystateindicator>\r\n </div>\r\n </div>\r\n <div #controlpanel class=\"controlpanel\" fxLayout=\"row\">\r\n <div fxFlex=\"1 1 30%\" fxLayoutAlign=\"start center\">\r\n <app-sprstatusdisplay fxHide.xs [statusMsg]=\"statusMsg\" [statusAlertType]=\"statusAlertType\" [statusWaiting]=\"statusWaiting\"></app-sprstatusdisplay>\r\n </div>\r\n <app-sprtransport fxFlex=\"10 0 30%\" fxLayoutAlign=\"center center\" [readonly]=\"readonly\" [actions]=\"transportActions\" [navigationEnabled]=\"items==null || items.length>1\"></app-sprtransport>\r\n <div fxFlex=\"1 1 30%\" fxLayoutAlign=\"end center\" fxLayout=\"row\">\r\n <app-uploadstatus class=\"ricontrols\" fxHide.xs fxLayoutAlign=\"end center\" *ngIf=\"enableUploadRecordings\" [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processingRecording\"></app-uploadstatus>\r\n <app-readystateindicator class=\"ricontrols\" fxLayoutAlign=\"end center\" fxHide.xs [ready]=\"dataSaved && !isActive()\"></app-readystateindicator>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`:host {\r\n flex: 2;\r\n background: lightgrey;\r\n display: flex; /* Vertical flex container: Bottom transport panel, above prompting panel */\r\n flex-direction: column;\r\n margin: 0;\r\n padding: 0;\r\n min-height: 0px;\r\n\r\n /* Prevents horizontal scroll bar on swipe right */\r\n overflow: hidden;\r\n }`,`.ricontrols {\r\n padding: 4px;\r\n box-sizing: border-box;\r\n height: 100%;\r\n }`,`.dark {\r\n background: darkgray;\r\n }`,`.controlpanel {\r\n align-content: center;\r\n align-items: center;\r\n margin: 0;\r\n padding: 20px;\r\n min-height: min-content; /* important */\r\n }`]\r\n})\r\nexport class SessionManager extends BasicRecorder implements AfterViewInit,OnDestroy, AudioCaptureListener {\r\n\r\n @Input() projectName:string|undefined;\r\n enableUploadRecordings: boolean = true;\r\n enableDownloadRecordings: boolean = false;\r\n status: Status = Status.BLOCKED;\r\n\r\n @ViewChild(Prompting, { static: true }) prompting!: Prompting;\r\n @ViewChild(LevelBar, { static: true }) liveLevelDisplay!: LevelBar;\r\n\r\n @Input() dataSaved=true\r\n\r\n startStopSignalState!: StartStopSignalState;\r\n\r\n private updateTimerId: any;\r\n private preRecTimerId: number|null=null;\r\n private preRecTimerRunning: boolean|null=null;\r\n private postDelay:number=DEFAULT_POST_REC_DELAY;\r\n private postRecTimerId: number|null=null;\r\n private postRecTimerRunning: boolean|null=null;\r\n private maxRecTimerId: number|null=null;\r\n private maxRecTimerRunning: boolean|null=null;\r\n\r\n dnlLnk!: HTMLAnchorElement;\r\n\r\n audio: any;\r\n _script!: Script;\r\n private _promptIndex=0;\r\n private section!: Section;\r\n group!: Group;\r\n promptItem!:PromptItem;\r\n showPrompt!: boolean;\r\n\r\n // index of current section\r\n sectIdx!: number;\r\n // index of current group in section\r\n groupIdxInSection!: number;\r\n // index of current prompt item in group\r\n promptItemIdxInGroup!: number;\r\n\r\n private autorecording!: boolean;\r\n\r\n items: Array<Item>|null=null;\r\n //selectedItemIdx: number;\r\n private _displayRecFile: SprRecordingFile | null=null;\r\n private displayRecFileVersion!: number;\r\n\r\n promptItemCount!: number;\r\n\r\n constructor(private changeDetectorRef: ChangeDetectorRef,\r\n private renderer: Renderer2,\r\n public dialog: MatDialog,\r\n protected sessionService:SessionService,\r\n private recFileService:RecordingService,\r\n private uploader: SpeechRecorderUploader,\r\n @Inject(SPEECHRECORDER_CONFIG) public config?: SpeechRecorderConfig) {\r\n super(dialog,sessionService);\r\n this.status = Status.IDLE;\r\n this.audio = document.getElementById('audio');\r\n if (this.config && this.config.enableUploadRecordings !== undefined) {\r\n this.enableUploadRecordings = this.config.enableUploadRecordings;\r\n }\r\n if (this.config && this.config.enableDownloadRecordings !== undefined) {\r\n this.enableDownloadRecordings = this.config.enableDownloadRecordings;\r\n }\r\n this.init();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.streamLevelMeasure.levelListener = this.liveLevelDisplay;\r\n this.streamLevelMeasure.peakLevelListener=(peakLvlInDb)=>{\r\n this.peakLevelInDb=peakLvlInDb;\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n }\r\n ngOnDestroy() {\r\n this.destroyed=true;\r\n // TODO stop capture /playback\r\n }\r\n\r\n private init() {\r\n this.sectIdx = 0;\r\n this.groupIdxInSection = 0;\r\n this.promptItemIdxInGroup = 0;\r\n this.autorecording = false;\r\n this.transportActions.startAction.disabled = true;\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n this.playStartAction.disabled = true;\r\n let context:AudioContext|null=null;\r\n try {\r\n context = AudioContextProvider.audioContextInstance()\r\n } catch (err) {\r\n this.status = Status.ERROR;\r\n let errMsg = 'Unknown error';\r\n if(err instanceof Error){\r\n errMsg=err.message;\r\n }\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n }\r\n if(context) {\r\n console.info(\"State of audio context: \" + context.state)\r\n }else{\r\n console.info(\"No audio context available!\");\r\n }\r\n if (!context || !navigator.mediaDevices) {\r\n this.status = Status.ERROR;\r\n let errMsg = 'Browser does not support Media streams!';\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n } else {\r\n this.ac = new AudioCapture(context);\r\n if (this.ac) {\r\n this.transportActions.startAction.onAction = () => this.startItem();\r\n this.ac.listener = this;\r\n this.ac.audioOutStream = new SequenceAudioFloat32ChunkerOutStream(this.streamLevelMeasure, LEVEL_BAR_INTERVALL_SECONDS);\r\n // Don't list the devices here. If we do not have audio permissions we only get anonymized devices without labels.\r\n //this.ac.listDevices();\r\n } else {\r\n this.transportActions.startAction.disabled = true;\r\n let errMsg = 'Browser does not support Media/Audio API!';\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n }\r\n this.transportActions.stopAction.onAction = () => this.stopItem();\r\n this.transportActions.nextAction.onAction = () => this.stopItem();\r\n this.transportActions.pauseAction.onAction = () => this.pauseItem();\r\n this.transportActions.fwdAction.onAction = () => this.nextItem();\r\n this.transportActions.fwdNextAction.onAction = () => this.nextUnrecordedItem();\r\n this.transportActions.bwdAction.onAction = () => this.prevItem();\r\n this.playStartAction.onAction = () => this.controlAudioPlayer.start();\r\n\r\n }\r\n\r\n this.startStopSignalState = StartStopSignalState.OFF;\r\n\r\n}\r\n\r\n @HostListener('window:keypress', ['$event'])\r\n onKeyPress(ke: KeyboardEvent) {\r\n if (ke.key == ' ') {\r\n this.transportActions.startAction.perform();\r\n this.transportActions.nextAction.perform();\r\n }\r\n }\r\n\r\n @HostListener('window:keydown', ['$event'])\r\n onKeyDown(ke: KeyboardEvent) {\r\n if (ke.key == ' ') {\r\n this.transportActions.stopAction.perform();\r\n }\r\n if (ke.key == 'p') {\r\n this.transportActions.pauseAction.perform();\r\n }\r\n\r\n if (ke.key == 'Escape') {\r\n if(!this.audioSignalCollapsed){\r\n this.audioSignalCollapsed=true;\r\n }\r\n this.transportActions.stopAction.perform();\r\n this.transportActions.pauseAction.perform();\r\n }\r\n\r\n if (ke.key == 'MediaPlayPause') {\r\n this.playStartAction.perform();\r\n }\r\n if (ke.key === 'ArrowRight') {\r\n this.transportActions.fwdAction.perform();\r\n }\r\n if (ke.key === 'ArrowLeft') {\r\n this.transportActions.bwdAction.perform();\r\n }\r\n }\r\n\r\n progressPercentValue():number {\r\n let v=100;\r\n if(this.items) {\r\n v=this.promptIndex * 100 / (this.items.length - 1);\r\n }\r\n return v;\r\n }\r\n isTestSession():boolean {\r\n return ((this._session!=null) && (this._session.type === 'TEST' || this._session.type==='TEST_DEF_A' || this._session.type === 'SINUS_TEST'));\r\n }\r\n\r\n isDefaultAudioTestSession():boolean {\r\n return ((this._session!=null) && (this._session.type==='TEST_DEF_A'));\r\n }\r\n\r\n isDefaultAudioTestSessionOverwriteingProjectRequirements():boolean {\r\n return ((this._session!=null) && (this._session.type==='TEST_DEF_A') && (this.audioDevices!=null) && this.audioDevices.length>0)\r\n }\r\n\r\n\r\n set controlAudioPlayer(controlAudioPlayer: AudioPlayer) {\r\n if (this._controlAudioPlayer) {\r\n //this._controlAudioPlayer.listener=null;\r\n }\r\n this._controlAudioPlayer = controlAudioPlayer;\r\n if (this._controlAudioPlayer) {\r\n this._controlAudioPlayer.listener = this;\r\n }\r\n }\r\n\r\n get controlAudioPlayer(): AudioPlayer {\r\n return this._controlAudioPlayer;\r\n }\r\n\r\n set script(script: any) {\r\n this._script = script;\r\n this.loadScript();\r\n }\r\n\r\n update(e: AudioPlayerEvent) {\r\n if (e.type == EventType.STARTED) {\r\n this.playStartAction.disabled = true;\r\n this.updateTimerId = window.setInterval(() => {\r\n //this.audioSignal.playFramePosition = this.ap.playPositionFrames;\r\n }, 50);\r\n } else if (e.type == EventType.STOPPED || e.type == EventType.ENDED) {\r\n window.clearInterval(this.updateTimerId);\r\n // this.audioSignal.playFramePosition = this.ap.playPositionFrames;\r\n this.playStartAction.disabled = (!(this.displayRecFile));\r\n\r\n }\r\n }\r\n\r\n get promptIndex():number{\r\n return this._promptIndex;\r\n }\r\n\r\n set promptIndex(promptIndex:number){\r\n if(promptIndex<0 || promptIndex>=this.promptItemCount){\r\n throw new Error(\"Prompt index out of range\")\r\n }\r\n let i = 0;\r\n let sections=this._script.sections;\r\n let found=false;\r\n for (let si = 0; si < sections.length && !found; si++) {\r\n let section = sections[si];\r\n let gs = section._shuffledGroups;\r\n for (let gi = 0; gi < gs.length; gi++) {\r\n let pis=gs[gi]._shuffledPromptItems;\r\n\r\n let pisSize = pis.length;\r\n if (promptIndex < i + pisSize) {\r\n this.sectIdx = si;\r\n this.groupIdxInSection=gi;\r\n this.promptItemIdxInGroup = promptIndex - i;\r\n found=true;\r\n break;\r\n } else {\r\n i += pisSize;\r\n }\r\n }\r\n }\r\n if(found){\r\n this._promptIndex=promptIndex;\r\n }else{\r\n throw new Error(\"Internal error: Prompt index not found\")\r\n }\r\n this.applyItem();\r\n }\r\n\r\n itemSelect(itemIdx: number) {\r\n if (this.status === Status.IDLE) {\r\n this.promptIndex=itemIdx;\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n startItem() {\r\n this.transportActions.startAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n if(this.readonly){\r\n return\r\n }\r\n this.transportActions.fwdAction.disabled = true\r\n this.transportActions.fwdNextAction.disabled = true\r\n this.transportActions.bwdAction.disabled = true\r\n this.displayRecFile = null;\r\n this.displayRecFileVersion = 0;\r\n this.displayAudioClip = null;\r\n this.showRecording();\r\n if (this.section.mode === 'AUTORECORDING') {\r\n this.autorecording = true;\r\n }\r\n\r\n if(this.ac!=null) {\r\n if (!this.ac.opened) {\r\n if (this._selectedDeviceId) {\r\n console.log(\"Open session with audio device Id: \\'\" + this._selectedDeviceId + \"\\' for \" + this._channelCount + \" channels\");\r\n } else {\r\n console.log(\"Open session with default audio device for \" + this._channelCount + \" channels\");\r\n }\r\n this.ac.open(this._channelCount, this._selectedDeviceId,this._autoGainControlConfigs);\r\n } else {\r\n this.ac.start();\r\n }\r\n }\r\n }\r\n\r\n\r\n private loadScript() {\r\n this.promptItemCount = 0;\r\n\r\n this.items = new Array<Item>();\r\n let ln = 0;\r\n\r\n //TODO randomize not supported\r\n for (let si = 0; si < this._script.sections.length; si++) {\r\n let section = this._script.sections[si];\r\n let gs = section._shuffledGroups;\r\n for(let gi=0;gi<gs.length;gi++) {\r\n\r\n let pis = gs[gi]._shuffledPromptItems;\r\n\r\n let pisLen = pis.length;\r\n this.promptItemCount += pisLen;\r\n for (let piSectIdx = 0; piSectIdx < pisLen; piSectIdx++) {\r\n let pi = pis[piSectIdx];\r\n let promptAsStr = PromptitemUtil.toPlainTextString(pi);\r\n\r\n let it = new Item(promptAsStr, section.training,(!pi.type || pi.type==='recording'));\r\n this.items.push(it);\r\n ln++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n promptIndexByItemcode(itemcode:string):number|null{\r\n let pix = 0;\r\n\r\n for (let si = 0; si < this._script.sections.length; si++) {\r\n let section = this._script.sections[si];\r\n let gs = section._shuffledGroups;\r\n for(let gi=0;gi<gs.length;gi++) {\r\n let pis=gs[gi]._shuffledPromptItems;\r\n let pisLen = pis.length;\r\n for (let piSectIdx = 0; piSectIdx < pisLen; piSectIdx++) {\r\n let pi = pis[piSectIdx];\r\n let ic=pi.itemcode;\r\n if(ic === itemcode){\r\n return pix;\r\n }\r\n pix++;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n clearPrompt() {\r\n //this.prompting.promptContainer.prompter.promptText='';\r\n //this.mediaitem = null;\r\n this.showPrompt = false;\r\n this.changeDetectorRef.detectChanges()\r\n }\r\n\r\n applyPrompt() {\r\n //this.prompting.promptContainer.prompter.promptText=this.promptUnit.mediaitems[0].text;\r\n //this.promptText = this.promptUnit.mediaitems[0].text;\r\n //this.mediaitem=this.promptUnit.mediaitems[0];\r\n this.showPrompt = true;\r\n this.changeDetectorRef.detectChanges()\r\n }\r\n\r\n downloadRecording() {\r\n if (this.displayRecFile) {\r\n let ab: AudioBuffer|null = this.displayRecFile.audioBuffer;\r\n let ww = new WavWriter();\r\n if(ab) {\r\n let wavFile = ww.writeAsync(ab, (wavFile) => {\r\n let blob = new Blob([wavFile], {type: 'audio/wav'});\r\n let rfUrl = URL.createObjectURL(blob);\r\n\r\n let dataDnlLnk = this.renderer.createElement('a');\r\n //dataDnlLnk.name = 'Recording';\r\n dataDnlLnk.href = rfUrl;\r\n\r\n this.renderer.appendChild(document.body, dataDnlLnk);\r\n\r\n // download property not yet in TS def\r\n if (this.displayRecFile) {\r\n let fn = this.displayRecFile.filenameString();\r\n fn += '_' + this.displayRecFileVersion;\r\n fn += '.wav';\r\n dataDnlLnk.download = fn;\r\n dataDnlLnk.click();\r\n }\r\n this.renderer.removeChild(document.body, dataDnlLnk);\r\n });\r\n }\r\n }\r\n }\r\n\r\n set displayRecFile(displayRecFile: SprRecordingFile | null) {\r\n this._displayRecFile = displayRecFile;\r\n if (this._displayRecFile) {\r\n let ab: AudioBuffer|null = this._displayRecFile.audioBuffer;\r\n if(ab) {\r\n this.displayAudioClip = new AudioClip(ab);\r\n this.controlAudioPlayer.audioClip = this.displayAudioClip;\r\n }else {\r\n // clear for now ...\r\n this.displayAudioClip = null;\r\n this.controlAudioPlayer.audioClip = null;\r\n if (this._controlAudioPlayer && this._session) {\r\n //... and try to fetch from server\r\n this.audioFetchSubscription = this.recFileService.fetchAndApplySprRecordingFile(this._controlAudioPlayer.context, this._session.project, this._displayRecFile).subscribe((rf) => {\r\n let fab = null;\r\n if (rf && this._displayRecFile) {\r\n fab = this._displayRecFile.audioBuffer;\r\n } else {\r\n this.statusMsg = 'Recording file could not be loaded.'\r\n this.statusAlertType = 'error'\r\n }\r\n if (fab){\r\n this.displayAudioClip = new AudioClip(fab);\r\n }\r\n this.controlAudioPlayer.audioClip =this.displayAudioClip\r\n this.showRecording();\r\n\r\n }, err => {\r\n console.error(\"Could not load recording file from server: \" + err)\r\n this.statusMsg = 'Recording file could not be loaded: ' + err\r\n this.statusAlertType = 'error'\r\n })\r\n }else{\r\n this.statusMsg = 'Recording file could not be decoded. Audio context unavailable.'\r\n this.statusAlertType = 'error'\r\n }\r\n }\r\n\r\n } else {\r\n this.displayAudioClip = null;\r\n this.controlAudioPlayer.audioClip = null;\r\n }\r\n }\r\n\r\n get displayRecFile(): SprRecordingFile | null {\r\n return this._displayRecFile;\r\n }\r\n\r\n showRecording() {\r\n this.controlAudioPlayer.stop();\r\n\r\n if (this.displayAudioClip) {\r\n\r\n this.levelMeasure.calcBufferLevelInfos(this.displayAudioClip.buffer, LEVEL_BAR_INTERVALL_SECONDS).then((levelInfos) => {\r\n this.displayLevelInfos = levelInfos;\r\n this.changeDetectorRef.detectChanges();\r\n });\r\n this.playStartAction.disabled = false;\r\n\r\n } else {\r\n\r\n // TODO\r\n // Setting to null does not trigger a change if it was null before (happens after nextitem() in AUTOPROGRESS mode)\r\n // The level bar display does not clear, it shows the last captured stream\r\n this.displayLevelInfos = null;\r\n\r\n this.playStartAction.disabled = true;\r\n\r\n // Collapse audio signal display if open\r\n if (!this.audioSignalCollapsed) {\r\n this.audioSignalCollapsed = true;\r\n }\r\n }\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n\r\n isRecordingItem():boolean{\r\n return(this.promptItem!=null && this.promptItem.type!=='nonrecording')\r\n }\r\n\r\n updateStartActionDisableState(){\r\n this.transportActions.startAction.disabled=!(this.ac && this.isRecordingItem());\r\n }\r\n\r\n applyItem(temporary=false) {\r\n\r\n this.section = this._script.sections[this.sectIdx]\r\n this.group = this.section._shuffledGroups[this.groupIdxInSection];\r\n this.promptItem = this.group._shuffledPromptItems[this.promptItemIdxInGroup];\r\n\r\n //this.selectedItemIdx = this.promptIndex;\r\n\r\n if(this.audioFetchSubscription){\r\n this.audioFetchSubscription.unsubscribe()\r\n }\r\n\r\n this.clearPrompt();\r\n\r\n let isNonrecording=(this.promptItem.type==='nonrecording')\r\n\r\n if (isNonrecording || !this.section.promptphase || this.section.promptphase === 'IDLE') {\r\n this.applyPrompt();\r\n }\r\n\r\n if(isNonrecording){\r\n this.startStopSignalState = StartStopSignalState.OFF;\r\n }else {\r\n if (this.items) {\r\n let it = this.items[this.promptIndex];\r\n if (!it.recs) {\r\n it.recs = new Array<SprRecordingFile>();\r\n }\r\n\r\n let recentRecFile: SprRecordingFile | null = null;\r\n let availRecfiles: number = it.recs.length;\r\n if (availRecfiles > 0) {\r\n let rfVers: number = availRecfiles - 1;\r\n recentRecFile = it.recs[rfVers];\r\n this.displayRecFile = recentRecFile;\r\n this.displayRecFileVersion = rfVers;\r\n\r\n } else {\r\n this.displayRecFile = null;\r\n this.displayRecFileVersion = 0;\r\n }\r\n }\r\n if (!temporary) {\r\n this.showRecording();\r\n }\r\n if(!this.readonly) {\r\n this.startStopSignalState = StartStopSignalState.IDLE;\r\n }\r\n }\r\n this.updateStartActionDisableState()\r\n this.updateNavigationActions()\r\n }\r\n\r\n\r\n start() {\r\n super.start();\r\n if(this.promptItemCount>0) {\r\n this.promptIndex = 0;\r\n }\r\n this.enableNavigation()\r\n }\r\n\r\n isRecording(): boolean {\r\n return (this.status === Status.PRE_RECORDING || this.status === Status.RECORDING);\r\n }\r\n\r\n isActive(): boolean{\r\n return (!(this.status === Status.BLOCKED || this.status=== Status.IDLE || this.status===Status.ERROR) || this.processingRecording || this.sessionService.uploadCount>0)\r\n }\r\n\r\n prevItem() {\r\n let newPrIdx=this._promptIndex;\r\n newPrIdx--;\r\n if(newPrIdx<0){\r\n newPrIdx=this.promptItemCount-1;\r\n }\r\n this.promptIndex=newPrIdx;\r\n //this.updateNavigationActions()\r\n }\r\n\r\n\r\n nextItem() {\r\n let newPrIdx=this._promptIndex;\r\n newPrIdx++;\r\n if(newPrIdx>=this.promptItemCount){\r\n newPrIdx=0;\r\n }\r\n this.promptIndex=newPrIdx;\r\n //this.updateNavigationActions();\r\n }\r\n\r\n private updateNavigationActions(){\r\n let fwdNxtActionDisabled=true;\r\n if(this.items){\r\n let currRecs=this.items[this._promptIndex].recs;\r\n fwdNxtActionDisabled= ! (currRecs!=null && currRecs.length>0);\r\n }\r\n this.transportActions.fwdNextAction.disabled = this.navigationDisabled || fwdNxtActionDisabled;\r\n this.transportActions.fwdAction.disabled = this.navigationDisabled;\r\n this.transportActions.bwdAction.disabled = this.navigationDisabled;\r\n }\r\n\r\n nextUnrecordedItem() {\r\n let newPrIdx = this._promptIndex;\r\n newPrIdx++;\r\n if (newPrIdx >= this.promptItemCount) {\r\n newPrIdx = 0;\r\n }\r\n if(this.items!=null) {\r\n let itRecs=this.items[newPrIdx].recs;\r\n while (itRecs!=null && (itRecs.length > 0) && newPrIdx < this.promptItemCount) {\r\n newPrIdx++;\r\n itRecs=this.items[newPrIdx].recs;\r\n }\r\n if (!itRecs || itRecs.length == 0) {\r\n this.promptIndex = newPrIdx;\r\n }\r\n }\r\n }\r\n\r\n enableStartUserGesture() {\r\n super.enableStartUserGesture();\r\n this.transportActions.startAction.disabled=!(this.ac && this.isRecordingItem());\r\n }\r\n\r\n enableNavigation(){\r\n this.navigationDisabled=false;\r\n this.updateNavigationActions();\r\n }\r\n\r\n opened() {\r\n if(this.ac) {\r\n this.ac.start();\r\n }\r\n }\r\n\r\n started() {\r\n this.status = Status.PRE_RECORDING;\r\n this.transportActions.startAction.disabled = true;\r\n this.startStopSignalState = StartStopSignalState.PRERECORDING;\r\n if(this._session) {\r\n if (this._session.status === \"LOADED\") {\r\n let body: any = {};\r\n if (this.section.training) {\r\n this._session.status = \"STARTED_TRAINING\"\r\n body.status = this._session.status;\r\n if (!this._session.startedTrainingDate) {\r\n this._session.startedTrainingDate = new Date();\r\n body.startedTrainingDate = this._session.startedTrainingDate;\r\n }\r\n } else {\r\n this._session.status = \"STARTED\"\r\n body.status = this._session.status;\r\n if (!this._session.startedDate) {\r\n this._session.startedDate = new Date();\r\n body.startedDate = this._session.startedDate;\r\n }\r\n }\r\n this.sessionService.patchSessionObserver(this._session, body).subscribe()\r\n }\r\n }\r\n if (this.section.promptphase === 'PRERECORDING' || this.section.promptphase === 'PRERECORDINGONLY') {\r\n this.applyPrompt();\r\n }\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Recording...';\r\n\r\n let preDelay = DEFAULT_PRE_REC_DELAY;\r\n if (this.promptItem.prerecdelay!=null) {\r\n preDelay = this.promptItem.prerecdelay;\r\n }else if (this.promptItem.prerecording!=null) {\r\n preDelay = this.promptItem.prerecording;\r\n }\r\n\r\n this.postDelay=DEFAULT_POST_REC_DELAY;\r\n if(this.promptItem.postrecdelay!=null){\r\n this.postDelay=this.promptItem.postrecdelay;\r\n }else if(this.promptItem.postrecording!=null){\r\n this.postDelay=this.promptItem.postrecording;\r\n }\r\n\r\n let maxRecordingTimeMs = MAX_RECORDING_TIME_MS;\r\n if (this.promptItem.recduration!==null && this.promptItem.recduration!==undefined) {\r\n maxRecordingTimeMs = preDelay+this.promptItem.recduration+this.postDelay;\r\n }\r\n this.maxRecTimerId = window.setTimeout(() => {\r\n this.stopRecordingMaxRec()\r\n }, maxRecordingTimeMs);\r\n this.maxRecTimerRunning = true;\r\n\r\n\r\n\r\n this.preRecTimerId = window.setTimeout(() => {\r\n\r\n this.preRecTimerRunning = false;\r\n this.status = Status.RECORDING;\r\n this.startStopSignalState = StartStopSignalState.RECORDING;\r\n if (this.section.mode === 'AUTORECORDING') {\r\n this.transportActions.nextAction.disabled = false;\r\n this.transportActions.pauseAction.disabled = false;\r\n } else {\r\n this.transportActions.stopAction.disabled = false;\r\n }\r\n if (this.section.promptphase === 'RECORDING') {\r\n this.applyPrompt();\r\n }\r\n if (this.section.promptphase === 'PRERECORDINGONLY'){\r\n this.clearPrompt();\r\n }\r\n\r\n }, preDelay);\r\n this.preRecTimerRunning = true;\r\n }\r\n\r\n stopItem() {\r\n this.status = Status.POST_REC_STOP;\r\n this.startStopSignalState = StartStopSignalState.POSTRECORDING;\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n\r\n this.postRecTimerId = window.setTimeout(() => {\r\n this.postRecTimerRunning = false;\r\n this.status = Status.STOPPING_STOP;\r\n this.stopRecording();\r\n }, this.postDelay);\r\n this.postRecTimerRunning = true;\r\n }\r\n\r\n pauseItem() {\r\n this.status = Status.POST_REC_PAUSE;\r\n this.transportActions.pauseAction.disabled = true;\r\n this.startStopSignalState = StartStopSignalState.POSTRECORDING;\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n\r\n this.postRecTimerId = window.setTimeout(() => {\r\n this.postRecTimerRunning = false;\r\n this.status = Status.STOPPING_PAUSE;\r\n this.stopRecording();\r\n }, this.postDelay);\r\n this.postRecTimerRunning = true;\r\n }\r\n\r\n stopRecording() {\r\n if (this.maxRecTimerRunning) {\r\n if(this.maxRecTimerId) {\r\n window.clearTimeout(this.maxRecTimerId);\r\n }\r\n this.maxRecTimerRunning = false;\r\n }\r\n if(this.ac) {\r\n this.ac.stop();\r\n }\r\n }\r\n\r\n stopRecordingMaxRec(){\r\n if(this.postRecTimerRunning){\r\n if(this.postRecTimerId) {\r\n window.clearTimeout(this.postRecTimerId);\r\n }\r\n this.postRecTimerRunning=false;\r\n }\r\n this.maxRecTimerRunning = false;\r\n this.status = Status.STOPPING_STOP;\r\n if(this.ac) {\r\n this.ac.stop();\r\n }\r\n }\r\n\r\n addRecordingFileByDescriptor(rfd:RecordingFileDescriptorImpl){\r\n if(rfd.recording && rfd.recording.itemcode) {\r\n let prIdx = this.promptIndexByItemcode(rfd.recording.itemcode);\r\n if (this.items!=null && prIdx !== null) {\r\n let it = this.items[prIdx];\r\n if (it && this._session) {\r\n if (!it.recs) {\r\n it.recs = new Array<SprRecordingFile>();\r\n }\r\n let rf = new SprRecordingFile(this._session.sessionId, rfd.recording.itemcode, rfd.version, null);\r\n it.recs[rfd.version] = rf;\r\n\r\n } else {\r\n //console.debug(\"WARN: No recording item with code: \\\"\" +rfd.recording.itemcode+ \"\\\" found.\");\r\n }\r\n } else {\r\n //console.debug(\"WARN: No recording item with code: \\\"\" +rfd.recording.itemcode+ \"\\\" found.\");\r\n }\r\n }\r\n }\r\n\r\n addRecordingFileByPromptIndex(promptIndex:number, rf:SprRecordingFile){\r\n\r\n }\r\n\r\n\r\n stopped() {\r\n this.updateStartActionDisableState()\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Recorded.';\r\n this.startStopSignalState = StartStopSignalState.IDLE;\r\n\r\n let ad:AudioBuffer|null = null;\r\n if(this.ac!=null){\r\n ad=this.ac.audioBuffer();\r\n }\r\n let ic = this.promptItem.itemcode;\r\n let rf=null;\r\n if (this._session && ic) {\r\n let sessId: string | number = this._session.sessionId;\r\n let cpIdx = this.promptIndex;\r\n if (this.items) {\r\n let it=this.items[cpIdx];\r\n if (!it.recs) {\r\n it.recs = new Array<SprRecordingFile>();\r\n }\r\n rf = new SprRecordingFile(sessId, ic, it.recs.length, ad);\r\n it.recs.push(rf);\r\n }\r\n if (this.enableUploadRecordings) {\r\n // TODO use SpeechRecorderconfig resp. RecfileService\r\n // convert asynchronously to 16-bit integer PCM\r\n // TODO could we avoid conversion to save CPU resources and transfer float PCM directly?\r\n // TODO duplicate conversion for manual download\r\n //console.log(\"Build wav writer...\");\r\n this.processingRecording=true\r\n if(ad && rf) {\r\n let ww = new WavWriter();\r\n //new REST API URL\r\n let apiEndPoint = '';\r\n if (this.config && this.config.apiEndPoint) {\r\n apiEndPoint = this.config.apiEndPoint;\r\n }\r\n if (apiEndPoint !== '') {\r\n apiEndPoint = apiEndPoint + '/'\r\n }\r\n let sessionsUrl = apiEndPoint + SessionService.SESSION_API_CTX;\r\n let recUrl: string = sessionsUrl + '/' + rf.session + '/' + RECFILE_API_CTX + '/' + rf.itemCode;\r\n ww.writeAsync(ad, (wavFile) => {\r\n this.postRecording(wavFile, recUrl);\r\n this.processingRecording = false\r\n });\r\n }\r\n }\r\n }\r\n\r\n // check complete session\r\n let complete = true;\r\n if(this.items) {\r\n // search backwards, to gain faster detection of incomplete state\r\n for (let ri = this.items.length - 1; ri >= 0; ri--) {\r\n let it = this.items[ri];\r\n if (it.recording && !it.training && (!it.recs || it.recs.length == 0)) {\r\n complete = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let autoStart = (this.status === Status.STOPPING_STOP);\r\n this.status = Status.IDLE;\r\n let startNext=false;\r\n if (complete) {\r\n if(this._session!=null) {\r\n if (!this._session.sealed && this._session.status !== \"COMPLETED\") {\r\n let body: any = {}\r\n this._session.status = \"COMPLETED\";\r\n body.status = this._session.status;\r\n if (!this._session.completedDate) {\r\n this._session.completedDate = new Date();\r\n body.completedDate = this._session.completedDate;\r\n }\r\n this.sessionService.patchSessionObserver(this._session, body).subscribe()\r\n }\r\n }\r\n this.statusMsg = 'Session complete!';\r\n let dialogRef = this.dialog.open(SessionFinishedDialog, {});\r\n\r\n // enable navigation\r\n this.transportActions.fwdAction.disabled = false\r\n this.transportActions.bwdAction.disabled = false\r\n } else {\r\n\r\n if (this.section.mode === 'AUTOPROGRESS' || this.section.mode === 'AUTORECORDING') {\r\n this.nextItem();\r\n }\r\n\r\n if (this.section.mode === 'AUTORECORDING' && this.autorecording && autoStart) {\r\n startNext=true;\r\n } else {\r\n this.navigationDisabled = false;\r\n this.updateNavigationActions();\r\n }\r\n }\r\n // apply recorded item\r\n this.applyItem(startNext);\r\n if(startNext){\r\n this.startItem();\r\n }\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n postRecording(wavFile: Uint8Array, recUrl: string) {\r\n let wavBlob = new Blob([wavFile], {type: 'audio/wav'});\r\n let ul = new Upload(wavBlob, recUrl);\r\n this.uploader.queueUpload(ul);\r\n }\r\n\r\n stop() {\r\n if(this.ac!=null){\r\n this.ac.close();\r\n }\r\n }\r\n\r\n private updateControlPlaybackPosition() {\r\n if (this._controlAudioPlayer.playPositionFrames) {\r\n this.prompting.audioDisplay.playFramePosition = this._controlAudioPlayer.playPositionFrames;\r\n this.liveLevelDisplay.playFramePosition = this._controlAudioPlayer.playPositionFrames;\r\n }\r\n }\r\n\r\n audioPlayerUpdate(e: AudioPlayerEvent) {\r\n if (EventType.READY === e.type) {\r\n\r\n } else if (EventType.STARTED === e.type) {\r\n //this.status = 'Playback...';\r\n this.updateTimerId = window.setInterval(() => this.updateControlPlaybackPosition(), 50);\r\n\r\n } else if (EventType.ENDED === e.type) {\r\n //.status='Ready.';\r\n window.clearInterval(this.updateTimerId);\r\n\r\n }\r\n\r\n if(!this.destroyed) {\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n }\r\n}\r\n\r\n","/**\r\n * Created by klausj on 17.06.2017.\r\n */\r\nimport {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient} from \"@angular/common/http\";\r\nimport {ApiType, SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\nimport {Script} from \"./script\";\r\nimport {UUID} from \"../../utils/utils\";\r\nimport {Observable} from \"rxjs\";\r\n\r\n\r\nexport const SCRIPT_API_CTX='script'\r\n\r\n@Injectable()\r\nexport class ScriptService {\r\n private scriptCtxUrl:string;\r\n private withCredentials:boolean=false;\r\n\r\n constructor(private http:HttpClient,@Inject(SPEECHRECORDER_CONFIG) private config?:SpeechRecorderConfig) {\r\n\r\n let apiEndPoint = ''\r\n\r\n if(config && config.apiEndPoint) {\r\n apiEndPoint=config.apiEndPoint;\r\n }\r\n if(apiEndPoint !== ''){\r\n apiEndPoint=apiEndPoint+'/'\r\n }\r\n if(config!=null && config.withCredentials!=null){\r\n this.withCredentials=config.withCredentials;\r\n }\r\n this.scriptCtxUrl = apiEndPoint + SCRIPT_API_CTX;\r\n }\r\n\r\n scriptObservable(id:string | number):Observable<Script>{\r\n let encScriptId=encodeURIComponent(id);\r\n let scriptUrl = this.scriptCtxUrl + '/' + encScriptId;\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n scriptUrl = scriptUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n return this.http.get<Script>(scriptUrl,{withCredentials: this.withCredentials })\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n","import {Component, ViewChild, ChangeDetectorRef, AfterViewInit, OnInit} from '@angular/core'\r\nimport {\r\n AudioPlayerListener, AudioPlayerEvent, EventType as PlaybackEventType,\r\n AudioPlayer\r\n} from './audio/playback/player';\r\nimport {Group, Order, PromptItem, Script} from './speechrecorder/script/script'\r\nimport { SessionManager,Status as SessionManagerStatus} from './speechrecorder/session/sessionmanager';\r\nimport { UploaderStatusChangeEvent, UploaderStatus } from './net/uploader';\r\nimport {ActivatedRoute, Params, Router} from \"@angular/router\";\r\nimport {SessionService} from \"./speechrecorder/session/session.service\";\r\nimport {ScriptService} from \"./speechrecorder/script/script.service\";\r\nimport {SpeechRecorderUploader} from \"./speechrecorder/spruploader\";\r\nimport {Session} from \"./speechrecorder/session/session\";\r\nimport {Project, ProjectUtil} from \"./speechrecorder/project/project\";\r\nimport {ProjectService} from \"./speechrecorder/project/project.service\";\r\nimport {AudioContextProvider} from \"./audio/context\";\r\nimport {RecordingService} from \"./speechrecorder/recordings/recordings.service\";\r\nimport {RecordingFileDescriptorImpl} from \"./speechrecorder/recording\";\r\nimport {Arrays} from \"./utils/utils\";\r\n\r\nexport enum Mode {SINGLE_SESSION,DEMO}\r\n\r\n@Component({\r\n\r\n selector: 'app-speechrecorder',\r\n providers: [SessionService],\r\n template: `\r\n <app-sprrecordingsession [projectName]=\"project?.name\" [dataSaved]=\"dataSaved\"></app-sprrecordingsession>\r\n `,\r\n styles: [`:host{\r\n flex: 2;\r\n display: flex;\r\n flex-direction: column;\r\n min-height:0;\r\n\r\n }`]\r\n\r\n})\r\nexport class SpeechrecorderngComponent implements OnInit,AfterViewInit,AudioPlayerListener {\r\n\r\n\t mode!:Mode;\r\n\t\tcontrolAudioPlayer!:AudioPlayer;\r\n\t\taudio:any;\r\n\r\n\t_project:Project|null=null;\r\n sessionId!: string;\r\n session!:Session;\r\n\r\n script!:Script;\r\n dataSaved: boolean = true;\r\n @ViewChild(SessionManager, { static: true }) sm!:SessionManager;\r\n\r\n\t\tconstructor(private route: ActivatedRoute,\r\n private router: Router,\r\n private changeDetectorRef: ChangeDetectorRef,\r\n private sessionsService:SessionService,\r\n private projectService:ProjectService,\r\n private scriptService:ScriptService,\r\n private recFilesService:RecordingService,\r\n private uploader:SpeechRecorderUploader) {\r\n\t\t}\r\n\r\n ngOnInit() {\r\n\t\t try {\r\n let audioContext = AudioContextProvider.audioContextInstance();\r\n if(audioContext) {\r\n this.controlAudioPlayer = new AudioPlayer(audioContext, this);\r\n }\r\n this.sm.controlAudioPlayer=this.controlAudioPlayer;\r\n this.sm.statusAlertType='info';\r\n this.sm.statusMsg = 'Player initialized.';\r\n }catch(err){\r\n let errMsg='Unknown error';\r\n if(err instanceof Error){\r\n errMsg=err.message;\r\n }\r\n this.sm.statusMsg=errMsg;\r\n this.sm.statusAlertType='error';\r\n console.error(errMsg)\r\n }\r\n }\r\n ngAfterViewInit(){\r\n\r\n\t\t if(this.sm.status!== SessionManagerStatus.ERROR) {\r\n let initSuccess = this.init();\r\n if (initSuccess) {\r\n this.route.queryParams.subscribe((params: Params) => {\r\n if (params['sessionId']) {\r\n this.fetchSession(params['sessionId']);\r\n }\r\n });\r\n\r\n this.route.params.subscribe((params: Params) => {\r\n let routeParamsId = params['id'];\r\n if (routeParamsId) {\r\n this.fetchSession(routeParamsId);\r\n }\r\n })\r\n }\r\n }\r\n }\r\n\r\n fetchSession(sessionId:string){\r\n\r\n\r\n\t\t //Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'statusMsg: Player initialized.'. Current value: 'statusMsg: Fetching session info...'.\r\n // params.subscribe seems not to be asynchronous\r\n\r\n // this.sm.statusAlertType='info';\r\n // this.sm.statusMsg = 'Fetching session info...';\r\n // this.sm.statusWaiting=true;\r\n let sessObs= this.sessionsService.sessionObserver(sessionId);\r\n\r\n if(sessObs) {\r\n sessObs.subscribe(sess => {\r\n this.setSession(sess);\r\n this.sm.statusAlertType='info';\r\n this.sm.statusMsg = 'Received session info.';\r\n this.sm.statusWaiting=false;\r\n if (sess.project) {\r\n //console.debug(\"Session associated project: \"+sess.project)\r\n this.projectService.projectObservable(sess.project).subscribe(project=>{\r\n this.project=project;\r\n this.fetchScript(sess);\r\n },reason =>{\r\n this.sm.statusMsg=reason;\r\n this.sm.statusAlertType='error';\r\n this.sm.statusWaiting=false;\r\n console.error(\"Error fetching project config: \"+reason)\r\n });\r\n\r\n } else {\r\n console.info(\"Session has no associated project. Using default configuration.\")\r\n this.fetchScript(sess);\r\n }\r\n },\r\n (reason) => {\r\n this.sm.statusMsg = reason;\r\n this.sm.statusAlertType = 'error';\r\n this.sm.statusWaiting=false;\r\n console.error(\"Error fetching session \" + reason)\r\n });\r\n }\r\n }\r\n\r\n\r\n fetchScript(sess:Session){\r\n if(sess.script){\r\n this.sm.statusAlertType='info';\r\n this.sm.statusMsg = 'Fetching recording script...';\r\n this.sm.statusWaiting=true;\r\n this.scriptService.scriptObservable(sess.script).subscribe(script=>{\r\n this.sm.statusAlertType='info';\r\n this.sm.statusMsg = 'Received recording script.';\r\n this.sm.statusWaiting=false;\r\n this.setScript(script)\r\n this.sm.session=sess;\r\n this.fetchRecordings(sess,this.script)\r\n },reason =>{\r\n let errMsg=\"Error fetching recording script: \"+reason\r\n console.error(errMsg)\r\n this.sm.statusMsg=errMsg;\r\n this.sm.statusAlertType='error';\r\n this.sm.statusWaiting=false;\r\n });\r\n }else{\r\n let errMsg=\"No recording script is defined for this session with ID \"+sess.sessionId;\r\n console.error(this.sm.statusMsg)\r\n this.sm.statusMsg=errMsg;\r\n this.sm.statusAlertType='error';\r\n\r\n }\r\n }\r\n\r\n\r\n fetchRecordings(sess:Session,script:Script){\r\n this.sm.statusAlertType='info';\r\n this.sm.statusMsg = 'Fetching infos of recordings...';\r\n this.sm.statusWaiting=true;\r\n let prNm:string|null=null;\r\n if(this.project) {\r\n let rfsObs = this.recFilesService.recordingFileDescrList(this.project.name, sess.sessionId);\r\n rfsObs.subscribe((rfs: Array<RecordingFileDescriptorImpl>) => {\r\n this.sm.statusAlertType = 'info';\r\n this.sm.statusMsg = 'Received infos of recordings.';\r\n this.sm.statusWaiting = false;\r\n if (rfs) {\r\n if (rfs instanceof Array) {\r\n rfs.forEach((rf) => {\r\n //console.debug(\"Already recorded: \" + rf+ \" \"+rf.recording.itemcode);\r\n this.sm.addRecordingFileByDescriptor(rf);\r\n })\r\n } else {\r\n console.error('Expected type array for list of already recorded files ')\r\n }\r\n } else {\r\n //console.debug(\"Recording file list: \" + rfs);\r\n }\r\n }, () => {\r\n // we start the session anyway\r\n this.startSession()\r\n }, () => {\r\n this.startSession()\r\n })\r\n }else{\r\n // TODO\r\n }\r\n }\r\n\r\n\r\n private startSession(){\r\n this.sm.statusWaiting=false;\r\n\t\t this.sm.start();\r\n }\r\n\r\n\r\n setSession(session:any){\r\n\t\t if(session) {\r\n // console.debug(\"Session ID: \" + session.sessionId);\r\n }else{\r\n //console.debug(\"Session Undefined\");\r\n }\r\n }\r\n\r\n ready():boolean{\r\n\t\t return this.dataSaved && !this.sm.isActive()\r\n }\r\n\r\n\t\tinit():boolean {\r\n\r\n\t\t\tvar n = <any>navigator;\r\n\t\t\t//var getUserMediaFnct= n.getUserMedia || n.webkitGetUserMedia ||\r\n\t\t\t//\tn.mozGetUserMedia || n.msGetUserMedia;\r\n\t\t\tvar w = <any>window;\r\n\t\t\t// TODO test onyl !!\r\n\r\n // let debugFail=true;\r\n\t\t// \tAudioContext = w.AudioContext || w.webkitAudioContext;\r\n\t\t// \tif (typeof AudioContext !== 'function' || debugFail) {\r\n // this.sm.statusAlertType='error';\r\n\t\t// \t\tthis.sm.statusMsg = 'ERROR: Browser does not support Web Audio API!';\r\n\t\t// \t\treturn false;\r\n\t\t// \t} else {\r\n\t\t// \t\tvar context = new AudioContext();\r\n //\r\n\t\t// \t\tif (typeof navigator.mediaDevices.getUserMedia !== 'function') {\r\n // this.sm.statusAlertType='error';\r\n\t\t// \t\t\tthis.sm.statusMsg= 'ERROR: Browser does not support Media streams!';\r\n // return false;\r\n\t\t// \t\t} else {\r\n //\r\n\r\n //this.sm = new SessionManager(new SimpleTrafficLight(), this.uploader);\r\n\t\t\t\t\t//this.sm.init();\r\n\t\t\t\t\t//this.ap = new AudioPlayer(context,this);\r\n\t\t\t\t\t//this.sm.listener=this;\r\n\t\t\t//\t}\r\n\t\t//\t}\r\n this.uploader.listener = (ue) => {\r\n this.uploadUpdate(ue);\r\n }\r\n\r\n window.addEventListener('beforeunload', (e) => {\r\n console.debug(\"Before page unload event\");\r\n\r\n if (this.ready()) {\r\n return;\r\n } else {\r\n // all this attempts to customize the message do not work anymore (for security reasons)!!\r\n var message = \"Please do not leave the page, until all recordings are uploaded!\";\r\n alert(message);\r\n e = e || window.event;\r\n\r\n if (e) {\r\n e.returnValue = message;\r\n e.cancelBubble = true;\r\n if (e.stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n if (e.preventDefault) {\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n return message;\r\n }\r\n });\r\n\t\t\treturn true;\r\n }\r\n\r\n uploadUpdate(ue: UploaderStatusChangeEvent) {\r\n let upStatus = ue.status;\r\n this.dataSaved = (UploaderStatus.DONE === upStatus);\r\n let percentUpl = ue.percentDone();\r\n if (UploaderStatus.ERR === upStatus) {\r\n this.sm.uploadStatus = 'warn'\r\n } else {\r\n if (percentUpl < 50) {\r\n this.sm.uploadStatus = 'accent'\r\n } else {\r\n this.sm.uploadStatus = 'success'\r\n }\r\n this.sm.uploadProgress = percentUpl;\r\n }\r\n\r\n this.changeDetectorRef.detectChanges()\r\n }\r\n\r\n configure() {\r\n\r\n\r\n\r\n this.loadProjectCfg(() => {\r\n // display project name\r\n let prName: string = '[Unknown]';\r\n if (this.project && this.project.name) {\r\n prName = this.project.name;\r\n }\r\n //this.titleEl.innerText = prName;\r\n\r\n });\r\n\r\n }\r\n\r\n\r\n private randomize(script:Script){\r\n\t\t script.sections.forEach((s)=>{\r\n\t\t if('RANDOM'===s.order) {\r\n s._shuffledGroups = Arrays.shuffleArray<Group>(s.groups);\r\n }else{\r\n\t\t s._shuffledGroups=s.groups;\r\n }\r\n\t\t s._shuffledGroups.forEach((g)=>{\r\n\t\t if('RANDOM'===g.order){\r\n\t\t g._shuffledPromptItems=Arrays.shuffleArray<PromptItem>(g.promptItems);\r\n }else{\r\n\t\t g._shuffledPromptItems=g.promptItems;\r\n }\r\n });\r\n });\r\n }\r\n\r\n setScript(script:Script){\r\n this.script=script;\r\n this.randomize(this.script);\r\n this.sm.script = this.script;\r\n }\r\n\r\n\r\n set project(project: Project|null) {\r\n this._project = project;\r\n let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;\r\n\r\n if (project) {\r\n console.info(\"Project name: \" + project.name)\r\n this.sm.audioDevices = project.audioDevices;\r\n chCnt = ProjectUtil.audioChannelCount(project);\r\n console.info(\"Project requested recording channel count: \" + chCnt);\r\n this.sm.autoGainControlConfigs=project.autoGainControlConfigs;\r\n } else {\r\n console.error(\"Empty project configuration!\")\r\n }\r\n this.sm.channelCount = chCnt;\r\n\r\n }\r\n\r\n get project():Project|null{\r\n\t\t return this._project;\r\n }\r\n\r\n\r\n\r\n\r\n loadProjectCfg(callback: ()=> any){\r\n let projUrl: string | null = null;\r\n\r\n if (this.sessionId === null) {\r\n if (window.location.hostname === 'localhost' || this.mode === Mode.DEMO) {\r\n // debug or demo mode\r\n projUrl = 'test/Demo1.json?' + new Date().getTime();\r\n }\r\n } else {\r\n // load RESTful by sessionId\r\n projUrl = window.location.protocol + '//' + window.location.hostname + ':' + window.location.port + '/wikispeech/rest/projects/?sessionId=' + this.sessionId;\r\n\r\n }\r\n if(projUrl) {\r\n var pLoader = new XMLHttpRequest();\r\n pLoader.open(\"GET\", projUrl, true);\r\n pLoader.setRequestHeader('Accept', 'application/json');\r\n pLoader.responseType = \"json\";\r\n pLoader.onload = (e) => {\r\n\r\n this.project = pLoader.response.project;\r\n\r\n callback();\r\n }\r\n pLoader.onerror = (e) => {\r\n console.error(\"Error downloading project data ...\");\r\n }\r\n pLoader.send();\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n // loadScript(callback: ()=>any){\r\n // var scrLoader = new XMLHttpRequest();\r\n // let hn:string =window.location.hostname;\r\n // let pn:string =window.location.pathname;\r\n // let pr:string =window.location.protocol;\r\n // let po:string =window.location.port;\r\n //\r\n // let sessionId:string=this.session.sessionId;\r\n //\r\n // let scrUrl:string | null = null;\r\n //\r\n // if (hn === 'localhost' || this.mode===Mode.DEMO) {\r\n // // local debug mode\r\n // // FF caches\r\n // scrUrl = 'test/' + this.session.script.toString() + '.json?' + new Date().getTime();\r\n //\r\n // } else {\r\n // let scrPath:string = '/wikispeech/session/scripts/servlet';\r\n // let scrQu:string = 'sessionId=' + sessionId;\r\n // scrUrl = pr + '//' + hn + ':' + po + scrPath;\r\n // if (scrQu) {\r\n // scrUrl = scrUrl + '?' + scrQu;\r\n // }\r\n // }\r\n //\r\n // scrLoader.open(\"GET\",scrUrl , true);\r\n // scrLoader.setRequestHeader('Accept','application/json');\r\n // scrLoader.responseType = \"json\";\r\n // scrLoader.onload = (e) => {\r\n //\r\n // this.script = scrLoader.response;\r\n //\r\n //\r\n // this.sm.script = this.script;\r\n //\r\n // callback();\r\n // }\r\n // scrLoader.onerror = (e) => {\r\n // console.log(\"Error downloading recording script data ...\");\r\n // }\r\n // scrLoader.send();\r\n // }\r\n\r\n start(){\r\n\r\n //this.configure();\r\n\r\n }\r\n\r\n\t\taudioPlayerUpdate(e:AudioPlayerEvent){\r\n\t\t\tif(PlaybackEventType.STARTED===e.type){\r\n\t\t\t\t//this.startBtn.disabled=true;\r\n\t\t\t\t//this.stopBtn.disabled=true;\r\n this.sm.statusAlertType='info';\r\n\t\t\t\tthis.sm.statusMsg='Playback...';\r\n\r\n } else if (PlaybackEventType.ENDED === e.type) {\r\n\t\t\t\t//this.startBtn.disabled=false;\r\n\t\t\t\t//this.stopBtn.disabled=true;\r\n this.sm.statusAlertType='info';\r\n\t\t\t\tthis.sm.statusMsg='Ready.';\r\n\t\t\t}\r\n\t\t}\r\n\t\terror(){\r\n\t\t this.sm.statusAlertType='error';\r\n\t\t\tthis.sm.statusMsg='ERROR: Recording.';\r\n\t\t}\r\n\t}\r\n\r\n\r\n//\r\n//\r\n// function speechrecorderInit() {\r\n// \tvar spr = new ips.apps.speeechrecorder.SpeechRecorder();\r\n// \tspr.init();\r\n// spr.start();\r\n//\r\n//\r\n// }\r\n","import {Component} from \"@angular/core\";\n\n@Component({\n\n selector: 'scroll-pane-horizontal',\n template: '',\n styles: [\n `:host {\n width: 100%;\n background: darkgray;\n box-sizing: border-box;\n height: 100%;\n position: relative;\n overflow-x: scroll;\n overflow-y: auto;\n }`]\n\n})\nexport class ScrollPaneHorizontal{\n\n}\n","import {\r\n Component,\r\n ViewChild,\r\n ChangeDetectorRef,\r\n AfterViewInit, Input, AfterContentInit, OnInit, AfterContentChecked, AfterViewChecked, ElementRef,\r\n} from '@angular/core'\r\n\r\nimport {AudioClip, Selection} from './persistor'\r\nimport {AudioPlayer, AudioPlayerListener, AudioPlayerEvent, EventType} from './playback/player'\r\nimport {ActivatedRoute, Params} from \"@angular/router\";\r\nimport {Action} from \"../action/action\";\r\nimport {AudioDisplayScrollPane} from \"./ui/audio_display_scroll_pane\";\r\nimport {AudioContextProvider} from \"./context\";\r\n\r\n@Component({\r\n\r\n selector: 'app-audiodisplayplayer',\r\n\r\n template: `\r\n\r\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\r\n\r\n <audio-display-control [audioClip]=\"audioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [playStopAction]=\"playStopAction\"\r\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\r\n [zoomInAction]=\"zoomInAction\"\r\n [zoomOutAction]=\"zoomOutAction\"\r\n [zoomSelectedAction]=\"zoomSelectedAction\"\r\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control><p>{{status}}\r\n `,\r\n styles: [\r\n `:host {\r\n display: flex;\r\n flex-direction: column;\r\n position: absolute;\r\n bottom: 0px;\r\n height: 100%;\r\n width: 100%;\r\n overflow: hidden;\r\n padding: 20px;\r\n z-index: 5;\r\n box-sizing: border-box;\r\n background-color: rgba(0, 0, 0, 0.75)\r\n }`]\r\n\r\n})\r\nexport class AudioDisplayPlayer implements AudioPlayerListener, OnInit,AfterContentInit,AfterContentChecked,AfterViewInit,AfterViewChecked {\r\n private _audioUrl: string|null=null;\r\n\r\n parentE: HTMLElement;\r\n\r\n @Input()\r\n playStartAction: Action<void>;\r\n @Input()\r\n playStopAction: Action<void>;\r\n @Input()\r\n playSelectionAction:Action<void>\r\n @Input()\r\n autoPlayOnSelectToggleAction!:Action<boolean>;\r\n\r\n zoomFitToPanelAction!:Action<void>;\r\n zoomSelectedAction!:Action<void>;\r\n zoomInAction!:Action<void>;\r\n zoomOutAction!:Action<void>;\r\n\r\n\r\n aCtx: AudioContext|null=null;\r\n private _audioClip:AudioClip|null=null;\r\n ap: AudioPlayer|undefined;\r\n status: string;\r\n\r\n currentLoader: XMLHttpRequest | null=null;\r\n\r\n audio: any;\r\n updateTimerId: any;\r\n\r\n\r\n @ViewChild(AudioDisplayScrollPane, { static: true })\r\n private audioDisplayScrollPane!: AudioDisplayScrollPane;\r\n\r\n constructor(protected route: ActivatedRoute, protected ref: ChangeDetectorRef,protected eRef:ElementRef) {\r\n //console.log(\"constructor: \"+this.ac);\r\n this.parentE=this.eRef.nativeElement;\r\n this.playStartAction = new Action(\"Start\");\r\n this.playSelectionAction=new Action(\"Play selected\");\r\n this.playStopAction = new Action(\"Stop\");\r\n this.status=\"Player created.\";\r\n\r\n }\r\n\r\n ngOnInit(){\r\n //console.log(\"OnInit: \"+this.ac);\r\n this.zoomSelectedAction=this.audioDisplayScrollPane.zoomSelectedAction\r\n this.zoomFitToPanelAction=this.audioDisplayScrollPane.zoomFitToPanelAction;\r\n this.zoomOutAction=this.audioDisplayScrollPane.zoomOutAction;\r\n this.zoomInAction=this.audioDisplayScrollPane.zoomInAction;\r\n try {\r\n this.aCtx = AudioContextProvider.audioContextInstance();\r\n if(this.aCtx) {\r\n this.ap = new AudioPlayer(this.aCtx, this);\r\n }\r\n }catch(err){\r\n if(err instanceof Error) {\r\n this.status = err.message;\r\n }\r\n }\r\n }\r\n\r\n ngAfterContentInit(){\r\n //console.log(\"AfterContentInit: \"+this.ac);\r\n }\r\n\r\n ngAfterContentChecked(){\r\n //console.log(\"AfterContentChecked: \"+this.ac);\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.aCtx && this.ap) {\r\n this.playStartAction.onAction = () => this.ap?.start();\r\n this.playSelectionAction.onAction = () => this.ap?.startSelected();\r\n this.playStopAction.onAction = () => this.ap?.stop();\r\n }\r\n this.layout();\r\n let heightListener=new MutationObserver((mrs:Array<MutationRecord>,mo:MutationObserver)=>{\r\n mrs.forEach((mr:MutationRecord)=>{\r\n if('attributes'===mr.type && ('class'===mr.attributeName || 'style'===mr.attributeName)){\r\n this.layout();\r\n }\r\n })\r\n });\r\n heightListener.observe(this.parentE,{attributes: true,childList: true, characterData: true});\r\n this.route.queryParams.subscribe((params: Params) => {\r\n if (params['url']) {\r\n this.audioUrl = params['url'];\r\n }\r\n });\r\n }\r\n\r\n\r\n ngAfterViewChecked(){\r\n //console.log(\"AfterViewChecked: \"+this.ac);\r\n }\r\n\r\n\r\n init() {\r\n\r\n\r\n }\r\n\r\n layout(){\r\n this.audioDisplayScrollPane.layout();\r\n }\r\n\r\n get audioUrl(): string|null {\r\n return this._audioUrl;\r\n }\r\n\r\n set audioUrl(value: string|null) {\r\n if(this.ap) {\r\n this.ap.stop();\r\n }\r\n this._audioUrl = value;\r\n this.load();\r\n }\r\n\r\n\r\n started() {\r\n //console.debug(\"Play started\");\r\n this.status = 'Playing...';\r\n }\r\n\r\n private load() {\r\n\r\n if (this.currentLoader) {\r\n this.currentLoader.abort();\r\n this.currentLoader = null;\r\n }\r\n if(this._audioUrl) {\r\n //this.statusMsg.innerHTML = 'Connecting...';\r\n this.currentLoader = new XMLHttpRequest();\r\n this.currentLoader.open(\"GET\", this._audioUrl, true);\r\n this.currentLoader.responseType = \"arraybuffer\";\r\n this.currentLoader.onload = (e) => {\r\n if (this.currentLoader) {\r\n\r\n var data = this.currentLoader.response; // not responseText\r\n //console.debug(\"Received data \", data.byteLength);\r\n this.currentLoader = null;\r\n this.loaded(data);\r\n }\r\n }\r\n this.currentLoader.onerror = (e) => {\r\n console.error(\"Error downloading ...\");\r\n //this.statusMsg.innerHTML = 'Error loading audio file!';\r\n this.currentLoader = null;\r\n }\r\n //this.statusMsg.innerHTML = 'Loading...';\r\n\r\n this.currentLoader.send();\r\n }\r\n }\r\n\r\n private loaded(data: ArrayBuffer) {\r\n\r\n //console.debug(\"Loaded\");\r\n this.status = 'Audio file loaded.';\r\n //console.debug(\"Received data \", data.byteLength);\r\n\r\n // Do not use Promise version, which does not work with Safari 13\r\n if(this.aCtx) {\r\n this.aCtx.decodeAudioData(data, (audioBuffer) => {\r\n //console.debug(\"Audio Buffer Samplerate: \", audioBuffer.sampleRate)\r\n this.audioClip = new AudioClip(audioBuffer)\r\n });\r\n }\r\n }\r\n\r\n @Input()\r\n set audioData(audioBuffer: AudioBuffer){\r\n this.audioDisplayScrollPane.audioData = audioBuffer;\r\n if(audioBuffer) {\r\n let clip = new AudioClip(audioBuffer);\r\n if (this.ap){\r\n this.ap.audioClip = clip;\r\n this.playStartAction.disabled = false\r\n }\r\n }else{\r\n this.playStartAction.disabled = true\r\n if (this.ap){\r\n this.ap.audioClip = null;\r\n }\r\n }\r\n this.playSelectionAction.disabled=true\r\n }\r\n\r\n startSelectionDisabled(){\r\n return !(this._audioClip && this.ap!=null && !this.playStartAction.disabled && this._audioClip.selection )\r\n }\r\n\r\n @Input()\r\n set audioClip(audioClip: AudioClip | null) {\r\n this._audioClip=audioClip\r\n let audioData:AudioBuffer|null=null;\r\n let sel:Selection|null=null;\r\n if(audioClip){\r\n audioData=audioClip.buffer;\r\n sel=audioClip.selection;\r\n if(this._audioClip) {\r\n this._audioClip.addSelectionObserver((ac) => {\r\n\r\n this.playSelectionAction.disabled = this.startSelectionDisabled()\r\n // if(this.ap && ac.selection && this.autoplaySelectedCheckbox.checked){\r\n // this.ap.startSelected()\r\n // }\r\n\r\n })\r\n }\r\n }\r\n if(audioData) {\r\n this.playStartAction.disabled =(!this.ap)\r\n this.playSelectionAction.disabled=this.startSelectionDisabled()\r\n }else{\r\n this.playStartAction.disabled = true\r\n this.playSelectionAction.disabled=true\r\n }\r\n\r\n this.audioDisplayScrollPane.audioClip=audioClip\r\n if(this.ap) {\r\n this.ap.audioClip = audioClip\r\n }\r\n }\r\n\r\n get audioClip():AudioClip|null{\r\n return this._audioClip\r\n }\r\n\r\n updatePlayPosition() {\r\n\r\n if (this.ap && this.ap.playPositionFrames) {\r\n this.audioDisplayScrollPane.playFramePosition = this.ap.playPositionFrames;\r\n }\r\n }\r\n\r\n audioPlayerUpdate(e: AudioPlayerEvent) {\r\n if (EventType.STARTED === e.type) {\r\n this.status = 'Playback...';\r\n this.updateTimerId = window.setInterval(() => this.updatePlayPosition(), 50);\r\n this.playStartAction.disabled = true;\r\n this.playSelectionAction.disabled=true\r\n this.playStopAction.disabled = false;\r\n } else if (EventType.ENDED === e.type) {\r\n this.status = 'Ready.';\r\n window.clearInterval(this.updateTimerId);\r\n this.playStartAction.disabled = false;\r\n this.playSelectionAction.disabled=this.startSelectionDisabled()\r\n this.playStopAction.disabled = true;\r\n }\r\n\r\n this.ref.detectChanges();\r\n\r\n }\r\n\r\n error() {\r\n this.status = 'ERROR';\r\n }\r\n\r\n}\r\n\r\n","import {PromptitemUtil} from \"../../script/script\";\r\nimport {RecordingFile, SprRecordingFile} from \"../../recording\";\r\n\r\n\r\n// export class RecordingFile {\r\n//\r\n// get recordingFileId(): string | number {\r\n// return this._recordingFileId;\r\n// }\r\n//\r\n// frames:number=null\r\n// editStartFrame:number=null\r\n// editEndFrame:number=null\r\n//\r\n// recording:PromptItem;\r\n//\r\n// session:number|string;\r\n//\r\n// get audioBuffer(): AudioBuffer {\r\n// return this._audioBuffer;\r\n// }\r\n//\r\n// set audioBuffer(value: AudioBuffer) {\r\n// this._audioBuffer = value;\r\n// }\r\n// private _recordingFileId:string | number;\r\n// private _audioBuffer:AudioBuffer;\r\n//\r\n// constructor(recordingFileId: string| number, audioBuffer:AudioBuffer){\r\n// this._recordingFileId=recordingFileId;\r\n// this._audioBuffer=audioBuffer;\r\n// }\r\n//\r\n//\r\n// }\r\n\r\nexport class RecordingFileUtil {\r\n public static recordingAsPlainText(recordingFile:SprRecordingFile) {\r\n if (recordingFile) {\r\n let r = recordingFile.recording;\r\n if (r) {\r\n return PromptitemUtil.toPlainTextString(r);\r\n }\r\n }\r\n return \"n/a\";\r\n }\r\n\r\n public static framePosForSampleRate(framePosSampleRate:number|null,framePos:number|null,sampleRate:number):number|null{\r\n let fpFSr=null;\r\n\r\n // TODO transitional until editSampleRates are set in the database\r\n if(framePosSampleRate==null){\r\n framePosSampleRate=sampleRate;\r\n }\r\n if(framePosSampleRate!=null && framePos!=null) {\r\n if (framePosSampleRate === sampleRate) {\r\n fpFSr=framePos;\r\n } else {\r\n fpFSr=Math.round((framePos * sampleRate) / framePosSampleRate);\r\n }\r\n }\r\n return fpFSr;\r\n }\r\n\r\n public static editStartFrameForSampleRate(recordingFile:RecordingFile, sampleRate:number):number | null{\r\n let esffSr=RecordingFileUtil.framePosForSampleRate(recordingFile.editSampleRate,recordingFile.editStartFrame,sampleRate);\r\n return esffSr;\r\n }\r\n\r\n public static editEndFrameForSampleRate(recordingFile:RecordingFile, sampleRate:number):number | null{\r\n let eeffSr=RecordingFileUtil.framePosForSampleRate(recordingFile.editSampleRate,recordingFile.editEndFrame,sampleRate);\r\n return eeffSr;\r\n }\r\n}\r\n","import {Inject, Injectable} from '@angular/core';\r\nimport {HttpClient, HttpErrorResponse, HttpHeaders, HttpResponse} from \"@angular/common/http\";\r\n\r\n\r\nimport {Observable} from \"rxjs\";\r\n\r\n\r\nimport {ApiType, SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../../spr.config\";\r\nimport {UUID} from \"../../../utils/utils\";\r\nimport {RecordingFile, SprRecordingFile} from \"../../recording\";\r\n\r\n\r\n@Injectable()\r\nexport class RecordingFileService {\r\n\r\n public static readonly RECOFILE_API_CTX = 'recordingfile'\r\n private apiEndPoint: string;\r\n private withCredentials: boolean = false;\r\n\r\n //private debugDelay:number=10000;\r\n private debugDelay:number=0;\r\n\r\n constructor(private http: HttpClient, @Inject(SPEECHRECORDER_CONFIG) private config?: SpeechRecorderConfig) {\r\n //constructor(private http: HttpClient) {\r\n // TODO test only\r\n this.apiEndPoint = ''\r\n // this.apiEndPoint = '/wikispeech/api/v1'\r\n\r\n if (config && config.apiEndPoint) {\r\n this.apiEndPoint = config.apiEndPoint;\r\n }\r\n if (this.apiEndPoint !== '') {\r\n this.apiEndPoint = this.apiEndPoint + '/'\r\n }\r\n if (config != null && config.withCredentials != null) {\r\n this.withCredentials = config.withCredentials;\r\n }\r\n //this.withCredentials=true\r\n\r\n //this.recordingCtxUrl = apiEndPoint + REC_API_CTX;\r\n\r\n\r\n }\r\n\r\n private recoFileUrl(recordingFileId: string | number):string{\r\n let encRecfileId=encodeURIComponent(recordingFileId);\r\n let recUrl = this.apiEndPoint + RecordingFileService.RECOFILE_API_CTX + '/' + encRecfileId;\r\n\r\n return recUrl;\r\n }\r\n\r\n private fetchAudiofile(recordingFileId: string | number): Observable<HttpResponse<ArrayBuffer>> {\r\n let recUrl = this.recoFileUrl(recordingFileId);\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n recUrl = recUrl + '.wav';\r\n }\r\n let headers = new HttpHeaders({\r\n 'Accept': 'audio/wav'\r\n });\r\n\r\n return this.http.get(recUrl, {\r\n observe: 'response',\r\n headers: headers,\r\n responseType: 'arraybuffer',\r\n withCredentials: this.withCredentials\r\n });\r\n }\r\n\r\n private recordingFileDescrObserver(recordingFileId: string | number): Observable<RecordingFile> {\r\n\r\n let recUrl = this.recoFileUrl(recordingFileId);\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n recUrl = recUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n return this.http.get<RecordingFile>(recUrl,{ withCredentials: this.withCredentials });\r\n }\r\n\r\n private sprRecordingFileDescrObserver(recordingFileId: string | number): Observable<SprRecordingFile> {\r\n\r\n let recUrl = this.recoFileUrl(recordingFileId);\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n recUrl = recUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n return this.http.get<SprRecordingFile>(recUrl,{ withCredentials: this.withCredentials });\r\n }\r\n\r\n\r\n private fetchSessionAudiofileById(projectName: string, sessId: string | number, recordingFileId: string | number): Observable<HttpResponse<ArrayBuffer>> {\r\n\r\n let recUrl = this.recoFileUrl(recordingFileId);\r\n // if (this.config && this.config.apiType === ApiType.FILES) {\r\n // // for development and demo\r\n // // append UUID to make request URL unique to avoid localhost server caching\r\n // recUrl = recUrl + '.wav?requestUUID=' + UUID.generate();\r\n // }\r\n return this.http.get(recUrl, {\r\n observe: 'response',\r\n responseType: 'arraybuffer',\r\n withCredentials: this.withCredentials\r\n });\r\n }\r\n\r\n\r\n // TODO test\r\n\r\n fetchAndApplyRecordingFile(aCtx: AudioContext, recordingFile:SprRecordingFile):Observable<SprRecordingFile|null> {\r\n\r\n let wobs = new Observable<SprRecordingFile|null>(observer=>{\r\n if(recordingFile.recordingFileId) {\r\n let obs = this.fetchAudiofile(recordingFile.recordingFileId);\r\n\r\n obs.subscribe(resp => {\r\n // Do not use Promise version, which does not work with Safari 13\r\n if(resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n recordingFile.audioBuffer = ab;\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(recordingFile);\r\n observer.complete();\r\n }\r\n })\r\n }else{\r\n observer.error('Received no audio data!');\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n } else {\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n }else{\r\n observer.error();\r\n }\r\n });\r\n\r\n return wobs;\r\n }\r\n\r\n fetchRecordingFile(aCtx: AudioContext, recordingFileId: string | number): Observable<RecordingFile | null> {\r\n\r\n let wobs = new Observable<RecordingFile | null>(observer => {\r\n let rf: RecordingFile|null = null;\r\n let rfDescrObs = this.recordingFileDescrObserver(recordingFileId);\r\n rfDescrObs.subscribe(value => {\r\n rf = value;\r\n }, (error) => {\r\n observer.error(error);\r\n }, () => {\r\n let rfAudioObs = this.fetchAudiofile(recordingFileId);\r\n rfAudioObs.subscribe(resp => {\r\n // Do not use Promise version, which does not work with Safari 13\r\n if(resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n if(rf) {\r\n rf.audioBuffer = ab\r\n }else{\r\n observer.error('Recording file object null');\r\n }\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n observer.next(rf);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(rf);\r\n observer.complete();\r\n }\r\n })\r\n }else{\r\n observer.error('Received no audio data');\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n } else {\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n\r\n });\r\n });\r\n\r\n return wobs;\r\n }\r\n\r\n fetchSprRecordingFile(aCtx: AudioContext, recordingFileId: string | number): Observable<SprRecordingFile | null> {\r\n\r\n let wobs = new Observable<SprRecordingFile | null>(observer => {\r\n let rf: SprRecordingFile|null = null;\r\n let rfDescrObs = this.sprRecordingFileDescrObserver(recordingFileId);\r\n rfDescrObs.subscribe(value => {\r\n rf = value;\r\n }, (error) => {\r\n observer.error(error);\r\n }, () => {\r\n let rfAudioObs = this.fetchAudiofile(recordingFileId);\r\n rfAudioObs.subscribe(resp => {\r\n // Do not use Promise version, which does not work with Safari 13\r\n if(resp.body) {\r\n aCtx.decodeAudioData(resp.body, ab => {\r\n if(rf) {\r\n rf.audioBuffer = ab\r\n }else{\r\n observer.error('Recording file object null');\r\n }\r\n if (this.debugDelay > 0) {\r\n window.setTimeout(() => {\r\n observer.next(rf);\r\n observer.complete();\r\n }, this.debugDelay);\r\n } else {\r\n observer.next(rf);\r\n observer.complete();\r\n }\r\n })\r\n }else{\r\n observer.error('Received no audio data');\r\n }\r\n },\r\n (error: HttpErrorResponse) => {\r\n if (error.status == 404) {\r\n // Interpret not as an error, the file ist not recorded yet\r\n observer.next(null);\r\n observer.complete()\r\n } else {\r\n // all other states are errors\r\n observer.error(error);\r\n observer.complete();\r\n }\r\n });\r\n\r\n });\r\n });\r\n\r\n return wobs;\r\n }\r\n\r\n saveEditSelection(recordingFileId: string | number,editSampleRate:number|null,editStartFrame:number|null,editEndFrame:number|null): Observable<SprRecordingFile | null> {\r\n let recUrl = this.apiEndPoint + RecordingFileService.RECOFILE_API_CTX + '/' + recordingFileId;\r\n if (this.config && this.config.apiType === ApiType.FILES) {\r\n // for development and demo\r\n // append UUID to make request URL unique to avoid localhost server caching\r\n recUrl = recUrl + '.json?requestUUID='+UUID.generate();\r\n }\r\n console.log(\"Path request URL: \"+recUrl)\r\n return this.http.patch<SprRecordingFile>(recUrl,{editSampleRate:editSampleRate,editStartFrame:editStartFrame,editEndFrame:editEndFrame},{ withCredentials: this.withCredentials });\r\n }\r\n\r\n}\r\n\r\n\r\n","import {Component, Input, OnInit} from '@angular/core';\r\nimport {RecordingFileUtil} from \"./recording-file\";\r\nimport {RecordingFile, SprRecordingFile} from \"../../recording\";\r\n\r\n@Component({\r\n selector: 'app-recording-file-meta',\r\n template: `\r\n <mat-card>\r\n <mat-card-title>Recording file ID: {{recordingFile?.recordingFileId}}</mat-card-title>\r\n <mat-card-content>\r\n <table>\r\n <tr *ngIf=\"itemCode\">\r\n <td>Itemcode:</td>\r\n <td>{{itemCode}}</td>\r\n </tr>\r\n <tr *ngIf=\"uuid && !itemCode\">\r\n <td>UUID:</td>\r\n <td>{{uuid}}</td>\r\n </tr>\r\n <tr *ngIf=\"recordingFile?.startedDate\">\r\n <td>Started:</td>\r\n <td>{{recordingFile?.startedDate}}</td>\r\n </tr>\r\n <tr *ngIf=\"!recordingFile?.startedDate && recordingFile?.date\">\r\n <td>Date:</td>\r\n <td>{{recordingFile?.date}}</td>\r\n </tr>\r\n <tr *ngIf=\"itemCode\">\r\n <td>Prompt:</td>\r\n <td>{{recordingAsPlainText()}}</td>\r\n </tr>\r\n\r\n <tr *ngIf=\"sessionId\">\r\n <td>Session:</td>\r\n <td>{{sessionId}}</td>\r\n </tr>\r\n </table>\r\n </mat-card-content>\r\n </mat-card>\r\n `,\r\n styles: []\r\n})\r\nexport class RecordingFileMetaComponent{\r\n\r\n\r\n @Input() sessionId:string | number | null=null;\r\n\r\n private _recordingFile:SprRecordingFile|null=null;\r\n\r\n get recordingFile(): SprRecordingFile | null {\r\n return this._recordingFile;\r\n }\r\n\r\n @Input() set recordingFile(recordingFile:SprRecordingFile|null){\r\n this._recordingFile=recordingFile;\r\n if(this._recordingFile) {\r\n this.itemCode = this._recordingFile.itemCode;\r\n if(!this.itemCode && this._recordingFile.recording?.itemcode){\r\n this.itemCode=this._recordingFile.recording.itemcode;\r\n }\r\n if (this.itemCode) {\r\n\r\n this.uuid = null;\r\n console.debug(\"SprRecordingFile: \"+this.itemCode+ \" UUID: \"+this.uuid)\r\n } else {\r\n this.itemCode = null;\r\n this.uuid = this._recordingFile?.uuid;\r\n console.debug(\"RecordingFile: \"+this.itemCode+ \" UUID: \"+this.uuid)\r\n }\r\n }else{\r\n this.itemCode=null;\r\n this.uuid=null;\r\n }\r\n }\r\n\r\n itemCode:string|null=null;\r\n uuid:string|null|undefined=null;\r\n\r\n recordingAsPlainText(){\r\n let t=null;\r\n if(this._recordingFile) {\r\n t = RecordingFileUtil.recordingAsPlainText(this._recordingFile);\r\n }\r\n return t;\r\n }\r\n}\r\n","import {Component, Input, OnInit, ViewChild} from '@angular/core';\r\nimport {Action} from \"../../../action/action\";\r\n\r\n@Component({\r\n selector: 'app-recording-file-navi',\r\n template: `\r\n <div #controlPanel style=\"display:flex;flex-direction: row;\">\r\n <div #navi style=\"flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap\">\r\n <fieldset>\r\n <legend>Versions</legend>\r\n <mat-progress-spinner *ngIf=\"naviInfoLoading\" mode=\"indeterminate\" [diameter]=\"15\"></mat-progress-spinner>\r\n <select *ngIf=\"!naviInfoLoading\" [disabled]=\"versions==null || versions.length==1\" (change)=\"selectVersionChange($event)\">\r\n <option *ngFor=\"let v of versions; let i = index\" [selected]=\"v===version\" value=\"{{v}}\">{{v}}<span *ngIf=\"i==0\"> (latest)</span></option>\r\n </select>\r\n </fieldset>\r\n <fieldset>\r\n <legend>Navigate</legend>\r\n <mat-progress-spinner *ngIf=\"naviInfoLoading\" mode=\"indeterminate\" [diameter]=\"15\"></mat-progress-spinner>\r\n <div *ngIf=\"!naviInfoLoading\" style=\"flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap\">\r\n <button (click)=\"firstAction?.perform()\" [disabled]=\"!firstAction || firstAction?.disabled\" matTooltip=\"First recording file\">\r\n <mat-icon>first_page</mat-icon>\r\n </button>\r\n <button (click)=\"prevAction?.perform()\" [disabled]=\"!prevAction || prevAction?.disabled\" matTooltip=\"Previous recording file\">\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n <button (click)=\"nextAction?.perform()\" [disabled]=\"!nextAction || nextAction?.disabled\" matTooltip=\"Next recording file\">\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n <button (click)=\"lastAction?.perform()\" [disabled]=\"!lastAction || lastAction?.disabled\" matTooltip=\"Last recording file\">\r\n <mat-icon>last_page</mat-icon>\r\n </button>\r\n </div>\r\n <p *ngIf=\"items && itemPos!==null && itemPos!==undefined\">Item {{itemPos+1}} of {{items}}</p>\r\n <p>(List ordered by date)</p>\r\n </fieldset>\r\n </div>\r\n </div>\r\n `,\r\n styles: [\r\n `:host {\r\n flex: 0;\r\n\r\n }`]\r\n})\r\nexport class RecordingFileNaviComponent implements OnInit {\r\n @Input() firstAction: Action<void>|undefined;\r\n @Input() prevAction: Action<void>|undefined;\r\n @Input() nextAction: Action<void>|undefined;\r\n @Input() lastAction: Action<void>|undefined;\r\n @Input() items:number | null|undefined;\r\n @Input() itemPos:number | null|undefined;\r\n @Input() selectVersion: Action<number>|undefined;\r\n @Input() versions: Array<number>|null=null;\r\n @Input() version: number|null=null;\r\n\r\n @Input() naviInfoLoading=false;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n selectVersionChange(ev:Event){\r\n //console.debug(\"Change event: \"+ev.target.value+ \", as Nr: \"+versionNr);\r\n\r\n const selEl = ev.target as HTMLSelectElement;\r\n let versionNr = parseInt(selEl.value);\r\n if(this.selectVersion) {\r\n this.selectVersion.perform(versionNr);\r\n }\r\n }\r\n\r\n}\r\n","import {\r\n Component,\r\n ViewChild,\r\n ChangeDetectorRef,\r\n AfterViewInit, Input, ElementRef, OnInit,\r\n} from '@angular/core'\r\n\r\n\r\nimport {ActivatedRoute, Params, Route, Router} from \"@angular/router\";\r\n\r\n\r\nimport {RecordingFileService} from \"./recordingfile-service\";\r\nimport {MatDialog} from \"@angular/material/dialog\";\r\nimport {AudioDisplayPlayer} from \"../../../audio/audio_player\";\r\n\r\nimport {AudioDisplayScrollPane} from \"../../../audio/ui/audio_display_scroll_pane\";\r\nimport {AudioContextProvider} from \"../../../audio/context\";\r\nimport {AudioClip} from \"../../../audio/persistor\";\r\nimport {Selection} from \"../../../audio/persistor\";\r\n\r\nimport {Action, ActionEvent} from \"../../../action/action\";\r\nimport {SessionService} from \"../session.service\";\r\nimport {RecordingService} from \"../../recordings/recordings.service\";\r\nimport {RecordingFile, SprRecordingFile} from \"../../recording\";\r\nimport {RecordingFileUtil} from \"./recording-file\";\r\n\r\n\r\nexport class ItemcodeIndex{\r\n [itemcode: string]: Array<SprRecordingFile>;\r\n}\r\n\r\n@Component({\r\n\r\n selector: 'app-audiodisplayplayer',\r\n\r\n template: `\r\n\r\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\r\n <div class=\"ctrlview\">\r\n <app-recording-file-meta [sessionId]=\"sessionId\" [recordingFile]=\"recordingFile\"></app-recording-file-meta>\r\n\r\n <audio-display-control [audioClip]=\"audioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [playStopAction]=\"playStopAction\"\r\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\r\n [zoomInAction]=\"zoomInAction\"\r\n [zoomOutAction]=\"zoomOutAction\"\r\n [zoomSelectedAction]=\"zoomSelectedAction\"\r\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\r\n <app-recording-file-navi [items]=\"availRecFiles?.length\" [itemPos]=\"posInList\" [version]=\"recordingFileVersion\" [versions]=\"versions\" [firstAction]=\"firstAction\" [prevAction]=\"prevAction\" [nextAction]=\"nextAction\" [lastAction]=\"lastAction\" [selectVersion]=\"toVersionAction\" [naviInfoLoading]=\"naviInfoLoading\"></app-recording-file-navi>\r\n </div>\r\n `,\r\n styles: [\r\n `:host {\r\n flex: 2;\r\n display: flex;\r\n flex-direction: column;\r\n min-height:0;\r\n overflow: hidden;\r\n padding: 20px;\r\n z-index: 5;\r\n box-sizing: border-box;\r\n background-color: white;\r\n }`,`\r\n .ctrlview{\r\n display: flex;\r\n flex-direction: row;\r\n\r\n }\r\n `,`\r\n audio-display-control{\r\n\r\n flex: 3;\r\n }\r\n `]\r\n\r\n})\r\nexport class RecordingFileViewComponent extends AudioDisplayPlayer implements OnInit,AfterViewInit {\r\n\r\n //protected _recordingFileId: string | number = null;\r\n\r\n sessionId: string | number | null= null;\r\n sessionIdFromRoute:string|null=null;\r\n\r\n availRecFiles!: Array<Array<SprRecordingFile>>;\r\n versions: Array<number>|null=null;\r\n\r\n recordingFile: SprRecordingFile|null=null;\r\n recordingFileVersion:number|null=null;\r\n private routedByQueryParam=false;\r\n posInList: number|null=null;\r\n\r\n\r\n @ViewChild(AudioDisplayScrollPane)\r\n private ac!: AudioDisplayScrollPane;\r\n\r\n firstAction: Action<void>;\r\n prevAction: Action<void>;\r\n nextAction: Action<void>;\r\n lastAction: Action<void>;\r\n toVersionAction: Action<number>;\r\n\r\n naviInfoLoading=false;\r\n\r\n constructor(protected recordingFileService: RecordingFileService, protected recordingService: RecordingService, protected sessionService: SessionService, protected router:Router,protected route: ActivatedRoute, protected ref: ChangeDetectorRef, protected eRef: ElementRef, protected dialog: MatDialog) {\r\n super(route, ref, eRef)\r\n this.parentE = this.eRef.nativeElement;\r\n this.firstAction = new Action<void>('First');\r\n this.firstAction.onAction= ()=>{\r\n this.posInList=0;\r\n this.navigateToRecordingFile();\r\n }\r\n this.prevAction = new Action<void>('Previous');\r\n this.prevAction.onAction= ()=>this.prevFile();\r\n this.nextAction = new Action<void>('Next');\r\n this.nextAction.onAction= ()=>this.nextFile();\r\n this.lastAction = new Action<void>('Last');\r\n this.lastAction.onAction= ()=>{\r\n if(this.availRecFiles) {\r\n this.posInList = this.availRecFiles.length - 1;\r\n this.navigateToRecordingFile();\r\n }\r\n }\r\n\r\n this.toVersionAction=new Action<number>('To version');\r\n this.toVersionAction.onAction= (ae)=>this.toVersion(ae);\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n super.ngAfterViewInit()\r\n this.route.queryParams.subscribe((params: Params) => {\r\n let rfIdP = params['recordingFileId'];\r\n let sIdP = params['sessionId'];\r\n if (sIdP) {\r\n this.sessionIdFromRoute=sIdP;\r\n }\r\n if (rfIdP) {\r\n this.routedByQueryParam=true;\r\n this.loadRecFile(rfIdP);\r\n }\r\n });\r\n this.route.params.subscribe((params: Params) => {\r\n let rfIdP = params['recordingFileId'];\r\n let sIdP = params['sessionId'];\r\n if (sIdP) {\r\n this.sessionIdFromRoute=sIdP;\r\n }\r\n if (rfIdP) {\r\n this.routedByQueryParam=false;\r\n this.loadRecFile(rfIdP);\r\n }\r\n });\r\n // if(this.sessionId){\r\n // this.loadSession(this.sessionId);\r\n // }\r\n }\r\n\r\n\r\n private navigateToId(rfId:number| string){\r\n\r\n if(this.routedByQueryParam){\r\n this.router.navigate([], {relativeTo: this.route, queryParams:{'recordingFileId':rfId}})\r\n }else {\r\n this.router.navigate(['../' + rfId], {relativeTo: this.route});\r\n }\r\n }\r\n\r\n private navigateToRecordingFile(){\r\n if(this.posInList!=null) {\r\n let latestNextRf = this.availRecFiles[this.posInList][0];\r\n let lnRfId = latestNextRf.recordingFileId;\r\n if(lnRfId) {\r\n this.navigateToId(lnRfId);\r\n }\r\n }\r\n }\r\n\r\n toVersion(ae: ActionEvent<number>) {\r\n let toRfId = null;\r\n let version = ae.value;\r\n if(this.posInList!=null) {\r\n let cRfs = this.availRecFiles[this.posInList];\r\n let availVersionCnt = cRfs.length;\r\n for (let cRf of cRfs) {\r\n if(cRf.version !=null) {\r\n if (cRf.version === version) {\r\n toRfId = cRf.recordingFileId;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (toRfId != null) {\r\n this.navigateToId(toRfId);\r\n }\r\n }\r\n\r\n\r\n prevFile() {\r\n if(this.posInList!=null) {\r\n this.posInList--;\r\n }\r\n this.navigateToRecordingFile()\r\n }\r\n nextFile() {\r\n if(this.posInList!=null) {\r\n this.posInList++;\r\n }\r\n this.navigateToRecordingFile()\r\n }\r\n\r\n private positionInList():number | null{\r\n if (this.availRecFiles && this.recordingFile) {\r\n let cic=this.recordingFile.itemCode;\r\n if(!cic && this.recordingFile.recording && this.recordingFile.recording.itemcode){\r\n cic=this.recordingFile.recording.itemcode;\r\n }\r\n if (cic) {\r\n let itemCnt = this.availRecFiles.length\r\n for (let rfdi = 0; rfdi < itemCnt; rfdi++) {\r\n let arRf = this.availRecFiles[rfdi][0];\r\n if (arRf.recording) {\r\n let ar = arRf.recording;\r\n if (cic === ar.itemcode) {\r\n return rfdi;\r\n }\r\n }\r\n }\r\n }else{\r\n let itemCnt = this.availRecFiles.length\r\n for (let rfdi = 0; rfdi < itemCnt; rfdi++) {\r\n let arRf = this.availRecFiles[rfdi][0];\r\n if (this.recordingFile.uuid === arRf.uuid) {\r\n return rfdi;\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private updatePos(){\r\n this.posInList=this.positionInList();\r\n this.toVersionAction.disabled=true;\r\n if(this.availRecFiles){\r\n let avRfsLen=this.availRecFiles.length;\r\n if(this.posInList !=null && avRfsLen>this.posInList) {\r\n let arfs = this.availRecFiles[this.posInList];\r\n if (arfs) {\r\n this.versions = new Array<number>();\r\n for (let arf of arfs) {\r\n if(arf.recording?.itemcode) {\r\n this.versions.push(arf.version)\r\n }\r\n }\r\n\r\n this.toVersionAction.disabled=(this.versions.length<2);\r\n }\r\n }\r\n }\r\n\r\n if(this.recordingFile){\r\n if(this.recordingFile.version){\r\n this.recordingFileVersion=this.recordingFile.version;\r\n }else{\r\n this.recordingFileVersion=0;\r\n }\r\n }else{\r\n this.recordingFileVersion=null;\r\n }\r\n this.updateActions()\r\n }\r\n\r\n protected loadRecFile(rfId:number | string) {\r\n this.ap?.stop();\r\n this.audioClip =null;\r\n this.recordingFile=null;\r\n this.posInList=null;\r\n this.updateActions();\r\n let audioContext = AudioContextProvider.audioContextInstance();\r\n if(audioContext) {\r\n this.recordingFileService.fetchSprRecordingFile(audioContext, rfId).subscribe(value => {\r\n this.status = 'Audio file loaded.';\r\n let clip = null;\r\n this.recordingFile = value;\r\n if (this.recordingFile) {\r\n let ab = this.recordingFile.audioBuffer;\r\n if (ab) {\r\n clip = new AudioClip(ab);\r\n\r\n let esffsr = null;\r\n let eeffsr = null;\r\n let esr = null;\r\n\r\n if (clip.buffer != null) {\r\n esr = ab.sampleRate;\r\n if (esr != null) {\r\n esffsr = RecordingFileUtil.editStartFrameForSampleRate(this.recordingFile, esr);\r\n eeffsr = RecordingFileUtil.editEndFrameForSampleRate(this.recordingFile, esr);\r\n }\r\n let sel: Selection | null = null;\r\n if (esffsr != null) {\r\n if (eeffsr != null) {\r\n sel = new Selection(ab.sampleRate, esffsr, eeffsr);\r\n } else {\r\n let ch0 = ab.getChannelData(0);\r\n let frameLength = ch0.length;\r\n sel = new Selection(esr, esffsr, frameLength);\r\n }\r\n } else if (eeffsr != null) {\r\n sel = new Selection(esr, 0, eeffsr);\r\n }\r\n clip.selection = sel\r\n }\r\n }\r\n }\r\n this.audioClip = clip\r\n this.loadedRecfile();\r\n\r\n }, error1 => {\r\n this.status = 'Error loading audio file!';\r\n });\r\n }\r\n }\r\n\r\n protected loadedRecfile() {\r\n if(this.recordingFile && !this.sessionId) {\r\n let sId=this.recordingFile.session\r\n if(!sId){\r\n sId=this.sessionIdFromRoute;\r\n }\r\n if (sId) {\r\n this.loadSession(sId);\r\n }\r\n }\r\n\r\n this.updatePos();\r\n this.ref.detectChanges();\r\n }\r\n\r\n private updateActions(){\r\n let itemCnt:number|null=null;\r\n if(this.availRecFiles) {\r\n itemCnt = this.availRecFiles.length;\r\n }\r\n this.firstAction.disabled=(this.posInList==null || this.posInList == 0);\r\n this.prevAction.disabled=(this.posInList==null || this.posInList == 0);\r\n this.nextAction.disabled=(this.posInList==null || itemCnt==null || this.posInList >= itemCnt - 1);\r\n this.lastAction.disabled=(this.posInList==null || itemCnt==null || this.posInList >= itemCnt - 1);\r\n }\r\n\r\n private loadSession(sessionId: string| number) {\r\n // load session and recording file meta data only when on init and when session changes\r\n if (<string>sessionId != <string>this.sessionId) {\r\n // tell UI that we are working...\r\n this.naviInfoLoading=true;\r\n this.sessionService.sessionObserver(<string>sessionId).subscribe((s) => {\r\n // received session data\r\n this.sessionId = s.sessionId;\r\n // fetch recording file meta data list\r\n this.recordingService.sprRecordingFileList(s.project, s.sessionId).subscribe((rfds) => {\r\n this.availRecFiles = new Array<Array<SprRecordingFile>>();\r\n // build structure indexed by itemcode\r\n let icIdx = new ItemcodeIndex();\r\n for (let rfdi = 0; rfdi < rfds.length; rfdi++) {\r\n let rfd = rfds[rfdi];\r\n if (rfd.date) {\r\n // convert date string for faster sorting later\r\n let rfdd = new Date(rfd.date);\r\n rfd._dateAsDateObj = rfdd;\r\n }\r\n let ic = rfd.itemCode;\r\n\r\n if (!ic) {\r\n let r = rfd.recording;\r\n if (r && r.itemcode) {\r\n ic = r.itemcode;\r\n }\r\n }\r\n if (ic) {\r\n let exRfsForIc = icIdx[ic];\r\n if (exRfsForIc == null) {\r\n // itemcode not yet stored\r\n let arfd = new Array<SprRecordingFile>();\r\n arfd.push(rfd);\r\n icIdx[ic] = arfd;\r\n this.availRecFiles.push(arfd);\r\n } else {\r\n // rec file with itemcode already exists, add (push) this version ...\r\n exRfsForIc.push(rfd);\r\n // .. and sort latest version (highest version number) to lowest index\r\n exRfsForIc.sort((rfd1, rfd2) => {\r\n return rfd2.version - rfd1.version;\r\n })\r\n }\r\n\r\n } else {\r\n let arfd = new Array<SprRecordingFile>();\r\n arfd.push(rfd);\r\n this.availRecFiles.push(arfd);\r\n }\r\n }\r\n // have unsorted itemcode indexed recording files here\r\n // sort them ordered by date of latest version ascending\r\n this.availRecFiles.sort((rfs1, rfs2) => {\r\n let d1 = rfs2[0]._dateAsDateObj;\r\n let d2 = rfs1[0]._dateAsDateObj;\r\n if (d1 == null) {\r\n if (d2 == null) {\r\n return 0;\r\n } else {\r\n // Sort entries whose dates are not set to the end\r\n return -1;\r\n }\r\n } else {\r\n if (d2 == null) {\r\n // Sort entries whose dates are not set to the end\r\n return 1;\r\n } else {\r\n // Compare date by time in milliseconds value\r\n return d2.getTime() - d1.getTime();\r\n }\r\n }\r\n });\r\n for(let avRf of this.availRecFiles){\r\n if(avRf[0] && avRf[0].recording) {\r\n let os = avRf[0].recording.itemcode + ': versions: ';\r\n for (let avRfV of avRf) {\r\n os += avRfV.version + '/';\r\n }\r\n console.debug(os);\r\n }\r\n }\r\n this.updatePos()\r\n this.naviInfoLoading=false;\r\n this.ref.detectChanges();\r\n });\r\n });\r\n }\r\n }\r\n}\r\n\r\n","import {\r\n Component,\r\n ChangeDetectorRef,\r\n AfterViewInit,\r\n ElementRef\r\n} from '@angular/core'\r\n\r\n\r\nimport {ActivatedRoute, Router} from \"@angular/router\";\r\nimport {RecordingFileService} from \"./recordingfile-service\";\r\nimport {MatDialog} from \"@angular/material/dialog\";\r\nimport {Selection} from \"../../../audio/persistor\";\r\nimport {MessageDialog} from \"../../../ui/message_dialog\";\r\nimport {Action} from \"../../../action/action\";\r\nimport {RecordingFileViewComponent} from \"./recording-file-view.component\";\r\nimport {SessionService} from \"../session.service\";\r\nimport {RecordingService} from \"../../recordings/recordings.service\";\r\nimport {MatSnackBar} from \"@angular/material/snack-bar\";\r\n\r\n@Component({\r\n\r\n selector: 'app-audiodisplayplayer',\r\n\r\n template: `\r\n <h1>Recording file editing</h1>\r\n <p>On export or delivery the editing selection of the recording file is cut out. If no editing selection is applied the original file is exported.</p>\r\n\r\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\r\n <div class=\"ctrlview\">\r\n <app-recording-file-meta [sessionId]=\"sessionId\" [recordingFile]=\"recordingFile\"></app-recording-file-meta>\r\n <audio-display-control [audioClip]=\"audioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [playStopAction]=\"playStopAction\"\r\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\r\n [zoomInAction]=\"zoomInAction\"\r\n [zoomOutAction]=\"zoomOutAction\"\r\n [zoomSelectedAction]=\"zoomSelectedAction\"\r\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\r\n <app-recording-file-navi [items]=\"availRecFiles?.length\" [itemPos]=\"posInList\" [version]=\"recordingFileVersion\" [versions]=\"versions\" [firstAction]=\"firstAction\" [prevAction]=\"prevAction\" [nextAction]=\"nextAction\" [lastAction]=\"lastAction\" [selectVersion]=\"toVersionAction\" [naviInfoLoading]=\"naviInfoLoading\"></app-recording-file-navi>\r\n </div>\r\n\r\n <button mat-raised-button color=\"accent\" (click)=\"applySelection()\" [disabled]=\"editSaved\">{{this.applyButtonText()}}</button>\r\n `,\r\n styles: [\r\n `:host {\r\n flex: 2;\r\n display: flex;\r\n flex-direction: column;\r\n min-height:0;\r\n overflow: hidden;\r\n padding: 20px;\r\n z-index: 5;\r\n box-sizing: border-box;\r\n background-color: white;\r\n }`,`\r\n .ctrlview{\r\n display: flex;\r\n flex-direction: row;\r\n }\r\n `,`\r\n audio-display-control{\r\n\r\n flex: 3;\r\n }\r\n `]\r\n\r\n})\r\nexport class RecordingFileUI extends RecordingFileViewComponent implements AfterViewInit {\r\n\r\n savedEditSelection:Selection|null=null;\r\n editSaved:boolean=true\r\n\r\n constructor(protected recordingFileService:RecordingFileService,protected recordingService:RecordingService,protected sessionService:SessionService,protected router:Router,protected route: ActivatedRoute, protected ref: ChangeDetectorRef,protected eRef:ElementRef, protected dialog:MatDialog,private snackBar: MatSnackBar) {\r\n super(recordingFileService,recordingService,sessionService,router,route,ref,eRef,dialog)\r\n this.parentE=this.eRef.nativeElement;\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n super.ngAfterViewInit()\r\n }\r\n\r\n applyButtonText():string {\r\n if(this.audioClip) {\r\n let s = this.audioClip.selection\r\n if (s) {\r\n return \"Apply current selection as editing selection\";\r\n }else{\r\n return \"Cancel out editing selection\";\r\n }\r\n }\r\n // just as fallback\r\n return \"Apply selection\";\r\n }\r\n\r\n protected loadRecFile(rfId:number | string) {\r\n this.editSaved = true;\r\n super.loadRecFile(rfId);\r\n }\r\n\r\nprotected loadedRecfile() {\r\n super.loadedRecfile();\r\n if(this.audioClip) {\r\n this.audioClip.addSelectionObserver((clip) => {\r\n let s = clip.selection\r\n this.editSaved = ((this.savedEditSelection == null && s == null) || this.savedEditSelection != null && this.savedEditSelection.equals(s))\r\n });\r\n }\r\n this.savedEditSelection = this.audioClip?this.audioClip.selection:null;\r\n this.editSaved = true\r\n}\r\n\r\n applySelection(){\r\n if(this.audioClip) {\r\n let ab=this.audioClip.buffer;\r\n let s = this.audioClip.selection\r\n if (ab && this.recordingFile?.recordingFileId) {\r\n\r\n let sr= null;\r\n let sf=null;\r\n let ef=null;\r\n if(s) {\r\n sr= ab.sampleRate;\r\n sf = s.startFrame;\r\n ef = s.endFrame;\r\n }\r\n this.recordingFileService.saveEditSelection(this.recordingFile.recordingFileId, sr, sf, ef).subscribe((value) => {\r\n },\r\n () => {\r\n this.dialog.open(MessageDialog, {\r\n\r\n data: {\r\n type: 'error',\r\n title: 'Save selection edit error',\r\n msg: \"Could not save edit selection to WikiSpeech server!\",\r\n advice: \"Please check network connection and server state.\"\r\n }\r\n })\r\n },\r\n () => {\r\n // Or use returned selection value from server?\r\n this.savedEditSelection = s\r\n this.editSaved = true\r\n this.snackBar.open('Selection edit saved successfully.', 'OK', {duration: 1500})\r\n });\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n","\r\n export class MediaUtils {\r\n\r\n static toMediaTime(timeInSeconds:number):string{\r\n let rest=timeInSeconds;\r\n let hours=Math.floor(timeInSeconds/3600);\r\n rest-=hours*3600;\r\n let minutes=Math.floor(rest/60);\r\n rest-=minutes*60;\r\n let seconds=Math.floor(rest);\r\n rest-=seconds;\r\n let millis=Math.round(rest*1000);\r\n return hours.toString().padStart(2,'0')+':'+minutes.toString().padStart(2,'0')+':'+seconds.toString().padStart(2,'0')+'.'+millis.toString().padStart(3,'0');\r\n }\r\n }\r\n","import {AfterViewInit, Component, EventEmitter, Input, Output} from \"@angular/core\";\r\nimport {RecordingFile, SprRecordingFile} from \"../recording\";\r\nimport {MediaUtils} from \"../../media/utils\";\r\nimport {MatTable, MatTableDataSource} from \"@angular/material/table\";\r\nimport {Observable, Subject} from \"rxjs\";\r\n\r\n@Component({\r\n\r\n selector: 'app-recordinglist',\r\n\r\n template: `\r\n <mat-card>\r\n <mat-card-header>\r\n <h2>Recording list</h2>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <table mat-table [dataSource]=\"recordingListDataSource\" class=\"mat-elevation-z0\">\r\n <tr mat-header-row *matHeaderRowDef=\"cols;sticky:true\"></tr>\r\n <tr mat-row *matRowDef=\"let element; columns: cols;\" [scrollIntoViewToBottom]=\"element.uuid===selectedRecordingFile?.uuid\"></tr>\r\n <ng-container matColumnDef=\"index\">\r\n <th mat-header-cell *matHeaderCellDef mat-header>#</th>\r\n <td mat-cell class=\"monospaced\" *matCellDef=\"let element;let i = index\">{{recordingListDataSource.data.length-i}}</td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"startedDate\">\r\n <th mat-header-cell *matHeaderCellDef mat-header>Started</th>\r\n <td mat-cell class=\"monospaced\" *matCellDef=\"let element\">{{element.startedDate | date:'YYYY-MM-dd HH:mm:ss'}}</td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"length\">\r\n <th mat-header-cell *matHeaderCellDef mat-header>Length</th>\r\n <td mat-cell class=\"monospaced\" *matCellDef=\"let element\">{{lengthTimeFormatted(element)}}</td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"action\">\r\n <th mat-header-cell *matHeaderCellDef>Action</th>\r\n <td mat-cell *matCellDef=\"let element\"><button mat-stroked-button color=\"primary\" (click)=\"selectRecordingFile(element)\" [disabled]=\"selectDisabled || element.uuid===selectedRecordingFile?.uuid\"><mat-icon>edit_attributes</mat-icon> Select</button></td>\r\n </ng-container>\r\n </table>\r\n </mat-card-content>\r\n </mat-card>\r\n\r\n `,\r\n styles: [`:host {\r\n position: relative;\r\n margin: 0;\r\n padding: 0;\r\n background: lightgrey;\r\n width: 100%; /* use all horizontal available space */\r\n flex: 1; /* ... and fill rest of vertical available space (other components have flex 0) */\r\n overflow-y: auto;\r\n\r\n /* Workaround for Firefox\r\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\r\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\r\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\r\n */\r\n min-height: 0px;\r\n\r\n }`,`\r\n .selected{\r\n font-weight: bold;\r\n }\r\n `],\r\n styleUrls: ['../../speechrecorder_mat.scss']\r\n\r\n})\r\nexport class RecordingList implements AfterViewInit{\r\n private recordingList:Array<RecordingFile>=new Array<RecordingFile>();\r\n //recordingListSubject:Subject<Array<RecordingFile>> = new Subject<Array<RecordingFile>>();\r\n recordingListDataSource:MatTableDataSource<RecordingFile>;\r\n //cols=['index','length','samples','samplerate','action'];\r\n cols=['index','startedDate','length','action'];\r\n @Input() selectDisabled:boolean=false;\r\n @Output() selectedRecordingFileChanged = new EventEmitter<RecordingFile>();\r\n @Input() selectedRecordingFile:RecordingFile|null=null;\r\n\r\n constructor() {\r\n this.recordingListDataSource=new MatTableDataSource<RecordingFile>();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.buildDataSource();\r\n }\r\n\r\n private buildDataSource(){\r\n this.recordingList.sort((a, b) => {\r\n let cmp:number=0;\r\n let aD:Date|null=null;\r\n let bD:Date|null=null;\r\n if(a._startedAsDateObj && b._startedAsDateObj){\r\n aD=a._startedAsDateObj\r\n bD=b._startedAsDateObj\r\n }else if(a.startedDate && b.startedDate){\r\n aD=new Date(a.startedDate);\r\n bD=new Date(b.startedDate);\r\n }else if(a.date && b.date) {\r\n aD=new Date(a.date);\r\n bD=new Date(b.date);\r\n }\r\n if(aD!==null && bD!==null){\r\n cmp=bD.getTime()-aD.getTime();\r\n }\r\n return cmp;\r\n });\r\n this.recordingListDataSource.data=this.recordingList;\r\n }\r\n\r\n push(rf:RecordingFile){\r\n this.recordingList.push(rf);\r\n this.buildDataSource();\r\n }\r\n\r\n selectRecordingFile(rf:RecordingFile){\r\n this.selectedRecordingFileChanged.emit(rf);\r\n }\r\n\r\n selectTop() {\r\n if (this.recordingList.length > 0) {\r\n this.selectRecordingFile(this.recordingList[0]);\r\n }\r\n }\r\n\r\n lengthTimeFormatted(rf:RecordingFile){\r\n let str='--:--:--';\r\n if(rf.frames && rf.audioBuffer) {\r\n str=MediaUtils.toMediaTime(rf.frames / rf.audioBuffer?.sampleRate);\r\n }\r\n return str;\r\n }\r\n}\r\n","import {AfterViewInit, Component, EventEmitter, Input, Output, ViewChild} from \"@angular/core\";\r\nimport {RecordingFile, SprRecordingFile} from \"../recording\";\r\nimport {MediaUtils} from \"../../media/utils\";\r\nimport {MatTable, MatTableDataSource} from \"@angular/material/table\";\r\nimport {Observable, Subject} from \"rxjs\";\r\nimport {RecordingList} from \"./recording_list\";\r\nimport {AudioClip} from \"../../audio/persistor\";\r\nimport {Action} from \"../../action/action\";\r\nimport {AudioDisplay} from \"../../audio/audio_display\";\r\n\r\n@Component({\r\n\r\n selector: 'app-recordercombipane',\r\n\r\n template: `\r\n <div class=\"scrollList\">\r\n <app-recordinglist [selectedRecordingFile]=\"selectedRecordingFile\" [selectDisabled]=\"selectDisabled\" (selectedRecordingFileChanged)=\"selectRecordingFile($event)\"></app-recordinglist>\r\n </div>\r\n <div class=\"collapsable\" fxHide.xs #asCt [class.active]=\"!audioSignalCollapsed\">\r\n <app-audiodisplay #audioSignalContainer [class.active]=\"!audioSignalCollapsed\"\r\n [audioClip]=\"displayAudioClip\"\r\n [playStartAction]=\"playStartAction\"\r\n [playSelectionAction]=\"playSelectionAction\"\r\n [autoPlayOnSelectToggleAction]=\"autoPlayOnSelectToggleAction\"\r\n [playStopAction]=\"playStopAction\"></app-audiodisplay>\r\n </div>\r\n `,\r\n styles: [`:host {\r\n background-color: yellow;\r\n position: relative;\r\n margin: 0;\r\n padding: 0;\r\n background: lightgrey;\r\n width: 100%; /* use all horizontal available space */\r\n flex: 1; /* ... and fill rest of vertical available space (other components have flex 0) */\r\n /* Workaround for Firefox\r\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\r\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\r\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\r\n */\r\n min-height: 0px;\r\n\r\n }`,`.scrollList{\r\n margin: 0;\r\n padding: 0;\r\n background: lightgrey;\r\n width: 100%; \r\n height: 100%;\r\n overflow-y: auto;\r\n }`, `\r\n .collapsable {\r\n display: none;\r\n position: absolute;\r\n z-index: 5;\r\n }`, `\r\n .collapsable.active {\r\n display: flex;\r\n position: absolute;\r\n bottom: 0px;\r\n height: 90%;\r\n width: 100%;\r\n overflow: hidden;\r\n padding: 0px;\r\n z-index: 200; /* Needs a higher value then the sticky Material table header (which is z-index: 100) */\r\n box-sizing: border-box;\r\n background-color: rgba(0, 0, 0, 0)\r\n }`],\r\n styleUrls: ['../../speechrecorder_mat.scss']\r\n\r\n})\r\nexport class RecorderCombiPane implements AfterViewInit{\r\n\r\n @ViewChild(RecordingList) recordingListComp!:RecordingList;\r\n @Input() selectDisabled:boolean=false;\r\n @Output() selectedRecordingFileChanged = new EventEmitter<RecordingFile>();\r\n @Input() selectedRecordingFile:RecordingFile|null=null;\r\n\r\n @ViewChild(AudioDisplay, { static: true }) audioDisplay!: AudioDisplay;\r\n @Input() audioSignalCollapsed: boolean=true;\r\n @Input() displayAudioClip: AudioClip | null=null;\r\n @Input() playStartAction: Action<void>|undefined;\r\n @Input() playSelectionAction: Action<void>|undefined;\r\n @Input() autoPlayOnSelectToggleAction:Action<boolean>|undefined;\r\n @Input() playStopAction: Action<void>|undefined;\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n }\r\n\r\n push(rf:RecordingFile){\r\n this.recordingListComp.push(rf);\r\n\r\n }\r\n\r\n selectRecordingFile(rf:RecordingFile){\r\n this.selectedRecordingFileChanged.emit(rf);\r\n }\r\n\r\n selectTop() {\r\n this.recordingListComp.selectTop();\r\n }\r\n\r\n}\r\n","import {AudioCapture, AudioCaptureListener} from '../../audio/capture/capture';\r\nimport {AudioPlayer, AudioPlayerEvent, EventType} from '../../audio/playback/player'\r\nimport {WavWriter} from '../../audio/impl/wavwriter'\r\nimport {RecordingFile, RecordingFileDescriptorImpl, SprRecordingFile} from '../recording'\r\nimport {\r\n Component, ViewChild, ChangeDetectorRef, Inject,\r\n AfterViewInit, HostListener, OnDestroy, Input, Renderer2\r\n} from \"@angular/core\";\r\nimport {SessionService} from \"./session.service\";\r\nimport { MatDialog } from \"@angular/material/dialog\";\r\nimport {SpeechRecorderUploader} from \"../spruploader\";\r\nimport {SPEECHRECORDER_CONFIG, SpeechRecorderConfig} from \"../../spr.config\";\r\nimport {Session} from \"./session\";\r\nimport { Project, ProjectUtil} from \"../project/project\";\r\nimport {SequenceAudioFloat32ChunkerOutStream} from \"../../audio/io/stream\";\r\nimport {MessageDialog} from \"../../ui/message_dialog\";\r\nimport {RecordingService} from \"../recordings/recordings.service\";\r\n\r\nimport {AudioContextProvider} from \"../../audio/context\";\r\nimport {AudioClip} from \"../../audio/persistor\";\r\n\r\nimport {Upload, UploaderStatus, UploaderStatusChangeEvent} from \"../../net/uploader\";\r\nimport {ActivatedRoute, Params} from \"@angular/router\";\r\nimport {ProjectService} from \"../project/project.service\";\r\nimport {UUID} from \"../../utils/utils\";\r\nimport {LevelBar} from \"../../audio/ui/livelevel\";\r\nimport {RecorderCombiPane} from \"./recorder_combi_pane\";\r\nimport {BasicRecorder, LEVEL_BAR_INTERVALL_SECONDS, MAX_RECORDING_TIME_MS, RECFILE_API_CTX} from \"./basicrecorder\";\r\n\r\n\r\nexport const enum Status {\r\n BLOCKED, IDLE, RECORDING, STOPPING_STOP, ERROR\r\n}\r\n\r\nexport class Item {\r\n promptAsString: string;\r\n training: boolean;\r\n recs: Array<RecordingFile> | null;\r\n\r\n constructor(promptAsString: string, training: boolean) {\r\n this.promptAsString = promptAsString;\r\n this.training = training;\r\n this.recs = null;\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'app-audiorecorder',\r\n providers: [SessionService],\r\n template: `\r\n <app-warningbar [show]=\"isTestSession()\" warningText=\"Test recording only!\"></app-warningbar>\r\n <app-warningbar [show]=\"isDefaultAudioTestSession()\"\r\n warningText=\"This test uses default audio device! Regular sessions may require a particular audio device (microphone)!\"></app-warningbar>\r\n <app-recordercombipane (selectedRecordingFileChanged)=\"selectRecordingFile($event)\"\r\n [audioSignalCollapsed]=\"audioSignalCollapsed\"\r\n [selectedRecordingFile]=\"displayRecFile\"\r\n [selectDisabled]=\"isActive()\"\r\n [displayAudioClip]=\"displayAudioClip\"\r\n [playStartAction]=\"controlAudioPlayer.startAction\"\r\n [playStopAction]=\"controlAudioPlayer.stopAction\"\r\n [playSelectionAction]=\"controlAudioPlayer.startSelectionAction\"\r\n [autoPlayOnSelectToggleAction]=\"controlAudioPlayer.autoPlayOnSelectToggleAction\"\r\n ></app-recordercombipane>\r\n\r\n <div fxLayout=\"row\" fxLayout.xs=\"column\" [ngStyle]=\"{'height.px':100,'min-height.px': 100}\"\r\n [ngStyle.xs]=\"{'height.px':125,'min-height.px': 125}\">\r\n <audio-levelbar fxFlex=\"1 0 1\" [streamingMode]=\"isRecording()\"\r\n [displayLevelInfos]=\"displayLevelInfos\"></audio-levelbar>\r\n <div fxLayout=\"row\">\r\n <spr-recordingitemcontrols fxFlex=\"10 0 1\"\r\n [audioLoaded]=\"displayAudioClip?.buffer!==null\"\r\n [playStartAction]=\"controlAudioPlayer?.startAction\"\r\n [playStopAction]=\"controlAudioPlayer?.stopAction\"\r\n [peakDbLvl]=\"peakLevelInDb\"\r\n [agc]=\"this.ac?.agcStatus\"\r\n (onShowRecordingDetails)=\"audioSignalCollapsed=!audioSignalCollapsed\">\r\n </spr-recordingitemcontrols>\r\n <app-uploadstatus class=\"ricontrols dark\" fxHide fxShow.xs fxFlex=\"0 0 0\" *ngIf=\"enableUploadRecordings\"\r\n [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processingRecording\"></app-uploadstatus>\r\n <app-readystateindicator class=\"ricontrols dark\" fxHide fxShow.xs fxFlex=\"0 0 0\"\r\n [ready]=\"dataSaved && !isActive()\"></app-readystateindicator>\r\n </div>\r\n </div>\r\n <div #controlpanel class=\"controlpanel\" fxLayout=\"row\">\r\n <app-sprstatusdisplay fxHide.xs fxFlex=\"30% 1 30%\" [statusMsg]=\"statusMsg\" [statusAlertType]=\"statusAlertType\"\r\n [statusWaiting]=\"statusWaiting\"\r\n class=\"hidden-xs\"></app-sprstatusdisplay>\r\n <div fxFlex=\"100% 0 100%\" class=\"startstop\">\r\n <div style=\"align-content: center\">\r\n <button (click)=\"startStopPerform()\" [disabled]=\"startDisabled() && stopDisabled()\" mat-raised-button class=\"bigbutton\">\r\n <mat-icon [style.color]=\"startStopNextIconColor()\" inline=\"true\">{{startStopNextIconName()}}</mat-icon>\r\n <span style=\"font-weight: bolder;font-size: 14px\">{{startStopNextName()}}</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div fxFlex=\"30% 1 30%\" >\r\n <div fxFlex=\"1 1 auto\"></div>\r\n <app-uploadstatus class=\"ricontrols\" fxHide.xs fxFlex=\"0 0 0\" *ngIf=\"enableUploadRecordings\"\r\n [value]=\"uploadProgress\"\r\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processingRecording\"></app-uploadstatus>\r\n <app-readystateindicator class=\"ricontrols\" fxHide.xs\r\n [ready]=\"dataSaved && !isActive()\"></app-readystateindicator>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`:host {\r\n flex: 2;\r\n background: lightgrey;\r\n display: flex; /* Vertical flex container: Bottom transport panel, above prompting panel */\r\n flex-direction: column;\r\n margin: 0;\r\n padding: 0;\r\n min-height: 0px;\r\n\r\n /* Prevents horizontal scroll bar on swipe right */\r\n overflow: hidden;\r\n }`,`.ricontrols {\r\n padding: 4px;\r\n box-sizing: border-box;\r\n height: 100%;\r\n }`,`.dark {\r\n background: darkgray;\r\n }`,`.controlpanel {\r\n align-content: center;\r\n align-items: center;\r\n margin: 0;\r\n padding: 20px;\r\n min-height: min-content; /* important */\r\n }`,`.startstop {\r\n width: 100%;\r\n text-align: center;\r\n align-content: center;\r\n align-items: center;\r\n }`,`.bigbutton {\r\n min-width: 70px;\r\n min-height: 50px;\r\n font-size: 50px;\r\n border-radius: 20px;\r\n }`\r\n ]\r\n})\r\nexport class AudioRecorder extends BasicRecorder implements AfterViewInit,OnDestroy, AudioCaptureListener {\r\n\r\n _project:Project|null=null;\r\n @Input() projectName:string|null=null;\r\n enableUploadRecordings: boolean = true;\r\n enableDownloadRecordings: boolean = false;\r\n status: Status = Status.BLOCKED;\r\n\r\n @ViewChild(RecorderCombiPane, { static: true }) recorderCombiPane!: RecorderCombiPane;\r\n @ViewChild(LevelBar, { static: true }) liveLevelDisplay!: LevelBar;\r\n\r\n @Input() dataSaved=true\r\n\r\n private startedDate:Date|null=null;\r\n private maxRecTimerId: number|null=null;\r\n private maxRecTimerRunning: boolean=false;\r\n private updateTimerId: any;\r\n\r\n startStopNextButtonName!:string;\r\n startStopNextButtonIconName!:string;\r\n\r\n audio: any;\r\n\r\n private _promptIndex:number|null=null;\r\n\r\n //items: Array<Item>|null=null;\r\n //selectedItemIdx: number;\r\n private _displayRecFile: RecordingFile | null=null;\r\n private displayRecFileVersion: number=0;\r\n\r\n\r\n\r\n constructor(private changeDetectorRef: ChangeDetectorRef,\r\n private route: ActivatedRoute,\r\n private renderer: Renderer2,\r\n public dialog: MatDialog,\r\n private projectService:ProjectService,\r\n protected sessionService:SessionService,\r\n private recFileService:RecordingService,\r\n private uploader: SpeechRecorderUploader,\r\n @Inject(SPEECHRECORDER_CONFIG) public config?: SpeechRecorderConfig) {\r\n super(dialog,sessionService);\r\n this.status = Status.IDLE;\r\n\r\n this.audio = document.getElementById('audio');\r\n\r\n if (this.config && this.config.enableUploadRecordings != null) {\r\n this.enableUploadRecordings = this.config.enableUploadRecordings;\r\n }\r\n if (this.config && this.config.enableDownloadRecordings != null) {\r\n this.enableDownloadRecordings = this.config.enableDownloadRecordings;\r\n }\r\n this.init();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.route.queryParams.subscribe((params: Params) => {\r\n if (params['sessionId']) {\r\n this.fetchSession(params['sessionId']);\r\n }\r\n });\r\n this.streamLevelMeasure.levelListener = this.liveLevelDisplay;\r\n this.streamLevelMeasure.peakLevelListener=(peakLvlInDb)=>{\r\n this.peakLevelInDb=peakLvlInDb;\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n }\r\n ngOnDestroy() {\r\n this.destroyed=true;\r\n // TODO stop capture /playback\r\n }\r\n\r\n private init() {\r\n\r\n this.transportActions.startAction.disabled = true;\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n this.playStartAction.disabled = true;\r\n\r\n let context:AudioContext|null=null;\r\n try {\r\n context = AudioContextProvider.audioContextInstance()\r\n } catch (err) {\r\n this.status = Status.ERROR;\r\n let errMsg = 'Unknown error';\r\n if(err instanceof Error){\r\n errMsg=err.message;\r\n }\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n }\r\n if(context) {\r\n console.info(\"State of audio context: \" + context.state)\r\n }else{\r\n console.info(\"No audio context available!\");\r\n }\r\n if (!context || !navigator.mediaDevices) {\r\n this.status = Status.ERROR;\r\n let errMsg = 'Browser does not support Media streams!';\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n } else {\r\n this.controlAudioPlayer = new AudioPlayer(context, this);\r\n this.ac = new AudioCapture(context);\r\n if (this.ac) {\r\n this.transportActions.startAction.onAction = () => this.startItem();\r\n this.ac.listener = this;\r\n this.ac.audioOutStream = new SequenceAudioFloat32ChunkerOutStream(this.streamLevelMeasure, LEVEL_BAR_INTERVALL_SECONDS);\r\n // Don't list the devices here. If we do not have audio permissions we only get anonymized devices without labels.\r\n //this.ac.listDevices();\r\n } else {\r\n this.transportActions.startAction.disabled = true;\r\n let errMsg = 'Browser does not support Media/Audio API!';\r\n this.statusMsg = 'ERROR: ' + errMsg;\r\n this.statusAlertType = 'error';\r\n this.dialog.open(MessageDialog, {\r\n data: {\r\n type: 'error',\r\n title: 'Error',\r\n msg: errMsg,\r\n advise: 'Please use a supported browser.',\r\n }\r\n });\r\n return;\r\n }\r\n this.transportActions.stopAction.onAction = () => this.stopItem();\r\n this.transportActions.nextAction.onAction = () => this.stopItem();\r\n //this.transportActions.pauseAction.onAction = () => this.pauseItem();\r\n\r\n this.playStartAction.onAction = () => this.controlAudioPlayer.start();\r\n\r\n }\r\n this.uploader.listener = (ue) => {\r\n this.uploadUpdate(ue);\r\n }\r\n}\r\n\r\n @HostListener('window:keypress', ['$event'])\r\n onKeyPress(ke: KeyboardEvent) {\r\n if (ke.key == ' ') {\r\n //this.transportActions.startAction.perform();\r\n //this.transportActions.nextAction.perform();\r\n }\r\n }\r\n\r\n @HostListener('window:keydown', ['$event'])\r\n onKeyDown(ke: KeyboardEvent) {\r\n if (ke.key == ' ') {\r\n if(!this.transportActions.startAction.disabled){\r\n this.transportActions.startAction.perform();\r\n }else if(!this.transportActions.stopAction.disabled) {\r\n this.transportActions.stopAction.perform();\r\n }\r\n }\r\n if (ke.key == 'p') {\r\n this.transportActions.pauseAction.perform();\r\n }\r\n if (ke.key == 'Escape') {\r\n if (!this.audioSignalCollapsed) {\r\n this.audioSignalCollapsed = true;\r\n }\r\n this.transportActions.stopAction.perform();\r\n this.transportActions.pauseAction.perform();\r\n }\r\n\r\n if (ke.key == 'MediaPlayPause') {\r\n this.playStartAction.perform();\r\n }\r\n if (ke.key === 'ArrowRight') {\r\n this.transportActions.fwdAction.perform();\r\n }\r\n if (ke.key === 'ArrowLeft') {\r\n this.transportActions.bwdAction.perform();\r\n }\r\n }\r\n\r\n isTestSession():boolean {\r\n return ((this._session!=null) && (this._session.type === 'TEST' || this._session.type==='TEST_DEF_A' || this._session.type === 'SINUS_TEST'));\r\n }\r\n\r\n isDefaultAudioTestSession():boolean {\r\n return ((this._session!=null) && (this._session.type==='TEST_DEF_A'));\r\n }\r\n\r\n isDefaultAudioTestSessionOverwriteingProjectRequirements():boolean {\r\n return ((this._session!=null) && (this._session.type==='TEST_DEF_A') && (this.audioDevices!=null) && this.audioDevices.length>0)\r\n }\r\n\r\n fetchSession(sessionId:string){\r\n\r\n\r\n //Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'statusMsg: Player initialized.'. Current value: 'statusMsg: Fetching session info...'.\r\n // params.subscribe seems not to be asynchronous\r\n\r\n // this.sm.statusAlertType='info';\r\n // this.sm.statusMsg = 'Fetching session info...';\r\n // this.sm.statusWaiting=true;\r\n let sessObs= this.sessionService.sessionObserver(sessionId);\r\n\r\n if(sessObs) {\r\n sessObs.subscribe(sess => {\r\n //this.setSession(sess);\r\n this.statusAlertType='info';\r\n this.statusMsg = 'Received session info.';\r\n this.statusWaiting=false;\r\n this.session=sess;\r\n if (sess.project) {\r\n //console.debug(\"Session associated project: \"+sess.project)\r\n this.projectService.projectObservable(sess.project).subscribe(project=>{\r\n this.project=project;\r\n this.fetchRecordings(sess);\r\n },reason =>{\r\n this.statusMsg=reason;\r\n this.statusAlertType='error';\r\n this.statusWaiting=false;\r\n console.error(\"Error fetching project config: \"+reason)\r\n });\r\n\r\n } else {\r\n console.info(\"Session has no associated project. Using default configuration.\")\r\n }\r\n },\r\n (reason) => {\r\n this.statusMsg = reason;\r\n this.statusAlertType = 'error';\r\n this.statusWaiting=false;\r\n console.error(\"Error fetching session \" + reason)\r\n });\r\n }\r\n }\r\n\r\n fetchRecordings(sess:Session){\r\n this.statusAlertType='info';\r\n this.statusMsg = 'Fetching infos of recordings...';\r\n this.statusWaiting=true;\r\n let prNm:string|null=null;\r\n if(this.project) {\r\n let rfsObs = this.recFileService.recordingFileList(this.project.name, sess.sessionId);\r\n rfsObs.subscribe((rfs: Array<RecordingFile>) => {\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Received infos of recordings.';\r\n this.statusWaiting = false;\r\n if (rfs) {\r\n if (rfs instanceof Array) {\r\n rfs.forEach((rf) => {\r\n if(rf.startedDate){\r\n rf._startedAsDateObj=new Date(rf.startedDate);\r\n }\r\n if(rf.date){\r\n rf._dateAsDateObj=new Date(rf.date);\r\n }\r\n this.recorderCombiPane.push(rf);\r\n })\r\n } else {\r\n console.error('Expected type array for list of already recorded files ')\r\n }\r\n\r\n } else {\r\n //console.debug(\"Recording file list: \" + rfs);\r\n }\r\n }, () => {\r\n // Failed fetching existing, but we start the session anyway\r\n this.start()\r\n }, () => {\r\n // Normal start\r\n this.start()\r\n })\r\n }else{\r\n // No project def -> error\r\n this.statusAlertType = 'error';\r\n this.statusMsg = 'No project definiton.';\r\n this.statusWaiting = false;\r\n console.error(this.statusMsg);\r\n }\r\n }\r\n\r\n\r\n set project(project: Project|null) {\r\n this._project = project;\r\n let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;\r\n\r\n if (project) {\r\n console.info(\"Project name: \" + project.name)\r\n this.audioDevices = project.audioDevices;\r\n chCnt = ProjectUtil.audioChannelCount(project);\r\n console.info(\"Project requested recording channel count: \" + chCnt);\r\n this.autoGainControlConfigs=project.autoGainControlConfigs;\r\n } else {\r\n console.error(\"Empty project configuration!\")\r\n }\r\n this.channelCount = chCnt;\r\n }\r\n\r\n get project():Project|null{\r\n return this._project;\r\n }\r\n\r\n selectRecordingFile(rf:RecordingFile){\r\n this.displayRecFile=rf;\r\n }\r\n\r\n uploadUpdate(ue: UploaderStatusChangeEvent) {\r\n let upStatus = ue.status;\r\n this.dataSaved = (UploaderStatus.DONE === upStatus);\r\n let percentUpl = ue.percentDone();\r\n if (UploaderStatus.ERR === upStatus) {\r\n this.uploadStatus = 'warn'\r\n } else {\r\n if (percentUpl < 50) {\r\n this.uploadStatus = 'accent'\r\n } else {\r\n this.uploadStatus = 'success'\r\n }\r\n this.uploadProgress = percentUpl;\r\n }\r\n\r\n this.changeDetectorRef.detectChanges()\r\n }\r\n\r\n set controlAudioPlayer(controlAudioPlayer: AudioPlayer) {\r\n if (this._controlAudioPlayer) {\r\n //this._controlAudioPlayer.listener=null;\r\n }\r\n this._controlAudioPlayer = controlAudioPlayer;\r\n if (this._controlAudioPlayer) {\r\n this._controlAudioPlayer.listener = this;\r\n }\r\n }\r\n\r\n get controlAudioPlayer(): AudioPlayer {\r\n return this._controlAudioPlayer;\r\n }\r\n\r\n update(e: AudioPlayerEvent) {\r\n if (e.type == EventType.STARTED) {\r\n this.playStartAction.disabled = true;\r\n this.updateTimerId = window.setInterval(() => {\r\n //this.audioSignal.playFramePosition = this.ap.playPositionFrames;\r\n }, 50);\r\n } else if (e.type == EventType.STOPPED || e.type == EventType.ENDED) {\r\n window.clearInterval(this.updateTimerId);\r\n // this.audioSignal.playFramePosition = this.ap.playPositionFrames;\r\n this.playStartAction.disabled = (!(this.displayRecFile));\r\n\r\n }\r\n }\r\n\r\n startDisabled() {\r\n return !this.transportActions || this.readonly || this.transportActions.startAction.disabled\r\n }\r\n\r\n stopDisabled() {\r\n return !this.transportActions || this.transportActions.stopAction.disabled\r\n }\r\n\r\n startStopNextName():string{\r\n if(!this.startDisabled()){\r\n this.startStopNextButtonName=\"Start\"\r\n }else if(!this.stopDisabled()) {\r\n this.startStopNextButtonName = \"Stop\"\r\n }\r\n return this.startStopNextButtonName;\r\n }\r\n startStopNextIconName():string{\r\n if(!this.startDisabled()){\r\n this.startStopNextButtonIconName=\"fiber_manual_record\"\r\n }else if(!this.stopDisabled()){\r\n this.startStopNextButtonIconName=\"stop\"\r\n }\r\n return this.startStopNextButtonIconName\r\n }\r\n startStopNextIconColor():string{\r\n if(!this.startDisabled()){\r\n return \"red\"\r\n }else if(!this.stopDisabled()){\r\n return \"yellow\"\r\n }else{\r\n return \"grey\";\r\n }\r\n }\r\n\r\n startStopPerform(){\r\n if(!this.startDisabled()){\r\n this.transportActions.startAction.perform();\r\n }else if(!this.stopDisabled()){\r\n this.transportActions.stopAction.perform();\r\n }\r\n }\r\n\r\n startItem() {\r\n this.transportActions.startAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n if (this.readonly) {\r\n return\r\n }\r\n this.transportActions.fwdAction.disabled = true\r\n this.transportActions.fwdNextAction.disabled = true\r\n this.transportActions.bwdAction.disabled = true\r\n this.displayRecFile = null;\r\n this.displayRecFileVersion = 0;\r\n this.displayAudioClip = null;\r\n this.showRecording();\r\n\r\n if (this.ac) {\r\n if (!this.ac.opened) {\r\n if (this._selectedDeviceId) {\r\n console.log(\"Open session with audio device Id: \\'\" + this._selectedDeviceId + \"\\' for \" + this._channelCount + \" channels\");\r\n } else {\r\n console.log(\"Open session with default audio device for \" + this._channelCount + \" channels\");\r\n }\r\n this.ac.open(this._channelCount, this._selectedDeviceId,this._autoGainControlConfigs);\r\n } else {\r\n this.ac.start();\r\n }\r\n }\r\n }\r\n\r\n\r\n downloadRecording() {\r\n if (this.displayRecFile) {\r\n let ab: AudioBuffer | null = this.displayRecFile.audioBuffer;\r\n let ww = new WavWriter();\r\n if (ab) {\r\n let wavFile = ww.writeAsync(ab, (wavFile) => {\r\n let blob = new Blob([wavFile], {type: 'audio/wav'});\r\n let rfUrl = URL.createObjectURL(blob);\r\n\r\n let dataDnlLnk = this.renderer.createElement('a');\r\n //dataDnlLnk.name = 'Recording';\r\n dataDnlLnk.href = rfUrl;\r\n\r\n this.renderer.appendChild(document.body, dataDnlLnk);\r\n\r\n // download property not yet in TS def\r\n if (this.displayRecFile) {\r\n let fn = this.displayRecFile.filenameString();\r\n fn += '_' + this.displayRecFileVersion;\r\n fn += '.wav';\r\n dataDnlLnk.download = fn;\r\n dataDnlLnk.click();\r\n }\r\n this.renderer.removeChild(document.body, dataDnlLnk);\r\n });\r\n }\r\n }\r\n }\r\n\r\n set displayRecFile(displayRecFile: RecordingFile | null) {\r\n this._displayRecFile = displayRecFile;\r\n if (this._displayRecFile) {\r\n let ab: AudioBuffer| null = this._displayRecFile.audioBuffer;\r\n if(ab) {\r\n this.displayAudioClip = new AudioClip(ab);\r\n this.controlAudioPlayer.audioClip = this.displayAudioClip;\r\n }else {\r\n // clear for now ...\r\n this.displayAudioClip = null;\r\n this.controlAudioPlayer.audioClip = null;\r\n\r\n if (this._controlAudioPlayer && this._session) {\r\n //... and try to fetch from server\r\n this.audioFetchSubscription = this.recFileService.fetchAndApplyRecordingFile(this._controlAudioPlayer.context, this._session.project, this._displayRecFile).subscribe((rf) => {\r\n let fab = null;\r\n if (rf && this._displayRecFile) {\r\n fab = this._displayRecFile.audioBuffer;\r\n } else {\r\n this.statusMsg = 'Recording file could not be loaded.'\r\n this.statusAlertType = 'error'\r\n }\r\n if (fab){\r\n this.displayAudioClip = new AudioClip(fab);\r\n }\r\n this.controlAudioPlayer.audioClip =this.displayAudioClip\r\n this.showRecording();\r\n\r\n }, err => {\r\n console.error(\"Could not load recording file from server: \" + err)\r\n this.statusMsg = 'Recording file could not be loaded: ' + err\r\n this.statusAlertType = 'error'\r\n })\r\n }else{\r\n this.statusMsg = 'Recording file could not be decoded. Audio context unavailable.'\r\n this.statusAlertType = 'error'\r\n }\r\n }\r\n\r\n } else {\r\n this.displayAudioClip = null;\r\n this.controlAudioPlayer.audioClip = null;\r\n }\r\n this.showRecording();\r\n }\r\n\r\n get displayRecFile(): RecordingFile | null {\r\n return this._displayRecFile;\r\n }\r\n\r\n showRecording() {\r\n this.controlAudioPlayer.stop();\r\n\r\n if (this.displayAudioClip) {\r\n\r\n this.levelMeasure.calcBufferLevelInfos(this.displayAudioClip.buffer, LEVEL_BAR_INTERVALL_SECONDS).then((levelInfos) => {\r\n this.displayLevelInfos = levelInfos;\r\n this.changeDetectorRef.detectChanges();\r\n });\r\n this.playStartAction.disabled = false;\r\n\r\n } else {\r\n\r\n // TODO\r\n // Setting to null does not trigger a change if it was null before (happens after nextitem() in AUTOPROGRESS mode)\r\n // The level bar display does not clear, it shows the last captured stream\r\n this.displayLevelInfos = null;\r\n\r\n this.playStartAction.disabled = true;\r\n\r\n // Collapse audio signal display if open\r\n if (!this.audioSignalCollapsed) {\r\n this.audioSignalCollapsed = true;\r\n }\r\n }\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n updateStartActionDisableState(){\r\n this.transportActions.startAction.disabled=!(this.ac);\r\n }\r\n\r\n start() {\r\n super.start();\r\n this.recorderCombiPane.selectTop();\r\n this.enableNavigation();\r\n this.updateStartActionDisableState();\r\n }\r\n\r\n isRecording(): boolean {\r\n return (this.status === Status.RECORDING);\r\n }\r\n\r\n isActive(): boolean{\r\n return (!(this.status === Status.BLOCKED || this.status=== Status.IDLE || this.status===Status.ERROR) || this.processingRecording || this.sessionService.uploadCount>0)\r\n }\r\n\r\n private updateNavigationActions(){\r\n\r\n this.transportActions.fwdAction.disabled = this.navigationDisabled;\r\n this.transportActions.bwdAction.disabled = this.navigationDisabled;\r\n }\r\n\r\n enableStartUserGesture() {\r\n super.enableStartUserGesture();\r\n this.transportActions.startAction.disabled=!(this.ac);\r\n }\r\n\r\n enableNavigation(){\r\n this.navigationDisabled=false;\r\n this.updateNavigationActions();\r\n }\r\n\r\n opened() {\r\n if(this.ac) {\r\n this.ac.start();\r\n }\r\n }\r\n\r\n started() {\r\n this.startedDate=new Date();\r\n this.transportActions.startAction.disabled = true;\r\n\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Recording...';\r\n\r\n let maxRecordingTimeMs = MAX_RECORDING_TIME_MS;\r\n this.maxRecTimerId = window.setTimeout(() => {\r\n this.stopRecordingMaxRec()\r\n }, maxRecordingTimeMs);\r\n this.maxRecTimerRunning = true;\r\n\r\n this.status = Status.RECORDING;\r\n this.transportActions.stopAction.disabled = false;\r\n }\r\n\r\n stopItem() {\r\n\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.status = Status.STOPPING_STOP;\r\n this.stopRecording();\r\n\r\n }\r\n\r\n stopRecording() {\r\n if (this.maxRecTimerRunning && this.maxRecTimerId!=null) {\r\n window.clearTimeout(this.maxRecTimerId);\r\n this.maxRecTimerRunning = false;\r\n }\r\n if(this.ac) {\r\n this.ac.stop();\r\n }\r\n }\r\n\r\n stopRecordingMaxRec(){\r\n\r\n this.maxRecTimerRunning = false;\r\n this.status = Status.STOPPING_STOP;\r\n if(this.ac) {\r\n this.ac.stop();\r\n }\r\n }\r\n\r\n // addRecordingFileByDescriptor(rfd:RecordingFileDescriptorImpl){\r\n // let prIdx=0;\r\n // if(this.items) {\r\n // let it = this.items[prIdx];\r\n // if (it) {\r\n // if (!it.recs) {\r\n // it.recs = new Array<SprRecordingFile>();\r\n // }\r\n //\r\n // } else {\r\n // //console.debug(\"WARN: No recording item with code: \\\"\" +rfd.recording.itemcode+ \"\\\" found.\");\r\n // }\r\n // }\r\n // }\r\n //\r\n // addRecordingFileByPromptIndex(promptIndex:number, rf:SprRecordingFile){\r\n //\r\n // }\r\n\r\n\r\n stopped() {\r\n this.updateStartActionDisableState()\r\n this.transportActions.stopAction.disabled = true;\r\n this.transportActions.nextAction.disabled = true;\r\n this.transportActions.pauseAction.disabled = true;\r\n this.statusAlertType = 'info';\r\n this.statusMsg = 'Recorded.';\r\n\r\n let ad:AudioBuffer;\r\n if(this.ac) {\r\n ad = this.ac.audioBuffer();\r\n let sessId: string | number = 0;\r\n if(this._session){\r\n sessId=this._session.sessionId;\r\n }\r\n let rf = new RecordingFile(UUID.generate(),sessId,ad);\r\n rf._startedAsDateObj=this.startedDate;\r\n if(rf._startedAsDateObj) {\r\n rf.startedDate = rf._startedAsDateObj.toString();\r\n }\r\n let apiEndPoint = '';\r\n\r\n if (this.config && this.config.apiEndPoint) {\r\n apiEndPoint = this.config.apiEndPoint;\r\n }\r\n if (apiEndPoint !== '') {\r\n apiEndPoint = apiEndPoint + '/'\r\n }\r\n\r\n let sessionsUrl = apiEndPoint + SessionService.SESSION_API_CTX;\r\n let recUrl: string = sessionsUrl + '/' + rf.session + '/' + RECFILE_API_CTX + '/' + rf.uuid;\r\n //\r\n //\r\n //\r\n // // convert asynchronously to 16-bit integer PCM\r\n // // TODO could we avoid conversion to save CPU resources and transfer float PCM directly?\r\n // // TODO duplicate conversion for manual download\r\n // //console.log(\"Build wav writer...\");\r\n this.processingRecording=true\r\n let ww = new WavWriter();\r\n ww.writeAsync(ad, (wavFile) => {\r\n //this.postRecording(wavFile, recUrl);\r\n //rf._dateAsDateObj=new Date();\r\n rf.frames=ad.length;\r\n this.displayRecFile=rf;\r\n //this.recordingListComp.recordingList.push(rf);\r\n this.recorderCombiPane.push(rf);\r\n this.postRecordingMultipart(wavFile, rf.uuid,rf.session,rf._startedAsDateObj,recUrl);\r\n this.processingRecording=false;\r\n this.changeDetectorRef.detectChanges();\r\n });\r\n // }\r\n }\r\n\r\n // check complete session\r\n let complete = true;\r\n\r\n let autoStart = (this.status === Status.STOPPING_STOP);\r\n this.status = Status.IDLE;\r\n let startNext=false;\r\n\r\n this.navigationDisabled = false;\r\n this.updateNavigationActions();\r\n\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n postRecording(wavFile: Uint8Array, recUrl: string) {\r\n let wavBlob = new Blob([wavFile], {type: 'audio/wav'});\r\n let ul = new Upload(wavBlob, recUrl);\r\n this.uploader.queueUpload(ul);\r\n }\r\n\r\n postRecordingMultipart(wavFile: Uint8Array, uuid:string|null,sessionId:string|number|null,startedDate:Date|null|undefined,recUrl: string) {\r\n let wavBlob = new Blob([wavFile], {type: 'audio/wav'});\r\n\r\n let fd=new FormData();\r\n if(uuid) {\r\n fd.set('uuid', uuid);\r\n }\r\n if(sessionId!==null) {\r\n fd.set('sessionId', sessionId.toString());\r\n }\r\n if(startedDate){\r\n fd.set('startedDate',startedDate.toJSON());\r\n }\r\n fd.set('audio',wavBlob);\r\n let ul = new Upload(fd, recUrl);\r\n this.uploader.queueUpload(ul);\r\n }\r\n\r\n stop() {\r\n if(this.ac) {\r\n this.ac.close();\r\n }\r\n }\r\n\r\n private updateControlPlaybackPosition() {\r\n if (this._controlAudioPlayer.playPositionFrames) {\r\n this.recorderCombiPane.audioDisplay.playFramePosition = this._controlAudioPlayer.playPositionFrames;\r\n this.liveLevelDisplay.playFramePosition = this._controlAudioPlayer.playPositionFrames;\r\n }\r\n }\r\n\r\n audioPlayerUpdate(e: AudioPlayerEvent) {\r\n if (EventType.READY === e.type) {\r\n\r\n } else if (EventType.STARTED === e.type) {\r\n //this.status = 'Playback...';\r\n this.updateTimerId = window.setInterval(() => this.updateControlPlaybackPosition(), 50);\r\n\r\n } else if (EventType.ENDED === e.type) {\r\n //.status='Ready.';\r\n window.clearInterval(this.updateTimerId);\r\n\r\n }\r\n\r\n if(!this.destroyed) {\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n }\r\n}\r\n\r\n","import {ModuleWithProviders, NgModule} from '@angular/core';\r\nimport {SpeechrecorderngComponent} from \"./speechrecorderng.component\";\r\nimport {SimpleTrafficLight} from \"./speechrecorder/startstopsignal/ui/simpletrafficlight\";\r\n\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {Progress} from \"./speechrecorder/session/progress\";\r\nimport {\r\n PromptContainer, Prompter, Prompting, PromptingContainer, Recinstructions,\r\n} from \"./speechrecorder/session/prompting\";\r\nimport {SessionManager} from \"./speechrecorder/session/sessionmanager\";\r\nimport {WarningBar} from \"./speechrecorder/session/warning_bar\";\r\nimport {ScrollIntoViewDirective} from \"./utils/scrollIntoViewToBottom\";\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatDialogModule } from \"@angular/material/dialog\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatProgressBarModule } from \"@angular/material/progress-bar\";\r\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport {HttpClientModule} from \"@angular/common/http\";\r\nimport {SessionService} from \"./speechrecorder/session/session.service\";\r\nimport {ScriptService} from \"./speechrecorder/script/script.service\";\r\nimport {RouterModule, Routes} from \"@angular/router\";\r\nimport {SpeechRecorderConfig, SPEECHRECORDER_CONFIG} from \"./spr.config\";\r\nimport {SpeechRecorderUploader} from \"./speechrecorder/spruploader\";\r\nimport {ProjectService} from \"./speechrecorder/project/project.service\";\r\nimport {\r\n ControlPanel,\r\n ProgressDisplay,\r\n ReadyStateIndicator,\r\n StatusDisplay,\r\n TransportPanel,\r\n UploadStatus\r\n} from \"./speechrecorder/session/controlpanel\";\r\nimport {FlexLayoutModule} from \"@angular/flex-layout\";\r\nimport {SessionFinishedDialog} from \"./speechrecorder/session/session_finished_dialog\";\r\nimport {MessageDialog} from \"./ui/message_dialog\";\r\nimport {RecordingItemControls, RecordingItemDisplay} from \"./ui/recordingitem_display\";\r\nimport {RecordingService} from \"./speechrecorder/recordings/recordings.service\";\r\nimport {ScrollPaneHorizontal} from \"./audio/ui/scroll_pane_horizontal\";\r\nimport {AudioClipUIContainer} from \"./audio/ui/container\";\r\nimport {AudioSignal} from \"./audio/ui/audiosignal\";\r\nimport {Sonagram} from \"./audio/ui/sonagram\";\r\nimport {AudioDisplayPlayer} from \"./audio/audio_player\";\r\nimport {AudioDisplay} from \"./audio/audio_display\";\r\nimport {AudioDisplayControl} from \"./audio/ui/audio_display_control\";\r\nimport {LevelBar} from \"./audio/ui/livelevel\";\r\nimport {AudioDisplayScrollPane} from \"./audio/ui/audio_display_scroll_pane\";\r\nimport {UUID} from \"./utils/utils\";\r\nimport {MatCheckboxModule} from \"@angular/material/checkbox\";\r\nimport {MatCard, MatCardModule} from \"@angular/material/card\";\r\nimport {MatDividerModule} from \"@angular/material/divider\";\r\nimport {MatGridListModule} from \"@angular/material/grid-list\";\r\nimport {RecordingFileUI} from \"./speechrecorder/session/recordingfile/recording-file-u-i.component\";\r\nimport {RecordingFileService} from \"./speechrecorder/session/recordingfile/recordingfile-service\";\r\nimport {RecordingFileViewComponent} from \"./speechrecorder/session/recordingfile/recording-file-view.component\";\r\nimport {MatTableModule} from \"@angular/material/table\";\r\nimport { RecordingFileNaviComponent } from './speechrecorder/session/recordingfile/recording-file-navi.component';\r\nimport {RecordingFileMetaComponent} from \"./speechrecorder/session/recordingfile/recording-file-meta.component\";\r\nimport {MatSelectModule} from \"@angular/material/select\";\r\nimport {MatInputModule} from \"@angular/material/input\";\r\nimport {MatSnackBarModule} from \"@angular/material/snack-bar\";\r\nimport {AudioRecorder} from \"./speechrecorder/session/audiorecorder\";\r\nimport {RecordingList} from \"./speechrecorder/session/recording_list\";\r\nimport {RecorderCombiPane} from \"./speechrecorder/session/recorder_combi_pane\";\r\n\r\n\r\n\r\nexport const SPR_ROUTES: Routes = [\r\n { path: 'spr/session/:id', component: SpeechrecorderngComponent },\r\n { path: 'recorder', component: AudioRecorder },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_view/:recordingFileId', component: RecordingFileViewComponent },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_edit/:recordingFileId', component: RecordingFileUI },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_view', component: RecordingFileViewComponent },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_edit', component: RecordingFileUI },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile/:recordingFileId', component: RecordingFileUI },\r\n { path: 'spr/db/project/:project/session/:sessionId/recordingfile', component: RecordingFileUI },\r\n { path: 'spr/db/recordingfile/_view/:recordingFileId', component: RecordingFileViewComponent },\r\n { path: 'spr/db/recordingfile/_edit/:recordingFileId', component: RecordingFileUI },\r\n { path: 'spr/db/recordingfile/_view/', component: RecordingFileViewComponent },\r\n { path: 'spr/db/recordingfile/_view', component: RecordingFileViewComponent },\r\n { path: 'spr/db/recordingfile/_edit', component: RecordingFileUI },\r\n { path: 'spr/db/recordingfile/:recordingFileId', component: RecordingFileUI },\r\n { path: 'spr/db/recordingfile', component: RecordingFileUI },\r\n { path: 'spr', component: SpeechrecorderngComponent }\r\n];\r\n\r\n@NgModule({\r\n declarations: [AudioSignal, Sonagram, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, Progress, SimpleTrafficLight, Recinstructions, Prompter, PromptContainer, PromptingContainer, Prompting, StatusDisplay,\r\n ProgressDisplay, RecordingItemDisplay, RecordingItemControls, UploadStatus, TransportPanel, ReadyStateIndicator, ControlPanel, WarningBar, AudioRecorder,SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent,RecordingList,RecorderCombiPane,AudioRecorder],\r\n exports: [MessageDialog, SpeechrecorderngComponent, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar,AudioRecorder],\r\n imports: [RouterModule.forChild(SPR_ROUTES), FlexLayoutModule, CommonModule, MatIconModule, MatButtonModule, MatDialogModule, MatProgressBarModule, MatProgressSpinnerModule, MatTooltipModule, HttpClientModule, MatCheckboxModule, MatCardModule, MatDividerModule, MatGridListModule, MatTableModule, MatInputModule, MatSelectModule, MatSnackBarModule],\r\n providers: [SessionService, ProjectService, ScriptService, RecordingService, RecordingFileService, SpeechRecorderUploader]\r\n})\r\nexport class SpeechrecorderngModule{\r\n\r\n static forRoot(config: SpeechRecorderConfig): ModuleWithProviders<SpeechrecorderngModule> {\r\n return {\r\n ngModule: SpeechrecorderngModule,\r\n providers: [\r\n {provide: SPEECHRECORDER_CONFIG, useValue: config }\r\n ]\r\n };\r\n }\r\n}\r\n","export const VERSION='2.23.4'","/*\r\n * Public API Surface of speechrecorderng\r\n */\r\n\r\n\r\nimport {AudioDisplayControl} from \"./lib/audio/ui/audio_display_control\";\r\n\r\nexport {SpeechrecorderngModule} from './lib/speechrecorderng.module'\r\nexport {VERSION} from './lib/spr.module.version'\r\nexport {SPEECHRECORDER_CONFIG} from './lib/spr.config'\r\n\r\nexport {UUID} from \"./lib/utils/utils\"\r\nexport {Action} from \"./lib/action/action\";\r\n\r\nexport {MessageDialog} from \"./lib/ui/message_dialog\"\r\n\r\nexport {AudioClip,Selection} from './lib/audio/persistor'\r\nexport {AudioPlayer, AudioPlayerListener, AudioPlayerEvent, EventType} from './lib/audio/playback/player'\r\nexport {AudioRecorder} from './lib/speechrecorder/session/audiorecorder'\r\nexport {AudioDisplay} from './lib/audio/audio_display'\r\nexport {AudioDisplayPlayer} from './lib/audio/audio_player'\r\nexport {AudioClipUIContainer} from './lib/audio/ui/container'\r\nexport {ScrollPaneHorizontal} from './lib/audio/ui/scroll_pane_horizontal'\r\nexport {AudioDisplayScrollPane} from \"./lib/audio/ui/audio_display_scroll_pane\";\r\nexport {AudioContextProvider} from \"./lib/audio/context\";\r\nexport {AudioDisplayControl} from \"./lib/audio/ui/audio_display_control\"\r\nexport {LevelBar} from './lib/audio/ui/livelevel'\r\n\r\nexport {ProjectService} from './lib/speechrecorder/project/project.service'\r\nexport {Session} from './lib/speechrecorder/session/session'\r\nexport {SessionService} from './lib/speechrecorder/session/session.service'\r\nexport {ScriptService} from './lib/speechrecorder/script/script.service'\r\nexport {Script,Section,Group,PromptItem,Mediaitem,PromptPhase,Mode} from './lib/speechrecorder/script/script'\r\nexport {RecordingService} from './lib/speechrecorder/recordings/recordings.service'\r\nexport {SprRecordingFile} from './lib/speechrecorder/recording'\r\nexport {RecordingFileService} from './lib/speechrecorder/session/recordingfile/recordingfile-service'\r\nexport {RecordingFileViewComponent} from './lib/speechrecorder/session/recordingfile/recording-file-view.component'\r\nexport {RecordingFileUI} from './lib/speechrecorder/session/recordingfile/recording-file-u-i.component'\r\nexport {SpeechRecorderConfig,ApiType} from './lib/spr.config'\r\nexport {SpeechrecorderngComponent} from './lib/speechrecorderng.component'\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Browser","Platform","CfgPlatform","UploadStatus","Item","DEFAULT_WARN_DB_LEVEL","MIN_DB_LEVEL","PlaybackEventType"],"mappings":"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"}
|