Skip to content

Commit e5f4d02

Browse files
committed
Alternative approach to deal with jack postponed events
Might fix pipewire for real now, needs testing Signed-off-by: falkTX <falktx@falktx.com>
1 parent 70e41f1 commit e5f4d02

File tree

1 file changed

+74
-13
lines changed

1 file changed

+74
-13
lines changed

source/backend/engine/CarlaEngineJack.cpp

+74-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Carla Plugin Host
3-
* Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com>
3+
* Copyright (C) 2011-2021 Filipe Coelho <falktx@falktx.com>
44
*
55
* This program is free software; you can redistribute it and/or
66
* modify it under the terms of the GNU General Public License as
@@ -4121,6 +4121,7 @@ class CarlaEngineJack : public CarlaEngine
41214121
struct PostPonedJackEvent {
41224122
enum Type {
41234123
kTypeNull = 0,
4124+
kTypeClientRegister,
41244125
kTypeClientUnregister,
41254126
kTypeClientPositionChange,
41264127
kTypePortRegister,
@@ -4133,6 +4134,9 @@ class CarlaEngineJack : public CarlaEngine
41334134
Type type;
41344135

41354136
union {
4137+
struct {
4138+
char name[STR_MAX+1];
4139+
} clientRegister;
41364140
struct {
41374141
char name[STR_MAX+1];
41384142
} clientUnregister;
@@ -4184,6 +4188,8 @@ class CarlaEngineJack : public CarlaEngine
41844188
PostPonedJackEvent nullEvent;
41854189
carla_zeroStruct(nullEvent);
41864190

4191+
CarlaStringList clientsToIgnore, portsToIgnore;
4192+
41874193
for (; ! shouldThreadExit();)
41884194
{
41894195
if (fIsInternalClient)
@@ -4205,40 +4211,88 @@ class CarlaEngineJack : public CarlaEngine
42054211
continue;
42064212
}
42074213

4214+
// 1st iteration, fill in what things we ought to ignore and do unregistration
4215+
clientsToIgnore.clear();
4216+
portsToIgnore.clear();
4217+
42084218
for (LinkedList<PostPonedJackEvent>::Itenerator it = events.begin2(); it.valid(); it.next())
42094219
{
42104220
const PostPonedJackEvent& ev(it.getValue(nullEvent));
42114221
CARLA_SAFE_ASSERT_CONTINUE(ev.type != PostPonedJackEvent::kTypeNull);
42124222

42134223
switch (ev.type)
42144224
{
4215-
case PostPonedJackEvent::kTypeNull:
4225+
case PostPonedJackEvent::kTypeClientRegister:
4226+
clientsToIgnore.removeOne(ev.clientRegister.name);
42164227
break;
4217-
42184228
case PostPonedJackEvent::kTypeClientUnregister:
4229+
clientsToIgnore.append(ev.clientUnregister.name);
42194230
handleJackClientUnregistrationCallback(ev.clientUnregister.name);
42204231
break;
4232+
case PostPonedJackEvent::kTypePortRegister:
4233+
portsToIgnore.removeOne(ev.portRegister.fullName);
4234+
break;
4235+
case PostPonedJackEvent::kTypePortUnregister:
4236+
portsToIgnore.append(ev.portUnregister.fullName);
4237+
handleJackPortUnregistrationCallback(ev.portUnregister.fullName);
4238+
break;
4239+
default:
4240+
break;
4241+
}
4242+
}
4243+
4244+
// 2nd iteration, go through all postponed events while ignoring some
4245+
for (LinkedList<PostPonedJackEvent>::Itenerator it = events.begin2(); it.valid(); it.next())
4246+
{
4247+
const PostPonedJackEvent& ev(it.getValue(nullEvent));
4248+
CARLA_SAFE_ASSERT_CONTINUE(ev.type != PostPonedJackEvent::kTypeNull);
4249+
4250+
switch (ev.type)
4251+
{
4252+
case PostPonedJackEvent::kTypeNull:
4253+
case PostPonedJackEvent::kTypeClientRegister:
4254+
case PostPonedJackEvent::kTypeClientUnregister:
4255+
case PostPonedJackEvent::kTypePortUnregister:
4256+
break;
42214257

42224258
case PostPonedJackEvent::kTypeClientPositionChange:
4259+
{
4260+
char uuidstr[JACK_UUID_STRING_SIZE];
4261+
carla_zeroStruct(uuidstr);
4262+
jackbridge_uuid_unparse(ev.clientPositionChange.uuid, uuidstr);
4263+
4264+
const char* const clientname = jackbridge_get_client_name_by_uuid(fClient, uuidstr);
4265+
CARLA_SAFE_ASSERT_BREAK(clientname != nullptr && clientname[0] != '\0');
4266+
4267+
if (clientsToIgnore.contains(clientname))
4268+
continue;
4269+
42234270
handleJackClientPositionChangeCallback(ev.clientPositionChange.uuid);
42244271
break;
4272+
}
42254273

42264274
case PostPonedJackEvent::kTypePortRegister:
4275+
if (portsToIgnore.contains(ev.portRegister.fullName))
4276+
continue;
42274277
handleJackPortRegistrationCallback(ev.portRegister.fullName,
42284278
ev.portRegister.shortName,
42294279
ev.portRegister.hints);
42304280
break;
42314281

4232-
case PostPonedJackEvent::kTypePortUnregister:
4233-
handleJackPortUnregistrationCallback(ev.portUnregister.fullName);
4234-
break;
4235-
42364282
case PostPonedJackEvent::kTypePortConnect:
4283+
if (portsToIgnore.contains(ev.portConnect.portNameA))
4284+
continue;
4285+
if (portsToIgnore.contains(ev.portConnect.portNameB))
4286+
continue;
42374287
handleJackPortConnectCallback(ev.portConnect.portNameA,
42384288
ev.portConnect.portNameB);
42394289
break;
42404290

42414291
case PostPonedJackEvent::kTypePortDisconnect:
4292+
if (portsToIgnore.contains(ev.portConnect.portNameA))
4293+
continue;
4294+
if (portsToIgnore.contains(ev.portConnect.portNameB))
4295+
continue;
42424296
handleJackPortDisconnectCallback(ev.portDisconnect.portNameA,
42434297
ev.portDisconnect.portNameB);
42444298
break;
@@ -4255,6 +4309,8 @@ class CarlaEngineJack : public CarlaEngine
42554309
}
42564310

42574311
events.clear();
4312+
clientsToIgnore.clear();
4313+
portsToIgnore.clear();
42584314
}
42594315
#endif // BUILD_BRIDGE
42604316

@@ -4315,15 +4371,20 @@ class CarlaEngineJack : public CarlaEngine
43154371

43164372
static void JACKBRIDGE_API carla_jack_client_registration_callback(const char* name, int reg, void* arg)
43174373
{
4318-
// ignored
4319-
if (reg != 0)
4320-
return;
4321-
43224374
PostPonedJackEvent ev;
43234375
carla_zeroStruct(ev);
43244376

4325-
ev.type = PostPonedJackEvent::kTypeClientUnregister;
4326-
std::strncpy(ev.clientUnregister.name, name, STR_MAX);
4377+
if (reg != 0)
4378+
{
4379+
ev.type = PostPonedJackEvent::kTypeClientRegister;
4380+
std::strncpy(ev.clientRegister.name, name, STR_MAX);
4381+
}
4382+
else
4383+
{
4384+
ev.type = PostPonedJackEvent::kTypeClientUnregister;
4385+
std::strncpy(ev.clientUnregister.name, name, STR_MAX);
4386+
}
4387+
43274388
handlePtr->postPoneJackCallback(ev);
43284389
}
43294390

0 commit comments

Comments
 (0)