/[svn]/linuxsampler/trunk/src/linuxsampler.cpp
ViewVC logotype

Annotation of /linuxsampler/trunk/src/linuxsampler.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 325 - (hide annotations) (download)
Tue Dec 21 04:54:37 2004 UTC (19 years, 3 months ago) by senkov
File size: 8159 byte(s)
* Added some profiling capabilities, bugs.

1 schoenebeck 9 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5 schoenebeck 61 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 schoenebeck 9 * *
7     * This program is free software; you can redistribute it and/or modify *
8     * it under the terms of the GNU General Public License as published by *
9     * the Free Software Foundation; either version 2 of the License, or *
10     * (at your option) any later version. *
11     * *
12     * This program is distributed in the hope that it will be useful, *
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15     * GNU 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., 59 Temple Place, Suite 330, Boston, *
20     * MA 02111-1307 USA *
21     ***************************************************************************/
22    
23     #include <getopt.h>
24     #include <signal.h>
25    
26 schoenebeck 53 #include "Sampler.h"
27 schoenebeck 207 #include "drivers/midi/MidiInputDeviceFactory.h"
28 schoenebeck 203 #include "drivers/audio/AudioOutputDeviceFactory.h"
29 senkov 325 #include "engines/gig/Profiler.h"
30 schoenebeck 35 #include "network/lscpserver.h"
31 schoenebeck 271 #include "common/stacktrace.h"
32 schoenebeck 319 #include "common/Features.h"
33 schoenebeck 9
34 schoenebeck 53 using namespace LinuxSampler;
35    
36 schoenebeck 211 Sampler* pSampler = NULL;
37     LSCPServer* pLSCPServer = NULL;
38 schoenebeck 271 pthread_t main_thread;
39 senkov 325 bool profile = false;
40     bool tune = true;
41 schoenebeck 9
42     void parse_options(int argc, char **argv);
43     void signal_handler(int signal);
44 schoenebeck 271 void kill_app();
45 schoenebeck 9
46     int main(int argc, char **argv) {
47    
48 schoenebeck 271 // initialize the stack trace mechanism with our binary file
49     StackTraceInit(argv[0], -1);
50    
51     main_thread = pthread_self();
52    
53 schoenebeck 9 // setting signal handler for catching SIGINT (thus e.g. <CTRL><C>)
54     signal(SIGINT, signal_handler);
55    
56 schoenebeck 271 // register signal handler for all unusual signals
57     // (we will print the stack trace and exit)
58     struct sigaction sact;
59     sigemptyset(&sact.sa_mask);
60     sact.sa_flags = 0;
61     sact.sa_handler = signal_handler;
62     sigaction(SIGSEGV, &sact, NULL);
63     sigaction(SIGBUS, &sact, NULL);
64     sigaction(SIGILL, &sact, NULL);
65     sigaction(SIGFPE, &sact, NULL);
66     sigaction(SIGUSR1, &sact, NULL);
67     sigaction(SIGUSR2, &sact, NULL);
68    
69 schoenebeck 9 // parse and assign command line options
70 senkov 325 parse_options(argc, argv);
71 schoenebeck 9
72 schoenebeck 207 dmsg(1,("LinuxSampler %s\n", VERSION));
73     dmsg(1,("Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck\n"));
74 schoenebeck 123
75 senkov 325 if (tune)
76     {
77     // detect and print system / CPU specific features
78     String sFeatures;
79     Features::detect();
80     #if ARCH_X86
81     if (Features::supportsMMX()) sFeatures += " MMX";
82     if (Features::supportsSSE()) sFeatures += " SSE";
83     #endif // ARCH_X86
84     if (!sFeatures.size()) sFeatures = " None";
85     dmsg(1,("Detected features:%s\n",sFeatures.c_str()));
86     }
87 schoenebeck 319
88 schoenebeck 53 // create LinuxSampler instance
89 schoenebeck 123 dmsg(1,("Creating Sampler..."));
90 schoenebeck 53 pSampler = new Sampler;
91 schoenebeck 123 dmsg(1,("OK\n"));
92 schoenebeck 53
93 schoenebeck 207 dmsg(1,("Registered MIDI input drivers: %s\n", MidiInputDeviceFactory::AvailableDriversAsString().c_str()));
94 schoenebeck 123 dmsg(1,("Registered audio output drivers: %s\n", AudioOutputDeviceFactory::AvailableDriversAsString().c_str()));
95    
96 schoenebeck 53 // start LSCP network server
97 schoenebeck 214 dmsg(1,("Starting LSCP network server (on TCP port %d)...", LSCP_PORT));
98 schoenebeck 53 pLSCPServer = new LSCPServer(pSampler);
99     pLSCPServer->StartThread();
100 schoenebeck 211 pLSCPServer->WaitUntilInitialized();
101 schoenebeck 12 dmsg(1,("OK\n"));
102 schoenebeck 9
103 senkov 325 if (profile)
104     {
105     dmsg(1,("Calibrating profiler..."));
106     gig::Profiler::Calibrate();
107     gig::Profiler::Reset();
108     dmsg(1,("OK\n"));
109     }
110    
111 schoenebeck 9 printf("LinuxSampler initialization completed.\n");
112    
113 senoner 10 while(true) {
114 schoenebeck 53 /*printf("Voices: %3.3d (Max: %3.3d) Streams: %3.3d (Max: %3.3d, Unused: %3.3d)\r",
115 schoenebeck 35 pEngine->ActiveVoiceCount, pEngine->ActiveVoiceCountMax,
116     pEngine->pDiskThread->ActiveStreamCount, pEngine->pDiskThread->ActiveStreamCountMax, Stream::GetUnusedStreams());
117 schoenebeck 53 fflush(stdout);*/
118 senkov 325 sleep(1);
119     if (profile)
120     {
121     unsigned int samplingFreq = 48000; //FIXME: hardcoded for now
122     unsigned int bv = gig::Profiler::GetBogoVoices(samplingFreq);
123     if (bv != 0)
124     {
125     printf(" BogoVoices: %i \r", bv);
126     fflush(stdout);
127     }
128     }
129 senoner 10 }
130    
131 schoenebeck 9 return EXIT_SUCCESS;
132     }
133    
134 schoenebeck 271 void signal_handler(int iSignal) {
135     switch (iSignal) {
136     case SIGINT: {
137     if (pthread_equal(pthread_self(), main_thread)) {
138     if (pLSCPServer) {
139     pLSCPServer->StopThread();
140     delete pLSCPServer;
141     }
142     if (pSampler) delete pSampler;
143     printf("LinuxSampler stopped due to SIGINT.\n");
144     exit(EXIT_SUCCESS);
145     }
146     return;
147 schoenebeck 53 }
148 schoenebeck 271 case SIGSEGV:
149     std::cerr << ">>> FATAL ERROR: Segmentation fault (SIGSEGV) occured! <<<\n" << std::flush;
150     break;
151     case SIGBUS:
152     std::cerr << ">>> FATAL ERROR: Access to undefined portion of a memory object (SIGBUS) occured! <<<\n" << std::flush;
153     break;
154     case SIGILL:
155     std::cerr << ">>> FATAL ERROR: Illegal instruction (SIGILL) occured! <<<\n" << std::flush;
156     break;
157     case SIGFPE:
158     std::cerr << ">>> FATAL ERROR: Erroneous arithmetic operation (SIGFPE) occured! <<<\n" << std::flush;
159     break;
160     case SIGUSR1:
161     std::cerr << ">>> User defined signal 1 (SIGUSR1) received <<<\n" << std::flush;
162     break;
163     case SIGUSR2:
164     std::cerr << ">>> User defined signal 2 (SIGUSR2) received <<<\n" << std::flush;
165     break;
166     default: { // this should never happen, as we register for the signals we want
167     std::cerr << ">>> FATAL ERROR: Unknown signal received! <<<\n" << std::flush;
168     break;
169     }
170 schoenebeck 9 }
171 schoenebeck 271 signal(iSignal, SIG_DFL); // Reinstall default handler to prevent race conditions
172     std::cerr << "Showing stack trace...\n" << std::flush;
173     StackTrace();
174     sleep(2);
175     std::cerr << "Killing LinuxSampler...\n" << std::flush;
176     kill_app(); // Use abort() if we want to generate a core dump.
177 schoenebeck 9 }
178    
179 schoenebeck 271 void kill_app() {
180     kill(main_thread, SIGKILL);
181     }
182    
183 senkov 325 void parse_options(int argc, char **argv) {
184 schoenebeck 9 int res;
185     int option_index = 0;
186     static struct option long_options[] =
187     {
188     {"help",0,0,0},
189 senkov 325 {"version",0,0,0},
190     {"profile",0,0,0},
191     {"no-tune",0,0,0},
192 schoenebeck 9 {0,0,0,0}
193     };
194    
195     while (true) {
196     res = getopt_long_only(argc, argv, "", long_options, &option_index);
197     if(res == -1) break;
198     if (res == 0) {
199     switch(option_index) {
200 senkov 325 case 0: // --help
201     printf("usage: linuxsampler [OPTIONS]\n\n");
202     printf("--help prints this message\n");
203     printf("--version prints version information\n");
204     printf("--profile profile synthesis algorithms\n");
205     printf("--no-tune disable assembly optimization\n");
206     exit(EXIT_SUCCESS);
207 schoenebeck 9 break;
208 senkov 325 case 1: // --version
209     printf("LinuxSampler %s\n", VERSION);
210 schoenebeck 9 break;
211 senkov 325 case 2: // --profile
212     profile = true;
213 schoenebeck 20 break;
214 senkov 325 case 3: // --no-tune
215     tune = false;
216 schoenebeck 9 break;
217     }
218     }
219     }
220 senkov 325 }

  ViewVC Help
Powered by ViewVC