Remove some redundant code from shairplay CLI
[deb_shairplay.git] / src / shairplay.c
index 0486f6c9dec4509ccf089b8b94328ddbc5cd1e91..9bb9537fd75bdafaee512b0fefa1705815356fbf 100644 (file)
@@ -1,3 +1,26 @@
+/**
+ *  Copyright (C) 2012-2013  Juho Vähä-Herttua
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining
+ *  a copy of this software and associated documentation files (the
+ *  "Software"), to deal in the Software without restriction, including
+ *  without limitation the rights to use, copy, modify, merge, publish,
+ *  distribute, sublicense, and/or sell copies of the Software, and to
+ *  permit persons to whom the Software is furnished to do so, subject to
+ *  the following conditions:
+ *  
+ *  The above copyright notice and this permission notice shall be included
+ *  in all copies or substantial portions of the Software.
+ *  
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ *  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ *  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ *  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ *  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <math.h>
@@ -6,7 +29,7 @@
 #include <assert.h>
 
 #ifdef WIN32
-#include <windows.h>
+# include <windows.h>
 #endif
 
 #include <shairplay/dnssd.h>
@@ -37,6 +60,36 @@ typedef struct {
 } shairplay_session_t;
 
 
+static int running;
+
+#ifndef WIN32
+
+#include <signal.h>
+static void
+signal_handler(int sig)
+{
+       switch (sig) {
+       case SIGINT:
+       case SIGTERM:
+               running = 0;
+               break;
+       }
+}
+static void
+init_signals(void)
+{
+       struct sigaction sigact;
+
+       sigact.sa_handler = signal_handler;
+       sigemptyset(&sigact.sa_mask);
+       sigact.sa_flags = 0;
+       sigaction(SIGINT, &sigact, NULL);
+       sigaction(SIGTERM, &sigact, NULL);
+}
+
+#endif
+
+
 static ao_device *
 audio_open_device(shairplay_options_t *opt, int bits, int channels, int samplerate)
 {
@@ -173,7 +226,8 @@ parse_options(shairplay_options_t *opt, int argc, char *argv[])
        char *path = argv[0];
        char *arg;
 
-       strcpy(opt->apname, "Shairplay");
+       /* Set default values for apname and port */
+       strncpy(opt->apname, "Shairplay", sizeof(opt->apname)-1);
        opt->port = 5000;
 
        while ((arg = *++argv)) {
@@ -211,13 +265,6 @@ parse_options(shairplay_options_t *opt, int argc, char *argv[])
                }
        }
 
-       /* Set default values for apname and port */
-       if (!strlen(opt->apname)) {
-               strncpy(opt->apname, "Shairplay", sizeof(opt->apname)-1);
-       }
-       if (!opt->port) {
-               opt->port = 5000;
-       }
        return 0;
 }
 
@@ -232,6 +279,13 @@ main(int argc, char *argv[])
        dnssd_t *dnssd;
        raop_t *raop;
        raop_callbacks_t raop_cbs;
+       char *password = NULL;
+
+       int error;
+
+#ifndef WIN32
+       init_signals();
+#endif
 
        memset(&options, 0, sizeof(options));
        if (parse_options(&options, argc, argv)) {
@@ -257,23 +311,40 @@ main(int argc, char *argv[])
        raop_cbs.audio_destroy = audio_destroy;
        raop_cbs.audio_set_volume = audio_set_volume;
 
-       raop = raop_init_from_keyfile(10, &raop_cbs, "airport.key");
+       raop = raop_init_from_keyfile(10, &raop_cbs, "airport.key", NULL);
        if (raop == NULL) {
                fprintf(stderr, "Could not initialize the RAOP service\n");
                return -1;
        }
 
+       if (strlen(options.password)) {
+               password = options.password;
+       }
        raop_set_log_level(raop, RAOP_LOG_DEBUG);
-       raop_start(raop, &options.port, hwaddr, sizeof(hwaddr), NULL);
+       raop_start(raop, &options.port, hwaddr, sizeof(hwaddr), password);
+
+       error = 0;
+       dnssd = dnssd_init(&error);
+       if (error) {
+               fprintf(stderr, "ERROR: Could not initialize dnssd library!\n");
+               fprintf(stderr, "------------------------------------------\n");
+               fprintf(stderr, "You could try the following resolutions based on your OS:\n");
+               fprintf(stderr, "Windows: Try installing http://support.apple.com/kb/DL999\n");
+               fprintf(stderr, "Debian/Ubuntu: Try installing libavahi-compat-libdnssd-dev package\n");
+               raop_destroy(raop);
+               return -1;
+       }
 
-       dnssd = dnssd_init(NULL);
        dnssd_register_raop(dnssd, options.apname, options.port, hwaddr, sizeof(hwaddr), 0);
 
+       running = 1;
+       while (running) {
 #ifndef WIN32
-       sleep(100);
+               sleep(1);
 #else
-       Sleep(100*1000);
+               Sleep(1000);
 #endif
+       }
 
        dnssd_unregister_raop(dnssd);
        dnssd_destroy(dnssd);