1
1
/*
2
2
* Carla Plugin Host
3
- * Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com>
3
+ * Copyright (C) 2011-2021 Filipe Coelho <falktx@falktx.com>
4
4
*
5
5
* This program is free software; you can redistribute it and/or
6
6
* modify it under the terms of the GNU General Public License as
@@ -4121,6 +4121,7 @@ class CarlaEngineJack : public CarlaEngine
4121
4121
struct PostPonedJackEvent {
4122
4122
enum Type {
4123
4123
kTypeNull = 0 ,
4124
+ kTypeClientRegister ,
4124
4125
kTypeClientUnregister ,
4125
4126
kTypeClientPositionChange ,
4126
4127
kTypePortRegister ,
@@ -4133,6 +4134,9 @@ class CarlaEngineJack : public CarlaEngine
4133
4134
Type type;
4134
4135
4135
4136
union {
4137
+ struct {
4138
+ char name[STR_MAX+1 ];
4139
+ } clientRegister;
4136
4140
struct {
4137
4141
char name[STR_MAX+1 ];
4138
4142
} clientUnregister;
@@ -4184,6 +4188,8 @@ class CarlaEngineJack : public CarlaEngine
4184
4188
PostPonedJackEvent nullEvent;
4185
4189
carla_zeroStruct (nullEvent);
4186
4190
4191
+ CarlaStringList clientsToIgnore, portsToIgnore;
4192
+
4187
4193
for (; ! shouldThreadExit ();)
4188
4194
{
4189
4195
if (fIsInternalClient )
@@ -4205,40 +4211,88 @@ class CarlaEngineJack : public CarlaEngine
4205
4211
continue ;
4206
4212
}
4207
4213
4214
+ // 1st iteration, fill in what things we ought to ignore and do unregistration
4215
+ clientsToIgnore.clear ();
4216
+ portsToIgnore.clear ();
4217
+
4208
4218
for (LinkedList<PostPonedJackEvent>::Itenerator it = events.begin2 (); it.valid (); it.next ())
4209
4219
{
4210
4220
const PostPonedJackEvent& ev (it.getValue (nullEvent));
4211
4221
CARLA_SAFE_ASSERT_CONTINUE (ev.type != PostPonedJackEvent::kTypeNull );
4212
4222
4213
4223
switch (ev.type )
4214
4224
{
4215
- case PostPonedJackEvent::kTypeNull :
4225
+ case PostPonedJackEvent::kTypeClientRegister :
4226
+ clientsToIgnore.removeOne (ev.clientRegister .name );
4216
4227
break ;
4217
-
4218
4228
case PostPonedJackEvent::kTypeClientUnregister :
4229
+ clientsToIgnore.append (ev.clientUnregister .name );
4219
4230
handleJackClientUnregistrationCallback (ev.clientUnregister .name );
4220
4231
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 ;
4221
4257
4222
4258
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
+
4223
4270
handleJackClientPositionChangeCallback (ev.clientPositionChange .uuid );
4224
4271
break ;
4272
+ }
4225
4273
4226
4274
case PostPonedJackEvent::kTypePortRegister :
4275
+ if (portsToIgnore.contains (ev.portRegister .fullName ))
4276
+ continue ;
4227
4277
handleJackPortRegistrationCallback (ev.portRegister .fullName ,
4228
4278
ev.portRegister .shortName ,
4229
4279
ev.portRegister .hints );
4230
4280
break ;
4231
4281
4232
- case PostPonedJackEvent::kTypePortUnregister :
4233
- handleJackPortUnregistrationCallback (ev.portUnregister .fullName );
4234
- break ;
4235
-
4236
4282
case PostPonedJackEvent::kTypePortConnect :
4283
+ if (portsToIgnore.contains (ev.portConnect .portNameA ))
4284
+ continue ;
4285
+ if (portsToIgnore.contains (ev.portConnect .portNameB ))
4286
+ continue ;
4237
4287
handleJackPortConnectCallback (ev.portConnect .portNameA ,
4238
4288
ev.portConnect .portNameB );
4239
4289
break ;
4240
4290
4241
4291
case PostPonedJackEvent::kTypePortDisconnect :
4292
+ if (portsToIgnore.contains (ev.portConnect .portNameA ))
4293
+ continue ;
4294
+ if (portsToIgnore.contains (ev.portConnect .portNameB ))
4295
+ continue ;
4242
4296
handleJackPortDisconnectCallback (ev.portDisconnect .portNameA ,
4243
4297
ev.portDisconnect .portNameB );
4244
4298
break ;
@@ -4255,6 +4309,8 @@ class CarlaEngineJack : public CarlaEngine
4255
4309
}
4256
4310
4257
4311
events.clear ();
4312
+ clientsToIgnore.clear ();
4313
+ portsToIgnore.clear ();
4258
4314
}
4259
4315
#endif // BUILD_BRIDGE
4260
4316
@@ -4315,15 +4371,20 @@ class CarlaEngineJack : public CarlaEngine
4315
4371
4316
4372
static void JACKBRIDGE_API carla_jack_client_registration_callback (const char * name, int reg, void * arg)
4317
4373
{
4318
- // ignored
4319
- if (reg != 0 )
4320
- return ;
4321
-
4322
4374
PostPonedJackEvent ev;
4323
4375
carla_zeroStruct (ev);
4324
4376
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
+
4327
4388
handlePtr->postPoneJackCallback (ev);
4328
4389
}
4329
4390
0 commit comments