Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 21 additions & 9 deletions README.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
class="uri">https://github.com/FDH2/UxPlay</a> (where ALL user issues
should be posted, and latest versions can be found).</strong></h3>
<ul>
<li><p><strong>NEW on github</strong>: option -ca (with no filename
given) will now render Apple Music cover art (in audio-only mode) inside
UxPlay. (-ca <code>&lt;filename&gt;</code> will continue to export cover
art for display by an external viewer).</p></li>
<li><p><strong>NEW in v1.72</strong>: Improved Support for (YouTube) HLS
(HTTP Live Streaming) video with the new “-hls” option (introduced in
1.71).* <strong>Only streaming from the YouTube iOS app (in "m3u8"
Expand Down Expand Up @@ -107,7 +111,8 @@ <h2 id="after-installation">After installation:</h2>
also install.</p></li>
<li><p>For Audio-only mode (Apple Music, etc.) best quality is obtained
with the option “uxplay -async”, but there is then a 2 second latency
imposed by iOS.</p></li>
imposed by iOS. Use option “uxplay -ca” to display any “Cover Art” that
accompanies the audio.</p></li>
<li><p>If you are using UxPlay just to mirror the client’s screen
(without showing videos that need audio synchronized with video), it is
best to use the option “uxplay -vsync no”.</p></li>
Expand Down Expand Up @@ -621,12 +626,14 @@ <h3 id="starting-and-running-uxplay">Starting and running UxPlay</h3>
framerate is actually streaming by using -vs fpsdisplaysink, and/or
-FPSdata.) When using this, you should use the default timestamp-based
synchronization option <code>-vsync</code>.</p></li>
<li><p>Since UxPlay-1.54, you can display the accompanying “Cover Art”
from sources like Apple Music in Audio-Only (ALAC) mode: run
<li><p>You can now display (inside UxPlay) the accompanying “Cover Art”
from sources like Apple Music in Audio-Only (ALAC) mode with the option
<code>uxplay -ca</code>. <em>The older method of exporting cover art to
an external viewer remains available: run
“<code>uxplay -ca &lt;name&gt; &amp;</code>” in the background, then run
a image viewer with an autoreload feature: an example is “feh”: run
“<code>feh -R 1 &lt;name&gt;</code>” in the foreground; terminate feh
and then Uxplay with “<code>ctrl-C fg ctrl-C</code>”.</p></li>
and then Uxplay with “<code>ctrl-C fg ctrl-C</code>”</em>.</p></li>
</ul>
<p>By default, GStreamer uses an algorithm to search for the best
“videosink” (GStreamer’s term for a graphics driver to display images)
Expand Down Expand Up @@ -1067,11 +1074,11 @@ <h1 id="usage">Usage</h1>
cleartext.) All users must then know this password. This uses HTTP md5
Digest authentication, which is now regarded as providing weak security,
but it is only used to validate the uxplay password, and no user
credentials are exposed. _Note: -pin and -pw are alternatives: if both
are specified at startup, the earlier of these two options is discarded.
If <em>pwd</em> is not specified, a random 4-digit pin code is
displayed, and must be entered on the client at <strong>each</strong>
new conenction.</p>
credentials are exposed. If <em>pwd</em> is <strong>not</strong>
specified, a random 4-digit pin code is displayed, and must be entered
on the client at <strong>each</strong> new connection. <em>Note: -pin
and -pw are alternatives: if both are specified at startup, the earlier
of these two options is discarded.</em></p>
<p><strong>-vsync [x]</strong> (In Mirror mode:) this option
(<strong>now the default</strong>) uses timestamps to synchronize audio
with video on the server, with an optional audio delay in (decimal)
Expand Down Expand Up @@ -1236,6 +1243,9 @@ <h1 id="usage">Usage</h1>
converted to a whole number of microseconds. Default is 0.25 sec (250000
usec). <em>(However, the client appears to ignore this reported latency,
so this option seems non-functional.)</em></p>
<p><strong>-ca</strong> (without specifying a filename) now displays
“cover art” that accompanies Apple Music when played in “Audio-only”
(ALAC) mode.</p>
<p><strong>-ca <em>filename</em></strong> provides a file (where
<em>filename</em> can include a full path) used for output of “cover
art” (from Apple Music, <em>etc.</em>,) in audio-only ALAC mode. This
Expand Down Expand Up @@ -1700,6 +1710,8 @@ <h3 id="mirror-screen-freezes-a-network-problem">5. Mirror screen
introduced 2017, running tvOS 12.2.1), so it does not seem to matter
what version UxPlay claims to be.</p>
<h1 id="changelog">Changelog</h1>
<p>xxxx 2025-06-18 Render Audio cover-art inside UxPlay with -ca option
(no file specified). Update llhttp to 9.3.0</p>
<p>1.72.1 2025-06-06 minor update: fix regression in -reg option; add
option -rc <rcfile> to specify initialization file; add “-nc no” to
unset “-nc” option (for macOS users, where -nc is default); add
Expand Down
32 changes: 23 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

