From 7c51e75ee1c89e102ce884f3abb48f185b901a3a Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 18 Mar 2010 23:07:54 +0100 Subject: [PATCH] docs: Add thread communication sequence diagram --- docs/_static/.placeholder | 0 docs/_static/thread_communication.png | Bin 0 -> 42748 bytes docs/_static/thread_communication.txt | 32 ++++++++++++++++++++++++++ docs/development/internals.rst | 10 ++++++++ 4 files changed, 42 insertions(+) delete mode 100644 docs/_static/.placeholder create mode 100644 docs/_static/thread_communication.png create mode 100644 docs/_static/thread_communication.txt diff --git a/docs/_static/.placeholder b/docs/_static/.placeholder deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/_static/thread_communication.png b/docs/_static/thread_communication.png new file mode 100644 index 0000000000000000000000000000000000000000..4741a18cd8334506f712ad7c2c56eaea0ff47cbf GIT binary patch literal 42748 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 literal 0 HcmV?d00001 diff --git a/docs/_static/thread_communication.txt b/docs/_static/thread_communication.txt new file mode 100644 index 00000000..4357023f --- /dev/null +++ b/docs/_static/thread_communication.txt @@ -0,0 +1,32 @@ +Script for use with www.websequencediagrams.com +=============================================== + +Main -> NadMixer: start +activate NadMixer +note over NadMixer: calibrate device +NadMixer -> Main: ready +Main -> MpdHandler/Backend: start +activate MpdHandler/Backend +MpdHandler/Backend -> despotify: connect to Spotify +activate despotify +MpdHandler/Backend -> Main: ready +Main -> MpdServer/MpdSession: start +activate MpdServer/MpdSession +note over MpdServer/MpdSession: opens port +MpdServer/MpdSession -> Main: ready +Client -> MpdServer/MpdSession: connect +Client -> MpdServer/MpdSession: play 1 +MpdServer/MpdSession -> MpdHandler/Backend: play 1 +MpdHandler/Backend -> despotify: play first track +Client -> MpdServer/MpdSession: setvol 50 +MpdServer/MpdSession -> MpdHandler/Backend: setvol 50 +MpdHandler/Backend -> NadMixer: volume = 50 +Client -> MpdServer/MpdSession: status +MpdServer/MpdSession -> MpdHandler/Backend: status +MpdHandler/Backend -> NadMixer: volume? +NadMixer -> MpdHandler/Backend: volume = 50 +MpdHandler/Backend -> MpdServer/MpdSession: status response +MpdServer/MpdSession -> Client: status response +despotify -> MpdHandler/Backend: end of track callback +MpdHandler/Backend -> despotify: play second track +MpdServer/MpdSession -> MpdHandler/Backend: stop diff --git a/docs/development/internals.rst b/docs/development/internals.rst index 10a79152..0062f2df 100644 --- a/docs/development/internals.rst +++ b/docs/development/internals.rst @@ -31,3 +31,13 @@ not Mopidy. "spytify" -> "despotify" [ label="use C library" ] "DespotifyBackend" -> "AlsaMixer" [ label="use mixer API" ] "AlsaMixer" -> "alsaaudio" [ label="use Python library" ] + + +Thread communication +==================== + +.. warning:: + + This is a plan, and does not necessarily reflect what has been implemented. + +.. image:: /_static/thread_communication.png