@@ -20,16 +20,21 @@ import QtMultimedia 5.6
2020import Dash 0.1
2121
2222QtObject {
23− readonly property real progress: audio.position / audio.duration
24− readonly property bool playing: audio.playbackState === Audio.PlayingState
25− readonly property bool paused: audio.playbackState === Audio.PausedState
26− readonly property bool stopped: audio.playbackState === Audio.StoppedState
27− readonly property alias position: audio.position
28− readonly property url currentSource: audio.playlist.currentItemSource
23+ id: root
24+ readonly property real progress: priv.audio ? priv.audio.position / priv.audio.duration : 0.0
25+ readonly property bool playing: priv.audio ? priv.audio.playbackState === Audio.PlayingState : false
26+ readonly property bool paused: priv.audio ? priv.audio.playbackState === Audio.PausedState : false
27+ readonly property bool stopped: priv.audio ? priv.audio.playbackState === Audio.StoppedState : true
28+ readonly property int position: priv.audio ? priv.audio.position : 0
29+ readonly property url currentSource: priv.audio ? priv.audio.playlist.currentItemSource : ""
2930
3031 function playSource(newSource, newPlaylist) {
32+ if (!priv.audio) {
33+ console.info("DashAudioPlayer: creating player");
34+ priv.audio = priv.audioComponent.createObject(root);
35+ }
3136 stop();
32− audio.playlist.clear();
37+ priv.audio.playlist.clear();
3338 if (newPlaylist) {
3439 // Look for newSource in newPlaylist
3540 var sourceIndex = -1;
@@ -48,35 +53,53 @@ QtObject {
4853 for (var i in newPlaylist) {
4954 urls.push(newPlaylist[i]);
5055 }
51− audio.playlist.addItems(urls);
52− audio.playlist.currentIndex = sourceIndex;
56+ priv.audio.playlist.addItems(urls);
57+ priv.audio.playlist.currentIndex = sourceIndex;
5358 } else {
54− audio.playlist.addItem(newSource);
55− audio.playlist.currentIndex = 0;
59+ priv.audio.playlist.addItem(newSource);
60+ priv.audio.playlist.currentIndex = 0;
5661 }
5762 play();
5863 }
5964
6065 function stop() {
61− audio.stop();
66+ if (priv.audio) {
67+ priv.audio.stop();
68+ }
6269 }
6370
6471 function play() {
65− audio.play();
72+ if (priv.audio) {
73+ priv.audio.play();
74+ }
6675 }
6776
6877 function pause() {
69− audio.pause();
78+ if (priv.audio) {
79+ priv.audio.pause();
80+ }
7081 }
7182
72− property QtObject audio: Audio {
73− id: audio
74− objectName: "audio"
75− playlist: Playlist {
76− objectName: "playlist"
83+ property QtObject priv: QtObject {
84+ id: priv
85+ property Audio audio: null
86+ property Component audioComponent: Component {
87+ Audio {
88+ playlist: Playlist {
89+ objectName: "playlist"
90+ }
91+ /* Remove player in case of error so it gets recreated next time
92+ * we need it. Happens if backend media player restarted, for
93+ * instance. qtmultimedia should probably handle this
94+ * transparently (LP: #1616425).
95+ */
96+ onError: {
97+ console.warn("DashAudioPlayer: error event (" +
98+ priv.audio.errorString + "), destroying");
99+ priv.audio.destroy();
100+ }
101+ }
77102 }
78−
79− onErrorStringChanged: console.warn("Dash Audio player error:", errorString)
80103 }
81104
82105 function lengthToString(s) {