Replace AirTunes with AirPlay in doc and log messages

This commit is contained in:
ejurgensen 2014-02-07 22:10:40 +01:00
parent 0ec6e2f072
commit 01f290cc2a
3 changed files with 47 additions and 47 deletions

View File

@ -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
View File

@ -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.

View File

@ -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;
} }