### **Now developed at the GitHub site <https://github.com/FDH2/UxPlay> (where ALL user issues should be posted, and latest versions can be found).**

- **NEW on github**: option -ca (with no filename given) will now render
Apple Music cover art (in audio-only mode) inside
UxPlay. (-ca `<filename>` will continue to export cover art for
display by an external viewer).

- **NEW in v1.72**: Improved Support for (YouTube) HLS (HTTP Live Streaming)
video with the new "-hls" option (introduced in 1.71).* **Only streaming from the YouTube iOS app
(in \"m3u8\" protocol) is currently supported**: (streaming using the AirPlay icon in a browser window
Expand Down Expand Up @@ -93,7 +98,8 @@ status](https://repology.org/badge/vertical-allrepos/uxplay.svg)](https://repolo

- For Audio-only mode (Apple Music, etc.) best quality is obtained
with the option "uxplay -async", but there is then a 2 second
latency imposed by iOS.
latency imposed by iOS. Use option "uxplay -ca" to display any "Cover Art" that
accompanies the audio.

- If you are using UxPlay just to mirror the client's screen (without
showing videos that need audio synchronized with video), it is best to
Expand Down Expand Up @@ -606,12 +612,14 @@ value advances it.)
-FPSdata.) When using this, you should use the default
timestamp-based synchronization option `-vsync`.

- Since UxPlay-1.54, you can display the accompanying "Cover Art" from
sources like Apple Music in Audio-Only (ALAC) mode: run
- You can now display (inside UxPlay) the accompanying "Cover Art" from
sources like Apple Music in Audio-Only (ALAC) mode with the option
`uxplay -ca`. _The older method of exporting cover art to an external
viewer remains available: run
"`uxplay -ca <name> &`" in the background, then run a image viewer
with an autoreload feature: an example is "feh": run
"`feh -R 1 <name>`" in the foreground; terminate feh and then Uxplay
with "`ctrl-C fg ctrl-C`".
with "`ctrl-C fg ctrl-C`"_.

