54 |
#define QSAMPLER_STATUS_SESSION 3 // Current session modification state. |
#define QSAMPLER_STATUS_SESSION 3 // Current session modification state. |
55 |
|
|
56 |
|
|
57 |
|
// All winsock apps needs this. |
58 |
#if defined(WIN32) |
#if defined(WIN32) |
59 |
static WSADATA _wsaData; |
static WSADATA _wsaData; |
60 |
#endif |
#endif |
61 |
|
|
62 |
|
|
63 |
|
//------------------------------------------------------------------------- |
64 |
|
// qsamplerCustomEvent -- specialty for callback comunication. |
65 |
|
|
66 |
|
#define QSAMPLER_CUSTOM_EVENT 1000 |
67 |
|
|
68 |
|
class qsamplerCustomEvent : public QCustomEvent |
69 |
|
{ |
70 |
|
public: |
71 |
|
|
72 |
|
// Constructor. |
73 |
|
qsamplerCustomEvent(lscp_event_t event, const char *pchData, int cchData) |
74 |
|
: QCustomEvent(QSAMPLER_CUSTOM_EVENT) |
75 |
|
{ |
76 |
|
m_event = event; |
77 |
|
m_data.setLatin1(pchData, cchData); |
78 |
|
} |
79 |
|
|
80 |
|
// Accessors. |
81 |
|
lscp_event_t event() { return m_event; } |
82 |
|
QString& data() { return m_data; } |
83 |
|
|
84 |
|
private: |
85 |
|
|
86 |
|
// The proper event type. |
87 |
|
lscp_event_t m_event; |
88 |
|
// The event data as a string. |
89 |
|
QString m_data; |
90 |
|
}; |
91 |
|
|
92 |
|
|
93 |
//------------------------------------------------------------------------- |
//------------------------------------------------------------------------- |
94 |
// qsamplerMainForm -- Main window form implementation. |
// qsamplerMainForm -- Main window form implementation. |
95 |
|
|
284 |
} |
} |
285 |
|
|
286 |
|
|
287 |
|
// Window drag-n-drop event handlers. |
288 |
void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent ) |
void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent ) |
289 |
{ |
{ |
290 |
bool bAccept = false; |
bool bAccept = false; |
309 |
} |
} |
310 |
|
|
311 |
|
|
312 |
|
// Custome event handler. |
313 |
|
void qsamplerMainForm::customEvent ( QCustomEvent *pCustomEvent ) |
314 |
|
{ |
315 |
|
// For the time being, just pump it to messages. |
316 |
|
if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) { |
317 |
|
qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent; |
318 |
|
appendMessagesColor(tr("Notify event: %1 data: %2") |
319 |
|
.arg(::lscp_event_to_text(pEvent->event())) |
320 |
|
.arg(pEvent->data()), "#996699"); |
321 |
|
} |
322 |
|
} |
323 |
|
|
324 |
|
|
325 |
|
// Context menu event handler. |
326 |
|
void qsamplerMainForm::contextMenuEvent( QContextMenuEvent *pEvent ) |
327 |
|
{ |
328 |
|
stabilizeForm(); |
329 |
|
|
330 |
|
editMenu->exec(pEvent->globalPos()); |
331 |
|
} |
332 |
|
|
333 |
|
|
334 |
//------------------------------------------------------------------------- |
//------------------------------------------------------------------------- |
335 |
// qsamplerMainForm -- Brainless public property accessors. |
// qsamplerMainForm -- Brainless public property accessors. |
336 |
|
|
601 |
ts << "ADD CHANNEL" << endl; |
ts << "ADD CHANNEL" << endl; |
602 |
ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl; |
ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl; |
603 |
ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl; |
ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl; |
604 |
// ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl; |
ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl; |
605 |
ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " " << pChannel->midiChannel() << endl; |
ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " "; |
606 |
|
if (pChannel->midiChannel() > 0) |
607 |
|
ts << pChannel->midiChannel(); |
608 |
|
else |
609 |
|
ts << "ALL"; |
610 |
|
ts << endl; |
611 |
ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl; |
ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl; |
612 |
ts << "LOAD INSTRUMENT " << pChannel->instrumentFile() << " " << pChannel->instrumentNr() << " " << iChannelID << endl; |
ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannelID << endl; |
613 |
ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl; |
ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl; |
614 |
ts << endl; |
ts << endl; |
615 |
// Try to keep it snappy :) |
// Try to keep it snappy :) |
683 |
} |
} |
684 |
|
|
685 |
|
|
686 |
|
// Reset the sampler instance. |
687 |
|
void qsamplerMainForm::fileReset (void) |
688 |
|
{ |
689 |
|
if (m_pClient == NULL) |
690 |
|
return; |
691 |
|
|
692 |
|
// Ask user whether he/she want's an internal sampler reset... |
693 |
|
if (QMessageBox::warning(this, tr("Warning"), |
694 |
|
tr("Resetting the sampler instance will close\n" |
695 |
|
"all device and channel configurations.\n\n" |
696 |
|
"Please note that this operation may cause\n" |
697 |
|
"temporary MIDI and Audio disruption\n\n" |
698 |
|
"Do you want to reset the sampler engine now?"), |
699 |
|
tr("Reset"), tr("Cancel")) > 0) |
700 |
|
return; |
701 |
|
|
702 |
|
// Just do the reset, after closing down current session... |
703 |
|
if (closeSession(true) && ::lscp_reset_sampler(m_pClient) != LSCP_OK) { |
704 |
|
appendMessagesClient("lscp_reset_sampler"); |
705 |
|
appendMessagesError(tr("Could not reset sampler instance.\n\nSorry.")); |
706 |
|
return; |
707 |
|
} |
708 |
|
|
709 |
|
// Log this. |
710 |
|
appendMessages(tr("Sampler reset.")); |
711 |
|
} |
712 |
|
|
713 |
|
|
714 |
// Restart the client/server instance. |
// Restart the client/server instance. |
715 |
void qsamplerMainForm::fileRestart (void) |
void qsamplerMainForm::fileRestart (void) |
716 |
{ |
{ |
833 |
return; |
return; |
834 |
|
|
835 |
// Just invoque the channel strip procedure. |
// Just invoque the channel strip procedure. |
836 |
pChannel->channelSetup(); |
pChannel->channelSetup(false); |
837 |
} |
} |
838 |
|
|
839 |
|
|
1057 |
sText += tr("Debugging option enabled."); |
sText += tr("Debugging option enabled."); |
1058 |
sText += "</font></small><br />"; |
sText += "</font></small><br />"; |
1059 |
#endif |
#endif |
1060 |
|
#ifndef CONFIG_LIBGIG |
1061 |
|
sText += "<small><font color=\"red\">"; |
1062 |
|
sText += tr("GIG (libgig) file support disabled."); |
1063 |
|
sText += "</font></small><br />"; |
1064 |
|
#endif |
1065 |
sText += "<br />\n"; |
sText += "<br />\n"; |
1066 |
sText += tr("Using") + ": "; |
sText += tr("Using") + ": "; |
1067 |
sText += ::lscp_client_package(); |
sText += ::lscp_client_package(); |
1102 |
fileOpenAction->setEnabled(bHasClient); |
fileOpenAction->setEnabled(bHasClient); |
1103 |
fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0); |
fileSaveAction->setEnabled(bHasClient && m_iDirtyCount > 0); |
1104 |
fileSaveAsAction->setEnabled(bHasClient); |
fileSaveAsAction->setEnabled(bHasClient); |
1105 |
|
fileResetAction->setEnabled(bHasClient); |
1106 |
fileRestartAction->setEnabled(bHasClient || m_pServer == NULL); |
fileRestartAction->setEnabled(bHasClient || m_pServer == NULL); |
1107 |
editAddChannelAction->setEnabled(bHasClient); |
editAddChannelAction->setEnabled(bHasClient); |
1108 |
editRemoveChannelAction->setEnabled(bHasChannel); |
editRemoveChannelAction->setEnabled(bHasChannel); |
1365 |
// Before we show it up, may be we'll |
// Before we show it up, may be we'll |
1366 |
// better ask for some initial values? |
// better ask for some initial values? |
1367 |
if (bPrompt) |
if (bPrompt) |
1368 |
pChannel->channelSetup(); |
pChannel->channelSetup(true); |
1369 |
// Now we show up us to the world. |
// Now we show up us to the world. |
1370 |
pChannel->show(); |
pChannel->show(); |
1371 |
// Only then, we'll auto-arrange... |
// Only then, we'll auto-arrange... |
1607 |
//------------------------------------------------------------------------- |
//------------------------------------------------------------------------- |
1608 |
// qsamplerMainForm -- Client stuff. |
// qsamplerMainForm -- Client stuff. |
1609 |
|
|
|
|
|
1610 |
// The LSCP client callback procedure. |
// The LSCP client callback procedure. |
1611 |
lscp_status_t qsampler_client_callback ( lscp_client_t *pClient, const char *pchBuffer, int cchBuffer, void *pvData ) |
lscp_status_t qsampler_client_callback ( lscp_client_t */*pClient*/, lscp_event_t event, const char *pchData, int cchData, void *pvData ) |
1612 |
{ |
{ |
1613 |
qsamplerMainForm *pMainForm = (qsamplerMainForm *) pvData; |
qsamplerMainForm *pMainForm = (qsamplerMainForm *) pvData; |
1614 |
if (pMainForm == NULL) |
if (pMainForm == NULL) |
1615 |
return LSCP_FAILED; |
return LSCP_FAILED; |
1616 |
|
|
1617 |
char *pszBuffer = (char *) malloc(cchBuffer + 1); |
// ATTN: DO NOT EVER call any GUI code here, |
1618 |
if (pszBuffer == NULL) |
// as this is run under some other thread context. |
1619 |
return LSCP_FAILED; |
// A custom event must be posted here... |
1620 |
|
QApplication::postEvent(pMainForm, new qsamplerCustomEvent(event, pchData, cchData)); |
|
memcpy(pszBuffer, pchBuffer, cchBuffer); |
|
|
pszBuffer[cchBuffer] = (char) 0; |
|
|
pMainForm->appendMessagesColor(pszBuffer, "#996699"); |
|
|
free(pszBuffer); |
|
1621 |
|
|
1622 |
return LSCP_OK; |
return LSCP_OK; |
1623 |
} |
} |