| digraph paused { |
| initial [label="INITIAL\n\ |
| mIgnoreNextPausedInt = false\n\ |
| mPaused = false\n\ |
| mPausedInt = false"]; |
| |
| resume_body [label="mIgnoreNextPausedInt = true\nif (mPaused || mPausedInt)"]; |
| resume_paused [label="mPaused = false\nmPausedInt = false\nsignal()"]; |
| resume_paused -> resume_merged; |
| resume_merged [label="return"]; |
| |
| Application -> ATstop; |
| ATstop [label="AudioTrack::stop()"]; |
| ATstop -> pause; |
| Application -> ATpause; |
| ATpause [label="AudioTrack::pause()"]; |
| ATpause -> pause; |
| ATstart -> resume; |
| ATstart [label="AudioTrack::start()"]; |
| destructor [label="~AudioTrack()"]; |
| destructor -> requestExit; |
| requestExit [label="AudioTrackThread::requestExit()"]; |
| requestExit -> resume; |
| Application -> ATsetMarkerPosition |
| ATsetMarkerPosition [label="AudioTrack::setMarkerPosition()\n[sets marker variables]"]; |
| ATsetMarkerPosition -> ATTwake |
| Application -> ATsetPositionUpdatePeriod |
| ATsetPositionUpdatePeriod [label="AudioTrack::setPositionUpdatePeriod()\n[sets update period variables]"]; |
| ATsetPositionUpdatePeriod -> ATTwake |
| Application -> ATstart; |
| |
| resume [label="AudioTrackThread::resume()"]; |
| resume -> resume_body; |
| |
| resume_body -> resume_paused [label="true"]; |
| resume_body -> resume_merged [label="false"]; |
| |
| ATTwake [label="AudioTrackThread::wake()\nif (!mPaused && mPausedInt && mPausedNs > 0)"]; |
| ATTwake-> ATTWake_wakeable [label="true"]; |
| ATTWake_wakeable [label="mIgnoreNextPausedInt = true\nmPausedInt = false\nsignal()"]; |
| ATTwake-> ATTWake_cannotwake [label="false"] |
| ATTWake_cannotwake [label="ignore"]; |
| |
| pause [label="mPaused = true"]; |
| pause -> return; |
| |
| threadLoop [label="AudioTrackThread::threadLoop()\nENTRY"]; |
| threadLoop -> threadLoop_1; |
| threadLoop_1 [label="if (mPaused)"]; |
| threadLoop_1 -> threadLoop_1_true [label="true"]; |
| threadLoop_1 -> threadLoop_2 [label="false"]; |
| threadLoop_1_true [label="wait()\nreturn true"]; |
| threadLoop_2 [label="if (mIgnoreNextPausedInt)"]; |
| threadLoop_2 -> threadLoop_2_true [label="true"]; |
| threadLoop_2 -> threadLoop_3 [label="false"]; |
| threadLoop_2_true [label="mIgnoreNextPausedInt = false\nmPausedInt = false"]; |
| threadLoop_2_true -> threadLoop_3; |
| threadLoop_3 [label="if (mPausedInt)"]; |
| threadLoop_3 -> threadLoop_3_true [label="true"]; |
| threadLoop_3 -> threadLoop_4 [label="false"]; |
| threadLoop_3_true [label="wait()\nmPausedInt = false\nreturn true"]; |
| threadLoop_4 [label="if (exitPending)"]; |
| threadLoop_4 -> threadLoop_4_true [label="true"]; |
| threadLoop_4 -> threadLoop_5 [label="false"]; |
| threadLoop_4_true [label="return false"]; |
| threadLoop_5 [label="ns = processAudioBuffer()"]; |
| threadLoop_5 -> threadLoop_6; |
| threadLoop_6 [label="case ns"]; |
| threadLoop_6 -> threadLoop_6_0 [label="0"]; |
| threadLoop_6 -> threadLoop_6_NS_INACTIVE [label="NS_INACTIVE"]; |
| threadLoop_6 -> threadLoop_6_NS_NEVER [label="NS_NEVER"]; |
| threadLoop_6 -> threadLoop_6_NS_WHENEVER [label="NS_WHENEVER"]; |
| threadLoop_6 -> threadLoop_6_default [label="default"]; |
| threadLoop_6_default [label="if (ns < 0)"]; |
| threadLoop_6_default -> threadLoop_6_default_true [label="true"]; |
| threadLoop_6_default -> threadLoop_6_default_false [label="false"]; |
| threadLoop_6_default_true [label="FATAL"]; |
| threadLoop_6_default_false [label="pauseInternal(ns) [wake()-able]\nmPausedInternal = true\nmPausedNs = ns\nreturn true"]; |
| threadLoop_6_0 [label="return true"]; |
| threadLoop_6_NS_INACTIVE [label="pauseInternal()\nmPausedInternal = true\nmPausedNs = 0\nreturn true"]; |
| threadLoop_6_NS_NEVER [label="return false"]; |
| threadLoop_6_NS_WHENEVER [label="ns = 1s"]; |
| threadLoop_6_NS_WHENEVER -> threadLoop_6_default_false; |
| |
| } |