--- qsampler/trunk/src/qsamplerChannel.h 2005/01/18 11:29:01 341 +++ qsampler/trunk/src/qsamplerChannel.h 2019/08/13 10:19:32 3555 @@ -1,7 +1,8 @@ // qsamplerChannel.h // /**************************************************************************** - Copyright (C) 2003-2005, rncbc aka Rui Nuno Capela. All rights reserved. + Copyright (C) 2004-2019, rncbc aka Rui Nuno Capela. All rights reserved. + Copyright (C) 2007, Christian Schoenebeck This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -13,146 +14,253 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qsamplerChannel_h #define __qsamplerChannel_h -#include +#include +#include #include #include #include "qsamplerOptions.h" -class qsamplerMainForm; +namespace QSampler { + +class Device; + +// Typedef'd QMap. +typedef QMap ChannelRoutingMap; //------------------------------------------------------------------------- -// qsamplerChannel - Sampler channel structure. +// QSampler::Channel - Sampler channel structure. // -class qsamplerChannel +class Channel { public: - // Constructor. - qsamplerChannel(qsamplerMainForm *pMainForm, int iChannelID = -1); - // Default destructor. - ~qsamplerChannel(); - - // Main application options accessor. - qsamplerOptions *options(); - - // LSCP client descriptor accessor. - lscp_client_t * client(); - - // Add/remove sampler channel methods. - bool addChannel(); - bool removeChannel(); - - // Sampler channel ID accessors. - int channelID(); - void setChannelID(int iChannelID); - - // Readable channel name. - QString channelName(); - - // Engine name property. - QString& engineName(); - bool loadEngine(const QString& sEngineName); - - // Instrument file and index. - QString& instrumentFile(); - int instrumentNr(); - int instrumentStatus(); - bool loadInstrument(const QString& sInstrumentFile, int iInstrumentNr); - - // MIDI input driver (DEPRECATED). - QString& midiDriver(); - bool setMidiDriver(const QString& sMidiDriver); - - // MIDI input device. - int midiDevice(); - bool setMidiDevice(int iMidiDevice); - - // MIDI input port. - int midiPort(); - bool setMidiPort(int iMidiPort); - - // MIDI input channel. - int midiChannel(); - bool setMidiChannel(int iMidiChannel); - - // Audio output driver (DEPRECATED). - QString& audioDriver(); - bool setAudioDriver(const QString& sAudioDriver); - - // Audio output device. - int audioDevice(); - bool setAudioDevice(int iAudioDevice); - - // Sampler channel volume. - float volume(); - bool setVolume(float fVolume); - - // Channel info structure map executive. - bool updateChannelInfo(); - - // Reset channel method. - bool resetChannel(); - - // Channel setup dialog form. - bool channelSetup(QWidget *pParent); - - // Message logging methods (brainlessly mapped to main form's). - void appendMessages (const QString & s); - void appendMessagesColor (const QString & s, const QString & c); - void appendMessagesText (const QString & s); - void appendMessagesError (const QString & s); - void appendMessagesClient (const QString & s); - - // Context menu event handler. - void contextMenuEvent(QContextMenuEvent *pEvent); - - // Retrieve the available instrument name(s) of an instrument file (.gig). - static QString getInstrumentName (const QString& sInstrumentFile, int iInstrumentNr); - static QStringList getInstrumentList (const QString& sInstrumentFile); - - // Instrument name(s) retrieval mode. - static bool instrumentNames(); - static void setInstrumentNames (bool bInstrumentNames); + // Constructor. + Channel(int iChannelID = -1); + // Default destructor. + ~Channel(); + + // Add/remove sampler channel methods. + bool addChannel(); + bool removeChannel(); + + // Sampler channel ID accessors. + int channelID() const; + void setChannelID(int iChannelID); + + // Readable channel name. + QString channelName() const; + + // Engine name property. + const QString& engineName() const; + bool loadEngine(const QString& sEngineName); + + // Instrument file and index. + const QString& instrumentFile() const; + int instrumentNr() const; + const QString& instrumentName() const; + int instrumentStatus() const; + + // Instrument file loader. + bool loadInstrument(const QString& sInstrumentFile, int iInstrumentNr); + // Special instrument file/name/number settler. + bool setInstrument(const QString& sInstrumentFile, int iInstrumentNr); + + // MIDI input driver (DEPRECATED). + const QString& midiDriver() const; + bool setMidiDriver(const QString& sMidiDriver); + + // MIDI input device. + int midiDevice() const; + bool setMidiDevice(int iMidiDevice); + + // MIDI input port. + int midiPort() const; + bool setMidiPort(int iMidiPort); + + // MIDI input channel. + int midiChannel() const; + bool setMidiChannel(int iMidiChannel); + + // MIDI instrument map. + int midiMap() const; + bool setMidiMap(int iMidiMap); + + // Audio output driver (DEPRECATED). + const QString& audioDriver() const; + bool setAudioDriver(const QString& sAudioDriver); + + // Audio output device. + int audioDevice() const; + bool setAudioDevice(int iAudioDevice); + + // Sampler channel volume. + float volume() const; + bool setVolume(float fVolume); + + // Sampler channel mute state. + bool channelMute() const; + bool setChannelMute(bool bMute); + + // Sampler channel solo state. + bool channelSolo() const; + bool setChannelSolo(bool bSolo); + + // Audio routing accessors. + int audioChannel(int iAudioOut) const; + bool setAudioChannel(int iAudioOut, int iAudioIn); + // The audio routing map itself. + const ChannelRoutingMap& audioRouting() const; + + // Istrument name remapper. + void updateInstrumentName(); + + // Channel info structure map executive. + bool updateChannelInfo(); + + // Channel setup dialog form. + bool channelSetup(QWidget *pParent); + + // Reset channel method. + bool channelReset(); + + // Spawn instrument editor method. + bool editChannel(); + + // Message logging methods (brainlessly mapped to main form's). + void appendMessages (const QString & s) const; + void appendMessagesColor (const QString & s, const QString & c) const; + void appendMessagesText (const QString & s) const; + void appendMessagesError (const QString & s) const; + void appendMessagesClient (const QString & s) const; + + // Context menu event handler. + void contextMenuEvent(QContextMenuEvent *pEvent); + + // Common (invalid) name-helpers. + static QString noEngineName(); + static QString noInstrumentName(); + static QString loadingInstrument(); + + // Check whether a given file is an instrument file. + static bool isDlsInstrumentFile (const QString& sInstrumentFile); + static bool isSf2InstrumentFile (const QString& sInstrumentFile); + + // Retrieve the available instrument name(s) of an instrument file (.gig). + static QString getInstrumentName (const QString& sInstrumentFile, + int iInstrumentNr, bool bInstrumentNames); + static QStringList getInstrumentList (const QString& sInstrumentFile, + bool bInstrumentNames); private: - // Main application form reference. - qsamplerMainForm *m_pMainForm; + // Unique channel identifier. + int m_iChannelID; - // Unique channel identifier. - int m_iChannelID; + // Sampler channel info map. + QString m_sEngineName; + QString m_sInstrumentName; + QString m_sInstrumentFile; + int m_iInstrumentNr; + int m_iInstrumentStatus; + QString m_sMidiDriver; + int m_iMidiDevice; + int m_iMidiPort; + int m_iMidiChannel; + int m_iMidiMap; + QString m_sAudioDriver; + int m_iAudioDevice; + float m_fVolume; + bool m_bMute; + bool m_bSolo; - // Sampler channel info map. - QString m_sEngineName; - QString m_sInstrumentFile; - int m_iInstrumentNr; - int m_iInstrumentStatus; - QString m_sMidiDriver; // DEPRECATED. - int m_iMidiDevice; - int m_iMidiPort; - int m_iMidiChannel; - QString m_sAudioDriver; // DEPRECATED. - int m_iAudioDevice; - float m_fVolume; - - // Retrieve mode for available instrument name(s) - // from an instrument file (.gig). - static bool g_bInstrumentNames; + // The audio routing mapping. + ChannelRoutingMap m_audioRouting; }; + +//------------------------------------------------------------------------- +// QSampler::ChannelRoutingModel - data model for audio routing +// (used for QTableView) +// + +struct ChannelRoutingItem { + QStringList options; + int selection; +}; + +class ChannelRoutingModel : public QAbstractTableModel +{ + Q_OBJECT +public: + + ChannelRoutingModel(QObject* pParent = nullptr); + + // overridden methods from subclass(es) + int rowCount(const QModelIndex& parent = QModelIndex()) const; + int columnCount(const QModelIndex& parent = QModelIndex()) const; + Qt::ItemFlags flags(const QModelIndex& index) const; + bool setData(const QModelIndex& index, const QVariant& value, + int role = Qt::EditRole); + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + + // own methods + ChannelRoutingMap routingMap() const { return m_routing; } + + void clear() { m_routing.clear(); } + +public slots: + + void refresh(Device *pDevice, + const ChannelRoutingMap& routing); + +private: + + Device *m_pDevice; + ChannelRoutingMap m_routing; +}; + + +//------------------------------------------------------------------------- +// QSampler::ChannelRoutingDelegate - table cell renderer for audio routing +// + +class ChannelRoutingDelegate : public QItemDelegate +{ + Q_OBJECT + +public: + + ChannelRoutingDelegate(QObject* pParent = nullptr); + + QWidget* createEditor(QWidget *pParent, + const QStyleOptionViewItem& option, const QModelIndex& index) const; + void setEditorData(QWidget *pEditor, const QModelIndex& index) const; + void setModelData(QWidget *pEditor, QAbstractItemModel* model, + const QModelIndex& index) const; + void updateEditorGeometry(QWidget *pEditor, + const QStyleOptionViewItem& option, const QModelIndex& index) const; +}; + +} // namespace QSampler + +// So we can use it i.e. through QVariant +Q_DECLARE_METATYPE(QSampler::ChannelRoutingItem) + #endif // __qsamplerChannel_h