static void * remotethread(void * arg) { int done = 0; int error = 0; int ignore = 0; char buf[MAXBUF+1]; char *b; #if HAVE_SELECT fd_set fd; #endif buf[MAXBUF]=0; while(!done) { /* Read a line */ buf[0] = 0; send_log("Waiting for input: ..."); #if HAVE_SELECT FD_ZERO(&fd); FD_SET(0,&fd); select (1, &fd, NULL, NULL, NULL); #endif fgets(buf, MAXBUF, stdin); buf[strlen(buf)-1] = 0; /* Lock on */ pthread_mutex_lock (&main_lock); send_log("Input: %s", buf); error = 0; if (!strncasecmp(buf,"l",1)) { /* prepare to load */ if ((b=strchr(buf,' ')) != NULL) { /* Prepare to load a new song */ strcpy((char*)arg, b+1); setstatus(NEXT); } else { /* Invalid load command */ error = 1; } } else if (!strncasecmp(buf,"p",1)) { /* Prepare to (un)pause */ invertpause(); } else if (!strncasecmp(buf,"j",1)) { /* Prepare to seek */ if ((b=strchr(buf,' ')) != NULL) { set_seek_opt(&options, b+1); } ignore = 1; } else if (!strncasecmp(buf,"s",1)) { /* Prepare to stop */ setstatus(STOP); } else if (!strncasecmp(buf,"r",1)) { /* Prepare to reload */ setstatus(NEXT); } else if (!strncasecmp(buf,"h",1)) { /* Send help */ send_msg("H +----------------------------------------------------+"); send_msg("H | Ogg123 remote interface |"); send_msg("H |----------------------------------------------------|"); send_msg("H | Load <file> - load a file and starts playing |"); send_msg("H | Pause - pause or unpause playing |"); send_msg("H | Jump [+|-]<f> - jump <f> seconds forth or back |"); send_msg("H | Stop - stop playing |"); send_msg("H | Reload - reload last song |"); send_msg("H | Quit - quit ogg123 |"); send_msg("H |----------------------------------------------------|"); send_msg("H | refer to README.remote for documentation |"); send_msg("H +----------------------------------------------------+"); ignore = 1; } else if (!strncasecmp(buf,"q",1)) { /* Prepare to quit */ setstatus(QUIT); done = 1; } else { /* Unknown input received */ error = 1; } if (ignore) { /* Unlock */ pthread_mutex_unlock (&main_lock); ignore = 0; } else { if (error) { /* Send the error and unlock */ send_err("E Unknown command '%s'", buf); send_log("Unknown command '%s'", buf); /* Unlock */ pthread_mutex_unlock (&main_lock); } else { /* Signal the main thread */ sem_post(&sem_command); /* Unlock */ pthread_mutex_unlock (&main_lock); /* Wait until the change has been noticed */ sem_wait(&sem_processed); } } } return NULL; }
int parse_cmdline_options (int argc, char **argv, ogg123_options_t *ogg123_opts, file_option_t *file_opts) { int option_index = 1; ao_option *temp_options = NULL; ao_option ** current_options = &temp_options; ao_info *info; int temp_driver_id = -1; audio_device_t *current; int ret; while (-1 != (ret = getopt_long(argc, argv, "b:c::d:f:hl:k:K:o:p:qrRvVx:y:zZ@:", long_options, &option_index))) { switch (ret) { case 0: if(!strcmp(long_options[option_index].name, "audio-buffer")) { ogg123_opts->buffer_size = 1024 * atoi(optarg); } else { status_error(_("Internal error parsing command line options.\n")); exit(1); } break; case 'b': ogg123_opts->input_buffer_size = atoi(optarg) * 1024; if (ogg123_opts->input_buffer_size < MIN_INPUT_BUFFER_SIZE * 1024) { status_error(_("Input buffer size smaller than minimum size of %dkB."), MIN_INPUT_BUFFER_SIZE); ogg123_opts->input_buffer_size = MIN_INPUT_BUFFER_SIZE * 1024; } break; case 'c': if (optarg) { char *tmp = strdup (optarg); parse_code_t pcode = parse_line(file_opts, tmp); if (pcode != parse_ok) status_error(_("=== Error \"%s\" while parsing config option from command line.\n" "=== Option was: %s\n"), parse_error_string(pcode), optarg); free (tmp); } else { /* not using the status interface here */ fprintf (stdout, _("Available options:\n")); file_options_describe(file_opts, stdout); exit (0); } break; case 'd': temp_driver_id = ao_driver_id(optarg); if (temp_driver_id < 0) { status_error(_("=== No such device %s.\n"), optarg); exit(1); } current = append_audio_device(ogg123_opts->devices, temp_driver_id, NULL, NULL); if(ogg123_opts->devices == NULL) ogg123_opts->devices = current; current_options = ¤t->options; break; case 'f': if (temp_driver_id >= 0) { info = ao_driver_info(temp_driver_id); if (info->type == AO_TYPE_FILE) { free(current->filename); current->filename = strdup(optarg); } else { status_error(_("=== Driver %s is not a file output driver.\n"), info->short_name); exit(1); } } else { status_error(_("=== Cannot specify output file without specifying a driver.\n")); exit (1); } break; case 'k': set_seek_opt(ogg123_opts, optarg); break; case 'K': ogg123_opts->endpos = strtotime(optarg); break; case 'l': ogg123_opts->delay = atoi(optarg); break; case 'o': if (optarg && !add_ao_option(current_options, optarg)) { status_error(_("=== Incorrect option format: %s.\n"), optarg); exit(1); } break; case 'h': cmdline_usage(); exit(0); break; case 'p': ogg123_opts->input_prebuffer = atof (optarg); if (ogg123_opts->input_prebuffer < 0.0f || ogg123_opts->input_prebuffer > 100.0f) { status_error (_("--- Prebuffer value invalid. Range is 0-100.\n")); ogg123_opts->input_prebuffer = ogg123_opts->input_prebuffer < 0.0f ? 0.0f : 100.0f; } break; case 'q': ogg123_opts->verbosity = 0; break; case 'r': ogg123_opts->repeat = 1; break; case 'R': ogg123_opts->remote = 1; ogg123_opts->verbosity = 0; break; case 'v': ogg123_opts->verbosity++; break; case 'V': status_error(_("ogg123 from %s %s"), PACKAGE, VERSION); exit(0); break; case 'x': ogg123_opts->nth = atoi(optarg); if (ogg123_opts->nth == 0) { status_error(_("--- Cannot play every 0th chunk!\n")); ogg123_opts->nth = 1; } break; case 'y': ogg123_opts->ntimes = atoi(optarg); if (ogg123_opts->ntimes == 0) { status_error(_("--- Cannot play every chunk 0 times.\n" "--- To do a test decode, use the null output driver.\n")); ogg123_opts->ntimes = 1; } break; case 'z': ogg123_opts->shuffle = 1; break; case 'Z': ogg123_opts->repeat = ogg123_opts->shuffle = 1; break; case '@': if (playlist_append_from_file(ogg123_opts->playlist, optarg) == 0) status_error(_("--- Cannot open playlist file %s. Skipped.\n"), optarg); break; case '?': break; default: cmdline_usage(); exit(1); } } /* Sanity check bad option combinations */ if (ogg123_opts->endpos > 0.0 && ogg123_opts->seekoff > ogg123_opts->endpos) { status_error(_("=== Option conflict: End time is before start time.\n")); exit(1); } /* Add last device to device list or use the default device */ if (temp_driver_id < 0) { /* First try config file setting */ if (ogg123_opts->default_device) { temp_driver_id = ao_driver_id(ogg123_opts->default_device); if (temp_driver_id < 0) status_error(_("--- Driver %s specified in configuration file invalid.\n"), ogg123_opts->default_device); } /* Then try libao autodetect */ if (temp_driver_id < 0) temp_driver_id = ao_default_driver_id(); /* Finally, give up */ if (temp_driver_id < 0) { status_error(_("=== Could not load default driver and no driver specified in config file. Exiting.\n")); exit(1); } ogg123_opts->devices = append_audio_device(ogg123_opts->devices, temp_driver_id, temp_options, NULL); } /* if verbosity has been altered, add options to drivers... */ { audio_device_t *head = ogg123_opts->devices; while (head){ if(ogg123_opts->verbosity>3) ao_append_global_option("debug",NULL); if(ogg123_opts->verbosity>2) ao_append_option(&(head->options),"verbose",NULL); if(ogg123_opts->verbosity==0) ao_append_option(&(head->options),"quiet",NULL); head = head->next_device; } } return optind; }