LMMS
Loading...
Searching...
No Matches
MidiAlsaSeq.h
Go to the documentation of this file.
1/*
2 * MidiAlsaSeq.h - ALSA-sequencer-client
3 *
4 * Copyright (c) 2005-2013 Tobias Doerffel <tobydox/at/users.sourceforge.net>
5 *
6 * This file is part of LMMS - https://lmms.io
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program (see COPYING); if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301 USA.
22 *
23 */
24
25#ifndef LMMS_MIDI_ALSA_SEQ_H
26#define LMMS_MIDI_ALSA_SEQ_H
27
28#include "lmmsconfig.h"
29
30#ifdef LMMS_HAVE_ALSA
31#include <alsa/asoundlib.h>
32
33#include <QMap>
34#include <QMutex>
35#include <QThread>
36#include <QTimer>
37
38
39#include "MidiClient.h"
40
41
42
43
44namespace lmms
45{
46
47
48class MidiAlsaSeq : public QThread, public MidiClient
49{
50 Q_OBJECT
51public:
53 ~MidiAlsaSeq() override;
54
55 static QString probeDevice();
56
57
58 inline static QString name()
59 {
60 return QT_TRANSLATE_NOOP( "MidiSetupWidget",
61 "ALSA-Sequencer (Advanced Linux Sound "
62 "Architecture)" );
63 }
64
65 inline static QString configSection()
66 {
67 return "Midialsaseq";
68 }
69
70
71
72 void processOutEvent( const MidiEvent & _me,
73 const TimePos & _time,
74 const MidiPort * _port ) override;
75
76 void applyPortMode( MidiPort * _port ) override;
77 void applyPortName( MidiPort * _port ) override;
78
79 void removePort( MidiPort * _port ) override;
80
81
82 // list seq-ports from ALSA
83 QStringList readablePorts() const override
84 {
85 return m_readablePorts;
86 }
87
88 QStringList writablePorts() const override
89 {
90 return m_writablePorts;
91 }
92
93 // return name of port which specified MIDI event came from
94 QString sourcePortName( const MidiEvent & ) const override;
95
96 // (un)subscribe given MidiPort to/from destination-port
97 void subscribeReadablePort( MidiPort * _port,
98 const QString & _dest,
99 bool _subscribe = true ) override;
100 void subscribeWritablePort( MidiPort * _port,
101 const QString & _dest,
102 bool _subscribe = true ) override;
103 void connectRPChanged( QObject * _receiver,
104 const char * _member ) override
105 {
106 connect( this, SIGNAL( readablePortsChanged() ),
107 _receiver, _member );
108 }
109
110 void connectWPChanged( QObject * _receiver,
111 const char * _member ) override
112 {
113 connect( this, SIGNAL( writablePortsChanged() ),
114 _receiver, _member );
115 }
116
117
118private slots:
119 void changeQueueTempo( lmms::bpm_t _bpm );
120 void updatePortList();
121
122
123private:
124 void run() override;
125
126#ifdef LMMS_HAVE_ALSA
128 snd_seq_t * m_seqHandle;
129 struct Ports
130 {
131 Ports() { p[0] = -1; p[1] = -1; }
132 int & operator[]( const int _i ) { return p[_i]; }
133 private: int p[2];
134 } ;
135 QMap<MidiPort *, Ports> m_portIDs;
136#endif
137
139
140 volatile bool m_quit;
141
143 QStringList m_readablePorts;
144 QStringList m_writablePorts;
145
146 int m_pipe[2];
147
148
149signals:
152
153} ;
154
155
156} // namespace lmms
157
158#endif // LMMS_HAVE_ALSA
159
160#endif // LMMS_MIDI_ALSA_SEQ_H
void changeQueueTempo(lmms::bpm_t _bpm)
Definition MidiAlsaSeq.cpp:618
MidiAlsaSeq()
Definition MidiAlsaSeq.cpp:73
void subscribeWritablePort(MidiPort *_port, const QString &_dest, bool _subscribe=true) override
Definition MidiAlsaSeq.cpp:407
static QString probeDevice()
Definition MidiAlsaSeq.cpp:142
void writablePortsChanged()
void applyPortName(MidiPort *_port) override
Definition MidiAlsaSeq.cpp:305
void processOutEvent(const MidiEvent &_me, const TimePos &_time, const MidiPort *_port) override
Definition MidiAlsaSeq.cpp:159
QStringList writablePorts() const override
Definition MidiAlsaSeq.h:88
static QString configSection()
Definition MidiAlsaSeq.h:65
snd_seq_t * m_seqHandle
Definition MidiAlsaSeq.h:128
void run() override
Definition MidiAlsaSeq.cpp:456
void readablePortsChanged()
QStringList m_writablePorts
Definition MidiAlsaSeq.h:144
volatile bool m_quit
Definition MidiAlsaSeq.h:140
void connectRPChanged(QObject *_receiver, const char *_member) override
Definition MidiAlsaSeq.h:103
QMap< MidiPort *, Ports > m_portIDs
Definition MidiAlsaSeq.h:135
int m_queueID
Definition MidiAlsaSeq.h:138
QTimer m_portListUpdateTimer
Definition MidiAlsaSeq.h:142
QStringList readablePorts() const override
Definition MidiAlsaSeq.h:83
QString sourcePortName(const MidiEvent &) const override
Definition MidiAlsaSeq.cpp:349
void applyPortMode(MidiPort *_port) override
Definition MidiAlsaSeq.cpp:236
void updatePortList()
Definition MidiAlsaSeq.cpp:632
~MidiAlsaSeq() override
Definition MidiAlsaSeq.cpp:124
int m_pipe[2]
Definition MidiAlsaSeq.h:146
void subscribeReadablePort(MidiPort *_port, const QString &_dest, bool _subscribe=true) override
Definition MidiAlsaSeq.cpp:362
QMutex m_seqMutex
Definition MidiAlsaSeq.h:127
void connectWPChanged(QObject *_receiver, const char *_member) override
Definition MidiAlsaSeq.h:110
static QString name()
Definition MidiAlsaSeq.h:58
void removePort(MidiPort *_port) override
Definition MidiAlsaSeq.cpp:332
QStringList m_readablePorts
Definition MidiAlsaSeq.h:143
MidiClient()=default
Definition MidiEvent.h:37
Definition MidiPort.h:56
Definition TimePos.h:68
Definition AudioAlsa.cpp:35
std::uint16_t bpm_t
Definition LmmsTypes.h:45
Ports()
Definition MidiAlsaSeq.h:131
int p[2]
Definition MidiAlsaSeq.h:133
int & operator[](const int _i)
Definition MidiAlsaSeq.h:132
#define SIGNAL
Definition tap_pinknoise.c:34