int main(int argc, char *argv[]) { char c, *device, *sport, *aport, *ahost; monome_rotate_t rotate = MONOME_ROTATE_0; int i; struct option arguments[] = { {"help", no_argument, 0, 'h'}, {"device", required_argument, 0, 'd'}, {"server-port", required_argument, 0, 's'}, {"application-port", required_argument, 0, 'a'}, {"application-host", required_argument, 0, 'o'}, {"rotation", required_argument, 0, 'r'} }; device = DEFAULT_MONOME_DEVICE; sport = DEFAULT_OSC_SERVER_PORT; aport = DEFAULT_OSC_APP_PORT; ahost = DEFAULT_OSC_APP_HOST; while( (c = getopt_long(argc, argv, "hd:s:a:o:r:", arguments, &i)) > 0 ) { switch( c ) { case 'h': usage(argv[0]); return 1; case 'd': device = optarg; break; case 's': if( is_numstr(optarg) ) sport = optarg; else printf("warning: \"%s\" is not a valid server port.\n", optarg); break; case 'a': if( is_numstr(optarg) ) aport = optarg; else printf("warning: \"%s\" is not a valid application port.\n", optarg); break; case 'o': ahost = optarg; break; case 'r': switch(*optarg) { case 'l': case '0': rotate = MONOME_ROTATE_0; break; case 't': case '9': rotate = MONOME_ROTATE_90; break; case 'r': case '1': rotate = MONOME_ROTATE_180; break; case 'b': case '2': rotate = MONOME_ROTATE_270; break; } break; } } if( optind == argc ) state.lo_prefix = m_strdup(DEFAULT_OSC_PREFIX); else state.lo_prefix = m_strdup(argv[optind]); if( !(state.monome = monome_open(device)) ) { printf("failed to open %s\n", device); return EXIT_FAILURE; } if( !(state.server = lo_server_new(sport, lo_error)) ) return EXIT_FAILURE; state.outgoing = lo_address_new(ahost, aport); monome_register_handler(state.monome, MONOME_BUTTON_DOWN, monome_handle_press, state.lo_prefix); monome_register_handler(state.monome, MONOME_BUTTON_UP, monome_handle_press, state.lo_prefix); register_osc_methods(state.lo_prefix, state.monome); monome_set_rotation(state.monome, rotate); monome_led_all(state.monome, 0); printf("monomeserial version %s, yay!\n\n", VERSION); printf("initialized device %s at %s, which is %dx%d\n", monome_get_serial(state.monome), monome_get_devpath(state.monome), monome_get_rows(state.monome), monome_get_cols(state.monome)); printf("running with prefix /%s\n\n", state.lo_prefix); /* main_loop() returns 1 if the monome was disconnected */ if( main_loop() ) printf("%s disconnected, monomeserial exiting.\nsee you later!\n\n", monome_get_devpath(state.monome)); monome_close(state.monome); unregister_osc_methods(state.lo_prefix); m_free(state.lo_prefix); lo_address_free(state.outgoing); lo_server_free(state.server); return EXIT_SUCCESS; }
int main(int argc, char **argv) { char *session_file, c; int i; struct option arguments[] = { {"help", no_argument, 0, 'u'}, /* for "usage", get it? hah, hah... */ {"monome-columns", required_argument, 0, 'c'}, {"monome-rows", required_argument, 0, 'r'}, {"osc-prefix", required_argument, 0, 'p'}, {"osc-host-port", required_argument, 0, 'h'}, {"osc-listen-port", required_argument, 0, 'l'}, {0, 0, 0, 0} }; memset(&state, 0, sizeof(rove_state_t)); session_file = NULL; opterr = 0; while( (c = getopt_long(argc, argv, "uc:r:p:h:l:", arguments, &i)) > 0 ) { switch( c ) { case 'u': usage(); exit(EXIT_FAILURE); /* should we exit after displaying usage? (i think so) */ case 'c': state.config.cols = ((atoi(optarg) - 1) & 0xF) + 1; break; case 'r': state.config.rows = ((atoi(optarg) - 1) & 0xF) + 1; break; case 'p': if( *optarg == '/' ) /* remove the leading slash if there is one */ optarg++; state.config.osc_prefix = strdup(optarg); break; case 'h': if( !is_numstr(optarg) ) usage_printf_exit("error: \"%s\" is not a valid host port.\n\n", optarg); state.config.osc_host_port = strdup(optarg); break; case 'l': if( !is_numstr(optarg) ) usage_printf_exit("error: \"%s\" is not a valid listen port.\n\n", optarg); state.config.osc_listen_port = strdup(optarg); break; } } if( optind == argc ) usage_printf_exit("error: you did not specify a session file!\n\n"); if( rove_settings_load(user_config_path()) ) exit(EXIT_FAILURE); session_file = argv[optind]; state.files = rove_list_new(); state.patterns = rove_list_new(); state.active = rove_list_new(); state.staging = rove_list_new(); printf("\nhey, welcome to rove!\n\n" "you've got the following loops loaded:\n" "\t[rows]\t[file]\n"); if( session_load(session_file) ) { printf("error parsing session file :(\n"); exit(EXIT_FAILURE); } if( rove_list_is_empty(state.files) ) { fprintf(stderr, "\t(none, evidently. get some and come play!)\n\n"); exit(EXIT_FAILURE); } if( rove_jack_init() ) { fprintf(stderr, "error initializing JACK :(\n"); exit(EXIT_FAILURE); } rove_recalculate_bpm_variables(); #define ASSIGN_IF_UNSET(k, v) do { \ if( !k ) \ k = v; \ } while( 0 ); ASSIGN_IF_UNSET(state.config.osc_prefix, DEFAULT_OSC_PREFIX); ASSIGN_IF_UNSET(state.config.osc_host_port, DEFAULT_OSC_HOST_PORT); ASSIGN_IF_UNSET(state.config.osc_listen_port, DEFAULT_OSC_LISTEN_PORT); ASSIGN_IF_UNSET(state.config.cols, DEFAULT_MONOME_COLUMNS); ASSIGN_IF_UNSET(state.config.rows, DEFAULT_MONOME_ROWS); #undef ASSIGN_IF_UNSET if( rove_monome_init() ) exit(EXIT_FAILURE); if( rove_jack_activate() ) exit(EXIT_FAILURE); signal(SIGINT, exit_on_signal); atexit(cleanup); rove_monome_run_thread(state.monome); monome_display_loop(); return 0; }