/[svn]/linuxsampler/trunk/src/engines/gig/EngineChannel.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/gig/EngineChannel.cpp

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

revision 970 by schoenebeck, Wed Dec 6 22:28:17 2006 UTC revision 1001 by schoenebeck, Wed Dec 27 16:17:08 2006 UTC
# Line 43  namespace LinuxSampler { namespace gig { Line 43  namespace LinuxSampler { namespace gig {
43          }          }
44          InstrumentIdx  = -1;          InstrumentIdx  = -1;
45          InstrumentStat = -1;          InstrumentStat = -1;
46            pChannelLeft  = NULL;
47            pChannelRight = NULL;
48          AudioDeviceChannelLeft  = -1;          AudioDeviceChannelLeft  = -1;
49          AudioDeviceChannelRight = -1;          AudioDeviceChannelRight = -1;
50          pMidiInputPort = NULL;          pMidiInputPort = NULL;
# Line 59  namespace LinuxSampler { namespace gig { Line 61  namespace LinuxSampler { namespace gig {
61          if (pEventQueue) delete pEventQueue;          if (pEventQueue) delete pEventQueue;
62          if (pActiveKeys) delete pActiveKeys;          if (pActiveKeys) delete pActiveKeys;
63          if (pMIDIKeyInfo) delete[] pMIDIKeyInfo;          if (pMIDIKeyInfo) delete[] pMIDIKeyInfo;
64            RemoveAllFxSends();
65      }      }
66    
67      /**      /**
# Line 269  namespace LinuxSampler { namespace gig { Line 272  namespace LinuxSampler { namespace gig {
272          }          }
273          AudioDeviceChannelLeft  = 0;          AudioDeviceChannelLeft  = 0;
274          AudioDeviceChannelRight = 1;          AudioDeviceChannelRight = 1;
275          pOutputLeft             = pAudioOut->Channel(0)->Buffer();          if (fxSends.empty()) { // render directly into the AudioDevice's output buffers
276          pOutputRight            = pAudioOut->Channel(1)->Buffer();              pChannelLeft  = pAudioOut->Channel(AudioDeviceChannelLeft);
277                pChannelRight = pAudioOut->Channel(AudioDeviceChannelRight);
278            } else { // use local buffers for rendering and copy later
279                // ensure the local buffers have the correct size
280                if (pChannelLeft)  delete pChannelLeft;
281                if (pChannelRight) delete pChannelRight;
282                pChannelLeft  = new AudioChannel(0, pAudioOut->MaxSamplesPerCycle());
283                pChannelRight = new AudioChannel(1, pAudioOut->MaxSamplesPerCycle());
284            }
285          MidiInputPort::AddSysexListener(pEngine);          MidiInputPort::AddSysexListener(pEngine);
286      }      }
287    
# Line 297  namespace LinuxSampler { namespace gig { Line 308  namespace LinuxSampler { namespace gig {
308              Engine::FreeEngine(this, oldAudioDevice);              Engine::FreeEngine(this, oldAudioDevice);
309              AudioDeviceChannelLeft  = -1;              AudioDeviceChannelLeft  = -1;
310              AudioDeviceChannelRight = -1;              AudioDeviceChannelRight = -1;
311                if (!fxSends.empty()) { // free the local rendering buffers
312                    if (pChannelLeft)  delete pChannelLeft;
313                    if (pChannelRight) delete pChannelRight;
314                }
315                pChannelLeft  = NULL;
316                pChannelRight = NULL;
317          }          }
318      }      }
319    
320        AudioOutputDevice* EngineChannel::GetAudioOutputDevice() {
321            return (pEngine) ? pEngine->pAudioOutputDevice : NULL;
322        }
323    
324      void EngineChannel::SetOutputChannel(uint EngineAudioChannel, uint AudioDeviceChannel) {      void EngineChannel::SetOutputChannel(uint EngineAudioChannel, uint AudioDeviceChannel) {
325          if (!pEngine || !pEngine->pAudioOutputDevice) throw AudioOutputException("No audio output device connected yet.");          if (!pEngine || !pEngine->pAudioOutputDevice) throw AudioOutputException("No audio output device connected yet.");
326    
# Line 307  namespace LinuxSampler { namespace gig { Line 328  namespace LinuxSampler { namespace gig {
328          if (!pChannel) throw AudioOutputException("Invalid audio output device channel " + ToString(AudioDeviceChannel));          if (!pChannel) throw AudioOutputException("Invalid audio output device channel " + ToString(AudioDeviceChannel));
329          switch (EngineAudioChannel) {          switch (EngineAudioChannel) {
330              case 0: // left output channel              case 0: // left output channel
331                  pOutputLeft = pChannel->Buffer();                  if (fxSends.empty()) pChannelLeft = pChannel;
332                  AudioDeviceChannelLeft = AudioDeviceChannel;                  AudioDeviceChannelLeft = AudioDeviceChannel;
333                  break;                  break;
334              case 1: // right output channel              case 1: // right output channel
335                  pOutputRight = pChannel->Buffer();                  if (fxSends.empty()) pChannelRight = pChannel;
336                  AudioDeviceChannelRight = AudioDeviceChannel;                  AudioDeviceChannelRight = AudioDeviceChannel;
337                  break;                  break;
338              default:              default:
# Line 352  namespace LinuxSampler { namespace gig { Line 373  namespace LinuxSampler { namespace gig {
373          return midiChannel;          return midiChannel;
374      }      }
375    
376        FxSend* EngineChannel::AddFxSend(uint8_t MidiCtrl, String Name) throw (Exception) {
377            if (pEngine) pEngine->DisableAndLock();
378            FxSend* pFxSend = new FxSend(this, MidiCtrl, Name);
379            if (fxSends.empty()) {
380                if (pEngine && pEngine->pAudioOutputDevice) {
381                    AudioOutputDevice* pDevice = pEngine->pAudioOutputDevice;
382                    // create local render buffers
383                    pChannelLeft  = new AudioChannel(0, pDevice->MaxSamplesPerCycle());
384                    pChannelRight = new AudioChannel(1, pDevice->MaxSamplesPerCycle());
385                } else {
386                    // postpone local render buffer creation until audio device is assigned
387                    pChannelLeft  = NULL;
388                    pChannelRight = NULL;
389                }
390            }
391            fxSends.push_back(pFxSend);
392            if (pEngine) pEngine->Enable();
393            return pFxSend;
394        }
395    
396        FxSend* EngineChannel::GetFxSend(uint FxSendIndex) {
397            return (FxSendIndex < fxSends.size()) ? fxSends[FxSendIndex] : NULL;
398        }
399    
400        uint EngineChannel::GetFxSendCount() {
401            return fxSends.size();
402        }
403    
404        void EngineChannel::RemoveFxSend(FxSend* pFxSend) {
405            if (pEngine) pEngine->DisableAndLock();
406            for (
407                std::vector<FxSend*>::iterator iter = fxSends.begin();
408                iter != fxSends.end(); iter++
409            ) {
410                if (*iter == pFxSend) {
411                    delete pFxSend;
412                    fxSends.erase(iter);
413                    if (fxSends.empty()) {
414                        // destroy local render buffers
415                        if (pChannelLeft)  delete pChannelLeft;
416                        if (pChannelRight) delete pChannelRight;
417                        // fallback to render directly into AudioOutputDevice's buffers
418                        if (pEngine && pEngine->pAudioOutputDevice) {
419                            pChannelLeft  = pEngine->pAudioOutputDevice->Channel(AudioDeviceChannelLeft);
420                            pChannelRight = pEngine->pAudioOutputDevice->Channel(AudioDeviceChannelRight);
421                        } else { // we update the pointers later
422                            pChannelLeft  = NULL;
423                            pChannelRight = NULL;
424                        }
425                    }
426                    break;
427                }
428            }
429            if (pEngine) pEngine->Enable();
430        }
431    
432      /**      /**
433       *  Will be called by the MIDIIn Thread to let the audio thread trigger a new       *  Will be called by the MIDIIn Thread to let the audio thread trigger a new
434       *  voice for the given key. This method is meant for real time rendering,       *  voice for the given key. This method is meant for real time rendering,
# Line 596  namespace LinuxSampler { namespace gig { Line 673  namespace LinuxSampler { namespace gig {
673          eventQueueReader.free(); // free all copied events from input queue          eventQueueReader.free(); // free all copied events from input queue
674      }      }
675    
676        void EngineChannel::RemoveAllFxSends() {
677            if (pEngine) pEngine->DisableAndLock();
678            if (!fxSends.empty()) { // free local render buffers
679                if (pChannelLeft) {
680                    delete pChannelLeft;
681                    if (pEngine && pEngine->pAudioOutputDevice) {
682                        // fallback to render directly to the AudioOutputDevice's buffer
683                        pChannelLeft = pEngine->pAudioOutputDevice->Channel(AudioDeviceChannelLeft);
684                    } else pChannelLeft = NULL;
685                }
686                if (pChannelRight) {
687                    delete pChannelRight;
688                    if (pEngine && pEngine->pAudioOutputDevice) {
689                        // fallback to render directly to the AudioOutputDevice's buffer
690                        pChannelRight = pEngine->pAudioOutputDevice->Channel(AudioDeviceChannelRight);
691                    } else pChannelRight = NULL;
692                }
693            }
694            for (int i = 0; i < fxSends.size(); i++) delete fxSends[i];
695            fxSends.clear();
696            if (pEngine) pEngine->Enable();
697        }
698    
699      float EngineChannel::Volume() {      float EngineChannel::Volume() {
700          return GlobalVolume;          return GlobalVolume;
701      }      }

Legend:
Removed from v.970  
changed lines
  Added in v.1001

  ViewVC Help
Powered by ViewVC