Skip to content

Commit

Permalink
Introduce AUv3 proxy connection as dedicated entity to manage ARA IPC…
Browse files Browse the repository at this point in the history
… channel life time
  • Loading branch information
sgretscher committed Feb 11, 2024
1 parent 588c856 commit d9f7efa
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 13 deletions.
35 changes: 23 additions & 12 deletions ExamplesCommon/PlugInHosting/AudioUnitLoader.m
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,26 @@
#include "ARA_API/ARAAudioUnit_v3.h"
#include "ARA_Library/Debug/ARADebug.h"
#include "ARA_Library/IPC/ARAIPCAudioUnit_v3.h"
#include "ARA_Library/IPC/ARAIPCProxyPlugIn.h"


#if defined (__GNUC__)
_Pragma ("GCC diagnostic push")
_Pragma ("GCC diagnostic ignored \"-Wunguarded-availability\"")
#endif

struct _AudioUnitComponent
{
AudioComponent component;
#if ARA_AUDIOUNITV3_IPC_IS_AVAILABLE
const ARAFactory * ipcFactory; // cache - NULL until read via IPC
ARAIPCMessageChannelRef factoryIPCChannelRef; // invalid until ipcFactory has been read via IPC
ARAIPCConnectionRef araProxy;
#endif
};

#if defined (__GNUC__)
_Pragma ("GCC diagnostic pop")
#endif


struct _AudioUnitInstance
{
Expand All @@ -65,7 +74,7 @@ AudioUnitComponent AudioUnitPrepareComponentWithIDs(OSType type, OSType subtype,
AudioUnitComponent result = malloc(sizeof(struct _AudioUnitComponent));
result->component = NULL;
#if ARA_AUDIOUNITV3_IPC_IS_AVAILABLE
result->ipcFactory = NULL;
result->araProxy = NULL;
#endif

AudioComponentDescription compDesc = { type, subtype, manufacturer, 0, 0 };
Expand Down Expand Up @@ -229,14 +238,16 @@ AudioUnitInstance AudioUnitOpenInstance(AudioUnitComponent audioUnitComponent, b
{
if (@available(macOS 13.0, *))
{
if (!audioUnitInstance->audioUnitComponent->ipcFactory)
if (!audioUnitInstance->audioUnitComponent->araProxy)
audioUnitInstance->audioUnitComponent->araProxy = ARAIPCAUProxyPlugInInitialize(audioUnitInstance->v3AudioUnit);
if (audioUnitInstance->audioUnitComponent->araProxy)
{
if ((audioUnitInstance->audioUnitComponent->factoryIPCChannelRef =
ARAIPCAUProxyPlugInInitializeFactoryMessageChannel(audioUnitInstance->v3AudioUnit)))
audioUnitInstance->audioUnitComponent->ipcFactory = ARAIPCAUProxyPlugInGetFactory(audioUnitInstance->audioUnitComponent->factoryIPCChannelRef);
*messageChannelRef = ARAIPCAUProxyPlugInGetMainMessageChannel(audioUnitInstance->audioUnitComponent->araProxy);

ARA_VALIDATE_API_CONDITION(ARAIPCProxyPlugInGetFactoriesCount(*messageChannelRef) == 1);
result = ARAIPCProxyPlugInGetFactoryAtIndex (*messageChannelRef, 0);
ARA_VALIDATE_API_CONDITION(result != NULL);
}
if ((result = audioUnitInstance->audioUnitComponent->ipcFactory))
*messageChannelRef = audioUnitInstance->audioUnitComponent->factoryIPCChannelRef;
}
}
else
Expand Down Expand Up @@ -542,7 +553,7 @@ void AudioUnitCloseInstance(AudioUnitInstance audioUnitInstance)
if (@available(macOS 13.0, *))
{
if (audioUnitInstance->ipcInstance)
ARAIPCAUProxyPlugInCleanupBinding(audioUnitInstance->ipcInstance);
ARAIPCProxyPlugInCleanupBinding(audioUnitInstance->ipcInstance);
}
#endif
[audioUnitInstance->v3AudioUnit release];
Expand All @@ -555,8 +566,8 @@ void AudioUnitCleanupComponent(AudioUnitComponent audioUnitComponent)
#if ARA_AUDIOUNITV3_IPC_IS_AVAILABLE
if (@available(macOS 13.0, *))
{
if (audioUnitComponent->ipcFactory)
ARAIPCAUProxyPlugInUninitializeFactoryMessageChannel(audioUnitComponent->factoryIPCChannelRef);
if (audioUnitComponent->araProxy)
ARAIPCAUProxyPlugInUninitialize(audioUnitComponent->araProxy);
}
#endif

Expand Down
3 changes: 2 additions & 1 deletion TestPlugIn/AudioUnit_v3/Framework/TestAUv3AudioUnit.mm
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#import "ARATestDocumentController.h"

#import "ARA_Library/IPC/ARAIPCAudioUnit_v3.h"
#import "ARA_Library/IPC/ARAIPCProxyHost.h"


#if ARA_AUDIOUNITV3_IPC_IS_AVAILABLE
Expand Down Expand Up @@ -282,7 +283,7 @@ void destroy_sharedFactoryMessageChannel() {
{
if (!_sharedFactoryMessageChannel)
{
ARA::IPC::ARAIPCAUProxyHostAddFactory(ARATestDocumentController::getARAFactory());
ARA::IPC::ARAIPCProxyHostAddFactory(ARATestDocumentController::getARAFactory());
_sharedFactoryMessageChannel = [TestAUv3ARAIPCMessageChannel new];
ARA::IPC::ARAIPCAUProxyHostInitialize(_sharedFactoryMessageChannel);
}
Expand Down

0 comments on commit d9f7efa

Please sign in to comment.