/[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 1424 by schoenebeck, Sun Oct 14 22:00:17 2007 UTC revision 2410 by schoenebeck, Sat Feb 2 18:52:15 2013 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 - 2010 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 24  Line 24 
24  #include "AudioOutputDeviceFactory.h"  #include "AudioOutputDeviceFactory.h"
25  #include "AudioOutputDevice.h"  #include "AudioOutputDevice.h"
26  #include "../../common/global_private.h"  #include "../../common/global_private.h"
27    #include "../../common/IDGenerator.h"
28    
29  namespace LinuxSampler {  namespace LinuxSampler {
30    
# Line 110  namespace LinuxSampler { Line 111  namespace LinuxSampler {
111          return std::vector<int>();          return std::vector<int>();
112      }      }
113    
114        int AudioOutputDevice::ParameterSampleRate::ValueAsInt() {
115            return (pDevice) ? (int) ((AudioOutputDevice*)pDevice)->SampleRate()
116                             : DeviceCreationParameterInt::ValueAsInt();
117        }
118    
119      void AudioOutputDevice::ParameterSampleRate::OnSetValue(int i) throw (Exception) {      void AudioOutputDevice::ParameterSampleRate::OnSetValue(int i) throw (Exception) {
120          /* cannot happen, as parameter is fix */          /* cannot happen, as parameter is fix */
121      }      }
# Line 155  namespace LinuxSampler { Line 161  namespace LinuxSampler {
161      }      }
162    
163      optional<int> AudioOutputDevice::ParameterChannels::RangeMaxAsInt(std::map<String,String> Parameters) {      optional<int> AudioOutputDevice::ParameterChannels::RangeMaxAsInt(std::map<String,String> Parameters) {
164          return 100;          return optional<int>::nothing;
165      }      }
166    
167      std::vector<int> AudioOutputDevice::ParameterChannels::PossibilitiesAsInt(std::map<String,String> Parameters) {      std::vector<int> AudioOutputDevice::ParameterChannels::PossibilitiesAsInt(std::map<String,String> Parameters) {
# Line 178  namespace LinuxSampler { Line 184  namespace LinuxSampler {
184      AudioOutputDevice::AudioOutputDevice(std::map<String,DeviceCreationParameter*> DriverParameters)      AudioOutputDevice::AudioOutputDevice(std::map<String,DeviceCreationParameter*> DriverParameters)
185          : EnginesReader(Engines) {          : EnginesReader(Engines) {
186          this->Parameters = DriverParameters;          this->Parameters = DriverParameters;
187            EffectChainIDs = new IDGenerator();
188      }      }
189    
190      AudioOutputDevice::~AudioOutputDevice() {      AudioOutputDevice::~AudioOutputDevice() {
# Line 200  namespace LinuxSampler { Line 207  namespace LinuxSampler {
207              }              }
208              Parameters.clear();              Parameters.clear();
209          }          }
210    
211            // delete all master effect chains
212            {
213                std::vector<EffectChain*>::iterator iter = vEffectChains.begin();
214                while (iter != vEffectChains.end()) {
215                    delete *iter;
216                    iter++;
217                }
218                vEffectChains.clear();
219            }
220            
221            delete EffectChainIDs;
222      }      }
223    
224      void AudioOutputDevice::Connect(Engine* pEngine) {      void AudioOutputDevice::Connect(Engine* pEngine) {
# Line 221  namespace LinuxSampler { Line 240  namespace LinuxSampler {
240              //pEngine->DisconnectAudioOutputDevice();              //pEngine->DisconnectAudioOutputDevice();
241          }          }
242      }      }
243        
244        void AudioOutputDevice::ReconnectAll() {
245            // copy by value, not by reference here !
246            std::set<Engine*> engines = Engines.GetConfigForUpdate();
247            {
248                std::set<Engine*>::iterator iterEngine = engines.begin();
249                std::set<Engine*>::iterator end        = engines.end();
250                for (; iterEngine != end; iterEngine++) {
251                    (*iterEngine)->ReconnectAudioOutputDevice();
252                }
253            }
254        }
255    
256      AudioChannel* AudioOutputDevice::Channel(uint ChannelIndex) {      AudioChannel* AudioOutputDevice::Channel(uint ChannelIndex) {
257          return (ChannelIndex < Channels.size()) ? Channels[ChannelIndex] : NULL;          return (ChannelIndex < Channels.size()) ? Channels[ChannelIndex] : NULL;
# Line 242  namespace LinuxSampler { Line 273  namespace LinuxSampler {
273          return Parameters;          return Parameters;
274      }      }
275    
276        EffectChain* AudioOutputDevice::AddSendEffectChain() {
277            EffectChain* pChain = new EffectChain(this, EffectChainIDs->create());
278            vEffectChains.push_back(pChain);
279            return pChain;
280        }
281    
282        void AudioOutputDevice::RemoveSendEffectChain(uint iChain) throw (Exception) {
283            if (iChain >= vEffectChains.size())
284                throw Exception(
285                    "Could not remove send effect chain " + ToString(iChain) +
286                    ", index out of bounds"
287                );
288            std::vector<EffectChain*>::iterator iter = vEffectChains.begin();
289            for (int i = 0; i < iChain; ++i) ++iter;
290            EffectChainIDs->destroy((*iter)->ID());
291            vEffectChains.erase(iter);
292        }
293    
294        EffectChain* AudioOutputDevice::SendEffectChain(uint iChain) const {
295            if (iChain >= vEffectChains.size()) return NULL;
296            return vEffectChains[iChain];
297        }
298    
299        EffectChain* AudioOutputDevice::SendEffectChainByID(uint iChainID) const {
300            for (int i = 0; i < SendEffectChainCount(); i++) {
301                if (SendEffectChain(i)->ID() == iChainID) return SendEffectChain(i);
302            }
303    
304            return NULL;
305        }
306    
307        uint AudioOutputDevice::SendEffectChainCount() const {
308            return vEffectChains.size();
309        }
310    
311        // TODO: to be removed
312        EffectChain* AudioOutputDevice::AddMasterEffectChain() {
313            return AddSendEffectChain();
314        }
315    
316        // TODO: to be removed
317        void AudioOutputDevice::RemoveMasterEffectChain(uint iChain) throw (Exception) {
318            RemoveSendEffectChain(iChain);
319        }
320    
321        // TODO: to be removed
322        EffectChain* AudioOutputDevice::MasterEffectChain(uint iChain) const {
323            return SendEffectChain(iChain);
324        }
325    
326        // TODO: to be removed
327        uint AudioOutputDevice::MasterEffectChainCount() const {
328            return SendEffectChainCount();
329        }
330        
331        float AudioOutputDevice::latency() {
332            return float(MaxSamplesPerCycle()) / float(SampleRate());
333        }
334    
335      int AudioOutputDevice::RenderAudio(uint Samples) {      int AudioOutputDevice::RenderAudio(uint Samples) {
336          if (Channels.empty()) return 0;          if (Channels.empty()) return 0;
337    
# Line 250  namespace LinuxSampler { Line 340  namespace LinuxSampler {
340              std::vector<AudioChannel*>::iterator iterChannels = Channels.begin();              std::vector<AudioChannel*>::iterator iterChannels = Channels.begin();
341              std::vector<AudioChannel*>::iterator end          = Channels.end();              std::vector<AudioChannel*>::iterator end          = Channels.end();
342              for (; iterChannels != end; iterChannels++)              for (; iterChannels != end; iterChannels++)
343                  (*iterChannels)->Clear(); // zero out audio buffer                  (*iterChannels)->Clear(Samples); // zero out audio buffer
344            }
345            // do the same for master effects
346            {
347                std::vector<EffectChain*>::iterator iterChains = vEffectChains.begin();
348                std::vector<EffectChain*>::iterator end        = vEffectChains.end();
349                for (; iterChains != end; ++iterChains)
350                    (*iterChains)->ClearAllChannels(); // zero out audio buffers
351          }          }
352    
353          int result = 0;          int result = 0;
# Line 274  namespace LinuxSampler { Line 371  namespace LinuxSampler {
371              exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
372          }          }
373          #endif // CONFIG_RT_EXCEPTIONS          #endif // CONFIG_RT_EXCEPTIONS
   
