[outputs] new output: RCP/Roku/SoundBridge devices

Roku SoundBridge devices can be treated as dumb speakers; they offer a
texted based protocol, RCP, that allows the server to request the Roku
device to connect to the server's stream.mp3 and provides ability to
control volume

Roku devices appear as speakers automatically via mDNS announcements on
the server _roku-rcp._tcp
This commit is contained in:
whatdoineed2do/Ray
2022-01-15 12:24:49 +00:00
parent a91d388fdf
commit 8f722faaf2
8 changed files with 1410 additions and 3 deletions

View File

@@ -125,7 +125,7 @@ owntone_SOURCES = main.c \
outputs/rtp_common.h outputs/rtp_common.c \
outputs/raop.c outputs/airplay.c $(PAIR_AP_SRC) \
outputs/airplay_events.c outputs/airplay_events.h \
outputs/streaming.c outputs/dummy.c outputs/fifo.c \
outputs/streaming.c outputs/dummy.c outputs/fifo.c outputs/rcp.c \
$(ALSA_SRC) $(PULSEAUDIO_SRC) $(CHROMECAST_SRC) \
evrtsp/rtsp.c evrtsp/evrtsp.h evrtsp/rtsp-internal.h evrtsp/log.h \
$(SPOTIFY_SRC) $(LIBRESPOTC_SRC) $(LIBSPOTIFY_SRC) \

View File

@@ -186,6 +186,14 @@ static cfg_opt_t sec_fifo[] =
CFG_END()
};
/* RCP/Soundbridge section structure */
static cfg_opt_t sec_rcp[] =
{
CFG_BOOL("exclude", cfg_false, CFGF_NONE),
CFG_BOOL("clear_on_close", cfg_false, CFGF_NONE),
CFG_END()
};
/* Spotify section structure */
static cfg_opt_t sec_spotify[] =
{
@@ -243,6 +251,7 @@ static cfg_opt_t toplvl_cfg[] =
CFG_SEC("airplay", sec_airplay, CFGF_MULTI | CFGF_TITLE),
CFG_SEC("chromecast", sec_chromecast, CFGF_MULTI | CFGF_TITLE),
CFG_SEC("fifo", sec_fifo, CFGF_NONE),
CFG_SEC("rcp", sec_rcp, CFGF_MULTI | CFGF_TITLE),
CFG_SEC("spotify", sec_spotify, CFGF_NONE),
CFG_SEC("sqlite", sec_sqlite, CFGF_NONE),
CFG_SEC("mpd", sec_mpd, CFGF_NONE),

View File

@@ -58,7 +58,7 @@ static uint32_t logger_repeat_counter;
static uint32_t logger_last_hash;
static char *logfilename;
static FILE *logfile;
static char *labels[] = { "config", "daap", "db", "httpd", "http", "main", "mdns", "misc", "rsp", "scan", "xcode", "event", "remote", "dacp", "ffmpeg", "artwork", "player", "raop", "laudio", "dmap", "dbperf", "spotify", "lastfm", "cache", "mpd", "stream", "cast", "fifo", "lib", "web", "airplay" };
static char *labels[] = { "config", "daap", "db", "httpd", "http", "main", "mdns", "misc", "rsp", "scan", "xcode", "event", "remote", "dacp", "ffmpeg", "artwork", "player", "raop", "laudio", "dmap", "dbperf", "spotify", "lastfm", "cache", "mpd", "stream", "cast", "fifo", "lib", "web", "airplay", "rcp" };
static char *severities[] = { "FATAL", "LOG", "WARN", "INFO", "DEBUG", "SPAM" };

View File

@@ -37,8 +37,9 @@
#define L_LIB 28
#define L_WEB 29
#define L_AIRPLAY 30
#define L_RCP 31
#define N_LOGDOMAINS 31
#define N_LOGDOMAINS 32
/* Severities */
#define E_FATAL 0

View File

@@ -44,6 +44,7 @@ extern struct output_definition output_airplay;
extern struct output_definition output_streaming;
extern struct output_definition output_dummy;
extern struct output_definition output_fifo;
extern struct output_definition output_rcp;
#ifdef HAVE_ALSA
extern struct output_definition output_alsa;
#endif
@@ -64,6 +65,7 @@ static struct output_definition *outputs[] = {
&output_streaming,
&output_dummy,
&output_fifo,
&output_rcp,
#ifdef HAVE_ALSA
&output_alsa,
#endif

View File

@@ -63,6 +63,7 @@ enum output_types
OUTPUT_TYPE_STREAMING,
OUTPUT_TYPE_DUMMY,
OUTPUT_TYPE_FIFO,
OUTPUT_TYPE_RCP,
#ifdef HAVE_ALSA
OUTPUT_TYPE_ALSA,
#endif

1377
src/outputs/rcp.c Normal file

File diff suppressed because it is too large Load Diff