source: trunk/src_apollo/org/apollo/ApolloSystem.java@ 375

Last change on this file since 375 was 375, checked in by bjn8, 16 years ago

Lots of minor improvements made prior to evluation study, and small things done afterwards for report :)

File size: 8.7 KB
Line 
1package org.apollo;
2
3import java.awt.Image;
4import java.awt.Toolkit;
5import java.awt.event.WindowEvent;
6import java.awt.event.WindowListener;
7import java.net.URL;
8import java.util.Collection;
9import java.util.HashSet;
10import java.util.Set;
11
12import javax.swing.SwingUtilities;
13import javax.swing.UIManager;
14
15import org.apollo.actions.ApolloActions;
16import org.apollo.agents.MelodySearch;
17import org.apollo.audio.ApolloPlaybackMixer;
18import org.apollo.audio.RecordManager;
19import org.apollo.audio.SampledAudioManager;
20import org.apollo.audio.util.MultiTrackPlaybackController;
21import org.apollo.audio.util.PlaybackClock;
22import org.apollo.audio.util.SoundDesk;
23import org.apollo.gui.FrameLayoutDaemon;
24import org.apollo.gui.FramePlaybackBarRenderer;
25import org.apollo.gui.FrameRenderPasses;
26import org.apollo.io.SampledAudioFileImporter;
27import org.apollo.util.ApolloSystemLog;
28import org.apollo.util.Mutable;
29import org.apollo.widgets.FramePlayer;
30import org.expeditee.actions.Actions;
31import org.expeditee.gui.Browser;
32import org.expeditee.gui.Frame;
33import org.expeditee.gui.FrameIO;
34import org.expeditee.gui.FrameKeyboardActions;
35import org.expeditee.gui.FrameMouseActions;
36import org.expeditee.gui.UserSettings;
37import org.expeditee.importer.FrameDNDTransferHandler;
38import org.expeditee.items.Item;
39import org.expeditee.items.Text;
40
41/**
42 * Provides initialization and shutdown services for the Apollo system.
43 *
44 * @author Brook Novak
45 *
46 */
47public final class ApolloSystem {
48
49 // TODO: Create actual frames
50 public static final String SYSTEM_FRAMESET_NAME = "apollosystem";
51 public static final String HELP_TOP_FRAMENAME = SYSTEM_FRAMESET_NAME + 2;
52
53// TODO: How to get good results: collection (moteef) and querry
54 // TODO: How to omit indexing on tracks
55 public static final String HELP_MELODYSEARCH_FRAMENAME = SYSTEM_FRAMESET_NAME + 3;
56
57 public static final String SETTINGS_NAME_TIMELINE_RMARGIN = "timelinerightmargin";
58 public static final String SETTINGS_NAME_TIMELINE_LMARGIN = "timelineleftmargin";
59
60
61
62 public static boolean useQualityGraphics = true;
63
64 private ApolloSystem() {
65 }
66
67 private static boolean hasInitialized = false;
68
69 /**
70 * Initializes Apollo mod for expeditee - prepares all subsystems.
71 */
72 public static void initialize() {
73
74 if (hasInitialized) return;
75
76 ApolloSystemLog.println("Initializing...");
77
78 SwingUtilities.invokeLater(new Runnable() {
79 public void run() {
80
81 try {
82
83 URL url = ClassLoader.getSystemResource("org/apollo/icons/mainicon.png");
84
85 if (url != null) {
86 Image img = Toolkit.getDefaultToolkit().getImage(url);
87 Browser._theBrowser.setIconImage(img);
88 }
89
90
91
92 } catch (Exception e) {
93 e.printStackTrace();
94 }
95
96 // Ensure that resources are released before the application is closed.
97 Browser._theBrowser.addWindowListener(new WindowListener() {
98
99 public void windowActivated(WindowEvent e) {
100 }
101
102 public void windowClosed(WindowEvent e) {
103 }
104
105 public void windowClosing(WindowEvent e) {
106 ApolloSystem.shutdown();
107 }
108
109 public void windowDeactivated(WindowEvent e) {
110 }
111
112 public void windowDeiconified(WindowEvent e) {
113 }
114
115 public void windowIconified(WindowEvent e) {
116 }
117
118 public void windowOpened(WindowEvent e) {
119 }
120
121 });
122
123 Browser._theBrowser.getContentPane().removeKeyListener(FrameKeyboardActions.getInstance());
124 Browser._theBrowser.removeKeyListener(FrameKeyboardActions.getInstance());
125
126 Browser._theBrowser.getContentPane().addKeyListener(new AudioFrameKeyboardActions());
127 Browser._theBrowser.addKeyListener(new AudioFrameKeyboardActions());
128
129 // Filter out some special mouse move cases
130 AudioFrameMouseActions apolloMouseFilter = new AudioFrameMouseActions();
131 Browser._theBrowser.getMouseEventRouter().removeExpediteeMouseMotionListener(
132 FrameMouseActions.getInstance());
133 Browser._theBrowser.getMouseEventRouter().addExpediteeMouseMotionListener(apolloMouseFilter);
134
135 Browser._theBrowser.getMouseEventRouter().removeExpediteeMouseListener(
136 FrameMouseActions.getInstance());
137 Browser._theBrowser.getMouseEventRouter().addExpediteeMouseListener(apolloMouseFilter);
138 }
139 });
140
141 // Set title
142 //Browser._theBrowser.setTitle("Apollo");
143
144 loadSettings();
145
146 ApolloSystemLog.println(" Preparing sub-systems...");
147
148 SampledAudioManager.getInstance();
149
150 RecordManager.getInstance();
151
152 ApolloPlaybackMixer.getInstance();
153
154 FrameLayoutDaemon.getInstance();
155
156 FrameRenderPasses.getInstance();
157
158 PlaybackClock.getInstance();
159
160 FramePlaybackBarRenderer.getInstance();
161
162 // Setup for importing audio
163 FrameDNDTransferHandler.getInstance().addCustomFileImporter(
164 new SampledAudioFileImporter());
165
166 ApolloSystemLog.println(" Loading actions and agents...");
167
168 // Add apollo actions
169 Actions.LoadMethods(ApolloActions.class);
170
171 Set<String> agents = new HashSet<String>();
172 agents.add(MelodySearch.class.getName());
173
174 Collection<String> omitted = Actions.addAgents(agents);
175
176 for (String agent : omitted) {
177
178 if (agent == null || agent.length() == 0) continue;
179
180 String name = agent;
181
182 int index = agent.lastIndexOf('.');
183 if (index > 0 && agent.length() > (index - 1)) {
184 name = agent.substring(index);
185 }
186 ApolloSystemLog.println(" WARNING: Failed to add agent \"" + name + "\"");
187
188 }
189
190 ApolloSystemLog.println(" Loading banks...");
191 SoundDesk.getInstance(); // loads upon creation
192
193 ApolloSystemLog.println("Initialized");
194
195 hasInitialized = true;
196 }
197
198 /**
199 * TODO: This is temporary and should be integrated with expeditees settings system.. once it is desinged
200 * to support plugins...
201 *
202 * When invoked, the apollo setting frame is loaded and parsed... setting apollo-specific settings.
203 */
204 public static void loadSettings() {
205
206 // Load apollo settings frame from the default profile
207 Frame profile = FrameIO.LoadProfile(UserSettings.DEFAULT_PROFILE_NAME);
208 if (profile == null) {
209 try {
210 profile = FrameIO.CreateNewProfile(UserSettings.DEFAULT_PROFILE_NAME);
211 } catch (Exception e) {
212 e.printStackTrace();
213 return;
214 }
215 }
216 assert(profile != null);
217
218 for (Item i : profile.getItems()) {
219 if (i instanceof Text) {
220 Text textItem = (Text)i;
221
222 if (textItem.getText().toLowerCase().trim().startsWith(SETTINGS_NAME_TIMELINE_LMARGIN)) {
223 Mutable.Integer val = stripNameValueStringInteger(textItem.getText());
224 if (val != null) {
225 FrameLayoutDaemon.getInstance().setTimelineMargins(
226 val.value,
227 FrameLayoutDaemon.getInstance().getRightMargin());
228 }
229
230 } else if (textItem.getText().toLowerCase().trim().startsWith(SETTINGS_NAME_TIMELINE_RMARGIN)) {
231 Mutable.Integer val = stripNameValueStringInteger(textItem.getText());
232 if (val != null) {
233 FrameLayoutDaemon.getInstance().setTimelineMargins(
234 FrameLayoutDaemon.getInstance().getLeftMargin(),
235 val.value);
236 }
237 }
238 }
239 }
240
241 }
242
243 private static Mutable.Integer stripNameValueStringInteger(String namevalue) {
244 assert (namevalue != null);
245 int valueIndex = namevalue.indexOf(':') + 1;
246 if (valueIndex == 0 || valueIndex >= (namevalue.length() - 1)) return null;
247
248 try {
249 int value = Integer.parseInt(namevalue.substring(valueIndex));
250 return Mutable.createMutableInteger(value);
251 } catch (NumberFormatException e) { /* Consume*/ }
252
253 return null;
254 }
255
256
257
258 /**
259 * Releases all resources currently used by the SampledAudioManager.
260 */
261 private static void shutdown() {
262
263 ApolloSystemLog.println("Saving banks...");
264 SoundDesk.getInstance().saveMasterMix();
265 SoundDesk.getInstance().saveMixes();
266
267 FramePlayer.saveTypedFrames();
268
269 ApolloSystemLog.println("Releasing resources...");
270
271 ApolloPlaybackMixer.getInstance().releaseResources();
272 RecordManager.getInstance().releaseResources(); // blocking
273 MultiTrackPlaybackController.getInstance().releaseResources();
274
275 ApolloSystemLog.println("Audio subsystems shutdown");
276 }
277
278 /**
279 * @return
280 * True if has initialized.
281 */
282 public static boolean isInitialized() {
283 return hasInitialized;
284 }
285
286
287
288 /**
289 * The apollo main just ensures that apollo is initialized during startup.
290 *
291 * This may eventually become redundant once Expeditee implements a plugin system
292 * that allows a plugin / mod to initialize itself at started...
293 *
294 * @param args
295 */
296 public static void main(String[] args) {
297
298 try {
299 UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
300 }
301 catch (Exception e) {
302 e.printStackTrace();
303 return;
304 }
305
306 // Run expeditee
307 Browser.main(args);
308
309 // Initialize apollo
310 SwingUtilities.invokeLater(new Runnable() {
311 public void run() {
312 ApolloSystem.initialize();
313 }
314 });
315 }
316
317}
Note: See TracBrowser for help on using the repository browser.