move JACK audio backend to its own folder and adjust build system to reflect that...
[ardour.git] / libs / backends / jack / jack_api.cc
1 /*
2     Copyright (C) 2013 Paul Davis
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 #include "jack_connection.h"
21 #include "jack_audiobackend.h"
22 #include "jack_portengine.h"
23
24 using namespace ARDOUR;
25
26 static boost::shared_ptr<JACKAudioBackend> backend;
27 static boost::shared_ptr<JACKPortEngine> port_engine;
28 static boost::shared_ptr<JackConnection> jack_connection;
29
30 static boost::shared_ptr<AudioBackend>
31 backend_factory (AudioEngine& ae)
32 {
33         if (!jack_connection) {
34                 return boost::shared_ptr<AudioBackend>();
35         }
36
37         if (!backend) {
38                 backend.reset (new JACKAudioBackend (ae, jack_connection));
39         }
40
41         return backend;
42 }
43
44 static boost::shared_ptr<PortEngine>
45 portengine_factory (PortManager& pm)
46 {
47         if (!jack_connection) {
48                 return boost::shared_ptr<PortEngine>();
49         }
50
51         if (!port_engine) {
52                 port_engine.reset (new JACKPortEngine (pm, jack_connection));
53         }
54
55         return port_engine;
56 }
57
58 static int
59 instantiate (const std::string& arg1, const std::string& arg2)
60 {
61         try {
62                 jack_connection.reset (new JackConnection (arg1, arg2));
63         } catch (...) {
64                 return -1;
65         }
66
67         return 0;
68 }
69
70 static int 
71 deinstantiate ()
72 {
73         port_engine.reset ();
74         backend.reset ();
75         jack_connection.reset ();
76
77         return 0;
78 }
79
80 static bool
81 already_configured ()
82 {
83         return JackConnection::server_running ();
84 }
85
86 extern "C" {
87         
88         
89         /* functions looked up using dlopen-and-cousins, and so naming scope
90          * must be non-mangled.
91          */
92
93         ARDOUR::AudioBackendInfo descriptor = {
94                 "JACK",
95                 instantiate,
96                 deinstantiate,
97                 backend_factory,
98                 portengine_factory,
99                 already_configured,
100         };
101 }
102