<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.6.9" />
<title>Upplay manual</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
/* Default font. */
body {
font-family: Georgia,serif;
}
/* Title font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
#toctitle,
#author, #revnumber, #revdate, #revremark,
#footer {
font-family: Arial,Helvetica,sans-serif;
}
body {
margin: 1em 5% 1em 5%;
}
a {
color: blue;
text-decoration: underline;
}
a:visited {
color: fuchsia;
}
em {
font-style: italic;
color: navy;
}
strong {
font-weight: bold;
color: #083194;
}
h1, h2, h3, h4, h5, h6 {
color: #527bbd;
margin-top: 1.2em;
margin-bottom: 0.5em;
line-height: 1.3;
}
h1, h2, h3 {
border-bottom: 2px solid silver;
}
h2 {
padding-top: 0.5em;
}
h3 {
float: left;
}
h3 + * {
clear: left;
}
h5 {
font-size: 1.0em;
}
div.sectionbody {
margin-left: 0;
}
hr {
border: 1px solid silver;
}
p {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
ul, ol, li > p {
margin-top: 0;
}
ul > li { color: #aaa; }
ul > li > * { color: black; }
.monospaced, code, pre {
font-family: "Courier New", Courier, monospace;
font-size: inherit;
color: navy;
padding: 0;
margin: 0;
}
pre {
white-space: pre-wrap;
}
#author {
color: #527bbd;
font-weight: bold;
font-size: 1.1em;
}
#email {
}
#revnumber, #revdate, #revremark {
}
#footer {
font-size: small;
border-top: 2px solid silver;
padding-top: 0.5em;
margin-top: 4.0em;
}
#footer-text {
float: left;
padding-bottom: 0.5em;
}
#footer-badges {
float: right;
padding-bottom: 0.5em;
}
#preamble {
margin-top: 1.5em;
margin-bottom: 1.5em;
}
div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
div.admonitionblock {
margin-top: 2.0em;
margin-bottom: 2.0em;
margin-right: 10%;
color: #606060;
}
div.content { /* Block element content. */
padding: 0;
}
/* Block element titles. */
div.title, caption.title {
color: #527bbd;
font-weight: bold;
text-align: left;
margin-top: 1.0em;
margin-bottom: 0.5em;
}
div.title + * {
margin-top: 0;
}
td div.title:first-child {
margin-top: 0.0em;
}
div.content div.title:first-child {
margin-top: 0.0em;
}
div.content + div.title {
margin-top: 0.0em;
}
div.sidebarblock > div.content {
background: #ffffee;
border: 1px solid #dddddd;
border-left: 4px solid #f0f0f0;
padding: 0.5em;
}
div.listingblock > div.content {
border: 1px solid #dddddd;
border-left: 5px solid #f0f0f0;
background: #f8f8f8;
padding: 0.5em;
}
div.quoteblock, div.verseblock {
padding-left: 1.0em;
margin-left: 1.0em;
margin-right: 10%;
border-left: 5px solid #f0f0f0;
color: #888;
}
div.quoteblock > div.attribution {
padding-top: 0.5em;
text-align: right;
}
div.verseblock > pre.content {
font-family: inherit;
font-size: inherit;
}
div.verseblock > div.attribution {
padding-top: 0.75em;
text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
text-align: left;
}
div.admonitionblock .icon {
vertical-align: top;
font-size: 1.1em;
font-weight: bold;
text-decoration: underline;
color: #527bbd;
padding-right: 0.5em;
}
div.admonitionblock td.content {
padding-left: 0.5em;
border-left: 3px solid #dddddd;
}
div.exampleblock > div.content {
border-left: 3px solid #dddddd;
padding-left: 0.5em;
}
div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; vertical-align: text-bottom; }
a.image:visited { color: white; }
dl {
margin-top: 0.8em;
margin-bottom: 0.8em;
}
dt {
margin-top: 0.5em;
margin-bottom: 0;
font-style: normal;
color: navy;
}
dd > *:first-child {
margin-top: 0.1em;
}
ul, ol {
list-style-position: outside;
}
ol.arabic {
list-style-type: decimal;
}
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;
}
div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
margin-top: 0.1em;
margin-bottom: 0.1em;
}
tfoot {
font-weight: bold;
}
td > div.verse {
white-space: pre;
}
div.hdlist {
margin-top: 0.8em;
margin-bottom: 0.8em;
}
div.hdlist tr {
padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
font-weight: bold;
}
td.hdlist1 {
vertical-align: top;
font-style: normal;
padding-right: 0.8em;
color: navy;
}
td.hdlist2 {
vertical-align: top;
}
div.hdlist.compact tr {
margin: 0;
padding-bottom: 0;
}
.comment {
background: yellow;
}
.footnote, .footnoteref {
font-size: 0.8em;
}
span.footnote, span.footnoteref {
vertical-align: super;
}
#footnotes {
margin: 20px 0 20px 0;
padding: 7px 0 0 0;
}
#footnotes div.footnote {
margin: 0 0 5px 0;
}
#footnotes hr {
border: none;
border-top: 1px solid silver;
height: 1px;
text-align: left;
margin-left: 0;
width: 20%;
min-width: 100px;
}
div.colist td {
padding-right: 0.5em;
padding-bottom: 0.3em;
vertical-align: top;
}
div.colist td img {
margin-top: 0.3em;
}
@media print {
#footer-badges { display: none; }
}
#toc {
margin-bottom: 2.5em;
}
#toctitle {
color: #527bbd;
font-size: 1.1em;
font-weight: bold;
margin-top: 1.0em;
margin-bottom: 0.1em;
}
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
margin-top: 0;
margin-bottom: 0;
}
div.toclevel2 {
margin-left: 2em;
font-size: 0.9em;
}
div.toclevel3 {
margin-left: 4em;
font-size: 0.9em;
}
div.toclevel4 {
margin-left: 6em;
font-size: 0.9em;
}
span.aqua { color: aqua; }
span.black { color: black; }
span.blue { color: blue; }
span.fuchsia { color: fuchsia; }
span.gray { color: gray; }
span.green { color: green; }
span.lime { color: lime; }
span.maroon { color: maroon; }
span.navy { color: navy; }
span.olive { color: olive; }
span.purple { color: purple; }
span.red { color: red; }
span.silver { color: silver; }
span.teal { color: teal; }
span.white { color: white; }
span.yellow { color: yellow; }
span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }
span.big { font-size: 2em; }
span.small { font-size: 0.6em; }
span.underline { text-decoration: underline; }
span.overline { text-decoration: overline; }
span.line-through { text-decoration: line-through; }
div.unbreakable { page-break-inside: avoid; }
/*
* xhtml11 specific
*
* */
div.tableblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
div.tableblock > table {
border: 3px solid #527bbd;
}
thead, p.table.header {
font-weight: bold;
color: #527bbd;
}
p.table {
margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
border-style: none;
}
div.tableblock > table[frame="hsides"] {
border-left-style: none;
border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
border-top-style: none;
border-bottom-style: none;
}
/*
* html5 specific
*
* */
table.tableblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
thead, p.tableblock.header {
font-weight: bold;
color: #527bbd;
}
p.tableblock {
margin-top: 0;
}
table.tableblock {
border-width: 3px;
border-spacing: 0px;
border-style: solid;
border-color: #527bbd;
border-collapse: collapse;
}
th.tableblock, td.tableblock {
border-width: 1px;
padding: 4px;
border-style: solid;
border-color: #527bbd;
}
table.tableblock.frame-topbot {
border-left-style: hidden;
border-right-style: hidden;
}
table.tableblock.frame-sides {
border-top-style: hidden;
border-bottom-style: hidden;
}
table.tableblock.frame-none {
border-style: hidden;
}
th.tableblock.halign-left, td.tableblock.halign-left {
text-align: left;
}
th.tableblock.halign-center, td.tableblock.halign-center {
text-align: center;
}
th.tableblock.halign-right, td.tableblock.halign-right {
text-align: right;
}
th.tableblock.valign-top, td.tableblock.valign-top {
vertical-align: top;
}
th.tableblock.valign-middle, td.tableblock.valign-middle {
vertical-align: middle;
}
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
vertical-align: bottom;
}
/*
* manpage specific
*
* */
body.manpage h1 {
padding-top: 0.5em;
padding-bottom: 0.5em;
border-top: 2px solid silver;
border-bottom: 2px solid silver;
}
body.manpage h2 {
border-style: none;
}
body.manpage div.sectionbody {
margin-left: 3em;
}
@media print {
body.manpage div#toc { display: none; }
}
</style>
<script type="text/javascript">
/*<![CDATA[*/
var asciidoc = { // Namespace.
/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Table Of Content generator
* Version: 0.4
*
* Feel free to use this script under the terms of the GNU General Public
* License, as long as you do not remove or alter this notice.
*/
/* modified by Troy D. Hanson, September 2006. License: GPL */
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
// toclevels = 1..4.
toc: function (toclevels) {
function getText(el) {
var text = "";
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
text += i.data;
else if (i.firstChild != null)
text += getText(i);
}
return text;
}
function TocEntry(el, text, toclevel) {
this.element = el;
this.text = text;
this.toclevel = toclevel;
}
function tocEntries(el, toclevels) {
var result = new Array;
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
// Function that scans the DOM tree for header elements (the DOM2
// nodeIterator API would be a better technique but not supported by all
// browsers).
var iterate = function (el) {
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
var mo = re.exec(i.tagName);
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
}
iterate(i);
}
}
}
iterate(el);
return result;
}
var toc = document.getElementById("toc");
if (!toc) {
return;
}
// Delete existing TOC entries in case we're reloading the TOC.
var tocEntriesToRemove = [];
var i;
for (i = 0; i < toc.childNodes.length; i++) {
var entry = toc.childNodes[i];
if (entry.nodeName.toLowerCase() == 'div'
&& entry.getAttribute("class")
&& entry.getAttribute("class").match(/^toclevel/))
tocEntriesToRemove.push(entry);
}
for (i = 0; i < tocEntriesToRemove.length; i++) {
toc.removeChild(tocEntriesToRemove[i]);
}
// Rebuild TOC entries.
var entries = tocEntries(document.getElementById("content"), toclevels);
for (var i = 0; i < entries.length; ++i) {
var entry = entries[i];
if (entry.element.id == "")
entry.element.id = "_toc_" + i;
var a = document.createElement("a");
a.href = "#" + entry.element.id;
a.appendChild(document.createTextNode(entry.text));
var div = document.createElement("div");
div.appendChild(a);
div.className = "toclevel" + entry.toclevel;
toc.appendChild(div);
}
if (entries.length == 0)
toc.parentNode.removeChild(toc);
},
/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////
/* Based on footnote generation code from:
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
*/
footnotes: function () {
// Delete existing footnote entries in case we're reloading the footnodes.
var i;
var noteholder = document.getElementById("footnotes");
if (!noteholder) {
return;
}
var entriesToRemove = [];
for (i = 0; i < noteholder.childNodes.length; i++) {
var entry = noteholder.childNodes[i];
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
entriesToRemove.push(entry);
}
for (i = 0; i < entriesToRemove.length; i++) {
noteholder.removeChild(entriesToRemove[i]);
}
// Rebuild footnote entries.
var cont = document.getElementById("content");
var spans = cont.getElementsByTagName("span");
var refs = {};
var n = 0;
for (i=0; i<spans.length; i++) {
if (spans[i].className == "footnote") {
n++;
var note = spans[i].getAttribute("data-note");
if (!note) {
// Use [\s\S] in place of . so multi-line matches work.
// Because JavaScript has no s (dotall) regex flag.
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
spans[i].innerHTML =
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
"' title='View footnote' class='footnote'>" + n + "</a>]";
spans[i].setAttribute("data-note", note);
}
noteholder.innerHTML +=
"<div class='footnote' id='_footnote_" + n + "'>" +
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
n + "</a>. " + note + "</div>";
var id =spans[i].getAttribute("id");
if (id != null) refs["#"+id] = n;
}
}
if (n == 0)
noteholder.parentNode.removeChild(noteholder);
else {
// Process footnoterefs.
for (i=0; i<spans.length; i++) {
if (spans[i].className == "footnoteref") {
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
href = href.match(/#.*/)[0]; // Because IE return full URL.
n = refs[href];
spans[i].innerHTML =
"[<a href='#_footnote_" + n +
"' title='View footnote' class='footnote'>" + n + "</a>]";
}
}
}
},
install: function(toclevels) {
var timerId;
function reinstall() {
asciidoc.footnotes();
if (toclevels) {
asciidoc.toc(toclevels);
}
}
function reinstallAndRemoveTimer() {
clearInterval(timerId);
reinstall();
}
timerId = setInterval(reinstall, 500);
if (document.addEventListener)
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
else
window.onload = reinstallAndRemoveTimer;
}
}
asciidoc.install(2);
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>Upplay manual</h1>
<div id="toc">
<div id="toctitle">Table of Contents</div>
<noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="content">
<div class="sect1">
<h2 id="_overview">Overview</h2>
<div class="sectionbody">
<div class="imageblock">
<div class="content">
<img src="legend-upplay-main.png" alt="legend-upplay-main.png" />
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_player_section">Player section</h2>
<div class="sectionbody">
<div class="paragraph"><p>Play, Pause, Stop, Next, Previous, Seek, and Adjust volume. I would guess that
these don’t need explanations.</p></div>
<div class="paragraph"><p>Most elements displaying information about the current track have tooltips
which can display a bigger and more readable version.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_playlist_section">Playlist section</h2>
<div class="sectionbody">
<div class="paragraph"><p>Playlist entries:</p></div>
<div class="ulist"><ul>
<li>
<p>
Double-click entry to play
</p>
</li>
<li>
<p>
Click entry, then click the play button to play
</p>
</li>
<li>
<p>
Select and drag-drop to reorder
</p>
</li>
<li>
<p>
Right click and select <em>Remove</em> to delete current selection
</p>
</li>
<li>
<p>
Right click and select <em>Sort by track number</em> to reorder tracks (useful
when tracks from an album directory were sent in wrong order by the Media
Server).
</p>
</li>
</ul></div>
<div class="paragraph"><p>Playlist buttons:</p></div>
<div class="ulist"><ul>
<li>
<p>
Playlist modes select how the tracks are sequenced: normal, repeat,
shuffle.
</p>
</li>
<li>
<p>
Playlist add modes determine how "Send to playlist" from the directory
browser will affect the playlist. By default, this inserts after the
current track. You can also choose to Append or Replace, and opt to
immediately start play for the first of the new tracks.
</p>
</li>
<li>
<p>
The sequential number toggle will show numbers in front of the
entries. Not too sure what this is good for…
</p>
</li>
</ul></div>
<div class="paragraph"><p>You can clear the current playlist by clicking the broom icon above it on
the right.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_directory_browser_section">Directory browser section</h2>
<div class="sectionbody">
<div class="paragraph"><p>The list at the top is a hybrid path/search history section:</p></div>
<div class="ulist"><ul>
<li>
<p>
When you browse a directory tree by clicking on containers, it shows
your location in the tree.
</p>
</li>
<li>
<p>
If you perform searches, your search history will be stacked at the end
of the path. Searches are not nested, and always relative to the closest
directory earlier in the path. If you click a directory inside the
search results, it will get stacked, and any further searches will be
relative to this directory, not the earlier one.
</p>
</li>
</ul></div>
<div class="paragraph"><p>Left-Clicking a track title will send it to the playlist, according to the
current playlist add mode.</p></div>
<div class="paragraph"><p>Left-Clicking a directory title will get you there.</p></div>
<div class="paragraph"><p>Right-clicking a track title will propose the following actions:</p></div>
<div class="ulist"><ul>
<li>
<p>
<code>Back</code>
</p>
</li>
<li>
<p>
<code>Send to playlist</code>: same as left-clicking.
</p>
</li>
<li>
<p>
<code>Send all to playlist</code>: send all tracks from this directory.
</p>
</li>
<li>
<p>
<code>Send all from here to playlist</code>: this track and the following ones go to
the playlist.
</p>
</li>
</ul></div>
<div class="paragraph"><p>Right-clicking a directory (in the list or in the path) will propose the
following actions:</p></div>
<div class="ulist"><ul>
<li>
<p>
<code>Back</code>
</p>
</li>
<li>
<p>
<code>Send to playlist</code>: this is a recursive walk, it will send all tracks from
the subtree to the playlist. Don’t do this at the root of a big tree…
</p>
</li>
<li>
<p>
<code>Open in new tab</code>.
</p>
</li>
<li>
<p>
<code>Random play by tracks</code>: this is analogous to <code>Send to playlist</code>, but the
list is shuffled, then sent to the Renderer by slices (of 30 tracks). The
slicing is so that so you can use a very big list without swamping the
renderer.
</p>
</li>
<li>
<p>
<code>Random play by groups</code>: this will play groups of tracks, corresponding to
the lowest level of directories in the subtree, typically albums, but
these may also be MinimServer Groups for example.
</p>
</li>
<li>
<p>
<code>Stop random play</code>: if currently playing.
</p>
</li>
</ul></div>
<div class="paragraph"><p>While in "Random play by group" mode, the playlist broom tooltip displays
the next group. Clicking the button will skip to it.</p></div>
<div class="paragraph"><p>Right-clicking empty space will propose to go back (or up).</p></div>
<div class="paragraph"><p>Mid-Clicking a directory from the entries list, or a search or directory in
the path at the top will open the element in a new tab. This can be
particularly useful if you want to go back to a previous search without
losing the current display.</p></div>
<div class="paragraph"><p><code>^f</code> or <code>/</code> will open the search panel, <code>Esc</code> will close it (or the x-cross
button at the right).</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_searching">Searching</h2>
<div class="sectionbody">
<div class="paragraph"><p>Upplay supports two search modes:</p></div>
<div class="ulist"><ul>
<li>
<p>
Inside the current directory page: this is handy to quickly skip inside
a long list.
</p>
</li>
<li>
<p>
Server search.
</p>
</li>
</ul></div>
<div class="paragraph"><p>The search panel is located at the bottom of the library window (the one on
the right), and normally hidden. You can open it by the following actions:</p></div>
<div class="ulist"><ul>
<li>
<p>
Typing <code>/</code> inside the library window.
</p>
</li>
<li>
<p>
Typing <code>Ctrl+f</code> inside the library window.
</p>
</li>
<li>
<p>
Using the View menu
</p>
</li>
</ul></div>
<div class="paragraph"><p>Not all servers support search (e.g, MediaTomb does not, Minidlna does,
etc.).</p></div>
<div class="paragraph"><p>You can close the panel by the following actions:</p></div>
<div class="ulist"><ul>
<li>
<p>
Typing <code>Esc</code> (the Escape key).
</p>
</li>
<li>
<p>
Clicking the x-cross icon on the right of the panel
</p>
</li>
<li>
<p>
Using the <code>View</code> menu.
</p>
</li>
</ul></div>
<div class="paragraph"><p>When the search panel opens for the first time, the panel is in local
search mode. Typing inside the search entry area will try to find matches
in the page. You can use the two arrow buttons or type <code>F3</code> or <code>Shift+F3</code>
to find the next or previous match.</p></div>
<div class="paragraph"><p>In server mode, the search panel will let you enter a search string and the
kind of field inside which you want to search (the combobox on the right,
Artist/Album/Title). Type <code>Enter</code> or click the search button to start the
search.</p></div>
<div class="paragraph"><p>The results are displayed just like a directory listing and can be
used in the same way (including opening tabs for directory listings, etc.).</p></div>
<div class="paragraph"><p>Server searches are always relative to the first directory earlier in the
path, never to another search.
If your search yields nothing, one of the things to check is that you are
high enough in the tree (not searching a single directory).</p></div>
<div class="paragraph"><p>Also <strong><em>space characters are significant in the search entry</em></strong>. This has a
capacity for trouble but it can also be a great help when trying to match
words (there are no standard UPnP ways to specify word matches, or anchor a
search at the beginning or end of a field).</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_tab_bar_section">Tab bar section</h2>
<div class="sectionbody">
<div class="paragraph"><p>Clicking the big plus sign will open a new tab. Clicking a tab’s cross
sign will close it…</p></div>
</div>
</div>
<div class="sect1">
<h2 id="menus">Menus</h2>
<div class="sectionbody">
<div class="paragraph"><p>File:</p></div>
<div class="ulist"><ul>
<li>
<p>
<code>Change Media Renderer</code> will let you do just this. You will see a dialog
with the list of renderers currently seen on the network. After choosing
one, you may decide that the current <strong>upplay</strong> playlist will replace the
one or the new renderer, or be appended to it by checking the appropriate
places. Double-clicking a renderer will get you there too.
</p>
</li>
<li>
<p>
<code>Select Source</code> is only activated if the current Renderer supports
OpenHome, and will let you select the Source among the available ones
(<code>Playlist</code>, <code>Radio</code> etc.).
</p>
</li>
<li>
<p>
<code>Save / Load playlist</code> will let you save the current playlist to a local
file, or load one which you previously saved.
</p>
</li>
<li>
<p>
<code>Open Songcast Tool</code> will open a dialog for managing the connections
between Linn Songcast Senders or Receivers. <a href="songcast.html">more
details here</a>.
</p>
</li>
<li>
<p>
<code>View</code> lets you elect to hide the right panel (directory listing), change
the color scheme for a dark one and other interesting experiences. Also
a number of Preferences can be adjusted from the appropriately named
submenu.
</p>
</li>
</ul></div>
<div class="paragraph"><p>And <code>Help</code>, there is no help…</p></div>
</div>
</div>
<div class="sect1">
<h2 id="keyboard">Keyboard shortcuts</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
Space/MediaTogglePlayPause/MediaPlay/MediaPause : toggle play/pause.
</p>
</li>
<li>
<p>
Ctl+Right / MediaNext : next track.
</p>
</li>
<li>
<p>
Ctl+Left / MediaPrevious : previous track.
</p>
</li>
<li>
<p>
Ctl+Space : stop.
</p>
</li>
<li>
<p>
Ctl+Up / Plus : volume increase.
</p>
</li>
<li>
<p>
Ctl+Down/ Minus : volume decrease.
</p>
</li>
<li>
<p>
Right : seek forward a few secs.
</p>
</li>
<li>
<p>
Left : seek backward a few secs.
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="hiresadjust">Adjusting the font sizes on high resolution displays</h2>
<div class="sectionbody">
<div class="paragraph"><p>Most people will find that the font sizes (and buttons/icons) are too small
on high DPI displays.</p></div>
<div class="paragraph"><p>As of version 1.2.5, the GUI can be partially adjusted by editing two style
sheet files. To adjust the font sizes:</p></div>
<div class="ulist"><ul>
<li>
<p>
Edit <code>/usr/share/upplay/cdbrowser/cdbrowser.css</code>, and uncomment the
"font-size" directive at the top. Adjust the size to taste, meaning that
the line should look like the following (with your preferred value in
place of 30):
</p>
<div class="literalblock">
<div class="content">
<pre><code>font-size: 30pt;</code></pre>
</div></div>
</li>
<li>
<p>
Edit <code>/usr/share/upplay/common.css</code> and adjust the 6 font-size
directives. An adequate approach will usually be to multiply the sizes by
some constant factor (e.g.: 2 …).
</p>
</li>
</ul></div>
<div class="paragraph"><p>On Windows, use <em>notepad</em> or an equivalent pure text editor to edit the
files, which are located in the <em>share</em> and <em>share\cdbrowser</em>
subdirectories of the top installation directory (e.g: <em>C:\Program Files
(x86)\Upplay\</em>). You need to specify "all files" when opening the files,
because notepad does not list <em>.css</em> files by default (only <em>.txt</em>).</p></div>
<div class="paragraph"><p>The adjustment is not perfect for now: the player section does not update
its size, which means that some titles will be truncated (in the top left
area), and the icon sizes are unchanged. Arbitrary text truncation may
happen in places. This will hopefully be improved in a future release.</p></div>
<div class="paragraph"><p>There are other, system-based, approaches described on the following Qt page:
<a href="http://doc.qt.io/qt-5/highdpi.html">http://doc.qt.io/qt-5/highdpi.html</a></p></div>
</div>
</div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Last updated
2017-05-08 14:12:03 CEST
</div>
</div>
</body>
</html>