Commit graph

424 commits

Author SHA1 Message Date
Romain Vimont
a68500aa13 audio_player WIP 2023-02-25 19:39:29 +01:00
Romain Vimont
b0f4857ca1 Log display sizes in display list
This is more convenient than just the display id alone.
2023-02-25 19:39:11 +01:00
Romain Vimont
e1146666dc Add --list-device-displays 2023-02-25 19:39:11 +01:00
Romain Vimont
2109d15e6c Move log message helpers to LogUtils
This class will also contain other log helpers.
2023-02-25 19:39:11 +01:00
Romain Vimont
f91f5ad637 Quit on audio configuration failure
When audio capture fails on the device, scrcpy continue mirroring the
video stream. This allows to enable audio by default only when
supported.

However, if an audio configuration occurs (for example the user
explicitly selected an unknown audio encoder), this must be treated as
an error and scrcpy must exit.
2023-02-25 19:39:11 +01:00
Romain Vimont
4b710b5307 Add --list-encoders
Add an option to list the device encoders properly.
2023-02-25 19:39:11 +01:00
Romain Vimont
a388caafe9 Add --audio-encoder
Similar to --video-encoder, but for audio.
2023-02-25 19:39:11 +01:00
Romain Vimont
82d92948d5 Extract unknown encoder error message
This will allow to reuse the same code for audio encoder selection.
2023-02-25 19:39:11 +01:00
Romain Vimont
0d72399bc1 Add --audio-codec-options
Similar to --video-codec-options, but for audio.
2023-02-25 19:39:11 +01:00
Romain Vimont
24ae14cf46 Extract application of codec options
This will allow to reuse the same code for audio codec options.
2023-02-25 19:39:11 +01:00
Romain Vimont
269bffdbf9 Add support for AAC audio codec
Add option --audio-codec=aac.
2023-02-25 19:39:11 +01:00
Romain Vimont
ed1de493f9 Add --audio-codec
Introduce the selection mechanism. Alternative codecs will be added
later.
2023-02-25 19:39:11 +01:00
Romain Vimont
00c8d9e289 Add --audio-bit-rate
Add an option to configure the audio bit-rate.
2023-02-25 19:39:11 +01:00
Romain Vimont
39dd5da9cd Disable MethodLength checkstyle on createOptions()
This method will grow as needed to initialize options.
2023-02-25 19:39:11 +01:00
Romain Vimont
4294573225 Rename --encoder to --video-encoder
This prepares the introduction of --audio-encoder.
2023-02-25 19:39:11 +01:00
Romain Vimont
ea32ed6444 Rename --codec-options to --video-codec-options
This prepares the introduction of --audio-codec-options.
2023-02-25 19:39:11 +01:00
Romain Vimont
802fdf3e0b Rename --bit-rate to --video-bit-rate
This prepares the introduction of --audio-bit-rate.
2023-02-25 19:39:11 +01:00
Romain Vimont
e565d31c59 Rename --codec to --video-codec
This prepares the introduction of --audio-codec.
2023-02-25 19:39:11 +01:00
Romain Vimont
c7324e16c7 Disable audio before Android 11
The permission "android.permission.RECORD_AUDIO" has been added for
shell in Android 11.

Moreover, on lower versions, it may make the server segfault on the
device (happened on a Nexus 5 with Android 6.0.1).

Refs <4feeee8891%5E%21/>
2023-02-25 19:39:11 +01:00
Romain Vimont
0e84fe12d6 Disable audio on initialization error
By default, audio is enabled (--no-audio must be explicitly passed to
disable it).

However, some devices may not support audio capture (typically devices
below Android 11, or Android 11 when the shell application is not
foreground on start).

In that case, make the server notify the client to dynamically disable
audio forwarding so that it does not wait indefinitely for an audio
stream.

Also disable audio on unknown codec or missing decoder on the
client-side, for the same reasons.
2023-02-25 19:39:11 +01:00
Romain Vimont
92b4ee21fe Extract OPUS extradata
For OPUS codec, FFmpeg expects the raw extradata, but MediaCodec wraps
it in some structure.

Fix the config packet to send only the raw extradata.
2023-02-25 19:39:11 +01:00
Romain Vimont
c8749db90b Use a streamer to send the audio stream
Send each encoded audio packet using a streamer.
2023-02-25 19:39:11 +01:00
Romain Vimont
57b6110e72 Encode recorded audio on the device
For now, the encoded packets are just logged into the console.
2023-02-25 19:39:11 +01:00
Simon Chan
f479beef83 Capture device audio
Create an AudioRecorder to capture the audio source REMOTE_SUBMIX.

For now, the captured packets are just logged into the console.

Co-authored-by: Romain Vimont <rom@rom1v.com>
Signed-off-by: Romain Vimont <rom@rom1v.com>
2023-02-24 21:29:30 +01:00
Simon Chan
114e226164 Add a new socket for audio stream
When audio is enabled, open a new socket to send the audio stream from
the device to the client.

Co-authored-by: Romain Vimont <rom@rom1v.com>
Signed-off-by: Romain Vimont <rom@rom1v.com>
2023-02-24 21:29:30 +01:00
Simon Chan
241d41b683 Add --no-audio option
Audio will be enabled by default (when supported). Add an option to
disable it.

Co-authored-by: Romain Vimont <rom@rom1v.com>
Signed-off-by: Romain Vimont <rom@rom1v.com>
2023-02-24 21:29:30 +01:00
Romain Vimont
4997a2e6a3 Use FakeContext for Application instance
This will expose the correct package name and UID to the application
context.
2023-02-24 21:29:30 +01:00
Romain Vimont
453eca7c18 Use shell package name for workarounds
For consistency.
2023-02-24 21:29:30 +01:00
Romain Vimont
de31f4e9a5 Use PACKAGE_NAME from FakeContext
Remove duplicated constant.
2023-02-24 21:29:30 +01:00
Romain Vimont
6dacd1ad62 Use AttributionSource from FakeContext
FakeContext already provides an AttributeSource instance.

