Switch to unified view

a b/doc/release-0.8.html
1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
4
<head>
5
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
6
<meta name="generator" content="AsciiDoc 8.6.9" />
7
<title>Notes for upmpdcli 0.8 release series</title>
8
<style type="text/css">
9
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
10
11
/* Default font. */
12
body {
13
  font-family: Georgia,serif;
14
}
15
16
/* Title font. */
17
h1, h2, h3, h4, h5, h6,
18
div.title, caption.title,
19
thead, p.table.header,
20
#toctitle,
21
#author, #revnumber, #revdate, #revremark,
22
#footer {
23
  font-family: Arial,Helvetica,sans-serif;
24
}
25
26
body {
27
  margin: 1em 5% 1em 5%;
28
}
29
30
a {
31
  color: blue;
32
  text-decoration: underline;
33
}
34
a:visited {
35
  color: fuchsia;
36
}
37
38
em {
39
  font-style: italic;
40
  color: navy;
41
}
42
43
strong {
44
  font-weight: bold;
45
  color: #083194;
46
}
47
48
h1, h2, h3, h4, h5, h6 {
49
  color: #527bbd;
50
  margin-top: 1.2em;
51
  margin-bottom: 0.5em;
52
  line-height: 1.3;
53
}
54
55
h1, h2, h3 {
56
  border-bottom: 2px solid silver;
57
}
58
h2 {
59
  padding-top: 0.5em;
60
}
61
h3 {
62
  float: left;
63
}
64
h3 + * {
65
  clear: left;
66
}
67
h5 {
68
  font-size: 1.0em;
69
}
70
71
div.sectionbody {
72
  margin-left: 0;
73
}
74
75
hr {
76
  border: 1px solid silver;
77
}
78
79
p {
80
  margin-top: 0.5em;
81
  margin-bottom: 0.5em;
82
}
83
84
ul, ol, li > p {
85
  margin-top: 0;
86
}
87
ul > li     { color: #aaa; }
88
ul > li > * { color: black; }
89
90
.monospaced, code, pre {
91
  font-family: "Courier New", Courier, monospace;
92
  font-size: inherit;
93
  color: navy;
94
  padding: 0;
95
  margin: 0;
96
}
97
pre {
98
  white-space: pre-wrap;
99
}
100
101
#author {
102
  color: #527bbd;
103
  font-weight: bold;
104
  font-size: 1.1em;
105
}
106
#email {
107
}
108
#revnumber, #revdate, #revremark {
109
}
110
111
#footer {
112
  font-size: small;
113
  border-top: 2px solid silver;
114
  padding-top: 0.5em;
115
  margin-top: 4.0em;
116
}
117
#footer-text {
118
  float: left;
119
  padding-bottom: 0.5em;
120
}
121
#footer-badges {
122
  float: right;
123
  padding-bottom: 0.5em;
124
}
125
126
#preamble {
127
  margin-top: 1.5em;
128
  margin-bottom: 1.5em;
