diff options
-rw-r--r-- | switchctl.c | 90 |
1 files changed, 52 insertions, 38 deletions
diff --git a/switchctl.c b/switchctl.c index 0f6124f..2025776 100644 --- a/switchctl.c +++ b/switchctl.c @@ -37,6 +37,16 @@ #include "daemon.h" #include "utils.h" + +struct state_struct { + switchctl_mode_t mode_; + switchctl_channel_t channel_master_; + switchctl_channel_t channel_standby_; +}; +typedef struct state_struct state_t; + +state_t state_; + int send_command(int switch_fd, cmd_t* cmd) { if(!cmd) @@ -112,8 +122,8 @@ int process_cmd_request(const char* cmd, cmd_id_t cmd_id, const char* param, int char* cmd_param = NULL; if(cmd_id == SWITCH) { - if((opt->mode_ == MODE_MASTER && c->type == STANDBY )|| - (opt->mode_ == MODE_STANDBY && c->type == MASTER )) + if((state_.mode_ == MODE_MASTER && c->type == STANDBY )|| + (state_.mode_ == MODE_STANDBY && c->type == MASTER )) { log_printf(INFO, "silently ignoring request from inactive system (%s)", c->type == MASTER ? "master" : "standby"); return 0; @@ -208,11 +218,11 @@ int process_cmd_request(const char* cmd, cmd_id_t cmd_id, const char* param, int if(cmd_id == STATUS) { char buf[2][30]; - snprintf(buf[0], 30, "Current Mode: %s", opt->mode_ == MODE_MASTER ? "Master" : "Standby"); + snprintf(buf[0], 30, "Current Mode: %s", state_.mode_ == MODE_MASTER ? "Master" : "Standby"); send_response(fd, buf[0]); - snprintf(buf[1], 30, "Master Channel: %s", opt->channel_master_ == CHAN_MAIN ? "Main" : "Music"); + snprintf(buf[1], 30, "Master Channel: %s", state_.channel_master_ == CHAN_MAIN ? "Main" : "Music"); send_response(fd, buf[1]); - snprintf(buf[1], 30, "Standby Channel: %s", opt->channel_standby_ == CHAN_MAIN ? "Main" : "Music"); + snprintf(buf[1], 30, "Standby Channel: %s", state_.channel_standby_ == CHAN_MAIN ? "Main" : "Music"); send_response(fd, buf[1]); client_t* client; int listener_cnt = 0; @@ -285,14 +295,14 @@ int process_cmd_channel(const char* cmd, const char* param, int fd, cmd_t **cmd_ switchctl_channel_t old_channel; if(c->type == MASTER) - old_channel = opt->channel_master_; + old_channel = state_.channel_master_; else - old_channel = opt->channel_standby_; + old_channel = state_.channel_standby_; char* ch_from = NULL; char* ch_to = NULL; if(!strcmp(param, "main")) { - if(opt->mode_ == MODE_MASTER) { + if(state_.mode_ == MODE_MASTER) { ch_from = "master_music"; ch_to = "master_main"; } @@ -301,12 +311,12 @@ int process_cmd_channel(const char* cmd, const char* param, int fd, cmd_t **cmd_ ch_to = "standby_main"; } if(c->type == MASTER) - opt->channel_master_ = CHAN_MAIN; + state_.channel_master_ = CHAN_MAIN; else - opt->channel_standby_ = CHAN_MAIN; + state_.channel_standby_ = CHAN_MAIN; } else if(!strcmp(param, "music")) { - if(opt->mode_ == MODE_MASTER) { + if(state_.mode_ == MODE_MASTER) { ch_from = "master_main"; ch_to = "master_music"; } @@ -315,13 +325,13 @@ int process_cmd_channel(const char* cmd, const char* param, int fd, cmd_t **cmd_ ch_to = "standby_music"; } if(c->type == MASTER) - opt->channel_master_ = CHAN_MUSIC; + state_.channel_master_ = CHAN_MUSIC; else - opt->channel_standby_ = CHAN_MUSIC; + state_.channel_standby_ = CHAN_MUSIC; } - if((opt->mode_ == MODE_MASTER && c->type == STANDBY )|| - (opt->mode_ == MODE_STANDBY && c->type == MASTER )) + if((state_.mode_ == MODE_MASTER && c->type == STANDBY )|| + (state_.mode_ == MODE_STANDBY && c->type == MASTER )) { log_printf(INFO, "no crossfade for inactive system (%s), just updated channel info", c->type == MASTER ? "master" : "standby"); return 0; @@ -330,9 +340,9 @@ int process_cmd_channel(const char* cmd, const char* param, int fd, cmd_t **cmd_ int ret = crossfade(ch_from, ch_to, fd, cmd_q, opt); if(ret) { if(c->type == MASTER) - opt->channel_master_ = old_channel; + state_.channel_master_ = old_channel; else - opt->channel_standby_ = old_channel; + state_.channel_standby_ = old_channel; if(ret > 0) return 0; @@ -388,13 +398,13 @@ void process_cmd_type(const char* param, int fd, client_t* client_lst) int process_cmd_mode(const char* param, int fd, cmd_t **cmd_q, options_t* opt, client_t* client_lst) { - switchctl_mode_t old_mode = opt->mode_; + switchctl_mode_t old_mode = state_.mode_; if(param) { if(!strncmp(param, "master", 6)) - opt->mode_ = MODE_MASTER; + state_.mode_ = MODE_MASTER; else if(!strncmp(param, "standby", 7)) - opt->mode_ = MODE_STANDBY; + state_.mode_ = MODE_STANDBY; else { log_printf(DEBUG, "unkown mode '%s'", param); send_response(fd, "EEE: mode: unknown mode"); @@ -402,40 +412,40 @@ int process_cmd_mode(const char* param, int fd, cmd_t **cmd_q, options_t* opt, c } // swap master with standby channels only when mode has changed - if(old_mode != opt->mode_) { + if(old_mode != state_.mode_) { char* ch_from = NULL; - if(old_mode == MODE_MASTER && opt->channel_master_ == CHAN_MAIN) + if(old_mode == MODE_MASTER && state_.channel_master_ == CHAN_MAIN) ch_from = "master_main"; - else if(old_mode == MODE_MASTER && opt->channel_master_ == CHAN_MUSIC) + else if(old_mode == MODE_MASTER && state_.channel_master_ == CHAN_MUSIC) ch_from = "master_music"; - else if(old_mode == MODE_STANDBY && opt->channel_standby_ == CHAN_MAIN) + else if(old_mode == MODE_STANDBY && state_.channel_standby_ == CHAN_MAIN) ch_from = "standby_main"; - else if(old_mode == MODE_STANDBY && opt->channel_standby_ == CHAN_MUSIC) + else if(old_mode == MODE_STANDBY && state_.channel_standby_ == CHAN_MUSIC) ch_from = "standby_music"; else { - opt->mode_ = old_mode; + state_.mode_ = old_mode; log_printf(ERROR, "EEE: mode: old config is illegal?!"); return 0; } char* ch_to = NULL; - if(opt->mode_ == MODE_MASTER && opt->channel_master_ == CHAN_MAIN) + if(state_.mode_ == MODE_MASTER && state_.channel_master_ == CHAN_MAIN) ch_to = "master_main"; - else if(opt->mode_ == MODE_MASTER && opt->channel_master_ == CHAN_MUSIC) + else if(state_.mode_ == MODE_MASTER && state_.channel_master_ == CHAN_MUSIC) ch_to = "master_music"; - else if(opt->mode_ == MODE_STANDBY && opt->channel_standby_ == CHAN_MAIN) + else if(state_.mode_ == MODE_STANDBY && state_.channel_standby_ == CHAN_MAIN) ch_to = "standby_main"; - else if(opt->mode_ == MODE_STANDBY && opt->channel_standby_ == CHAN_MUSIC) + else if(state_.mode_ == MODE_STANDBY && state_.channel_standby_ == CHAN_MUSIC) ch_to = "standby_music"; else { - opt->mode_ = old_mode; + state_.mode_ = old_mode; log_printf(ERROR, "EEE: mode: current config is illegal?!"); return 0; } int ret = crossfade(ch_from, ch_to, fd, cmd_q, opt); if(ret) { - opt->mode_ = old_mode; + state_.mode_ = old_mode; if(ret > 0) return 0; @@ -448,9 +458,9 @@ int process_cmd_mode(const char* param, int fd, cmd_t **cmd_q, options_t* opt, c send_response(fd, "EEE: mode: missing parameter"); } - if(old_mode != opt->mode_) { + if(old_mode != state_.mode_) { char* mode_str; - int len = asprintf(&mode_str, "new Mode: %s", opt->mode_ == MODE_MASTER ? "master" : "standby"); + int len = asprintf(&mode_str, "new Mode: %s", state_.mode_ == MODE_MASTER ? "master" : "standby"); if(len > 0) { log_printf(NOTICE, "%s", mode_str); client_t* client; @@ -771,10 +781,10 @@ int main_loop(int switch_fd, int cmd_listen_fd, options_t* opt) int return_value = 0; char* channel = "unknown"; - if(opt->mode_ == MODE_MASTER && opt->channel_master_ == CHAN_MAIN) channel = "master_main"; - else if(opt->mode_ == MODE_MASTER && opt->channel_master_ == CHAN_MUSIC) channel = "master_music"; - else if(opt->mode_ == MODE_STANDBY && opt->channel_standby_ == CHAN_MAIN) channel = "standby_main"; - else if(opt->mode_ == MODE_STANDBY && opt->channel_standby_ == CHAN_MUSIC) channel = "standby_music"; + if(state_.mode_ == MODE_MASTER && state_.channel_master_ == CHAN_MAIN) channel = "master_main"; + else if(state_.mode_ == MODE_MASTER && state_.channel_master_ == CHAN_MUSIC) channel = "master_music"; + else if(state_.mode_ == MODE_STANDBY && state_.channel_standby_ == CHAN_MAIN) channel = "standby_main"; + else if(state_.mode_ == MODE_STANDBY && state_.channel_standby_ == CHAN_MUSIC) channel = "standby_music"; char* cmd_param = strdup("*0M1*0ii1"); char* ch_nr = key_value_storage_find(&opt->alias_table_, channel); @@ -979,6 +989,10 @@ int main(int argc, char* argv[]) exit(-1); } + state_.mode_ = opt.mode_; + state_.channel_master_ = opt.channel_master_; + state_.channel_standby_ = opt.channel_standby_; + int switch_fd = 0; for(;;) { switch_fd = open(opt.switch_dev_, O_RDWR | O_NOCTTY); |