1111#include "util/env.h"
1212#include "util/file.h"
1313#include "util/log.h"
14+ #include "util/net.h"
1415#include "util/net_intr.h"
1516#include "util/process.h"
1617#include "util/str.h"
@@ -555,6 +556,7 @@ sc_server_init(struct sc_server *server, const struct sc_server_params *params,
555556 server -> video_socket = SC_SOCKET_NONE ;
556557 server -> audio_socket = SC_SOCKET_NONE ;
557558 server -> control_socket = SC_SOCKET_NONE ;
559+ server -> mic_socket = SC_SOCKET_NONE ;
558560
559561 sc_adb_tunnel_init (& server -> tunnel );
560562
@@ -597,10 +599,12 @@ sc_server_connect_to(struct sc_server *server, struct sc_server_info *info) {
597599 bool video = server -> params .video ;
598600 bool audio = server -> params .audio ;
599601 bool control = server -> params .control ;
602+ bool microphone = server -> params .microphone ;
600603
601604 sc_socket video_socket = SC_SOCKET_NONE ;
602605 sc_socket audio_socket = SC_SOCKET_NONE ;
603606 sc_socket control_socket = SC_SOCKET_NONE ;
607+ sc_socket mic_socket = SC_SOCKET_NONE ;
604608 if (!tunnel -> forward ) {
605609 if (video ) {
606610 video_socket =
@@ -625,6 +629,14 @@ sc_server_connect_to(struct sc_server *server, struct sc_server_info *info) {
625629 goto fail ;
626630 }
627631 }
632+
633+ if (microphone ) {
634+ mic_socket =
635+ net_accept_intr (& server -> intr , tunnel -> server_socket );
636+ if (mic_socket == SC_SOCKET_NONE ) {
637+ goto fail ;
638+ }
639+ }
628640 } else {
629641 uint32_t tunnel_host = server -> params .tunnel_host ;
630642 if (!tunnel_host ) {
@@ -681,14 +693,19 @@ sc_server_connect_to(struct sc_server *server, struct sc_server_info *info) {
681693 }
682694 }
683695
696+ // Disable Nagle's algorithm for the control socket
697+ // (it only impacts the sending side, so it is useless to set it
698+ // for the other sockets)
684699 if (control_socket != SC_SOCKET_NONE ) {
685- // Disable Nagle's algorithm for the control socket
686- // (it only impacts the sending side, so it is useless to set it
687- // for the other sockets)
688700 bool ok = net_set_tcp_nodelay (control_socket , true);
689701 (void ) ok ; // error already logged
690702 }
691703
704+ if (mic_socket != SC_SOCKET_NONE ) {
705+ bool ok = net_set_tcp_nodelay (mic_socket , true);
706+ (void ) ok ; // error already logged
707+ }
708+
692709 // we don't need the adb tunnel anymore
693710 sc_adb_tunnel_close (tunnel , & server -> intr , serial ,
694711 server -> device_socket_name );
@@ -706,10 +723,12 @@ sc_server_connect_to(struct sc_server *server, struct sc_server_info *info) {
706723 assert (!video || video_socket != SC_SOCKET_NONE );
707724 assert (!audio || audio_socket != SC_SOCKET_NONE );
708725 assert (!control || control_socket != SC_SOCKET_NONE );
726+ assert (!microphone || mic_socket != SC_SOCKET_NONE );
709727
710728 server -> video_socket = video_socket ;
711729 server -> audio_socket = audio_socket ;
712730 server -> control_socket = control_socket ;
731+ server -> mic_socket = mic_socket ;
713732
714733 return true;
715734
@@ -732,6 +751,12 @@ sc_server_connect_to(struct sc_server *server, struct sc_server_info *info) {
732751 }
733752 }
734753
754+ if (mic_socket != SC_SOCKET_NONE ) {
755+ if (!net_close (mic_socket )) {
756+ LOGW ("Could not close microphone socket" );
757+ }
758+ }
759+
735760 if (tunnel -> enabled ) {
736761 // Always leave this function with tunnel disabled
737762 sc_adb_tunnel_close (tunnel , & server -> intr , serial ,
@@ -1121,6 +1146,11 @@ run_server(void *data) {
11211146 net_interrupt (server -> control_socket );
11221147 }
11231148
1149+ if (server -> mic_socket != SC_SOCKET_NONE ) {
1150+ // There is no control_socket if --no-microphone is set
1151+ net_interrupt (server -> mic_socket );
1152+ }
1153+
11241154 // Give some delay for the server to terminate properly
11251155#define WATCHDOG_DELAY SC_TICK_FROM_SEC(1)
11261156 sc_tick deadline = sc_tick_now () + WATCHDOG_DELAY ;
@@ -1189,6 +1219,9 @@ sc_server_destroy(struct sc_server *server) {
11891219 if (server -> control_socket != SC_SOCKET_NONE ) {
11901220 net_close (server -> control_socket );
11911221 }
1222+ if (server -> mic_socket != SC_SOCKET_NONE ) {
1223+ net_close (server -> mic_socket );
1224+ }
11921225
11931226 free (server -> serial );
11941227 free (server -> device_socket_name );
0 commit comments