Version 4.3.2

This commit is contained in:
Chrystian Huot 2020-07-30 11:11:50 -04:00
parent 7cdee6c7bd
commit 0a33be646c
7 changed files with 95 additions and 102 deletions

View file

@ -1,6 +1,6 @@
{ {
"name": "rdio-scanner-client", "name": "rdio-scanner-client",
"version": "4.3.1", "version": "4.3.2",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -226,9 +226,9 @@
} }
}, },
"@angular/animations": { "@angular/animations": {
"version": "10.0.5", "version": "10.0.6",
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.0.5.tgz", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.0.6.tgz",
"integrity": "sha512-vHWn7NJiiDAok36GSBJ0y/nqjd4UFl9WGIEsvydUqnyBJ0scuqJa+hADrWwqkK7b/xVW9ARVG00NXmemEPUVGA==", "integrity": "sha512-D2cDrfwnVjL0/6m1v35mAYebH2z0I3WJXohhePaDHEKBEXfXpBIbqqSiRpV9jLSa/xgmJPh4FSNVDCmKmuEmfg==",
"requires": { "requires": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
} }
@ -285,25 +285,25 @@
} }
}, },
"@angular/common": { "@angular/common": {
"version": "10.0.5", "version": "10.0.6",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.5.tgz", "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.6.tgz",
"integrity": "sha512-AKmD/X13q3zzo5uTV/M4dWpAqJ136187rL4VweRc6b5t/oZ3VGcejjElZebgtoyGTye8luIP6fZ/LMb580lBlQ==", "integrity": "sha512-xS9IJGg6s+Y3K7pe9Oz39Dnpq5uSuUj3HkLKt1db5vPPAeT1qdZ+rdH5hnGwbf8Ihd6ZQacTAlh9W6MnqorZ0w==",
"requires": { "requires": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
} }
}, },
"@angular/compiler": { "@angular/compiler": {
"version": "10.0.5", "version": "10.0.6",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.5.tgz", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.6.tgz",
"integrity": "sha512-HAh+g78l6F9LcQtlsUmxmM62p6B9UuTt5aAROVLt8o4Dr643VxQS2itiorojKHRW/W6Vu1e8GRke+pq5lM5LJw==", "integrity": "sha512-UyckS8aqd6rSYDOFtpMFN3WtZ2tqJ9b67G4owJn2qKI87otPRe7dOIKAcSailxz0lKSyt1Pf8Bjx9mrlRY6jxg==",
"requires": { "requires": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
} }
}, },
"@angular/compiler-cli": { "@angular/compiler-cli": {
"version": "10.0.5", "version": "10.0.6",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.5.tgz", "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.6.tgz",
"integrity": "sha512-skeosaJO9mdKp+X3zOdNdpImzTsioM0DannRTPfWI0NbAwlbFCeG3Nctpy+0Ki18WVZ5Lj+hw5BMnVKCjlbu8w==", "integrity": "sha512-bmOmM0pHbjSrRiybLkuyH/pUs+yOfLskoAXLAjrJtYwplUc17z0WO+Ltb0QmaPKVKxERiBCYQskrKcgCQ7p23g==",
"dev": true, "dev": true,
"requires": { "requires": {
"canonical-path": "1.0.0", "canonical-path": "1.0.0",
@ -484,9 +484,9 @@
} }
}, },
"@angular/core": { "@angular/core": {
"version": "10.0.5", "version": "10.0.6",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.5.tgz", "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.6.tgz",
"integrity": "sha512-zoIxIi/UaRImeC1uD+eIKrdcihvQR/zfbqKgK67IPy/tghijxge1Tbl8FWIAT0ncAj0XH/JHsWnVdUV/TUI+CA==", "integrity": "sha512-mk/7XmZg7EeWEgl2UEyhyU6eukm2h+Thw1Ue84aBxMDaqt1RUpsPwpGCfIRfzH9gdzAjJUAPxiHAN2CF+3Wohw==",
"requires": { "requires": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
} }
@ -500,9 +500,9 @@
} }
}, },
"@angular/forms": { "@angular/forms": {
"version": "10.0.5", "version": "10.0.6",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.5.tgz", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.6.tgz",
"integrity": "sha512-Bv+KEPjqd+ndl/Z0w1uWsBmvb8Je1JObHRjbKAcW7c4r1CVobm+QJv6r6MDL+FOs78lnrm8baekGLQyHH1uO7g==", "integrity": "sha512-C/+o4lLqyE2QX1brNBxf5yqBPxNpfRA8Rv0Nb1nQE0T6Y/AjyQWxYYl34fD6zk1WQfP3X8bUgkbhHhefmjVZKw==",
"requires": { "requires": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
} }
@ -516,25 +516,25 @@
} }
}, },
"@angular/platform-browser": { "@angular/platform-browser": {
"version": "10.0.5", "version": "10.0.6",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.5.tgz", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.6.tgz",
"integrity": "sha512-bmknyK18yMv+iLCqcrfcpq3/2Ls9mRA1lOe7YhSGpHxM969Rb6Av8vJNW+uv0y7+gTvxacmpiQO8iryr/xvzRg==", "integrity": "sha512-i3jqfXK6ZNwCJbCadeUC+ZAGvXZ0/k7/LocxKACFQW4a5o1W8aACn8COYDvdKMsT1B+tM9Wv1nDh3qjPZthaXw==",
"requires": { "requires": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
} }
}, },
"@angular/platform-browser-dynamic": { "@angular/platform-browser-dynamic": {
"version": "10.0.5", "version": "10.0.6",
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.5.tgz", "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.6.tgz",
"integrity": "sha512-Qa6RM9aJuuw5E7BeGBG9/kCOtssI6Wyzbb/8awzZFF6Fjqom1kef185nwx7SgQs2cdrhqRAgjt0eDJqTfSVb+Q==", "integrity": "sha512-ao6i9mEy314SI9Z57JPyKvb4sF61i2RNKHN/XuTpPBIRJ8ryOhG6aS1kN2gNFfj8HmyxZS0zohxTxd+nGitGgw==",
"requires": { "requires": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
} }
}, },
"@angular/service-worker": { "@angular/service-worker": {
"version": "10.0.5", "version": "10.0.6",
"resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-10.0.5.tgz", "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-10.0.6.tgz",
"integrity": "sha512-9Xew37fKedV6sewU7gkizr/9lNYn83PymqXeiDjf9vcZDkvR2owzWss4Ig+8VMRJJPP1BXKsjkYZv9JtU7gPPw==", "integrity": "sha512-zs2uXkcS/T+jDT5BPrnf5NiLuEvDRN3LEPcaEOB06at0xmcXzZ7Rtnqm9pRx56xyW6bn0YjTPV0T9iyUd4wFfw==",
"requires": { "requires": {
"tslib": "^2.0.0" "tslib": "^2.0.0"
} }
@ -1791,9 +1791,9 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "14.0.26", "version": "14.0.27",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.26.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
"integrity": "sha512-W+fpe5s91FBGE0pEa0lnqGLL4USgpLgs4nokw16SrBBco/gQxuua7KnArSEOd5iaMqbbSHV10vUDkJYJJqpXKA==", "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==",
"dev": true "dev": true
}, },
"@types/q": { "@types/q": {

View file

@ -1,17 +1,17 @@
{ {
"author": "Chrystian Huot <chrystian.huot@saubeo.solutions>", "author": "Chrystian Huot <chrystian.huot@saubeo.solutions>",
"dependencies": { "dependencies": {
"@angular/animations": "^10.0.5", "@angular/animations": "^10.0.6",
"@angular/cdk": "^10.1.1", "@angular/cdk": "^10.1.1",
"@angular/common": "~10.0.5", "@angular/common": "~10.0.6",
"@angular/compiler": "~10.0.5", "@angular/compiler": "~10.0.6",
"@angular/core": "~10.0.5", "@angular/core": "~10.0.6",
"@angular/flex-layout": "^10.0.0-beta.32", "@angular/flex-layout": "^10.0.0-beta.32",
"@angular/forms": "~10.0.5", "@angular/forms": "~10.0.6",
"@angular/material": "^10.1.1", "@angular/material": "^10.1.1",
"@angular/platform-browser": "~10.0.5", "@angular/platform-browser": "~10.0.6",
"@angular/platform-browser-dynamic": "~10.0.5", "@angular/platform-browser-dynamic": "~10.0.6",
"@angular/service-worker": "~10.0.5", "@angular/service-worker": "~10.0.6",
"rxjs": "~6.6.0", "rxjs": "~6.6.0",
"tslib": "^2.0.0", "tslib": "^2.0.0",
"zone.js": "~0.10.3" "zone.js": "~0.10.3"
@ -19,8 +19,8 @@
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "~0.1000.4", "@angular-devkit/build-angular": "~0.1000.4",
"@angular/cli": "^10.0.4", "@angular/cli": "^10.0.4",
"@angular/compiler-cli": "~10.0.5", "@angular/compiler-cli": "~10.0.6",
"@types/node": "~14.0.26", "@types/node": "~14.0.27",
"codelyzer": "^6.0.0", "codelyzer": "^6.0.0",
"ts-node": "~8.10.2", "ts-node": "~8.10.2",
"tslint": "~6.1.2", "tslint": "~6.1.2",
@ -33,5 +33,5 @@
"build": "ng build --base-href ./ --prod", "build": "ng build --base-href ./ --prod",
"start": "ng serve" "start": "ng serve"
}, },
"version": "4.3.1" "version": "4.3.2"
} }

View file

@ -66,7 +66,7 @@ export class AppRdioScannerComponent implements AfterViewInit, OnDestroy {
callTag = 'Tag'; callTag = 'Tag';
callTalkgroup = 'Talkgroup'; callTalkgroup = 'Talkgroup';
callTalkgroupId = '0'; callTalkgroupId = '0';
callTalkgroupName = `Rdio Scanner ${appName === 'rdio-scanner-client' ? 'v'.concat(version.replace(/^(\d+\.\d+).*$/, '$1')) : ''}`; callTalkgroupName = `Rdio Scanner ${appName === 'rdio-scanner-client' ? 'v'.concat(version) : ''}`;
callTime = 0; callTime = 0;
callUnit = '0'; callUnit = '0';

View file

@ -58,8 +58,9 @@ export class AppRdioScannerService implements OnDestroy {
event = new EventEmitter<RdioScannerEvent>(); event = new EventEmitter<RdioScannerEvent>();
private audioContext: AudioContext | undefined; private audioContext: AudioContext | undefined;
private audioSource: AudioBufferSourceNode | undefined; private audioSource: AudioBufferSourceNode | undefined;
private audioStartTime = NaN; private audioSourceStartTime = NaN;
private call: RdioScannerCall | undefined; private call: RdioScannerCall | undefined;
private callPrevious: RdioScannerCall | undefined; private callPrevious: RdioScannerCall | undefined;
@ -311,7 +312,7 @@ export class AppRdioScannerService implements OnDestroy {
if (this.liveFeedPaused) { if (this.liveFeedPaused) {
return; return;
} else if (call) { } else if (call?.audio) {
if (this.call) { if (this.call) {
this.stop({ emit: false }); this.stop({ emit: false });
} }
@ -325,56 +326,48 @@ export class AppRdioScannerService implements OnDestroy {
this.call = this.callQueue.shift(); this.call = this.callQueue.shift();
} }
if (this.call?.audio) { if (!this.call?.audio) {
const arrayBuffer = new ArrayBuffer(this.call.audio.data.length); return;
const arrayBufferView = new Uint8Array(arrayBuffer); }
for (let i = 0; i < (this.call.audio.data.length); i++) { const arrayBuffer = new ArrayBuffer(this.call.audio.data.length);
arrayBufferView[i] = this.call.audio.data[i]; const arrayBufferView = new Uint8Array(arrayBuffer);
}
this.audioContext?.decodeAudioData(arrayBuffer, (buffer) => { for (let i = 0; i < (this.call.audio.data.length); i++) {
timer(options?.delay ? 1000 : 0).subscribe(() => { arrayBufferView[i] = this.call.audio.data[i];
if (!this.audioContext) { }
return;
}
this.audioSource = this.audioContext.createBufferSource(); this.audioContext?.decodeAudioData(arrayBuffer, (buffer) => {
this.audioSource.buffer = buffer; timer(options?.delay ? 1000 : 0).subscribe(() => {
this.audioSource.connect(this.audioContext.destination); if (!this.audioContext || !this.call) {
this.audioSource.onended = () => this.skip({ delay: true }); return;
this.audioSource.start(); }
this.event.emit({ call: this.call, queue: this.callQueue.length }); this.audioSource = this.audioContext.createBufferSource();
this.audioSource.buffer = buffer;
this.audioSource.connect(this.audioContext.destination);
this.audioSource.onended = () => this.skip({ delay: true });
this.audioSource.start();
interval(500).pipe(takeWhile(() => !!this.call)).subscribe(() => {
if (this.audioContext && !isNaN(this.audioContext.currentTime)) {
if (isNaN(this.audioStartTime)) {
this.audioStartTime = this.audioContext.currentTime;
}
if (!this.liveFeedPaused) {
this.event.emit({ time: this.audioContext.currentTime - this.audioStartTime });
}
}
});
});
}, () => {
this.event.emit({ call: this.call, queue: this.callQueue.length }); this.event.emit({ call: this.call, queue: this.callQueue.length });
this.skip(); interval(500).pipe(takeWhile(() => !!this.call)).subscribe(() => {
}); if (this.audioContext && !isNaN(this.audioContext.currentTime)) {
if (isNaN(this.audioSourceStartTime)) {
this.audioSourceStartTime = this.audioContext.currentTime;
}
} else if (this.call) { if (!this.liveFeedPaused) {
this.event.emit({ call: undefined, queue: this.callQueue.length }); this.event.emit({ time: this.audioContext.currentTime - this.audioSourceStartTime });
} }
}
});
});
}, () => this.skip());
} }
queue(call: RdioScannerCall): void { queue(call: RdioScannerCall): void {
const sys = call.system; if (call?.audio) {
const tg = call.talkgroup;
if (call?.audio && this.liveFeedMap && this.liveFeedMap[sys] && this.liveFeedMap[sys][tg]) {
this.callQueue.push(call); this.callQueue.push(call);
if (this.call || this.liveFeedPaused) { if (this.call || this.liveFeedPaused) {
@ -387,9 +380,7 @@ export class AppRdioScannerService implements OnDestroy {
} }
replay(): void { replay(): void {
if (!this.liveFeedPaused) { this.play(this.call || this.callPrevious, { delay: false });
this.play(this.call || this.callPrevious, { delay: false });
}
} }
searchCalls(options: RdioScannerSearchOptions): void { searchCalls(options: RdioScannerSearchOptions): void {
@ -408,10 +399,9 @@ export class AppRdioScannerService implements OnDestroy {
this.audioSource.stop(); this.audioSource.stop();
this.audioSource.disconnect(); this.audioSource.disconnect();
this.audioSource = undefined; this.audioSource = undefined;
this.audioSourceStartTime = NaN;
} }
this.audioStartTime = NaN;
if (this.call) { if (this.call) {
this.callPrevious = this.call; this.callPrevious = this.call;
@ -419,7 +409,7 @@ export class AppRdioScannerService implements OnDestroy {
} }
if (typeof options?.emit !== 'boolean' || options.emit) { if (typeof options?.emit !== 'boolean' || options.emit) {
this.event.emit({ call: undefined }); this.event.emit({ call: undefined, queue: this.callQueue.length });
} }
} }
@ -654,7 +644,10 @@ export class AppRdioScannerService implements OnDestroy {
break; break;
default: default:
if (this.liveFeedActive) { if (this.liveFeedActive &&
this.liveFeedMap &&
this.liveFeedMap[message[1].system] &&
this.liveFeedMap[message[1].system][message[1].talkgroup]) {
this.queue(message[1]); this.queue(message[1]);
} }
} }

View file

@ -11,5 +11,5 @@
"start": "node run", "start": "node run",
"update": "node update" "update": "node update"
}, },
"version": "4.3.1" "version": "4.3.2"
} }

View file

@ -1,6 +1,6 @@
{ {
"name": "rdio-scanner-server", "name": "rdio-scanner-server",
"version": "4.3.1", "version": "4.3.2",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -2724,12 +2724,12 @@
"optional": true "optional": true
}, },
"har-validator": { "har-validator": {
"version": "5.1.3", "version": "5.1.5",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"optional": true, "optional": true,
"requires": { "requires": {
"ajv": "^6.5.5", "ajv": "^6.12.3",
"har-schema": "^2.0.0" "har-schema": "^2.0.0"
} }
}, },
@ -6538,9 +6538,9 @@
} }
}, },
"webpack": { "webpack": {
"version": "4.44.0", "version": "4.44.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.0.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz",
"integrity": "sha512-wAuJxK123sqAw31SpkPiPW3iKHgFUiKvO7E7UZjtdExcsRe3fgav4mvoMM7vvpjLHVoJ6a0Mtp2fzkoA13e0Zw==", "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@webassemblyjs/ast": "1.9.0", "@webassemblyjs/ast": "1.9.0",

View file

@ -21,7 +21,7 @@
}, },
"devDependencies": { "devDependencies": {
"eslint": "^7.5.0", "eslint": "^7.5.0",
"webpack": "^4.44.0", "webpack": "^4.44.1",
"webpack-cli": "^3.3.12", "webpack-cli": "^3.3.12",
"webpack-node-externals": "^2.5.0" "webpack-node-externals": "^2.5.0"
}, },
@ -39,5 +39,5 @@
"build": "webpack", "build": "webpack",
"start": "nodemon" "start": "nodemon"
}, },
"version": "4.3.1" "version": "4.3.2"
} }