374          EnginesReader.Unlock();          EnginesReader.Unlock();
375    
376            // now that the engines (might) have left fx send signals for master
377            // effects, render all master effects
378            {
379                std::vector<EffectChain*>::iterator iterChains = vEffectChains.begin();
380                std::vector<EffectChain*>::iterator end        = vEffectChains.end();
381                for (; iterChains != end; ++iterChains) {
382                    if (!(*iterChains)->EffectCount()) continue;
383                    (*iterChains)->RenderAudio(Samples);
384                    // mix the result of the last effect in the chain to the audio
385                    // output device channel(s)
386                    Effect* pLastEffect =
387                        (*iterChains)->GetEffect((*iterChains)->EffectCount() - 1);
388                    for (int iChan = 0; iChan < pLastEffect->OutputChannelCount() && iChan < ChannelCount(); ++iChan)
389                        pLastEffect->OutputChannel(iChan)->MixTo(Channel(iChan), Samples);
390                }
391            }
392    
393          return result;          return result;
394      }      }
395    
# Line 287  namespace LinuxSampler { Line 401  namespace LinuxSampler {
401              std::vector<AudioChannel*>::iterator iterChannels = Channels.begin();              std::vector<AudioChannel*>::iterator iterChannels = Channels.begin();
402              std::vector<AudioChannel*>::iterator end          = Channels.end();              std::vector<AudioChannel*>::iterator end          = Channels.end();
403              for (; iterChannels != end; iterChannels++)              for (; iterChannels != end; iterChannels++)
404                  (*iterChannels)->Clear(); // zero out audio buffer                  (*iterChannels)->Clear(Samples); // zero out audio buffer
405          }          }
406    
407          return 0;          return 0;

Legend:
Removed from v.1424  
changed lines
  Added in v.2410

  ViewVC Help
Powered by ViewVC