From c01657b93fd2ff73f476197423290be99e5e0ba7 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 30 Jan 2009 17:55:01 +0100 Subject: [PATCH] continued achitecture planning for the Dummy Player --- doc/devel/draw/PlayerArch-1.svg | 649 +++++++++++++++++++++++++++----- wiki/draw/PlayerArch1.png | Bin 0 -> 56668 bytes wiki/renderengine.html | 41 +- 3 files changed, 581 insertions(+), 109 deletions(-) create mode 100644 wiki/draw/PlayerArch1.png diff --git a/doc/devel/draw/PlayerArch-1.svg b/doc/devel/draw/PlayerArch-1.svg index 519d5317d..0b28c1478 100644 --- a/doc/devel/draw/PlayerArch-1.svg +++ b/doc/devel/draw/PlayerArch-1.svg @@ -13,7 +13,7 @@ id="svg2" sodipodi:version="0.32" inkscape:version="0.45.1" - sodipodi:docbase="/mnt/Lager/heim/devel/lumi/doc/devel/draw" + sodipodi:docbase="/home/hiv/devel/lumi/doc/devel/draw" sodipodi:docname="PlayerArch-1.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.0"> @@ -25,8 +25,8 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="2" - inkscape:cx="346.20838" - inkscape:cy="304.01881" + inkscape:cx="426.20838" + inkscape:cy="310.01992" inkscape:document-units="px" inkscape:current-layer="svg2" inkscape:window-width="1668" @@ -138,72 +138,68 @@ id="rect4196" width="180.16087" height="80" - x="190.12445" - y="130" /> + x="160" + y="100" /> + width="99.876717" + height="49.91003" + x="220.07802" + y="250" /> + x="460" + y="450" /> play thread + x="470.59406" + y="460.2439" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans">TickService put(Frame&) + x="362.5" + y="402.5" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;fill:#ff5555">display(Frame&) PlaybackController - + x="163.5" + y="113.5">PlaybackController @@ -219,18 +215,6 @@ x="70" y="290" style="font-size:8px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans">start(...) - PlayProcess start_playback_thread() - - + sodipodi:role="line">play() yields Proc (or Backend?) + x="210" + y="380">Proc (or Backend?) Displayer (Proxy) PlayerFacade (Proxy) - actuallytalks to... libCommon + x="260" + y="320">libCommon + y="389.93243" /> PlayerService @@ -462,7 +432,486 @@ id="tspan2255">PlayContext + start(...) + start(...) + + Process + + + Handle<ProcessImpl> + + yields + + + + has_a + + + Display (iface) + DisplayFacade (Proxy) + + + + Displayer + DisplayService + + + + Displayer + Displayer + Displayer + open(...) + + + + CL Interface + + close() + getHandle(slot) + getHandle(slot) + getHandle(slot) + + yields + PlayerImpl + + has_a + + invokes (periodically triggered) + + periodically + + + + CL Interface + + pause() + stop() + attach_viewer() diff --git a/wiki/draw/PlayerArch1.png b/wiki/draw/PlayerArch1.png new file mode 100644 index 0000000000000000000000000000000000000000..76bb3712a21d2302c114ab47c62ffdd2d3c8ab44 GIT binary patch literal 56668 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 Q%76gESvq3NPWW8^2OKeuP5=M^ literal 0 HcmV?d00001 diff --git a/wiki/renderengine.html b/wiki/renderengine.html index 806303db6..bf608f166 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -1375,16 +1375,29 @@ Thus, the Proc-Layer exposes (one or several) facade interfaces for the GUI to u -
-
Considering how to interface to and integrate with the GUI Layer. Running the GUI is //optional,// but it requires to be [[started up|GuiStart]], installing the necessary LayerSeparationInterfaces.
+
+
Considering how to interface to and integrate with the GUI Layer. Running the GUI is //optional,// but it requires to be [[started up|GuiStart]], installing the necessary LayerSeparationInterfaces. As an example how to integrate the GUI with the lower layers, in 1/2009 we created an PlayerDummy, which "pulls" dummy frames from the (not yet existing) engine and displays them within an XV viewer widget.
+
-
+
Starting up the GUI is optional and is considered part of the Application start/stop and lifecycle.
 * main and AppState activate the lifecyle methods on the ~GuiSubsysDescriptor