129
}
130
div.imageblock, div.exampleblock, div.verseblock,
131
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
132
div.admonitionblock {
133
  margin-top: 1.0em;
134
  margin-bottom: 1.5em;
135
}
136
div.admonitionblock {
137
  margin-top: 2.0em;
138
  margin-bottom: 2.0em;
139
  margin-right: 10%;
140
  color: #606060;
141
}
142
143
div.content { /* Block element content. */
144
  padding: 0;
145
}
146
147
/* Block element titles. */
148
div.title, caption.title {
149
  color: #527bbd;
150
  font-weight: bold;
151
  text-align: left;
152
  margin-top: 1.0em;
153
  margin-bottom: 0.5em;
154
}
155
div.title + * {
156
  margin-top: 0;
157
}
158
159
td div.title:first-child {
160
  margin-top: 0.0em;
161
}
162
div.content div.title:first-child {
163
  margin-top: 0.0em;
164
}
165
div.content + div.title {
166
  margin-top: 0.0em;
167
}
168
169
div.sidebarblock > div.content {
170
  background: #ffffee;
171
  border: 1px solid #dddddd;
172
  border-left: 4px solid #f0f0f0;
173
  padding: 0.5em;
174
}
175
176
div.listingblock > div.content {
177
  border: 1px solid #dddddd;
178
  border-left: 5px solid #f0f0f0;
179
  background: #f8f8f8;
180
  padding: 0.5em;
181
}
182
183
div.quoteblock, div.verseblock {
184
  padding-left: 1.0em;
185
  margin-left: 1.0em;
186
  margin-right: 10%;
187
  border-left: 5px solid #f0f0f0;
188
  color: #888;
189
}
190
191
div.quoteblock > div.attribution {
192
  padding-top: 0.5em;
193
  text-align: right;
194
}
195
196
div.verseblock > pre.content {
197
  font-family: inherit;
198
  font-size: inherit;
199
}
200
div.verseblock > div.attribution {
201
  padding-top: 0.75em;
202
  text-align: left;
203
}
204
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
205
div.verseblock + div.attribution {
206
  text-align: left;
207
}
208
209
div.admonitionblock .icon {
210
  vertical-align: top;
211
  font-size: 1.1em;
212
  font-weight: bold;
213
  text-decoration: underline;
214
  color: #527bbd;
215
  padding-right: 0.5em;
216
}
217
div.admonitionblock td.content {
218
  padding-left: 0.5em;
219
  border-left: 3px solid #dddddd;
220
}
221
222
div.exampleblock > div.content {
223
  border-left: 3px solid #dddddd;
224
  padding-left: 0.5em;
225
}
226
227
div.imageblock div.content { padding-left: 0; }
228
span.image img { border-style: none; vertical-align: text-bottom; }
229
a.image:visited { color: white; }
230
231
dl {
232
  margin-top: 0.8em;
233
  margin-bottom: 0.8em;
234
}
235
dt {
236
  margin-top: 0.5em;
237
  margin-bottom: 0;
238
  font-style: normal;
239
  color: navy;
240
}
241
dd > *:first-child {
242
  margin-top: 0.1em;
243
}
244
245
ul, ol {
246
    list-style-position: outside;
247
}
248
ol.arabic {
249
  list-style-type: decimal;
250
}
251
ol.loweralpha {
252
  list-style-type: lower-alpha;
253
}
254
ol.upperalpha {
255
  list-style-type: upper-alpha;
256
}
257
ol.lowerroman {
258
  list-style-type: lower-roman;
259
}
260
ol.upperroman {
261
  list-style-type: upper-roman;
262
}
263
264
div.compact ul, div.compact ol,
265
div.compact p, div.compact p,
266
div.compact div, div.compact div {
267
  margin-top: 0.1em;
268
  margin-bottom: 0.1em;
269
}
270
271
tfoot {
272
  font-weight: bold;
273
}
274
td > div.verse {
275
  white-space: pre;
276
}
277
278
div.hdlist {
279
  margin-top: 0.8em;
280
  margin-bottom: 0.8em;
281
}
282
div.hdlist tr {
283
  padding-bottom: 15px;
284
}
285
dt.hdlist1.strong, td.hdlist1.strong {
286
  font-weight: bold;
287
}
288
td.hdlist1 {
289
  vertical-align: top;
290
  font-style: normal;
291
  padding-right: 0.8em;
292
  color: navy;
293
}
294
td.hdlist2 {
295
  vertical-align: top;
296
}
297
div.hdlist.compact tr {
298
  margin: 0;
299
  padding-bottom: 0;
300
}
301
302
.comment {
303
  background: yellow;
304
}
305
306
.footnote, .footnoteref {
307
  font-size: 0.8em;
308
}
309
310
span.footnote, span.footnoteref {
311
  vertical-align: super;
312
}
313
314
#footnotes {
315
  margin: 20px 0 20px 0;
316
  padding: 7px 0 0 0;
317
}
318
319
#footnotes div.footnote {
320
  margin: 0 0 5px 0;
321
}
322
323
#footnotes hr {
324
  border: none;
325
  border-top: 1px solid silver;
326
  height: 1px;
327
  text-align: left;
328
  margin-left: 0;
329
  width: 20%;
330
  min-width: 100px;
331
}
332
333
div.colist td {
334
  padding-right: 0.5em;
335
  padding-bottom: 0.3em;
336
  vertical-align: top;
337
}
338
div.colist td img {
339
  margin-top: 0.3em;
340
}
341
342
@media print {
343
  #footer-badges { display: none; }
344
}
345
346
#toc {
347
  margin-bottom: 2.5em;
348
}
349
350
#toctitle {
351
  color: #527bbd;
352
  font-size: 1.1em;
353
  font-weight: bold;
354
  margin-top: 1.0em;
355
  margin-bottom: 0.1em;
356
}
357
358
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
359
  margin-top: 0;
360
  margin-bottom: 0;
