on xenial help sign in
Make sure we emit sounds when taking a screenshot even after media-hub

has restarted (LP: #1544477) (LP: #1544477)

commita97894276e61b97f4f17aba7a781441a9e1fb070 authorAlfonso Sanchez-Beato <alfonso.sanchez-beato@canonical.com> dateFri 26 Aug 2016, 08:13 (10 years ago) parent6acf4575099a78
3 files changed+73−34
plugins/Dash/DashAudioPlayer.qml+45−21 qml/Components/NotificationAudio.qml+20−3 tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml+8−10
plugins/Dash/DashAudioPlayer.qml+45−21
@@ -20,16 +20,22 @@ 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 : ""
30+ readonly property Playlist playlist: priv.audio ? priv.audio.playlist : null
2931
3032 function playSource(newSource, newPlaylist) {
33+ if (!priv.audio) {
34+ console.info("DashAudioPlayer: creating player");
35+ priv.audio = priv.audioComponent.createObject(root);
36+ }
3137 stop();
32− audio.playlist.clear();
38+ priv.audio.playlist.clear();
3339 if (newPlaylist) {
3440 // Look for newSource in newPlaylist
3541 var sourceIndex = -1;
@@ -48,35 +54,53 @@ QtObject {
4854 for (var i in newPlaylist) {
4955 urls.push(newPlaylist[i]);
5056 }
51− audio.playlist.addItems(urls);
52− audio.playlist.currentIndex = sourceIndex;
57+ priv.audio.playlist.addItems(urls);
58+ priv.audio.playlist.currentIndex = sourceIndex;
5359 } else {
54− audio.playlist.addItem(newSource);
55− audio.playlist.currentIndex = 0;
60+ priv.audio.playlist.addItem(newSource);
61+ priv.audio.playlist.currentIndex = 0;
5662 }
5763 play();
5864 }
5965
6066 function stop() {
61− audio.stop();
67+ if (priv.audio) {
68+ priv.audio.stop();
69+ }
6270 }
6371
6472 function play() {
65− audio.play();
73+ if (priv.audio) {
74+ priv.audio.play();
75+ }
6676 }
6777
6878 function pause() {
69− audio.pause();
79+ if (priv.audio) {
80+ priv.audio.pause();
81+ }
7082 }
7183
72− property QtObject audio: Audio {
73− id: audio
74− objectName: "audio"
75− playlist: Playlist {
76− objectName: "playlist"
84+ property QtObject priv: QtObject {
85+ id: priv
86+ property Audio audio: null
87+ property Component audioComponent: Component {
88+ Audio {
89+ playlist: Playlist {
90+ objectName: "playlist"
91+ }
92+ /* Remove player in case of error so it gets recreated next time
93+ * we need it. Happens if backend media player restarted, for
94+ * instance. qtmultimedia should probably handle this
95+ * transparently (LP: #1616425).
96+ */
97+ onError: {
98+ console.warn("DashAudioPlayer: error event (" +
99+ priv.audio.errorString + "), destroying");
100+ priv.audio.destroy();
101+ }
102+ }
77103 }
78−
79− onErrorStringChanged: console.warn("Dash Audio player error:", errorString)
80104 }
81105
82106 function lengthToString(s) {
qml/Components/NotificationAudio.qml+20−3
@@ -23,6 +23,10 @@ Item {
2323 readonly property var playbackState: priv.audio ? priv.audio.playbackState : 0
2424
2525 function play() {
26+ if (!priv.audio) {
27+ console.info("NotificationAudio: creating player");
28+ priv.audio = priv.audioComponent.createObject(root);
29+ }
2630 if (priv.audio) {
2731 priv.audio.play();
2832 }
@@ -35,9 +39,22 @@ Item {
3539
3640 QtObject {
3741 id: priv
38− property var audio: Audio {
39− source: root.source
40− audioRole: MediaPlayer.NotificationRole
42+ property Audio audio: null
43+ property Component audioComponent: Component {
44+ Audio {
45+ source: root.source
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+ }
57+ }
4158 }
4259 }
4360}
tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml+8−10
@@ -127,8 +127,6 @@ Rectangle {
127127 var track1PlayButton = findChild(track1Item, "playButton");
128128 var track2PlayButton = findChild(track2Item, "playButton");
129129
130− var audio = DashAudioPlayer.audio;
131−
132130 // All progress bars must be hidden in the beginning
133131 compare(track0ProgressBar.visible, false);
134132 compare(track1ProgressBar.visible, false);
@@ -137,7 +135,7 @@ Rectangle {
137135 // Playing track 0 should make progress bar 0 visible
138136 mouseClick(track0PlayButton);
139137
140− tryCompare(audio, "playbackState", Audio.PlayingState);
138+ compare(DashAudioPlayer.playing, true);
141139 checkPlayerSource(0);
142140
143141 tryCompare(track0ProgressBar, "visible", true);
@@ -146,25 +144,25 @@ Rectangle {
146144
147145 // Clicking the button again should pause it. The progress bar should stay visible
148146 mouseClick(track0PlayButton);
149− tryCompare(audio, "playbackState", Audio.PausedState);
147+ compare(DashAudioPlayer.paused, true);
150148 checkPlayerSource(0);
151149 tryCompare(track0ProgressBar, "visible", true);
152150
153151 // Continue playback
154152 mouseClick(track0PlayButton);
155− tryCompare(audio, "playbackState", Audio.PlayingState);
153+ compare(DashAudioPlayer.playing, true);
156154 checkPlayerSource(0);
157155
158156 // Playing track 1 should make progress bar 1 visible and hide progress bar 0 again
159157 mouseClick(track1PlayButton);
160158
161− tryCompare(audio, "playbackState", Audio.PlayingState);
159+ compare(DashAudioPlayer.playing, true);
162160 checkPlayerSource(1);
163161
164162 // Check the playlist is song 0, 1, 2
165− checkPlayerUrls(tracksModel2["tracks"][0].source, audio.playlist.itemSource(0));
166− checkPlayerUrls(tracksModel2["tracks"][1].source, audio.playlist.itemSource(1));
167− checkPlayerUrls(tracksModel2["tracks"][2].source, audio.playlist.itemSource(2));
163+ checkPlayerUrls(tracksModel2["tracks"][0].source, DashAudioPlayer.playlist.itemSource(0));
164+ checkPlayerUrls(tracksModel2["tracks"][1].source, DashAudioPlayer.playlist.itemSource(1));
165+ checkPlayerUrls(tracksModel2["tracks"][2].source, DashAudioPlayer.playlist.itemSource(2));
168166
169167 tryCompare(track0ProgressBar, "visible", false);
170168 tryCompare(track1ProgressBar, "visible", true);
@@ -173,7 +171,7 @@ Rectangle {
173171 // Playing track 2 should make progress bar 1 visible and hide progress bar 0 again
174172 mouseClick(track2PlayButton);
175173
176− tryCompare(audio, "playbackState", Audio.PlayingState);
174+ compare(DashAudioPlayer.playing, true);
177175 checkPlayerSource(2);
178176
179177 tryCompare(track0ProgressBar, "visible", false);