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-2012 Christian Schoenebeck and Grigor Iliev * |
* Copyright (C) 2009-2013 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 * |
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 |
429 |
*/ |
*/ |
430 |
virtual void Suspend(RR* pRegion) { |
virtual void Suspend(RR* pRegion) { |
431 |
dmsg(2,("EngineBase: Suspending Region %x ...\n",pRegion)); |
dmsg(2,("EngineBase: Suspending Region %x ...\n",pRegion)); |
432 |
SuspendedRegionsMutex.Lock(); |
{ |
433 |
SuspensionChangeOngoing.Set(true); |
LockGuard lock(SuspendedRegionsMutex); |
434 |
pPendingRegionSuspension = pRegion; |
SuspensionChangeOngoing.Set(true); |
435 |
SuspensionChangeOngoing.WaitAndUnlockIf(true); |
pPendingRegionSuspension = pRegion; |
436 |
SuspendedRegionsMutex.Unlock(); |
SuspensionChangeOngoing.WaitAndUnlockIf(true); |
437 |
|
} |
438 |
dmsg(2,("EngineBase: Region %x suspended.",pRegion)); |
dmsg(2,("EngineBase: Region %x suspended.",pRegion)); |
439 |
} |
} |
440 |
|
|
446 |
*/ |
*/ |
447 |
virtual void Resume(RR* pRegion) { |
virtual void Resume(RR* pRegion) { |
448 |
dmsg(2,("EngineBase: Resuming Region %x ...\n",pRegion)); |
dmsg(2,("EngineBase: Resuming Region %x ...\n",pRegion)); |
449 |
SuspendedRegionsMutex.Lock(); |
{ |
450 |
SuspensionChangeOngoing.Set(true); |
LockGuard lock(SuspendedRegionsMutex); |
451 |
pPendingRegionResumption = pRegion; |
SuspensionChangeOngoing.Set(true); |
452 |
SuspensionChangeOngoing.WaitAndUnlockIf(true); |
pPendingRegionResumption = pRegion; |
453 |
SuspendedRegionsMutex.Unlock(); |
SuspensionChangeOngoing.WaitAndUnlockIf(true); |
454 |
|
} |
455 |
dmsg(2,("EngineBase: Region %x resumed.\n",pRegion)); |
dmsg(2,("EngineBase: Region %x resumed.\n",pRegion)); |
456 |
} |
} |
457 |
|
|
1327 |
* control and status variables. This method is protected by a mutex. |
* control and status variables. This method is protected by a mutex. |
1328 |
*/ |
*/ |
1329 |
virtual void ResetInternal() { |
virtual void ResetInternal() { |
1330 |
ResetInternalMutex.Lock(); |
LockGuard lock(ResetInternalMutex); |
1331 |
|
|
1332 |
// make sure that the engine does not get any sysex messages |
// make sure that the engine does not get any sysex messages |
1333 |
// while it's reseting |
// while it's reseting |
1356 |
pEventQueue->init(); |
pEventQueue->init(); |
1357 |
pSysexBuffer->init(); |
pSysexBuffer->init(); |
1358 |
if (sysexDisabled) MidiInputPort::AddSysexListener(this); |
if (sysexDisabled) MidiInputPort::AddSysexListener(this); |
|
ResetInternalMutex.Unlock(); |
|
1359 |
} |
} |
1360 |
|
|
1361 |
/** |
/** |