1 /*
2     MIDI Sequencer C++ library
3     Copyright (C) 2006-2021, Pedro Lopez-Cabanillas <plcl@users.sf.net>
4 
5     This library is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 3 of the License, or
8     (at your option) any later version.
9 
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14 
15     You should have received a copy of the GNU General Public License
16     along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #ifndef DRUMSTICK_SUBSCRIPTION_H
20 #define DRUMSTICK_SUBSCRIPTION_H
21 
22 extern "C" {
23     #include <alsa/asoundlib.h>
24 }
25 
26 #include <QList>
27 #include "macros.h"
28 
29 namespace drumstick { namespace ALSA {
30 
31 /**
32  * @file subscription.h
33  * Classes managing ALSA sequencer subscriptions
34  */
35 
36 class MidiClient;
37 
38 /**
39  * @addtogroup ALSASubs ALSA Sequencer Subscriptions
40  * @{
41  *
42  * @class Subscriber
43  * Subscriber container class.
44  *
45  * This class is used to enumerate the subscribers of a given (root) port.
46  */
47 class DRUMSTICK_EXPORT Subscriber
48 {
49     friend class PortInfo;
50 public:
51     Subscriber();
52     Subscriber(const Subscriber& other);
53     explicit Subscriber(snd_seq_query_subscribe_t* other);
54     virtual ~Subscriber();
55     Subscriber* clone();
56     int getSizeOfInfo() const;
57 
58     int getClient();
59     int getPort();
60     const snd_seq_addr_t* getRoot();
61     snd_seq_query_subs_type_t getType();
62     int getIndex();
63     int getNumSubs();
64     const snd_seq_addr_t* getAddr();
65     int getQueue();
66     bool getExclusive();
67     bool getTimeUpdate();
68     bool getTimeReal();
69     void setClient(int client);
70     void setPort(int port);
71     void setRoot(snd_seq_addr_t* addr);
72     void setType(snd_seq_query_subs_type_t type);
73     void setIndex(int index);
74     Subscriber& operator=(const Subscriber& other);
75 
76 private:
77     snd_seq_query_subscribe_t* m_Info;
78 
79 };
80 
81 /**
82  * Subscription management.
83  *
84  * This class represents a connection between two ports.
85  */
86 class DRUMSTICK_EXPORT Subscription
87 {
88 public:
89     Subscription();
90     Subscription(const Subscription& other);
91     explicit Subscription(snd_seq_port_subscribe_t* other);
92     explicit Subscription(MidiClient* seq);
93     virtual ~Subscription();
94     Subscription* clone();
95     int getSizeOfInfo() const;
96 
97     void setSender(unsigned char client, unsigned char port);
98     void setDest(unsigned char client, unsigned char port);
99     void subscribe(MidiClient* seq);
100     void unsubscribe(MidiClient* seq);
101 
102     const snd_seq_addr_t* getSender();
103     const snd_seq_addr_t* getDest();
104     int getQueue();
105     bool getExclusive();
106     bool getTimeUpdate();
107     bool getTimeReal();
108     void setSender(const snd_seq_addr_t* addr);
109     void setDest(const snd_seq_addr_t* addr);
110     void setQueue(int queue);
111     void setExclusive(bool val);
112     void setTimeUpdate(bool val);
113     void setTimeReal(bool val);
114     Subscription& operator=(const Subscription& other);
115 
116 private:
117     snd_seq_port_subscribe_t* m_Info;
118 };
119 
120 /**
121  * List of subscriptions
122  */
123 typedef QList<Subscription> SubscriptionsList;
124 
125 /**
126  * List of subscribers
127  */
128 typedef QList<Subscriber> SubscribersList;
129 
130 /** @} */
131 
132 }} /* namespace drumstick::ALSA */
133 
134 #endif //DRUMSTICK_SUBSCRIPTION_H
135