diff --git a/openlp/core/ui/media/vendor/vlc.py b/openlp/core/ui/media/vendor/vlc.py index 95f12ec85..f56d3ef56 100644 --- a/openlp/core/ui/media/vendor/vlc.py +++ b/openlp/core/ui/media/vendor/vlc.py @@ -60,7 +60,7 @@ if sys.version_info[0] > 2: """Translate string or bytes to bytes. """ if isinstance(s, str): - return bytes(s, sys.getfilesystemencoding()) + return s.encode() else: return s diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index 784e0ffca..b560b20f8 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -104,7 +104,11 @@ def get_vlc(): if is_linux() and 'nose' not in sys.argv[0] and get_vlc(): import ctypes try: - x11 = ctypes.cdll.LoadLibrary('libX11.so') + try: + x11 = ctypes.cdll.LoadLibrary('libX11.so.6') + except OSError: + # If libx11.so.6 was not found, fallback to more generic libx11.so + x11 = ctypes.cdll.LoadLibrary('libX11.so') x11.XInitThreads() except: log.exception('Failed to run XInitThreads(), VLC might not work properly!') diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 8638b8e9c..59ca286a7 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -902,7 +902,8 @@ class SlideController(DisplayController, RegistryProperties): # This avoids the service theme/desktop flashing on screen # However opening a new item of the same type will automatically # close the previous, so make sure we don't close the new one. - if old_item.is_command() and not service_item.is_command(): + if old_item.is_command() and not service_item.is_command() or \ + old_item.is_command() and not old_item.is_media() and service_item.is_media(): Registry().execute('%s_stop' % old_item.name.lower(), [old_item, self.is_live]) if old_item.is_media() and not service_item.is_media(): self.on_media_close() diff --git a/tests/functional/openlp_core_ui/test_slidecontroller.py b/tests/functional/openlp_core_ui/test_slidecontroller.py index 2ae58b7dd..b0efb28f9 100644 --- a/tests/functional/openlp_core_ui/test_slidecontroller.py +++ b/tests/functional/openlp_core_ui/test_slidecontroller.py @@ -640,6 +640,51 @@ class TestSlideController(TestCase): mocked_preview_widget.change_slide.assert_called_once_with(7) mocked_slide_selected.assert_called_once_with() + @patch.object(Registry, 'execute') + def process_item_test(self, mocked_execute): + """ + Test that presentation service-items is closed when followed by a media service-item + """ + # GIVEN: A mocked presentation service item, a mocked media service item, a mocked Registry.execute + # and a slide controller with many mocks. + mocked_pres_item = MagicMock() + mocked_pres_item.name = 'mocked_presentation_item' + mocked_pres_item.is_command.return_value = True + mocked_pres_item.is_media.return_value = False + mocked_pres_item.is_image.return_value = False + mocked_pres_item.from_service = False + mocked_pres_item.get_frames.return_value = [] + mocked_media_item = MagicMock() + mocked_media_item.name = 'mocked_media_item' + mocked_media_item.is_command.return_value = True + mocked_media_item.is_media.return_value = True + mocked_media_item.is_image.return_value = False + mocked_media_item.from_service = False + mocked_media_item.get_frames.return_value = [] + Registry.create() + mocked_main_window = MagicMock() + Registry().register('main_window', mocked_main_window) + slide_controller = SlideController(None) + slide_controller.service_item = mocked_pres_item + slide_controller.is_live = False + slide_controller.preview_widget = MagicMock() + slide_controller.enable_tool_bar = MagicMock() + slide_controller.on_media_start = MagicMock() + slide_controller.slide_selected = MagicMock() + slide_controller.on_stop_loop = MagicMock() + slide_controller.info_label = MagicMock() + slide_controller.display = MagicMock() + slide_controller.split = 0 + slide_controller.type_prefix = 'test' + + # WHEN: _process_item is called + slide_controller._process_item(mocked_media_item, 0) + + # THEN: Registry.execute should have been called to stop the presentation + self.assertEqual(3, mocked_execute.call_count, 'Execute should have been called 3 times') + self.assertEqual('mocked_presentation_item_stop', mocked_execute.call_args_list[1][0][0], + 'The presentation should have been stopped.') + class TestInfoLabel(TestCase):