diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 1f8dc746..68bc367b 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -342,9 +342,10 @@ class Audio(pykka.ThreadingActor): if percent < 10 and not self._buffering: self._playbin.set_state(gst.STATE_PAUSED) self._buffering = True - if percent == 100 and self._target_state == gst.STATE_PLAYING: - self._playbin.set_state(gst.STATE_PLAYING) + if percent == 100: self._buffering = False + if self._target_state == gst.STATE_PLAYING: + self._playbin.set_state(gst.STATE_PLAYING) logger.debug('Buffer %d%% full', percent) @@ -484,6 +485,7 @@ class Audio(pykka.ThreadingActor): :rtype: :class:`True` if successfull, else :class:`False` """ + self._buffering = False return self._set_state(gst.STATE_NULL) def _set_state(self, state): diff --git a/tests/audio/test_actor.py b/tests/audio/test_actor.py index f767318e..900c5188 100644 --- a/tests/audio/test_actor.py +++ b/tests/audio/test_actor.py @@ -178,6 +178,7 @@ class AudioBufferingTest(unittest.TestCase): self.audio._on_buffering(0) playbin.set_state.assert_called_with(gst.STATE_PAUSED) + self.assertTrue(self.audio._buffering) def test_stay_paused_when_buffering_finished(self): playbin = self.audio._playbin @@ -187,3 +188,33 @@ class AudioBufferingTest(unittest.TestCase): self.audio._on_buffering(100) self.assertEqual(playbin.set_state.call_count, 0) + self.assertFalse(self.audio._buffering) + + def test_change_to_paused_while_buffering(self): + playbin = self.audio._playbin + self.audio.start_playback() + playbin.set_state.assert_called_with(gst.STATE_PLAYING) + playbin.set_state.reset_mock() + + self.audio._on_buffering(0) + playbin.set_state.assert_called_with(gst.STATE_PAUSED) + self.audio.pause_playback() + playbin.set_state.reset_mock() + + self.audio._on_buffering(100) + self.assertEqual(playbin.set_state.call_count, 0) + self.assertFalse(self.audio._buffering) + + def test_change_to_stopped_while_buffering(self): + playbin = self.audio._playbin + self.audio.start_playback() + playbin.set_state.assert_called_with(gst.STATE_PLAYING) + playbin.set_state.reset_mock() + + self.audio._on_buffering(0) + playbin.set_state.assert_called_with(gst.STATE_PAUSED) + playbin.set_state.reset_mock() + + self.audio.stop_playback() + playbin.set_state.assert_called_with(gst.STATE_NULL) + self.assertFalse(self.audio._buffering)