@@ -1,4 +1,4 @@ | |||
v1.4 | |||
1.4 | |||
Repair nsmd to correctly send client data when running headless and a GUI announces later. | |||
ClientId generation now prevent collision with existing IDs. | |||
nsmd command line option --load-session to directly load one (Berkelder, Rik) | |||
@@ -15,14 +15,14 @@ Legacy-GUI: Scale icons, support more icon formats. | |||
Legacy-GUI: Show all icons and buttons when attaching to a running nsmd session | |||
Legacy-GUI: Various small fixes. | |||
v1.3.2 | |||
1.3.2 | |||
Rename new-session-manager executable to nsm-legacy-gui to prevent future confusion. | |||
v1.3.1 | |||
1.3.1 | |||
Add header copyright even to unchanged files to adhere to stricter packaging requirements. | |||
Meson can now switch off individual executables and will stop/error when trying to build without dependencies. | |||
v1.3 | |||
1.3 | |||
Rebranding to "new session manager" | |||
Upstream GUI tools "non-session-manager" and "nsm-proxy" converted to standard FLTK instead of a custom toolkit | |||
New message /nsm/gui/session/root raises NSM_API_VERSION_MINOR from 0 to 1 (1.0 -> 1.1) | |||
@@ -31,5 +31,5 @@ License upgraded to GPLv3 | |||
Simplified file structure | |||
Fix compiler warnings. | |||
v1.2.1 | |||
1.2.1 | |||
Current state of upstream Non Session Manager v1.2 including unreleased /nsm/gui/session/root |
@@ -6,7 +6,7 @@ | |||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |||
<meta name="generator" content="Asciidoctor 2.0.10"> | |||
<meta name="author" content="Jonathan Moore Liles"> | |||
<title>Non Session Manager API</title> | |||
<title>Non Session Manager - API</title> | |||
<style> | |||
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ | |||
/* Uncomment @import statement to use as custom stylesheet */ | |||
@@ -438,17 +438,87 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b | |||
</head> | |||
<body class="article"> | |||
<div id="header"> | |||
<h1>Non Session Manager API</h1> | |||
<h1>Non Session Manager - API</h1> | |||
<div class="details"> | |||
<span id="author" class="author">Jonathan Moore Liles</span><br> | |||
<span id="email" class="email"><<a href="mailto:male@tuxfamily.org">male@tuxfamily.org</a>></span><br> | |||
<span id="revnumber">version 1.2,</span> | |||
<span id="revdate">2013-04-06</span> | |||
</div> | |||
<div id="toc" class="toc"> | |||
<div id="toctitle">Table of Contents</div> | |||
<ul class="sectlevel1"> | |||
<li><a href="#_client_behavior_under_session_management">1. Client Behavior Under Session Management</a> | |||
<ul class="sectlevel2"> | |||
<li><a href="#_file_menu">1.1. File Menu</a> | |||
<ul class="sectlevel3"> | |||
<li><a href="#_new">1.1.1. New</a></li> | |||
<li><a href="#_open">1.1.2. Open</a></li> | |||
<li><a href="#_save">1.1.3. Save</a></li> | |||
<li><a href="#_save_as">1.1.4. Save As</a></li> | |||
<li><a href="#_close_as_distinguished_from_quit_or_exit">1.1.5. Close (as distinguished from Quit or Exit)</a></li> | |||
<li><a href="#_quit_or_exit">1.1.6. Quit or Exit</a></li> | |||
</ul> | |||
</li> | |||
<li><a href="#_data_storage">1.2. Data Storage</a> | |||
<ul class="sectlevel3"> | |||
<li><a href="#_internal_files">1.2.1. Internal Files</a></li> | |||
<li><a href="#_external_files">1.2.2. External Files</a></li> | |||
</ul> | |||
</li> | |||
</ul> | |||
</li> | |||
<li><a href="#_nsm_osc_protocol">2. NSM OSC Protocol</a> | |||
<ul class="sectlevel2"> | |||
<li><a href="#_establishing_a_connection">2.1. Establishing a Connection</a> | |||
<ul class="sectlevel3"> | |||
<li><a href="#_announce">2.1.1. Announce</a></li> | |||
<li><a href="#_response">2.1.2. Response</a></li> | |||
</ul> | |||
</li> | |||
<li><a href="#_server_to_client_control_messages">2.2. Server to Client Control Messages</a> | |||
<ul class="sectlevel3"> | |||
<li><a href="#_quit">2.2.1. Quit</a></li> | |||
<li><a href="#_open_2">2.2.2. Open</a> | |||
<ul class="sectlevel4"> | |||
<li><a href="#_response_2">2.2.2.1. Response</a></li> | |||
</ul> | |||
</li> | |||
<li><a href="#_save_2">2.2.3. Save</a> | |||
<ul class="sectlevel4"> | |||
<li><a href="#_response_3">2.2.3.1. Response</a></li> | |||
</ul> | |||
</li> | |||
</ul> | |||
</li> | |||
<li><a href="#_server_to_client_informational_messages">2.3. Server to Client Informational Messages</a> | |||
<ul class="sectlevel3"> | |||
<li><a href="#_session_is_loaded">2.3.1. Session is Loaded</a></li> | |||
<li><a href="#_show_optional_gui">2.3.2. Show Optional Gui</a></li> | |||
</ul> | |||
</li> | |||
<li><a href="#_client_to_server_informational_messages">2.4. Client to Server Informational Messages</a> | |||
<ul class="sectlevel3"> | |||
<li><a href="#_optional_gui">2.4.1. Optional GUI</a></li> | |||
<li><a href="#_progress">2.4.2. Progress</a></li> | |||
<li><a href="#_dirtiness">2.4.3. Dirtiness</a></li> | |||
<li><a href="#_status_messsages">2.4.4. Status Messsages</a></li> | |||
</ul> | |||
</li> | |||
<li><a href="#_error_code_definitions">2.5. Error Code Definitions</a></li> | |||
<li><a href="#_client_to_server_control">2.6. Client to Server Control</a></li> | |||
<li><a href="#_server_control_api">2.7. Server Control API</a> | |||
<ul class="sectlevel3"> | |||
<li><a href="#_client_to_client_communication">2.7.1. Client to Client Communication</a></li> | |||
</ul> | |||
</li> | |||
</ul> | |||
</li> | |||
</ul> | |||
</div> | |||
</div> | |||
<div id="content"> | |||
<div class="sect1"> | |||
<h2 id="_non_session_management_api">1. Non Session Management API</h2> | |||
<div id="preamble"> | |||
<div class="sectionbody"> | |||
<div class="paragraph"> | |||
<p>The Non Session Management API is used by the various components of the Non audio production suite | |||
@@ -480,8 +550,11 @@ these rules are meant to be followed and are non-negotiable. If an application d | |||
this specification it should be considered broken. Consistency across applications under session | |||
management is very important for a good user experience.</p> | |||
</div> | |||
<div class="sect2"> | |||
<h3 id="_client_behavior_under_session_management">1.1. Client Behavior Under Session Management</h3> | |||
</div> | |||
</div> | |||
<div class="sect1"> | |||
<h2 id="_client_behavior_under_session_management">1. Client Behavior Under Session Management</h2> | |||
<div class="sectionbody"> | |||
<div class="paragraph"> | |||
<p>Most graphical applications make available to the user a common set of file operations, typically | |||
presented under a File or Project menu.</p> | |||
@@ -496,17 +569,17 @@ an NSM session. These rules only apply when session management is active (that i | |||
consistent and predictable user experience, it is critically important for applications to adhere | |||
to these guidelines.</p> | |||
</div> | |||
<div class="sect2"> | |||
<h3 id="_file_menu">1.1. File Menu</h3> | |||
<div class="sect3"> | |||
<h4 id="_file_menu">1.1.1. File Menu</h4> | |||
<div class="sect4"> | |||
<h5 id="_new">1.1.1.1. New</h5> | |||
<h4 id="_new">1.1.1. New</h4> | |||
<div class="paragraph"> | |||
<p>This option may empty/reset the current file or project (possibly after user confirmation). UNDER | |||
NO CIRCUMSTANCES should it allow the user to create a new project/file in another location.</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_open">1.1.1.2. Open</h5> | |||
<div class="sect3"> | |||
<h4 id="_open">1.1.2. Open</h4> | |||
<div class="paragraph"> | |||
<p>This option MUST be disabled.</p> | |||
</div> | |||
@@ -515,8 +588,8 @@ NO CIRCUMSTANCES should it allow the user to create a new project/file in anothe | |||
copy of a file/project which is then saved at the session path provided by NSM.</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_save">1.1.1.3. Save</h5> | |||
<div class="sect3"> | |||
<h4 id="_save">1.1.3. Save</h4> | |||
<div class="paragraph"> | |||
<p>This option should behave as normal, saving the current file/project as established by the NSM | |||
<code>open</code> message.</p> | |||
@@ -525,8 +598,8 @@ copy of a file/project which is then saved at the session path provided by NSM.< | |||
<p>UNDER NO CIRCUMSTANCES should this option present the user with a choice of where to save the file.</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_save_as">1.1.1.4. Save As</h5> | |||
<div class="sect3"> | |||
<h4 id="_save_as">1.1.4. Save As</h4> | |||
<div class="paragraph"> | |||
<p>This option MUST be disabled.</p> | |||
</div> | |||
@@ -536,24 +609,24 @@ creates a copy of the current file/project which is then saved in a user-specifi | |||
of the session path provided by NSM.</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_close_as_distinguished_from_quit_or_exit">1.1.1.5. Close (as distinguished from Quit or Exit)</h5> | |||
<div class="sect3"> | |||
<h4 id="_close_as_distinguished_from_quit_or_exit">1.1.5. Close (as distinguished from Quit or Exit)</h4> | |||
<div class="paragraph"> | |||
<p>This option MUST be disabled unless its meaning is to disconnect the application from session | |||
management.</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_quit_or_exit">1.1.1.6. Quit or Exit</h5> | |||
<div class="sect3"> | |||
<h4 id="_quit_or_exit">1.1.6. Quit or Exit</h4> | |||
<div class="paragraph"> | |||
<p>This option may behave as normal (possibly asking the user to confirm exiting).</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="sect2"> | |||
<h3 id="_data_storage">1.2. Data Storage</h3> | |||
<div class="sect3"> | |||
<h4 id="_data_storage">1.1.2. Data Storage</h4> | |||
<div class="sect4"> | |||
<h5 id="_internal_files">1.1.2.1. Internal Files</h5> | |||
<h4 id="_internal_files">1.2.1. Internal Files</h4> | |||
<div class="paragraph"> | |||
<p>All project specific data created by a client MUST be stored in the per-client storage area | |||
provided by NSM. This includes all recorded audio and MIDI files, snapshots, etc. Only global | |||
@@ -561,8 +634,8 @@ configuration items, exports, and renders of the project may be stored elsewhere | |||
specifies).</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_external_files">1.1.2.2. External Files</h5> | |||
<div class="sect3"> | |||
<h4 id="_external_files">1.2.2. External Files</h4> | |||
<div class="paragraph"> | |||
<p>Files required by the project but external to it (typically read-only data such as audio samples) | |||
SHOULD be referenced by creating a symbolic link within the assigned session area, and then | |||
@@ -574,8 +647,10 @@ to (some unique component may be required to prevent collisions)</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="sect2"> | |||
<h3 id="_nsm_osc_protocol">1.2. NSM OSC Protocol</h3> | |||
</div> | |||
<div class="sect1"> | |||
<h2 id="_nsm_osc_protocol">2. NSM OSC Protocol</h2> | |||
<div class="sectionbody"> | |||
<div class="paragraph"> | |||
<p>All message parameters are REQUIRED. All messages MUST be sent from the same socket as the <code>announce</code> | |||
message, using the <code>lo_send_from</code> method of liblo or its equivalent, as the server uses the return | |||
@@ -585,10 +660,10 @@ addresses to distinguish between clients.</p> | |||
<p>Clients MUST create thier OSC servers using the same protocol (UDP,TCP) as found in <code>NSM_URL</code>. liblo | |||
is lacking a robust TCP implementation at the time of writing, but in the future it may be useful.</p> | |||
</div> | |||
<div class="sect2"> | |||
<h3 id="_establishing_a_connection">2.1. Establishing a Connection</h3> | |||
<div class="sect3"> | |||
<h4 id="_establishing_a_connection">1.2.1. Establishing a Connection</h4> | |||
<div class="sect4"> | |||
<h5 id="_announce">1.2.1.1. Announce</h5> | |||
<h4 id="_announce">2.1.1. Announce</h4> | |||
<div class="paragraph"> | |||
<p>At launch, the client MUST check the environment for the value of <code>NSM_URL</code>. If present, the client | |||
MUST send the following message to the provided address as soon as it is ready to respond to the | |||
@@ -663,8 +738,8 @@ like Python can be more challenging.</p> | |||
</tbody> | |||
</table> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_response">1.2.1.2. Response</h5> | |||
<div class="sect3"> | |||
<h4 id="_response">2.1.2. Response</h4> | |||
<div class="paragraph"> | |||
<p>The server will respond to the client’s announce message with the following message:</p> | |||
</div> | |||
@@ -757,8 +832,8 @@ For example, the Non applications activate their "SM" blinkers at this time.</p> | |||
</table> | |||
</div> | |||
</div> | |||
<div class="sect3"> | |||
<h4 id="_server_to_client_control_messages">1.2.2. Server to Client Control Messages</h4> | |||
<div class="sect2"> | |||
<h3 id="_server_to_client_control_messages">2.2. Server to Client Control Messages</h3> | |||
<div class="paragraph"> | |||
<p>Compliant clients MUST accept the client control messages described in this section. All client | |||
control messages REQUIRE a response. Responses MUST be delivered back to the sender (NSM) from the | |||
@@ -785,8 +860,8 @@ replied to (e.g. "nsm/client/save":</p> | |||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/error s:path i:error_code s:message</code></pre> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_quit">1.2.2.1. Quit</h5> | |||
<div class="sect3"> | |||
<h4 id="_quit">2.2.1. Quit</h4> | |||
<div class="paragraph"> | |||
<p>There is no message for this. Clients will receive the Unix SIGTERM signal and MUST close cleanly | |||
IMMEDIATELY, without displaying any kind of dialog to the user and regardless of whether or not | |||
@@ -794,8 +869,8 @@ unsaved changes would be lost. When a session is closed the application will rec | |||
soon after having responded to a <code>save</code> message.</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_open_2">1.2.2.2. Open</h5> | |||
<div class="sect3"> | |||
<h4 id="_open_2">2.2.2. Open</h4> | |||
<div class="listingblock"> | |||
<div class="content"> | |||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/open s:path_to_instance_specific_project s:display_name s:client_id</code></pre> | |||
@@ -862,8 +937,8 @@ renaming existing clients, although this is a sorely needed addition.</p> | |||
<p>A response is REQUIRED as soon as the open operation has been completed. Ongoing progress may be | |||
indicated by sending messages to <code>/nsm/client/progress</code>.</p> | |||
</div> | |||
<div class="sect5"> | |||
<h6 id="_response_2">Response</h6> | |||
<div class="sect4"> | |||
<h5 id="_response_2">2.2.2.1. Response</h5> | |||
<div class="paragraph"> | |||
<p>The client MUST respond to the 'open' message with:</p> | |||
</div> | |||
@@ -917,8 +992,8 @@ indicated by sending messages to <code>/nsm/client/progress</code>.</p> | |||
</table> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_save_2">1.2.2.3. Save</h5> | |||
<div class="sect3"> | |||
<h4 id="_save_2">2.2.3. Save</h4> | |||
<div class="listingblock"> | |||
<div class="content"> | |||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/save</code></pre> | |||
@@ -928,8 +1003,8 @@ indicated by sending messages to <code>/nsm/client/progress</code>.</p> | |||
<p>This message will only be delivered after a previous <code>open</code> message, and may be sent any number of | |||
times within the course of a session (including zero, if the user aborts the session).</p> | |||
</div> | |||
<div class="sect5"> | |||
<h6 id="_response_3">Response</h6> | |||
<div class="sect4"> | |||
<h5 id="_response_3">2.2.3.1. Response</h5> | |||
<div class="listingblock"> | |||
<div class="content"> | |||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/reply "/nsm/client/save" s:message</code></pre> | |||
@@ -973,10 +1048,10 @@ times within the course of a session (including zero, if the user aborts the ses | |||
</div> | |||
</div> | |||
</div> | |||
<div class="sect2"> | |||
<h3 id="_server_to_client_informational_messages">2.3. Server to Client Informational Messages</h3> | |||
<div class="sect3"> | |||
<h4 id="_server_to_client_informational_messages">1.2.3. Server to Client Informational Messages</h4> | |||
<div class="sect4"> | |||
<h5 id="_session_is_loaded">1.2.3.1. Session is Loaded</h5> | |||
<h4 id="_session_is_loaded">2.3.1. Session is Loaded</h4> | |||
<div class="paragraph"> | |||
<p>Accepting this message is optional. The intent is to signal to clients which may have some | |||
interdependence (say, peer to peer OSC connections) that the session is fully loaded and all their | |||
@@ -993,8 +1068,8 @@ on this message MUST not do so by delaying initialization waiting for it.</p> | |||
<p>This message does not require a response.</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_show_optional_gui">1.2.3.2. Show Optional Gui</h5> | |||
<div class="sect3"> | |||
<h4 id="_show_optional_gui">2.3.2. Show Optional Gui</h4> | |||
<div class="paragraph"> | |||
<p>If the client has specified the <code>optional-gui</code> capability, then it may receive this message from the | |||
server when the user wishes to change the visibility state of the GUI. It doesn’t matter if the | |||
@@ -1017,10 +1092,10 @@ separate program, it should be killed.</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="sect2"> | |||
<h3 id="_client_to_server_informational_messages">2.4. Client to Server Informational Messages</h3> | |||
<div class="sect3"> | |||
<h4 id="_client_to_server_informational_messages">1.2.4. Client to Server Informational Messages</h4> | |||
<div class="sect4"> | |||
<h5 id="_optional_gui">1.2.4.1. Optional GUI</h5> | |||
<h4 id="_optional_gui">2.4.1. Optional GUI</h4> | |||
<div class="paragraph"> | |||
<p>If the client has specified the <code>optional-gui</code> capability, then it MUST send this message whenever | |||
the state of visibility of the optional GUI has changed. It also MUST send this message after it’s | |||
@@ -1044,8 +1119,8 @@ loads.</p> | |||
<p>No response will be delivered.</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_progress">1.2.4.2. Progress</h5> | |||
<div class="sect3"> | |||
<h4 id="_progress">2.4.2. Progress</h4> | |||
<div class="listingblock"> | |||
<div class="content"> | |||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/progress f:progress</code></pre> | |||
@@ -1068,8 +1143,8 @@ message is still REQUIRED.</p> | |||
capability string.</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_dirtiness">1.2.4.3. Dirtiness</h5> | |||
<div class="sect3"> | |||
<h4 id="_dirtiness">2.4.3. Dirtiness</h4> | |||
<div class="listingblock"> | |||
<div class="content"> | |||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/is_dirty</code></pre> | |||
@@ -1088,8 +1163,8 @@ may optionally send <code>is_dirty</code> and <code>is_clean</code> messages.</p | |||
<p>Clients which have this capability should include <code>:dirty:</code> in their <code>announce</code> capability string.</p> | |||
</div> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_status_messsages">1.2.4.4. Status Messsages</h5> | |||
<div class="sect3"> | |||
<h4 id="_status_messsages">2.4.4. Status Messsages</h4> | |||
<div class="listingblock"> | |||
<div class="content"> | |||
<pre class="highlight nowrap"><code class="language-OSC" data-lang="OSC">/nsm/client/message i:priority s:message</code></pre> | |||
@@ -1106,8 +1181,8 @@ string.</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="sect3"> | |||
<h4 id="_error_code_definitions">1.2.5. Error Code Definitions</h4> | |||
<div class="sect2"> | |||
<h3 id="_error_code_definitions">2.5. Error Code Definitions</h3> | |||
<table class="tableblock frame-all grid-all stripes-even stretch"> | |||
<caption class="title">Table 6. Error Code Definitions</caption> | |||
<colgroup> | |||
@@ -1164,8 +1239,8 @@ string.</p> | |||
</tbody> | |||
</table> | |||
</div> | |||
<div class="sect3"> | |||
<h4 id="_client_to_server_control">1.2.6. Client to Server Control</h4> | |||
<div class="sect2"> | |||
<h3 id="_client_to_server_control">2.6. Client to Server Control</h3> | |||
<div class="paragraph"> | |||
<p>If the server publishes the <code>:server_control:</code> capability, then clients can also initiate action by | |||
the server. For example, a client might implement a 'Save All' option which sends a | |||
@@ -1173,8 +1248,8 @@ the server. For example, a client might implement a 'Save All' option which send | |||
management interface to effect the save.</p> | |||
</div> | |||
</div> | |||
<div class="sect3"> | |||
<h4 id="_server_control_api">1.2.7. Server Control API</h4> | |||
<div class="sect2"> | |||
<h3 id="_server_control_api">2.7. Server Control API</h3> | |||
<div class="paragraph"> | |||
<p>The session manager not only manages clients via OSC, but it is itself controlled via OSC messages. | |||
The server responds to the following messages.</p> | |||
@@ -1330,8 +1405,8 @@ error.</p> | |||
</li> | |||
</ul> | |||
</div> | |||
<div class="sect4"> | |||
<h5 id="_client_to_client_communication">1.2.7.1. Client to Client Communication</h5> | |||
<div class="sect3"> | |||
<h4 id="_client_to_client_communication">2.7.1. Client to Client Communication</h4> | |||
<div class="paragraph"> | |||
<p>If the server includes <code>:broadcast:</code> in its capability string, then clients may send broadcast | |||
messages to each other through the NSM server. Clients may send messages to the server at the path | |||
@@ -1375,11 +1450,10 @@ of which might respond to the message by updating their own tempo maps.</p> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<div id="footer"> | |||
<div id="footer-text"> | |||
Version 1.2<br> | |||
Last updated 2020-07-06 18:12:58 +0200 | |||
Last updated 2020-07-06 22:15:39 +0200 | |||
</div> | |||
</div> | |||
</body> |
@@ -0,0 +1,563 @@ | |||
<!DOCTYPE html> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> | |||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |||
<meta name="generator" content="Asciidoctor 2.0.10"> | |||
<meta name="author" content="LinuxAudio.org"> | |||
<title>New Session Manager Documentation</title> | |||
<style> | |||
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ | |||
/* Uncomment @import statement to use as custom stylesheet */ | |||
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/ | |||
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block} | |||
audio,video{display:inline-block} | |||
audio:not([controls]){display:none;height:0} | |||
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%} | |||
a{background:none} | |||
a:focus{outline:thin dotted} | |||
a:active,a:hover{outline:0} | |||
h1{font-size:2em;margin:.67em 0} | |||
abbr[title]{border-bottom:1px dotted} | |||
b,strong{font-weight:bold} | |||
dfn{font-style:italic} | |||
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0} | |||
mark{background:#ff0;color:#000} | |||
code,kbd,pre,samp{font-family:monospace;font-size:1em} | |||
pre{white-space:pre-wrap} | |||
q{quotes:"\201C" "\201D" "\2018" "\2019"} | |||
small{font-size:80%} | |||
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} | |||
sup{top:-.5em} | |||
sub{bottom:-.25em} | |||
img{border:0} | |||
svg:not(:root){overflow:hidden} | |||
figure{margin:0} | |||
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em} | |||
legend{border:0;padding:0} | |||
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} | |||
button,input{line-height:normal} | |||
button,select{text-transform:none} | |||
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer} | |||
button[disabled],html input[disabled]{cursor:default} | |||
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0} | |||
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} | |||
textarea{overflow:auto;vertical-align:top} | |||
table{border-collapse:collapse;border-spacing:0} | |||
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box} | |||
html,body{font-size:100%} | |||
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased} | |||
a:hover{cursor:pointer} | |||
img,object,embed{max-width:100%;height:auto} | |||
object,embed{height:100%} | |||
img{-ms-interpolation-mode:bicubic} | |||
.left{float:left!important} | |||
.right{float:right!important} | |||
.text-left{text-align:left!important} | |||
.text-right{text-align:right!important} | |||
.text-center{text-align:center!important} | |||
.text-justify{text-align:justify!important} | |||
.hide{display:none} | |||
img,object,svg{display:inline-block;vertical-align:middle} | |||
textarea{height:auto;min-height:50px} | |||
select{width:100%} | |||
.center{margin-left:auto;margin-right:auto} | |||
.stretch{width:100%} | |||
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em} | |||
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr} | |||
a{color:#2156a5;text-decoration:underline;line-height:inherit} | |||
a:hover,a:focus{color:#1d4b8f} | |||
a img{border:0} | |||
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility} | |||
p aside{font-size:.875em;line-height:1.35;font-style:italic} | |||
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em} | |||
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0} | |||
h1{font-size:2.125em} | |||
h2{font-size:1.6875em} | |||
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em} | |||
h4,h5{font-size:1.125em} | |||
h6{font-size:1em} | |||
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0} | |||
em,i{font-style:italic;line-height:inherit} | |||
strong,b{font-weight:bold;line-height:inherit} | |||
small{font-size:60%;line-height:inherit} | |||
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)} | |||
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit} | |||
ul,ol{margin-left:1.5em} | |||
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em} | |||
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit} | |||
ul.square{list-style-type:square} | |||
ul.circle{list-style-type:circle} | |||
ul.disc{list-style-type:disc} | |||
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0} | |||
dl dt{margin-bottom:.3125em;font-weight:bold} | |||
dl dd{margin-bottom:1.25em} | |||
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help} | |||
abbr{text-transform:none} | |||
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd} | |||
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)} | |||
blockquote cite::before{content:"\2014 \0020"} | |||
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)} | |||
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)} | |||
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2} | |||
h1{font-size:2.75em} | |||
h2{font-size:2.3125em} | |||
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em} | |||
h4{font-size:1.4375em}} | |||
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede} | |||
table thead,table tfoot{background:#f7f8f7} | |||
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left} | |||
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)} | |||
table tr.even,table tr.alt{background:#f8f8f7} | |||
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6} | |||
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em} | |||
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400} | |||
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table} | |||
.clearfix::after,.float-group::after{clear:both} | |||
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word} | |||
:not(pre)>code.nobreak{word-wrap:normal} | |||
:not(pre)>code.nowrap{white-space:nowrap} | |||
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed} | |||
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit} | |||
pre>code{display:block} | |||
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal} | |||
em em{font-style:normal} | |||
strong strong{font-weight:400} | |||
.keyseq{color:rgba(51,51,51,.8)} | |||
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap} | |||
.keyseq kbd:first-child{margin-left:0} | |||
.keyseq kbd:last-child{margin-right:0} | |||
.menuseq,.menuref{color:#000} | |||
.menuseq b:not(.caret),.menuref{font-weight:inherit} | |||
.menuseq{word-spacing:-.02em} | |||
.menuseq b.caret{font-size:1.25em;line-height:.8} | |||
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em} | |||
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400} | |||
b.button::before{content:"[";padding:0 3px 0 2px} | |||
b.button::after{content:"]";padding:0 2px 0 3px} | |||
p a>code:hover{color:rgba(0,0,0,.9)} | |||
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em} | |||
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table} | |||
#header::after,#content::after,#footnotes::after,#footer::after{clear:both} | |||
#content{margin-top:1.25em} | |||
#content::before{content:none} | |||
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} | |||
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf} | |||
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px} | |||
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap} | |||
#header .details span:first-child{margin-left:-.125em} | |||
#header .details span.email a{color:rgba(0,0,0,.85)} | |||
#header .details br{display:none} | |||
#header .details br+span::before{content:"\00a0\2013\00a0"} | |||
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)} | |||
#header .details br+span#revremark::before{content:"\00a0|\00a0"} | |||
#header #revnumber{text-transform:capitalize} | |||
#header #revnumber::after{content:"\00a0"} | |||
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem} | |||
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em} | |||
#toc>ul{margin-left:.125em} | |||
#toc ul.sectlevel0>li>a{font-style:italic} | |||
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0} | |||
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none} | |||
#toc li{line-height:1.3334;margin-top:.3334em} | |||
#toc a{text-decoration:none} | |||
#toc a:active{text-decoration:underline} | |||
#toctitle{color:#7a2518;font-size:1.2em} | |||
@media screen and (min-width:768px){#toctitle{font-size:1.375em} | |||
body.toc2{padding-left:15em;padding-right:0} | |||
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto} | |||
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em} | |||
#toc.toc2>ul{font-size:.9em;margin-bottom:0} | |||
#toc.toc2 ul ul{margin-left:0;padding-left:1em} | |||
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em} | |||
body.toc2.toc-right{padding-left:0;padding-right:15em} | |||
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}} | |||
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0} | |||
#toc.toc2{width:20em} | |||
#toc.toc2 #toctitle{font-size:1.375em} | |||
#toc.toc2>ul{font-size:.95em} | |||
#toc.toc2 ul ul{padding-left:1.25em} | |||
body.toc2.toc-right{padding-left:0;padding-right:20em}} | |||
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px} | |||
#content #toc>:first-child{margin-top:0} | |||
#content #toc>:last-child{margin-bottom:0} | |||
#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em} | |||
#footer-text{color:rgba(255,255,255,.8);line-height:1.44} | |||
#content{margin-bottom:.625em} | |||
.sect1{padding-bottom:.625em} | |||
@media screen and (min-width:768px){#content{margin-bottom:1.25em} | |||
.sect1{padding-bottom:1.25em}} | |||
.sect1:last-child{padding-bottom:0} | |||
.sect1+.sect1{border-top:1px solid #e7e7e9} | |||
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} | |||
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} | |||
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} | |||
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} | |||
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221} | |||
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em} | |||
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em} | |||
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic} | |||
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0} | |||
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)} | |||
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit} | |||
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%} | |||
.admonitionblock>table td.icon{text-align:center;width:80px} | |||
.admonitionblock>table td.icon img{max-width:none} | |||
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase} | |||
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)} | |||
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0} | |||
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px} | |||
.exampleblock>.content>:first-child{margin-top:0} | |||
.exampleblock>.content>:last-child{margin-bottom:0} | |||
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px} | |||
.sidebarblock>:first-child{margin-top:0} | |||
.sidebarblock>:last-child{margin-bottom:0} | |||
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} | |||
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} | |||
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em} | |||
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}} | |||
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}} | |||
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8} | |||
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)} | |||
.listingblock>.content{position:relative} | |||
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5} | |||
.listingblock:hover code[data-lang]::before{display:block} | |||
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5} | |||
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"} | |||
.listingblock pre.highlightjs{padding:0} | |||
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px} | |||
.listingblock pre.prettyprint{border-width:0} | |||
.prettyprint{background:#f7f7f8} | |||
pre.prettyprint .linenums{line-height:1.45;margin-left:2em} | |||
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0} | |||
pre.prettyprint li code[data-lang]::before{opacity:1} | |||
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none} | |||
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none} | |||
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal} | |||
table.linenotable td.code{padding-left:.75em} | |||
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em} | |||
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em} | |||
pre.pygments .lineno::before{content:"";margin-right:-.125em} | |||
.quoteblock{margin:0 1em 1.25em 1.5em;display:table} | |||
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em} | |||
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify} | |||
.quoteblock blockquote{margin:0;padding:0;border:0} | |||
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)} | |||
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0} | |||
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right} | |||
.verseblock{margin:0 1em 1.25em} | |||
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility} | |||
.verseblock pre strong{font-weight:400} | |||
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex} | |||
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic} | |||
.quoteblock .attribution br,.verseblock .attribution br{display:none} | |||
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)} | |||
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none} | |||
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0} | |||
.quoteblock.abstract{margin:0 1em 1.25em;display:block} | |||
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center} | |||
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf} | |||
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0} | |||
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem} | |||
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0} | |||
table.tableblock{max-width:100%;border-collapse:separate} | |||
p.tableblock:last-child{margin-bottom:0} | |||
td.tableblock>.content>:last-child{margin-bottom:-1.25em} | |||
td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0} | |||
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede} | |||
table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0} | |||
table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0} | |||
table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0} | |||
table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px} | |||
table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0} | |||
table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0} | |||
table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0} | |||
table.frame-all{border-width:1px} | |||
table.frame-sides{border-width:0 1px} | |||
table.frame-topbot,table.frame-ends{border-width:1px 0} | |||
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7} | |||
th.halign-left,td.halign-left{text-align:left} | |||
th.halign-right,td.halign-right{text-align:right} | |||
th.halign-center,td.halign-center{text-align:center} | |||
th.valign-top,td.valign-top{vertical-align:top} | |||
th.valign-bottom,td.valign-bottom{vertical-align:bottom} | |||
th.valign-middle,td.valign-middle{vertical-align:middle} | |||
table thead th,table tfoot th{font-weight:bold} | |||
tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7} | |||
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold} | |||
p.tableblock>code:only-child{background:none;padding:0} | |||
p.tableblock{font-size:1em} | |||
ol{margin-left:1.75em} | |||
ul li ol{margin-left:1.5em} | |||
dl dd{margin-left:1.125em} | |||
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0} | |||
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em} | |||
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none} | |||
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em} | |||
ul.unstyled,ol.unstyled{margin-left:0} | |||
ul.checklist{margin-left:.625em} | |||
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em} | |||
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em} | |||
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em} | |||
ul.inline>li{margin-left:1.25em} | |||
.unstyled dl dt{font-weight:400;font-style:normal} | |||
ol.arabic{list-style-type:decimal} | |||
ol.decimal{list-style-type:decimal-leading-zero} | |||
ol.loweralpha{list-style-type:lower-alpha} | |||
ol.upperalpha{list-style-type:upper-alpha} | |||
ol.lowerroman{list-style-type:lower-roman} | |||
ol.upperroman{list-style-type:upper-roman} | |||
ol.lowergreek{list-style-type:lower-greek} | |||
.hdlist>table,.colist>table{border:0;background:none} | |||
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none} | |||
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em} | |||
td.hdlist1{font-weight:bold;padding-bottom:1.25em} | |||
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em} | |||
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top} | |||
.colist td:not([class]):first-child img{max-width:none} | |||
.colist td:not([class]):last-child{padding:.25em 0} | |||
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd} | |||
.imageblock.left{margin:.25em .625em 1.25em 0} | |||
.imageblock.right{margin:.25em 0 1.25em .625em} | |||
.imageblock>.title{margin-bottom:0} | |||
.imageblock.thumb,.imageblock.th{border-width:6px} | |||
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em} | |||
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0} | |||
.image.left{margin-right:.625em} | |||
.image.right{margin-left:.625em} | |||
a.image{text-decoration:none;display:inline-block} | |||
a.image object{pointer-events:none} | |||
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super} | |||
sup.footnote a,sup.footnoteref a{text-decoration:none} | |||
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline} | |||
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em} | |||
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0} | |||
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em} | |||
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em} | |||
#footnotes .footnote:last-of-type{margin-bottom:0} | |||
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0} | |||
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0} | |||
.gist .file-data>table td.line-data{width:99%} | |||
div.unbreakable{page-break-inside:avoid} | |||
.big{font-size:larger} | |||
.small{font-size:smaller} | |||
.underline{text-decoration:underline} | |||
.overline{text-decoration:overline} | |||
.line-through{text-decoration:line-through} | |||
.aqua{color:#00bfbf} | |||
.aqua-background{background:#00fafa} | |||
.black{color:#000} | |||
.black-background{background:#000} | |||
.blue{color:#0000bf} | |||
.blue-background{background:#0000fa} | |||
.fuchsia{color:#bf00bf} | |||
.fuchsia-background{background:#fa00fa} | |||
.gray{color:#606060} | |||
.gray-background{background:#7d7d7d} | |||
.green{color:#006000} | |||
.green-background{background:#007d00} | |||
.lime{color:#00bf00} | |||
.lime-background{background:#00fa00} | |||
.maroon{color:#600000} | |||
.maroon-background{background:#7d0000} | |||
.navy{color:#000060} | |||
.navy-background{background:#00007d} | |||
.olive{color:#606000} | |||
.olive-background{background:#7d7d00} | |||
.purple{color:#600060} | |||
.purple-background{background:#7d007d} | |||
.red{color:#bf0000} | |||
.red-background{background:#fa0000} | |||
.silver{color:#909090} | |||
.silver-background{background:#bcbcbc} | |||
.teal{color:#006060} | |||
.teal-background{background:#007d7d} | |||
.white{color:#bfbfbf} | |||
.white-background{background:#fafafa} | |||
.yellow{color:#bfbf00} | |||
.yellow-background{background:#fafa00} | |||
span.icon>.fa{cursor:default} | |||
a span.icon>.fa{cursor:inherit} | |||
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default} | |||
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c} | |||
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111} | |||
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900} | |||
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400} | |||
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000} | |||
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold} | |||
.conum[data-value] *{color:#fff!important} | |||
.conum[data-value]+b{display:none} | |||
.conum[data-value]::after{content:attr(data-value)} | |||
pre .conum[data-value]{position:relative;top:-.125em} | |||
b.conum *{color:inherit!important} | |||
.conum:not([data-value]):empty{display:none} | |||
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility} | |||
h1,h2,p,td.content,span.alt{letter-spacing:-.01em} | |||
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em} | |||
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem} | |||
p{margin-bottom:1.25rem} | |||
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em} | |||
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc} | |||
.print-only{display:none!important} | |||
@page{margin:1.25cm .75cm} | |||
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important} | |||
html{font-size:80%} | |||
a{color:inherit!important;text-decoration:underline!important} | |||
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important} | |||
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em} | |||
abbr[title]::after{content:" (" attr(title) ")"} | |||
pre,blockquote,tr,img,object,svg{page-break-inside:avoid} | |||
thead{display:table-header-group} | |||
svg{max-width:100%} | |||
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3} | |||
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid} | |||
#toc,.sidebarblock,.exampleblock>.content{background:none!important} | |||
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important} | |||
body.book #header{text-align:center} | |||
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em} | |||
body.book #header .details{border:0!important;display:block;padding:0!important} | |||
body.book #header .details span:first-child{margin-left:0!important} | |||
body.book #header .details br{display:block} | |||
body.book #header .details br+span::before{content:none!important} | |||
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important} | |||
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always} | |||
.listingblock code[data-lang]::before{display:block} | |||
#footer{padding:0 .9375em} | |||
.hide-on-print{display:none!important} | |||
.print-only{display:block!important} | |||
.hide-for-print{display:none!important} | |||
.show-for-print{display:inherit!important}} | |||
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem} | |||
.sect1{padding:0!important} | |||
.sect1+.sect1{border:0} | |||
#footer{background:none} | |||
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}} | |||
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}} | |||
</style> | |||
</head> | |||
<body class="article"> | |||
<div id="header"> | |||
<h1>New Session Manager Documentation</h1> | |||
<div class="details"> | |||
<span id="author" class="author">LinuxAudio.org</span><br> | |||
<span id="revnumber">version 1.4</span> | |||
</div> | |||
</div> | |||
<div id="content"> | |||
<div id="preamble"> | |||
<div class="sectionbody"> | |||
<div class="ulist"> | |||
<ul> | |||
<li> | |||
<p><a href="https://github.com/linuxaudio/new-session-manager">Sourcecode</a></p> | |||
</li> | |||
<li> | |||
<p><a href="https://github.com/linuxaudio/new-session-manager/issues">Bug and Issue Tracker</a></p> | |||
</li> | |||
<li> | |||
<p><a href="api/index.html">API</a> document that describes all OSC Messages</p> | |||
</li> | |||
<li> | |||
<p><a href="http://non.tuxfamily.org/session-manager/doc/MANUAL.html">Legacy-GUI Manual</a>. The original Non-Session-Manager manual is still valid.</p> | |||
</li> | |||
</ul> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="sect1"> | |||
<h2 id="_introduction">Introduction</h2> | |||
<div class="sectionbody"> | |||
<div class="paragraph"> | |||
<p>New Session Manager (NSM) is a tool to assist music production by grouping standalone programs into sessions. | |||
Your workflow becomes easy to manage, robust and fast by leveraging the full potential of cooperative applications.</p> | |||
</div> | |||
<div class="paragraph"> | |||
<p>It is a community version of the "NON Session Manager" and free in every sense of the word: | |||
free of cost, free to share and use, free of spyware or ads, free-and-open-source.</p> | |||
</div> | |||
<div class="paragraph"> | |||
<p>You can create a session, or project, add programs to it and then use commands to save, start/stop, | |||
hide/show all programs at once, or individually. At a later date you can then re-open the session | |||
and continue where you left off.</p> | |||
</div> | |||
<div class="paragraph"> | |||
<p>All files belonging to the session will be saved in the same directory.</p> | |||
</div> | |||
<div class="paragraph"> | |||
<p>If you are a user (and not a programmer or packager) everything you need is to install NSM | |||
through your distributions package manager and, highly recommended, Argodejo as a GUI (see below).</p> | |||
</div> | |||
<div class="paragraph"> | |||
<p>To learn NSM you don’t need to know the background information from our documentation, which | |||
is aimed at developers that want to implement NSM support in their programs. Learn the GUI, | |||
not the server and protocol.</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="sect1"> | |||
<h2 id="_bullet_points">Bullet Points</h2> | |||
<div class="sectionbody"> | |||
<div class="ulist"> | |||
<ul> | |||
<li> | |||
<p>Drop-In replacement for the non-session-manager daemon nsmd and tools (e.g. jackpatch)</p> | |||
</li> | |||
<li> | |||
<p>Simple and hassle-free build system to make packaging easy</p> | |||
</li> | |||
<li> | |||
<p>Possibility to react to sensible bug fixes that would not have been integrated original nsmd</p> | |||
</li> | |||
<li> | |||
<p>Stay upwards and downwards compatible with original nsmd</p> | |||
</li> | |||
<li> | |||
<p>Conservative and hesitant in regards to new features and behaviour-changes, but possible in principle</p> | |||
</li> | |||
<li> | |||
<p>Keep the session-manager separate from the other NON* tools Mixer, Sequencer and Timeline.</p> | |||
</li> | |||
<li> | |||
<p>Protect nsmd from vanishing from the internet one day.</p> | |||
</li> | |||
<li> | |||
<p>The goal is to become the de-facto standard session manager for Linux distributions</p> | |||
</li> | |||
</ul> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="sect1"> | |||
<h2 id="_user_interface">User Interface</h2> | |||
<div class="sectionbody"> | |||
<div class="paragraph"> | |||
<p>It is highly recommended to use Argodejo ( <a href="https://www.laborejo.org/argodejo/" class="bare">https://www.laborejo.org/argodejo/</a> ) as graphical | |||
user interface. In fact, if you install Argodejo in you distribution it will install NSM as | |||
dependency and you don’t need to do anything yourself with this software package.</p> | |||
</div> | |||
<div class="paragraph"> | |||
<p>This repository also contains the legacy FLTK interface simply called <code>nsm-legacy-gui</code>, | |||
symlinked to <code>non-session-manager</code> for backwards compatibility. (e.g. autostart scripts etc.)</p> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="sect1"> | |||
<h2 id="_supported_clients">Supported Clients</h2> | |||
<div class="sectionbody"> | |||
<div class="paragraph"> | |||
<p>While NSM can start and stop any program it only becomes convenient if clients specifically | |||
implement support. This enables saving and hiding the GUI, amongst other features. | |||
Documentation and tutorials for software-developers will be added at a later date.</p> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<div id="footer"> | |||
<div id="footer-text"> | |||
Version 1.4<br> | |||
Last updated 2020-07-06 22:15:39 +0200 | |||
</div> | |||
</div> | |||
</body> | |||
</html> |
@@ -1,13 +0,0 @@ | |||
This is an internal reminder what to check and change before a release. | |||
/documentation/API/api.adoc | |||
:revnumber: | |||
:revdate: | |||
Version number in /meson.build (one occurence) | |||
Version number and changes in /CHANGELOG | |||
Regenerate API and Website html to update the date in their footer | |||
We do not change the copyright date in file license-headers. That is not required by law and only | |||
exist to mark to year of the fork. In the future it might be removed completely. | |||
@@ -1,8 +1,9 @@ | |||
//// | |||
This is not an "asciidoctor", not plain "asciidoc" document. | |||
This is "asciidoctor", not plain "asciidoc". | |||
https://asciidoctor.org/docs/user-manual/ | |||
//// | |||
//// | |||
This documentation is licensed under the Creative Commons Attribution-ShareAlike 2.5 International License. | |||
To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/2.5/legalcode or send a | |||
@@ -14,7 +15,6 @@ A copy of the license has been provided in the file documentation/API/LICENSE. | |||
:authors: Jonathan Moore Liles | |||
:email: <male@tuxfamily.org> | |||
:revnumber: 1.2 | |||
:revdate: 2013-04-06 | |||
:iconfont-remote!: | |||
:!webfonts: | |||
@@ -22,15 +22,12 @@ A copy of the license has been provided in the file documentation/API/LICENSE. | |||
:sectnums: | |||
:sectnumlevels: 4 | |||
:toc: preamble | |||
:toc: | |||
:toc-title: Table of Contents | |||
:toclevels: 4 | |||
= Non Session Manager API | |||
== Non Session Management API | |||
= Non Session Manager - API | |||
The Non Session Management API is used by the various components of the Non audio production suite | |||
to allow any number of independent programs to be managed together as part of a logical session | |||
@@ -58,7 +55,7 @@ this specification it should be considered broken. Consistency across applicatio | |||
management is very important for a good user experience. | |||
=== Client Behavior Under Session Management | |||
== Client Behavior Under Session Management | |||
Most graphical applications make available to the user a common set of file operations, typically | |||
presented under a File or Project menu. | |||
@@ -72,16 +69,16 @@ consistent and predictable user experience, it is critically important for appli | |||
to these guidelines. | |||
==== File Menu | |||
=== File Menu | |||
===== New | |||
==== New | |||
This option may empty/reset the current file or project (possibly after user confirmation). UNDER | |||
NO CIRCUMSTANCES should it allow the user to create a new project/file in another location. | |||
===== Open | |||
==== Open | |||
This option MUST be disabled. | |||
@@ -89,7 +86,7 @@ The application may, however, elect to implement an option called 'Import into S | |||
copy of a file/project which is then saved at the session path provided by NSM. | |||
===== Save | |||
==== Save | |||
This option should behave as normal, saving the current file/project as established by the NSM | |||
`open` message. | |||
@@ -97,7 +94,7 @@ This option should behave as normal, saving the current file/project as establis | |||
UNDER NO CIRCUMSTANCES should this option present the user with a choice of where to save the file. | |||
===== Save As | |||
==== Save As | |||
This option MUST be disabled. | |||
@@ -106,21 +103,21 @@ creates a copy of the current file/project which is then saved in a user-specifi | |||
of the session path provided by NSM. | |||
===== Close (as distinguished from Quit or Exit) | |||
==== Close (as distinguished from Quit or Exit) | |||
This option MUST be disabled unless its meaning is to disconnect the application from session | |||
management. | |||
===== Quit or Exit | |||
==== Quit or Exit | |||
This option may behave as normal (possibly asking the user to confirm exiting). | |||
==== Data Storage | |||
=== Data Storage | |||
===== Internal Files | |||
==== Internal Files | |||
All project specific data created by a client MUST be stored in the per-client storage area | |||
provided by NSM. This includes all recorded audio and MIDI files, snapshots, etc. Only global | |||
@@ -128,7 +125,7 @@ configuration items, exports, and renders of the project may be stored elsewhere | |||
specifies). | |||
===== External Files | |||
==== External Files | |||
Files required by the project but external to it (typically read-only data such as audio samples) | |||
SHOULD be referenced by creating a symbolic link within the assigned session area, and then | |||
@@ -139,7 +136,7 @@ to (some unique component may be required to prevent collisions) | |||
=== NSM OSC Protocol | |||
== NSM OSC Protocol | |||
All message parameters are REQUIRED. All messages MUST be sent from the same socket as the `announce` | |||
message, using the `lo_send_from` method of liblo or its equivalent, as the server uses the return | |||
@@ -150,9 +147,9 @@ Clients MUST create thier OSC servers using the same protocol (UDP,TCP) as found | |||
is lacking a robust TCP implementation at the time of writing, but in the future it may be useful. | |||
==== Establishing a Connection | |||
=== Establishing a Connection | |||
===== Announce | |||
==== Announce | |||
At launch, the client MUST check the environment for the value of `NSM_URL`. If present, the client | |||
MUST send the following message to the provided address as soon as it is ready to respond to the | |||
@@ -201,7 +198,7 @@ like Python can be more challenging. | |||
|=== | |||
===== Response | |||
==== Response | |||
The server will respond to the client's announce message with the following message: | |||
@@ -257,7 +254,7 @@ The following table defines possible values of `error_code`: | |||
|=== | |||
==== Server to Client Control Messages | |||
=== Server to Client Control Messages | |||
Compliant clients MUST accept the client control messages described in this section. All client | |||
control messages REQUIRE a response. Responses MUST be delivered back to the sender (NSM) from the | |||
@@ -283,7 +280,7 @@ replied to (e.g. "nsm/client/save": | |||
---- | |||
===== Quit | |||
==== Quit | |||
There is no message for this. Clients will receive the Unix SIGTERM signal and MUST close cleanly | |||
IMMEDIATELY, without displaying any kind of dialog to the user and regardless of whether or not | |||
@@ -291,7 +288,7 @@ unsaved changes would be lost. When a session is closed the application will rec | |||
soon after having responded to a `save` message. | |||
===== Open | |||
==== Open | |||
[source%nowrap,OSC] | |||
---- | |||
@@ -349,7 +346,7 @@ A response is REQUIRED as soon as the open operation has been completed. Ongoing | |||
indicated by sending messages to `/nsm/client/progress`. | |||
====== Response | |||
===== Response | |||
The client MUST respond to the 'open' message with: | |||
@@ -381,7 +378,7 @@ Or | |||
|=== | |||
===== Save | |||
==== Save | |||
[source%nowrap,OSC] | |||
---- | |||
@@ -391,7 +388,7 @@ Or | |||
This message will only be delivered after a previous `open` message, and may be sent any number of | |||
times within the course of a session (including zero, if the user aborts the session). | |||
====== Response | |||
===== Response | |||
[source%nowrap,OSC] | |||
---- | |||
@@ -419,9 +416,9 @@ Or | |||
|=== | |||
==== Server to Client Informational Messages | |||
=== Server to Client Informational Messages | |||
===== Session is Loaded | |||
==== Session is Loaded | |||
Accepting this message is optional. The intent is to signal to clients which may have some | |||
interdependence (say, peer to peer OSC connections) that the session is fully loaded and all their | |||
@@ -437,7 +434,7 @@ on this message MUST not do so by delaying initialization waiting for it. | |||
This message does not require a response. | |||
===== Show Optional Gui | |||
==== Show Optional Gui | |||
If the client has specified the `optional-gui` capability, then it may receive this message from the | |||
server when the user wishes to change the visibility state of the GUI. It doesn't matter if the | |||
@@ -459,9 +456,9 @@ No response is message is required. | |||
==== Client to Server Informational Messages | |||
=== Client to Server Informational Messages | |||
===== Optional GUI | |||
==== Optional GUI | |||
If the client has specified the `optional-gui` capability, then it MUST send this message whenever | |||
the state of visibility of the optional GUI has changed. It also MUST send this message after it's | |||
@@ -483,7 +480,7 @@ loads. | |||
No response will be delivered. | |||
===== Progress | |||
==== Progress | |||
[source%nowrap,OSC] | |||
---- | |||
@@ -503,7 +500,7 @@ Clients which intend to send progress messages should include `:progress:` in th | |||
capability string. | |||
===== Dirtiness | |||
==== Dirtiness | |||
[source%nowrap,OSC] | |||
---- | |||
@@ -520,7 +517,7 @@ may optionally send `is_dirty` and `is_clean` messages. | |||
Clients which have this capability should include `:dirty:` in their `announce` capability string. | |||
===== Status Messsages | |||
==== Status Messsages | |||
[source%nowrap,OSC] | |||
---- | |||
@@ -535,7 +532,7 @@ Clients which have this capability should include `:message:` in their `announce | |||
string. | |||
==== Error Code Definitions | |||
=== Error Code Definitions | |||
.Error Code Definitions | |||
[options="header", stripes=even] | |||
@@ -556,7 +553,7 @@ string. | |||
|=== | |||
==== Client to Server Control | |||
=== Client to Server Control | |||
If the server publishes the `:server_control:` capability, then clients can also initiate action by | |||
the server. For example, a client might implement a 'Save All' option which sends a | |||
@@ -564,7 +561,7 @@ the server. For example, a client might implement a 'Save All' option which send | |||
management interface to effect the save. | |||
==== Server Control API | |||
=== Server Control API | |||
The session manager not only manages clients via OSC, but it is itself controlled via OSC messages. | |||
The server responds to the following messages. | |||
@@ -632,7 +629,7 @@ The possible errors are: | |||
===== Client to Client Communication | |||
==== Client to Client Communication | |||
If the server includes `:broadcast:` in its capability string, then clients may send broadcast | |||
messages to each other through the NSM server. Clients may send messages to the server at the path |
@@ -0,0 +1,67 @@ | |||
#!/bin/sh | |||
#The documentation is built statically and does not belong to the normal build process. | |||
#Updating is part of the development process, not compiling or packaging. | |||
#Run this before a release, or any time you want to update the docs or the README. | |||
#This script takes common snippets of information and updates or generates source info files from | |||
#them. | |||
# parse src/nsmd.cpp for API version, insert into /docs/src/api/index.adoc | |||
# parse /CHANGELOG first line for package version, insert into /meson.build and /docs/src/index.adoc | |||
# generate /README.md (shares text with manual index) | |||
# generate /docs/src/index.adoc (shares text with readme) | |||
# generate manpages (need all kind of information) | |||
# convert all .adoc files to html in /docs/ (This enables github to directly present this dir as website) | |||
# | |||
#We do _not_ change the copyright date in files license-headers. | |||
#They only exist to mark to year of the fork. In the future dates might be removed completely. | |||
set -e #Stop script on errors | |||
set -u #Trace unset variables as an error. | |||
#Change pwd to root dir | |||
parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) | |||
cd "$parent_path"/../.. | |||
[ -f "CHANGELOG" ] || exit 1 #assert correct dir | |||
#Gather data | |||
ROOT=$(pwd) #save for later | |||
VERSION=$(head -n 1 "CHANGELOG") | |||
_MAJORAPI=$(grep "define NSM_API_VERSION_MAJOR" "src/nsmd.cpp" | cut -d ' ' -f 3) | |||
_MINORAPI=$(grep "define NSM_API_VERSION_MINOR" "src/nsmd.cpp" | cut -d ' ' -f 3) | |||
APIVERSION=$_MAJORAPI"."$_MINORAPI | |||
#Present data to confirm write-action | |||
echo "Root: $ROOT" | |||
echo "Version: $VERSION" | |||
echo "API Version: $APIVERSION" | |||
read -p "Is parsed data correct? Continue by writing files? [y|n] " -n 1 -r | |||
if [[ ! $REPLY =~ ^[Yy]$ ]] | |||
then | |||
echo | |||
echo "Abort" | |||
exit 1 | |||
fi | |||
echo | |||
#Package Version Number | |||
cd "$ROOT/docs/src" | |||
sed -i '/^\:revnumber.*/c\:revnumber: '$VERSION index.adoc #Find the revnumber line and replace with entire new line | |||
#API Version Number | |||
cd "$ROOT/docs/src/api" | |||
sed -i '/^\:revnumber.*/c\:revnumber: '$APIVERSION index.adoc #Find the revnumber line and replace with entire new line | |||
#Generate README.md | |||
cd "$ROOT/docs/src" | |||
cat "readme-00.md" "readme-01.md" "readme-02.md" > "$ROOT/README.md" | |||
#Generate website and documentation with Asciidoctor | |||
cd "$ROOT/docs" | |||
mkdir -p "api" | |||
asciidoctor src/index.adoc -o index.html | |||
asciidoctor src/api/index.adoc -o api/index.html |
@@ -0,0 +1,27 @@ | |||
//// | |||
This is "asciidoctor", not plain "asciidoc". | |||
https://asciidoctor.org/docs/user-manual/ | |||
//// | |||
//// | |||
This documentation is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. | |||
To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a | |||
letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. | |||
A copy of the license has been provided in the file documentation/LICENSE. | |||
//// | |||
:Author: LinuxAudio.org | |||
:iconfont-remote!: | |||
:!webfonts: | |||
:revnumber: 1.4 | |||
= New Session Manager Documentation | |||
* link:https://github.com/linuxaudio/new-session-manager[Sourcecode] | |||
* link:https://github.com/linuxaudio/new-session-manager/issues[Bug and Issue Tracker] | |||
* link:api/index.html[API] document that describes all OSC Messages | |||
* link:http://non.tuxfamily.org/session-manager/doc/MANUAL.html[Legacy-GUI Manual]. The original Non-Session-Manager manual is still valid. | |||
include::readme-01.md[] |
@@ -0,0 +1 @@ | |||
# New Session Manager |
@@ -0,0 +1,46 @@ | |||
## Introduction | |||
New Session Manager (NSM) is a tool to assist music production by grouping standalone programs into sessions. | |||
Your workflow becomes easy to manage, robust and fast by leveraging the full potential of cooperative applications. | |||
It is a community version of the "NON Session Manager" and free in every sense of the word: | |||
free of cost, free to share and use, free of spyware or ads, free-and-open-source. | |||
You can create a session, or project, add programs to it and then use commands to save, start/stop, | |||
hide/show all programs at once, or individually. At a later date you can then re-open the session | |||
and continue where you left off. | |||
All files belonging to the session will be saved in the same directory. | |||
If you are a user (and not a programmer or packager) everything you need is to install NSM | |||
through your distributions package manager and, highly recommended, Argodejo as a GUI (see below). | |||
To learn NSM you don't need to know the background information from our documentation, which | |||
is aimed at developers that want to implement NSM support in their programs. Learn the GUI, | |||
not the server and protocol. | |||
## Bullet Points | |||
* Drop-In replacement for the non-session-manager daemon nsmd and tools (e.g. jackpatch) | |||
* Simple and hassle-free build system to make packaging easy | |||
* Possibility to react to sensible bug fixes that would not have been integrated original nsmd | |||
* Stay upwards and downwards compatible with original nsmd | |||
* Conservative and hesitant in regards to new features and behaviour-changes, but possible in principle | |||
* Keep the session-manager separate from the other NON* tools Mixer, Sequencer and Timeline. | |||
* Protect nsmd from vanishing from the internet one day. | |||
* The goal is to become the de-facto standard session manager for Linux distributions | |||
## User Interface | |||
It is highly recommended to use Argodejo ( https://www.laborejo.org/argodejo/ ) as graphical | |||
user interface. In fact, if you install Argodejo in you distribution it will install NSM as | |||
dependency and you don't need to do anything yourself with this software package. | |||
This repository also contains the legacy FLTK interface simply called `nsm-legacy-gui`, | |||
symlinked to `non-session-manager` for backwards compatibility. (e.g. autostart scripts etc.) | |||
## Supported Clients | |||
While NSM can start and stop any program it only becomes convenient if clients specifically | |||
implement support. This enables saving and hiding the GUI, amongst other features. | |||
Documentation and tutorials for software-developers will be added at a later date. |
@@ -0,0 +1,52 @@ | |||
## Fork and License | |||
This is a fork of non-session-manager, by Jonathan Moore Liles <male@tuxfamily.net> http://non.tuxfamily.org/ | |||
which was released under the GNU GENERAL PUBLIC LICENSE Version 2, June 1991. | |||
All files, except nsm.h kept in this fork were GPL "version 2 of the License, or (at your | |||
option) any later version." | |||
`nsm.h` is licensed under the ISCL. | |||
New-Session-Manager changed the license to GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007. | |||
See file COPYING | |||
## Build | |||
The build system is meson. | |||
This is a software package that will compile and install multiple executables: | |||
* `nsmd`, the daemon or server itself. It is mandatory. | |||
* It has no GUI. | |||
* Dependency is `liblo`, the OSC library. | |||
* `jackpatch`, NSM client to save and remember JACK connections. | |||
* It has no GUI. | |||
* Dependencies are `JACK Audio Connection Kit` and `liblo`, the OSC library. | |||
* Can be deactivated (see below) `-Djackpatch=false` | |||
* `nsm-legacy-gui`, Legacy GUI for the user | |||
* Formerly known as "non-session-manager" | |||
* Dependencies are `FLTK`>=v1.3.0 and `liblo`, the OSC library. | |||
* Can be deactivated (see below) `-Dlegacy-gui=false` | |||
* `nsm-proxy`, NSM GUI Client to run any program without direct NSM support | |||
* Dependencies are `FLTK`>=v1.3.0, `fluid` (FLTK Editor/compiler, maybe in the same package as FLTK, maybe not) and `liblo`, the OSC library. | |||
* Can be deactivated (see below) `-Dnsm-proxy=false` | |||
``` | |||
meson build --prefix=/usr | |||
#or disable individual build targets: | |||
#meson build --prefix=/usr -Dlegacy-gui=false -Dnsm-proxy=false -Djackpatch=false | |||
cd build && ninja | |||
sudo ninja install | |||
``` | |||
Optionally you can skip `sudo ninja install` and run all executables from the build-dir. | |||
In this case you need to add the build-dir to your PATH environment variable so that the tools | |||
can find each other. | |||
## Names of Executable Files and Symlinks | |||
Some distributions (and possibly local laws) prevent a forked software project from creating | |||
executable files under the same name, if the name itself is an original work subject to copyright, | |||
which it arguably is for the "NON-"-suite. Therefore New Session Manager renamed | |||
`non-session-manager` to `nsm-legacy-gui`. Installing will also create a symlink to | |||
`non-session-manager` for backwards compatibility. (e.g. autostart scripts etc.). |
@@ -0,0 +1,7 @@ | |||
Hallo Welt | |||
Lol Rolf | |||
== Cool Cool | |||
Cool |
@@ -17,7 +17,7 @@ | |||
# along with New-Session-Manager. If not, see <https://www.gnu.org/licenses/>. | |||
############################################################################## | |||
project('new-session-manager', 'c', 'cpp', version : '1.3.1', license : 'GPLv3') | |||
project('new-session-manager', 'c', 'cpp', version : '1.4', license : 'GPLv3') | |||
############## | |||
#Dependencies | |||