X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/71b70599a2cd81c13cc4326499a5d0c45358cd7d..3849817f8cbfc366a5e9979c190b2f1d604f4021:/disobedience/disobedience.c diff --git a/disobedience/disobedience.c b/disobedience/disobedience.c index de71101..6ee4803 100644 --- a/disobedience/disobedience.c +++ b/disobedience/disobedience.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2006, 2007 Richard Kettlewell + * Copyright (C) 2006, 2007, 2008 Richard Kettlewell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ #include "disobedience.h" #include "mixer.h" +#include "version.h" #include #include @@ -311,19 +312,22 @@ static gboolean periodic_fast(gpointer attribute((unused)) data) { } last = now; #endif - if(rtp_supported) { + if(rtp_supported && mixer_supported(DEFAULT_BACKEND)) { int nl, nr; - if(!mixer_control(&nl, &nr, 0) && (nl != volume_l || nr != volume_r)) { + if(!mixer_control(DEFAULT_BACKEND, &nl, &nr, 0) + && (nl != volume_l || nr != volume_r)) { volume_l = nl; volume_r = nr; - volume_update(); + event_raise("volume-changed", 0); } } return TRUE; } /** @brief Called when a NOP completes */ -static void nop_completed(void attribute((unused)) *v) { +static void nop_completed(void attribute((unused)) *v, + const char attribute((unused)) *error) { + /* TODO report the error somewhere */ nop_in_flight = 0; } @@ -338,45 +342,42 @@ static gboolean maybe_send_nop(gpointer attribute((unused)) data) { disorder_eclient_nop(client, nop_completed, 0); } if(rtp_supported) { - const int old_state = rtp_is_running; + const int rtp_was_running = rtp_is_running; rtp_is_running = rtp_running(); - if(old_state != rtp_is_running) - control_monitor(0); + if(rtp_was_running != rtp_is_running) + event_raise("rtp-changed", 0); } return TRUE; /* keep call me please */ } /** @brief Called when a rtp-address command succeeds */ static void got_rtp_address(void attribute((unused)) *v, + const char *error, int attribute((unused)) nvec, char attribute((unused)) **vec) { - ++suppress_actions; - rtp_address_in_flight = 0; - rtp_supported = 1; - rtp_is_running = rtp_running(); - control_monitor(0); - --suppress_actions; -} + const int rtp_was_supported = rtp_supported; + const int rtp_was_running = rtp_is_running; -/** @brief Called when a rtp-address command fails */ -static void no_rtp_address(struct callbackdata attribute((unused)) *cbd, - int attribute((unused)) code, - const char attribute((unused)) *msg) { ++suppress_actions; rtp_address_in_flight = 0; - rtp_supported = 0; - rtp_is_running = 0; - control_monitor(0); + if(error) { + /* An error just means that we're not using network play */ + rtp_supported = 0; + rtp_is_running = 0; + } else { + rtp_supported = 1; + rtp_is_running = rtp_running(); + } + if(rtp_supported != rtp_was_supported + || rtp_is_running != rtp_was_running) + event_raise("rtp-changed", 0); --suppress_actions; } /** @brief Called to check whether RTP play is available */ static void check_rtp_address(void) { - if(!rtp_address_in_flight) { - struct callbackdata *const cbd = xmalloc(sizeof *cbd); - cbd->onerror = no_rtp_address; - disorder_eclient_rtp_address(client, got_rtp_address, cbd); - } + if(!rtp_address_in_flight) + disorder_eclient_rtp_address(client, got_rtp_address, NULL); } /* main -------------------------------------------------------------------- */ @@ -407,13 +408,6 @@ static void help(void) { exit(0); } -/* display version number and terminate */ -static void version(void) { - xprintf("%s", disorder_version_string); - xfclose(stdout); - exit(0); -} - /* reset state */ void reset(void) { struct reset_callback_node *r; @@ -439,6 +433,7 @@ void register_reset(reset_callback *callback) { int main(int argc, char **argv) { int n; + gboolean gtkok; mem_init(); /* garbage-collect PCRE's memory */ @@ -449,17 +444,19 @@ int main(int argc, char **argv) { g_mem_set_vtable((GMemVTable *)&glib_memvtable); #endif if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale"); - gtk_init(&argc, &argv); + gtkok = gtk_init_check(&argc, &argv); while((n = getopt_long(argc, argv, "hVc:dtHC", options, 0)) >= 0) { switch(n) { case 'h': help(); - case 'V': version(); + case 'V': version("disobedience"); case 'c': configfile = optarg; break; case 'd': debugging = 1; break; case 't': goesupto = 11; break; default: fatal(0, "invalid option"); } } + if(!gtkok) + fatal(0, "failed to initialize GTK+"); signal(SIGPIPE, SIG_IGN); init_styles(); load_settings();