summaryrefslogtreecommitdiffstats
path: root/src/libs/engine/JackAudioDriver.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-05-23 04:30:24 +0000
committerDavid Robillard <d@drobilla.net>2008-05-23 04:30:24 +0000
commit0dbcca14bcbcb3aa7e7c0ae24934463a5973a651 (patch)
treed85dd8d74e4d5ea5c8b4400255c03adb79cda2c5 /src/libs/engine/JackAudioDriver.cpp
parent9cec63d68fef0e9fd5d3ee5b99a080dbd9180a88 (diff)
downloadingen-0dbcca14bcbcb3aa7e7c0ae24934463a5973a651.tar.gz
ingen-0dbcca14bcbcb3aa7e7c0ae24934463a5973a651.tar.bz2
ingen-0dbcca14bcbcb3aa7e7c0ae24934463a5973a651.zip
Fix crash when trying to add multiple objects with the same path.
Handle failed jack port registrations more gracefully. Don't assume all LADSPA plugins have minimum and maximum port range values. git-svn-id: http://svn.drobilla.net/lad/ingen@1230 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine/JackAudioDriver.cpp')
-rw-r--r--src/libs/engine/JackAudioDriver.cpp43
1 files changed, 26 insertions, 17 deletions
diff --git a/src/libs/engine/JackAudioDriver.cpp b/src/libs/engine/JackAudioDriver.cpp
index 9d5a06b9..cd86f91f 100644
--- a/src/libs/engine/JackAudioDriver.cpp
+++ b/src/libs/engine/JackAudioDriver.cpp
@@ -48,11 +48,11 @@ namespace Ingen {
//// JackAudioPort ////
JackAudioPort::JackAudioPort(JackAudioDriver* driver, DuplexPort* patch_port)
-: DriverPort(patch_port),
- Raul::List<JackAudioPort*>::Node(this),
- _driver(driver),
- _jack_port(NULL),
- _jack_buffer(NULL)
+ : DriverPort(patch_port)
+ , Raul::List<JackAudioPort*>::Node(this)
+ , _driver(driver)
+ , _jack_port(NULL)
+ , _jack_buffer(NULL)
{
assert(patch_port->poly() == 1);
@@ -61,6 +61,11 @@ JackAudioPort::JackAudioPort(JackAudioDriver* driver, DuplexPort* patch_port)
(patch_port->is_input()) ? JackPortIsInput : JackPortIsOutput,
0);
+ if (_jack_port == NULL) {
+ cerr << "[JackAudioPort] ERROR: Failed to register port " << patch_port->path() << endl;
+ throw JackAudioDriver::PortRegistrationFailedException();
+ }
+
patch_port->buffer(0)->clear();
patch_port->fixed_buffers(true);
}
@@ -95,15 +100,15 @@ JackAudioPort::prepare_buffer(jack_nframes_t nframes)
JackAudioDriver::JackAudioDriver(Engine& engine,
std::string server_name,
jack_client_t* jack_client)
-: _engine(engine),
- _jack_thread(NULL),
- _client(jack_client),
- _buffer_size(jack_client ? jack_get_buffer_size(jack_client) : 0),
- _sample_rate(jack_client ? jack_get_sample_rate(jack_client) : 0),
- _is_activated(false),
- _local_client(true), // FIXME
- _process_context(engine),
- _root_patch(NULL)
+ : _engine(engine)
+ , _jack_thread(NULL)
+ , _client(jack_client)
+ , _buffer_size(jack_client ? jack_get_buffer_size(jack_client) : 0)
+ , _sample_rate(jack_client ? jack_get_sample_rate(jack_client) : 0)
+ , _is_activated(false)
+ , _local_client(true) // FIXME
+ , _process_context(engine)
+ , _root_patch(NULL)
{
if (!_client) {
// Try supplied server name
@@ -247,10 +252,14 @@ JackAudioDriver::port(const Path& path)
DriverPort*
JackAudioDriver::create_port(DuplexPort* patch_port)
{
- if (patch_port->buffer_size() == _buffer_size)
- return new JackAudioPort(this, patch_port);
- else
+ try {
+ if (patch_port->buffer_size() == _buffer_size)
+ return new JackAudioPort(this, patch_port);
+ else
+ return NULL;
+ } catch (...) {
return NULL;
+ }
}