Co-authored-by: Simon Chan <1330321+yume-chan@users.noreply.github.com>
2023-02-24 21:29:30 +01:00
Simon Chan
0e8705f611 Add a fake Android Context
Since scrcpy-server is not an Android application (it's a java
executable), it has no Context.

Some features will require a Context instance to get the package name
and the UID. Add a FakeContext for this purpose.

Co-authored-by: Romain Vimont <rom@rom1v.com>
Signed-off-by: Romain Vimont <rom@rom1v.com>
2023-02-24 21:29:30 +01:00
Romain Vimont
e982679166 Use Process.ROOT_UID
Replace ServiceManager.USER_ID by existing constant Process.ROOT_UID.
2023-02-24 21:29:30 +01:00
Romain Vimont
bcd6a998b8 Improve error message for unknown encoder
The provided encoder name depends on the selected codec. Improve the
error message and the suggestions.
2023-02-24 21:29:30 +01:00
Romain Vimont
23a6b3e6c2 Rename "codec" variable to "mediaCodec"
This will allow to use "codec" for the Codec type.
2023-02-24 21:29:30 +01:00
Romain Vimont
91e2e8a5a5 Make streamer independent of codec type
Rename VideoStreamer to Streamer, and extract a Codec interface which
will also support audio codecs.
2023-02-24 21:29:30 +01:00
Romain Vimont
f5d0e3211c Pass all args to ScreenEncoder constructor
There is no good reason to pass some of them in the constructor and some
others as parameters of the streamScreen() method.
2023-02-24 21:29:30 +01:00
Romain Vimont
260d411c34 Move screen encoder initialization
This prepares further refactors.
2023-02-24 21:29:30 +01:00
Romain Vimont
92098d2a06 Write streamer header from ScreenEncoder
The screen encoder is responsible to write data to the video streamer.
2023-02-24 21:29:30 +01:00
Romain Vimont
768f5714d2 Use VideoStreamer directly from ScreenEncoder
The Callbacks interface notifies new packets. But in addition, the
screen encoder will need to write headers on start.

We could add a function onStart(), but for simplicity, just remove the
interface, which brings no value, and call the streamer directly.

Refs 87972e2022
2023-02-24 21:29:30 +01:00
Romain Vimont
7650f41aad Simplify error handling on socket creation
On any error, all previously opened sockets must be closed.

Handle these errors in a single catch-block. Currently, there are only 2
sockets, but this will simplify even more with more sockets.

Note: this commit is better displayed with --ignore-space-change (-b).
2023-02-24 21:29:30 +01:00
Romain Vimont
bdfb8ae725 Do not print stacktraces when unnecessary
User-friendly error messages are printed on specific configuration
exceptions. In that case, do not print the stacktrace.

Also handle the user-friendly error message directly where the error
occurs, and print multiline messages in a single log call, to avoid
confusing interleaving.
2023-02-23 13:27:34 +01:00
Romain Vimont
ebecbe6bc6 Fix inconsistent quotes
The encoder name started with a simple quote but ended with a
double quote. Use a single quote for both.
2023-02-19 16:18:19 +01:00
Romain Vimont
d5dff239c8 Suggest commands with an explicit '=' 2023-02-19 16:18:19 +01:00
Romain Vimont
5cf86ef7ff Move finally-block to fix deadlock on stop
DesktopConnection implements Closeable, so it is implicitly closed after
its try-with-resources block. Closing the DesktopConnection shutdowns
the sockets, so it is necessary in particular to wake up blocking read()
calls from the controller.

But the controller thread was joined before the DesktopConnection was
closed, causing a deadlock. To fix the problem, join the controller
thread only after the DesktopConnection is closed.

Refs 400a1c69b1
2023-02-19 15:59:05 +01:00
Romain Vimont
f4e7085c34 Log non-EPIPE I/O exceptions
On close, the client closes the socket. This wakes up socket blocking
calls on the server-side, by throwing an exception. Since this exception
is expected, it was not logged.

However, other IOExceptions might occur, which must not be ignored. For
that purpose, log only IOException when they are not caused by an EPIPE
error.
2023-02-17 08:33:16 +01:00
Romain Vimont
439a1fd4ed Rename 'uid' to 'scid'
A random identifier is generated to differentiate multiple running
scrcpy instances. Rename it from 'uid' to 'scid' (scrcpy id) not to
confuse it with Linux UID.

Fixes #3729 <https://github.com/Genymobile/scrcpy/issues/3729>
Refs 4315be1648
2023-02-11 09:58:40 +01:00
Romain Vimont
45b2e6db5c Log component stopped in finally clause
The message must be logged even when no exception occurs.
2023-02-10 19:06:17 +01:00
Romain Vimont
400a1c69b1 Join all threads before end of main
Some calls from separate threads may throw exceptions once the main()
method has returned.
2023-02-10 19:04:56 +01:00
Romain Vimont
6524e90c68 Remove unused constant
This line was committed by error.

Refs 3e517cd40e
2023-02-07 23:11:42 +01:00
Romain Vimont
f2dee20a20 Set power mode on all physical displays
Android 10 and above support multiple physical displays. Apply power
mode to all of them.

Fixes #3716 <https://github.com/Genymobile/scrcpy/issues/3716>
2023-02-06 11:07:14 +01:00