void SetOptions() { SetCommandLineOptions(); SetCommonOptions(); SetConfigOnlyOptions(); SetEnvMapping(); }
int main(int argc, char *argv[]) { if (!SetCommandLineOptions(argc, argv)) { return -1; } cmdline_opt = GetCommandLineOptions(); if (cmdline_opt.daemon) { std::cout << "raspivoice daemon started." << std::endl; daemon_startup(); } pthread_mutex_init(&rvopt_mutex, NULL); rvopt = cmdline_opt; //Setup keyboard: KeyboardInput keyboardInput; keyboardInput.Verbose = cmdline_opt.verbose; bool use_ncurses = true; if (cmdline_opt.verbose || cmdline_opt.daemon) { use_ncurses = false; } if (cmdline_opt.use_rotary_encoder) { keyboardInput.SetInputType(KeyboardInput::InputType::RotaryEncoder); } else if (cmdline_opt.grab_keyboard != "") { if (!keyboardInput.SetInputType(KeyboardInput::InputType::Keyboard, cmdline_opt.grab_keyboard)) { std::cerr << "Cannot grab keyboard device: " << cmdline_opt.grab_keyboard << "." << std::endl; return -1; } } else if (use_ncurses) { keyboardInput.SetInputType(KeyboardInput::InputType::NCurses); } else if (!cmdline_opt.daemon) { keyboardInput.SetInputType(KeyboardInput::InputType::Terminal); } //Start Program in worker thread: //Warning: Do not read or write rvopt or quit_flag without locking after this. pthread_t thr; AudioData::Init(); if (pthread_create(&thr, NULL, run_worker_thread, NULL)) { std::cerr << "Error setting up thread." << std::endl; return -1; } //Setup UI: if (use_ncurses) { //Show interactive screen: if (setup_screen()) { printw("%s", keyboardInput.GetInteractiveCommandList().c_str()); refresh(); main_loop(keyboardInput); close_screen(); } } else if ((cmdline_opt.verbose) && (!cmdline_opt.daemon)) { std::cout << "Verbose mode on, curses UI disabled." << std::endl; std::cout << keyboardInput.GetInteractiveCommandList(); main_loop(keyboardInput); } else { main_loop(keyboardInput); } if (cmdline_opt.grab_keyboard != "") { keyboardInput.ReleaseKeyboard(); } //Wait for worker thread: pthread_join(thr, nullptr); //Check for exception from worker thread: if (exc_ptr != nullptr) { try { std::rethrow_exception(exc_ptr); } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; return(-1); } } return(0); }