/[svn]/qsampler/trunk/src/qsamplerFxSend.cpp
ViewVC logotype

Annotation of /qsampler/trunk/src/qsamplerFxSend.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1667 - (hide annotations) (download)
Mon Feb 4 23:24:19 2008 UTC (12 years ago) by schoenebeck
File size: 6697 byte(s)
* added FX Sends dialog to channel strips
  (still under construction, so far one can only create, destroy and rename
  FX sends, the rest is still to do)
* bumped version to 0.2.1.3

1 schoenebeck 1667 // qsamplerFxSend.cpp
2     //
3     /****************************************************************************
4     Copyright (C) 2008, Christian Schoenebeck
5    
6     This program is free software; you can redistribute it and/or
7     modify it under the terms of the GNU General Public License
8     as published by the Free Software Foundation; either version 2
9     of the License, or (at your option) any later version.
10    
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     GNU General Public License for more details.
15    
16     You should have received a copy of the GNU General Public License along
17     with this program; if not, write to the Free Software Foundation, Inc.,
18     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19    
20     *****************************************************************************/
21    
22     #include "qsamplerAbout.h"
23     #include "qsamplerFxSend.h"
24     #include "qsamplerUtilities.h"
25     #include "qsamplerOptions.h"
26     #include "qsamplerMainForm.h"
27    
28     namespace QSampler {
29    
30     // marks FxSend objects which don't exist on sampler side yet
31     #define NEW_FX_SEND -1
32    
33     FxSend::FxSend(int SamplerChannelID, int FxSendID) :
34     m_iSamplerChannelID(SamplerChannelID),
35     m_iFxSendID(FxSendID), m_bDelete(false), m_bModified(false)
36     {
37     m_MidiCtrl = 91;
38     m_Depth = 0.0f;
39     }
40    
41     FxSend::FxSend(int SamplerChannelID) :
42     m_iSamplerChannelID(SamplerChannelID),
43     m_iFxSendID(NEW_FX_SEND), m_bDelete(false), m_bModified(true)
44     {
45     m_MidiCtrl = 91;
46     m_Depth = 0.0f;
47     }
48    
49     FxSend::~FxSend() {
50     }
51    
52     int FxSend::id() const {
53     return m_iFxSendID;
54     }
55    
56     bool FxSend::isNew() const {
57     return m_iFxSendID == NEW_FX_SEND;
58     }
59    
60     void FxSend::setDeletion(bool bDelete) {
61     m_bDelete = bDelete;
62     m_bModified = true;
63     }
64    
65     bool FxSend::deletion() const {
66     return m_bDelete;
67     }
68    
69     void FxSend::setName(const QString& sName) {
70     m_FxSendName = sName;
71     m_bModified = true;
72     }
73    
74     bool FxSend::isModified() const {
75     return m_bModified;
76     }
77    
78     const QString& FxSend::name() const {
79     return m_FxSendName;
80     }
81    
82     void FxSend::setSendDepthMidiCtrl(int iMidiController) {
83     m_MidiCtrl = iMidiController;
84     m_bModified = true;
85     }
86    
87     int FxSend::sendDepthMidiCtrl() const {
88     return m_MidiCtrl;
89     }
90    
91     void FxSend::setCurrentDepth(float depth) {
92     m_Depth = depth;
93     m_bModified = true;
94     }
95    
96     float FxSend::currentDepth() const {
97     return m_Depth;
98     }
99    
100     int FxSend::audioChannel(int iAudioSrc) const {
101     if (iAudioSrc < 0 || iAudioSrc >= m_AudioRouting.size())
102     return -1;
103    
104     return m_AudioRouting[iAudioSrc];
105     }
106    
107     bool FxSend::setAudioChannel(int iAudioSrc, int iAudioDst) {
108     if (iAudioSrc < 0 || iAudioSrc >= m_AudioRouting.size())
109     return false;
110    
111     m_AudioRouting[iAudioSrc] = iAudioDst;
112     m_bModified = true;
113    
114     return true;
115     }
116    
117     const FxSendRoutingMap& FxSend::audioRouting() const {
118     return m_AudioRouting;
119     }
120    
121     bool FxSend::getFromSampler() {
122     #if CONFIG_FXSEND
123     m_bModified = false;
124    
125     // in case this is a new, actually not yet existing FX send, ignore update
126     if (isNew())
127     return true;
128    
129     MainForm *pMainForm = MainForm::getInstance();
130     if (!pMainForm || !pMainForm->client())
131     return false;
132    
133     lscp_fxsend_info_t* pFxSendInfo =
134     ::lscp_get_fxsend_info(
135     pMainForm->client(),
136     m_iSamplerChannelID,
137     m_iFxSendID);
138    
139     if (!pFxSendInfo) {
140     pMainForm->appendMessagesClient("lscp_get_fxsend_info");
141     return false;
142     }
143    
144     m_FxSendName = qsamplerUtilities::lscpEscapedTextToRaw(pFxSendInfo->name);
145     m_MidiCtrl = pFxSendInfo->midi_controller;
146     m_Depth = pFxSendInfo->level;
147    
148     m_AudioRouting.clear();
149     if (pFxSendInfo->audio_routing)
150     for (int i = 0; pFxSendInfo->audio_routing[i]; ++i)
151     m_AudioRouting[i] = pFxSendInfo->audio_routing[i];
152    
153     return true;
154     #else // CONFIG_FXSEND
155     return false;
156     #endif // CONFIG_FXSEND
157     }
158    
159     bool FxSend::applyToSampler() {
160     #if CONFIG_FXSEND
161     MainForm *pMainForm = MainForm::getInstance();
162     if (!pMainForm || !pMainForm->client())
163     return false;
164    
165     // in case FX send doesn't exist on sampler side yet, create it
166     if (isNew()) {
167     // doesn't exist and scheduled for deletion? nothing to do
168     if (deletion()) {
169     m_bModified = false;
170     return true;
171     }
172    
173     int result =
174     ::lscp_create_fxsend(
175     pMainForm->client(),
176     m_iSamplerChannelID,
177     m_MidiCtrl, NULL
178     );
179     if (result == -1) {
180     pMainForm->appendMessagesClient("lscp_create_fxsend");
181     return false;
182     }
183     m_iFxSendID = result;
184     }
185    
186     lscp_status_t result;
187    
188     // delete FX send on sampler side
189     if (deletion()) {
190     result =
191     ::lscp_destroy_fxsend(
192     pMainForm->client(), m_iSamplerChannelID, m_iFxSendID
193     );
194     if (result != LSCP_OK) {
195     pMainForm->appendMessagesClient("lscp_destroy_fxsend");
196     return false;
197     }
198     m_bModified = false;
199     return true;
200     }
201    
202     // set FX send depth MIDI controller
203     result =
204     ::lscp_set_fxsend_midi_controller(
205     pMainForm->client(),
206     m_iSamplerChannelID, m_iFxSendID, m_MidiCtrl
207     );
208     if (result != LSCP_OK) {
209     pMainForm->appendMessagesClient("lscp_set_fxsend_midi_controller");
210     return false;
211     }
212    
213     #if CONFIG_FXSEND_RENAME
214     // set FX send's name
215     result =
216     ::lscp_set_fxsend_name(
217     pMainForm->client(),
218     m_iSamplerChannelID, m_iFxSendID,
219     qsamplerUtilities::lscpEscapeText(
220     m_FxSendName
221     ).toUtf8().constData()
222     );
223     if (result != LSCP_OK) {
224     pMainForm->appendMessagesClient("lscp_set_fxsend_name");
225     return false;
226     }
227     #endif // CONFIG_FXSEND_RENAME
228    
229     // set FX send current send level
230     result =
231     ::lscp_set_fxsend_level(
232     pMainForm->client(),
233     m_iSamplerChannelID, m_iFxSendID, m_Depth
234     );
235     if (result != LSCP_OK) {
236     pMainForm->appendMessagesClient("lscp_set_fxsend_level");
237     return false;
238     }
239    
240     // set FX send's audio routing
241     for (int i = 0; i < m_AudioRouting.size(); ++i) {
242     result =
243     ::lscp_set_fxsend_audio_channel(
244     pMainForm->client(), m_iSamplerChannelID, m_iFxSendID,
245     i, /*audio source*/
246     m_AudioRouting[i] /*audio destination*/
247     );
248     if (result != LSCP_OK) {
249     pMainForm->appendMessagesClient("lscp_set_fxsend_audio_channel");
250     return false;
251     }
252     }
253    
254     m_bModified = false;
255     return true;
256     #else // CONFIG_FXSEND
257     return false;
258     #endif // CONFIG_FXSEND
259     }
260    
261     QList<int> FxSend::allFxSendsOfSamplerChannel(int samplerChannelID) {
262     QList<int> sends;
263    
264     MainForm *pMainForm = MainForm::getInstance();
265     if (!pMainForm || !pMainForm->client())
266     return sends;
267    
268     #ifdef CONFIG_FXSEND
269     int *piSends = ::lscp_list_fxsends(pMainForm->client(), samplerChannelID);
270     if (!piSends) {
271     if (::lscp_client_get_errno(pMainForm->client()))
272     pMainForm->appendMessagesClient("lscp_list_fxsends");
273     } else {
274     for (int iSend = 0; piSends[iSend] >= 0; ++iSend)
275     sends.append(piSends[iSend]);
276     }
277     #endif // CONFIG_FXSEND
278    
279     return sends;
280     }
281    
282     } // namespace QSampler
283    
284     // end of qsamplerFxSend.cpp

  ViewVC Help
Powered by ViewVC