26#if JUCE_AUDIOWORKGROUP_TYPES_AVAILABLE
28class WorkgroupToken::TokenProvider
40 TokenProvider (
const TokenProvider&) =
delete;
41 TokenProvider (TokenProvider&&
other) noexcept
46 TokenProvider& operator= (
const TokenProvider&) =
delete;
47 TokenProvider& operator= (TokenProvider&&
other)
noexcept
49 TokenProvider { std::move (
other) }.swap (*
this);
53 bool isAttached()
const {
return attached; }
59 if (@available (
macos 11.0, ios 14.0, *))
65 if (@available (
macos 11.0, ios 14.0, *))
86class AudioWorkgroup::WorkgroupProvider
89 explicit WorkgroupProvider (
os_workgroup_t ptr) : handle { ptr } {}
91 void join (WorkgroupToken&
token)
const
101 if (handle.get() !=
nullptr)
102 token = WorkgroupToken { [
provider = WorkgroupToken::TokenProvider { handle.get() }] {
return &
provider; } };
107 if (
auto*
provider =
wg.getWorkgroupProvider())
116 ScopedWorkgroupRetainer (os_workgroup_t wg) : handle { wg }
118 if (handle !=
nullptr)
122 ~ScopedWorkgroupRetainer()
124 if (handle !=
nullptr)
128 ScopedWorkgroupRetainer (
const ScopedWorkgroupRetainer& other)
129 : ScopedWorkgroupRetainer { other.handle } {}
131 ScopedWorkgroupRetainer& operator= (
const ScopedWorkgroupRetainer& other)
133 ScopedWorkgroupRetainer { other }.swap (*
this);
137 ScopedWorkgroupRetainer (ScopedWorkgroupRetainer&& other)
noexcept
142 ScopedWorkgroupRetainer& operator= (ScopedWorkgroupRetainer&& other)
noexcept
148 void swap (ScopedWorkgroupRetainer& other)
noexcept
153 os_workgroup_t
get() const noexcept {
return handle; }
156 os_workgroup_t handle {
nullptr };
173 static void* getWorkgroup (
const AudioWorkgroup&) {
return nullptr; }
179 : erased ([&]() -> Erased
181 if (
auto* p =
other.getWorkgroupProvider())
189 return WorkgroupProvider::getWorkgroup (*
this) == WorkgroupProvider::getWorkgroup (
other);
194 #if JUCE_AUDIOWORKGROUP_TYPES_AVAILABLE
196 if (
const auto* p = getWorkgroupProvider())
209 #if JUCE_AUDIOWORKGROUP_TYPES_AVAILABLE
211 if (@available (
macos 11.0, ios 14.0, *))
213 if (
auto wg = WorkgroupProvider::getWorkgroup (*
this))
222AudioWorkgroup::operator
bool()
const {
return WorkgroupProvider::getWorkgroup (*
this) !=
nullptr; }
224#if JUCE_AUDIOWORKGROUP_TYPES_AVAILABLE
228 if (handle ==
nullptr)
231 return AudioWorkgroup { [
provider = AudioWorkgroup::WorkgroupProvider { handle }] {
return &
provider; } };
A handle to an audio workgroup, which is a collection of realtime threads working together to produce...
size_t getMaxParallelThreadCount() const
Returns the recommended maximum number of parallel threads that should join this workgroup.
AudioWorkgroup()=default
Constructs a disengaged handle that does not represent any workgroup.
bool operator==(const AudioWorkgroup &other) const
Equality operator.
void join(WorkgroupToken &token) const
This method attempts to join the calling thread to this workgroup.
Created by AudioWorkgroup to join the calling thread to a workgroup.
void reset()
If this token was engaged by joining a workgroup, leaves that workgroup and disengages the token.
auto & get(ProcessorChain< Processors... > &chain) noexcept
Non-member equivalent of ProcessorChain::get which avoids awkward member template syntax.
Type unalignedPointerCast(void *ptr) noexcept
Casts a pointer to another type via void*, which suppresses the cast-align warning which sometimes ar...