361
}
362
div.toclevel2 {
363
  margin-left: 2em;
364
  font-size: 0.9em;
365
}
366
div.toclevel3 {
367
  margin-left: 4em;
368
  font-size: 0.9em;
369
}
370
div.toclevel4 {
371
  margin-left: 6em;
372
  font-size: 0.9em;
373
}
374
375
span.aqua { color: aqua; }
376
span.black { color: black; }
377
span.blue { color: blue; }
378
span.fuchsia { color: fuchsia; }
379
span.gray { color: gray; }
380
span.green { color: green; }
381
span.lime { color: lime; }
382
span.maroon { color: maroon; }
383
span.navy { color: navy; }
384
span.olive { color: olive; }
385
span.purple { color: purple; }
386
span.red { color: red; }
387
span.silver { color: silver; }
388
span.teal { color: teal; }
389
span.white { color: white; }
390
span.yellow { color: yellow; }
391
392
span.aqua-background { background: aqua; }
393
span.black-background { background: black; }
394
span.blue-background { background: blue; }
395
span.fuchsia-background { background: fuchsia; }
396
span.gray-background { background: gray; }
397
span.green-background { background: green; }
398
span.lime-background { background: lime; }
399
span.maroon-background { background: maroon; }
400
span.navy-background { background: navy; }
401
span.olive-background { background: olive; }
402
span.purple-background { background: purple; }
403
span.red-background { background: red; }
404
span.silver-background { background: silver; }
405
span.teal-background { background: teal; }
406
span.white-background { background: white; }
407
span.yellow-background { background: yellow; }
408
409
span.big { font-size: 2em; }
410
span.small { font-size: 0.6em; }
411
412
span.underline { text-decoration: underline; }
413
span.overline { text-decoration: overline; }
414
span.line-through { text-decoration: line-through; }
415
416
div.unbreakable { page-break-inside: avoid; }
417
418
419
/*
420
 * xhtml11 specific
421
 *
422
 * */
423
424
div.tableblock {
425
  margin-top: 1.0em;
426
  margin-bottom: 1.5em;
427
}
428
div.tableblock > table {
429
  border: 3px solid #527bbd;
430
}
431
thead, p.table.header {
432
  font-weight: bold;
433
  color: #527bbd;
434
}
435
p.table {
436
  margin-top: 0;
437
}
438
/* Because the table frame attribute is overriden by CSS in most browsers. */
439
div.tableblock > table[frame="void"] {
440
  border-style: none;
441
}
442
div.tableblock > table[frame="hsides"] {
443
  border-left-style: none;
444
  border-right-style: none;
445
}
446
div.tableblock > table[frame="vsides"] {
447
  border-top-style: none;
448
  border-bottom-style: none;
449
}
450
451
452
/*
453
 * html5 specific
454
 *
455
 * */
456
457
table.tableblock {
458
  margin-top: 1.0em;
459
  margin-bottom: 1.5em;
460
}
461
thead, p.tableblock.header {
462
  font-weight: bold;
463
  color: #527bbd;
464
}
465
p.tableblock {
466
  margin-top: 0;
467
}
468
table.tableblock {
469
  border-width: 3px;
470
  border-spacing: 0px;
471
  border-style: solid;
472
  border-color: #527bbd;
473
  border-collapse: collapse;
474
}
475
th.tableblock, td.tableblock {
476
  border-width: 1px;
477
  padding: 4px;
478
  border-style: solid;
479
  border-color: #527bbd;
480
}
481
482
table.tableblock.frame-topbot {
483
  border-left-style: hidden;
484
  border-right-style: hidden;
485
}
486
table.tableblock.frame-sides {
487
  border-top-style: hidden;
488
  border-bottom-style: hidden;
489
}
490
table.tableblock.frame-none {
491
  border-style: hidden;
492
}
493
494
th.tableblock.halign-left, td.tableblock.halign-left {
495
  text-align: left;
496
}
497
th.tableblock.halign-center, td.tableblock.halign-center {
498
  text-align: center;
499
}
500
th.tableblock.halign-right, td.tableblock.halign-right {
501
  text-align: right;
502
}
503
504
th.tableblock.valign-top, td.tableblock.valign-top {
505
  vertical-align: top;
506
}
507
th.tableblock.valign-middle, td.tableblock.valign-middle {
508
  vertical-align: middle;
509
}
510
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
511
  vertical-align: bottom;
