Audacity 3.2.0
Public Member Functions | Public Attributes | List of all members
RealtimeEffectState::Access Struct Referencefinal

Main thread's interface to inter-thread communication of changes of settings. More...

Inheritance diagram for RealtimeEffectState::Access:
[legend]
Collaboration diagram for RealtimeEffectState::Access:
[legend]

Public Member Functions

 Access ()=default
 
 Access (RealtimeEffectState &state)
 
 ~Access () override=default
 
const EffectSettingsGet () override
 
void Set (EffectSettings &&settings, std::unique_ptr< Message > pMessage) override
 
void Set (std::unique_ptr< Message > pMessage) override
 Message-only overload of Set(). In future, this should be the only one. More...
 
void Flush () override
 Make the last Set changes "persistent" in underlying storage. More...
 
bool IsSameAs (const EffectSettingsAccess &other) const override
 
- Public Member Functions inherited from EffectSettingsAccess
virtual ~EffectSettingsAccess ()
 
virtual const EffectSettingsGet ()=0
 
virtual void Set (EffectSettings &&settings, std::unique_ptr< Message > pMessage=nullptr)=0
 
virtual void Set (std::unique_ptr< Message > pMessage=nullptr)=0
 Message-only overload of Set(). In future, this should be the only one. More...
 
virtual void Flush ()=0
 Make the last Set changes "persistent" in underlying storage. More...
 
virtual bool IsSameAs (const EffectSettingsAccess &other) const =0
 
template<typename Function >
void ModifySettings (Function &&function)
 Do a correct read-modify-write of settings. More...
 

Public Attributes

std::weak_ptr< RealtimeEffectStatemwState
 Store no state here but this weak pointer, so IsSameAs isn't lying. More...
 

Detailed Description

Main thread's interface to inter-thread communication of changes of settings.

Definition at line 191 of file RealtimeEffectState.cpp.

Constructor & Destructor Documentation

◆ Access() [1/2]

RealtimeEffectState::Access::Access ( )
default

◆ Access() [2/2]

RealtimeEffectState::Access::Access ( RealtimeEffectState state)
inlineexplicit

Definition at line 193 of file RealtimeEffectState.cpp.

194 : mwState{ state.weak_from_this() }
195 {
196 }
std::weak_ptr< RealtimeEffectState > mwState
Store no state here but this weak pointer, so IsSameAs isn't lying.

◆ ~Access()

RealtimeEffectState::Access::~Access ( )
overridedefault

Member Function Documentation

◆ Flush()

void RealtimeEffectState::Access::Flush ( )
inlineoverridevirtual

Make the last Set changes "persistent" in underlying storage.

Precondition
called on the main thread only

Implements EffectSettingsAccess.

Definition at line 277 of file RealtimeEffectState.cpp.

277 {
278 if (auto pState = mwState.lock()) {
279 if (auto pAccessState = pState->GetAccessState()) {
280 assert(pAccessState->mMainThreadId == std::this_thread::get_id());
281
282 if (pAccessState->mState.mInitialized)
283 {
284 std::unique_lock lk(pAccessState->mLockForCV);
285 pAccessState->mCV.wait(lk,
286 [&] {
287 auto& lastSettings = pAccessState->mLastSettings;
288 pAccessState->MainRead();
289 return pAccessState->mCounter == lastSettings.counter;
290 }
291 );
292 }
293
294 // Update what GetSettings() will return, during play and before
295 // Finalize(), but after it is confirmed that any worker thread has
296 // seen the values given to the last Set(). These values will also
297 // be returned by Get().
298 pState->mMainSettings.Set(pAccessState->mLastSettings);
299 }
300 }
301 }

References mwState.

◆ Get()

const EffectSettings & RealtimeEffectState::Access::Get ( )
inlineoverridevirtual

Implements EffectSettingsAccess.

Definition at line 200 of file RealtimeEffectState.cpp.

