00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __LS_SAMPLER_H__
00025 #define __LS_SAMPLER_H__
00026
00027 #include <vector>
00028 #include <map>
00029 #include "EventListeners.h"
00030 #include "common/global.h"
00031 #include "common/Exception.h"
00032 #include "engines/EngineChannel.h"
00033 #include "drivers/midi/MidiInputDevice.h"
00034 #include "drivers/audio/AudioOutputDevice.h"
00035
00036 namespace LinuxSampler {
00037
00038
00039 class Sampler;
00040
00049 class SamplerChannel {
00050 public:
00058 void SetEngineType(String EngineType) throw (Exception);
00059
00072 void SetAudioOutputDevice(AudioOutputDevice* pDevice) throw (Exception);
00073
00084 void SetMidiInputDevice(MidiInputDevice *pDevice) throw (Exception);
00085
00095 void SetMidiInputPort(int MidiPort) throw (Exception);
00096
00105 void SetMidiInputChannel(midi_chan_t MidiChannel);
00106
00120 void SetMidiInput(MidiInputDevice* pDevice, int iMidiPort, midi_chan_t MidiChannel = midi_chan_all) throw (Exception);
00121
00128 EngineChannel* GetEngineChannel();
00129
00137 midi_chan_t GetMidiInputChannel();
00138
00145 int GetMidiInputPort();
00146
00154 AudioOutputDevice* GetAudioOutputDevice();
00155
00163 MidiInputDevice* GetMidiInputDevice();
00164
00169 uint Index();
00170
00172 Sampler* GetSampler();
00173
00175
00176
00181 void AddEngineChangeListener(EngineChangeListener* l);
00182
00186 void RemoveEngineChangeListener(EngineChangeListener* l);
00187
00191 void RemoveAllEngineChangeListeners();
00192
00197 void fireEngineToBeChanged();
00198
00203 void fireEngineChanged();
00204
00205
00206 protected:
00207 SamplerChannel(Sampler* pS);
00208 virtual ~SamplerChannel();
00209
00211 MidiInputPort* __GetMidiInputDevicePort(int iMidiPort);
00212
00213 Sampler* pSampler;
00214 EngineChannel* pEngineChannel;
00215 AudioOutputDevice* pAudioOutputDevice;
00216 MidiInputDevice* pMidiInputDevice;
00217 int iIndex;
00218
00219 friend class Sampler;
00220 private:
00221 int iMidiPort;
00222 midi_chan_t midiChannel;
00223 ListenerList<EngineChangeListener*> llEngineChangeListeners;
00224 };
00225
00281 class Sampler {
00282 public:
00286 Sampler();
00287
00291 virtual ~Sampler();
00292
00296 uint SamplerChannels();
00297
00307 SamplerChannel* AddSamplerChannel();
00308
00315 SamplerChannel* GetSamplerChannel(uint uiSamplerChannel);
00316
00320 std::map<uint, SamplerChannel*> GetSamplerChannels();
00321
00328 void RemoveSamplerChannel(SamplerChannel* pSamplerChannel);
00329
00337 void RemoveSamplerChannel(uint uiSamplerChannel);
00338
00343 void RemoveAllSamplerChannels();
00344
00348 std::vector<String> AvailableAudioOutputDrivers();
00349
00353 std::vector<String> AvailableMidiInputDrivers();
00354
00359 std::vector<String> AvailableEngineTypes();
00360
00370 AudioOutputDevice* CreateAudioOutputDevice(String AudioDriver, std::map<String,String> Parameters) throw (Exception);
00371
00381 MidiInputDevice* CreateMidiInputDevice(String MidiDriver, std::map<String,String> Parameters) throw (Exception);
00382
00386 uint AudioOutputDevices();
00387
00391 uint MidiInputDevices();
00392
00396 std::map<uint, AudioOutputDevice*> GetAudioOutputDevices();
00397
00401 std::map<uint, MidiInputDevice*> GetMidiInputDevices();
00402
00410 void DestroyAudioOutputDevice(AudioOutputDevice* pDevice) throw (Exception);
00411
00423 void DestroyAllAudioOutputDevices() throw (Exception);
00424
00432 void DestroyMidiInputDevice(MidiInputDevice* pDevice) throw (Exception);
00433
00445 void DestroyAllMidiInputDevices() throw (Exception);
00446
00451 int GetDiskStreamCount();
00452
00457 int GetVoiceCount();
00458
00463 void Reset();
00464
00466
00467
00472 void AddChannelCountListener(ChannelCountListener* l);
00473
00477 void RemoveChannelCountListener(ChannelCountListener* l);
00478
00483 void AddAudioDeviceCountListener(AudioDeviceCountListener* l);
00484
00488 void RemoveAudioDeviceCountListener(AudioDeviceCountListener* l);
00489
00494 void AddMidiDeviceCountListener(MidiDeviceCountListener* l);
00495
00499 void RemoveMidiDeviceCountListener(MidiDeviceCountListener* l);
00500
00505 void AddVoiceCountListener(VoiceCountListener* l);
00506
00510 void RemoveVoiceCountListener(VoiceCountListener* l);
00511
00518 void fireVoiceCountChanged(int ChannelId, int NewCount);
00519
00524 void AddStreamCountListener(StreamCountListener* l);
00525
00529 void RemoveStreamCountListener(StreamCountListener* l);
00530
00537 void fireStreamCountChanged(int ChannelId, int NewCount);
00538
00544 void AddBufferFillListener(BufferFillListener* l);
00545
00549 void RemoveBufferFillListener(BufferFillListener* l);
00550
00557 void fireBufferFillChanged(int ChannelId, String FillData);
00558
00563 void AddTotalVoiceCountListener(TotalVoiceCountListener* l);
00564
00568 void RemoveTotalVoiceCountListener(TotalVoiceCountListener* l);
00569
00574 void fireTotalVoiceCountChanged(int NewCount);
00575
00580 void AddTotalStreamCountListener(TotalStreamCountListener* l);
00581
00585 void RemoveTotalStreamCountListener(TotalStreamCountListener* l);
00586
00591 void fireTotalStreamCountChanged(int NewCount);
00592
00597 void AddFxSendCountListener(FxSendCountListener* l);
00598
00602 void RemoveFxSendCountListener(FxSendCountListener* l);
00603
00609 void fireStatistics();
00610
00612
00613
00621 static bool EnableDenormalsAreZeroMode();
00622
00623 #if defined(WIN32)
00624
00629 static String GetInstallDir();
00630 #endif
00631 protected:
00636 void fireChannelCountChanged(int NewCount);
00637
00643 void fireChannelAdded(SamplerChannel* pChannel);
00644
00650 void fireChannelToBeRemoved(SamplerChannel* pChannel);
00651
00656 void fireAudioDeviceCountChanged(int NewCount);
00657
00662 void fireMidiDeviceCountChanged(int NewCount);
00663
00669 void fireMidiDeviceToBeDestroyed(MidiInputDevice* pDevice);
00670
00676 void fireMidiDeviceCreated(MidiInputDevice* pDevice);
00677
00684 void fireFxSendCountChanged(int ChannelId, int NewCount);
00685
00686 typedef std::map<uint, SamplerChannel*> SamplerChannelMap;
00687
00688 SamplerChannelMap mSamplerChannels;
00689
00690
00691 uint uiOldTotalVoiceCount;
00692 uint uiOldTotalStreamCount;
00693 std::map<uint, uint> mOldVoiceCounts;
00694 std::map<uint, uint> mOldStreamCounts;
00695
00696 friend class SamplerChannel;
00697
00698 private:
00699 ListenerList<ChannelCountListener*> llChannelCountListeners;
00700 ListenerList<AudioDeviceCountListener*> llAudioDeviceCountListeners;
00701 ListenerList<MidiDeviceCountListener*> llMidiDeviceCountListeners;
00702 ListenerList<VoiceCountListener*> llVoiceCountListeners;
00703 ListenerList<StreamCountListener*> llStreamCountListeners;
00704 ListenerList<BufferFillListener*> llBufferFillListeners;
00705 ListenerList<TotalStreamCountListener*> llTotalStreamCountListeners;
00706 ListenerList<TotalVoiceCountListener*> llTotalVoiceCountListeners;
00707 ListenerList<FxSendCountListener*> llFxSendCountListeners;
00708
00709 class EventHandler : public EngineChangeListener, public FxSendCountListener {
00710 public:
00711 void SetSampler(Sampler* pSampler) { this->pSampler = pSampler; }
00712
00718 virtual void EngineToBeChanged(int ChannelId);
00719
00726 virtual void EngineChanged(int ChannelId);
00727
00734 virtual void FxSendCountChanged(int ChannelId, int NewCount);
00735
00736 private:
00737 Sampler* pSampler;
00738 } eventHandler;
00739 };
00740 }
00741
00742 #endif // __LS_SAMPLER_H__