]> git.mxchange.org Git - flightgear.git/blob - src/Main/bootstrap.cxx
Make sound audiable not until after the scenery is loaded.
[flightgear.git] / src / Main / bootstrap.cxx
1 // bootstrap.cxx -- bootstrap routines: main()
2 //
3 // Written by Curtis Olson, started May 1997.
4 //
5 // Copyright (C) 1997 - 2002  Curtis L. Olson  - http://www.flightgear.org/~curt
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 // General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 //
21 // $Id$
22
23
24 #ifdef HAVE_CONFIG_H
25 #  include <config.h>
26 #endif
27
28 #if defined(__linux__) && defined(__i386__)
29 #  include <fpu_control.h>
30 #  include <signal.h>
31 #endif
32
33 #include <stdlib.h>
34 #include <stdio.h>
35
36 #include <simgear/compiler.h>
37 #include <simgear/structure/exception.hxx>
38 #include <simgear/debug/logstream.hxx>
39
40 #include STL_IOSTREAM
41 SG_USING_STD(cerr);
42 SG_USING_STD(endl);
43
44 #include "main.hxx"
45 #include "globals.hxx"
46
47
48 #ifdef HAVE_WINDOWS_H
49 #  include <windows.h>
50 #  include <float.h>
51 #endif
52
53 #include "fg_os.hxx"
54
55 #ifdef macintosh
56 #  include <console.h>          // -dw- for command line dialog
57 #endif
58
59 // foreward declaration.
60 void fgExitCleanup();
61
62 #if defined(__linux__) && defined(__i386__)
63
64 static void handleFPE (int);
65
66 static void
67 initFPE ()
68 {
69     fpu_control_t fpe_flags = 0;
70     _FPU_GETCW(fpe_flags);
71 //     fpe_flags &= ~_FPU_MASK_IM;      // invalid operation
72 //     fpe_flags &= ~_FPU_MASK_DM;      // denormalized operand
73 //     fpe_flags &= ~_FPU_MASK_ZM;      // zero-divide
74 //     fpe_flags &= ~_FPU_MASK_OM;      // overflow
75 //     fpe_flags &= ~_FPU_MASK_UM;      // underflow
76 //     fpe_flags &= ~_FPU_MASK_PM;      // precision (inexact result)
77     _FPU_SETCW(fpe_flags);
78     signal(SIGFPE, handleFPE);
79 }
80
81 static void
82 handleFPE (int num)
83 {
84   initFPE();
85   SG_LOG(SG_GENERAL, SG_ALERT, "Floating point interrupt (SIGFPE)");
86 }
87 #endif
88
89 #ifdef __APPLE__
90
91 typedef struct
92 {
93   int  lo;
94   int  hi;
95 } PSN;
96
97 extern "C" {
98   short CPSGetCurrentProcess(PSN *psn);
99   short CPSSetProcessName (PSN *psn, char *processname);
100   short CPSEnableForegroundOperation(PSN *psn, int _arg2, int _arg3, int _arg4, int _arg5);
101   short CPSSetFrontProcess(PSN *psn);
102 };
103
104 #define CPSEnableFG(psn) CPSEnableForegroundOperation(psn,0x03,0x3C,0x2C,0x1103)
105
106 #endif
107
108 #ifdef _MSC_VER
109 int main ( int argc, char **argv );
110 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
111                              LPSTR lpCmdLine, int nCmdShow) {
112
113   main( __argc, __argv );
114 }
115 #endif
116
117 #if defined( sgi )
118 #include <sys/fpu.h>
119
120 /*
121     set the special "flush zero" bit (FS, bit 24) in the Control Status
122     Register of the FPU of R4k and beyond so that the result of any
123     underflowing operation will be clamped to zero, and no exception of
124     any kind will be generated on the CPU.  This has no effect on an
125     R3000.
126
127     the FS bit is inherited by processes fork()ed out of this one,
128     but it is not inherited across an exec().  so anytime you exec()
129     a process, you must re-set the FS bit in that process.
130   */
131 void flush_fpe(void)
132 {
133     union fpc_csr f;
134     f.fc_word = get_fpc_csr();
135     f.fc_struct.flush = 1;
136     set_fpc_csr(f.fc_word);
137 }
138 #endif
139
140 int _bootstrap_OSInit;
141
142 // Main entry point; catch any exceptions that have made it this far.
143 int main ( int argc, char **argv ) {
144
145     _bootstrap_OSInit = 0;
146
147     // Enable floating-point exceptions for Linux/x86
148 #if defined(__linux__) && defined(__i386__)
149     initFPE();
150 #endif
151
152 #if defined(sgi)
153     flush_fpe();
154 #endif
155
156     // Enable floating-point exceptions for Windows
157 #if defined( _MSC_VER ) && defined( DEBUG )
158     // Christian, we should document what this does
159     _control87( _EM_INEXACT, _MCW_EM );
160 #endif
161
162 #if defined( HAVE_BC5PLUS )
163     _control87(MCW_EM, MCW_EM);  /* defined in float.h */
164 #endif
165
166     // Keyboard focus hack
167 #if defined(__APPLE__) && !defined(OSX_BUNDLE)
168     {
169       PSN psn;
170
171       fgOSInit (&argc, argv);
172       _bootstrap_OSInit++;
173
174       CPSGetCurrentProcess(&psn);
175       CPSSetProcessName(&psn, "FlightGear");
176       CPSEnableFG(&psn);
177       CPSSetFrontProcess(&psn);
178     }
179 #endif
180
181     // FIXME: add other, more specific
182     // exceptions.
183     try {
184         atexit(fgExitCleanup);
185         fgMainInit(argc, argv);
186     } catch (sg_throwable &t) {
187                             // We must use cerr rather than
188                             // logging, since logging may be
189                             // disabled.
190         cerr << "Fatal error: " << t.getFormattedMessage()
191              << "\n (received from " << t.getOrigin() << ')' << endl;
192     } catch (...) {
193         cerr << "Unknown exception in the main loop. Aborting..." << endl;
194         perror("Possible cause");
195     }
196
197     return 0;
198 }
199
200 // do some clean up on exit.  Specifically we want to call alutExit()
201 // which happens in the sound manager destructor.
202 void fgExitCleanup() {
203
204     if (_bootstrap_OSInit != 0)
205         fgSetMouseCursor(MOUSE_CURSOR_POINTER);
206
207     if (globals)
208         delete globals;
209 }
210