From da3bbba4979129cf103ccbf61297691409f41409 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 16 Jul 2020 20:23:55 +0400 Subject: [PATCH] Allow enable/disable video in a call. --- Telegram/Resources/icons/call_answer.png | Bin 456 -> 595 bytes Telegram/Resources/icons/call_answer@2x.png | Bin 1205 -> 1101 bytes Telegram/Resources/icons/call_answer@3x.png | Bin 1024 -> 1771 bytes .../Resources/icons/call_camera_active.png | Bin 0 -> 377 bytes .../Resources/icons/call_camera_active@2x.png | Bin 0 -> 733 bytes .../Resources/icons/call_camera_active@3x.png | Bin 0 -> 1177 bytes .../Resources/icons/call_camera_muted.png | Bin 0 -> 727 bytes .../Resources/icons/call_camera_muted@2x.png | Bin 0 -> 1400 bytes .../Resources/icons/call_camera_muted@3x.png | Bin 0 -> 2114 bytes Telegram/Resources/icons/call_discard.png | Bin 405 -> 460 bytes Telegram/Resources/icons/call_discard@2x.png | Bin 736 -> 970 bytes Telegram/Resources/icons/call_discard@3x.png | Bin 886 -> 1482 bytes .../Resources/icons/call_record_active.png | Bin 412 -> 489 bytes .../Resources/icons/call_record_active@2x.png | Bin 800 -> 1002 bytes .../Resources/icons/call_record_active@3x.png | Bin 945 -> 1545 bytes .../Resources/icons/call_record_muted.png | Bin 459 -> 744 bytes .../Resources/icons/call_record_muted@2x.png | Bin 843 -> 1543 bytes .../Resources/icons/call_record_muted@3x.png | Bin 1089 -> 2435 bytes Telegram/SourceFiles/calls/calls.style | 11 ++- Telegram/SourceFiles/calls/calls_call.cpp | 72 ++++++++++++++---- Telegram/SourceFiles/calls/calls_call.h | 52 +++++++++---- Telegram/SourceFiles/calls/calls_panel.cpp | 23 ++++-- Telegram/SourceFiles/calls/calls_panel.h | 8 +- Telegram/SourceFiles/calls/calls_top_bar.cpp | 10 +-- Telegram/SourceFiles/calls/calls_top_bar.h | 2 +- Telegram/ThirdParty/tgcalls | 2 +- Telegram/cmake/lib_tgcalls.cmake | 2 + 27 files changed, 133 insertions(+), 49 deletions(-) create mode 100644 Telegram/Resources/icons/call_camera_active.png create mode 100644 Telegram/Resources/icons/call_camera_active@2x.png create mode 100644 Telegram/Resources/icons/call_camera_active@3x.png create mode 100644 Telegram/Resources/icons/call_camera_muted.png create mode 100644 Telegram/Resources/icons/call_camera_muted@2x.png create mode 100644 Telegram/Resources/icons/call_camera_muted@3x.png diff --git a/Telegram/Resources/icons/call_answer.png b/Telegram/Resources/icons/call_answer.png index f5a9ceb7329b3844598e6db730463b754b85c8c9..0d79a1750d9451a644e2c6dc0e1c051519fe9396 100644 GIT binary patch literal 595 zcmV-Z0<8UsP)(&$@p`@Fd_I$2uSW)hfoisN#!hWG91aHzheLQ23I)kz z(r};1ua4aq1~-L5p+}bcbG2Hv97w8$=JPq_;w2ai^2#SQQb4=ij!dUhE>s{8;B?O_ zq<}EUXf)zt9S#Rh_pCx1sMTs|VqGp5QZAP@I;&o!3e)HF0iG-roC}45)IJJncAfl& zcDv1h8jXh8AZFIf1I1!7xL&V7YlpRhUwnHRFnJ&ZsMqT(OWkf4uwlLc${Y~Z(rh+k zP_yozROGPNx%t zYBrnTa=GpS@dO@^M`lw$Hk%D(v)TI^)z1&}?|{%zI-Q2qYQ%imjK(Sbae!tK9 z)pxp1ry~SXZqDdrt@!Um-zX02**$sYyhwuOZ002ovPDHLkV1f_+1M2_) literal 456 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 TB`juJ00000NkvXXu0mjf!sjcP diff --git a/Telegram/Resources/icons/call_answer@3x.png b/Telegram/Resources/icons/call_answer@3x.png index 0060a291d99ec91ef9de1aa44cba2391fcd4453a..b74b73fef73429710b3962b38908ded12d154223 100644 GIT binary patch literal 1771 zcmcgt={MVn0{tN*6ETTb)J{szkY@C@Qp;QOXcn5v|nF5o(LnG8KwxYiZEZ zk~}50QdL0`W2r`IwIO(>v<4m97_HiBy#L^RdLQn+AMQE#%f08^?6aOOYEWG$003%k zu4L~6jruPjDhHfTJ2!M7pa`M|5dfOIPBq;levL0KXV zAIGMjEPD_oVNf$IG)-I4hoaCc>4iB_Ij9Q%rzN2filwrK>R~Gw8^uctn+eN8VtO^s zS_DZkAYO?gCo@Oqe+c0ys6HVH)z#Ijgu=3_s;YvD3ghB}>FMbKu~Cwzs!$%+2+h8Rbv@aPHjXze?_Sg?V_~oO~x4 zQy{0LbT)J(bC#=t^j8&fZ$CepEaTRWy8<&lKH_|xR7x4e`C1z*YwIoEl^wIR{59j3 zUrL`m3;Oez&@|H)Hm6bfkziE!T7(*RqYHB@qn)kj?B`Pki5Kkc7 z{XQ+EJN52F$lLPj|B%bM-1USDW3F>cOLZ+zb?A{@)#2J3E6<<1b$@@d463KAyF0OI zwPY%2tK##0aLOWAQfIUh9MjF(M<1uD1U-pvS7;RX+rgrZ5Jl;QK~x5VF>QNtLS1IZ z--LU66L7eqX8GA?BZwkZlj85ZE7a7~A{CwduOv?$%WyJBpf!^HNW!55QdfQn=4{?}!7T}rk&8m)!m z6s81#{Ual5T&QQ;yShA`NTfQ8s)BLqoS3x~o~_tcw!XgZN+hxa@k{YiFB>bX_cB@= z6iGqG% zASzBu!Ss%f4rVa(B7s^kB$vy%{8MQvV~milO zIb{(KzQrI24i5L5M{n16MTw2W`7RA338Gk)=9ZSY&WvWdVgk zq1(H^|K^2`i;vIkF;59G`cs;i$lBX3BsF~Yd*`R6=lXQxYkrz?Om1G@5lp9{j*gC7 ze_x-_@@mUtbpyepN3pxIlD(nVu@L)>*||47TGn3Dnm{1f*xCwkcPZZ9*-0v1#dqr) z7$6&2;)Rr~Y#CQTKbp>k6-~0WF{VduW^Pki&qy{n zT=GlAW4jvzn0F{&iq}`_SC^zDyYRLmX)H$QPIjkl{1qB7^FR!fNQuI#4|M>F7R`DwI<(~$IV~woq52M-zD?MHW%y~v@ zYbzx8u-O?VRaY{6-vN~bT-x5(b2)X2EK)T3YXkvWamH0&5Kco<`Ty>xXgQ)GL?>^12B bZS2Bp<_D`dMITfT-V1PZ_9WMnsMr4i6}2QR literal 1024 zcmV+b1poVqP)Mfv`t#HsW8Y|)_>?hFQ`RC^xC+nXc5s1te}!MMG?3#lAyxW9(F(w z87IA3G;`#BD;MKoKF^(d&beb+8ihikP$(1%h4Ks3YW3RMn%C>~|BT1u86F-Mi^Z74 z*4NjAWOR0Rrl+T)5rbS2icL*Ti9{kk+_T_s!@*L_$jCq=76=3g!$~9(o-9Qov6q(@ z!f<(cd6+T=J04*;l}aTP3ekwU-EP8g8jU71GZT&2{rx>*IIt=%E=D7EdwWYBv9Ylc zjo9VoC3!@>UXP|gmzS3ZiFtTr4mvR*Gj9^BAYc~H4Y68#kSJvbSUTO z=H}+t*H>1nqobqB%1W#U1i87ntE;Q5xk79e!eX&}ett$;U0+|9mX`AHRuh|`?RNXg z$qA!mp{ZK2VQe9g!0GAfR1hmFDmptmi*$Q@d^DL%so*v+Fu-`ywzjt9ayfc2u~>X~ zc*xirM@B{j0s(qAqtW>G_7*Aj^z@V>3vyy&f|0cI^YgN@GW25k`S}+Y7Yw)U?d_bL z9Q1B_z25KlGu##z7kP5D_$&JQ`l6ex+1Xi4uO?U#i9};#V+^scudkVznS}BN3%ISV zt+llkKJX>s1qB7H@0nmtLf=eySOoLI$H&L}`@7riURqk}>FH@`XecZ!R45b>Bs)7> zB9Ugs;a80 z=&B7|U0s>Y<`}tRG-z=d931@byn!3*@qyRt9UUEo@(_LfPq~T#w5A+9ZyJqeV`GE$ zhIV##+S}X1S5{Y7!vqve9B5NHE8OGb<3Ih_b8~YgB_*%|9S%n@DWGz4wok$i*4x_~ zUAx0W_sz{sFj=@13!Q2~Ujp4@@UP)mEOJ>sKR>6MSa`-cI5-Fd0;whj2!%qc)tcNk z$ZN3>&?4Dvwzx;-_{74;L0w&4&=C53z9hs5|8&CHa3PgS>+9>Anwm@|Q%g$=`4{2m zfO3Lh@KGw2wY9a7!-a(flKQr?vcl_(v6l6$tSq@)UQtm|Q&R)onOdy|ZJ1nONDF1j uZnyXM_q$xKGzx`6p-?Ck3ME;-1sDLXr<3DN-@Tv!0000$adZ=w+Zps9aTZhu3vfhdslM${p7NOC~Z^$e*)k^_=1o}scVVHgHL#J4KN z7Dd6Xo2DsbS;lI|LHfB~R?j7AZq1{lW?k|a4rTkSNsJp>2hHsk^lZyC3XkYmAt z)^+vb4-VA#y%!J#?oHsYB|J8B&KN2PFLt X4%|7-VJS|E00000NkvXXu0mjfMMk2^ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/call_camera_active@2x.png b/Telegram/Resources/icons/call_camera_active@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3692b731e0c0b15d2e3801a060e1acef7abc4995 GIT binary patch literal 733 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 Aj{pDw literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/call_camera_muted@3x.png b/Telegram/Resources/icons/call_camera_muted@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd2aa9dba1cd3335ea84c3e621feb407b1fd2c7 GIT binary patch literal 2114 zcmb_e_ct4g7muw(sTm%=DvyelC@JdM)LubRt9f1#wPRK*ZJOA}Dm7}A1mzjg7}eH@ zpk^yIn^2>?wl=k?mwx|)?>XNe?!7VlQR0XZ9b`ni~%3!vu zI>|xORwV=AY@_7B>blt+Ka|7o2x$x1oytQt(;aS1nF2*$nn?I#Cth-Qc7M({dNgE( zq3t(XjNaTFZ$V?wE77C(_0Su|I_Q;~F(p?{^;Odasv`)cjFBi-;2aD_D|3BF&&zL)3D8-XD4&t zK33UO{^POE4r}!~X{f2OWVAz{Io;vnJqz%_!;;nqTYM<~kQe`~Zzd+CTqQPR#%dYDy#*(y z&>`)Ng5rkiY5|vekE~aN{i7wiN?UF&D_xNXpVMIGUuRxcwZ-oGdSwPKjK6SHw%L@T z6v50_Cu;NB9-OocJL^R)QZI}Vt;A-*bsnvnNH>9*X&aitw@bdR9d6AhR}+iW8)4s zLM4anCnz_6fI4yvMY6>HBUGU6qMOU;gJokA)jq6 z*}6V=VwBj@YCv4U6E)6X1~_sxRsAS?GoqXzdP@+Pc;qNZ?Zlib_zrF>#JINxJC6$e z4a#-&@!ZF=P@bx|o1?UjBY8POSB49c9UZmdOTpZ1%_Gk=pU@g@tLz0DyxtaSspLAU zZ=}OA>131;WWDPVTi-(b&(oQh(I!F8d#h6od6qr8*BBGF2!$kz@a2~0;Q@WK5=d>( z>SWy$%hkEJuiN6!?$sCWV0g;ISuIQzt9%(Y$oZGPBN8t(7^!iGThG}qOO?ye+^G%! z%@yJNYh+{ufnwtX3P8O((yBgrJ;qiS86dI-Ux-J$gS6mqxCN0<>bldLxC2}4RmpOh zgu69n)kTG22Y8l+?-R8|TBw=Za=0LegQs1aJd?hc1m)q~<-uG8s_o?D?BoD8W`M(j zsu5eVzns@81`)j}A_&ySN}JR-qUMIm(}>$_OrCGZxJOe>cZLWwQK*+>*GyOzcA9h( z*}#O_rU@mac3b7C=33rGp|TKFG93?2Zr<{iGhZH0%PWC(;mC4UPtA$z(7nfxn~VkJ#|?*Ys{l&O9r35bpHs#6{V)QRa6(A#?P50F^}w9*`5W_uYB4fp*?j zbYUv5qp^q_ySsuXOiWIuT(K*`EndxM7M}5-NYNkhw8!9YGHyX7Q!#%_J9>kWDLI_z z!jbIuE`O^A;e-}-g?b__^c$TY+D9%D7PjYDFXO*2@!n&w%gkO&TK_1Lfcns@;6MXN zpyAvygWJc)$M24^+K-Zdxw!aJoEHfr`D(^)7g_A)(|>KW@#`eW_wj3m+Y$H$YhcC? z;o5m%mSPN$X9@&oY0;Ix|MT?d;>bMd_Us$#{x=@uiniXYJ1ECW>#>AX=+aOgR7?!& zC0tim7bJLLzCDNt1xods_t3$5A5+3)1>rR2I6~xY3JJWl$^9rCF@g*+me36L_@Ybt zkA6J2^_gmvzQ`viKN6sZq_DH7IdxzE!{!B`E@sk`_a$){h`(cFW+ zEC-~8s%ctE*bZze?j#Y9zv6SIve`;412U9& z^}hZ*-dk-c_2QX??1!7iah+m33~q1Dch6Cig>=uy=XOisyQiqR0@fbNRU)`Uy)WKb zrvp-t!~%HL4afexDC&EuCArcy|3Zo=x)GMzXrs|fv9>4YKgPS^g32MHzS#0!N#$YL zKp`6vOh{N|M-Rn{MK$Jj`yIs_mL@IxS!LCsJPF)^ImPnR0DR d_v0?!(#l{5?7DH`fD2!A@ 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 diff --git a/Telegram/Resources/icons/call_record_active.png b/Telegram/Resources/icons/call_record_active.png index 4659bbb6c867209b1b34b08c808ba6e3e32dda8f..79447233a7ce6a760cec75df6e5d34c7b8e573ba 100644 GIT binary patch literal 489 zcmV#Cm0I37l$SuU4(v)SiedS}kMDTt`-^ zRIs6^@yh>{nBmApC<8CI%MwyaXca14p~YfB?v`OlUrzXXd926VYxsNe5X9LIDzoy7KfJ@F%s zyynH?`@PVC#TtG?GN{u(vd5a? za43XeA7i>}?O$2i;9o}}gx2dd?RGm_tya0omQn;cx7lyY6|xGc f6i~&#?hgF`?b+AyuCrT600000NkvXXu0mjfAwS$w literal 412 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 literal 945 zcmV;i15W&jP)a`-@!z;WD z_ukC0nQ11@vvWB2-22RPKJL9^R~G_-Kp@nD!C>%sJgHRb{{H^;^|fBF=W@AZGC4at zt7BGnyFHW1G(N%k`MJ$z(;q9h+x_(P)M$xXt;X}b&b0cH)qiff(GBvdMFi3~J3G?{ zF{l;|i4X)q_GK7l_vrO{RT%OEfXXgav1~Rge@4je5&9L!agv5We>0g(S|$%R;!7Bn$2d~rcfwIC6>?U>4${#YPG5$v0|}Eyj0qzg9}jRkg>6`@4PQ* z#BOeG#6PE|rf8ep-Ce1~_V)JZhlKOn+gk-Qa&>i;_+r8|gXisEDyGwErjyIdOR?F? z%8G)-CMPF}Wf1|>gw1AyY;1>Bxm;$(v)yhdEGH%=lr5vz*Vp3tqR}YRjOY0;xm79^ zm&?T*9*f1qmRDC-iuZ@LwKbv&kBp2kEkQS^3ZJn$IXPjf4HzFEe|viq8~go!#fkOz z_e1=MXFWbXZgGz*2tp!}$Y!&D{^9QKE*_81%*=dR&5Xv=(^IkkQmNF}*QZ8P4+H|l z>kkHlaybu&!-Vto^>vkYD?L3uP<)B$mzI`fuetzeFx}nV>g~j)r>BWDXzJGSw*`p6 zt*tG>Axr@islCfwTwJ6}!qL$Ya|78L!^6YS&1i43M1ef{0C;|W-rU?A7#L{BgT-Qr zL?TdBXg@nUJ3o0kfMqeOIjnVme}7?N0hUgWvRbWPulL~K0J;Tp_z$ycVtIL)&Nne0 z9v&_(E)EY5Ay6}!%;V!@3*-0qcc0Ivl~bL=;ebxn_%?F6oYU#l)`_*Zw->4+Bv@yZ zUS3`{Ha5VCMi1mrGq$(4A@n!A2G~P#+&3G#PjZp$i7{ z^Yg0qUl{=>e3}^ZPC;H6RNzKm8_NFY2fThmVn_^$Au%L|Kp+qZ1OlNj{t7Svj(H8B T+5qV^00000NkvXXu0mjfC=0uO diff --git a/Telegram/Resources/icons/call_record_muted.png b/Telegram/Resources/icons/call_record_muted.png index 0747c8afa4b5c00fcfff75f64be02c363e4bc195..ac6b48bf88e4d4c527eddc4fb211d5bb1a6e03b6 100644 GIT binary patch literal 744 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 Vkz32R+aCY`002ovPDHLkV1k!LlCJ;& diff --git a/Telegram/Resources/icons/call_record_muted@3x.png b/Telegram/Resources/icons/call_record_muted@3x.png index dbdc210e47feba6beae12e27e3b79706e8fadc0c..62f9f8a6a08368675de2d693095749653e33b2ba 100644 GIT binary patch literal 2435 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 literal 1089 zcmV-H1it%;P)R8Zj6#B-T|~5uiZ*Vn$lUZHXhrlzR^&T8 zL58{Gb?%HabLTPtmCBi!^P79`Ip>~hS(zqHnlx#WOFEryU|?WlVu@;S-`}rds*aA1)6>&z0UaM7x3{;ekE*Y)@9pg^i`DDvtHa??%*FEZ@<=2yJUmP^ zRz<1uY|4xqQ0?sOfCsQbc(TE|!puNaM@L7BQRT#w4WdPsP)?^)Rxp@>ED!jwK@21X z3xz_mf{l!f00}7@M0QfJcswrmY!twT+85R5=cfYkgOu&|_BKl{Wg z1Gew)Z|T^SEGCH9T3T9&*c2|5q+?UQ2qa~@ySq~d7={gg7tBUW@$PcDO3Oyk#)OEi zwY3$`M%SjRglyDpC`sAw@9)(CRw_118v&!Eqx{*dRx8RzZ<9kL8`TXQF>JIqr+^Jz zKNz-TGN}$Q(9h4005-LPVc6Q*+JH@Ar&-%gv)PQ=yuZH}%EE=%nwy)^9~&APH;EjW;(pd9!FV zDtW~BcsxwcGMNl(l`|8Rm^lf9mSRdbUH(!P&^)o zLLVOlInwr(sRhWDHkscl%^1)_$dYWFg zvVZ@485|s3Uthnvy88Y7<>W~u62V|_XlSUSqJnwt)YKH!YPP#8P#z z3Fy?TgH6~GgbLUMpRG(zPEyS#=Fn(jVuD^ak*8twvWY+D8y_D>tG1$jJ{5qWY*1nA z_4@w-3^X=2mSdxWs)S& +#include namespace tgcalls { class InstanceImpl; @@ -42,6 +43,7 @@ namespace { constexpr auto kMinLayer = 65; constexpr auto kHangupTimeoutMs = 5000; constexpr auto kSha256Size = 32; +constexpr auto kDropFramesWhileInactive = 5 * crl::time(1000); const auto kDefaultVersion = "2.4.4"_q; const auto RegisterTag = tgcalls::Register(); @@ -319,12 +321,31 @@ void Call::actuallyAnswer() { }).send(); } -void Call::setMute(bool mute) { - _mute = mute; +void Call::setMuted(bool mute) { + _muted = mute; if (_instance) { - _instance->setMuteMicrophone(_mute); + _instance->setMuteMicrophone(mute); + } +} + +void Call::setVideoEnabled(bool enabled) { + if (_state.current() != State::Established) { + return; + } + _videoEnabled = enabled; + if (enabled) { + if (!_videoCapture) { + _videoCapture = tgcalls::VideoCaptureInterface::Create(); + } + if (_instance) { + _instance->requestVideo(_videoCapture); + } else { + _videoState = VideoState::OutgoingRequested; + } + _videoCapture->setIsVideoEnabled(true); + } else if (_videoCapture) { + _videoCapture->setIsVideoEnabled(false); } - _muteChanged.notify(_mute); } crl::time Call::getDurationMs() const { @@ -430,6 +451,7 @@ bool Call::handleUpdate(const MTPPhoneCall &call) { } _id = data.vid().v; _accessHash = data.vaccess_hash().v; + setVideoEnabled(data.is_video()); auto gaHashBytes = bytes::make_span(data.vg_a_hash().v); if (gaHashBytes.size() != kSha256Size) { LOG(("Call Error: Wrong g_a_hash size %1, expected %2." @@ -650,7 +672,7 @@ void Call::createAndStartController(const MTPDphoneCall &call) { .encryptionKey = tgcalls::EncryptionKey( std::move(encryptionKeyValue), (_type == Type::Outgoing)), - .videoCapture = nullptr, + .videoCapture = _videoEnabled.current() ? _videoCapture : nullptr, .stateUpdated = [=](tgcalls::State state, tgcalls::VideoState videoState) { crl::on_main(weak, [=] { handleControllerStateChange(state, videoState); @@ -662,6 +684,14 @@ void Call::createAndStartController(const MTPDphoneCall &call) { }); }, .remoteVideoIsActiveUpdated = [=](bool active) { + crl::on_main(weak, [=] { + if (!active) { + _frames.fire(QImage()); + _remoteVideoInactiveFrom = crl::now(); + } else { + _remoteVideoInactiveFrom = 0; + } + }); }, .signalingDataEmitted = [=](const std::vector &data) { const auto bytes = QByteArray( @@ -706,8 +736,6 @@ void Call::createAndStartController(const MTPDphoneCall &call) { } } - descriptor.videoCapture = tgcalls::CreateVideoCapture(); - const auto version = call.vprotocol().match([&]( const MTPDphoneCallProtocol &data) { return data.vlibrary_versions().v; @@ -727,13 +755,18 @@ void Call::createAndStartController(const MTPDphoneCall &call) { } const auto raw = _instance.get(); - if (_mute) { - raw->setMuteMicrophone(_mute); + if (_muted.current()) { + raw->setMuteMicrophone(_muted.current()); } const auto &settings = Core::App().settings(); raw->setIncomingVideoOutput(webrtc::CreateVideoSink([=](QImage frame) { crl::on_main(weak, [=] { - _frames.fire_copy(frame); + if (_remoteVideoInactiveFrom > 0 + && (_remoteVideoInactiveFrom + kDropFramesWhileInactive + > crl::now())) { + } else { + _frames.fire_copy(frame); + } }); })); raw->setAudioOutputDevice( @@ -748,6 +781,18 @@ void Call::createAndStartController(const MTPDphoneCall &call) { void Call::handleControllerStateChange( tgcalls::State state, tgcalls::VideoState videoState) { + _videoState = [&] { + switch (videoState) { + case tgcalls::VideoState::Possible: return VideoState::Disabled; + case tgcalls::VideoState::OutgoingRequested: + return VideoState::OutgoingRequested; + case tgcalls::VideoState::IncomingRequested: + return VideoState::IncomingRequested; + case tgcalls::VideoState::Active: return VideoState::Enabled; + } + Unexpected("VideoState value in Call::handleControllerStateChange."); + }(); + switch (state) { case tgcalls::State::WaitInit: { DEBUG_LOG(("Call Info: State changed to WaitingInit.")); @@ -780,10 +825,7 @@ void Call::handleControllerBarCountChange(int count) { } void Call::setSignalBarCount(int count) { - if (_signalBarCount != count) { - _signalBarCount = count; - _signalBarCountChanged.notify(count); - } + _signalBarCount = count; } template @@ -986,9 +1028,7 @@ void Call::handleControllerError(const QString &error) { void Call::destroyController() { if (_instance) { - AssertIsDebug(); const auto state = _instance->stop(); - LOG(("CALL_LOG: %1").arg(QString::fromStdString(state.debugLog))); DEBUG_LOG(("Call Info: Destroying call controller..")); _instance.reset(); diff --git a/Telegram/SourceFiles/calls/calls_call.h b/Telegram/SourceFiles/calls/calls_call.h index 343a20a32..c5b4c39e6 100644 --- a/Telegram/SourceFiles/calls/calls_call.h +++ b/Telegram/SourceFiles/calls/calls_call.h @@ -21,6 +21,7 @@ class Track; namespace tgcalls { class Instance; +class VideoCaptureInterface; enum class State; enum class VideoState; } // namespace tgcalls @@ -91,29 +92,50 @@ public: Ringing, Busy, }; - State state() const { + [[nodiscard]] State state() const { return _state.current(); } - rpl::producer stateValue() const { + [[nodiscard]] rpl::producer stateValue() const { return _state.value(); } + enum class VideoState { + Disabled, + OutgoingRequested, + IncomingRequested, + Enabled + }; + [[nodiscard]] VideoState videoState() const { + return _videoState.current(); + } + [[nodiscard]] rpl::producer videoStateValue() const { + return _videoState.value(); + } + static constexpr auto kSignalBarStarting = -1; static constexpr auto kSignalBarFinished = -2; static constexpr auto kSignalBarCount = 4; - base::Observable &signalBarCountChanged() { - return _signalBarCountChanged; + [[nodiscard]] rpl::producer signalBarCountValue() const { + return _signalBarCount.value(); } - void setMute(bool mute); - bool isMute() const { - return _mute; + void setMuted(bool mute); + [[nodiscard]] bool muted() const { + return _muted.current(); } - base::Observable &muteChanged() { - return _muteChanged; + [[nodiscard]] rpl::producer mutedValue() const { + return _muted.value(); } - rpl::producer frames() const { + void setVideoEnabled(bool enabled); + [[nodiscard]] bool videoEnabled() const { + return _videoEnabled.current(); + } + [[nodiscard]] rpl::producer videoEnabledValue() const { + return _videoEnabled.value(); + } + + [[nodiscard]] rpl::producer frames() const { return _frames.events(); } @@ -178,17 +200,18 @@ private: MTP::Sender _api; Type _type = Type::Outgoing; rpl::variable _state = State::Starting; + rpl::variable _videoState = VideoState::Disabled; FinishType _finishAfterRequestingCall = FinishType::None; bool _answerAfterDhConfigReceived = false; - int _signalBarCount = kSignalBarStarting; - base::Observable _signalBarCountChanged; + rpl::variable _signalBarCount = kSignalBarStarting; crl::time _startTime = 0; base::DelayedCallTimer _finishByTimeoutTimer; base::Timer _discardByTimeoutTimer; - bool _mute = false; - base::Observable _muteChanged; + rpl::variable _muted = false; + rpl::variable _videoEnabled = false; rpl::event_stream _frames; + crl::time _remoteVideoInactiveFrom = 0; DhConfig _dhConfig; bytes::vector _ga; @@ -203,6 +226,7 @@ private: uint64 _keyFingerprint = 0; std::unique_ptr _instance; + std::shared_ptr _videoCapture; std::unique_ptr _waitingTrack; diff --git a/Telegram/SourceFiles/calls/calls_panel.cpp b/Telegram/SourceFiles/calls/calls_panel.cpp index 1bfdc9eba..bc34d8d81 100644 --- a/Telegram/SourceFiles/calls/calls_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_panel.cpp @@ -89,9 +89,10 @@ SignalBars::SignalBars( resize( _st.width + (_st.width + _st.skip) * (Call::kSignalBarCount - 1), _st.width * Call::kSignalBarCount); - subscribe(call->signalBarCountChanged(), [=](int count) { + call->signalBarCountValue( + ) | rpl::start_with_next([=](int count) { changed(count); - }); + }, lifetime()); } bool SignalBars::isDisplayed() const { @@ -307,6 +308,7 @@ Panel::Panel(not_null call) , _answerHangupRedial(this, st::callAnswer, &st::callHangup) , _decline(this, object_ptr