From 74764ac46579e646e239742800a6fe01673dfd8c Mon Sep 17 00:00:00 2001 From: haritabh-z01 Date: Sat, 17 Jan 2026 13:23:17 +0530 Subject: [PATCH] fix: ensure audio is muted before recording state transition --- .../src/main/managers/recording-manager.ts | 39 +++++++++++++----- .../SwiftHelper/Resources/rec-start.mp3 | Bin 3393 -> 3330 bytes .../SwiftHelper/Resources/rec-stop.mp3 | Bin 3393 -> 2311 bytes .../windows-helper/Resources/rec-start.mp3 | Bin 3393 -> 3330 bytes .../windows-helper/Resources/rec-stop.mp3 | Bin 3393 -> 2311 bytes 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/apps/desktop/src/main/managers/recording-manager.ts b/apps/desktop/src/main/managers/recording-manager.ts index 04bff82..398094e 100644 --- a/apps/desktop/src/main/managers/recording-manager.ts +++ b/apps/desktop/src/main/managers/recording-manager.ts @@ -167,7 +167,12 @@ export class RecordingManager extends EventEmitter { public async onPTTRelease() { // Hands-free mode ignores PTT release if (this.recordingMode !== "ptt") return; - if (this.recordingState !== "recording") return; + if ( + this.recordingState !== "recording" && + this.recordingState !== "starting" + ) { + return; + } if (this.isQuickAction()) { // Quick release - wait for potential double-tap before cancelling @@ -201,7 +206,10 @@ export class RecordingManager extends EventEmitter { } // Already recording - if (this.recordingState === "recording") { + if ( + this.recordingState === "recording" || + this.recordingState === "starting" + ) { // In PTT mode? Switch to hands-free if (this.recordingMode === "ptt") { logger.audio.info("Toggle in PTT mode, switching to hands-free"); @@ -241,7 +249,7 @@ export class RecordingManager extends EventEmitter { const startTime = performance.now(); logger.audio.info("RecordingManager: doStart called", { mode }); - // Sync state broadcast + // Sync state broadcast - stay in "starting" until init completes this.setState("starting"); this.setMode(mode); this.terminationCode = null; @@ -252,14 +260,16 @@ export class RecordingManager extends EventEmitter { const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); this.currentSessionId = `session-${timestamp}`; - this.setState("recording"); - this.startNoAudioTimer(); - - // Async init inside mutex + // Initialize session (includes muting) BEFORE changing to "recording" + // This ensures audio is muted before renderer starts capturing this.initPromise = this.initializeSession(); await this.initPromise; + // Now safe to start recording - audio is muted + this.setState("recording"); + this.startNoAudioTimer(); + const totalDuration = performance.now() - startTime; logger.audio.info("Recording started", { sessionId: this.currentSessionId, @@ -297,7 +307,10 @@ export class RecordingManager extends EventEmitter { code: TerminationCode | null = null, ): Promise { await this.lifecycleMutex.runExclusive(async () => { - if (this.recordingState !== "recording") { + if ( + this.recordingState !== "recording" && + this.recordingState !== "starting" + ) { logger.audio.warn("Cannot end recording - not recording", { currentState: this.recordingState, }); @@ -745,7 +758,10 @@ export class RecordingManager extends EventEmitter { * Signal to stop recording (called from tRPC) */ public async signalStop(): Promise { - if (this.recordingState === "recording") { + if ( + this.recordingState === "recording" || + this.recordingState === "starting" + ) { await this.endRecording(); } } @@ -755,7 +771,10 @@ export class RecordingManager extends EventEmitter { this.clearTimers(); // Stop recording if active - if (this.recordingState === "recording") { + if ( + this.recordingState === "recording" || + this.recordingState === "starting" + ) { await this.endRecording(); } diff --git a/packages/native-helpers/swift-helper/Sources/SwiftHelper/Resources/rec-start.mp3 b/packages/native-helpers/swift-helper/Sources/SwiftHelper/Resources/rec-start.mp3 index 72bdf450cfa31de708a2996e6d446d16de106a55..601bd691d23c42273f4297c0593acfc68f438b28 100644 GIT binary patch literal 3330 zcmeH}X;9NgAICQ#fsh2q1qKZG$8ZEBm;fROl>`G4NGx&{!GoKC7a%BNDG7ud1QZlJ zY9OG1$f2|-RY{Ojtpre%S}v^z`q-jWfzpyEJRN5qW}cVNn`h?v%kSMu*lx#<0Gz5m<{j5!dk%IK(y1_0O* zz+FMi3Qnxx>PiMyFt-Bb3YL|qB!{acGaZ*ZpD{tE{N2Qk^g2-UKM#M7%0*cO0IhH5ZLln)G~%pw~^7g(@L_@XdA z{v39eg3 z4Im3$TFRE;YsuYD`dh8~a-91=1$)hxr_!}052W%imJqEb>f-=&O>hxL(o-bD!-}VJ z^P(e1&r;H(7^CGtBrJih+ZmzBjn#J12Y+RHBof${JjhaD`G`K%K;P4Q+B4nppfo(; zUA;TzUfcSwCX%vd#yjSkl*$2mc=puzt}l`MtY@44EEQrCe!DFJ_93$+aS<_rhhj2e z%)3^iD%g~mEy)SU)f>zkHg|eGR+Q~JA6P0=ByZasL!{RBjhmA21d5=H!_R%}^$ckk zcOb5=Hx%{h2OQDU5s1&weR2RGw59!0Pq@=#Fn>%$dt-ElF^qKAfE1)ix!1X5 {L z9xOlkL!fuvrgi|g7)x7HP;~If0y`3;nIos-Llq?T=quCda%!cNfCkmJCK>lB5Th98 z#WT`DA-^Z(CrxJNYNn3;q26JhYTR4sd+VL?{F$A_CiY!ZmyG9&a`Jfn(>j(>x01JA zk0W57IkvOMqzJe8@lJN7oGDN)7Dr493HR3V4<-S0Z1t$tuMsdWLDBk#BvYtGEh_Om zqV!a-s~P7oPyE0x3sj3O=g^u`(6l-rJX&E)&MVv5ZLyN?t!DGcY4US&Y zNz|*yzpDE)h3zeb^WQd2aCkePHx`$2s{<%@#rV8u_;bFZlg})Q!dprrLqBer8reU2 zjTBaC5FuN#b1rwMk!xxBD0Q8zEWPwj9N(0ai^)0MOf&ugm)Juz8;YE?Q6QbyQhFf| zTa?15N}?ZbN`~UncjP7n*2kFpr4n~o4*4}m&;+V!onS|3Y+3G6X!b#tWoKszch;q+dKCvo@$-E z-SE=kh3kcYV607rmf(?d6gy}`{a!ztpDbfzKU_|1{jRRfOMh&4FTayvm0b(%(CtP-xJ|Wt7|98o<-H68K8VhJZ&t^%~+jpICIsaE@@2Y7&|sM19(uE z9C)a608Jo~k5%Z0Fd$s50mUdSLuj3iAoKr{j2rz`NuxA zN8B3(t0F0T-;YbDv#+on*ZtCUB7rAn6XeC5!IM+xU22XugLToj9)dOQC?>J4(U?9ySrHI-m1>j)4|?-wWgQcio;Mn0_{cj9Cdz2VFnLB);&ozgIlet>3>I? zJ9xv%{>rW1eecB4^6qc*%_=4V@N0VlfO$z>QN?q16}bS0=e39NRv|h;D9Y@pO+XmX zrVv{neu#TM^zy0G+alugh@PQ9mSvYw0+HrJ;FX>7FO`z}tC(Du{`RE7lo6*y&BOP@ zlv^h{WI$`&zq=zvA!?{j5Km%uWvp8mS=wVIFqxKUMKc&+5 zcn??*eam)N-`=+dzw_ZKba_xR1n^XT$2@>B2uxwrcU%r$7mJ0gG}4c$plzm~@G^FKdq^GkrxkDG3GtS47Mw$n1$I^ZoVXnpLP`6*!Q`;1>D{oQ#D z_9cdmg@`{s!3~cMv)mgYTcuHh7U4R$S>FUO}?n|>OJ_w{zZ4TjdYuNS?NZnUBoAE-#hN( z-MeSIHuvS#Zp$nP0OXDiA%ID|S;n4X;4@ZEK?ffKtL}#o8DuM(x8o>6E`hwiD7sGX zEaxf|LDZ^B1Jl}^r==XZlg{SjZ^$AsKk>pe+P!6Dy!LV!$v0@J01d z=&VZu1L?bIEAx{imRa6_Nj0myDn_8mT-qCj1_6nN-8NC*|5|?(Y^e2-jm5{q5Fo}2 zUci!LuRtY7sma%KU% z4Z52e521ZITz(@1<{fv^cHw^dmei)mj*TqPdC-5PLwTBCh_m%rsBE{0eXLZz%rTRO z_h0ca;v(#0o P1p#0uRK0}%jV1jPGi2M7 literal 3393 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 I=U+?YUu_f%3;+NC literal 3393 zcmeH}Sy)ro7RPr6LVyGUVF)M^KoMmM2}4jI34;uR2th5AOag+6A}CV9BtRflM23_} zEQ83!2&fPWf?UF&P!SPisI3&RSS>0Fv7ih&H*~o7;lA|yZu@rE!#aEIv%Y=4vwnN; z|8jGpAi%mA`ZAf$(x)l_2oHv*GsV=LWKJ{;i%1A1lDGYu@|%NJat;9ipC`7fZ4Qx6 zVTt7crgh9(@y;Au8d{`D9k{%o{F3%23x||J@^D0kY|8qi!h}dPu{<~Ta&C_G>Rpd% z3t%%uAF1daXvDi3ynVT&sZwTt=4)Eo6qGi_CZbW>kuXG&J@lTAmtC0R^p$Qz!T_D5 z#0GSrPoK5tiE!N_Zq|zGcaigK5ey4BS0B%74LMl4Umufb>$`T=;^y}YOXHaJ)8asP z+qmbi4Q6wEv~{?w!5yafJwvoU0V>ZtcFbVycW`GjKhSaM5q|MkAI)&V&)0+{klAS@X3=EA`=oCeUsKTmY0RBXo>b|8b z>7_#N>uoZ_2(!&t;)$>Ixz00wW~)6Xoszvae{o8!c~4zpaf^3*O37P?1Xg47a{GPD zhWD2~HE9A_s6^c$TWV>A*uRF!vk>9;Xn|y-pjlPAavvrFT zttm`fla4ROj^3XNIbCd4)f{}KcPVr2?y0Xzj2rkEvsV+vCJn910XKp^#(D-s8J7o8 zy<+li$IBn^o(9(Efc_YgCV|6Y{wz=4*B1&ppjqCjOx^>IJl+i_}lD={0#;r7$GUma4J4?H_@!E|O zDv5`^&~KA#|Gz_Y97%rbc=4JgmGYGc{e# zGw|?fh%9-1WsVvFc;{P=i`$69A!@UoxTIncW6Oh?BJPYc`dYKLyb zV}!%~UCpv)COb-w*y?~Ttze}^$7Gp&&YlO=&ZTCR+bWv0ciGg`+HswGh=F55@>B#d zRU!Plx=Dv@?j1ez_H{x9S>n5{ofnFY(`1fu9Fxa%IUs`Spu5nZL4$r^X_p)Heb;r4XXFr?^wlJJTg-Z z?dogU9YU%_q-nGJ44&Xmo_7khI?MosMO3jahnopDI_aSl_j^RR5N0i0F;zsEE=g66 zlP;?GsCTB6WK`vWul2&CDn&L(-@u483Nyhs+M^|*CCJ>`Ad_M0D9>5I8$4j-kSwfy z1!<|akfd*Ra=h->f<^KBD{$%=6Z1BZ}c`>f9my3k`aWY z8ku`qg>Pxkt{Hmbzm=J2%RIy{CiMqMZ-_d5RTcyd4DFNdZvb#Z08M(T#?Q)e(b z_iCOS!PXIrhvTkj-7bTm_a~H7Oh&qcOziqn$qyv;!_t3UZOyBFk$m%6yYH=pcO!V( zTL_x;PJQ7=Lct!3wvjYZ2>DxMq(S*K)a`G{n_lWy3$rMmrjFVb-R3ds@p2($S_uBI zDdm2kswIkzBTd_4a{h@R^4J7hE1sM()4uY37T43jyTQFaZ>F=c>Wcr;Wmiv}QcTMU(jDR_40s3J>W5DI3mkInlKVV03td5Ag!#P?)}nE@V(y2^aMLfUk%&$0 z$I?VNeGhhzE}E;(r^^snpRdu51U=?x>d(QEY8a1=LS1@IZpRvHP&6;sr*go)$n{y{ zlWQ9eJa3(pbS!D`KRfUK_TCGP3#GNug22%buPPanQ)i)@YtSsisDtJfcCxJTLzc|P zq++IIp`mboE@JPb1o{Q)knCYDPHZ(}F0M&k=RhQZ+f);a8w{nxiU*_+erx6anlJtD zs{mL*o8YUc(fxONzKB-QC1KQ%j>gLJxqkASU4`jB8M(R+nd(mCzC2$~va-9DlLNQZ z55Hf~cTG?cRVz@BJLEH;XYjRQ_>6!slk4h^-6Ru;X)8EWaLf1BsgR+meOipkU`9E8abwX#A#MPu5gPKGs5-f2_suuuOB^^uSUps|AyVn2n I{*DU#3%#Feh5!Hn diff --git a/packages/native-helpers/windows-helper/Resources/rec-start.mp3 b/packages/native-helpers/windows-helper/Resources/rec-start.mp3 index 72bdf450cfa31de708a2996e6d446d16de106a55..601bd691d23c42273f4297c0593acfc68f438b28 100644 GIT binary patch literal 3330 zcmeH}X;9NgAICQ#fsh2q1qKZG$8ZEBm;fROl>`G4NGx&{!GoKC7a%BNDG7ud1QZlJ zY9OG1$f2|-RY{Ojtpre%S}v^z`q-jWfzpyEJRN5qW}cVNn`h?v%kSMu*lx#<0Gz5m<{j5!dk%IK(y1_0O* zz+FMi3Qnxx>PiMyFt-Bb3YL|qB!{acGaZ*ZpD{tE{N2Qk^g2-UKM#M7%0*cO0IhH5ZLln)G~%pw~^7g(@L_@XdA z{v39eg3 z4Im3$TFRE;YsuYD`dh8~a-91=1$)hxr_!}052W%imJqEb>f-=&O>hxL(o-bD!-}VJ z^P(e1&r;H(7^CGtBrJih+ZmzBjn#J12Y+RHBof${JjhaD`G`K%K;P4Q+B4nppfo(; zUA;TzUfcSwCX%vd#yjSkl*$2mc=puzt}l`MtY@44EEQrCe!DFJ_93$+aS<_rhhj2e z%)3^iD%g~mEy)SU)f>zkHg|eGR+Q~JA6P0=ByZasL!{RBjhmA21d5=H!_R%}^$ckk zcOb5=Hx%{h2OQDU5s1&weR2RGw59!0Pq@=#Fn>%$dt-ElF^qKAfE1)ix!1X5 {L z9xOlkL!fuvrgi|g7)x7HP;~If0y`3;nIos-Llq?T=quCda%!cNfCkmJCK>lB5Th98 z#WT`DA-^Z(CrxJNYNn3;q26JhYTR4sd+VL?{F$A_CiY!ZmyG9&a`Jfn(>j(>x01JA zk0W57IkvOMqzJe8@lJN7oGDN)7Dr493HR3V4<-S0Z1t$tuMsdWLDBk#BvYtGEh_Om zqV!a-s~P7oPyE0x3sj3O=g^u`(6l-rJX&E)&MVv5ZLyN?t!DGcY4US&Y zNz|*yzpDE)h3zeb^WQd2aCkePHx`$2s{<%@#rV8u_;bFZlg})Q!dprrLqBer8reU2 zjTBaC5FuN#b1rwMk!xxBD0Q8zEWPwj9N(0ai^)0MOf&ugm)Juz8;YE?Q6QbyQhFf| zTa?15N}?ZbN`~UncjP7n*2kFpr4n~o4*4}m&;+V!onS|3Y+3G6X!b#tWoKszch;q+dKCvo@$-E z-SE=kh3kcYV607rmf(?d6gy}`{a!ztpDbfzKU_|1{jRRfOMh&4FTayvm0b(%(CtP-xJ|Wt7|98o<-H68K8VhJZ&t^%~+jpICIsaE@@2Y7&|sM19(uE z9C)a608Jo~k5%Z0Fd$s50mUdSLuj3iAoKr{j2rz`NuxA zN8B3(t0F0T-;YbDv#+on*ZtCUB7rAn6XeC5!IM+xU22XugLToj9)dOQC?>J4(U?9ySrHI-m1>j)4|?-wWgQcio;Mn0_{cj9Cdz2VFnLB);&ozgIlet>3>I? zJ9xv%{>rW1eecB4^6qc*%_=4V@N0VlfO$z>QN?q16}bS0=e39NRv|h;D9Y@pO+XmX zrVv{neu#TM^zy0G+alugh@PQ9mSvYw0+HrJ;FX>7FO`z}tC(Du{`RE7lo6*y&BOP@ zlv^h{WI$`&zq=zvA!?{j5Km%uWvp8mS=wVIFqxKUMKc&+5 zcn??*eam)N-`=+dzw_ZKba_xR1n^XT$2@>B2uxwrcU%r$7mJ0gG}4c$plzm~@G^FKdq^GkrxkDG3GtS47Mw$n1$I^ZoVXnpLP`6*!Q`;1>D{oQ#D z_9cdmg@`{s!3~cMv)mgYTcuHh7U4R$S>FUO}?n|>OJ_w{zZ4TjdYuNS?NZnUBoAE-#hN( z-MeSIHuvS#Zp$nP0OXDiA%ID|S;n4X;4@ZEK?ffKtL}#o8DuM(x8o>6E`hwiD7sGX zEaxf|LDZ^B1Jl}^r==XZlg{SjZ^$AsKk>pe+P!6Dy!LV!$v0@J01d z=&VZu1L?bIEAx{imRa6_Nj0myDn_8mT-qCj1_6nN-8NC*|5|?(Y^e2-jm5{q5Fo}2 zUci!LuRtY7sma%KU% z4Z52e521ZITz(@1<{fv^cHw^dmei)mj*TqPdC-5PLwTBCh_m%rsBE{0eXLZz%rTRO z_h0ca;v(#0o P1p#0uRK0}%jV1jPGi2M7 literal 3393 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 I=U+?YUu_f%3;+NC literal 3393 zcmeH}Sy)ro7RPr6LVyGUVF)M^KoMmM2}4jI34;uR2th5AOag+6A}CV9BtRflM23_} zEQ83!2&fPWf?UF&P!SPisI3&RSS>0Fv7ih&H*~o7;lA|yZu@rE!#aEIv%Y=4vwnN; z|8jGpAi%mA`ZAf$(x)l_2oHv*GsV=LWKJ{;i%1A1lDGYu@|%NJat;9ipC`7fZ4Qx6 zVTt7crgh9(@y;Au8d{`D9k{%o{F3%23x||J@^D0kY|8qi!h}dPu{<~Ta&C_G>Rpd% z3t%%uAF1daXvDi3ynVT&sZwTt=4)Eo6qGi_CZbW>kuXG&J@lTAmtC0R^p$Qz!T_D5 z#0GSrPoK5tiE!N_Zq|zGcaigK5ey4BS0B%74LMl4Umufb>$`T=;^y}YOXHaJ)8asP z+qmbi4Q6wEv~{?w!5yafJwvoU0V>ZtcFbVycW`GjKhSaM5q|MkAI)&V&)0+{klAS@X3=EA`=oCeUsKTmY0RBXo>b|8b z>7_#N>uoZ_2(!&t;)$>Ixz00wW~)6Xoszvae{o8!c~4zpaf^3*O37P?1Xg47a{GPD zhWD2~HE9A_s6^c$TWV>A*uRF!vk>9;Xn|y-pjlPAavvrFT zttm`fla4ROj^3XNIbCd4)f{}KcPVr2?y0Xzj2rkEvsV+vCJn910XKp^#(D-s8J7o8 zy<+li$IBn^o(9(Efc_YgCV|6Y{wz=4*B1&ppjqCjOx^>IJl+i_}lD={0#;r7$GUma4J4?H_@!E|O zDv5`^&~KA#|Gz_Y97%rbc=4JgmGYGc{e# zGw|?fh%9-1WsVvFc;{P=i`$69A!@UoxTIncW6Oh?BJPYc`dYKLyb zV}!%~UCpv)COb-w*y?~Ttze}^$7Gp&&YlO=&ZTCR+bWv0ciGg`+HswGh=F55@>B#d zRU!Plx=Dv@?j1ez_H{x9S>n5{ofnFY(`1fu9Fxa%IUs`Spu5nZL4$r^X_p)Heb;r4XXFr?^wlJJTg-Z z?dogU9YU%_q-nGJ44&Xmo_7khI?MosMO3jahnopDI_aSl_j^RR5N0i0F;zsEE=g66 zlP;?GsCTB6WK`vWul2&CDn&L(-@u483Nyhs+M^|*CCJ>`Ad_M0D9>5I8$4j-kSwfy z1!<|akfd*Ra=h->f<^KBD{$%=6Z1BZ}c`>f9my3k`aWY z8ku`qg>Pxkt{Hmbzm=J2%RIy{CiMqMZ-_d5RTcyd4DFNdZvb#Z08M(T#?Q)e(b z_iCOS!PXIrhvTkj-7bTm_a~H7Oh&qcOziqn$qyv;!_t3UZOyBFk$m%6yYH=pcO!V( zTL_x;PJQ7=Lct!3wvjYZ2>DxMq(S*K)a`G{n_lWy3$rMmrjFVb-R3ds@p2($S_uBI zDdm2kswIkzBTd_4a{h@R^4J7hE1sM()4uY37T43jyTQFaZ>F=c>Wcr;Wmiv}QcTMU(jDR_40s3J>W5DI3mkInlKVV03td5Ag!#P?)}nE@V(y2^aMLfUk%&$0 z$I?VNeGhhzE}E;(r^^snpRdu51U=?x>d(QEY8a1=LS1@IZpRvHP&6;sr*go)$n{y{ zlWQ9eJa3(pbS!D`KRfUK_TCGP3#GNug22%buPPanQ)i)@YtSsisDtJfcCxJTLzc|P zq++IIp`mboE@JPb1o{Q)knCYDPHZ(}F0M&k=RhQZ+f);a8w{nxiU*_+erx6anlJtD zs{mL*o8YUc(fxONzKB-QC1KQ%j>gLJxqkASU4`jB8M(R+nd(mCzC2$~va-9DlLNQZ z55Hf~cTG?cRVz@BJLEH;XYjRQ_>6!slk4h^-6Ru;X)8EWaLf1BsgR+meOipkU`9E8abwX#A#MPu5gPKGs5-f2_suuuOB^^uSUps|AyVn2n I{*DU#3%#Feh5!Hn