By default, GStreamer uses an algorithm to search for the best
"videosink" (GStreamer's term for a graphics driver to display images)
Expand Down Expand Up @@ -1060,11 +1068,11 @@ can be controlled with a password set when uxplay starts (set it in
the .uxplay startup file, where it is stored as cleartext.) All users must
then know this password. This uses HTTP md5 Digest authentication,
which is now regarded as providing weak security, but it is only used to
validate the uxplay password, and no user credentials are exposed. _Note:
-pin and -pw are alternatives: if both are specified at startup, the
earlier of these two options is discarded. If *pwd* is not specified,
a random 4-digit pin code is displayed, and must be entered on the client
at **each** new conenction.
validate the uxplay password, and no user credentials are exposed.
If *pwd* is **not** specified, a random 4-digit pin code is displayed, and must
be entered on the client at **each** new connection.
_Note: -pin and -pw are alternatives: if both are specified at startup, the
earlier of these two options is discarded._

**-vsync \[x\]** (In Mirror mode:) this option (**now the default**)
uses timestamps to synchronize audio with video on the server, with an
Expand Down Expand Up @@ -1245,6 +1253,9 @@ number of microseconds. Default is 0.25 sec (250000 usec). *(However,
the client appears to ignore this reported latency, so this option seems
non-functional.)*

**-ca** (without specifying a filename) now displays "cover art"
that accompanies Apple Music when played in "Audio-only" (ALAC) mode.

**-ca *filename*** provides a file (where *filename* can include a full
path) used for output of "cover art" (from Apple Music, *etc.*,) in
audio-only ALAC mode. This file is overwritten with the latest cover art
Expand Down Expand Up @@ -1731,6 +1742,9 @@ introduced 2017, running tvOS 12.2.1), so it does not seem to matter
what version UxPlay claims to be.

# Changelog
xxxx 2025-06-18 Render Audio cover-art inside UxPlay with -ca option (no file
specified). Update llhttp to 9.3.0

1.72.1 2025-06-06 minor update: fix regression in -reg option; add option
-rc <rcfile> to specify initialization file; add "-nc no" to unset "-nc"
option (for macOS users, where -nc is default); add user-installable
Expand Down
37 changes: 25 additions & 12 deletions README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

### **Now developed at the GitHub site <https://github.com/FDH2/UxPlay> (where ALL user issues should be posted, and latest versions can be found).**

- **NEW on github**: option -ca (with no filename given) will now
render Apple Music cover art (in audio-only mode) inside UxPlay.
(-ca `<filename>` will continue to export cover art for display by
an external viewer).

- **NEW in v1.72**: Improved Support for (YouTube) HLS (HTTP Live
Streaming) video with the new "-hls" option (introduced in 1.71).\*
**Only streaming from the YouTube iOS app (in \"m3u8\" protocol) is
Expand Down Expand Up @@ -100,7 +105,8 @@ status](https://repology.org/badge/vertical-allrepos/uxplay.svg)](https://repolo

- For Audio-only mode (Apple Music, etc.) best quality is obtained
with the option "uxplay -async", but there is then a 2 second
latency imposed by iOS.
latency imposed by iOS. Use option "uxplay -ca" to display any
"Cover Art" that accompanies the audio.

- If you are using UxPlay just to mirror the client's screen (without
showing videos that need audio synchronized with video), it is best
Expand Down Expand Up @@ -620,12 +626,13 @@ value advances it.)
-FPSdata.) When using this, you should use the default
timestamp-based synchronization option `-vsync`.

- Since UxPlay-1.54, you can display the accompanying "Cover Art" from
sources like Apple Music in Audio-Only (ALAC) mode: run
"`uxplay -ca <name> &`" in the background, then run a image viewer
with an autoreload feature: an example is "feh": run
"`feh -R 1 <name>`" in the foreground; terminate feh and then Uxplay
with "`ctrl-C fg ctrl-C`".
- You can now display (inside UxPlay) the accompanying "Cover Art"
from sources like Apple Music in Audio-Only (ALAC) mode with the
option `uxplay -ca`. *The older method of exporting cover art to an
external viewer remains available: run "`uxplay -ca <name> &`" in
the background, then run a image viewer with an autoreload feature:
an example is "feh": run "`feh -R 1 <name>`" in the foreground;
terminate feh and then Uxplay with "`ctrl-C fg ctrl-C`"*.

