From b38ceff3c57eedfa8f2ca2dc991de08c88db2e98 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Sat, 7 May 2022 13:36:31 -0700 Subject: [PATCH] homekit: only start intercom once audio starts flowing back. this addresses issues where doorbell chimes get muted if two way mode is activated. --- plugins/homekit/package-lock.json | 4 ++-- plugins/homekit/package.json | 2 +- .../src/types/camera/camera-streaming.ts | 20 +++++++++++++------ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/plugins/homekit/package-lock.json b/plugins/homekit/package-lock.json index ffe18e4ae..86c68da01 100644 --- a/plugins/homekit/package-lock.json +++ b/plugins/homekit/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/homekit", - "version": "0.0.270", + "version": "0.0.271", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/homekit", - "version": "0.0.270", + "version": "0.0.271", "dependencies": { "@koush/qrcode-terminal": "^0.12.0", "check-disk-space": "^3.3.0", diff --git a/plugins/homekit/package.json b/plugins/homekit/package.json index 55cced311..95bded465 100644 --- a/plugins/homekit/package.json +++ b/plugins/homekit/package.json @@ -44,5 +44,5 @@ "@types/node": "^14.17.9", "@types/url-parse": "^1.4.3" }, - "version": "0.0.270" + "version": "0.0.271" } diff --git a/plugins/homekit/src/types/camera/camera-streaming.ts b/plugins/homekit/src/types/camera/camera-streaming.ts index 817772362..dd5424c90 100644 --- a/plugins/homekit/src/types/camera/camera-streaming.ts +++ b/plugins/homekit/src/types/camera/camera-streaming.ts @@ -51,8 +51,6 @@ export function createCameraStreamingDelegate(device: ScryptedDevice & VideoCame session.videoReturn?.close(); session.audioReturn?.close(); session.rtpSink?.destroy(); - if (twoWayAudio) - device.stopIntercom(); } const delegate: CameraStreamingDelegate = { @@ -318,19 +316,29 @@ export function createCameraStreamingDelegate(device: ScryptedDevice & VideoCame // demux the audio return socket to distinguish between rtp audio return // packets and rtcp. - // send the audio return off to the rtp + // send the audio return off to the rtp + let startedIntercom = false; session.audioReturn.on('message', buffer => { const rtp = RtpPacket.deSerialize(buffer); if (rtp.header.payloadType === session.startRequest.audio.pt) { + if (!startedIntercom) { + console.log('Received first two way audio packet, starting intercom.'); + startedIntercom = true; + mediaManager.createFFmpegMediaObject(session.rtpSink.ffmpegInput) + .then(mo => { + device.startIntercom(mo); + session.audioReturn.once('close', () => { + console.log('Stopping intercom.'); + device.stopIntercom(); + }); + }); + } session.audioReturn.send(buffer, session.rtpSink.rtpPort); } else { session.rtpSink.heartbeat(session.audioReturn, buffer); } }); - - const mo = await mediaManager.createFFmpegMediaObject(session.rtpSink.ffmpegInput); - device.startIntercom(mo); } }, };