512
}
513
514
515
/*
516
 * manpage specific
517
 *
518
 * */
519
520
body.manpage h1 {
521
  padding-top: 0.5em;
522
  padding-bottom: 0.5em;
523
  border-top: 2px solid silver;
524
  border-bottom: 2px solid silver;
525
}
526
body.manpage h2 {
527
  border-style: none;
528
}
529
body.manpage div.sectionbody {
530
  margin-left: 3em;
531
}
532
533
@media print {
534
  body.manpage div#toc { display: none; }
535
}
536
537
538
</style>
539
<script type="text/javascript">
540
/*<![CDATA[*/
541
var asciidoc = {  // Namespace.
542
543
/////////////////////////////////////////////////////////////////////
544
// Table Of Contents generator
545
/////////////////////////////////////////////////////////////////////
546
547
/* Author: Mihai Bazon, September 2002
548
 * http://students.infoiasi.ro/~mishoo
549
 *
550
 * Table Of Content generator
551
 * Version: 0.4
552
 *
553
 * Feel free to use this script under the terms of the GNU General Public
554
 * License, as long as you do not remove or alter this notice.
555
 */
556
557
 /* modified by Troy D. Hanson, September 2006. License: GPL */
558
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
559
560
// toclevels = 1..4.
561
toc: function (toclevels) {
562
563
  function getText(el) {
564
    var text = "";
565
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
566
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
567
        text += i.data;
568
      else if (i.firstChild != null)
569
        text += getText(i);
570
    }
571
    return text;
572
  }
573
574
  function TocEntry(el, text, toclevel) {
575
    this.element = el;
576
    this.text = text;
577
    this.toclevel = toclevel;
578
  }
579
580
  function tocEntries(el, toclevels) {
581
    var result = new Array;
582
    var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
583
    // Function that scans the DOM tree for header elements (the DOM2
584
    // nodeIterator API would be a better technique but not supported by all
585
    // browsers).
586
    var iterate = function (el) {
587
      for (var i = el.firstChild; i != null; i = i.nextSibling) {
588
        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
589
          var mo = re.exec(i.tagName);
590
          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
591
            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
592
          }
593
          iterate(i);
594
        }
595
      }
596
    }
597
    iterate(el);
598
    return result;
599
  }
600
601
  var toc = document.getElementById("toc");
602
  if (!toc) {
603
    return;
604
  }
605
606
  // Delete existing TOC entries in case we're reloading the TOC.
607
  var tocEntriesToRemove = [];
608
  var i;
609
  for (i = 0; i < toc.childNodes.length; i++) {
610
    var entry = toc.childNodes[i];
611
    if (entry.nodeName.toLowerCase() == 'div'
612
     && entry.getAttribute("class")
613
     && entry.getAttribute("class").match(/^toclevel/))
614
      tocEntriesToRemove.push(entry);
615
  }
616
  for (i = 0; i < tocEntriesToRemove.length; i++) {
617
    toc.removeChild(tocEntriesToRemove[i]);
618
  }
619
620
  // Rebuild TOC entries.
621
  var entries = tocEntries(document.getElementById("content"), toclevels);
622
  for (var i = 0; i < entries.length; ++i) {
623
    var entry = entries[i];
624
    if (entry.element.id == "")
625
      entry.element.id = "_toc_" + i;
626
    var a = document.createElement("a");
627
    a.href = "#" + entry.element.id;
628
    a.appendChild(document.createTextNode(entry.text));
629
    var div = document.createElement("div");
630
    div.appendChild(a);
631
    div.className = "toclevel" + entry.toclevel;
632
    toc.appendChild(div);
633
  }
634
  if (entries.length == 0)
635
    toc.parentNode.removeChild(toc);
636
},
637
638
639
/////////////////////////////////////////////////////////////////////
640
// Footnotes generator
641
/////////////////////////////////////////////////////////////////////
642
643
/* Based on footnote generation code from:
644
 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
645
 */