-* loading a GuiStarterPlugin creates an instance of the notification interface within the InterfaceSystem
-* its implementation (within GuiStarterPlugin) is linked against the GuiNotificationFacade, i.e. the actual implementation. This link is hard wired.
-* the process of loading this GuiStarterPlugin creates an interface ref on the calling side, which is made available through the usual singleton factory embedded within the GuiNotificationFacade interface. {{red{TODO current solution doesn't handle shutdown correctly}}}
-* activating this singleton factory yields the (single) instance of the forwarding proxy, which calls through this interface ref.
+* loading a GuiStarterPlugin actually
+** loads the GUI (shared lib)
+** creates instances of all the GUI services available through LayerSeparationInterfaces
+*** GuiNotificationFacade
+*** DisplayFacade
+** Finally, the ~GTK-main() is invoked.
+
+!public services
+The GUI provides a small number of public services, callable through LayerSeparationInterfaces. Besides that, the main purpose of the GUI of course is user interaction. Effectively the behaviour of the whole system is driven by GUI events to a large extent. These events are executed within the event handling thread (~GTK-main-Thread) and may in turn invoke services of the lower layers, again through the respective LayerSeparationInterfaces.
+But the question of special interest here is how the //public services// of the GUI are implemented and made accessible for the lower Layers. Layer isolation is an issue here. If implemented in a rigorous manner, no facility within one layer may invoke implementation code of another layer directly. In practice, this tends to put quite some additional burden on the implementer, without and obvious benefit. Thus we decided to lower the barrier somewhat: while we still require that all service invoking calls are written against an public LayerSeparationInterface, actually the GUI (shared lib) is //linked// against the respective shared libs of the lower layers, thus especially enabling the exchange of iterators, closures and functor objects.
+
+Note that we retain strict isolation in the other direction: no part of the lower layers is allowed to call directly into the GUI. Thus it's especially interesting how access to some GUI public service from the lower layers works in detail.
+* when the GUI plugin starts, instances of the Services implementing those public service interfaces are created.
+* these service objects in turn hold an ~InstanceHandle, which cares to register and open the corresponding C Language Interface
+* additionally this InstanceHandle is configured such as to create an "facade proxy" object, which is implemented within liblumieracommon.so
+Now, when invoking an operation on some public interface, the code in the lower layers actually executes an implementation of this operation //on the facade proxy,// which in turn forwards the call through the CL interface into the GUI, where it is actually implemented by the corresponding service object instance.
 
@@ -1801,11 +1814,11 @@ From experiences with other middle scale projects, I prefer having the test code [img[Example: Interfaces/Namespaces of the ~Session-Subsystems|uml/fig130053.png]]
-
+
Lumiera uses a 3-layered architecture. Separation between layers is crucial. Any communication between the layers regarding the normal operation of the application should //at least be initiated// through ''Layer abstraction interfaces''. This is a low-impact version of layering, because, aside from this triggering, direct cooperation of parts within the single Lumiera process is allowed, under the condition that is is implemented using additional abstractions (interfaces with implementation level granularity). We stick to the policy of //disallowing direct coupling of implementations located in different layers.//
 
 To implement such a structure, each layer separation interface actually is comprised of several parts:
-* an CLI interface to be installed into the InterfaceSystem
+* an C Language Interface ("CL Interface") to be installed into the InterfaceSystem
 * a facade interface defining the respective abstractions in terms of the implementation language (C or C++)
 * a implementation object on the service proiding side which is directly addressed by the implementation instantiated within the InterfaceSystem
 * a proxy object on the client side, which usually is given inline alongside with the CLI interface definition.
@@ -2784,6 +2797,16 @@ We need a way of addressing existing [[pipes|Pipe]]. Besides, as the Pipes and T
 <<tasksum end>>
 
+
+
Joelholdsworth and Ichthyo created this player mockup in 1/2009 to find out about the implementation details regarding integration and colaboration between the layers. There is no working render engine yet, thus we use a ~DummyImageGenerator for creating faked yuv frames to display. Within the GUI, there is a ~PlaybackController hooked up with the transport controls on the timeline pane.
+# first everything was contained within ~PlaybackController, which spawns a thread for periodically creating those dummy frames
+# then, a ~PlayerService was factored out, now implemented within Proc-Layer (probably to be relocated into the backend for the final version). A new LayerSeparationInterface called ''~DummyPlayer'' was created and set up as a [[Subsystem]] within main().
+# the next step was to support multiple playback processes going on in parallel. Now, the ~PlaybackController holds an smart-handle to the ~PlayProcess currently generating output for this viewer, and invokes the transport control functions and the pull frame call on this handle.
+# then, also the tick generation (and thus the handling of the thread which pulls the frames) was factored out and pushed down into the mentioned ~PlayProcess. For this to work, the ~PlaybackController now makes a display slot available on the public GUI DisplayFacade interface.
+
+[img[Overview to the dummy player operation|draw/PlayerArch1.png]]
+
+
Playlist is a sequence of individual Render Engine Processors able to render a segment of the timeline. So, together these Processors are able to render the whole timeline (or part of the timeline if only a part has to be rendered).