4 |
* * |
* * |
5 |
* Copyright (C) 2003,2004 by Benno Senoner and Christian Schoenebeck * |
* Copyright (C) 2003,2004 by Benno Senoner and Christian Schoenebeck * |
6 |
* Copyright (C) 2005-2008 Christian Schoenebeck * |
* Copyright (C) 2005-2008 Christian Schoenebeck * |
7 |
* Copyright (C) 2009-2010 Christian Schoenebeck and Grigor Iliev * |
* Copyright (C) 2009-2012 Christian Schoenebeck and Grigor Iliev * |
8 |
* * |
* * |
9 |
* This program is free software; you can redistribute it and/or modify * |
* This program is free software; you can redistribute it and/or modify * |
10 |
* it under the terms of the GNU General Public License as published by * |
* it under the terms of the GNU General Public License as published by * |
190 |
// been deleted by the disk thread |
// been deleted by the disk thread |
191 |
if (iPendingStreamDeletions) ProcessPendingStreamDeletions(); |
if (iPendingStreamDeletions) ProcessPendingStreamDeletions(); |
192 |
|
|
193 |
|
// Release the instrument change command. (This has to |
194 |
|
// be done after all voices have been rendered and not |
195 |
|
// in HandleInstrumentChanges, as the RegionsInUse |
196 |
|
// list has been built up by the voice renderers.) |
197 |
|
for (int i = 0; i < engineChannels.size(); i++) { |
198 |
|
EngineChannelBase<V, R, I>* channel = |
199 |
|
static_cast<EngineChannelBase<V, R, I>*>(engineChannels[i]); |
200 |
|
channel->InstrumentChangeCommandReader.Unlock(); |
201 |
|
} |
202 |
FrameTime += Samples; |
FrameTime += Samples; |
203 |
|
|
204 |
EngineDisabled.RttDone(); |
EngineDisabled.RttDone(); |
243 |
} |
} |
244 |
pVoicePool->clear(); |
pVoicePool->clear(); |
245 |
|
|
246 |
|
PostSetMaxVoices(iVoices); |
247 |
ResumeAll(); |
ResumeAll(); |
248 |
} |
} |
249 |
|
|
250 |
|
/** Called after the new max number of voices is set and before resuming the engine. */ |
251 |
|
virtual void PostSetMaxVoices(int iVoices) { } |
252 |
|
|
253 |
virtual uint DiskStreamCount() { return (pDiskThread) ? pDiskThread->GetActiveStreamCount() : 0; } |
virtual uint DiskStreamCount() { return (pDiskThread) ? pDiskThread->GetActiveStreamCount() : 0; } |
254 |
virtual uint DiskStreamCountMax() { return (pDiskThread) ? pDiskThread->ActiveStreamCountMax : 0; } |
virtual uint DiskStreamCountMax() { return (pDiskThread) ? pDiskThread->ActiveStreamCountMax : 0; } |
312 |
// lower minimum release time |
// lower minimum release time |
313 |
const float minReleaseTime = (float) MaxSamplesPerCycle / (float) SampleRate; |
const float minReleaseTime = (float) MaxSamplesPerCycle / (float) SampleRate; |
314 |
for (VoiceIterator iterVoice = pVoicePool->allocAppend(); iterVoice == pVoicePool->last(); iterVoice = pVoicePool->allocAppend()) { |
for (VoiceIterator iterVoice = pVoicePool->allocAppend(); iterVoice == pVoicePool->last(); iterVoice = pVoicePool->allocAppend()) { |
315 |
iterVoice->pEG1->CalculateFadeOutCoeff(minReleaseTime, SampleRate); |
iterVoice->CalculateFadeOutCoeff(minReleaseTime, SampleRate); |
316 |
} |
} |
317 |
pVoicePool->clear(); |
pVoicePool->clear(); |
318 |
} |
} |
345 |
pDiskThread->StartThread(); |
pDiskThread->StartThread(); |
346 |
dmsg(1,("OK\n")); |
dmsg(1,("OK\n")); |
347 |
|
|
348 |
|
bool printEqInfo = true; |
349 |
for (VoiceIterator iterVoice = pVoicePool->allocAppend(); iterVoice == pVoicePool->last(); iterVoice = pVoicePool->allocAppend()) { |
for (VoiceIterator iterVoice = pVoicePool->allocAppend(); iterVoice == pVoicePool->last(); iterVoice = pVoicePool->allocAppend()) { |
350 |
if (!iterVoice->pDiskThread) { |
if (!iterVoice->pDiskThread) { |
351 |
dmsg(0,("Engine -> voice::trigger: !pDiskThread\n")); |
dmsg(0,("Engine -> voice::trigger: !pDiskThread\n")); |
352 |
exit(EXIT_FAILURE); |
exit(EXIT_FAILURE); |
353 |
} |
} |
354 |
|
|
355 |
|
iterVoice->CreateEq(); |
356 |
|
|
357 |
|
if(printEqInfo) { |
358 |
|
iterVoice->PrintEqInfo(); |
359 |
|
printEqInfo = false; |
360 |
|
} |
361 |
} |
} |
362 |
pVoicePool->clear(); |
pVoicePool->clear(); |
363 |
|
|
368 |
pDedicatedVoiceChannelLeft = new AudioChannel(0, MaxSamplesPerCycle); |
pDedicatedVoiceChannelLeft = new AudioChannel(0, MaxSamplesPerCycle); |
369 |
pDedicatedVoiceChannelRight = new AudioChannel(1, MaxSamplesPerCycle); |
pDedicatedVoiceChannelRight = new AudioChannel(1, MaxSamplesPerCycle); |
370 |
} |
} |
371 |
|
|
372 |
|
// Implementattion for abstract method derived from Engine. |
373 |
|
virtual void ReconnectAudioOutputDevice() { |
374 |
|
SuspendAll(); |
375 |
|
if (pAudioOutputDevice) Connect(pAudioOutputDevice); |
376 |
|
ResumeAll(); |
377 |
|
} |
378 |
|
|
379 |
/** |
/** |
380 |
* Similar to @c Disable() but this method additionally kills all voices |
* Similar to @c Disable() but this method additionally kills all voices |
800 |
//TODO: this is a lazy solution ATM and not safe in case somebody is currently editing the instrument we're currently switching to (we should store all suspended regions on instrument manager side and when switching to another instrument copy that list to the engine's local list of suspensions |
//TODO: this is a lazy solution ATM and not safe in case somebody is currently editing the instrument we're currently switching to (we should store all suspended regions on instrument manager side and when switching to another instrument copy that list to the engine's local list of suspensions |
801 |
ResetSuspendedRegions(); |
ResetSuspendedRegions(); |
802 |
} |
} |
|
|
|
|
for (int i = 0; i < engineChannels.size(); i++) { |
|
|
EngineChannelBase<V, R, I>* channel = |
|
|
static_cast<EngineChannelBase<V, R, I>*>(engineChannels[i]); |
|
|
channel->InstrumentChangeCommandReader.Unlock(); |
|
|
} |
|
803 |
} |
} |
804 |
|
|
805 |
/** |
/** |
975 |
} |
} |
976 |
case 10: { // panpot |
case 10: { // panpot |
977 |
//TODO: not sample accurate yet |
//TODO: not sample accurate yet |
|
pChannel->GlobalPanLeft = PanCurve[128 - itControlChangeEvent->Param.CC.Value]; |
|
|
pChannel->GlobalPanRight = PanCurve[itControlChangeEvent->Param.CC.Value]; |
|
978 |
pChannel->iLastPanRequest = itControlChangeEvent->Param.CC.Value; |
pChannel->iLastPanRequest = itControlChangeEvent->Param.CC.Value; |
979 |
break; |
break; |
980 |
} |
} |