summaryrefslogtreecommitdiffstats
path: root/src/AlsaDriver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/AlsaDriver.cpp')
-rw-r--r--src/AlsaDriver.cpp163
1 files changed, 90 insertions, 73 deletions
diff --git a/src/AlsaDriver.cpp b/src/AlsaDriver.cpp
index 0dfcd72..4ad2897 100644
--- a/src/AlsaDriver.cpp
+++ b/src/AlsaDriver.cpp
@@ -31,10 +31,9 @@
using boost::format;
AlsaDriver::AlsaDriver(Patchage* app)
- : _app(app)
- , _seq(NULL)
-{
-}
+ : _app(app)
+ , _seq(NULL)
+{}
AlsaDriver::~AlsaDriver()
{
@@ -58,7 +57,8 @@ AlsaDriver::attach(bool /*launch_daemon*/)
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 50000);
- ret = pthread_create(&_refresh_thread, &attr, &AlsaDriver::refresh_main, this);
+ ret = pthread_create(
+ &_refresh_thread, &attr, &AlsaDriver::refresh_main, this);
if (ret)
_app->error_msg("Alsa: Failed to start refresh thread.");
@@ -121,7 +121,8 @@ AlsaDriver::refresh()
// Create port views
while (snd_seq_query_next_client(_seq, cinfo) >= 0) {
- snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
+ snd_seq_port_info_set_client(pinfo,
+ snd_seq_client_info_get_client(cinfo));
snd_seq_port_info_set_port(pinfo, -1);
while (snd_seq_query_next_port(_seq, pinfo) >= 0) {
const snd_seq_addr_t& addr = *snd_seq_port_info_get_addr(pinfo);
@@ -136,7 +137,8 @@ AlsaDriver::refresh()
// Create connections
snd_seq_client_info_set_client(cinfo, -1);
while (snd_seq_query_next_client(_seq, cinfo) >= 0) {
- snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
+ snd_seq_port_info_set_client(pinfo,
+ snd_seq_client_info_get_client(cinfo));
snd_seq_port_info_set_port(pinfo, -1);
while (snd_seq_query_next_port(_seq, pinfo) >= 0) {
const snd_seq_addr_t* addr = snd_seq_port_info_get_addr(pinfo);
@@ -144,7 +146,8 @@ AlsaDriver::refresh()
continue;
}
- PatchagePort* port = _app->canvas()->find_port(PortID(*addr, false));
+ PatchagePort* port =
+ _app->canvas()->find_port(PortID(*addr, false));
if (!port) {
continue;
}
@@ -154,9 +157,10 @@ AlsaDriver::refresh()
snd_seq_query_subscribe_set_root(subsinfo, addr);
snd_seq_query_subscribe_set_index(subsinfo, 0);
while (!snd_seq_query_port_subscribers(_seq, subsinfo)) {
- const snd_seq_addr_t* addr2 = snd_seq_query_subscribe_get_addr(subsinfo);
+ const snd_seq_addr_t* addr2 =
+ snd_seq_query_subscribe_get_addr(subsinfo);
if (addr2) {
- const PortID id2(*addr2, true);
+ const PortID id2(*addr2, true);
PatchagePort* port2 = _app->canvas()->find_port(id2);
if (port2 && !_app->canvas()->get_edge(port, port2)) {
_app->canvas()->make_connection(port, port2);
@@ -164,15 +168,14 @@ AlsaDriver::refresh()
}
snd_seq_query_subscribe_set_index(
- subsinfo, snd_seq_query_subscribe_get_index(subsinfo) + 1);
+ subsinfo, snd_seq_query_subscribe_get_index(subsinfo) + 1);
}
}
}
}
PatchagePort*
-AlsaDriver::create_port_view(Patchage* patchage,
- const PortID& id)
+AlsaDriver::create_port_view(Patchage* patchage, const PortID& id)
{
PatchageModule* parent = NULL;
PatchagePort* port = NULL;
@@ -203,11 +206,10 @@ AlsaDriver::find_module(uint8_t client_id, ModuleType type)
}
PatchageModule*
-AlsaDriver::find_or_create_module(
- Patchage* patchage,
- uint8_t client_id,
- const std::string& client_name,
- ModuleType type)
+AlsaDriver::find_or_create_module(Patchage* patchage,
+ uint8_t client_id,
+ const std::string& client_name,
+ ModuleType type)
{
PatchageModule* m = find_module(client_id, type);
if (!m) {
@@ -220,11 +222,10 @@ AlsaDriver::find_or_create_module(
}
void
-AlsaDriver::create_port_view_internal(
- Patchage* patchage,
- snd_seq_addr_t addr,
- PatchageModule*& m,
- PatchagePort*& port)
+AlsaDriver::create_port_view_internal(Patchage* patchage,
+ snd_seq_addr_t addr,
+ PatchageModule*& m,
+ PatchagePort*& port)
{
if (ignore(addr))
return;
@@ -288,7 +289,7 @@ AlsaDriver::create_port_view_internal(
if (is_duplex) {
type = ((!is_input) ? Input : Output);
- m = find_or_create_module(_app, addr.client, client_name, type);
+ m = find_or_create_module(_app, addr.client, client_name, type);
if (!m->get_port(port_name)) {
port = create_port(*m, port_name, !is_input, addr);
port->show();
@@ -303,13 +304,17 @@ AlsaDriver::create_port(PatchageModule& parent,
bool is_input,
snd_seq_addr_t addr)
{
- PatchagePort* ret = new PatchagePort(
- parent, ALSA_MIDI, name, "", is_input,
- _app->conf()->get_port_color(ALSA_MIDI),
- _app->show_human_names());
-
- dynamic_cast<PatchageCanvas*>(parent.canvas())->index_port(
- PortID(addr, is_input), ret);
+ PatchagePort* ret =
+ new PatchagePort(parent,
+ ALSA_MIDI,
+ name,
+ "",
+ is_input,
+ _app->conf()->get_port_color(ALSA_MIDI),
+ _app->show_human_names());
+
+ dynamic_cast<PatchageCanvas*>(parent.canvas())
+ ->index_port(PortID(addr, is_input), ret);
_app->canvas()->index_port(PortID(addr, is_input), ret);
_port_addrs.insert(std::make_pair(ret, PortID(addr, is_input)));
@@ -342,14 +347,14 @@ AlsaDriver::ignore(const snd_seq_addr_t& addr, bool add)
if (caps & SND_SEQ_PORT_CAP_NO_EXPORT) {
_ignored.insert(addr);
return true;
- } else if ( !( (caps & SND_SEQ_PORT_CAP_READ)
- || (caps & SND_SEQ_PORT_CAP_WRITE)
- || (caps & SND_SEQ_PORT_CAP_DUPLEX))) {
+ } else if (!((caps & SND_SEQ_PORT_CAP_READ) ||
+ (caps & SND_SEQ_PORT_CAP_WRITE) ||
+ (caps & SND_SEQ_PORT_CAP_DUPLEX))) {
_ignored.insert(addr);
return true;
- } else if ((snd_seq_client_info_get_type(cinfo) != SND_SEQ_USER_CLIENT)
- && ((type == SND_SEQ_PORT_SYSTEM_TIMER
- || type == SND_SEQ_PORT_SYSTEM_ANNOUNCE))) {
+ } else if ((snd_seq_client_info_get_type(cinfo) != SND_SEQ_USER_CLIENT) &&
+ ((type == SND_SEQ_PORT_SYSTEM_TIMER ||
+ type == SND_SEQ_PORT_SYSTEM_ANNOUNCE))) {
_ignored.insert(addr);
return true;
}
@@ -362,8 +367,7 @@ AlsaDriver::ignore(const snd_seq_addr_t& addr, bool add)
* \return Whether connection succeeded.
*/
bool
-AlsaDriver::connect(PatchagePort* src_port,
- PatchagePort* dst_port)
+AlsaDriver::connect(PatchagePort* src_port, PatchagePort* dst_port)
{
PortAddrs::const_iterator s = _port_addrs.find(src_port);
PortAddrs::const_iterator d = _port_addrs.find(dst_port);
@@ -376,8 +380,8 @@ AlsaDriver::connect(PatchagePort* src_port,
const PortID src = s->second;
const PortID dst = d->second;
- if (src.id.alsa_addr.client == dst.id.alsa_addr.client
- && src.id.alsa_addr.port == dst.id.alsa_addr.port) {
+ if (src.id.alsa_addr.client == dst.id.alsa_addr.client &&
+ src.id.alsa_addr.port == dst.id.alsa_addr.port) {
_app->warning_msg("Alsa: Refusing to connect port to itself.");
return false;
}
@@ -400,17 +404,18 @@ AlsaDriver::connect(PatchagePort* src_port,
int ret = snd_seq_subscribe_port(_seq, subs);
if (ret < 0) {
- _app->error_msg((format("Alsa: Subscription failed (%1%).")
- % snd_strerror(ret)).str());
+ _app->error_msg(
+ (format("Alsa: Subscription failed (%1%).") % snd_strerror(ret))
+ .str());
result = false;
}
if (result)
- _app->info_msg(std::string("Alsa: Connected ")
- + src_port->full_name() + " => " + dst_port->full_name());
+ _app->info_msg(std::string("Alsa: Connected ") + src_port->full_name() +
+ " => " + dst_port->full_name());
else
- _app->error_msg(std::string("Alsa: Unable to connect ")
- + src_port->full_name() + " => " + dst_port->full_name());
+ _app->error_msg(std::string("Alsa: Unable to connect ") +
+ src_port->full_name() + " => " + dst_port->full_name());
return (!result);
}
@@ -420,8 +425,7 @@ AlsaDriver::connect(PatchagePort* src_port,
* \return Whether disconnection succeeded.
*/
bool
-AlsaDriver::disconnect(PatchagePort* src_port,
- PatchagePort* dst_port)
+AlsaDriver::disconnect(PatchagePort* src_port, PatchagePort* dst_port)
{
PortAddrs::const_iterator s = _port_addrs.find(src_port);
PortAddrs::const_iterator d = _port_addrs.find(dst_port);
@@ -444,20 +448,21 @@ AlsaDriver::disconnect(PatchagePort* src_port,
// Not connected (shouldn't happen)
if (snd_seq_get_port_subscription(_seq, subs) != 0) {
- _app->error_msg("Alsa: Attempt to unsubscribe ports that are not subscribed.");
+ _app->error_msg(
+ "Alsa: Attempt to unsubscribe ports that are not subscribed.");
return false;
}
int ret = snd_seq_unsubscribe_port(_seq, subs);
if (ret < 0) {
- _app->error_msg(std::string("Alsa: Unable to disconnect ")
- + src_port->full_name() + " => " + dst_port->full_name()
- + "(" + snd_strerror(ret) + ")");
+ _app->error_msg(std::string("Alsa: Unable to disconnect ") +
+ src_port->full_name() + " => " + dst_port->full_name() +
+ "(" + snd_strerror(ret) + ")");
return false;
}
- _app->info_msg(std::string("Alsa: Disconnected ")
- + src_port->full_name() + " => " + dst_port->full_name());
+ _app->info_msg(std::string("Alsa: Disconnected ") + src_port->full_name() +
+ " => " + dst_port->full_name());
return true;
}
@@ -470,12 +475,15 @@ AlsaDriver::create_refresh_port()
snd_seq_port_info_set_name(port_info, "System Announcement Reciever");
snd_seq_port_info_set_type(port_info, SND_SEQ_PORT_TYPE_APPLICATION);
snd_seq_port_info_set_capability(port_info,
- SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE|SND_SEQ_PORT_CAP_NO_EXPORT);
+ SND_SEQ_PORT_CAP_WRITE |
+ SND_SEQ_PORT_CAP_SUBS_WRITE |
+ SND_SEQ_PORT_CAP_NO_EXPORT);
int ret = snd_seq_create_port(_seq, port_info);
if (ret) {
- _app->error_msg((format("Alsa: Error creating port (%1%): ")
- % snd_strerror(ret)).str());
+ _app->error_msg(
+ (format("Alsa: Error creating port (%1%): ") % snd_strerror(ret))
+ .str());
return false;
}
@@ -485,8 +493,10 @@ AlsaDriver::create_refresh_port()
SND_SEQ_CLIENT_SYSTEM,
SND_SEQ_PORT_SYSTEM_ANNOUNCE);
if (ret) {
- _app->error_msg((format("Alsa: Failed to connect to system announce port (%1%)")
- % snd_strerror(ret)).str());
+ _app->error_msg(
+ (format("Alsa: Failed to connect to system announce port (%1%)") %
+ snd_strerror(ret))
+ .str());
return false;
}
@@ -505,7 +515,8 @@ void
AlsaDriver::_refresh_main()
{
if (!create_refresh_port()) {
- _app->error_msg("Alsa: Could not create listen port, auto-refresh disabled.");
+ _app->error_msg(
+ "Alsa: Could not create listen port, auto-refresh disabled.");
return;
}
@@ -525,36 +536,42 @@ AlsaDriver::_refresh_main()
switch (ev->type) {
case SND_SEQ_EVENT_PORT_SUBSCRIBED:
- if (!ignore(ev->data.connect.sender) && !ignore(ev->data.connect.dest))
+ if (!ignore(ev->data.connect.sender) &&
+ !ignore(ev->data.connect.dest))
_events.push(PatchageEvent(PatchageEvent::CONNECTION,
- ev->data.connect.sender, ev->data.connect.dest));
+ ev->data.connect.sender,
+ ev->data.connect.dest));
break;
case SND_SEQ_EVENT_PORT_UNSUBSCRIBED:
- if (!ignore(ev->data.connect.sender) && !ignore(ev->data.connect.dest))
+ if (!ignore(ev->data.connect.sender) &&
+ !ignore(ev->data.connect.dest))
_events.push(PatchageEvent(PatchageEvent::DISCONNECTION,
- ev->data.connect.sender, ev->data.connect.dest));
+ ev->data.connect.sender,
+ ev->data.connect.dest));
break;
case SND_SEQ_EVENT_PORT_START:
snd_seq_get_any_client_info(_seq, ev->data.addr.client, cinfo);
- snd_seq_get_any_port_info(_seq, ev->data.addr.client, ev->data.addr.port, pinfo);
+ snd_seq_get_any_port_info(
+ _seq, ev->data.addr.client, ev->data.addr.port, pinfo);
caps = snd_seq_port_info_get_capability(pinfo);
if (!ignore(ev->data.addr))
- _events.push(PatchageEvent(PatchageEvent::PORT_CREATION,
- PortID(ev->data.addr, (caps & SND_SEQ_PORT_CAP_READ))));
+ _events.push(PatchageEvent(
+ PatchageEvent::PORT_CREATION,
+ PortID(ev->data.addr, (caps & SND_SEQ_PORT_CAP_READ))));
break;
case SND_SEQ_EVENT_PORT_EXIT:
if (!ignore(ev->data.addr, false)) {
// Note: getting caps at this point does not work
- // Delete both inputs and outputs (in case this is a duplex port)
+ // Delete both inputs and outputs (to handle duplex ports)
_events.push(PatchageEvent(PatchageEvent::PORT_DESTRUCTION,
PortID(ev->data.addr, true)));
_events.push(PatchageEvent(PatchageEvent::PORT_DESTRUCTION,
PortID(ev->data.addr, false)));
- _port_addrs.erase(_app->canvas()->find_port(
- PortID(ev->data.addr, false)));
- _port_addrs.erase(_app->canvas()->find_port(
- PortID(ev->data.addr, true)));
+ _port_addrs.erase(
+ _app->canvas()->find_port(PortID(ev->data.addr, false)));
+ _port_addrs.erase(
+ _app->canvas()->find_port(PortID(ev->data.addr, true)));
}
break;
case SND_SEQ_EVENT_CLIENT_CHANGE: