/[svn]/gigedit/trunk/src/plugin/linuxsamplerplugin.cpp
ViewVC logotype

Diff of /gigedit/trunk/src/plugin/linuxsamplerplugin.cpp

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

revision 1229 by schoenebeck, Sun Jun 10 11:23:15 2007 UTC revision 2903 by schoenebeck, Tue May 3 14:08:34 2016 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (C) 2007 Andreas Persson   * Copyright (C) 2007 - 2015 Andreas Persson
3   *   *
4   * This program is free software; you can redistribute it and/or   * This program is free software; you can redistribute it and/or
5   * modify it under the terms of the GNU General Public License as   * modify it under the terms of the GNU General Public License as
# Line 19  Line 19 
19    
20  #include "linuxsamplerplugin.h"  #include "linuxsamplerplugin.h"
21    
22  #include <gig.h>  #include <linuxsampler/plugins/InstrumentEditorFactory.h>
23  #include <linuxsampler/engines/InstrumentEditorFactory.h>  #include <linuxsampler/engines/Engine.h>
24    #include <linuxsampler/engines/EngineChannel.h>
25  #include "../gigedit/gigedit.h"  #include "../gigedit/gigedit.h"
26    #include "../gigedit/global.h"
27    
28  #include <iostream>  #include <iostream>
29    #include <sigc++/bind.h>
30    #include <glibmm/main.h>
31    
32  REGISTER_INSTRUMENT_EDITOR(LinuxSamplerPlugin)  REGISTER_INSTRUMENT_EDITOR(LinuxSamplerPlugin)
33    
34  LinuxSamplerPlugin::LinuxSamplerPlugin() {  LinuxSamplerPlugin::LinuxSamplerPlugin() {
35        pApp = new GigEdit;
36    }
37    
38    LinuxSamplerPlugin::~LinuxSamplerPlugin() {
39        if (pApp) delete static_cast<GigEdit*>(pApp);
40    }
41    
42    int LinuxSamplerPlugin::Main(void* pInstrument, String sTypeName, String sTypeVersion, void* /*pUserData*/) {
43        return Main(pInstrument, sTypeName, sTypeVersion);
44  }  }
45    
46  int LinuxSamplerPlugin::Main(void* pInstrument, String sTypeName, String sTypeVersion) {  int LinuxSamplerPlugin::Main(void* pInstrument, String sTypeName, String sTypeVersion) {
47      std::cout << "Entered Gigedit Main() loop :)\n" << std::flush;      std::cout << "Entered Gigedit Main() loop :)\n" << std::flush;
48      gig::Instrument* pGigInstr = static_cast<gig::Instrument*>(pInstrument);      gig::Instrument* pGigInstr = static_cast<gig::Instrument*>(pInstrument);
49      return GigEdit::run(pGigInstr);      GigEdit* app = static_cast<GigEdit*>(pApp);
50    
51        // connect notification signals
52        app->signal_file_structure_to_be_changed().connect(
53            sigc::bind(
54                sigc::mem_fun(
55                    *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
56                ),
57                "gig::File"
58            )
59        );
60        app->signal_file_structure_changed().connect(
61            sigc::bind(
62                sigc::mem_fun(
63                    *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
64                ),
65                "gig::File"
66            )
67        );
68        app->signal_samples_to_be_removed().connect(
69            sigc::mem_fun(*this, &LinuxSamplerPlugin::__onSamplesToBeRemoved)
70        );
71        app->signal_samples_removed().connect(
72            sigc::mem_fun(*this, &LinuxSamplerPlugin::NotifySamplesRemoved)
73        );
74        app->signal_region_to_be_changed().connect(
75            sigc::bind(
76                sigc::mem_fun(
77                    *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
78                ),
79                "gig::Region"
80            )
81        );
82        app->signal_region_changed().connect(
83            sigc::bind(
84                sigc::mem_fun(
85                    *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
86                ),
87                "gig::Region"
88            )
89        );
90        app->signal_dimreg_to_be_changed().connect(
91            sigc::bind(
92                sigc::mem_fun(
93                    *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
94                ),
95                "gig::DimensionRegion"
96            )
97        );
98        app->signal_dimreg_changed().connect(
99            sigc::bind(
100                sigc::mem_fun(
101                    *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
102                ),
103                "gig::DimensionRegion"
104            )
105        );
106        app->signal_sample_changed().connect(
107            sigc::bind(
108                sigc::mem_fun(
109                    *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
110                ),
111                "gig::Sample"
112            )
113        );
114        app->signal_sample_ref_changed().connect(
115            sigc::mem_fun(*this, &LinuxSamplerPlugin::NotifySampleReferenceChanged)
116        );
117    
118        app->signal_keyboard_key_hit().connect(
119            sigc::mem_fun(*this, &LinuxSamplerPlugin::__onVirtualKeyboardKeyHit)
120        );
121        app->signal_keyboard_key_released().connect(
122            sigc::mem_fun(*this, &LinuxSamplerPlugin::__onVirtualKeyboardKeyReleased)
123        );
124        app->signal_switch_sampler_instrument().connect(
125            sigc::mem_fun(*this, &LinuxSamplerPlugin::__requestSamplerToSwitchInstrument)
126        );
127        app->signal_script_to_be_changed.connect(
128            sigc::bind(
129                sigc::mem_fun(
130                    *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
131                ),
132                "gig::Script"
133            )
134        );
135        app->signal_script_changed.connect(
136            sigc::bind(
137                sigc::mem_fun(
138                    *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
139                ),
140                "gig::Script"
141            )
142        );
143    
144        // register a timeout job to gigedit's main loop, so we can poll the
145        // the sampler periodically for MIDI events (I HOPE it works on all
146        // archs, because gigedit is actually running in another thread than
147        // the one that is calling this timeout handler register code)
148        const Glib::RefPtr<Glib::TimeoutSource> timeout_source =
149            Glib::TimeoutSource::create(100); // poll every 100ms
150        timeout_source->connect(
151            sigc::mem_fun(this, &LinuxSamplerPlugin::__onPollPeriod)
152        );
153        timeout_source->attach(Glib::MainContext::get_default());
154    
155        // run gigedit application
156        return app->run(pGigInstr);
157    }
158    
159    bool LinuxSamplerPlugin::__onPollPeriod() {
160        #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
161        GigEdit* app = static_cast<GigEdit*>(pApp);
162        if (!NotesChanged()) return true;
163        for (int iKey = 0; iKey < 128; iKey++)
164            if (NoteChanged(iKey))
165                NoteIsActive(iKey) ?
166                    app->on_note_on_event(iKey, NoteOnVelocity(iKey)) :
167                    app->on_note_off_event(iKey, NoteOffVelocity(iKey));
168        return true;
169        #else
170        return false;
171        #endif
172    }
173    
174    void LinuxSamplerPlugin::__onSamplesToBeRemoved(std::list<gig::Sample*> lSamples) {
175        // we have to convert the gig::Sample* list to a void* list first
176        std::set<void*> samples;
177        for (
178            std::list<gig::Sample*>::iterator iter = lSamples.begin();
179            iter != lSamples.end(); ++iter
180        ) samples.insert((void*)*iter);
181        // finally send notification to sampler
182        NotifySamplesToBeRemoved(samples);
183    }
184    
185    void LinuxSamplerPlugin::__onVirtualKeyboardKeyHit(int Key, int Velocity) {
186        #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
187        SendNoteOnToSampler(Key, Velocity);
188        #endif
189    }
190    
191    void LinuxSamplerPlugin::__onVirtualKeyboardKeyReleased(int Key, int Velocity) {
192        #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
193        SendNoteOffToSampler(Key, Velocity);
194        #endif
195    }
196    
197    void LinuxSamplerPlugin::__requestSamplerToSwitchInstrument(gig::Instrument* pInstrument) {
198        if (!pInstrument) return;
199    
200        LinuxSampler::EngineChannel* pEngineChannel = GetEngineChannel();
201        if (!pEngineChannel) return;
202    
203        LinuxSampler::Engine* pEngine = pEngineChannel->GetEngine();
204        if (!pEngine) return;
205    
206        LinuxSampler::InstrumentManager* pInstrumentManager = pEngine->GetInstrumentManager();
207        if (!pInstrumentManager) return;
208    
209        gig::File* pFile = (gig::File*) pInstrument->GetParent();
210    
211        // resolve instrument's index number in its gig file
212        int index = -1;
213        for (int i = 0; pFile->GetInstrument(i); ++i) {
214            if (pFile->GetInstrument(i) == pInstrument) {
215                index = i;
216                break;
217            }
218        }
219        if (index < 0) return;
220    
221        LinuxSampler::InstrumentManager::instrument_id_t id;
222        id.FileName = pFile->GetFileName();
223        id.Index    = index;
224        pInstrumentManager->LoadInstrumentInBackground(id, pEngineChannel);
225  }  }
226    
227  bool LinuxSamplerPlugin::IsTypeSupported(String sTypeName, String sTypeVersion) {  bool LinuxSamplerPlugin::IsTypeSupported(String sTypeName, String sTypeVersion) {

Legend:
Removed from v.1229  
changed lines
  Added in v.2903

  ViewVC Help
Powered by ViewVC