on xenial help sign in
Make sure we can play music from the scopes after media-hub restarts.
7ba539bAlfonso Sanchez-Beato
plugins/Dash/DashAudioPlayer.qml+44−21
@@ -20,16 +20,21 @@ import QtMultimedia 5.6
20import Dash 0.1
20import Dash 0.1
21
21
22QtObject {
22QtObject {
23+ id: root
23− readonly property real progress: audio.position / audio.duration
24+ readonly property real progress: priv.audio ? priv.audio.position / priv.audio.duration : 0.0
24− readonly property bool playing: audio.playbackState === Audio.PlayingState
25+ readonly property bool playing: priv.audio ? priv.audio.playbackState === Audio.PlayingState : false
25− readonly property bool paused: audio.playbackState === Audio.PausedState
26+ readonly property bool paused: priv.audio ? priv.audio.playbackState === Audio.PausedState : false
26− readonly property bool stopped: audio.playbackState === Audio.StoppedState
27+ readonly property bool stopped: priv.audio ? priv.audio.playbackState === Audio.StoppedState : true
27− readonly property alias position: audio.position
28+ readonly property int position: priv.audio ? priv.audio.position : 0
28− readonly property url currentSource: audio.playlist.currentItemSource
29+ readonly property url currentSource: priv.audio ? priv.audio.playlist.currentItemSource : ""
29
30
30 function playSource(newSource, newPlaylist) {
31 function playSource(newSource, newPlaylist) {
32+ if (!priv.audio) {
33+ console.info("DashAudioPlayer: creating player");
34+ priv.audio = priv.audioComponent.createObject(root);
35+ }
31 stop();
36 stop();
32− audio.playlist.clear();
37+ priv.audio.playlist.clear();
33 if (newPlaylist) {
38 if (newPlaylist) {
34 // Look for newSource in newPlaylist
39 // Look for newSource in newPlaylist
35 var sourceIndex = -1;
40 var sourceIndex = -1;
@@ -48,35 +53,53 @@ QtObject {
48 for (var i in newPlaylist) {
53 for (var i in newPlaylist) {
49 urls.push(newPlaylist[i]);
54 urls.push(newPlaylist[i]);
50 }
55 }
51− audio.playlist.addItems(urls);
56+ priv.audio.playlist.addItems(urls);
52− audio.playlist.currentIndex = sourceIndex;
57+ priv.audio.playlist.currentIndex = sourceIndex;
53 } else {
58 } else {
54− audio.playlist.addItem(newSource);
59+ priv.audio.playlist.addItem(newSource);
55− audio.playlist.currentIndex = 0;
60+ priv.audio.playlist.currentIndex = 0;
56 }
61 }
57 play();
62 play();
58 }
63 }
59
64
60 function stop() {
65 function stop() {
66+ if (priv.audio) {
61− audio.stop();
67+ priv.audio.stop();
68+ }
62 }
69 }
63
70
64 function play() {
71 function play() {
72+ if (priv.audio) {
65− audio.play();
73+ priv.audio.play();
74+ }
66 }
75 }
67
76
68 function pause() {
77 function pause() {
78+ if (priv.audio) {
69− audio.pause();
79+ priv.audio.pause();
80+ }
70 }
81 }
71
82
72− property QtObject audio: Audio {
83+ property QtObject priv: QtObject {
73− id: audio
84+ id: priv
74− objectName: "audio"
85+ property Audio audio: null
86+ property Component audioComponent: Component {
87+ Audio {
75− playlist: Playlist {
88+ playlist: Playlist {
76− objectName: "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+ }
77 }
102 }
78−
79− onErrorStringChanged: console.warn("Dash Audio player error:", errorString)
80 }
103 }
81
104
82 function lengthToString(s) {
105 function lengthToString(s) {
qml/Components/NotificationAudio.qml+11−8
@@ -23,15 +23,8 @@ Item {
23 readonly property var playbackState: priv.audio ? priv.audio.playbackState : 0
23 readonly property var playbackState: priv.audio ? priv.audio.playbackState : 0
24
24
25 function play() {
25 function play() {
26− /* We can be in error state if backend media player restarted, for instance.
27− * This is a qtmultimedia issue (LP: #1616425)
28− */
29− if (priv.audio && priv.audio.error) {
30− console.warn("NotificationAudio: player in error state (" +
31− priv.audio.errorString + "), recreating");
32− priv.audio = null;
33− }
34 if (!priv.audio) {
26 if (!priv.audio) {
27+ console.info("NotificationAudio: creating player");
35 priv.audio = priv.audioComponent.createObject(root);
28 priv.audio = priv.audioComponent.createObject(root);
36 }
29 }
37 if (priv.audio) {
30 if (priv.audio) {
@@ -51,6 +44,16 @@ Item {
51 Audio {
44 Audio {
52 source: root.source
45 source: root.source
53 audioRole: MediaPlayer.NotificationRole
46 audioRole: MediaPlayer.NotificationRole
47+ /* Remove player in case of error so it gets recreated next time
48+ * we need it. Happens if backend media player restarted, for
49+ * instance. qtmultimedia should probably handle this
50+ * transparently (LP: #1616425).
51+ */
52+ onError: {
53+ console.warn("NotificationAudio: error event (" +
54+ priv.audio.errorString + "), destroying");
55+ priv.audio.destroy();
56+ }
54 }
57 }
55 }
58 }
56 }
59 }