1 digraph paused { 2 initial [label="INITIAL\n\ 3 mIgnoreNextPausedInt = false\n\ 4 mPaused = false\n\ 5 mPausedInt = false"]; 6 7 resume_body [label="mIgnoreNextPausedInt = true\nif (mPaused || mPausedInt)"]; 8 resume_paused [label="mPaused = false\nmPausedInt = false\nsignal()"]; 9 resume_paused -> resume_merged; 10 resume_merged [label="return"]; 11 12 Application -> ATstop; 13 ATstop [label="AudioTrack::stop()"]; 14 ATstop -> pause; 15 Application -> ATpause; 16 ATpause [label="AudioTrack::pause()"]; 17 ATpause -> pause; 18 ATstart -> resume; 19 ATstart [label="AudioTrack::start()"]; 20 destructor [label="~AudioTrack()"]; 21 destructor -> requestExit; 22 requestExit [label="AudioTrackThread::requestExit()"]; 23 requestExit -> resume; 24 Application -> ATsetMarkerPosition 25 ATsetMarkerPosition [label="AudioTrack::setMarkerPosition()\n[sets marker variables]"]; 26 ATsetMarkerPosition -> ATTwake 27 Application -> ATsetPositionUpdatePeriod 28 ATsetPositionUpdatePeriod [label="AudioTrack::setPositionUpdatePeriod()\n[sets update period variables]"]; 29 ATsetPositionUpdatePeriod -> ATTwake 30 Application -> ATstart; 31 32 resume [label="AudioTrackThread::resume()"]; 33 resume -> resume_body; 34 35 resume_body -> resume_paused [label="true"]; 36 resume_body -> resume_merged [label="false"]; 37 38 ATTwake [label="AudioTrackThread::wake()\nif (!mPaused && mPausedInt && mPausedNs > 0)"]; 39 ATTwake-> ATTWake_wakeable [label="true"]; 40 ATTWake_wakeable [label="mIgnoreNextPausedInt = true\nmPausedInt = false\nsignal()"]; 41 ATTwake-> ATTWake_cannotwake [label="false"] 42 ATTWake_cannotwake [label="ignore"]; 43 44 pause [label="mPaused = true"]; 45 pause -> return; 46 47 threadLoop [label="AudioTrackThread::threadLoop()\nENTRY"]; 48 threadLoop -> threadLoop_1; 49 threadLoop_1 [label="if (mPaused)"]; 50 threadLoop_1 -> threadLoop_1_true [label="true"]; 51 threadLoop_1 -> threadLoop_2 [label="false"]; 52 threadLoop_1_true [label="wait()\nreturn true"]; 53 threadLoop_2 [label="if (mIgnoreNextPausedInt)"]; 54 threadLoop_2 -> threadLoop_2_true [label="true"]; 55 threadLoop_2 -> threadLoop_3 [label="false"]; 56 threadLoop_2_true [label="mIgnoreNextPausedInt = false\nmPausedInt = false"]; 57 threadLoop_2_true -> threadLoop_3; 58 threadLoop_3 [label="if (mPausedInt)"]; 59 threadLoop_3 -> threadLoop_3_true [label="true"]; 60 threadLoop_3 -> threadLoop_4 [label="false"]; 61 threadLoop_3_true [label="wait()\nmPausedInt = false\nreturn true"]; 62 threadLoop_4 [label="if (exitPending)"]; 63 threadLoop_4 -> threadLoop_4_true [label="true"]; 64 threadLoop_4 -> threadLoop_5 [label="false"]; 65 threadLoop_4_true [label="return false"]; 66 threadLoop_5 [label="ns = processAudioBuffer()"]; 67 threadLoop_5 -> threadLoop_6; 68 threadLoop_6 [label="case ns"]; 69 threadLoop_6 -> threadLoop_6_0 [label="0"]; 70 threadLoop_6 -> threadLoop_6_NS_INACTIVE [label="NS_INACTIVE"]; 71 threadLoop_6 -> threadLoop_6_NS_NEVER [label="NS_NEVER"]; 72 threadLoop_6 -> threadLoop_6_NS_WHENEVER [label="NS_WHENEVER"]; 73 threadLoop_6 -> threadLoop_6_default [label="default"]; 74 threadLoop_6_default [label="if (ns < 0)"]; 75 threadLoop_6_default -> threadLoop_6_default_true [label="true"]; 76 threadLoop_6_default -> threadLoop_6_default_false [label="false"]; 77 threadLoop_6_default_true [label="FATAL"]; 78 threadLoop_6_default_false [label="pauseInternal(ns) [wake()-able]\nmPausedInternal = true\nmPausedNs = ns\nreturn true"]; 79 threadLoop_6_0 [label="return true"]; 80 threadLoop_6_NS_INACTIVE [label="pauseInternal()\nmPausedInternal = true\nmPausedNs = 0\nreturn true"]; 81 threadLoop_6_NS_NEVER [label="return false"]; 82 threadLoop_6_NS_WHENEVER [label="ns = 1s"]; 83 threadLoop_6_NS_WHENEVER -> threadLoop_6_default_false; 84 85 } 86