mirror of
https://github.com/chuot/rdio-scanner.git
synced 2026-08-13 16:33:01 -06:00
Version 4.3.2
This commit is contained in:
parent
7cdee6c7bd
commit
0a33be646c
62
client/package-lock.json
generated
62
client/package-lock.json
generated
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "rdio-scanner-client",
|
||||
"version": "4.3.1",
|
||||
"version": "4.3.2",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
|
@ -226,9 +226,9 @@
|
|||
}
|
||||
},
|
||||
"@angular/animations": {
|
||||
"version": "10.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.0.5.tgz",
|
||||
"integrity": "sha512-vHWn7NJiiDAok36GSBJ0y/nqjd4UFl9WGIEsvydUqnyBJ0scuqJa+hADrWwqkK7b/xVW9ARVG00NXmemEPUVGA==",
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.0.6.tgz",
|
||||
"integrity": "sha512-D2cDrfwnVjL0/6m1v35mAYebH2z0I3WJXohhePaDHEKBEXfXpBIbqqSiRpV9jLSa/xgmJPh4FSNVDCmKmuEmfg==",
|
||||
"requires": {
|
||||
"tslib": "^2.0.0"
|
||||
}
|
||||
|
|
@ -285,25 +285,25 @@
|
|||
}
|
||||
},
|
||||
"@angular/common": {
|
||||
"version": "10.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.5.tgz",
|
||||
"integrity": "sha512-AKmD/X13q3zzo5uTV/M4dWpAqJ136187rL4VweRc6b5t/oZ3VGcejjElZebgtoyGTye8luIP6fZ/LMb580lBlQ==",
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.6.tgz",
|
||||
"integrity": "sha512-xS9IJGg6s+Y3K7pe9Oz39Dnpq5uSuUj3HkLKt1db5vPPAeT1qdZ+rdH5hnGwbf8Ihd6ZQacTAlh9W6MnqorZ0w==",
|
||||
"requires": {
|
||||
"tslib": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"@angular/compiler": {
|
||||
"version": "10.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.5.tgz",
|
||||
"integrity": "sha512-HAh+g78l6F9LcQtlsUmxmM62p6B9UuTt5aAROVLt8o4Dr643VxQS2itiorojKHRW/W6Vu1e8GRke+pq5lM5LJw==",
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.6.tgz",
|
||||
"integrity": "sha512-UyckS8aqd6rSYDOFtpMFN3WtZ2tqJ9b67G4owJn2qKI87otPRe7dOIKAcSailxz0lKSyt1Pf8Bjx9mrlRY6jxg==",
|
||||
"requires": {
|
||||
"tslib": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"@angular/compiler-cli": {
|
||||
"version": "10.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.5.tgz",
|
||||
"integrity": "sha512-skeosaJO9mdKp+X3zOdNdpImzTsioM0DannRTPfWI0NbAwlbFCeG3Nctpy+0Ki18WVZ5Lj+hw5BMnVKCjlbu8w==",
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.6.tgz",
|
||||
"integrity": "sha512-bmOmM0pHbjSrRiybLkuyH/pUs+yOfLskoAXLAjrJtYwplUc17z0WO+Ltb0QmaPKVKxERiBCYQskrKcgCQ7p23g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"canonical-path": "1.0.0",
|
||||
|
|
@ -484,9 +484,9 @@
|
|||
}
|
||||
},
|
||||
"@angular/core": {
|
||||
"version": "10.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.5.tgz",
|
||||
"integrity": "sha512-zoIxIi/UaRImeC1uD+eIKrdcihvQR/zfbqKgK67IPy/tghijxge1Tbl8FWIAT0ncAj0XH/JHsWnVdUV/TUI+CA==",
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.6.tgz",
|
||||
"integrity": "sha512-mk/7XmZg7EeWEgl2UEyhyU6eukm2h+Thw1Ue84aBxMDaqt1RUpsPwpGCfIRfzH9gdzAjJUAPxiHAN2CF+3Wohw==",
|
||||
"requires": {
|
||||
"tslib": "^2.0.0"
|
||||
}
|
||||
|
|
@ -500,9 +500,9 @@
|
|||
}
|
||||
},
|
||||
"@angular/forms": {
|
||||
"version": "10.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.5.tgz",
|
||||
"integrity": "sha512-Bv+KEPjqd+ndl/Z0w1uWsBmvb8Je1JObHRjbKAcW7c4r1CVobm+QJv6r6MDL+FOs78lnrm8baekGLQyHH1uO7g==",
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.6.tgz",
|
||||
"integrity": "sha512-C/+o4lLqyE2QX1brNBxf5yqBPxNpfRA8Rv0Nb1nQE0T6Y/AjyQWxYYl34fD6zk1WQfP3X8bUgkbhHhefmjVZKw==",
|
||||
"requires": {
|
||||
"tslib": "^2.0.0"
|
||||
}
|
||||
|
|
@ -516,25 +516,25 @@
|
|||
}
|
||||
},
|
||||
"@angular/platform-browser": {
|
||||
"version": "10.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.5.tgz",
|
||||
"integrity": "sha512-bmknyK18yMv+iLCqcrfcpq3/2Ls9mRA1lOe7YhSGpHxM969Rb6Av8vJNW+uv0y7+gTvxacmpiQO8iryr/xvzRg==",
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.6.tgz",
|
||||
"integrity": "sha512-i3jqfXK6ZNwCJbCadeUC+ZAGvXZ0/k7/LocxKACFQW4a5o1W8aACn8COYDvdKMsT1B+tM9Wv1nDh3qjPZthaXw==",
|
||||
"requires": {
|
||||
"tslib": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"@angular/platform-browser-dynamic": {
|
||||
"version": "10.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.5.tgz",
|
||||
"integrity": "sha512-Qa6RM9aJuuw5E7BeGBG9/kCOtssI6Wyzbb/8awzZFF6Fjqom1kef185nwx7SgQs2cdrhqRAgjt0eDJqTfSVb+Q==",
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.6.tgz",
|
||||
"integrity": "sha512-ao6i9mEy314SI9Z57JPyKvb4sF61i2RNKHN/XuTpPBIRJ8ryOhG6aS1kN2gNFfj8HmyxZS0zohxTxd+nGitGgw==",
|
||||
"requires": {
|
||||
"tslib": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"@angular/service-worker": {
|
||||
"version": "10.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-10.0.5.tgz",
|
||||
"integrity": "sha512-9Xew37fKedV6sewU7gkizr/9lNYn83PymqXeiDjf9vcZDkvR2owzWss4Ig+8VMRJJPP1BXKsjkYZv9JtU7gPPw==",
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-10.0.6.tgz",
|
||||
"integrity": "sha512-zs2uXkcS/T+jDT5BPrnf5NiLuEvDRN3LEPcaEOB06at0xmcXzZ7Rtnqm9pRx56xyW6bn0YjTPV0T9iyUd4wFfw==",
|
||||
"requires": {
|
||||
"tslib": "^2.0.0"
|
||||
}
|
||||
|
|
@ -1791,9 +1791,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "14.0.26",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.26.tgz",
|
||||
"integrity": "sha512-W+fpe5s91FBGE0pEa0lnqGLL4USgpLgs4nokw16SrBBco/gQxuua7KnArSEOd5iaMqbbSHV10vUDkJYJJqpXKA==",
|
||||
"version": "14.0.27",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
|
||||
"integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/q": {
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
{
|
||||
"author": "Chrystian Huot <chrystian.huot@saubeo.solutions>",
|
||||
"dependencies": {
|
||||
"@angular/animations": "^10.0.5",
|
||||
"@angular/animations": "^10.0.6",
|
||||
"@angular/cdk": "^10.1.1",
|
||||
"@angular/common": "~10.0.5",
|
||||
"@angular/compiler": "~10.0.5",
|
||||
"@angular/core": "~10.0.5",
|
||||
"@angular/common": "~10.0.6",
|
||||
"@angular/compiler": "~10.0.6",
|
||||
"@angular/core": "~10.0.6",
|
||||
"@angular/flex-layout": "^10.0.0-beta.32",
|
||||
"@angular/forms": "~10.0.5",
|
||||
"@angular/forms": "~10.0.6",
|
||||
"@angular/material": "^10.1.1",
|
||||
"@angular/platform-browser": "~10.0.5",
|
||||
"@angular/platform-browser-dynamic": "~10.0.5",
|
||||
"@angular/service-worker": "~10.0.5",
|
||||
"@angular/platform-browser": "~10.0.6",
|
||||
"@angular/platform-browser-dynamic": "~10.0.6",
|
||||
"@angular/service-worker": "~10.0.6",
|
||||
"rxjs": "~6.6.0",
|
||||
"tslib": "^2.0.0",
|
||||
"zone.js": "~0.10.3"
|
||||
|
|
@ -19,8 +19,8 @@
|
|||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "~0.1000.4",
|
||||
"@angular/cli": "^10.0.4",
|
||||
"@angular/compiler-cli": "~10.0.5",
|
||||
"@types/node": "~14.0.26",
|
||||
"@angular/compiler-cli": "~10.0.6",
|
||||
"@types/node": "~14.0.27",
|
||||
"codelyzer": "^6.0.0",
|
||||
"ts-node": "~8.10.2",
|
||||
"tslint": "~6.1.2",
|
||||
|
|
@ -33,5 +33,5 @@
|
|||
"build": "ng build --base-href ./ --prod",
|
||||
"start": "ng serve"
|
||||
},
|
||||
"version": "4.3.1"
|
||||
"version": "4.3.2"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ export class AppRdioScannerComponent implements AfterViewInit, OnDestroy {
|
|||
callTag = 'Tag';
|
||||
callTalkgroup = 'Talkgroup';
|
||||
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;
|
||||
callUnit = '0';
|
||||
|
||||
|
|
|
|||
|
|
@ -58,8 +58,9 @@ export class AppRdioScannerService implements OnDestroy {
|
|||
event = new EventEmitter<RdioScannerEvent>();
|
||||
|
||||
private audioContext: AudioContext | undefined;
|
||||
|
||||
private audioSource: AudioBufferSourceNode | undefined;
|
||||
private audioStartTime = NaN;
|
||||
private audioSourceStartTime = NaN;
|
||||
|
||||
private call: RdioScannerCall | undefined;
|
||||
private callPrevious: RdioScannerCall | undefined;
|
||||
|
|
@ -311,7 +312,7 @@ export class AppRdioScannerService implements OnDestroy {
|
|||
if (this.liveFeedPaused) {
|
||||
return;
|
||||
|
||||
} else if (call) {
|
||||
} else if (call?.audio) {
|
||||
if (this.call) {
|
||||
this.stop({ emit: false });
|
||||
}
|
||||
|
|
@ -325,56 +326,48 @@ export class AppRdioScannerService implements OnDestroy {
|
|||
this.call = this.callQueue.shift();
|
||||
}
|
||||
|
||||
if (this.call?.audio) {
|
||||
const arrayBuffer = new ArrayBuffer(this.call.audio.data.length);
|
||||
const arrayBufferView = new Uint8Array(arrayBuffer);
|
||||
if (!this.call?.audio) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (let i = 0; i < (this.call.audio.data.length); i++) {
|
||||
arrayBufferView[i] = this.call.audio.data[i];
|
||||
}
|
||||
const arrayBuffer = new ArrayBuffer(this.call.audio.data.length);
|
||||
const arrayBufferView = new Uint8Array(arrayBuffer);
|
||||
|
||||
this.audioContext?.decodeAudioData(arrayBuffer, (buffer) => {
|
||||
timer(options?.delay ? 1000 : 0).subscribe(() => {
|
||||
if (!this.audioContext) {
|
||||
return;
|
||||
}
|
||||
for (let i = 0; i < (this.call.audio.data.length); i++) {
|
||||
arrayBufferView[i] = this.call.audio.data[i];
|
||||
}
|
||||
|
||||
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();
|
||||
this.audioContext?.decodeAudioData(arrayBuffer, (buffer) => {
|
||||
timer(options?.delay ? 1000 : 0).subscribe(() => {
|
||||
if (!this.audioContext || !this.call) {
|
||||
return;
|
||||
}
|
||||
|
||||
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.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) {
|
||||
this.event.emit({ call: undefined, queue: this.callQueue.length });
|
||||
}
|
||||
if (!this.liveFeedPaused) {
|
||||
this.event.emit({ time: this.audioContext.currentTime - this.audioSourceStartTime });
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}, () => this.skip());
|
||||
}
|
||||
|
||||
queue(call: RdioScannerCall): void {
|
||||
const sys = call.system;
|
||||
const tg = call.talkgroup;
|
||||
|
||||
if (call?.audio && this.liveFeedMap && this.liveFeedMap[sys] && this.liveFeedMap[sys][tg]) {
|
||||
if (call?.audio) {
|
||||
this.callQueue.push(call);
|
||||
|
||||
if (this.call || this.liveFeedPaused) {
|
||||
|
|
@ -387,9 +380,7 @@ export class AppRdioScannerService implements OnDestroy {
|
|||
}
|
||||
|
||||
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 {
|
||||
|
|
@ -408,10 +399,9 @@ export class AppRdioScannerService implements OnDestroy {
|
|||
this.audioSource.stop();
|
||||
this.audioSource.disconnect();
|
||||
this.audioSource = undefined;
|
||||
this.audioSourceStartTime = NaN;
|
||||
}
|
||||
|
||||
this.audioStartTime = NaN;
|
||||
|
||||
if (this.call) {
|
||||
this.callPrevious = this.call;
|
||||
|
||||
|
|
@ -419,7 +409,7 @@ export class AppRdioScannerService implements OnDestroy {
|
|||
}
|
||||
|
||||
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;
|
||||
|
||||
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]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,5 +11,5 @@
|
|||
"start": "node run",
|
||||
"update": "node update"
|
||||
},
|
||||
"version": "4.3.1"
|
||||
"version": "4.3.2"
|
||||
}
|
||||
|
|
|
|||
16
server/package-lock.json
generated
16
server/package-lock.json
generated
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "rdio-scanner-server",
|
||||
"version": "4.3.1",
|
||||
"version": "4.3.2",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
|
@ -2724,12 +2724,12 @@
|
|||
"optional": true
|
||||
},
|
||||
"har-validator": {
|
||||
"version": "5.1.3",
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
|
||||
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
|
||||
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ajv": "^6.5.5",
|
||||
"ajv": "^6.12.3",
|
||||
"har-schema": "^2.0.0"
|
||||
}
|
||||
},
|
||||
|
|
@ -6538,9 +6538,9 @@
|
|||
}
|
||||
},
|
||||
"webpack": {
|
||||
"version": "4.44.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.0.tgz",
|
||||
"integrity": "sha512-wAuJxK123sqAw31SpkPiPW3iKHgFUiKvO7E7UZjtdExcsRe3fgav4mvoMM7vvpjLHVoJ6a0Mtp2fzkoA13e0Zw==",
|
||||
"version": "4.44.1",
|
||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz",
|
||||
"integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@webassemblyjs/ast": "1.9.0",
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
},
|
||||
"devDependencies": {
|
||||
"eslint": "^7.5.0",
|
||||
"webpack": "^4.44.0",
|
||||
"webpack": "^4.44.1",
|
||||
"webpack-cli": "^3.3.12",
|
||||
"webpack-node-externals": "^2.5.0"
|
||||
},
|
||||
|
|
@ -39,5 +39,5 @@
|
|||
"build": "webpack",
|
||||
"start": "nodemon"
|
||||
},
|
||||
"version": "4.3.1"
|
||||
"version": "4.3.2"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue