/[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 1213 by schoenebeck, Wed May 30 00:14:05 2007 UTC revision 1680 by schoenebeck, Tue Feb 12 14:14:26 2008 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (C) 2007 Andreas Persson   * Copyright (C) 2007, 2008 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 "../gigedit/gigedit.h"
24  #include "../gigedit.h"  #include "../gigedit/global.h"
25    
26  #include <iostream>  #include <iostream>
27    #include <sigc++/bind.h>
28    #include <glibmm/main.h>
29    
30  REGISTER_INSTRUMENT_EDITOR(LinuxSamplerPlugin)  REGISTER_INSTRUMENT_EDITOR(LinuxSamplerPlugin)
31    
32  LinuxSamplerPlugin::LinuxSamplerPlugin() {  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) {  int LinuxSamplerPlugin::Main(void* pInstrument, String sTypeName, String sTypeVersion) {
41      std::cout << "Entered Gigedit Main() loop :)\n" << std::flush;      std::cout << "Entered Gigedit Main() loop :)\n" << std::flush;
42      gig::Instrument* pGigInstr = static_cast<gig::Instrument*>(pInstrument);      gig::Instrument* pGigInstr = static_cast<gig::Instrument*>(pInstrument);
43      return GigEdit::run(pGigInstr);      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_ref_changed().connect(
101            sigc::mem_fun(*this, &LinuxSamplerPlugin::NotifySampleReferenceChanged)
102        );
103    
104        app->signal_keyboard_key_hit().connect(
105            sigc::mem_fun(*this, &LinuxSamplerPlugin::__onVirtualKeyboardKeyHit)
106        );
107        app->signal_keyboard_key_released().connect(
108            sigc::mem_fun(*this, &LinuxSamplerPlugin::__onVirtualKeyboardKeyReleased)
109        );
110    
111        // register a timeout job to gigedit's main loop, so we can poll the
112        // the sampler periodically for MIDI events (I HOPE it works on all
113        // archs, because gigedit is actually running in another thread than
114        // the one that is calling this timeout handler register code)
115        const Glib::RefPtr<Glib::TimeoutSource> timeout_source =
116            Glib::TimeoutSource::create(100); // poll every 100ms
117        timeout_source->connect(
118            sigc::mem_fun(this, &LinuxSamplerPlugin::__onPollPeriod)
119        );
120        timeout_source->attach(Glib::MainContext::get_default());
121    
122        // run gigedit application
123        return app->run(pGigInstr);
124    }
125    
126    bool LinuxSamplerPlugin::__onPollPeriod() {
127        #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
128        GigEdit* app = (GigEdit*) pApp;
129        if (!NotesChanged()) return true;
130        for (int iKey = 0; iKey < 128; iKey++)
131            if (NoteChanged(iKey))
132                NoteIsActive(iKey) ?
133                    app->on_note_on_event(iKey, NoteOnVelocity(iKey)) :
134                    app->on_note_off_event(iKey, NoteOffVelocity(iKey));
135        return true;
136        #else
137        return false;
138        #endif
139    }
140    
141    void LinuxSamplerPlugin::__onSamplesToBeRemoved(std::list<gig::Sample*> lSamples) {
142        // we have to convert the gig::Sample* list to a void* list first
143        std::set<void*> samples;
144        for (
145            std::list<gig::Sample*>::iterator iter = lSamples.begin();
146            iter != lSamples.end(); iter++
147        ) samples.insert((void*)*iter);
148        // finally send notification to sampler
149        NotifySamplesToBeRemoved(samples);
150    }
151    
152    void LinuxSamplerPlugin::__onVirtualKeyboardKeyHit(int Key, int Velocity) {
153        #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
154        SendNoteOnToSampler(Key, Velocity);
155        #endif
156    }
157    
158    void LinuxSamplerPlugin::__onVirtualKeyboardKeyReleased(int Key, int Velocity) {
159        #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
160        SendNoteOffToSampler(Key, Velocity);
161        #endif
162  }  }
163    
164  bool LinuxSamplerPlugin::IsTypeSupported(String sTypeName, String sTypeVersion) {  bool LinuxSamplerPlugin::IsTypeSupported(String sTypeName, String sTypeVersion) {

Legend:
Removed from v.1213  
changed lines
  Added in v.1680

  ViewVC Help
Powered by ViewVC