aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine/JackDriver.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2010-12-17 05:03:11 +0000
committerDavid Robillard <d@drobilla.net>2010-12-17 05:03:11 +0000
commitc5d81c429f913c16c1d616b6737dd12d4d5996c2 (patch)
treea2ffe3216aa0b6648dcb27f0dcef6c0f0597b295 /src/engine/JackDriver.cpp
parent5a4c36dd284cf32da44545d89911a86961f205a0 (diff)
downloadmachina-c5d81c429f913c16c1d616b6737dd12d4d5996c2.tar.gz
machina-c5d81c429f913c16c1d616b6737dd12d4d5996c2.tar.bz2
machina-c5d81c429f913c16c1d616b6737dd12d4d5996c2.zip
Remove RaulJackDriver cruft.
git-svn-id: http://svn.drobilla.net/lad/trunk/machina@2737 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine/JackDriver.cpp')
-rw-r--r--src/engine/JackDriver.cpp78
1 files changed, 75 insertions, 3 deletions
diff --git a/src/engine/JackDriver.cpp b/src/engine/JackDriver.cpp
index 3f705a9..020d833 100644
--- a/src/engine/JackDriver.cpp
+++ b/src/engine/JackDriver.cpp
@@ -30,6 +30,7 @@ namespace Machina {
JackDriver::JackDriver(SharedPtr<Machine> machine)
: Driver(machine)
+ , _client(NULL)
, _machine_changed(0)
, _input_port(NULL)
, _output_port(NULL)
@@ -40,6 +41,7 @@ JackDriver::JackDriver(SharedPtr<Machine> machine)
, _quantization(0.0f)
, _record_dur(_frames_unit) // = 0
, _recording(0)
+ , _is_activated(false)
{
}
@@ -53,7 +55,21 @@ JackDriver::~JackDriver()
void
JackDriver::attach(const std::string& client_name)
{
- Raul::JackDriver::attach(client_name);
+ // Already connected
+ if (_client)
+ return;
+
+ jack_set_error_function(jack_error_cb);
+
+ _client = jack_client_open(client_name.c_str(), JackNullOption, NULL, NULL);
+
+ if (_client == NULL) {
+ _is_activated = false;
+ } else {
+ jack_set_error_function(jack_error_cb);
+ jack_on_shutdown(_client, jack_shutdown_cb, this);
+ jack_set_process_callback(_client, jack_process_cb, this);
+ }
if (jack_client()) {
@@ -98,7 +114,34 @@ JackDriver::detach()
jack_port_unregister(jack_client(), _output_port);
_output_port = NULL;
}
- Raul::JackDriver::detach();
+
+ if (_client) {
+ deactivate();
+ jack_client_close(_client);
+ _client = NULL;
+ _is_activated = false;
+ }
+}
+
+
+void
+JackDriver::activate()
+{
+ if (!jack_activate(_client)) {
+ _is_activated = true;
+ } else {
+ _is_activated = false;
+ }
+}
+
+
+void
+JackDriver::deactivate()
+{
+ if (_client)
+ jack_deactivate(_client);
+
+ _is_activated = false;
}
@@ -108,7 +151,6 @@ JackDriver::set_machine(SharedPtr<Machine> machine)
if (machine == _machine)
return;
- cout << "DRIVER MACHINE: " << machine.get() << endl;
SharedPtr<Machine> last_machine = _last_machine; // Keep a reference
_machine_changed.reset(0);
assert(!last_machine.unique());
@@ -354,4 +396,34 @@ JackDriver::finish_record()
}
+int
+JackDriver::jack_process_cb(jack_nframes_t nframes, void* jack_driver)
+{
+ JackDriver* me = reinterpret_cast<JackDriver*>(jack_driver);
+
+ assert(me);
+
+ me->on_process(nframes);
+
+ return 0;
+}
+
+
+void
+JackDriver::jack_shutdown_cb(void* jack_driver)
+{
+ JackDriver* me = reinterpret_cast<JackDriver*>(jack_driver);
+ assert(me);
+
+ me->_client = NULL;
+}
+
+
+void
+JackDriver::jack_error_cb(const char* msg)
+{
+ cerr << "[JACK] Error: " << msg << endl;
+}
+
+
} // namespace Machina