1 /*
2 * tracker/TrackerStartUp.cpp
3 *
4 * Copyright 2009 Peter Barth
5 *
6 * This file is part of Milkytracker.
7 *
8 * Milkytracker is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * Milkytracker is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with Milkytracker. If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23 /*
24 * TrackerStartUp.cpp
25 * MilkyTracker
26 *
27 * Created by Peter Barth on Sun Mar 20 2005.
28 *
29 */
30
31 #include "Tracker.h"
32 #include "XMFile.h"
33 #include "TrackerSettingsDatabase.h"
34 #include "PPSystem.h"
35 #include "Screen.h"
36 #include "PatternEditorControl.h"
37 #include "PlayerMaster.h"
38 #include "SystemMessage.h"
39 #include "version.h"
40
41 // Logo picture
42 #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__)
43 #include "LogoSmall.h"
44 #else
45 #include "LogoBig.h"
46 #endif
47
48
getWindowSizeFromDatabase()49 PPSize Tracker::getWindowSizeFromDatabase()
50 {
51 PPSize size(PPScreen::getDefaultWidth(), PPScreen::getDefaultHeight());
52
53 if (XMFile::exists(System::getConfigFileName()))
54 {
55 TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase);
56 XMFile f(System::getConfigFileName());
57 settingsDatabaseCopy->serialize(f);
58 size.height = settingsDatabaseCopy->restore("YRESOLUTION")->getIntValue();
59 size.width = settingsDatabaseCopy->restore("XRESOLUTION")->getIntValue();
60 delete settingsDatabaseCopy;
61 }
62
63 return size;
64 }
65
getFullScreenFlagFromDatabase()66 bool Tracker::getFullScreenFlagFromDatabase()
67 {
68 bool fullScreen = false;
69
70 if (XMFile::exists(System::getConfigFileName()))
71 {
72 TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase);
73 XMFile f(System::getConfigFileName());
74 settingsDatabaseCopy->serialize(f);
75 fullScreen = settingsDatabaseCopy->restore("FULLSCREEN")->getBoolValue();
76 delete settingsDatabaseCopy;
77 }
78
79 return fullScreen;
80 }
81
getScreenScaleFactorFromDatabase()82 pp_int32 Tracker::getScreenScaleFactorFromDatabase()
83 {
84 pp_int32 scaleFactor = 1;
85
86 if (XMFile::exists(System::getConfigFileName()))
87 {
88 TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase);
89 XMFile f(System::getConfigFileName());
90 settingsDatabaseCopy->serialize(f);
91 scaleFactor = settingsDatabaseCopy->restore("SCREENSCALEFACTOR")->getIntValue();
92 delete settingsDatabaseCopy;
93 }
94
95 return scaleFactor;
96 }
97
getShowSplashFlagFromDatabase()98 bool Tracker::getShowSplashFlagFromDatabase()
99 {
100 bool showSplash = true;
101
102 if (XMFile::exists(System::getConfigFileName()))
103 {
104 TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase);
105 XMFile f(System::getConfigFileName());
106 settingsDatabaseCopy->serialize(f);
107 showSplash = settingsDatabaseCopy->restore("SHOWSPLASH")->getBoolValue();
108 delete settingsDatabaseCopy;
109 }
110
111 return showSplash;
112 }
113
114 #define SPLASH_WAIT_TIME 1000
115
showSplash()116 void Tracker::showSplash()
117 {
118 screen->clear();
119 float shade = 0.0f;
120 pp_int32 deltaT = 100;
121 while (shade <= 256.0f)
122 {
123 pp_int32 startTime = ::PPGetTickCount();
124 #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__)
125 screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4, (int)shade);
126 #else
127 screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3, (int)shade);
128 #endif
129 shade+=deltaT * (1.0f/6.25f);
130 deltaT = abs((pp_int32)::PPGetTickCount() - startTime);
131 if (!deltaT) deltaT++;
132 }
133 #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__)
134 screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4);
135 #else
136 screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3);
137 #endif
138 screen->enableDisplay(false);
139 }
140
hideSplash()141 void Tracker::hideSplash()
142 {
143 screen->clear();
144 #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__)
145 screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4);
146 #else
147 screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3);
148 #endif
149 screen->enableDisplay(true);
150 float shade = 256.0f;
151 pp_int32 deltaT = 100;
152 while (shade >= 0.0f)
153 {
154 pp_int32 startTime = ::PPGetTickCount();
155 #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__)
156 screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4, (int)shade);
157 #else
158 screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3, (int)shade);
159 #endif
160 shade-=deltaT * (1.0f/6.25f);
161 deltaT = abs((pp_int32)::PPGetTickCount() - startTime);
162 if (!deltaT) deltaT++;
163 }
164 screen->clear();
165
166 screen->pauseUpdate(true);
167 screen->paintControl(getPatternEditorControl(), false);
168 screen->paint();
169 screen->pauseUpdate(false);
170 }
171
startUp(bool forceNoSplash)172 void Tracker::startUp(bool forceNoSplash/* = false*/)
173 {
174 bool noSplash = forceNoSplash ? true : !getShowSplashFlagFromDatabase();
175
176 // put up splash screen if desired
177 pp_uint32 startTime = PPGetTickCount();
178
179 if (!noSplash)
180 showSplash();
181 else
182 screen->enableDisplay(false);
183
184 initUI();
185
186 pp_int32 dTime;
187
188 if (!noSplash)
189 {
190 dTime = (signed)(PPGetTickCount() - startTime);
191 if (dTime > SPLASH_WAIT_TIME) dTime = SPLASH_WAIT_TIME;
192 if (dTime < 0) dTime = 0;
193 System::msleep(SPLASH_WAIT_TIME/2 - dTime);
194 startTime = PPGetTickCount();
195 }
196
197 if (XMFile::exists(System::getConfigFileName()))
198 {
199 // create as copy from existing database, so all keys are in there
200 settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase);
201
202 XMFile f(System::getConfigFileName());
203
204 // restore keys from disk
205 settingsDatabaseCopy->serialize(f);
206
207 // everything alright, delete old database and take new one
208 delete settingsDatabase;
209 settingsDatabase = settingsDatabaseCopy;
210 settingsDatabaseCopy = NULL;
211 }
212
213 // apply ALL settings, not just the different ones
214 applySettings(settingsDatabase, NULL, true, false);
215
216 // update version information
217 settingsDatabase->store("VERSION", MILKYTRACKER_VERSION);
218
219 // Update info panels
220 updateSongInfo(false);
221
222 updateWindowTitle();
223
224 // try to start playback engine
225 bool masterStart = playerMaster->start();
226
227 // remove splash screen
228 if (!noSplash)
229 {
230 dTime = (signed)(PPGetTickCount() - startTime);
231 if (dTime > SPLASH_WAIT_TIME/2) dTime = SPLASH_WAIT_TIME/2;
232 if (dTime < 0) dTime = 0;
233
234 System::msleep(SPLASH_WAIT_TIME/2 - dTime);
235 hideSplash();
236 }
237 else
238 screen->enableDisplay(true);
239
240 screen->paint();
241
242 if (!masterStart)
243 {
244 SystemMessage systemMessage(*screen, SystemMessage::MessageSoundDriverInitFailed);
245 systemMessage.show();
246 }
247 }
248