45 |
#include "qsamplerDeviceForm.h" |
#include "qsamplerDeviceForm.h" |
46 |
#include "qsamplerOptionsForm.h" |
#include "qsamplerOptionsForm.h" |
47 |
|
|
|
#include "config.h" |
|
|
|
|
48 |
#ifdef HAVE_SIGNAL_H |
#ifdef HAVE_SIGNAL_H |
49 |
#include <signal.h> |
#include <signal.h> |
50 |
#endif |
#endif |
385 |
// For the time being, just pump it to messages. |
// For the time being, just pump it to messages. |
386 |
if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) { |
if (pCustomEvent->type() == QSAMPLER_CUSTOM_EVENT) { |
387 |
qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent; |
qsamplerCustomEvent *pEvent = (qsamplerCustomEvent *) pCustomEvent; |
388 |
appendMessagesColor(tr("Notify event: %1 data: %2") |
if (pEvent->event() == LSCP_EVENT_CHANNEL_INFO) { |
389 |
.arg(::lscp_event_to_text(pEvent->event())) |
int iChannelID = pEvent->data().toInt(); |
390 |
.arg(pEvent->data()), "#996699"); |
qsamplerChannelStrip *pChannelStrip = channelStrip(iChannelID); |
391 |
|
if (pChannelStrip) |
392 |
|
channelStripChanged(pChannelStrip); |
393 |
|
} else { |
394 |
|
appendMessagesColor(tr("Notify event: %1 data: %2") |
395 |
|
.arg(::lscp_event_to_text(pEvent->event())) |
396 |
|
.arg(pEvent->data()), "#996699"); |
397 |
|
} |
398 |
} |
} |
399 |
} |
} |
400 |
|
|
471 |
|
|
472 |
// Ask for the filename to open... |
// Ask for the filename to open... |
473 |
QString sFilename = QFileDialog::getOpenFileName( |
QString sFilename = QFileDialog::getOpenFileName( |
474 |
m_pOptions->sSessionDir, // Start here. |
m_pOptions->sSessionDir, // Start here. |
475 |
tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files) |
tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files) |
476 |
this, 0, // Parent and name (none) |
this, 0, // Parent and name (none) |
477 |
tr("Open Session") // Caption. |
QSAMPLER_TITLE ": " + tr("Open Session") // Caption. |
478 |
); |
); |
479 |
|
|
480 |
// Have we cancelled? |
// Have we cancelled? |
505 |
sFilename = m_pOptions->sSessionDir; |
sFilename = m_pOptions->sSessionDir; |
506 |
// Prompt the guy... |
// Prompt the guy... |
507 |
sFilename = QFileDialog::getSaveFileName( |
sFilename = QFileDialog::getSaveFileName( |
508 |
sFilename, // Start here. |
sFilename, // Start here. |
509 |
tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files) |
tr("LSCP Session files") + " (*.lscp)", // Filter (LSCP files) |
510 |
this, 0, // Parent and name (none) |
this, 0, // Parent and name (none) |
511 |
tr("Save Session") // Caption. |
QSAMPLER_TITLE ": " + tr("Save Session") // Caption. |
512 |
); |
); |
513 |
// Have we cancelled it? |
// Have we cancelled it? |
514 |
if (sFilename.isEmpty()) |
if (sFilename.isEmpty()) |
518 |
sFilename += ".lscp"; |
sFilename += ".lscp"; |
519 |
// Check if already exists... |
// Check if already exists... |
520 |
if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) { |
if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) { |
521 |
if (QMessageBox::warning(this, tr("Warning"), |
if (QMessageBox::warning(this, |
522 |
|
QSAMPLER_TITLE ": " + tr("Warning"), |
523 |
tr("The file already exists:\n\n" |
tr("The file already exists:\n\n" |
524 |
"\"%1\"\n\n" |
"\"%1\"\n\n" |
525 |
"Do you want to replace it?") |
"Do you want to replace it?") |
541 |
|
|
542 |
// Are we dirty enough to prompt it? |
// Are we dirty enough to prompt it? |
543 |
if (m_iDirtyCount > 0) { |
if (m_iDirtyCount > 0) { |
544 |
switch (QMessageBox::warning(this, tr("Warning"), |
switch (QMessageBox::warning(this, |
545 |
|
QSAMPLER_TITLE ": " + tr("Warning"), |
546 |
tr("The current session has been changed:\n\n" |
tr("The current session has been changed:\n\n" |
547 |
"\"%1\"\n\n" |
"\"%1\"\n\n" |
548 |
"Do you want to save the changes?") |
"Do you want to save the changes?") |
787 |
ts << endl; |
ts << endl; |
788 |
ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl; |
ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl; |
789 |
ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl; |
ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl; |
790 |
|
qsamplerChannelRoutingMap::ConstIterator audioRoute; |
791 |
|
for (audioRoute = pChannel->audioRouting().begin(); |
792 |
|
audioRoute != pChannel->audioRouting().end(); |
793 |
|
++audioRoute) { |
794 |
|
ts << "SET CHANNEL AUDIO_OUTPUT_CHANNEL " << iChannel |
795 |
|
<< " " << audioRoute.key() |
796 |
|
<< " " << audioRoute.data() << endl; |
797 |
|
} |
798 |
ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl; |
ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl; |
799 |
|
if (pChannel->channelMute()) |
800 |
|
ts << "SET CHANNEL MUTE " << iChannel << " 1" << endl; |
801 |
|
if (pChannel->channelSolo()) |
802 |
|
ts << "SET CHANNEL SOLO " << iChannel << " 1" << endl; |
803 |
ts << endl; |
ts << endl; |
804 |
} |
} |
805 |
} |
} |
891 |
return; |
return; |
892 |
|
|
893 |
// Ask user whether he/she want's an internal sampler reset... |
// Ask user whether he/she want's an internal sampler reset... |
894 |
if (QMessageBox::warning(this, tr("Warning"), |
if (QMessageBox::warning(this, |
895 |
|
QSAMPLER_TITLE ": " + tr("Warning"), |
896 |
tr("Resetting the sampler instance will close\n" |
tr("Resetting the sampler instance will close\n" |
897 |
"all device and channel configurations.\n\n" |
"all device and channel configurations.\n\n" |
898 |
"Please note that this operation may cause\n" |
"Please note that this operation may cause\n" |
927 |
// Ask user whether he/she want's a complete restart... |
// Ask user whether he/she want's a complete restart... |
928 |
// (if we're currently up and running) |
// (if we're currently up and running) |
929 |
if (bRestart && m_pClient) { |
if (bRestart && m_pClient) { |
930 |
bRestart = (QMessageBox::warning(this, tr("Warning"), |
bRestart = (QMessageBox::warning(this, |
931 |
|
QSAMPLER_TITLE ": " + tr("Warning"), |
932 |
tr("New settings will be effective after\n" |
tr("New settings will be effective after\n" |
933 |
"restarting the client/server connection.\n\n" |
"restarting the client/server connection.\n\n" |
934 |
"Please note that this operation may cause\n" |
"Please note that this operation may cause\n" |
1004 |
|
|
1005 |
// Prompt user if he/she's sure about this... |
// Prompt user if he/she's sure about this... |
1006 |
if (m_pOptions && m_pOptions->bConfirmRemove) { |
if (m_pOptions && m_pOptions->bConfirmRemove) { |
1007 |
if (QMessageBox::warning(this, tr("Warning"), |
if (QMessageBox::warning(this, |
1008 |
|
QSAMPLER_TITLE ": " + tr("Warning"), |
1009 |
tr("About to remove channel:\n\n" |
tr("About to remove channel:\n\n" |
1010 |
"%1\n\n" |
"%1\n\n" |
1011 |
"Are you sure?") |
"Are you sure?") |
1188 |
(!bOldStdoutCapture && m_pOptions->bStdoutCapture) || |
(!bOldStdoutCapture && m_pOptions->bStdoutCapture) || |
1189 |
( bOldKeepOnTop && !m_pOptions->bKeepOnTop) || |
( bOldKeepOnTop && !m_pOptions->bKeepOnTop) || |
1190 |
(!bOldKeepOnTop && m_pOptions->bKeepOnTop)) { |
(!bOldKeepOnTop && m_pOptions->bKeepOnTop)) { |
1191 |
QMessageBox::information(this, tr("Information"), |
QMessageBox::information(this, |
1192 |
|
QSAMPLER_TITLE ": " + tr("Information"), |
1193 |
tr("Some settings may be only effective\n" |
tr("Some settings may be only effective\n" |
1194 |
"next time you start this program."), tr("OK")); |
"next time you start this program."), tr("OK")); |
1195 |
updateMessagesCapture(); |
updateMessagesCapture(); |
1317 |
sText += tr("LSCP (liblscp) instrument_name support disabled."); |
sText += tr("LSCP (liblscp) instrument_name support disabled."); |
1318 |
sText += "</font></small><br />"; |
sText += "</font></small><br />"; |
1319 |
#endif |
#endif |
1320 |
|
#ifndef CONFIG_MUTE_SOLO |
1321 |
|
sText += "<small><font color=\"red\">"; |
1322 |
|
sText += tr("Sampler channel Mute/Solo support disabled."); |
1323 |
|
sText += "</font></small><br />"; |
1324 |
|
#endif |
1325 |
sText += "<br />\n"; |
sText += "<br />\n"; |
1326 |
sText += tr("Using") + ": "; |
sText += tr("Using") + ": "; |
1327 |
sText += ::lscp_client_package(); |
sText += ::lscp_client_package(); |
1329 |
sText += ::lscp_client_version(); |
sText += ::lscp_client_version(); |
1330 |
#ifdef CONFIG_LIBGIG |
#ifdef CONFIG_LIBGIG |
1331 |
sText += ", "; |
sText += ", "; |
1332 |
sText += gig::libraryName(); |
sText += gig::libraryName().c_str(); |
1333 |
sText += " "; |
sText += " "; |
1334 |
sText += gig::libraryVersion(); |
sText += gig::libraryVersion().c_str(); |
1335 |
#endif |
#endif |
1336 |
sText += "<br />\n"; |
sText += "<br />\n"; |
1337 |
sText += "<br />\n"; |
sText += "<br />\n"; |
1621 |
|
|
1622 |
appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000"); |
appendMessagesColor(s.simplifyWhiteSpace(), "#ff0000"); |
1623 |
|
|
1624 |
QMessageBox::critical(this, tr("Error"), s, tr("Cancel")); |
QMessageBox::critical(this, |
1625 |
|
QSAMPLER_TITLE ": " + tr("Error"), s, tr("Cancel")); |
1626 |
} |
} |
1627 |
|
|
1628 |
|
|
1662 |
if (m_pOptions->bMessagesLimit) |
if (m_pOptions->bMessagesLimit) |
1663 |
m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines); |
m_pMessages->setMessagesLimit(m_pOptions->iMessagesLimitLines); |
1664 |
else |
else |
1665 |
m_pMessages->setMessagesLimit(0); |
m_pMessages->setMessagesLimit(-1); |
1666 |
} |
} |
1667 |
} |
} |
1668 |
|
|
1846 |
} |
} |
1847 |
} |
} |
1848 |
|
|
1849 |
// Refresh each channel usage, on each period... |
if (m_pClient) { |
1850 |
if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) { |
// Update the channel information for each pending strip... |
1851 |
m_iTimerSlot += QSAMPLER_TIMER_MSECS; |
if (m_changedStrips.count() > 0) { |
|
if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled()) { |
|
|
m_iTimerSlot = 0; |
|
|
// Update the channel information for each pending strip... |
|
1852 |
for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first(); |
for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first(); |
1853 |
pChannelStrip; |
pChannelStrip; pChannelStrip = m_changedStrips.next()) { |
|
pChannelStrip = m_changedStrips.next()) { |
|
1854 |
// If successfull, remove from pending list... |
// If successfull, remove from pending list... |
1855 |
if (pChannelStrip->updateChannelInfo()) |
if (pChannelStrip->updateChannelInfo()) |
1856 |
m_changedStrips.remove(pChannelStrip); |
m_changedStrips.remove(pChannelStrip); |
1857 |
} |
} |
1858 |
// Update the channel stream usage for each strip... |
} |
1859 |
QWidgetList wlist = m_pWorkspace->windowList(); |
// Refresh each channel usage, on each period... |
1860 |
for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) { |
if (m_pOptions->bAutoRefresh) { |
1861 |
qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel); |
m_iTimerSlot += QSAMPLER_TIMER_MSECS; |
1862 |
if (pChannelStrip && pChannelStrip->isVisible()) |
if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime) { |
1863 |
pChannelStrip->updateChannelUsage(); |
m_iTimerSlot = 0; |
1864 |
|
// Update the channel stream usage for each strip... |
1865 |
|
QWidgetList wlist = m_pWorkspace->windowList(); |
1866 |
|
for (int iChannel = 0; |
1867 |
|
iChannel < (int) wlist.count(); iChannel++) { |
1868 |
|
qsamplerChannelStrip *pChannelStrip |
1869 |
|
= (qsamplerChannelStrip *) wlist.at(iChannel); |
1870 |
|
if (pChannelStrip && pChannelStrip->isVisible()) |
1871 |
|
pChannelStrip->updateChannelUsage(); |
1872 |
|
} |
1873 |
} |
} |
1874 |
} |
} |
1875 |
} |
} |
1894 |
|
|
1895 |
// Is the server process instance still here? |
// Is the server process instance still here? |
1896 |
if (m_pServer) { |
if (m_pServer) { |
1897 |
switch (QMessageBox::warning(this, tr("Warning"), |
switch (QMessageBox::warning(this, |
1898 |
|
QSAMPLER_TITLE ": " + tr("Warning"), |
1899 |
tr("Could not start the LinuxSampler server.\n\n" |
tr("Could not start the LinuxSampler server.\n\n" |
1900 |
"Maybe it ss already started."), |
"Maybe it ss already started."), |
1901 |
tr("Stop"), tr("Kill"), tr("Cancel"))) { |
tr("Stop"), tr("Kill"), tr("Cancel"))) { |
2054 |
::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout); |
::lscp_client_set_timeout(m_pClient, m_pOptions->iServerTimeout); |
2055 |
appendMessages(tr("Client receive timeout is set to %1 msec.").arg(::lscp_client_get_timeout(m_pClient))); |
appendMessages(tr("Client receive timeout is set to %1 msec.").arg(::lscp_client_get_timeout(m_pClient))); |
2056 |
|
|
2057 |
|
// Subscribe to channel info change notifications... |
2058 |
|
if (::lscp_client_subscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO) != LSCP_OK) |
2059 |
|
appendMessagesClient("lscp_client_subscribe"); |
2060 |
|
|
2061 |
// We may stop scheduling around. |
// We may stop scheduling around. |
2062 |
stopSchedule(); |
stopSchedule(); |
2063 |
|
|
2071 |
// if visible, that we're ready... |
// if visible, that we're ready... |
2072 |
if (m_pDeviceForm && m_pDeviceForm->isVisible()) |
if (m_pDeviceForm && m_pDeviceForm->isVisible()) |
2073 |
m_pDeviceForm->setClient(m_pClient); |
m_pDeviceForm->setClient(m_pClient); |
2074 |
|
|
2075 |
// Is any session pending to be loaded? |
// Is any session pending to be loaded? |
2076 |
if (!m_pOptions->sSessionFile.isEmpty()) { |
if (!m_pOptions->sSessionFile.isEmpty()) { |
2077 |
// Just load the prabably startup session... |
// Just load the prabably startup session... |
2113 |
closeSession(false); |
closeSession(false); |
2114 |
|
|
2115 |
// Close us as a client... |
// Close us as a client... |
2116 |
lscp_client_destroy(m_pClient); |
::lscp_client_unsubscribe(m_pClient, LSCP_EVENT_CHANNEL_INFO); |
2117 |
|
::lscp_client_destroy(m_pClient); |
2118 |
m_pClient = NULL; |
m_pClient = NULL; |
2119 |
|
|
2120 |
// Log final here. |
// Log final here. |