1 /*
2 Copyright (C) 2011 Devin Anderson
3 
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13 
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18 */
19 
20 #ifndef __JackALSARawMidiDriver__
21 #define __JackALSARawMidiDriver__
22 
23 #include <vector>
24 
25 #include <alsa/asoundlib.h>
26 #include <poll.h>
27 
28 #include "JackALSARawMidiInputPort.h"
29 #include "JackALSARawMidiOutputPort.h"
30 #include "JackMidiDriver.h"
31 #include "JackThread.h"
32 
33 namespace Jack {
34 
35     class JackALSARawMidiDriver:
36         public JackMidiDriver, public JackRunnableInterface {
37 
38     private:
39 
40         int fds[2];
41         JackALSARawMidiInputPort **input_ports;
42         JackALSARawMidiOutputPort **output_ports;
43         jack_nframes_t *output_port_timeouts;
44         nfds_t poll_fd_count;
45         struct pollfd *poll_fds;
46         JackThread *thread;
47 
48         void
49         FreeDeviceInfo(std::vector<snd_rawmidi_info_t *> *in_info_list,
50                        std::vector<snd_rawmidi_info_t *> *out_info_list);
51 
52         void
53         GetDeviceInfo(snd_ctl_t *control, snd_rawmidi_info_t *info,
54                       std::vector<snd_rawmidi_info_t *> *info_list);
55 
56         void
57         HandleALSAError(const char *driver_func, const char *alsa_func,
58                         int code);
59 
60     public:
61 
62         JackALSARawMidiDriver(const char *name, const char *alias,
63                               JackLockedEngine *engine, JackSynchro *table);
64         ~JackALSARawMidiDriver();
65 
66         int
67         Attach();
68 
69         int
70         Close();
71 
72         bool
73         Execute();
74 
75         bool
76         Init();
77 
78         int
79         Open(bool capturing, bool playing, int in_channels, int out_channels,
80              bool monitoring, const char *capture_driver_name,
81              const char *playback_driver_name, jack_nframes_t capture_latency,
82              jack_nframes_t playback_latency);
83 
84         int
85         Read();
86 
87         int
88         Start();
89 
90         int
91         Stop();
92 
93         int
94         Write();
95 
96     };
97 
98 }
99 
100 #endif
101