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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 297 - (show annotations) (download) (as text)
Wed Nov 17 12:40:25 2004 UTC (15 years, 7 months ago) by capela
File MIME type: text/x-c++hdr
File size: 9202 byte(s)
Deferred channel info update fix.

1 // 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 #include <qpopupmenu.h>
28 #include <qobjectlist.h>
29
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 m_pMainForm = NULL;
43 m_pChannel = NULL;
44 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 // Destroy existing channel descriptor.
55 if (m_pChannel)
56 delete m_pChannel;
57 m_pChannel = NULL;
58 }
59
60
61 // Channel strip setup formal initializer.
62 void qsamplerChannelStrip::setup ( qsamplerMainForm *pMainForm, int iChannelID )
63 {
64 // Set main form reference.
65 m_pMainForm = pMainForm;
66
67 // Destroy any previous channel descriptor.
68 if (m_pChannel)
69 delete m_pChannel;
70
71 // Create a new one...
72 m_pChannel = new qsamplerChannel(pMainForm);
73 // And set appropriate settings.
74 if (m_pChannel && iChannelID >= 0) {
75 m_pChannel->setChannelID(iChannelID);
76 m_iDirtyChange = 0;
77 }
78
79 // Stabilize this around.
80 updateChannelInfo();
81 }
82
83 // Channel secriptor accessor.
84 qsamplerChannel *qsamplerChannelStrip::channel (void)
85 {
86 return m_pChannel;
87 }
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 MidiPortChannelTextLabel->setFont(font);
100 InstrumentNameTextLabel->setFont(font);
101 InstrumentStatusTextLabel->setFont(font);
102 }
103
104
105 // 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 // Channel setup dialog slot.
135 bool qsamplerChannelStrip::channelSetup (void)
136 {
137 bool bResult = false;
138
139 qsamplerChannelForm *pChannelForm = new qsamplerChannelForm(this);
140 if (pChannelForm) {
141 pChannelForm->setup(m_pChannel);
142 bResult = pChannelForm->exec();
143 delete pChannelForm;
144 }
145
146 if (bResult)
147 emit channelChanged(this);
148
149 return bResult;
150 }
151
152
153 // Update whole channel info state.
154 bool qsamplerChannelStrip::updateChannelInfo (void)
155 {
156 if (m_pChannel == NULL)
157 return false;
158
159 // Update strip caption.
160 QString sText = m_pChannel->channelName();
161 setCaption(sText);
162 ChannelSetupPushButton->setText(sText);
163
164 // Check if we're up and connected.
165 if (m_pChannel->client() == NULL)
166 return false;
167
168 // Read actual channel information.
169 m_pChannel->updateChannelInfo();
170
171 // Set some proper display values.
172 const QString sIndent = " ";
173
174 // Engine name...
175 if (m_pChannel->engineName().isEmpty())
176 EngineNameTextLabel->setText(sIndent + tr("(No engine)"));
177 else
178 EngineNameTextLabel->setText(sIndent + m_pChannel->engineName());
179
180 // Instrument name...
181 if (m_pChannel->instrumentFile().isEmpty())
182 InstrumentNameTextLabel->setText(sIndent + tr("(No instrument)"));
183 else
184 InstrumentNameTextLabel->setText(sIndent + QString("%1 [%2]")
185 .arg(QFileInfo(m_pChannel->instrumentFile()).fileName()).arg(m_pChannel->instrumentNr()));
186
187 // Instrument status...
188 int iInstrumentStatus = m_pChannel->instrumentStatus();
189 if (iInstrumentStatus < 0) {
190 InstrumentStatusTextLabel->setPaletteForegroundColor(Qt::red);
191 InstrumentStatusTextLabel->setText(tr("ERR%1").arg(iInstrumentStatus));
192 } else {
193 InstrumentStatusTextLabel->setPaletteForegroundColor(iInstrumentStatus < 100 ? Qt::yellow : Qt::green);
194 InstrumentStatusTextLabel->setText(QString::number(iInstrumentStatus) + "%");
195 }
196
197 // MIDI Port/Channel...
198 if (m_pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
199 MidiPortChannelTextLabel->setText(QString("%1 / *").arg(m_pChannel->midiPort()));
200 else
201 MidiPortChannelTextLabel->setText(QString("%1 / %2").arg(m_pChannel->midiPort()).arg(m_pChannel->midiChannel() + 1));
202
203 // And update the both GUI volume elements.
204 return updateChannelVolume();
205 }
206
207
208 // Do the dirty volume change.
209 bool qsamplerChannelStrip::updateChannelVolume (void)
210 {
211 if (m_pChannel == NULL)
212 return false;
213
214 // Convert...
215 #ifdef CONFIG_ROUND
216 int iVolume = (int) ::round(100.0 * m_pChannel->volume());
217 #else
218 double fIPart = 0.0;
219 double fFPart = ::modf(100.0 * m_pChannel->volume(), &fIPart);
220 int iVolume = (int) fIPart;
221 if (fFPart >= +0.5)
222 iVolume++;
223 else
224 if (fFPart <= -0.5)
225 iVolume--;
226 #endif
227
228 // And clip...
229 if (iVolume < 0)
230 iVolume = 0;
231
232 // Flag it here, to avoid infinite recursion.
233 m_iDirtyChange++;
234 VolumeSlider->setValue(iVolume);
235 VolumeSpinBox->setValue(iVolume);
236 m_iDirtyChange--;
237
238 return true;
239 }
240
241
242 // Update whole channel usage state.
243 bool qsamplerChannelStrip::updateChannelUsage (void)
244 {
245 if (m_pChannel == NULL)
246 return false;
247 if (m_pChannel->client() == NULL)
248 return false;
249
250 // Conditionally update whole channel status info.
251 if (m_pChannel->instrumentStatus() >= 0 && m_pChannel->instrumentStatus() < 100) {
252 updateChannelInfo();
253 // Once we get a complete instrument load, try a implied reset channel....
254 if (m_pChannel->instrumentStatus() == 100)
255 m_pChannel->resetChannel();
256 }
257 // Leave, if we still have an erroneus or incomplete instrument load.
258 if (m_pChannel->instrumentStatus() < 100)
259 return false;
260
261 // Get current channel voice count.
262 int iVoiceCount = ::lscp_get_channel_voice_count(m_pChannel->client(), m_pChannel->channelID());
263 // Get current stream count.
264 int iStreamCount = ::lscp_get_channel_stream_count(m_pChannel->client(), m_pChannel->channelID());
265 // Get current channel buffer fill usage.
266 // As benno has suggested this is the percentage usage
267 // of the least filled buffer stream...
268 int iStreamUsage = ::lscp_get_channel_stream_usage(m_pChannel->client(), m_pChannel->channelID());;
269
270 // Update the GUI elements...
271 StreamUsageProgressBar->setProgress(iStreamUsage);
272 StreamVoiceCountTextLabel->setText(QString("%1 / %2").arg(iStreamCount).arg(iVoiceCount));
273
274 // We're clean.
275 return true;
276 }
277
278
279 // Volume change slot.
280 void qsamplerChannelStrip::volumeChanged ( int iVolume )
281 {
282 if (m_pChannel == NULL)
283 return;
284
285 // Avoid recursion.
286 if (m_iDirtyChange > 0)
287 return;
288
289 // Convert and clip.
290 float fVolume = (float) iVolume / 100.0;
291 if (fVolume < 0.001)
292 fVolume = 0.0;
293
294 // Update the GUI elements.
295 if (m_pChannel->setVolume(fVolume)) {
296 updateChannelVolume();
297 emit channelChanged(this);
298 }
299 }
300
301
302 // Context menu event handler.
303 void qsamplerChannelStrip::contextMenuEvent( QContextMenuEvent *pEvent )
304 {
305 if (m_pMainForm == NULL)
306 return;
307
308 // We'll just show up the main form's edit menu.
309 m_pMainForm->contextMenuEvent(pEvent);
310 }
311
312
313 // Maximum volume slider accessors.
314 void qsamplerChannelStrip::setMaxVolume ( int iMaxVolume )
315 {
316 m_iDirtyChange++;
317 VolumeSlider->setRange(0, iMaxVolume);
318 VolumeSpinBox->setRange(0, iMaxVolume);
319 m_iDirtyChange--;
320 }
321
322
323 // end of qsamplerChannelStrip.ui.h

  ViewVC Help
Powered by ViewVC