40 using RawState = AudioStateMachineUtils::RawState;
46 if (
auto stateMachine = std::exchange(m_stateMachine,
nullptr))
47 stateMachine->reset(m_state, m_prevState);
50 ~Notifier() { reset(); }
52 Notifier(
const Notifier &) =
delete;
53 Notifier(Notifier &&other)
noexcept
54 : m_stateMachine(std::exchange(other.m_stateMachine,
nullptr)),
55 m_state(other.m_state),
56 m_prevState(other.m_prevState)
60 operator
bool()
const {
return m_stateMachine !=
nullptr; }
62 QAudio::State prevAudioState()
const {
return AudioStateMachineUtils::toAudioState(m_prevState); }
64 QAudio::State audioState()
const {
return AudioStateMachineUtils::toAudioState(m_state); }
66 bool isDraining()
const {
return AudioStateMachineUtils::isDrainingState(m_state); }
68 bool isStateChanged()
const {
return prevAudioState() != audioState(); }
71 Notifier(QAudioStateMachine *stateMachine =
nullptr, RawState state = QAudio::StoppedState,
72 RawState prevState = QAudio::StoppedState)
73 : m_stateMachine(stateMachine), m_state(state), m_prevState(prevState)
78 QAudioStateMachine *m_stateMachine;
80 const RawState m_prevState;
82 friend class QAudioStateMachine;
85 enum class RunningState {
86 Active = QtAudio::State::ActiveState,
87 Idle = QtAudio::State::IdleState
90 QAudioStateMachine(QAudioStateChangeNotifier ¬ifier);
92 ~QAudioStateMachine();
94 QAudio::State state()
const;
96 QAudio::Error error()
const;
98 bool isActiveOrIdle()
const;
100 bool isDraining()
const;
103 std::pair<
bool,
bool> getDrainedAndStopped()
const;
110 Notifier stop(QAudio::Error error = QAudio::NoError,
bool shouldDrain =
false,
111 bool forceUpdateError =
false);
114 Notifier stopOrUpdateError(QAudio::Error error = QAudio::NoError)
116 return stop(error,
false,
true);
120 Notifier start(RunningState activeOrIdle = RunningState::Active);
129 Notifier activateFromIdle();
132 Notifier updateActiveOrIdle(RunningState activeOrIdle, QAudio::Error error = QAudio::NoError);
135 Notifier forceSetState(QAudio::State state, QAudio::Error error = QAudio::NoError);
138 Notifier setError(QAudio::Error error);
141 template <
typename StatesChecker,
typename NewState>
142 Notifier changeState(
const StatesChecker &statesChecker,
const NewState &newState);
144 void reset(RawState state, RawState prevState);
147 QPointer<QAudioStateChangeNotifier> m_notifier;
148 std::atomic<RawState> m_state = QAudio::StoppedState;
149 QAudio::State m_suspendedInState = QAudio::SuspendedState;