/[svn]/linuxsampler/trunk/src/drivers/audio/AudioOutputDevice.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/drivers/audio/AudioOutputDevice.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1721 by schoenebeck, Mon Dec 31 19:03:31 2007 UTC revision 1722 by schoenebeck, Thu Apr 10 17:41:32 2008 UTC
# Line 3  Line 3 
3   *   LinuxSampler - modular, streaming capable sampler                     *   *   LinuxSampler - modular, streaming capable sampler                     *
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 - 2007 Christian Schoenebeck                       *   *   Copyright (C) 2005 - 2008 Christian Schoenebeck                       *
7   *                                                                         *   *                                                                         *
8   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
9   *   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  *
# Line 205  namespace LinuxSampler { Line 205  namespace LinuxSampler {
205              }              }
206              Parameters.clear();              Parameters.clear();
207          }          }
208    
209            // delete all master effect chains
210            {
211                std::vector<EffectChain*>::iterator iter = vEffectChains.begin();
212                while (iter != vEffectChains.end()) {
213                    delete *iter;
214                    iter++;
215                }
216                vEffectChains.clear();
217            }
218      }      }
219    
220      void AudioOutputDevice::Connect(Engine* pEngine) {      void AudioOutputDevice::Connect(Engine* pEngine) {
# Line 247  namespace LinuxSampler { Line 257  namespace LinuxSampler {
257          return Parameters;          return Parameters;
258      }      }
259    
260        EffectChain* AudioOutputDevice::AddMasterEffectChain() {
261            EffectChain* pChain = new EffectChain(this);
262            vEffectChains.push_back(pChain);
263            return pChain;
264        }
265    
266        void AudioOutputDevice::RemoveMasterEffectChain(uint iChain) throw (Exception) {
267            if (iChain >= vEffectChains.size())
268                throw Exception(
269                    "Could not remove master effect chain " + ToString(iChain) +
270                    ", index out of bounds"
271                );
272            std::vector<EffectChain*>::iterator iter = vEffectChains.begin();
273            for (int i = 0; i < iChain; ++i) ++iter;
274            vEffectChains.erase(iter);
275        }
276    
277        EffectChain* AudioOutputDevice::MasterEffectChain(uint iChain) const {
278            if (iChain >= vEffectChains.size()) return NULL;
279            return vEffectChains[iChain];
280        }
281    
282        uint AudioOutputDevice::MasterEffectChainCount() const {
283            return vEffectChains.size();
284        }
285    
286      int AudioOutputDevice::RenderAudio(uint Samples) {      int AudioOutputDevice::RenderAudio(uint Samples) {
287          if (Channels.empty()) return 0;          if (Channels.empty()) return 0;
288    
# Line 257  namespace LinuxSampler { Line 293  namespace LinuxSampler {
293              for (; iterChannels != end; iterChannels++)              for (; iterChannels != end; iterChannels++)
294                  (*iterChannels)->Clear(); // zero out audio buffer                  (*iterChannels)->Clear(); // zero out audio buffer
295          }          }
296            // do the same for master effects
297            {
298                std::vector<EffectChain*>::iterator iterChains = vEffectChains.begin();
299                std::vector<EffectChain*>::iterator end        = vEffectChains.end();
300                for (; iterChains != end; ++iterChains)
301                    (*iterChains)->ClearAllChannels(); // zero out audio buffers
302            }
303    
304          int result = 0;          int result = 0;
305    
# Line 279  namespace LinuxSampler { Line 322  namespace LinuxSampler {
322              exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
323          }          }
324          #endif // CONFIG_RT_EXCEPTIONS          #endif // CONFIG_RT_EXCEPTIONS
   
325          EnginesReader.Unlock();          EnginesReader.Unlock();
326    
327            // now that the engines (might) have left fx send signals for master
328            // effects, render all master effects
329            {
330                std::vector<EffectChain*>::iterator iterChains = vEffectChains.begin();
331                std::vector<EffectChain*>::iterator end        = vEffectChains.end();
332                for (; iterChains != end; ++iterChains) {
333                    if (!(*iterChains)->EffectCount()) continue;
334                    (*iterChains)->RenderAudio(Samples);
335                    // mix the result of the last effect in the chain to the audio
336                    // output device channel(s)
337                    Effect* pLastEffect =
338                        (*iterChains)->GetEffect((*iterChains)->EffectCount() - 1);
339                    for (int iChan = 0; iChan < pLastEffect->OutputChannelCount() && iChan < ChannelCount(); ++iChan)
340                        pLastEffect->OutputChannel(iChan)->MixTo(Channel(iChan), Samples);
341                }
342            }
343    
344          return result;          return result;
345      }      }
346    

Legend:
Removed from v.1721  
changed lines
  Added in v.1722

  ViewVC Help
Powered by ViewVC