26 |
#include "EGADSR.h" |
#include "EGADSR.h" |
27 |
|
|
28 |
#include "Engine.h" |
#include "Engine.h" |
29 |
|
#include <malloc.h> |
30 |
|
|
31 |
namespace LinuxSampler { namespace gig { |
namespace LinuxSampler { namespace gig { |
32 |
|
|
100 |
if (pEventGenerator) delete pEventGenerator; |
if (pEventGenerator) delete pEventGenerator; |
101 |
if (pMainFilterParameters) delete[] pMainFilterParameters; |
if (pMainFilterParameters) delete[] pMainFilterParameters; |
102 |
if (pBasicFilterParameters) delete[] pBasicFilterParameters; |
if (pBasicFilterParameters) delete[] pBasicFilterParameters; |
103 |
if (pSynthesisParameters[0]) delete[] pSynthesisParameters[0]; |
if (pSynthesisParameters[0]) free(pSynthesisParameters[0]); |
104 |
if (pVoiceStealingQueue) delete pVoiceStealingQueue; |
if (pVoiceStealingQueue) delete pVoiceStealingQueue; |
105 |
} |
} |
106 |
|
|
342 |
pEventGenerator = new EventGenerator(pAudioOut->SampleRate()); |
pEventGenerator = new EventGenerator(pAudioOut->SampleRate()); |
343 |
|
|
344 |
// (re)allocate synthesis parameter matrix |
// (re)allocate synthesis parameter matrix |
345 |
if (pSynthesisParameters[0]) delete[] pSynthesisParameters[0]; |
if (pSynthesisParameters[0]) free(pSynthesisParameters[0]); |
346 |
pSynthesisParameters[0] = new float[Event::destination_count * pAudioOut->MaxSamplesPerCycle()]; |
pSynthesisParameters[0] = (float *) memalign(16,(Event::destination_count * sizeof(float) * pAudioOut->MaxSamplesPerCycle())); |
347 |
for (int dst = 1; dst < Event::destination_count; dst++) |
for (int dst = 1; dst < Event::destination_count; dst++) |
348 |
pSynthesisParameters[dst] = pSynthesisParameters[dst - 1] + pAudioOut->MaxSamplesPerCycle(); |
pSynthesisParameters[dst] = pSynthesisParameters[dst - 1] + pAudioOut->MaxSamplesPerCycle(); |
349 |
|
|
399 |
} |
} |
400 |
|
|
401 |
|
|
402 |
|
// update time of start and end of this audio fragment (as events' time stamps relate to this) |
403 |
|
pEventGenerator->UpdateFragmentTime(Samples); |
404 |
|
|
405 |
|
|
406 |
// empty the event lists for the new fragment |
// empty the event lists for the new fragment |
407 |
pEvents->clear(); |
pEvents->clear(); |
408 |
pCCEvents->clear(); |
pCCEvents->clear(); |
417 |
} |
} |
418 |
} |
} |
419 |
|
|
|
// read and copy events from input queue |
|
|
Event event = pEventGenerator->CreateEvent(); |
|
|
while (true) { |
|
|
if (!pEventQueue->pop(&event) || pEvents->poolIsEmpty()) break; |
|
|
*pEvents->allocAppend() = event; |
|
|
} |
|
|
|
|
420 |
|
|
421 |
// update time of start and end of this audio fragment (as events' time stamps relate to this) |
// get all events from the input event queue which belong to the current fragment |
422 |
pEventGenerator->UpdateFragmentTime(Samples); |
{ |
423 |
|
RingBuffer<Event>::NonVolatileReader eventQueueReader = pEventQueue->get_non_volatile_reader(); |
424 |
|
Event* pEvent; |
425 |
|
while (true) { |
426 |
|
// get next event from input event queue |
427 |
|
if (!(pEvent = eventQueueReader.pop())) break; |
428 |
|
// if younger event reached, ignore that and all subsequent ones for now |
429 |
|
if (pEvent->FragmentPos() >= Samples) { |
430 |
|
eventQueueReader--; |
431 |
|
dmsg(2,("Younger Event, pos=%d ,Samples=%d!\n",pEvent->FragmentPos(),Samples)); |
432 |
|
pEvent->ResetFragmentPos(); |
433 |
|
break; |
434 |
|
} |
435 |
|
// copy event to internal event list |
436 |
|
if (pEvents->poolIsEmpty()) { |
437 |
|
dmsg(1,("Event pool emtpy!\n")); |
438 |
|
break; |
439 |
|
} |
440 |
|
*pEvents->allocAppend() = *pEvent; |
441 |
|
} |
442 |
|
eventQueueReader.free(); // free all copied events from input queue |
443 |
|
} |
444 |
|
|
445 |
|
|
446 |
// process events |
// process events |
1165 |
} |
} |
1166 |
|
|
1167 |
String Engine::Version() { |
String Engine::Version() { |
1168 |
String s = "$Revision: 1.17 $"; |
String s = "$Revision: 1.19 $"; |
1169 |
return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword |
return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword |
1170 |
} |
} |
1171 |
|
|