200 {
201 if (auto pState = mwState.lock()) {
202 if (auto pAccessState = pState->GetAccessState()) {
203 if (pAccessState->mState.mInitialized)
204 {
205 // try once
206 assert(pAccessState->mState.mInitialized);
207 auto& lastSettings = pAccessState->mLastSettings;
208 // Assigns to mCounter
209 pAccessState->MainRead();
210 }
211 else {
212 // Not yet waiting on the other thread's progress
213 // Not necessarily values yet in the state's Settings objects
214 }
215 return pAccessState->mLastSettings.settings;
216 }
217 }
218 // Non-modal dialog may have outlived the RealtimeEffectState
219 static EffectSettings empty;
220 return empty;
221 }
Externalized state of a plug-in.

References mwState.

◆ IsSameAs()

bool RealtimeEffectState::Access::IsSameAs ( const EffectSettingsAccess other) const
inlineoverridevirtual
Returns
whether this and the other give access to the same settings

Implements EffectSettingsAccess.

Definition at line 302 of file RealtimeEffectState.cpp.

302 {
303 if (auto pOther = dynamic_cast<const Access*>(&other)) {
304 auto &mine = mwState;
305 auto &theirs = pOther->mwState;
306 auto less = std::owner_less{};
307 return !(less(mine, theirs) || less(theirs, mine));
308 }
309 return false;
310 }

References mwState.

◆ Set() [1/2]

void RealtimeEffectState::Access::Set ( EffectSettings &&  settings,
std::unique_ptr< Message pMessage 
)
inlineoverridevirtual

Implements EffectSettingsAccess.

Definition at line 222 of file RealtimeEffectState.cpp.

223 {
224 if (auto pState = mwState.lock()) {
225 if (auto pAccessState = pState->GetAccessState()) {
226 if (pMessage && !pAccessState->mState.mInitialized) {
227 // Other thread isn't processing.
228 // Let the instance consume the message directly.
229 if (auto pInstance = pState->mwInstance.lock()) {
230 auto &stateSettings = pState->mMainSettings.settings;
231 stateSettings = std::move(settings);
233 stateSettings, pMessage.get()
234 };
235 pInstance->RealtimeProcessStart(package);
236 pInstance->RealtimeProcessEnd(stateSettings);
237 pAccessState->mLastSettings.settings = stateSettings;
238 return;
239 }
240 }
241 auto &lastSettings = pAccessState->mLastSettings;
242 // move to remember values here
243 lastSettings.settings = std::move(settings);
244 ++lastSettings.counter;
245 // move a copy to there
246 pAccessState->MainWrite(
247 SettingsAndCounter{ lastSettings }, std::move(pMessage));
248 }
249 }
250 }
static Settings & settings()
Definition: TrackInfo.cpp:87

References mwState, EffectInstance::MessagePackage::settings, and settings().

Here is the call graph for this function:

◆ Set() [2/2]

void RealtimeEffectState::Access::Set ( std::unique_ptr< Message pMessage)
inlineoverridevirtual

Message-only overload of Set(). In future, this should be the only one.

Implements EffectSettingsAccess.

Definition at line 251 of file RealtimeEffectState.cpp.

252 {
253 if (auto pState = mwState.lock()) {
254 if (auto pAccessState = pState->GetAccessState()) {
255 if (pMessage && !pAccessState->mState.mInitialized) {
256 // Other thread isn't processing.
257 // Let the instance consume the message directly.
258 if (auto pInstance = pState->mwInstance.lock()) {
259 auto &stateSettings = pState->mMainSettings.settings;
261 stateSettings, pMessage.get()
262 };
263 pInstance->RealtimeProcessStart(package);
264 pInstance->RealtimeProcessEnd(stateSettings);
265 // Don't need to update pAccessState->mLastSettings
266 return;
267 }
268 }
269 auto &lastSettings = pAccessState->mLastSettings;
270 // Don't update settings, but do count
271 ++lastSettings.counter;
272 pAccessState->MainWrite(
273 lastSettings.counter, std::move(pMessage));
274 }
275 }
276 }

References mwState.

Member Data Documentation

◆ mwState

std::weak_ptr<RealtimeEffectState> RealtimeEffectState::Access::mwState

Store no state here but this weak pointer, so IsSameAs isn't lying.

Definition at line 312 of file RealtimeEffectState.cpp.

Referenced by Flush(), Get(), IsSameAs(), and Set().


The documentation for this struct was generated from the following file: