1
1
#include "../config.h"
4
5
#include <screen_intro.h>
5
6
#include <screen_songs.h>
6
7
#include <screen_sing.h>
7
8
#include <screen_practice.h>
9
#include <screen_score.h>
10
#include <screen_configuration.h>
8
11
#include <video_driver.h>
9
unsigned int width=800;
10
unsigned int height=600;
11
unsigned int fullscreen=0;
12
#include <boost/format.hpp>
13
#include <boost/program_options.hpp>
14
#include <boost/thread.hpp>
14
20
SDL_Surface * screenSDL;
15
CScreenManager *screenManager;
16
CVideoDriver *videoDriver;
20
void checkEvents( void )
22
while(SDL_PollEvent( &event ) == 1) {
23
screenManager->getCurrentScreen()->manageEvent(event);
22
static void checkEvents_SDL(CScreenManager& sm) {
23
static bool esc = false;
25
while(SDL_PollEvent(&event) == 1) {
24
26
switch(event.type) {
26
screenManager->finished();
31
if (event.key.keysym.sym == SDLK_ESCAPE) esc = false;
29
34
int keypressed = event.key.keysym.sym;
30
35
SDLMod modifier = event.key.keysym.mod;
31
if( keypressed == SDLK_f && modifier&KMOD_ALT ) {
36
// Workaround for key repeat on escape
37
if (keypressed == SDLK_ESCAPE) {
41
if (keypressed == SDLK_RETURN && modifier & KMOD_ALT ) {
32
42
SDL_WM_ToggleFullScreen(screenSDL);
43
sm.setFullscreenStatus(!sm.getFullscreenStatus());
44
continue; // Already handled here...
48
sm.getCurrentScreen()->manageEvent(event);
41
if( SDL_Init(SDL_INIT_VIDEO) == -1 ) {
42
fprintf(stderr,"SDL_Init Error\n");
52
static void init_SDL(CScreenManager& sm, CVideoDriver& vd, unsigned int width, unsigned int height) {
53
std::atexit(SDL_Quit);
54
if( SDL_Init(SDL_INIT_VIDEO) == -1 ) throw std::runtime_error("SDL_Init failed");
47
55
SDL_WM_SetCaption(PACKAGE" - "VERSION, "WM_DEFAULT");
49
screenSDL = videoDriver->init( width, height, fullscreen );
56
screenSDL = vd.init(width, height, sm.getFullscreenStatus());
57
if (!screenSDL) throw std::runtime_error("Cannot initialize screen");
51
58
SDL_ShowCursor(SDL_DISABLE);
52
59
SDL_EnableUNICODE(SDL_ENABLE);
53
SDL_EnableKeyRepeat(125, 125);
56
int thread_func(void *)
58
while( !screenManager->isFinished() ) {
59
screenManager->getRecord()->compute();
64
void usage( char * progname )
66
fprintf(stdout,"Usage: %s [OPTIONS] [SONG_DIRECTORY]\n", progname);
67
fprintf(stdout,"Options:\n");
69
fprintf(stdout," -W, --width (default: 640) set window width\n");
70
fprintf(stdout," -H, --height (default: 480) set window height\n");
71
fprintf(stdout," -t, --theme set theme (theme name or absolute path to the\n");
72
fprintf(stdout," theme)\n");
73
fprintf(stdout," -c, --no-capture disable sound capture thread\n");
74
fprintf(stdout," -f, --fullscreen enable fullscreen video output\n");
75
fprintf(stdout," -d, --difficulty set difficulty level\n");
76
fprintf(stdout," (0: easy, 1:medium, 2:hard (default))\n");
77
fprintf(stdout," -h, --help display this text and exit\n");
78
fprintf(stdout," -v, --version display version number and exit\n");
82
int main( int argc, char ** argv )
84
char * songs_directory = NULL;
85
char * theme_name = NULL;
86
CScreen * screen = NULL;
88
SDL_Thread *thread = NULL;
89
unsigned int difficulty= 2;
91
static struct option long_options[] =
93
{"width",required_argument,NULL,'W'},
94
{"height",required_argument,NULL,'H'},
95
{"theme",required_argument,NULL,'t'},
96
{"help",no_argument,NULL,'h'},
97
{"no-capture",no_argument,NULL,'c'},
98
{"version",no_argument,NULL,'v'},
99
{"difficulty",required_argument,NULL,'d'},
100
{"fullscreen",no_argument,NULL,'f'},
104
while ((ch = getopt_long(argc, argv, "t:W:H:hcfd:v", long_options, NULL)) != -1) {
125
difficulty = atoi(optarg);
128
fprintf(stdout,"%s %s\n",PACKAGE, VERSION);
134
if( optind == argc ) {
135
// Using default songs directory
136
const char default_songs_directory[] = DATA_DIR "/songs";
137
fprintf(stdout,"Using %s as default songs directory\n",default_songs_directory);
138
songs_directory = new char[strlen(default_songs_directory)+2];
139
sprintf(songs_directory,"%s/",default_songs_directory); // safe sprintf
141
// Add the trailing slash
142
songs_directory = new char[strlen(argv[optind])+2];
143
sprintf(songs_directory,"%s/",argv[optind]); // safe sprintf
146
videoDriver = new CVideoDriver();
150
if( theme_name != NULL )
151
screenManager = new CScreenManager( width, height , songs_directory , theme_name );
153
screenManager = new CScreenManager( width, height , songs_directory );
155
screenManager->setSDLScreen(screenSDL);
156
screenManager->setAudio( new CAudio() );
157
screenManager->setRecord( new CRecord() );
158
screenManager->setVideoDriver( videoDriver );
159
screenManager->setDifficulty( difficulty );
161
screen = new CScreenIntro("Intro");
162
screenManager->addScreen(screen);
163
screen = new CScreenSongs("Songs");
164
screenManager->addScreen(screen);
165
screen = new CScreenSing("Sing");
166
screenManager->addScreen(screen);
167
screen = new CScreenPractice("Practice");
168
screenManager->addScreen(screen);
170
screenManager->activateScreen("Intro");
173
thread = SDL_CreateThread(thread_func, NULL);
175
while( !screenManager->isFinished() ) {
177
videoDriver->blank();
178
screenManager->getCurrentScreen()->draw();
184
SDL_WaitThread(thread, NULL);
187
delete screenManager;
188
delete[] songs_directory;
60
SDL_EnableKeyRepeat(80, 80);
63
int main(int argc, char** argv) {
64
std::srand(std::time(NULL)); // Seed rand (used for choosing random songs)
65
bool fullscreen = false;
66
unsigned int width, height;
68
std::set<std::string> songdirs;
72
std::vector<std::string> songdirstmp;
73
namespace po = boost::program_options;
74
po::options_description desc("Available options");
76
("help,h", "you are viewing it")
77
("theme,t", po::value<std::string>(&theme)->default_value("lima"), "set theme (name or absolute path)")
78
("songdir,s", po::value<std::vector<std::string> >(&songdirstmp)->composing(), "additional song folders to scan\n -s none to disable built-in defaults")
79
("fs,f", "enable full screen mode")
80
("width,W", po::value<unsigned int>(&width)->default_value(800), "set horizontal resolution")
81
("height,H", po::value<unsigned int>(&height)->default_value(600), "set vertical resolution")
82
("cdev", po::value<std::string>(&cdev), "set capture device (disable autodetection)\n --cdev dev[:settings]\n --cdev help for list of devices")
83
("crate", po::value<std::size_t>(&crate)->default_value(48000), "set capture frequency\n 44100 and 48000 Hz are optimal")
84
("version,v", "display version number");
87
po::store(po::parse_command_line(argc, argv, desc), vm);
89
} catch (std::exception& e) {
90
std::cout << desc << std::endl;
91
std::cout << "ERROR: " << e.what() << std::endl;
94
if (vm.count("help")) {
95
std::cout << desc << std::endl;
99
da::record::devlist_t l = da::record::devices();
100
std::cout << "Recording devices:" << std::endl;
101
for (da::record::devlist_t::const_iterator it = l.begin(); it != l.end(); ++it) {
102
std::cout << boost::format(" %1% %|10t|%2%\n") % it->name() % it->desc();
106
if (vm.count("version")) {
107
std::cout << PACKAGE << ' ' << VERSION << std::endl;
110
if (vm.count("fs")) fullscreen = true;
111
// Copy songdirstmp into songdirs
112
bool defaultdirs = true;
113
for (std::vector<std::string>::const_iterator it = songdirstmp.begin(); it != songdirstmp.end(); ++it) {
114
std::string str = *it;
115
if (str == "none") { defaultdirs = false; continue; }
116
if (*str.rbegin() != '/') str += '/';
117
songdirs.insert(str);
120
songdirs.insert(DATA_DIR "songs/");
122
char const* home = getenv("HOME");
123
if (home) songdirs.insert(std::string(home) + "/.ultrastar/songs/");
125
songdirs.insert("/usr/share/games/ultrastar/songs/");
126
songdirs.insert("/usr/share/games/ultrastar-ng/songs/");
127
songdirs.insert("/usr/share/ultrastar/songs/");
128
songdirs.insert("/usr/share/ultrastar-ng/songs/");
129
songdirs.insert("/usr/local/share/games/ultrastar/songs/");
130
songdirs.insert("/usr/local/share/games/ultrastar-ng/songs/");
131
songdirs.insert("/usr/local/share/ultrastar/songs/");
132
songdirs.insert("/usr/local/share/ultrastar-ng/songs/");
136
// Initialize everything
137
CScreenManager sm(width, height, theme);
138
sm.setFullscreenStatus(fullscreen);
140
init_SDL(sm, vd, width, height);
141
sm.setSDLScreen(screenSDL);
142
sm.setAudio(new CAudio());
143
sm.setVideoDriver(&vd);
144
sm.addScreen(new CScreenIntro("Intro", width, height));
145
sm.addScreen(new CScreenSongs("Songs", width, height, songdirs));
146
Capture capture(cdev, crate);
147
sm.addScreen(new CScreenSing("Sing", width, height, capture.analyzer()));
148
sm.addScreen(new CScreenPractice("Practice", width, height, capture.analyzer()));
149
sm.addScreen(new CScreenScore("Score", width, height));
150
sm.addScreen(new CScreenConfiguration("Configuration", width, height));
151
sm.activateScreen("Intro");
153
while (!sm.isFinished()) {
156
sm.getCurrentScreen()->draw();
158
boost::thread::yield();
160
} catch (std::exception& e) {
161
std::cout << "FATAL ERROR: " << e.what() << std::endl;