19 |
|
|
20 |
*****************************************************************************/ |
*****************************************************************************/ |
21 |
|
|
22 |
|
#include "qsamplerAbout.h" |
23 |
#include "qsamplerChannel.h" |
#include "qsamplerChannel.h" |
24 |
|
|
25 |
#include "qsamplerMainForm.h" |
#include "qsamplerMainForm.h" |
26 |
#include "qsamplerChannelForm.h" |
#include "qsamplerChannelForm.h" |
27 |
|
|
|
#include "config.h" |
|
|
|
|
28 |
#include <qfileinfo.h> |
#include <qfileinfo.h> |
29 |
|
#include <qcombobox.h> |
30 |
|
|
31 |
#ifdef CONFIG_LIBGIG |
#ifdef CONFIG_LIBGIG |
32 |
#include "gig.h" |
#include "gig.h" |
472 |
} |
} |
473 |
|
|
474 |
|
|
475 |
|
// Audio routing accessors. |
476 |
|
int qsamplerChannel::audioChannel ( int iAudioOut ) const |
477 |
|
{ |
478 |
|
return m_audioRouting[iAudioOut]; |
479 |
|
} |
480 |
|
|
481 |
|
bool qsamplerChannel::setAudioChannel ( int iAudioOut, int iAudioIn ) |
482 |
|
{ |
483 |
|
if (client() == NULL || m_iChannelID < 0) |
484 |
|
return false; |
485 |
|
if (m_iInstrumentStatus == 100 && |
486 |
|
m_audioRouting[iAudioOut] == iAudioIn) |
487 |
|
return true; |
488 |
|
|
489 |
|
if (::lscp_set_channel_audio_channel(client(), |
490 |
|
m_iChannelID, iAudioOut, iAudioIn) != LSCP_OK) { |
491 |
|
appendMessagesClient("lscp_set_channel_audio_channel"); |
492 |
|
return false; |
493 |
|
} |
494 |
|
|
495 |
|
appendMessages(QObject::tr("Audio Channel: %1 -> %2.") |
496 |
|
.arg(iAudioOut).arg(iAudioIn)); |
497 |
|
|
498 |
|
m_audioRouting[iAudioOut] = iAudioIn; |
499 |
|
return true; |
500 |
|
} |
501 |
|
|
502 |
|
// The audio routing map itself. |
503 |
|
const qsamplerChannelRoutingMap& qsamplerChannel::audioRouting (void) const |
504 |
|
{ |
505 |
|
return m_audioRouting; |
506 |
|
} |
507 |
|
|
508 |
|
|
509 |
// Istrument name remapper. |
// Istrument name remapper. |
510 |
void qsamplerChannel::updateInstrumentName (void) |
void qsamplerChannel::updateInstrumentName (void) |
511 |
{ |
{ |
586 |
m_sMidiDriver = pDeviceInfo->driver; |
m_sMidiDriver = pDeviceInfo->driver; |
587 |
} |
} |
588 |
|
|
589 |
|
// Set the audio routing map. |
590 |
|
m_audioRouting.clear(); |
591 |
|
char **ppszRouting = pChannelInfo->audio_routing; |
592 |
|
for (int i = 0; ppszRouting && ppszRouting[i]; i++) { |
593 |
|
m_audioRouting[i] = ::atoi(ppszRouting[i]); |
594 |
|
} |
595 |
|
|
596 |
return true; |
return true; |
597 |
} |
} |
598 |
|
|
774 |
} |
} |
775 |
|
|
776 |
|
|
777 |
|
|
778 |
|
//------------------------------------------------------------------------- |
779 |
|
// qsamplerChannelRoutingTable - Channel routing table. |
780 |
|
// |
781 |
|
|
782 |
|
// Constructor. |
783 |
|
qsamplerChannelRoutingTable::qsamplerChannelRoutingTable ( |
784 |
|
QWidget *pParent, const char *pszName ) |
785 |
|
: QTable(pParent, pszName) |
786 |
|
{ |
787 |
|
// Set fixed number of columns. |
788 |
|
QTable::setNumCols(2); |
789 |
|
QTable::setShowGrid(false); |
790 |
|
QTable::setSorting(false); |
791 |
|
QTable::setFocusStyle(QTable::FollowStyle); |
792 |
|
QTable::setSelectionMode(QTable::NoSelection); |
793 |
|
// No vertical header. |
794 |
|
QTable::verticalHeader()->hide(); |
795 |
|
QTable::setLeftMargin(0); |
796 |
|
// Initialize the fixed table column headings. |
797 |
|
QHeader *pHeader = QTable::horizontalHeader(); |
798 |
|
pHeader->setLabel(0, tr("Sampler Channel")); |
799 |
|
pHeader->setLabel(1, tr("Device Channel")); |
800 |
|
// Set read-onlyness of each column |
801 |
|
QTable::setColumnReadOnly(0, true); |
802 |
|
// QTable::setColumnReadOnly(1, false); -- of course not. |
803 |
|
QTable::setColumnStretchable(1, true); |
804 |
|
} |
805 |
|
|
806 |
|
// Default destructor. |
807 |
|
qsamplerChannelRoutingTable::~qsamplerChannelRoutingTable (void) |
808 |
|
{ |
809 |
|
} |
810 |
|
|
811 |
|
|
812 |
|
// Routing map table renderer. |
813 |
|
void qsamplerChannelRoutingTable::refresh ( qsamplerDevice *pDevice, |
814 |
|
const qsamplerChannelRoutingMap& routing ) |
815 |
|
{ |
816 |
|
if (pDevice == NULL) |
817 |
|
return; |
818 |
|
|
819 |
|
// Always (re)start it empty. |
820 |
|
QTable::setUpdatesEnabled(false); |
821 |
|
QTable::setNumRows(0); |
822 |
|
|
823 |
|
// The common device port item list. |
824 |
|
QStringList opts; |
825 |
|
qsamplerDevicePortList& ports = pDevice->ports(); |
826 |
|
qsamplerDevicePort *pPort; |
827 |
|
for (pPort = ports.first(); pPort; pPort = ports.next()) { |
828 |
|
opts.append(pDevice->deviceTypeName() |
829 |
|
+ ' ' + pDevice->driverName() |
830 |
|
+ ' ' + pPort->portName()); |
831 |
|
} |
832 |
|
|
833 |
|
// Those items shall have a proper pixmap... |
834 |
|
QPixmap pmChannel = QPixmap::fromMimeSource("qsamplerChannel.png"); |
835 |
|
QPixmap pmDevice; |
836 |
|
switch (pDevice->deviceType()) { |
837 |
|
case qsamplerDevice::Audio: |
838 |
|
pmDevice = QPixmap::fromMimeSource("audio2.png"); |
839 |
|
break; |
840 |
|
case qsamplerDevice::Midi: |
841 |
|
pmDevice = QPixmap::fromMimeSource("midi2.png"); |
842 |
|
break; |
843 |
|
case qsamplerDevice::None: |
844 |
|
break; |
845 |
|
} |
846 |
|
|
847 |
|
// Fill the routing table... |
848 |
|
QTable::insertRows(0, routing.count()); |
849 |
|
int iRow = 0; |
850 |
|
qsamplerChannelRoutingMap::ConstIterator iter; |
851 |
|
for (iter = routing.begin(); iter != routing.end(); ++iter) { |
852 |
|
QTable::setPixmap(iRow, 0, pmChannel); |
853 |
|
QTable::setText(iRow, 0, pDevice->deviceTypeName() |
854 |
|
+ ' ' + QString::number(iter.key())); |
855 |
|
qsamplerChannelRoutingComboBox *pComboItem = |
856 |
|
new qsamplerChannelRoutingComboBox(this, opts, pmDevice); |
857 |
|
pComboItem->setCurrentItem(iter.data()); |
858 |
|
QTable::setItem(iRow, 1, pComboItem); |
859 |
|
++iRow; |
860 |
|
} |
861 |
|
|
862 |
|
// Adjust optimal column widths. |
863 |
|
QTable::adjustColumn(0); |
864 |
|
QTable::adjustColumn(1); |
865 |
|
|
866 |
|
QTable::setUpdatesEnabled(true); |
867 |
|
QTable::updateContents(); |
868 |
|
} |
869 |
|
|
870 |
|
|
871 |
|
// Commit any pending editing. |
872 |
|
void qsamplerChannelRoutingTable::flush (void) |
873 |
|
{ |
874 |
|
if (QTable::isEditing()) |
875 |
|
QTable::endEdit(QTable::currEditRow(), QTable::currEditCol(), true, true); |
876 |
|
} |
877 |
|
|
878 |
|
|
879 |
|
//------------------------------------------------------------------------- |
880 |
|
// qsamplerChannelRoutingComboBox - Custom combo box for routing table. |
881 |
|
// |
882 |
|
|
883 |
|
// Constructor. |
884 |
|
qsamplerChannelRoutingComboBox::qsamplerChannelRoutingComboBox ( |
885 |
|
QTable *pTable, const QStringList& list, const QPixmap& pixmap ) |
886 |
|
: QTableItem(pTable, QTableItem::WhenCurrent, QString::null, pixmap), |
887 |
|
m_list(list) |
888 |
|
{ |
889 |
|
m_iCurrentItem = 0; |
890 |
|
} |
891 |
|
|
892 |
|
// Public accessors. |
893 |
|
void qsamplerChannelRoutingComboBox::setCurrentItem ( int iCurrentItem ) |
894 |
|
{ |
895 |
|
m_iCurrentItem = iCurrentItem; |
896 |
|
|
897 |
|
QTableItem::setText(m_list[iCurrentItem]); |
898 |
|
} |
899 |
|
|
900 |
|
int qsamplerChannelRoutingComboBox::currentItem (void) const |
901 |
|
{ |
902 |
|
return m_iCurrentItem; |
903 |
|
} |
904 |
|
|
905 |
|
// Virtual implemetations. |
906 |
|
QWidget *qsamplerChannelRoutingComboBox::createEditor (void) const |
907 |
|
{ |
908 |
|
QComboBox *pComboBox = new QComboBox(QTableItem::table()->viewport()); |
909 |
|
QObject::connect(pComboBox, SIGNAL(activated(int)), |
910 |
|
QTableItem::table(), SLOT(doValueChanged())); |
911 |
|
for (QStringList::ConstIterator iter = m_list.begin(); |
912 |
|
iter != m_list.end(); iter++) { |
913 |
|
pComboBox->insertItem(QTableItem::pixmap(), *iter); |
914 |
|
} |
915 |
|
pComboBox->setCurrentItem(m_iCurrentItem); |
916 |
|
return pComboBox; |
917 |
|
} |
918 |
|
|
919 |
|
void qsamplerChannelRoutingComboBox::setContentFromEditor ( QWidget *pWidget ) |
920 |
|
{ |
921 |
|
if (pWidget->inherits("QComboBox")) { |
922 |
|
QComboBox *pComboBox = (QComboBox *) pWidget; |
923 |
|
m_iCurrentItem = pComboBox->currentItem(); |
924 |
|
QTableItem::setText(pComboBox->currentText()); |
925 |
|
} |
926 |
|
else QTableItem::setContentFromEditor(pWidget); |
927 |
|
} |
928 |
|
|
929 |
|
|
930 |
// end of qsamplerChannel.cpp |
// end of qsamplerChannel.cpp |