char *line;
socklen_t salen;
FILE *fp;
+ int vl, vr;
assert(control_socket);
unlink(control_socket);
if(!strcmp(line, "stop")) {
disorder_info("stopped via %s", control_socket);
exit(0); /* terminate immediately */
- }
- if(!strcmp(line, "query"))
+ } else if(!strcmp(line, "query"))
fprintf(fp, "running");
+ else if(!strcmp(line, "getvol")) {
+ if(backend->get_volume) backend->get_volume(&vl, &vr);
+ else vl = vr = 0;
+ fprintf(fp, "%d %d\n", vl, vr);
+ } else if(!strncmp(line, "setvol ", 7)) {
+ if(!backend->set_volume)
+ vl = vr = 0;
+ else if(sscanf(line + 7, "%d %d", &vl, &vr) == 2)
+ backend->set_volume(&vl, &vr);
+ else
+ backend->get_volume(&vl, &vr);
+ fprintf(fp, "%d %d\n", vl, vr);
+ }
xfree(line);
}
if(fclose(fp) < 0)
}
/* display usage message and terminate */
-static void help(void) {
+static void attribute((noreturn)) help(void) {
xprintf("Usage:\n"
" disorder-playrtp [OPTIONS] [[ADDRESS] PORT]\n"
"Options:\n"
int monitor = 0;
static const int one = 1;
- static const struct addrinfo prefs = {
+ struct addrinfo prefs = {
.ai_flags = AI_PASSIVE,
.ai_family = PF_INET,
.ai_socktype = SOCK_DGRAM,
}
}
if(config_read(0, NULL)) disorder_fatal(0, "cannot read configuration");
+ /* Choose a sensible default audio backend */
if(!backend) {
backend = uaudio_default(uaudio_apis, UAUDIO_API_CLIENT);
if(!backend)
struct sockaddr *addr;
socklen_t addr_len;
if(!strcmp(sl.s[0], "-")) {
+ /* We'll need a connection to request the incoming stream, so open one if
+ * we don't have one already */
+ if(!c) {
+ if(!(c = disorder_new(1))) exit(EXIT_FAILURE);
+ if(disorder_connect(c)) exit(EXIT_FAILURE);
+ }
/* Pick address family to match known-working connectivity to the server */
int family = disorder_client_af(c);
/* Get a list of interfaces */
disorder_fatal(errno, "error calling getifaddrs");
/* Try to pick a good one */
for(; ifa; ifa = ifa->ifa_next) {
+ if(!ifa->ifa_addr) continue;
if(bestifa == NULL
|| compare_interfaces(ifa, bestifa, family) > 0)
bestifa = ifa;
uaudio_set_format(44100/*Hz*/, 2/*channels*/,
16/*bits/channel*/, 1/*signed*/);
uaudio_set("application", "disorder-playrtp");
+ backend->configure();
backend->start(playrtp_callback, NULL);
+ if(backend->open_mixer) backend->open_mixer();
/* We receive and convert audio data in a background thread */
if((err = pthread_create(<id, 0, listen_thread, 0)))
disorder_fatal(err, "pthread_create listen_thread");