646
647
footnotes: function () {
648
  // Delete existing footnote entries in case we're reloading the footnodes.
649
  var i;
650
  var noteholder = document.getElementById("footnotes");
651
  if (!noteholder) {
652
    return;
653
  }
654
  var entriesToRemove = [];
655
  for (i = 0; i < noteholder.childNodes.length; i++) {
656
    var entry = noteholder.childNodes[i];
657
    if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
658
      entriesToRemove.push(entry);
659
  }
660
  for (i = 0; i < entriesToRemove.length; i++) {
661
    noteholder.removeChild(entriesToRemove[i]);
662
  }
663
664
  // Rebuild footnote entries.
665
  var cont = document.getElementById("content");
666
  var spans = cont.getElementsByTagName("span");
667
  var refs = {};
668
  var n = 0;
669
  for (i=0; i<spans.length; i++) {
670
    if (spans[i].className == "footnote") {
671
      n++;
672
      var note = spans[i].getAttribute("data-note");
673
      if (!note) {
674
        // Use [\s\S] in place of . so multi-line matches work.
675
        // Because JavaScript has no s (dotall) regex flag.
676
        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
677
        spans[i].innerHTML =
678
          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
679
          "' title='View footnote' class='footnote'>" + n + "</a>]";
680
        spans[i].setAttribute("data-note", note);
681
      }
682
      noteholder.innerHTML +=
683
        "<div class='footnote' id='_footnote_" + n + "'>" +
684
        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
685
        n + "</a>. " + note + "</div>";
686
      var id =spans[i].getAttribute("id");
687
      if (id != null) refs["#"+id] = n;
688
    }
689
  }
690
  if (n == 0)
691
    noteholder.parentNode.removeChild(noteholder);
692
  else {
693
    // Process footnoterefs.
694
    for (i=0; i<spans.length; i++) {
695
      if (spans[i].className == "footnoteref") {
696
        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
697
        href = href.match(/#.*/)[0];  // Because IE return full URL.
698
        n = refs[href];
699
        spans[i].innerHTML =
700
          "[<a href='#_footnote_" + n +
701
          "' title='View footnote' class='footnote'>" + n + "</a>]";
702
      }
703
    }
704
  }
705
},
706
707
install: function(toclevels) {
708
  var timerId;
709
710
  function reinstall() {
711
    asciidoc.footnotes();
712
    if (toclevels) {
713
      asciidoc.toc(toclevels);
714
    }
715
  }
716
717
  function reinstallAndRemoveTimer() {
718
    clearInterval(timerId);
719
    reinstall();
720
  }
721
722
  timerId = setInterval(reinstall, 500);
723
  if (document.addEventListener)
724
    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
725
  else
726
    window.onload = reinstallAndRemoveTimer;
727
}
728
729
}
730
asciidoc.install();
731
/*]]>*/
732
</script>
733
</head>
734
<body class="article">
735
<div id="header">
736
<h1>Notes for upmpdcli 0.8 release series</h1>
737
</div>
738
<div id="content">
739
<div class="sect1">
740
<h2 id="_changes_in_upmpdcli_0_8_0">Changes in upmpdcli 0.8.0</h2>
741
<div class="sectionbody">
742
<div class="paragraph"><p>The main changes in release 0.8 deal with better handling of the OpenHome
743
playlist, in addition to a number of small bug fixes, and efficiency
744
improvements.</p></div>
745
<div class="ulist"><ul>
746
<li>
747
<p>
748
OpenHome playlist: metadata from tracks directly added to the MPD queue
749
  through an MPD client (such as, e.g. MPDroid, gmpc&#8230;) is now remembered
750
  by <strong>upmpdcli</strong> and will be displayed in the UPnP control point.
751
</p>
752
</li>
753
<li>
754
<p>
755
OpenHome playlist: the metadata for the playlist is now saved to disk so
756
  that it survives restarts (like the MPD playlist does). The previous
757
  situation was that the current playing queue was still active after a
758
  player restart, but no metadata (titles, artists, etc.) was displayed.
759
</p>
760
</li>
761
<li>
762
<p>
763
Actually advertise on the network when starting up and dying. An
764
  oversight in previous versions resulted in the fact that <strong>upmpdcli</strong> could
765
  only be discovered by a search (when the control point started), but,
766
  when <strong>upmpdcli</strong> was started, it would not appear in a running control point
767
  device list.
768
</p>
769
</li>
770
<li>
771
<p>
772
Do not advertise support for raw PCM strings (audio/Lxx), as we can&#8217;t
773
  actually play them. It is better to give accurate information to the
774
  control point, so that it can choose an alternate format such as Wav if
775
  it is available.
776
</p>
777
</li>
778
</ul></div>
779
</div>
780
</div>
781
</div>
782
<div id="footnotes"><hr /></div>
783
<div id="footer">
784
<div id="footer-text">
785
Last updated 2014-08-06 09:56:53 CEST
786
</div>
787
</div>
788
</body>
789
</html>