857 |
* this audio fragment cycle |
* this audio fragment cycle |
858 |
*/ |
*/ |
859 |
void Engine::RouteAudio(EngineChannel* pEngineChannel, uint Samples) { |
void Engine::RouteAudio(EngineChannel* pEngineChannel, uint Samples) { |
860 |
// route master signal |
// route dry signal |
861 |
{ |
{ |
862 |
AudioChannel* pDstL = pAudioOutputDevice->Channel(pEngineChannel->AudioDeviceChannelLeft); |
AudioChannel* pDstL = pAudioOutputDevice->Channel(pEngineChannel->AudioDeviceChannelLeft); |
863 |
AudioChannel* pDstR = pAudioOutputDevice->Channel(pEngineChannel->AudioDeviceChannelRight); |
AudioChannel* pDstR = pAudioOutputDevice->Channel(pEngineChannel->AudioDeviceChannelRight); |
868 |
{ |
{ |
869 |
for (int iFxSend = 0; iFxSend < pEngineChannel->GetFxSendCount(); iFxSend++) { |
for (int iFxSend = 0; iFxSend < pEngineChannel->GetFxSendCount(); iFxSend++) { |
870 |
FxSend* pFxSend = pEngineChannel->GetFxSend(iFxSend); |
FxSend* pFxSend = pEngineChannel->GetFxSend(iFxSend); |
871 |
// left channel |
for (int iChan = 0; iChan < 2; ++iChan) { |
872 |
const int iDstL = pFxSend->DestinationChannel(0); |
AudioChannel* pSource = |
873 |
if (iDstL < 0) { |
(iChan) |
874 |
dmsg(1,("Engine::RouteAudio() Error: invalid FX send (L) destination channel")); |
? pEngineChannel->pChannelRight |
875 |
} else { |
: pEngineChannel->pChannelLeft; |
876 |
AudioChannel* pDstL = pAudioOutputDevice->Channel(iDstL); |
const int iDstChan = pFxSend->DestinationChannel(iChan); |
877 |
if (!pDstL) { |
if (iDstChan < 0) { |
878 |
dmsg(1,("Engine::RouteAudio() Error: invalid FX send (L) destination channel")); |
dmsg(1,("Engine::RouteAudio() Error: invalid FX send (%s) destination channel (%d->%d)", ((iChan) ? "R" : "L"), iChan, iDstChan)); |
879 |
} else pEngineChannel->pChannelLeft->MixTo(pDstL, Samples, pFxSend->Level()); |
goto channel_cleanup; |
880 |
} |
} |
881 |
// right channel |
AudioChannel* pDstChan = NULL; |
882 |
const int iDstR = pFxSend->DestinationChannel(1); |
if (pFxSend->DestinationMasterEffectChain() >= 0) { // fx send routed to an internal master effect |
883 |
if (iDstR < 0) { |
EffectChain* pEffectChain = |
884 |
dmsg(1,("Engine::RouteAudio() Error: invalid FX send (R) destination channel")); |
pAudioOutputDevice->MasterEffectChain( |
885 |
} else { |
pFxSend->DestinationMasterEffectChain() |
886 |
AudioChannel* pDstR = pAudioOutputDevice->Channel(iDstR); |
); |
887 |
if (!pDstR) { |
if (!pEffectChain) { |
888 |
dmsg(1,("Engine::RouteAudio() Error: invalid FX send (R) destination channel")); |
dmsg(1,("Engine::RouteAudio() Error: invalid FX send (%s) destination effect chain %d", ((iChan) ? "R" : "L"), pFxSend->DestinationMasterEffectChain())); |
889 |
} else pEngineChannel->pChannelRight->MixTo(pDstR, Samples, pFxSend->Level()); |
goto channel_cleanup; |
890 |
|
} |
891 |
|
Effect* pEffect = |
892 |
|
pEffectChain->GetEffect( |
893 |
|
pFxSend->DestinationMasterEffect() |
894 |
|
); |
895 |
|
if (!pEffect) { |
896 |
|
dmsg(1,("Engine::RouteAudio() Error: invalid FX send (%s) destination effect %d of effect chain %d", ((iChan) ? "R" : "L"), pFxSend->DestinationMasterEffect(), pFxSend->DestinationMasterEffectChain())); |
897 |
|
goto channel_cleanup; |
898 |
|
} |
899 |
|
pDstChan = pEffect->InputChannel(iDstChan); |
900 |
|
} else { // FX send routed directly to an audio output channel |
901 |
|
pDstChan = pAudioOutputDevice->Channel(iDstChan); |
902 |
|
} |
903 |
|
if (!pDstChan) { |
904 |
|
dmsg(1,("Engine::RouteAudio() Error: invalid FX send (%s) destination channel (%d->%d)", ((iChan) ? "R" : "L"), iChan, iDstChan)); |
905 |
|
goto channel_cleanup; |
906 |
|
} |
907 |
|
pSource->MixTo(pDstChan, Samples, pFxSend->Level()); |
908 |
} |
} |
909 |
} |
} |
910 |
} |
} |
911 |
|
channel_cleanup: |
912 |
// reset buffers with silence (zero out) for the next audio cycle |
// reset buffers with silence (zero out) for the next audio cycle |
913 |
pEngineChannel->pChannelLeft->Clear(); |
pEngineChannel->pChannelLeft->Clear(); |
914 |
pEngineChannel->pChannelRight->Clear(); |
pEngineChannel->pChannelRight->Clear(); |
2068 |
} |
} |
2069 |
|
|
2070 |
String Engine::Version() { |
String Engine::Version() { |
2071 |
String s = "$Revision: 1.89 $"; |
String s = "$Revision: 1.90 $"; |
2072 |
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 |
2073 |
} |
} |
2074 |
|
|