25 |
#include <unistd.h> |
#include <unistd.h> |
26 |
#include <getopt.h> |
#include <getopt.h> |
27 |
#include <signal.h> |
#include <signal.h> |
28 |
|
#include <pthread.h> |
29 |
|
|
30 |
#include "global.h" |
#include "global.h" |
31 |
#include "audioio.h" |
#include "audioio.h" |
51 |
DiskThread* pDiskThread; |
DiskThread* pDiskThread; |
52 |
AudioThread* pAudioThread; |
AudioThread* pAudioThread; |
53 |
MidiIn* pMidiInThread; |
MidiIn* pMidiInThread; |
|
|
|
54 |
RIFF::File* pRIFF; |
RIFF::File* pRIFF; |
55 |
gig::File* pGig; |
gig::File* pGig; |
56 |
gig::Instrument* pInstrument; |
gig::Instrument* pInstrument; |
57 |
|
int num_fragments; |
58 |
|
int fragmentsize; |
59 |
|
pthread_t signalhandlerthread; |
60 |
|
|
61 |
void parse_options(int argc, char **argv); |
void parse_options(int argc, char **argv); |
62 |
void signal_handler(int signal); |
void signal_handler(int signal); |
63 |
|
|
|
int midi_non_blocking; |
|
|
int num_fragments; |
|
|
int fragmentsize; |
|
|
bool instrument_is_DLS; |
|
|
bool instruemtn_is_gig; |
|
|
char midi_device[40]; |
|
|
|
|
64 |
int main(int argc, char **argv) { |
int main(int argc, char **argv) { |
65 |
pAudioIO = NULL; |
pAudioIO = NULL; |
66 |
pRIFF = NULL; |
pRIFF = NULL; |
67 |
pGig = NULL; |
pGig = NULL; |
68 |
|
|
69 |
// setting signal handler for catching SIGINT (thus e.g. <CTRL><C>) |
// setting signal handler for catching SIGINT (thus e.g. <CTRL><C>) |
70 |
|
signalhandlerthread = pthread_self(); |
71 |
signal(SIGINT, signal_handler); |
signal(SIGINT, signal_handler); |
72 |
|
|
73 |
patch_format = patch_format_unknown; |
patch_format = patch_format_unknown; |
|
midi_non_blocking = 1; |
|
74 |
num_fragments = AUDIO_FRAGMENTS; |
num_fragments = AUDIO_FRAGMENTS; |
75 |
fragmentsize = AUDIO_FRAGMENTSIZE; |
fragmentsize = AUDIO_FRAGMENTSIZE; |
|
strcpy(midi_device, "/dev/midi00"); |
|
76 |
|
|
77 |
// parse and assign command line options |
// parse and assign command line options |
78 |
parse_options(argc, argv); |
parse_options(argc, argv); |
79 |
|
|
80 |
if (patch_format != patch_format_gig) { |
if (patch_format != patch_format_gig) { |
81 |
printf("Sorry only Gigasampler loading migrated in LinuxSampler so far, use --gig\n"); |
printf("Sorry only Gigasampler loading migrated in LinuxSampler so far, use --gig to load a .gig file!\n"); |
|
printf("to load a .gig file!\n"); |
|
82 |
return EXIT_FAILURE; |
return EXIT_FAILURE; |
83 |
} |
} |
84 |
|
|
85 |
dmsg(("Initializing audio output...")); |
dmsg(1,("Initializing audio output...")); |
86 |
pAudioIO = new AudioIO(); |
pAudioIO = new AudioIO(); |
87 |
int error = pAudioIO->Initialize(AUDIO_CHANNELS, AUDIO_SAMPLERATE, num_fragments, fragmentsize); |
int error = pAudioIO->Initialize(AUDIO_CHANNELS, AUDIO_SAMPLERATE, num_fragments, fragmentsize); |
88 |
if (error) return EXIT_FAILURE; |
if (error) return EXIT_FAILURE; |
89 |
dmsg(("OK\n")); |
dmsg(1,("OK\n")); |
90 |
|
|
91 |
// Loading gig file |
// Loading gig file |
92 |
try { |
try { |
112 |
AudioThread* pAudioThread = new AudioThread(pAudioIO, pDiskThread, pInstrument); |
AudioThread* pAudioThread = new AudioThread(pAudioIO, pDiskThread, pInstrument); |
113 |
MidiIn* pMidiInThread = new MidiIn(pAudioThread); |
MidiIn* pMidiInThread = new MidiIn(pAudioThread); |
114 |
|
|
115 |
dmsg(("Starting disk thread...")); |
dmsg(1,("Starting disk thread...")); |
116 |
pDiskThread->StartThread(); |
pDiskThread->StartThread(); |
117 |
dmsg(("OK\n")); |
dmsg(1,("OK\n")); |
118 |
dmsg(("Starting MIDI in thread...")); |
dmsg(1,("Starting MIDI in thread...")); |
119 |
pMidiInThread->StartThread(); |
pMidiInThread->StartThread(); |
120 |
dmsg(("OK\n")); |
dmsg(1,("OK\n")); |
121 |
|
|
122 |
sleep(1); |
sleep(1); |
123 |
dmsg(("Starting audio thread...")); |
dmsg(1,("Starting audio thread...")); |
124 |
pAudioThread->StartThread(); |
pAudioThread->StartThread(); |
125 |
dmsg(("OK\n")); |
dmsg(1,("OK\n")); |
126 |
|
|
127 |
printf("LinuxSampler initialization completed.\n"); |
printf("LinuxSampler initialization completed.\n"); |
128 |
|
|
129 |
while(true) sleep(1000); |
while(true) { |
130 |
|
printf("Voices: %3.3d (Max: %3.3d) Streams: %3.3d (Max: %3.3d, Unused: %3.3d)\r", |
131 |
|
pAudioThread->ActiveVoiceCount, pAudioThread->ActiveVoiceCountMax, |
132 |
|
pDiskThread->ActiveStreamCount, pDiskThread->ActiveStreamCountMax, Stream::GetUnusedStreams()); |
133 |
|
fflush(stdout); |
134 |
|
usleep(500000); |
135 |
|
} |
136 |
|
|
137 |
return EXIT_SUCCESS; |
return EXIT_SUCCESS; |
138 |
} |
} |
139 |
|
|
140 |
void signal_handler(int signal) { |
void signal_handler(int signal) { |
141 |
if (signal == SIGINT) { |
if (pthread_equal(pthread_self(), signalhandlerthread) && signal == SIGINT) { |
142 |
// stop all threads |
// stop all threads |
143 |
if (pMidiInThread) pMidiInThread->StopThread(); |
if (pMidiInThread) pMidiInThread->StopThread(); |
144 |
if (pAudioThread) pAudioThread->StopThread(); |
if (pAudioThread) pAudioThread->StopThread(); |
145 |
if (pDiskThread) pDiskThread->StopThread(); |
if (pDiskThread) pDiskThread->StopThread(); |
146 |
|
|
|
sleep(1); |
|
|
|
|
147 |
// free all resources |
// free all resources |
148 |
if (pMidiInThread) delete pMidiInThread; |
if (pMidiInThread) delete pMidiInThread; |
149 |
if (pAudioThread) delete pAudioThread; |
if (pAudioThread) delete pAudioThread; |