/[svn]/linuxsampler/trunk/src/Sampler.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/Sampler.cpp

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

revision 76 by senkov, Fri May 14 19:10:21 2004 UTC revision 123 by schoenebeck, Mon Jun 14 19:33:16 2004 UTC
# Line 20  Line 20 
20   *   MA  02111-1307  USA                                                   *   *   MA  02111-1307  USA                                                   *
21   ***************************************************************************/   ***************************************************************************/
22    
23    #include <sstream>
24    
25  #include "Sampler.h"  #include "Sampler.h"
26    
27  #include "audiodriver/AudioOutputDeviceAlsa.h"  #include "audiodriver/AudioOutputDeviceFactory.h"
 #include "audiodriver/AudioOutputDeviceJack.h"  
28  #include "mididriver/MidiInputDeviceAlsa.h"  #include "mididriver/MidiInputDeviceAlsa.h"
29  #include "engines/gig/Engine.h"  #include "engines/gig/Engine.h"
30    
# Line 75  namespace LinuxSampler { Line 76  namespace LinuxSampler {
76          dmsg(2,("OK\n"));          dmsg(2,("OK\n"));
77      }      }
78    
79      void SamplerChannel::SetAudioOutputDevice(AudioOutputDevice::type_t AudioType) {      void SamplerChannel::SetAudioOutputDevice(AudioOutputDevice* pDevice) {
         // get / create desired audio device  
         AudioOutputDevice* pDevice = pSampler->GetAudioOutputDevice(AudioType);  
         if (!pDevice) pDevice = pSampler->CreateAudioOutputDevice(AudioType);  
   
80          // disconnect old device          // disconnect old device
81          if (pAudioOutputDevice && pEngine) pAudioOutputDevice->Disconnect(pEngine);          if (pAudioOutputDevice && pEngine) pAudioOutputDevice->Disconnect(pEngine);
82    
# Line 153  namespace LinuxSampler { Line 150  namespace LinuxSampler {
150    
151          // delete audio output devices          // delete audio output devices
152          {          {
153              AudioOutputDeviceMap::iterator iter = AudioOutputDevices.begin();              AudioOutputDeviceMap::iterator iter = mAudioOutputDevices.begin();
154              for (; iter != AudioOutputDevices.end(); iter++) {              for (; iter != mAudioOutputDevices.end(); iter++) {
155                  AudioOutputDevice* pDevice = iter->second;                  AudioOutputDevice* pDevice = iter->second;
156                  pDevice->Stop();                  pDevice->Stop();
157                  delete pDevice;                  delete pDevice;
# Line 194  namespace LinuxSampler { Line 191  namespace LinuxSampler {
191          RemoveSamplerChannel(pChannel);          RemoveSamplerChannel(pChannel);
192      }      }
193    
194      AudioOutputDevice* Sampler::CreateAudioOutputDevice(AudioOutputDevice::type_t AudioType) {      std::vector<String> Sampler::AvailableAudioOutputDrivers() {
195          // check if device already created          return AudioOutputDeviceFactory::AvailableDrivers();
196          AudioOutputDevice* pDevice = GetAudioOutputDevice(AudioType);      }
         if (pDevice) return pDevice;  
197    
198        AudioOutputDevice* Sampler::CreateAudioOutputDevice(String AudioDriver, std::map<String,String> Parameters) throw (LinuxSamplerException) {
199          // create new device          // create new device
200          switch (AudioType) {          AudioOutputDevice* pDevice = AudioOutputDeviceFactory::Create(AudioDriver, Parameters);
             case AudioOutputDevice::type_alsa:  
                 pDevice = new AudioOutputDeviceAlsa;  
                 break;  
 #if HAVE_JACK  
             case AudioOutputDevice::type_jack:  
                 pDevice = new AudioOutputDeviceJack;  
                 break;  
 #endif  
             default:  
                 throw LinuxSamplerException("Unknown audio output device type");  
         }  
201    
202          // activate device          // activate device
203          pDevice->Play();          pDevice->Play();
204    
205          // add new audio device to the audio device list          // add new audio device to the audio device list
206          AudioOutputDevices[AudioType] = pDevice;          for (uint i = 0; ; i++) { // seek for a free place starting from the beginning
207                if (!mAudioOutputDevices[i]) {
208                    mAudioOutputDevices[i] = pDevice;
209                    break;
210                }
211            }
212    
213          return pDevice;          return pDevice;
214      }      }
215    
216      AudioOutputDevice* Sampler::GetAudioOutputDevice(AudioOutputDevice::type_t AudioType) {      uint Sampler::AudioOutputDevices() {
217          AudioOutputDeviceMap::iterator iter = AudioOutputDevices.find(AudioType);          return mAudioOutputDevices.size();
218          return (iter != AudioOutputDevices.end()) ? iter->second : NULL;      }
219    
220        std::map<uint, AudioOutputDevice*> Sampler::GetAudioOutputDevices() {
221            return mAudioOutputDevices;
222        }
223    
224        void Sampler::DestroyAudioOutputDevice(AudioOutputDevice* pDevice) throw (LinuxSamplerException) {
225            AudioOutputDeviceMap::iterator iter = mAudioOutputDevices.begin();
226            for (; iter != mAudioOutputDevices.end(); iter++) {
227                if (iter->second == pDevice) {
228                    // check if there are still sampler engines connected to this device
229                    for (uint i = 0; i < SamplerChannels(); i++)
230                        if (GetSamplerChannel(i)->GetAudioOutputDevice() == pDevice) throw LinuxSamplerException("Sampler channel " + ToString(i) + " is still connected to the audio output device.");
231    
232                    // disable device
233                    pDevice->Stop();
234    
235                    // remove device from the device list
236                    mAudioOutputDevices.erase(iter);
237    
238                    // destroy and free device from memory
239                    delete pDevice;
240                }
241            }
242      }      }
243    
244      MidiInputDevice* Sampler::CreateMidiInputDevice(MidiInputDevice::type_t MidiType) {      MidiInputDevice* Sampler::CreateMidiInputDevice(MidiInputDevice::type_t MidiType) {

Legend:
Removed from v.76  
changed lines
  Added in v.123

  ViewVC Help
Powered by ViewVC