By default, GStreamer uses an algorithm to search for the best
"videosink" (GStreamer's term for a graphics driver to display images)
Expand Down Expand Up @@ -1080,11 +1087,11 @@ access can be controlled with a password set when uxplay starts (set it
in the .uxplay startup file, where it is stored as cleartext.) All users
must then know this password. This uses HTTP md5 Digest authentication,
which is now regarded as providing weak security, but it is only used to
validate the uxplay password, and no user credentials are exposed.
\_Note: -pin and -pw are alternatives: if both are specified at startup,
the earlier of these two options is discarded. If *pwd* is not
specified, a random 4-digit pin code is displayed, and must be entered
on the client at **each** new conenction.
validate the uxplay password, and no user credentials are exposed. If
*pwd* is **not** specified, a random 4-digit pin code is displayed, and
must be entered on the client at **each** new connection. *Note: -pin
and -pw are alternatives: if both are specified at startup, the earlier
of these two options is discarded.*

**-vsync \[x\]** (In Mirror mode:) this option (**now the default**)
uses timestamps to synchronize audio with video on the server, with an
Expand Down Expand Up @@ -1265,6 +1272,9 @@ number of microseconds. Default is 0.25 sec (250000 usec). *(However,
the client appears to ignore this reported latency, so this option seems
non-functional.)*

**-ca** (without specifying a filename) now displays "cover art" that
accompanies Apple Music when played in "Audio-only" (ALAC) mode.

**-ca *filename*** provides a file (where *filename* can include a full
path) used for output of "cover art" (from Apple Music, *etc.*,) in
audio-only ALAC mode. This file is overwritten with the latest cover art
Expand Down Expand Up @@ -1751,6 +1761,9 @@ what version UxPlay claims to be.

# Changelog

xxxx 2025-06-18 Render Audio cover-art inside UxPlay with -ca option (no
file specified). Update llhttp to 9.3.0

1.72.1 2025-06-06 minor update: fix regression in -reg option; add
option -rc `<rcfile>`{=html} to specify initialization file; add "-nc
no" to unset "-nc" option (for macOS users, where -nc is default); add
Expand Down
3 changes: 2 additions & 1 deletion lib/raop.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ struct raop_callbacks_s {
void (*audio_set_volume)(void *cls, float volume);
void (*audio_set_metadata)(void *cls, const void *buffer, int buflen);
void (*audio_set_coverart)(void *cls, const void *buffer, int buflen);
void (*audio_stop_coverart_rendering) (void* cls);
void (*audio_remote_control_id)(void *cls, const char *dacp_id, const char *active_remote_header);
void (*audio_set_progress)(void *cls, unsigned int start, unsigned int curr, unsigned int end);
void (*audio_get_format)(void *cls, unsigned char *ct, unsigned short *spf, bool *usingScreen, bool *isMedia, uint64_t *audioFormat);
Expand All @@ -99,8 +100,8 @@ struct raop_callbacks_s {
void (*on_video_rate) (void *cls, const float rate);
void (*on_video_stop) (void *cls);
void (*on_video_acquire_playback_info) (void *cls, playback_info_t *playback_video);

};

typedef struct raop_callbacks_s raop_callbacks_t;
raop_ntp_t *raop_ntp_init(logger_t *logger, raop_callbacks_t *callbacks, const char *remote,
int remote_addr_len, unsigned short timing_rport,
Expand Down
4 changes: 4 additions & 0 deletions lib/raop_handlers.h
Original file line number Diff line number Diff line change
Expand Up @@ -1191,6 +1191,10 @@ raop_handler_teardown(raop_conn_t *conn,
if (conn->raop_rtp) {
/* Stop our audio RTP session */
raop_rtp_stop(conn->raop_rtp);
/* stop any coverart rendering */
if (conn->raop->callbacks.audio_stop_coverart_rendering) {
conn->raop->callbacks.audio_stop_coverart_rendering(conn->raop->callbacks.cls);
}
}
} else if (teardown_110) {
conn->raop->callbacks.video_reset(conn->raop->callbacks.cls);
Expand Down
Loading