/[svn]/qsampler/trunk/src/qsamplerChannelStrip.ui.h
ViewVC logotype

Annotation of /qsampler/trunk/src/qsamplerChannelStrip.ui.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 299 - (hide annotations) (download) (as text)
Wed Nov 17 15:41:58 2004 UTC (19 years, 4 months ago) by capela
File MIME type: text/x-c++hdr
File size: 9175 byte(s)
* Instrument index selection now made via combo box widget;
  actual instrument names are now properly retrieved from
  the instrument file, provided if libgig is available.

1 capela 109 // qsamplerChannelStrip.ui.h
2     //
3     // ui.h extension file, included from the uic-generated form implementation.
4     /****************************************************************************
5     Copyright (C) 2004, rncbc aka Rui Nuno Capela. All rights reserved.
6    
7     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License
9     as published by the Free Software Foundation; either version 2
10     of the License, or (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20    
21     *****************************************************************************/
22    
23     #include <qvalidator.h>
24     #include <qmessagebox.h>
25     #include <qfileinfo.h>
26     #include <qtooltip.h>
27 capela 118 #include <qpopupmenu.h>
28 capela 267 #include <qobjectlist.h>
29 capela 109
30     #include <math.h>
31    
32     #include "qsamplerMainForm.h"
33     #include "qsamplerChannelForm.h"
34    
35     #include "config.h"
36    
37    
38     // Kind of constructor.
39     void qsamplerChannelStrip::init (void)
40     {
41     // Initialize locals.
42 capela 264 m_pMainForm = NULL;
43     m_pChannel = NULL;
44 capela 109 m_iDirtyChange = 0;
45    
46     // Try to restore normal window positioning.
47     adjustSize();
48     }
49    
50    
51     // Kind of destructor.
52     void qsamplerChannelStrip::destroy (void)
53     {
54 capela 264 // Destroy existing channel descriptor.
55     if (m_pChannel)
56     delete m_pChannel;
57     m_pChannel = NULL;
58 capela 109 }
59    
60    
61     // Channel strip setup formal initializer.
62     void qsamplerChannelStrip::setup ( qsamplerMainForm *pMainForm, int iChannelID )
63     {
64 capela 264 // Set main form reference.
65 capela 109 m_pMainForm = pMainForm;
66 capela 145
67 capela 264 // Destroy any previous channel descriptor.
68     if (m_pChannel)
69     delete m_pChannel;
70 capela 109
71 capela 264 // Create a new one...
72     m_pChannel = new qsamplerChannel(pMainForm);
73     // And set appropriate settings.
74 capela 295 if (m_pChannel && iChannelID >= 0) {
75 capela 264 m_pChannel->setChannelID(iChannelID);
76     m_iDirtyChange = 0;
77 capela 109 }
78 capela 265
79     // Stabilize this around.
80     updateChannelInfo();
81 capela 109 }
82    
83 capela 264 // Channel secriptor accessor.
84     qsamplerChannel *qsamplerChannelStrip::channel (void)
85 capela 109 {
86 capela 264 return m_pChannel;
87 capela 109 }
88    
89    
90     // Messages view font accessors.
91     QFont qsamplerChannelStrip::displayFont (void)
92     {
93     return EngineNameTextLabel->font();
94     }
95    
96     void qsamplerChannelStrip::setDisplayFont ( const QFont & font )
97     {
98     EngineNameTextLabel->setFont(font);
99 capela 145 MidiPortChannelTextLabel->setFont(font);
100 capela 109 InstrumentNameTextLabel->setFont(font);
101 capela 145 InstrumentStatusTextLabel->setFont(font);
102 capela 109 }
103    
104 capela 263
105 capela 267 // Channel display background effect.
106     void qsamplerChannelStrip::setDisplayEffect ( bool bDisplayEffect )
107     {
108     QPixmap pm;
109     if (bDisplayEffect)
110     pm = QPixmap::fromMimeSource("displaybg1.png");
111     setDisplayBackground(pm);
112     }
113    
114    
115     // Update main display background pixmap.
116     void qsamplerChannelStrip::setDisplayBackground ( const QPixmap& pm )
117     {
118     // Set the main origin...
119     ChannelInfoFrame->setPaletteBackgroundPixmap(pm);
120    
121     // Iterate for every child text label...
122     QObjectList *pList = ChannelInfoFrame->queryList("QLabel");
123     if (pList) {
124     for (QLabel *pLabel = (QLabel *) pList->first(); pLabel; pLabel = (QLabel *) pList->next())
125     pLabel->setPaletteBackgroundPixmap(pm);
126     delete pList;
127     }
128    
129     // And this standalone too.
130     StreamVoiceCountTextLabel->setPaletteBackgroundPixmap(pm);
131     }
132    
133    
134 capela 263 // Channel setup dialog slot.
135 capela 295 bool qsamplerChannelStrip::channelSetup (void)
136 capela 263 {
137 capela 295 bool bResult = false;
138 capela 263
139 capela 109 qsamplerChannelForm *pChannelForm = new qsamplerChannelForm(this);
140     if (pChannelForm) {
141 capela 295 pChannelForm->setup(m_pChannel);
142     bResult = pChannelForm->exec();
143 capela 109 delete pChannelForm;
144     }
145 capela 295
146 capela 296 if (bResult)
147 capela 295 emit channelChanged(this);
148    
149     return bResult;
150 capela 109 }
151    
152    
153     // Update whole channel info state.
154 capela 297 bool qsamplerChannelStrip::updateChannelInfo (void)
155 capela 109 {
156 capela 264 if (m_pChannel == NULL)
157 capela 297 return false;
158 capela 264
159 capela 109 // Update strip caption.
160 capela 295 QString sText = m_pChannel->channelName();
161 capela 109 setCaption(sText);
162     ChannelSetupPushButton->setText(sText);
163    
164     // Check if we're up and connected.
165 capela 264 if (m_pChannel->client() == NULL)
166 capela 297 return false;
167 capela 109
168 capela 264 // Read actual channel information.
169     m_pChannel->updateChannelInfo();
170 capela 109
171     // Set some proper display values.
172 capela 261 const QString sIndent = " ";
173 capela 109
174     // Engine name...
175 capela 264 if (m_pChannel->engineName().isEmpty())
176 capela 261 EngineNameTextLabel->setText(sIndent + tr("(No engine)"));
177 capela 109 else
178 capela 264 EngineNameTextLabel->setText(sIndent + m_pChannel->engineName());
179 capela 109
180     // Instrument name...
181 capela 264 if (m_pChannel->instrumentFile().isEmpty())
182 capela 261 InstrumentNameTextLabel->setText(sIndent + tr("(No instrument)"));
183 capela 109 else
184 capela 299 InstrumentNameTextLabel->setText(sIndent + qsamplerChannel::getInstrumentName(m_pChannel->instrumentFile(), m_pChannel->instrumentNr()));
185 capela 109
186 capela 145 // Instrument status...
187 capela 264 int iInstrumentStatus = m_pChannel->instrumentStatus();
188     if (iInstrumentStatus < 0) {
189 capela 145 InstrumentStatusTextLabel->setPaletteForegroundColor(Qt::red);
190 capela 264 InstrumentStatusTextLabel->setText(tr("ERR%1").arg(iInstrumentStatus));
191 capela 145 } else {
192 capela 264 InstrumentStatusTextLabel->setPaletteForegroundColor(iInstrumentStatus < 100 ? Qt::yellow : Qt::green);
193     InstrumentStatusTextLabel->setText(QString::number(iInstrumentStatus) + "%");
194 capela 145 }
195    
196 capela 109 // MIDI Port/Channel...
197 capela 280 if (m_pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
198     MidiPortChannelTextLabel->setText(QString("%1 / *").arg(m_pChannel->midiPort()));
199 capela 261 else
200 capela 280 MidiPortChannelTextLabel->setText(QString("%1 / %2").arg(m_pChannel->midiPort()).arg(m_pChannel->midiChannel() + 1));
201 capela 261
202 capela 109 // And update the both GUI volume elements.
203 capela 297 return updateChannelVolume();
204 capela 109 }
205    
206    
207     // Do the dirty volume change.
208 capela 297 bool qsamplerChannelStrip::updateChannelVolume (void)
209 capela 109 {
210 capela 264 if (m_pChannel == NULL)
211 capela 297 return false;
212 capela 264
213 capela 109 // Convert...
214     #ifdef CONFIG_ROUND
215 capela 264 int iVolume = (int) ::round(100.0 * m_pChannel->volume());
216 capela 109 #else
217     double fIPart = 0.0;
218 capela 264 double fFPart = ::modf(100.0 * m_pChannel->volume(), &fIPart);
219 capela 109 int iVolume = (int) fIPart;
220     if (fFPart >= +0.5)
221     iVolume++;
222     else
223     if (fFPart <= -0.5)
224     iVolume--;
225     #endif
226    
227     // And clip...
228 capela 119 if (iVolume < 0)
229 capela 109 iVolume = 0;
230    
231     // Flag it here, to avoid infinite recursion.
232     m_iDirtyChange++;
233     VolumeSlider->setValue(iVolume);
234     VolumeSpinBox->setValue(iVolume);
235     m_iDirtyChange--;
236 capela 297
237     return true;
238 capela 109 }
239    
240    
241     // Update whole channel usage state.
242 capela 297 bool qsamplerChannelStrip::updateChannelUsage (void)
243 capela 109 {
244 capela 264 if (m_pChannel == NULL)
245 capela 297 return false;
246 capela 264 if (m_pChannel->client() == NULL)
247 capela 297 return false;
248 capela 109
249 capela 145 // Conditionally update whole channel status info.
250 capela 264 if (m_pChannel->instrumentStatus() >= 0 && m_pChannel->instrumentStatus() < 100) {
251 capela 145 updateChannelInfo();
252 capela 176 // Once we get a complete instrument load, try a implied reset channel....
253 capela 264 if (m_pChannel->instrumentStatus() == 100)
254     m_pChannel->resetChannel();
255 capela 176 }
256 capela 152 // Leave, if we still have an erroneus or incomplete instrument load.
257 capela 264 if (m_pChannel->instrumentStatus() < 100)
258 capela 297 return false;
259 capela 145
260 capela 109 // Get current channel voice count.
261 capela 264 int iVoiceCount = ::lscp_get_channel_voice_count(m_pChannel->client(), m_pChannel->channelID());
262 capela 109 // Get current stream count.
263 capela 264 int iStreamCount = ::lscp_get_channel_stream_count(m_pChannel->client(), m_pChannel->channelID());
264 capela 109 // Get current channel buffer fill usage.
265     // As benno has suggested this is the percentage usage
266     // of the least filled buffer stream...
267 capela 264 int iStreamUsage = ::lscp_get_channel_stream_usage(m_pChannel->client(), m_pChannel->channelID());;
268 capela 176
269 capela 109 // Update the GUI elements...
270     StreamUsageProgressBar->setProgress(iStreamUsage);
271     StreamVoiceCountTextLabel->setText(QString("%1 / %2").arg(iStreamCount).arg(iVoiceCount));
272 capela 297
273     // We're clean.
274     return true;
275 capela 109 }
276    
277    
278     // Volume change slot.
279     void qsamplerChannelStrip::volumeChanged ( int iVolume )
280     {
281 capela 264 if (m_pChannel == NULL)
282     return;
283    
284 capela 109 // Avoid recursion.
285     if (m_iDirtyChange > 0)
286     return;
287    
288     // Convert and clip.
289     float fVolume = (float) iVolume / 100.0;
290 capela 119 if (fVolume < 0.001)
291 capela 109 fVolume = 0.0;
292    
293     // Update the GUI elements.
294 capela 264 if (m_pChannel->setVolume(fVolume)) {
295 capela 109 updateChannelVolume();
296     emit channelChanged(this);
297     }
298     }
299    
300    
301 capela 118 // Context menu event handler.
302     void qsamplerChannelStrip::contextMenuEvent( QContextMenuEvent *pEvent )
303     {
304 capela 264 if (m_pMainForm == NULL)
305     return;
306    
307 capela 118 // We'll just show up the main form's edit menu.
308 capela 127 m_pMainForm->contextMenuEvent(pEvent);
309 capela 118 }
310    
311    
312 capela 119 // Maximum volume slider accessors.
313     void qsamplerChannelStrip::setMaxVolume ( int iMaxVolume )
314     {
315     m_iDirtyChange++;
316     VolumeSlider->setRange(0, iMaxVolume);
317     VolumeSpinBox->setRange(0, iMaxVolume);
318     m_iDirtyChange--;
319     }
320    
321    
322 capela 109 // end of qsamplerChannelStrip.ui.h

  ViewVC Help
Powered by ViewVC