|
|
|
@ -41,6 +41,7 @@ struct scrcpy {
|
|
|
|
|
struct sc_server server;
|
|
|
|
|
struct sc_screen screen;
|
|
|
|
|
struct sc_demuxer video_demuxer;
|
|
|
|
|
struct sc_demuxer audio_demuxer;
|
|
|
|
|
struct sc_decoder decoder;
|
|
|
|
|
struct sc_recorder recorder;
|
|
|
|
|
#ifdef HAVE_V4L2
|
|
|
|
@ -225,6 +226,16 @@ sc_video_demuxer_on_ended(struct sc_demuxer *demuxer, bool eos,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
sc_audio_demuxer_on_ended(struct sc_demuxer *demuxer, bool eos,
|
|
|
|
|
void *userdata) {
|
|
|
|
|
(void) demuxer;
|
|
|
|
|
(void) eos;
|
|
|
|
|
(void) userdata;
|
|
|
|
|
|
|
|
|
|
// Contrary to the video demuxer, keep mirroring if only the audio fails
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
sc_server_on_connection_failed(struct sc_server *server, void *userdata) {
|
|
|
|
|
(void) server;
|
|
|
|
@ -283,6 +294,7 @@ scrcpy(struct scrcpy_options *options) {
|
|
|
|
|
bool v4l2_sink_initialized = false;
|
|
|
|
|
#endif
|
|
|
|
|
bool video_demuxer_started = false;
|
|
|
|
|
bool audio_demuxer_started = false;
|
|
|
|
|
#ifdef HAVE_USB
|
|
|
|
|
bool aoa_hid_initialized = false;
|
|
|
|
|
bool hid_keyboard_initialized = false;
|
|
|
|
@ -390,6 +402,14 @@ scrcpy(struct scrcpy_options *options) {
|
|
|
|
|
sc_demuxer_init(&s->video_demuxer, "video", s->server.video_socket,
|
|
|
|
|
&video_demuxer_cbs, NULL);
|
|
|
|
|
|
|
|
|
|
if (options->audio) {
|
|
|
|
|
static const struct sc_demuxer_callbacks audio_demuxer_cbs = {
|
|
|
|
|
.on_ended = sc_audio_demuxer_on_ended,
|
|
|
|
|
};
|
|
|
|
|
sc_demuxer_init(&s->audio_demuxer, "audio", s->server.audio_socket,
|
|
|
|
|
&audio_demuxer_cbs, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool needs_decoder = options->display;
|
|
|
|
|
#ifdef HAVE_V4L2
|
|
|
|
|
needs_decoder |= !!options->v4l2_device;
|
|
|
|
@ -629,6 +649,13 @@ aoa_hid_end:
|
|
|
|
|
}
|
|
|
|
|
video_demuxer_started = true;
|
|
|
|
|
|
|
|
|
|
if (options->audio) {
|
|
|
|
|
if (!sc_demuxer_start(&s->audio_demuxer)) {
|
|
|
|
|
goto end;
|
|
|
|
|
}
|
|
|
|
|
audio_demuxer_started = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = event_loop(s);
|
|
|
|
|
LOGD("quit...");
|
|
|
|
|
|
|
|
|
@ -678,6 +705,10 @@ end:
|
|
|
|
|
sc_demuxer_join(&s->video_demuxer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (audio_demuxer_started) {
|
|
|
|
|
sc_demuxer_join(&s->audio_demuxer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_V4L2
|
|
|
|
|
if (v4l2_sink_initialized) {
|
|
|
|
|
sc_v4l2_sink_destroy(&s->v4l2_sink);
|
|
|
|
|