mirror of
https://github.com/owntone/owntone-server.git
synced 2025-01-13 16:03:23 -05:00
Replace AirTunes with AirPlay in doc and log messages
This commit is contained in:
parent
0ec6e2f072
commit
01f290cc2a
4
INSTALL
4
INSTALL
@ -191,10 +191,10 @@ The LSB header below sums it up:
|
|||||||
# Should-Start: avahi
|
# Should-Start: avahi
|
||||||
# Default-Start: 2 3 4 5
|
# Default-Start: 2 3 4 5
|
||||||
# Default-Stop: 0 1 6
|
# Default-Stop: 0 1 6
|
||||||
# Short-Description: media server with support for RSP, DAAP, DACP and AirTunes
|
# Short-Description: media server with support for RSP, DAAP, DACP and AirPlay
|
||||||
# Description: forked-daapd is an iTunes-compatible media server for
|
# Description: forked-daapd is an iTunes-compatible media server for
|
||||||
# sharing your media library over the local network with RSP
|
# sharing your media library over the local network with RSP
|
||||||
# clients like the SoundBridge from Roku and DAAP clients
|
# clients like the SoundBridge from Roku and DAAP clients
|
||||||
# like iTunes. It can also stream music to AirTunes devices,
|
# like iTunes. It can also stream music to AirPlay devices,
|
||||||
# and it can be controlled by Apple Remote (and compatibles).
|
# and it can be controlled by Apple Remote (and compatibles).
|
||||||
### END INIT INFO
|
### END INIT INFO
|
||||||
|
26
README
26
README
@ -24,6 +24,14 @@ forked-daapd is a complete rewrite of mt-daapd (Firefly Media Server).
|
|||||||
Supported clients
|
Supported clients
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
forked-daapd supports streaming to AirPlay devices (like the AirPort Express,
|
||||||
|
Shairport and various AirPlay speakers).
|
||||||
|
|
||||||
|
Like iTunes, you can control forked-daapd with Apple Remote, or with a
|
||||||
|
compatible Android app like Retune, TunesRemote+ or Hyperfine Remote. Another
|
||||||
|
controller is TunesRemoteSE, which is based on Java and runs in Windows, MacOS
|
||||||
|
and Linux.
|
||||||
|
|
||||||
forked-daapd supports iTunes clients as well as a number of devices similar
|
forked-daapd supports iTunes clients as well as a number of devices similar
|
||||||
to the SoundBridge.
|
to the SoundBridge.
|
||||||
|
|
||||||
@ -33,14 +41,6 @@ or RSP.
|
|||||||
A single forked-daapd instance can handle several clients concurrently,
|
A single forked-daapd instance can handle several clients concurrently,
|
||||||
regardless of the protocol.
|
regardless of the protocol.
|
||||||
|
|
||||||
forked-daapd support streaming to AirTunes devices (like the AirPort Express,
|
|
||||||
Shairport and various AirPlay speakers).
|
|
||||||
|
|
||||||
Like iTunes, you can control forked-daapd with Apple Remote, or with a
|
|
||||||
compatible Android app like Retune, TunesRemote+ or Hyperfine Remote. Another
|
|
||||||
controller is TunesRemoteSE, which is based on Java and runs in Windows, MacOS
|
|
||||||
and Linux.
|
|
||||||
|
|
||||||
|
|
||||||
Using Remote
|
Using Remote
|
||||||
------------
|
------------
|
||||||
@ -118,7 +118,7 @@ Hit Ctrl-C to terminate avahi-browse.
|
|||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
Remote gets a list of output devices from the server; this list includes any
|
Remote gets a list of output devices from the server; this list includes any
|
||||||
and all devices on the network we know of that advertise AirTunes: AirPort
|
and all devices on the network we know of that advertise AirPlay: AirPort
|
||||||
Express, Apple TV, ... It also includes the local audio output, that is, the
|
Express, Apple TV, ... It also includes the local audio output, that is, the
|
||||||
sound card on the server (even if there is no soundcard).
|
sound card on the server (even if there is no soundcard).
|
||||||
|
|
||||||
@ -132,11 +132,11 @@ server startup, provided they appear in the 5 minutes following the startup
|
|||||||
and no playback has occured yet.
|
and no playback has occured yet.
|
||||||
|
|
||||||
|
|
||||||
AirTunes devices (AirPlay speakers)
|
AirPlay devices/speakers
|
||||||
-----------------------------------
|
------------------------
|
||||||
|
|
||||||
forked-daapd will discover the AirTunes devices available on your network. For
|
forked-daapd will discover the AirPlay devices available on your network. For
|
||||||
devices that are password-protected, the device's AirTunes name and password
|
devices that are password-protected, the device's AirPlay name and password
|
||||||
must be given in the configuration file. See the sample configuration file
|
must be given in the configuration file. See the sample configuration file
|
||||||
for the syntax.
|
for the syntax.
|
||||||
|
|
||||||
|
64
src/player.c
64
src/player.c
@ -170,7 +170,7 @@ static uint64_t pb_pos;
|
|||||||
/* Stream position (packets) */
|
/* Stream position (packets) */
|
||||||
static uint64_t last_rtptime;
|
static uint64_t last_rtptime;
|
||||||
|
|
||||||
/* AirTunes devices */
|
/* AirPlay devices */
|
||||||
static int dev_autoselect;
|
static int dev_autoselect;
|
||||||
static struct raop_device *dev_list;
|
static struct raop_device *dev_list;
|
||||||
|
|
||||||
@ -1535,7 +1535,7 @@ device_remove(struct raop_device *dev)
|
|||||||
if (!rd)
|
if (!rd)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DPRINTF(E_DBG, L_PLAYER, "Removing AirTunes device %s; stopped advertising\n", dev->name);
|
DPRINTF(E_DBG, L_PLAYER, "Removing AirPlay device %s; stopped advertising\n", dev->name);
|
||||||
|
|
||||||
/* Make sure device isn't selected anymore */
|
/* Make sure device isn't selected anymore */
|
||||||
if (dev->selected)
|
if (dev->selected)
|
||||||
@ -1662,7 +1662,7 @@ device_remove_family(struct player_command *cmd)
|
|||||||
|
|
||||||
if (!rd)
|
if (!rd)
|
||||||
{
|
{
|
||||||
DPRINTF(E_WARN, L_PLAYER, "AirTunes device %s stopped advertising, but not in our list\n", dev->name);
|
DPRINTF(E_WARN, L_PLAYER, "AirPlay device %s stopped advertising, but not in our list\n", dev->name);
|
||||||
|
|
||||||
device_free(dev);
|
device_free(dev);
|
||||||
return 0;
|
return 0;
|
||||||
@ -1709,12 +1709,12 @@ device_streaming_cb(struct raop_device *dev, struct raop_session *rs, enum raop_
|
|||||||
ret = device_check(dev);
|
ret = device_check(dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_WARN, L_PLAYER, "AirTunes device disappeared during streaming!\n");
|
DPRINTF(E_WARN, L_PLAYER, "AirPlay device disappeared during streaming!\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(E_LOG, L_PLAYER, "AirTunes device %s FAILED\n", dev->name);
|
DPRINTF(E_LOG, L_PLAYER, "AirPlay device %s FAILED\n", dev->name);
|
||||||
|
|
||||||
if (player_state == PLAY_PLAYING)
|
if (player_state == PLAY_PLAYING)
|
||||||
speaker_deselect_raop(dev);
|
speaker_deselect_raop(dev);
|
||||||
@ -1731,12 +1731,12 @@ device_streaming_cb(struct raop_device *dev, struct raop_session *rs, enum raop_
|
|||||||
ret = device_check(dev);
|
ret = device_check(dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_WARN, L_PLAYER, "AirTunes device disappeared during streaming!\n");
|
DPRINTF(E_WARN, L_PLAYER, "AirPlay device disappeared during streaming!\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(E_INFO, L_PLAYER, "AirTunes device %s stopped\n", dev->name);
|
DPRINTF(E_INFO, L_PLAYER, "AirPlay device %s stopped\n", dev->name);
|
||||||
|
|
||||||
dev->session = NULL;
|
dev->session = NULL;
|
||||||
|
|
||||||
@ -1779,7 +1779,7 @@ device_shutdown_cb(struct raop_device *dev, struct raop_session *rs, enum raop_s
|
|||||||
ret = device_check(dev);
|
ret = device_check(dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_WARN, L_PLAYER, "AirTunes device disappeared before shutdown completion!\n");
|
DPRINTF(E_WARN, L_PLAYER, "AirPlay device disappeared before shutdown completion!\n");
|
||||||
|
|
||||||
if (cur_cmd->ret != -2)
|
if (cur_cmd->ret != -2)
|
||||||
cur_cmd->ret = -1;
|
cur_cmd->ret = -1;
|
||||||
@ -1823,7 +1823,7 @@ device_activate_cb(struct raop_device *dev, struct raop_session *rs, enum raop_s
|
|||||||
ret = device_check(dev);
|
ret = device_check(dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_WARN, L_PLAYER, "AirTunes device disappeared during startup!\n");
|
DPRINTF(E_WARN, L_PLAYER, "AirPlay device disappeared during startup!\n");
|
||||||
|
|
||||||
raop_set_status_cb(rs, device_lost_cb);
|
raop_set_status_cb(rs, device_lost_cb);
|
||||||
raop_device_stop(rs);
|
raop_device_stop(rs);
|
||||||
@ -1900,7 +1900,7 @@ device_probe_cb(struct raop_device *dev, struct raop_session *rs, enum raop_sess
|
|||||||
ret = device_check(dev);
|
ret = device_check(dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_WARN, L_PLAYER, "AirTunes device disappeared during probe!\n");
|
DPRINTF(E_WARN, L_PLAYER, "AirPlay device disappeared during probe!\n");
|
||||||
|
|
||||||
if (cur_cmd->ret != -2)
|
if (cur_cmd->ret != -2)
|
||||||
cur_cmd->ret = -1;
|
cur_cmd->ret = -1;
|
||||||
@ -1947,7 +1947,7 @@ device_restart_cb(struct raop_device *dev, struct raop_session *rs, enum raop_se
|
|||||||
ret = device_check(dev);
|
ret = device_check(dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_WARN, L_PLAYER, "AirTunes device disappeared during restart!\n");
|
DPRINTF(E_WARN, L_PLAYER, "AirPlay device disappeared during restart!\n");
|
||||||
|
|
||||||
raop_set_status_cb(rs, device_lost_cb);
|
raop_set_status_cb(rs, device_lost_cb);
|
||||||
raop_device_stop(rs);
|
raop_device_stop(rs);
|
||||||
@ -2396,7 +2396,7 @@ playback_start(struct player_command *cmd)
|
|||||||
ret = raop_device_start(rd, device_restart_cb, last_rtptime + AIRTUNES_V2_PACKET_SAMPLES);
|
ret = raop_device_start(rd, device_restart_cb, last_rtptime + AIRTUNES_V2_PACKET_SAMPLES);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "Could not start selected AirTunes device %s\n", rd->name);
|
DPRINTF(E_LOG, L_PLAYER, "Could not start selected AirPlay device %s\n", rd->name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2414,12 +2414,12 @@ playback_start(struct player_command *cmd)
|
|||||||
ret = raop_device_start(rd, device_restart_cb, last_rtptime + AIRTUNES_V2_PACKET_SAMPLES);
|
ret = raop_device_start(rd, device_restart_cb, last_rtptime + AIRTUNES_V2_PACKET_SAMPLES);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_DBG, L_PLAYER, "Could not autoselect AirTunes device %s\n", rd->name);
|
DPRINTF(E_DBG, L_PLAYER, "Could not autoselect AirPlay device %s\n", rd->name);
|
||||||
speaker_deselect_raop(rd);
|
speaker_deselect_raop(rd);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(E_INFO, L_PLAYER, "Autoselecting AirTunes device %s\n", rd->name);
|
DPRINTF(E_INFO, L_PLAYER, "Autoselecting AirPlay device %s\n", rd->name);
|
||||||
cmd->raop_pending++;
|
cmd->raop_pending++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2654,7 +2654,7 @@ speaker_enumerate(struct player_command *cmd)
|
|||||||
|
|
||||||
laudio_name = cfg_getstr(cfg_getsec(cfg, "audio"), "nickname");
|
laudio_name = cfg_getstr(cfg_getsec(cfg, "audio"), "nickname");
|
||||||
|
|
||||||
/* Auto-select local audio if there are no AirTunes devices */
|
/* Auto-select local audio if there are no AirPlay devices */
|
||||||
if (!dev_list && !laudio_selected)
|
if (!dev_list && !laudio_selected)
|
||||||
speaker_select_laudio();
|
speaker_select_laudio();
|
||||||
|
|
||||||
@ -3793,7 +3793,7 @@ raop_device_cb(const char *name, const char *type, const char *domain, const cha
|
|||||||
ret = safe_hextou64(name, &id);
|
ret = safe_hextou64(name, &id);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "Could not extract AirTunes device ID (%s)\n", name);
|
DPRINTF(E_LOG, L_PLAYER, "Could not extract AirPlay device ID (%s)\n", name);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3801,18 +3801,18 @@ raop_device_cb(const char *name, const char *type, const char *domain, const cha
|
|||||||
at_name = strchr(name, '@');
|
at_name = strchr(name, '@');
|
||||||
if (!at_name)
|
if (!at_name)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "Could not extract AirTunes device name (%s)\n", name);
|
DPRINTF(E_LOG, L_PLAYER, "Could not extract AirPlay device name (%s)\n", name);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
at_name++;
|
at_name++;
|
||||||
|
|
||||||
DPRINTF(E_DBG, L_PLAYER, "Event for AirTunes device %" PRIx64 "/%s (%d)\n", id, at_name, port);
|
DPRINTF(E_DBG, L_PLAYER, "Event for AirPlay device %" PRIx64 "/%s (%d)\n", id, at_name, port);
|
||||||
|
|
||||||
rd = (struct raop_device *)malloc(sizeof(struct raop_device));
|
rd = (struct raop_device *)malloc(sizeof(struct raop_device));
|
||||||
if (!rd)
|
if (!rd)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "Out of memory for new AirTunes device\n");
|
DPRINTF(E_LOG, L_PLAYER, "Out of memory for new AirPlay device\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3844,21 +3844,21 @@ raop_device_cb(const char *name, const char *type, const char *domain, const cha
|
|||||||
p = keyval_get(txt, "tp");
|
p = keyval_get(txt, "tp");
|
||||||
if (!p)
|
if (!p)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "AirTunes %s: no tp field in TXT record!\n", name);
|
DPRINTF(E_LOG, L_PLAYER, "AirPlay %s: no tp field in TXT record!\n", name);
|
||||||
|
|
||||||
goto free_rd;
|
goto free_rd;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*p == '\0')
|
if (*p == '\0')
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "AirTunes %s: tp has no value\n", name);
|
DPRINTF(E_LOG, L_PLAYER, "AirPlay %s: tp has no value\n", name);
|
||||||
|
|
||||||
goto free_rd;
|
goto free_rd;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strstr(p, "UDP"))
|
if (!strstr(p, "UDP"))
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "AirTunes %s: device does not support AirTunes v2 (tp=%s), discarding\n", name, p);
|
DPRINTF(E_LOG, L_PLAYER, "AirPlay %s: device does not support AirTunes v2 (tp=%s), discarding\n", name, p);
|
||||||
|
|
||||||
goto free_rd;
|
goto free_rd;
|
||||||
}
|
}
|
||||||
@ -3867,13 +3867,13 @@ raop_device_cb(const char *name, const char *type, const char *domain, const cha
|
|||||||
p = keyval_get(txt, "pw");
|
p = keyval_get(txt, "pw");
|
||||||
if (!p)
|
if (!p)
|
||||||
{
|
{
|
||||||
DPRINTF(E_INFO, L_PLAYER, "AirTunes %s: no pw field in TXT record, assuming no password protection\n", name);
|
DPRINTF(E_INFO, L_PLAYER, "AirPlay %s: no pw field in TXT record, assuming no password protection\n", name);
|
||||||
|
|
||||||
has_password = 0;
|
has_password = 0;
|
||||||
}
|
}
|
||||||
else if (*p == '\0')
|
else if (*p == '\0')
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "AirTunes %s: pw has no value\n", name);
|
DPRINTF(E_LOG, L_PLAYER, "AirPlay %s: pw has no value\n", name);
|
||||||
|
|
||||||
goto free_rd;
|
goto free_rd;
|
||||||
}
|
}
|
||||||
@ -3884,14 +3884,14 @@ raop_device_cb(const char *name, const char *type, const char *domain, const cha
|
|||||||
|
|
||||||
if (has_password)
|
if (has_password)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "AirTunes device %s is password-protected\n", name);
|
DPRINTF(E_LOG, L_PLAYER, "AirPlay device %s is password-protected\n", name);
|
||||||
|
|
||||||
apex = cfg_gettsec(cfg, "apex", at_name);
|
apex = cfg_gettsec(cfg, "apex", at_name);
|
||||||
if (apex)
|
if (apex)
|
||||||
password = cfg_getstr(apex, "password");
|
password = cfg_getstr(apex, "password");
|
||||||
|
|
||||||
if (!password)
|
if (!password)
|
||||||
DPRINTF(E_LOG, L_PLAYER, "No password given in config for AirTunes device %s\n", name);
|
DPRINTF(E_LOG, L_PLAYER, "No password given in config for AirPlay device %s\n", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
devtype = RAOP_DEV_APEX_80211N;
|
devtype = RAOP_DEV_APEX_80211N;
|
||||||
@ -3899,7 +3899,7 @@ raop_device_cb(const char *name, const char *type, const char *domain, const cha
|
|||||||
p = keyval_get(txt, "am");
|
p = keyval_get(txt, "am");
|
||||||
if (!p)
|
if (!p)
|
||||||
{
|
{
|
||||||
DPRINTF(E_INFO, L_PLAYER, "AirTunes %s: no am field in TXT record, assuming old Airport Express\n", name);
|
DPRINTF(E_INFO, L_PLAYER, "AirPlay %s: no am field in TXT record, assuming old Airport Express\n", name);
|
||||||
|
|
||||||
/* Old AirPort Express */
|
/* Old AirPort Express */
|
||||||
devtype = RAOP_DEV_APEX_80211G;
|
devtype = RAOP_DEV_APEX_80211G;
|
||||||
@ -3909,7 +3909,7 @@ raop_device_cb(const char *name, const char *type, const char *domain, const cha
|
|||||||
|
|
||||||
if (*p == '\0')
|
if (*p == '\0')
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "AirTunes %s: am has no value\n", name);
|
DPRINTF(E_LOG, L_PLAYER, "AirPlay %s: am has no value\n", name);
|
||||||
|
|
||||||
goto no_am;
|
goto no_am;
|
||||||
}
|
}
|
||||||
@ -3924,14 +3924,14 @@ raop_device_cb(const char *name, const char *type, const char *domain, const cha
|
|||||||
p = keyval_get(txt, "md");
|
p = keyval_get(txt, "md");
|
||||||
if (!p)
|
if (!p)
|
||||||
{
|
{
|
||||||
DPRINTF(E_INFO, L_PLAYER, "AirTunes %s: no md field in TXT record.\n", name);
|
DPRINTF(E_INFO, L_PLAYER, "AirPlay %s: no md field in TXT record.\n", name);
|
||||||
|
|
||||||
goto no_md;
|
goto no_md;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*p == '\0')
|
if (*p == '\0')
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_PLAYER, "AirTunes %s: md has no value\n", name);
|
DPRINTF(E_LOG, L_PLAYER, "AirPlay %s: md has no value\n", name);
|
||||||
|
|
||||||
goto no_md;
|
goto no_md;
|
||||||
}
|
}
|
||||||
@ -3939,7 +3939,7 @@ raop_device_cb(const char *name, const char *type, const char *domain, const cha
|
|||||||
wants_metadata = 1;
|
wants_metadata = 1;
|
||||||
|
|
||||||
no_md:
|
no_md:
|
||||||
DPRINTF(E_DBG, L_PLAYER, "AirTunes device %s: password: %s, type %s\n", name, (password) ? "yes" : "no", raop_devtype[devtype]);
|
DPRINTF(E_DBG, L_PLAYER, "AirPlay device %s: password: %s, type %s\n", name, (password) ? "yes" : "no", raop_devtype[devtype]);
|
||||||
|
|
||||||
rd->advertised = 1;
|
rd->advertised = 1;
|
||||||
|
|
||||||
@ -4167,7 +4167,7 @@ player_init(void)
|
|||||||
ret = mdns_browse("_raop._tcp", mdns_flags, raop_device_cb);
|
ret = mdns_browse("_raop._tcp", mdns_flags, raop_device_cb);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_FATAL, L_PLAYER, "Could not add mDNS browser for AirTunes devices\n");
|
DPRINTF(E_FATAL, L_PLAYER, "Could not add mDNS browser for AirPlay devices\n");
|
||||||
|
|
||||||
goto mdns_browse_fail;
|
goto mdns_browse_fail;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user