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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1853 - (show annotations) (download)
Sun Mar 1 22:26:36 2009 UTC (15 years, 1 month ago) by schoenebeck
File size: 6061 byte(s)
* bugfix: inform the sampler when new file(s) has been imported on save
  operation (#82)

1 /*
2 * Copyright (C) 2007, 2008 Andreas Persson
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2, or (at
7 * your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with program; see the file COPYING. If not, write to the Free
16 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17 * 02110-1301 USA.
18 */
19
20 #include "linuxsamplerplugin.h"
21
22 #include <linuxsampler/plugins/InstrumentEditorFactory.h>
23 #include "../gigedit/gigedit.h"
24 #include "../gigedit/global.h"
25
26 #include <iostream>
27 #include <sigc++/bind.h>
28 #include <glibmm/main.h>
29
30 REGISTER_INSTRUMENT_EDITOR(LinuxSamplerPlugin)
31
32 LinuxSamplerPlugin::LinuxSamplerPlugin() {
33 pApp = new GigEdit;
34 }
35
36 LinuxSamplerPlugin::~LinuxSamplerPlugin() {
37 if (pApp) delete (GigEdit*) pApp;
38 }
39
40 int LinuxSamplerPlugin::Main(void* pInstrument, String sTypeName, String sTypeVersion) {
41 std::cout << "Entered Gigedit Main() loop :)\n" << std::flush;
42 gig::Instrument* pGigInstr = static_cast<gig::Instrument*>(pInstrument);
43 GigEdit* app = (GigEdit*) pApp;
44
45 // connect notification signals
46 app->signal_file_structure_to_be_changed().connect(
47 sigc::bind(
48 sigc::mem_fun(
49 *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
50 ),
51 "gig::File"
52 )
53 );
54 app->signal_file_structure_changed().connect(
55 sigc::bind(
56 sigc::mem_fun(
57 *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
58 ),
59 "gig::File"
60 )
61 );
62 app->signal_samples_to_be_removed().connect(
63 sigc::mem_fun(*this, &LinuxSamplerPlugin::__onSamplesToBeRemoved)
64 );
65 app->signal_samples_removed().connect(
66 sigc::mem_fun(*this, &LinuxSamplerPlugin::NotifySamplesRemoved)
67 );
68 app->signal_region_to_be_changed().connect(
69 sigc::bind(
70 sigc::mem_fun(
71 *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
72 ),
73 "gig::Region"
74 )
75 );
76 app->signal_region_changed().connect(
77 sigc::bind(
78 sigc::mem_fun(
79 *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
80 ),
81 "gig::Region"
82 )
83 );
84 app->signal_dimreg_to_be_changed().connect(
85 sigc::bind(
86 sigc::mem_fun(
87 *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
88 ),
89 "gig::DimensionRegion"
90 )
91 );
92 app->signal_dimreg_changed().connect(
93 sigc::bind(
94 sigc::mem_fun(
95 *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
96 ),
97 "gig::DimensionRegion"
98 )
99 );
100 app->signal_sample_changed().connect(
101 sigc::bind(
102 sigc::mem_fun(
103 *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
104 ),
105 "gig::Sample"
106 )
107 );
108 app->signal_sample_ref_changed().connect(
109 sigc::mem_fun(*this, &LinuxSamplerPlugin::NotifySampleReferenceChanged)
110 );
111
112 app->signal_keyboard_key_hit().connect(
113 sigc::mem_fun(*this, &LinuxSamplerPlugin::__onVirtualKeyboardKeyHit)
114 );
115 app->signal_keyboard_key_released().connect(
116 sigc::mem_fun(*this, &LinuxSamplerPlugin::__onVirtualKeyboardKeyReleased)
117 );
118
119 // register a timeout job to gigedit's main loop, so we can poll the
120 // the sampler periodically for MIDI events (I HOPE it works on all
121 // archs, because gigedit is actually running in another thread than
122 // the one that is calling this timeout handler register code)
123 const Glib::RefPtr<Glib::TimeoutSource> timeout_source =
124 Glib::TimeoutSource::create(100); // poll every 100ms
125 timeout_source->connect(
126 sigc::mem_fun(this, &LinuxSamplerPlugin::__onPollPeriod)
127 );
128 timeout_source->attach(Glib::MainContext::get_default());
129
130 // run gigedit application
131 return app->run(pGigInstr);
132 }
133
134 bool LinuxSamplerPlugin::__onPollPeriod() {
135 #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
136 GigEdit* app = (GigEdit*) pApp;
137 if (!NotesChanged()) return true;
138 for (int iKey = 0; iKey < 128; iKey++)
139 if (NoteChanged(iKey))
140 NoteIsActive(iKey) ?
141 app->on_note_on_event(iKey, NoteOnVelocity(iKey)) :
142 app->on_note_off_event(iKey, NoteOffVelocity(iKey));
143 return true;
144 #else
145 return false;
146 #endif
147 }
148
149 void LinuxSamplerPlugin::__onSamplesToBeRemoved(std::list<gig::Sample*> lSamples) {
150 // we have to convert the gig::Sample* list to a void* list first
151 std::set<void*> samples;
152 for (
153 std::list<gig::Sample*>::iterator iter = lSamples.begin();
154 iter != lSamples.end(); iter++
155 ) samples.insert((void*)*iter);
156 // finally send notification to sampler
157 NotifySamplesToBeRemoved(samples);
158 }
159
160 void LinuxSamplerPlugin::__onVirtualKeyboardKeyHit(int Key, int Velocity) {
161 #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
162 SendNoteOnToSampler(Key, Velocity);
163 #endif
164 }
165
166 void LinuxSamplerPlugin::__onVirtualKeyboardKeyReleased(int Key, int Velocity) {
167 #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
168 SendNoteOffToSampler(Key, Velocity);
169 #endif
170 }
171
172 bool LinuxSamplerPlugin::IsTypeSupported(String sTypeName, String sTypeVersion) {
173 return sTypeName == gig::libraryName() &&
174 sTypeVersion == gig::libraryVersion();
175 }
176
177 String LinuxSamplerPlugin::Name() {
178 return "gigedit";
179 }
180
181 String LinuxSamplerPlugin::Version() {
182 return VERSION; // gigedit's version
183 }
184
185 String LinuxSamplerPlugin::Description() {
186 return "Gigedit is an instrument editor for gig files.";
187 }

  ViewVC Help
Powered by ViewVC