aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--addons/resource.language.en_gb/resources/strings.po18
-rw-r--r--addons/skin.estuary/xml/AddonBrowser.xml2
-rw-r--r--addons/skin.estuary/xml/Constants_1920.xml2
-rw-r--r--addons/skin.estuary/xml/Constants_2560.xml2
-rw-r--r--addons/skin.estuary/xml/DialogMusicInfo.xml2
-rw-r--r--addons/skin.estuary/xml/Includes.xml3
-rw-r--r--addons/skin.estuary/xml/Includes_MediaMenu.xml80
-rw-r--r--addons/skin.estuary/xml/MyPlaylist.xml13
-rw-r--r--addons/skin.estuary/xml/MyVideoNav.xml2
-rw-r--r--addons/skin.estuary/xml/Variables.xml6
-rw-r--r--addons/skin.estuary/xml/View_55_WideList.xml8
-rw-r--r--codegenerator.mk1
-rw-r--r--project/BuildDependencies/scripts/0_package.list2
-rw-r--r--project/cmake/addons/bootstrap/CMakeLists.txt1
-rw-r--r--project/cmake/installdata/common/common.txt1
-rw-r--r--project/cmake/installdata/ios/fontconfig.txt1
-rw-r--r--project/cmake/modules/FindLibDvd.cmake4
-rw-r--r--project/cmake/scripts/common/Macros.cmake1
-rw-r--r--system/settings/settings.xml29
-rw-r--r--tools/android/packaging/Makefile.in1
-rw-r--r--xbmc/Application.cpp5
-rw-r--r--xbmc/Application.h1
-rw-r--r--xbmc/ContextMenuManager.cpp6
-rw-r--r--xbmc/ContextMenuManager.h1
-rw-r--r--xbmc/addons/FilesystemInstaller.cpp37
-rw-r--r--xbmc/cores/AudioEngine/Makefile.in1
-rw-r--r--xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp5
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp10
-rw-r--r--xbmc/epg/EpgContainer.cpp20
-rw-r--r--xbmc/filesystem/FavouritesDirectory.cpp7
-rw-r--r--xbmc/guilib/Resolution.cpp4
-rw-r--r--xbmc/interfaces/json-rpc/PVROperations.cpp33
-rw-r--r--xbmc/interfaces/json-rpc/PVROperations.h2
-rw-r--r--xbmc/music/dialogs/GUIDialogMusicOSD.cpp2
-rw-r--r--xbmc/pictures/GUIWindowPictures.cpp2
-rw-r--r--xbmc/pictures/PictureInfoLoader.cpp8
-rw-r--r--xbmc/pictures/PictureInfoLoader.h1
-rw-r--r--xbmc/pvr/PVRManager.cpp14
-rw-r--r--xbmc/pvr/addons/PVRClients.cpp21
-rw-r--r--xbmc/pvr/channels/PVRChannelGroup.cpp32
-rw-r--r--xbmc/pvr/channels/PVRChannelGroup.h14
-rw-r--r--xbmc/settings/Settings.cpp1
-rw-r--r--xbmc/settings/Settings.h1
-rw-r--r--xbmc/utils/StringUtils.cpp4
-rw-r--r--xbmc/windows/GUIWindowLoginScreen.cpp5
45 files changed, 264 insertions, 152 deletions
diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po
index abfc92bd5a..da55803602 100644
--- a/addons/resource.language.en_gb/resources/strings.po
+++ b/addons/resource.language.en_gb/resources/strings.po
@@ -16646,7 +16646,7 @@ msgstr ""
#. Description of setting with label #14091 "Character set"
#: system/settings/settings.xml
msgctxt "#36116"
-msgid "Choose which character set is used for displaying text in the user interface."
+msgid "Choose which character set is used for displaying text in the user interface. This doesn't change the character set used for subtitles, for that go to Player > Language."
msgstr ""
#. Description of setting with label #14079 "Timezone country"
@@ -19654,7 +19654,21 @@ msgctxt "#38111"
msgid "This category contains other settings for the GUI interface"
msgstr ""
-#empty strings from id 38112 to 38999
+#empty strings from id 38112 to 38206
+
+#. Description of setting "Pictures -> Show EXIF picture information" with label #38207
+#: system/settings/settings.xml
+msgctxt "#38207"
+msgid "Show EXIF picture information"
+msgstr ""
+
+#. Help text of setting "Pictures -> Show EXIF picture information" with label #38208
+#: system/settings/settings.xml
+msgctxt "#38208"
+msgid "If EXIF information exists (date, time, camera used, etc.), it will be displayed."
+msgstr ""
+
+#empty strings from id 38209 to 38999
#: system/settings/settings.xml
msgctxt "#39000"
diff --git a/addons/skin.estuary/xml/AddonBrowser.xml b/addons/skin.estuary/xml/AddonBrowser.xml
index f3ee214b28..dd211bcc78 100644
--- a/addons/skin.estuary/xml/AddonBrowser.xml
+++ b/addons/skin.estuary/xml/AddonBrowser.xml
@@ -63,7 +63,7 @@
<control type="group">
<height>78</height>
<bottom>0</bottom>
- <visible>$EXP[sidebar_focused]</visible>
+ <visible>$EXP[sidebar_visible]</visible>
<animation effect="fade" time="300">VisibleChange</animation>
<include content="LeftAlignedInfo">
<param name="main_label" value="$INFO[Window(AddonBrowser).Property(Updated)]" />
diff --git a/addons/skin.estuary/xml/Constants_1920.xml b/addons/skin.estuary/xml/Constants_1920.xml
index d85f2d53d2..f9b714beff 100644
--- a/addons/skin.estuary/xml/Constants_1920.xml
+++ b/addons/skin.estuary/xml/Constants_1920.xml
@@ -7,5 +7,5 @@
<constant name="tvrecordings_width">1060</constant>
<constant name="eventloglist_width">1430</constant>
<constant name="playlisteditorlist_width">770</constant>
- <constant name="playlistlist_width">904</constant>
+ <constant name="playlistlist_width">896</constant>
</includes>
diff --git a/addons/skin.estuary/xml/Constants_2560.xml b/addons/skin.estuary/xml/Constants_2560.xml
index fea8fc5886..ba83217abd 100644
--- a/addons/skin.estuary/xml/Constants_2560.xml
+++ b/addons/skin.estuary/xml/Constants_2560.xml
@@ -7,5 +7,5 @@
<constant name="tvrecordings_width">1700</constant>
<constant name="eventloglist_width">2070</constant>
<constant name="playlisteditorlist_width">1410</constant>
- <constant name="playlistlist_width">1544</constant>
+ <constant name="playlistlist_width">1536</constant>
</includes>
diff --git a/addons/skin.estuary/xml/DialogMusicInfo.xml b/addons/skin.estuary/xml/DialogMusicInfo.xml
index 4f895ab4e2..08940cc059 100644
--- a/addons/skin.estuary/xml/DialogMusicInfo.xml
+++ b/addons/skin.estuary/xml/DialogMusicInfo.xml
@@ -31,7 +31,7 @@
<height>567</height>
<aspectratio aligny="top">scale</aspectratio>
<fadetime>300</fadetime>
- <texture background="true" fallback="DefaultAudio.png">$INFO[ListItem.Art(thumb)]</texture>
+ <texture background="true">$VAR[MusicInfoThumbVar]</texture>
</control>
</control>
<control type="group">
diff --git a/addons/skin.estuary/xml/Includes.xml b/addons/skin.estuary/xml/Includes.xml
index 03935c9f19..9d297c84a9 100644
--- a/addons/skin.estuary/xml/Includes.xml
+++ b/addons/skin.estuary/xml/Includes.xml
@@ -34,7 +34,7 @@
<constant name="list_y_offset">0</constant>
<constant name="list_item_height">80</constant>
<expression name="infodialog_active">Window.IsActive(musicinformation) | Window.IsActive(songinformation) | Window.IsActive(movieinformation) | Window.IsActive(addoninformation) | Window.IsActive(pvrguideinfo) | Window.IsActive(pvrrecordinginfo) | Window.IsActive(pictureinfo) | Window.IsVisible(script-script.extendedinfo-DialogVideoInfo.xml) | Window.IsVisible(script-script.extendedinfo-DialogInfo.xml) | Window.IsVisible(script-script.extendedinfo-VideoList.xml)</expression>
- <expression name="sidebar_focused">ControlGroup(9000).HasFocus | Control.HasFocus(6130)</expression>
+ <expression name="sidebar_visible">ControlGroup(9000).HasFocus | Control.HasFocus(6130) | Window.IsActive(MyPlaylist.xml)</expression>
<include name="CommonScrollbars">
<control type="group">
<animation effect="fade" start="100" end="0" time="150">WindowClose</animation>
@@ -320,6 +320,7 @@
<font>$PARAM[font]</font>
<aligny>center</aligny>
<label>$INFO[ListItem.Label]</label>
+ <scroll>true</scroll>
</control>
</focusedlayout>
</definition>
diff --git a/addons/skin.estuary/xml/Includes_MediaMenu.xml b/addons/skin.estuary/xml/Includes_MediaMenu.xml
index baa5f59b5f..650121f68d 100644
--- a/addons/skin.estuary/xml/Includes_MediaMenu.xml
+++ b/addons/skin.estuary/xml/Includes_MediaMenu.xml
@@ -200,7 +200,7 @@
<onleft>14100</onleft>
<onup>8</onup>
<ondown>6056</ondown>
- <visible>Player.HasMedia + [$EXP[sidebar_focused]]</visible>
+ <visible>Player.HasMedia + [$EXP[sidebar_visible]]</visible>
<visible>!System.HasModalDialog</visible>
<include content="BottomMainMenuToggleItem">
<param name="control_id" value="14101" />
@@ -243,7 +243,7 @@
<include>OpenClose_Left</include>
<depth>DepthSideBlade</depth>
<left>-520</left>
- <animation type="Conditional" condition="$EXP[sidebar_focused]" reversible="true">
+ <animation type="Conditional" condition="$EXP[sidebar_visible]" reversible="true">
<effect type="slide" start="0" end="520" time="400" tween="cubic" easing="out" />
</animation>
<control type="image">
@@ -251,7 +251,7 @@
<height>100%</height>
<aspectratio>scale</aspectratio>
<texture colordiffuse="80FFFFFF">colors/black.png</texture>
- <visible>$EXP[sidebar_focused] + !System.HasModalDialog</visible>
+ <visible>$EXP[sidebar_visible] + !System.HasModalDialog</visible>
<animation effect="fade" time="200">VisibleChange</animation>
</control>
<control type="image">
@@ -271,41 +271,44 @@
</control>
</include>
<include name="MediaMenuNowPlaying">
- <control type="grouplist" id="14100">
- <animation effect="fade" start="0" end="100" time="400">WindowOpen</animation>
- <animation effect="fade" start="100" end="0" time="300">WindowClose</animation>
- <animation effect="fade" time="300">VisibleChange</animation>
- <orientation>horizontal</orientation>
- <itemgap>-17</itemgap>
- <left>5</left>
- <onleft>14100</onleft>
- <width>450</width>
- <visible>Player.HasMedia + [$EXP[sidebar_focused]]</visible>
- <visible>!System.HasModalDialog</visible>
- <include content="BottomMainMenuToggleItem">
- <param name="control_id" value="14101" />
- <param name="onclick" value="PlayerControl(Play)" />
- <param name="icon_on" value="icons/now-playing/play.png" />
- <param name="icon_off" value="icons/now-playing/pause.png" />
- <param name="selected" value="Player.Paused" />
- </include>
- <include content="IconButton">
- <param name="control_id" value="14102" />
- <param name="onclick" value="Stop" />
- <param name="onclick_2" value="SetFocus(50)" />
- <param name="icon" value="icons/now-playing/stop.png" />
- </include>
- <include content="IconButton">
- <param name="control_id" value="14104" />
- <param name="onclick" value="PlayerControl(Next)" />
- <param name="icon" value="icons/now-playing/next.png" />
- </include>
- <include content="IconButton">
- <param name="control_id" value="14105" />
- <param name="onclick" value="Fullscreen" />
- <param name="icon" value="icons/now-playing/fullscreen.png" />
- </include>
- </control>
+ <param name="left">5</param>
+ <definition>
+ <control type="grouplist" id="14100">
+ <animation effect="fade" start="0" end="100" time="400">WindowOpen</animation>
+ <animation effect="fade" start="100" end="0" time="300">WindowClose</animation>
+ <animation effect="fade" time="300">VisibleChange</animation>
+ <orientation>horizontal</orientation>
+ <itemgap>-17</itemgap>
+ <left>$PARAM[left]</left>
+ <onleft>14100</onleft>
+ <width>450</width>
+ <visible>Player.HasMedia + [$EXP[sidebar_visible]]</visible>
+ <visible>!System.HasModalDialog</visible>
+ <include content="BottomMainMenuToggleItem">
+ <param name="control_id" value="14101" />
+ <param name="onclick" value="PlayerControl(Play)" />
+ <param name="icon_on" value="icons/now-playing/play.png" />
+ <param name="icon_off" value="icons/now-playing/pause.png" />
+ <param name="selected" value="Player.Paused" />
+ </include>
+ <include content="IconButton">
+ <param name="control_id" value="14102" />
+ <param name="onclick" value="Stop" />
+ <param name="onclick_2" value="SetFocus(50)" />
+ <param name="icon" value="icons/now-playing/stop.png" />
+ </include>
+ <include content="IconButton">
+ <param name="control_id" value="14104" />
+ <param name="onclick" value="PlayerControl(Next)" />
+ <param name="icon" value="icons/now-playing/next.png" />
+ </include>
+ <include content="IconButton">
+ <param name="control_id" value="14105" />
+ <param name="onclick" value="Fullscreen" />
+ <param name="icon" value="icons/now-playing/fullscreen.png" />
+ </include>
+ </control>
+ </definition>
</include>
<include name="MediaMenuListCommon">
<definition>
@@ -345,7 +348,6 @@
</control>
<control type="button" id="19">
<visible>Container.CanFilter + !Container.CanFilterAdvanced</visible>
- <visible>!Container.Content()</visible>
<include>MediaMenuItemsCommon</include>
<label>$LOCALIZE[137]</label>
</control>
diff --git a/addons/skin.estuary/xml/MyPlaylist.xml b/addons/skin.estuary/xml/MyPlaylist.xml
index 51361f04c8..f66dc10734 100644
--- a/addons/skin.estuary/xml/MyPlaylist.xml
+++ b/addons/skin.estuary/xml/MyPlaylist.xml
@@ -10,9 +10,9 @@
<control type="group">
<include>OpenClose_Left</include>
<control type="fixedlist" id="50">
- <left>402</left>
+ <left>410</left>
<top>list_y_offset</top>
- <right>594</right>
+ <right>586</right>
<bottom>list_y_offset</bottom>
<scrolltime tween="cubic" easing="out">500</scrolltime>
<orientation>vertical</orientation>
@@ -79,7 +79,7 @@
<control type="group">
<depth>DepthContentPanel</depth>
<include content="ContentPanel">
- <param name="width" value="462" />
+ <param name="width" value="470" />
</include>
<control type="grouplist" id="700">
<orientation>vertical</orientation>
@@ -90,9 +90,9 @@
<ondown>700</ondown>
<onleft>50</onleft>
<onright>50</onright>
- <width>402</width>
+ <width>410</width>
<control type="radiobutton" id="20">
- <width>402</width>
+ <width>410</width>
<height>110</height>
<align>left</align>
<aligny>top</aligny>
@@ -115,6 +115,9 @@
<param name="control_id" value="22" />
<param name="label" value="$LOCALIZE[192]" />
</include>
+ <include content="MediaMenuNowPlaying">
+ <param name="left" value="-5" />
+ </include>
</control>
</control>
</control>
diff --git a/addons/skin.estuary/xml/MyVideoNav.xml b/addons/skin.estuary/xml/MyVideoNav.xml
index 8b2b8f8da3..ea67f8e956 100644
--- a/addons/skin.estuary/xml/MyVideoNav.xml
+++ b/addons/skin.estuary/xml/MyVideoNav.xml
@@ -138,7 +138,7 @@
<include>MediaMenuItemsCommon</include>
<label>$LOCALIZE[31056]</label>
<onclick>ActivateWindow(videoplaylist)</onclick>
- <visible>IntegerGreaterThan(Playlist.Length(video),0)</visible>
+ <visible>Integer.IsGreater(Playlist.Length(video),0)</visible>
</control>
<control type="button" id="621">
<description>Get more</description>
diff --git a/addons/skin.estuary/xml/Variables.xml b/addons/skin.estuary/xml/Variables.xml
index a1f306bcc3..f41d2bdb63 100644
--- a/addons/skin.estuary/xml/Variables.xml
+++ b/addons/skin.estuary/xml/Variables.xml
@@ -65,6 +65,12 @@
<value condition="ListItem.IsFolder + String.IsEmpty(ListItem.Thumb)">DefaultFolderSquare.png</value>
<value>$INFO[ListItem.Thumb]</value>
</variable>
+ <variable name="MusicInfoThumbVar">
+ <value condition="!String.IsEmpty(Listitem.Art(thumb))">$INFO[Listitem.Art(thumb)]</value>
+ <value condition="String.IsEqual(listitem.dbtype,artist)">DefaultArtist.png</value>
+ <value condition="String.IsEqual(listitem.dbtype,album)">DefaultAlbumCover.png</value>
+ <value>DefaultAudio.png</value>
+ </variable>
<variable name="InfoWallThumbVar">
<value condition="!String.IsEmpty(Listitem.Art(poster))">$INFO[Listitem.Art(poster)]</value>
<value>$INFO[ListItem.Icon]</value>
diff --git a/addons/skin.estuary/xml/View_55_WideList.xml b/addons/skin.estuary/xml/View_55_WideList.xml
index 7ae03461b3..c567df747a 100644
--- a/addons/skin.estuary/xml/View_55_WideList.xml
+++ b/addons/skin.estuary/xml/View_55_WideList.xml
@@ -37,7 +37,7 @@
<aligny>center</aligny>
<label>$INFO[ListItem.Year]</label>
<shadowcolor>text_shadow</shadowcolor>
- <visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies)</visible>
+ <visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies) + !Container.Content(videos)</visible>
</control>
<control type="image">
<left>35</left>
@@ -45,7 +45,7 @@
<width>32</width>
<height>32</height>
<texture>$VAR[ListWatchedIconVar]</texture>
- <visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | String.IsEmpty(ListItem.Year)</visible>
+ <visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | Container.Content(videos) | String.IsEmpty(ListItem.Year)</visible>
</control>
<control type="label">
<left>105</left>
@@ -78,7 +78,7 @@
<label>$INFO[ListItem.Year]</label>
<textcolor>button_focus</textcolor>
<shadowcolor>text_shadow</shadowcolor>
- <visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies)</visible>
+ <visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies) + !Container.Content(videos)</visible>
</control>
<control type="image">
<left>35</left>
@@ -86,7 +86,7 @@
<width>32</width>
<height>32</height>
<texture colordiffuse="grey">$VAR[ListWatchedIconVar]</texture>
- <visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | String.IsEmpty(ListItem.Year)</visible>
+ <visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | Container.Content(videos) | String.IsEmpty(ListItem.Year)</visible>
</control>
<control type="label">
<left>105</left>
diff --git a/codegenerator.mk b/codegenerator.mk
index 5f8bdd97de..dc93280d1a 100644
--- a/codegenerator.mk
+++ b/codegenerator.mk
@@ -69,3 +69,4 @@ else
#build json builder - ".." because makefile is in the parent dir of "bin"
$(MAKE) -C $(abspath $(@D)/..)
endif
+$(shell touch $(TOPDIR)/xbmc/cores/AudioEngine/AEDefines_override.h)
diff --git a/project/BuildDependencies/scripts/0_package.list b/project/BuildDependencies/scripts/0_package.list
index e9dfdd61c6..7330562ae6 100644
--- a/project/BuildDependencies/scripts/0_package.list
+++ b/project/BuildDependencies/scripts/0_package.list
@@ -6,7 +6,7 @@
; -> sqlite-3.7.12.1-win32\system\sqlite3.dll
; -> ...
;PLEASE KEEP THIS LIST IN ALPHABETICAL ORDER!
-cpluff-2b8e20-win32-vc140.7z
+cpluff-ed7874fc-win32-vc140.7z
crossguid-8f399e-win32-vc140-v3.7z
curl-7.48-win32-vc140.7z
dnssd-541-win32.zip
diff --git a/project/cmake/addons/bootstrap/CMakeLists.txt b/project/cmake/addons/bootstrap/CMakeLists.txt
index c20b97efca..66b7e3d16c 100644
--- a/project/cmake/addons/bootstrap/CMakeLists.txt
+++ b/project/cmake/addons/bootstrap/CMakeLists.txt
@@ -50,7 +50,6 @@ function(bootstrap_repo repo_id repo_url repo_revision)
-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
-DPROJECT_SOURCE_DIR=<SOURCE_DIR>
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
- -DADDONS_TO_BUILD=${ADDONS_TO_BUILD}
-P ${PROJECT_SOURCE_DIR}/Bootstrap.cmake
)
endfunction()
diff --git a/project/cmake/installdata/common/common.txt b/project/cmake/installdata/common/common.txt
index c1e52f0ee5..a9d19234e3 100644
--- a/project/cmake/installdata/common/common.txt
+++ b/project/cmake/installdata/common/common.txt
@@ -2,7 +2,6 @@ media/*
sounds/*
system/keymaps/*
system/library/*
-system/players/VideoPlayer/etc/*
system/shaders/*
system/settings/*
userdata/*
diff --git a/project/cmake/installdata/ios/fontconfig.txt b/project/cmake/installdata/ios/fontconfig.txt
new file mode 100644
index 0000000000..1f1bd9d50b
--- /dev/null
+++ b/project/cmake/installdata/ios/fontconfig.txt
@@ -0,0 +1 @@
+system/players/VideoPlayer/etc/*
diff --git a/project/cmake/modules/FindLibDvd.cmake b/project/cmake/modules/FindLibDvd.cmake
index 59c6f9638b..a083ddc4ed 100644
--- a/project/cmake/modules/FindLibDvd.cmake
+++ b/project/cmake/modules/FindLibDvd.cmake
@@ -123,9 +123,9 @@ if(NOT WIN32)
set_target_properties(dvdcss PROPERTIES FOLDER "External Projects")
endif()
- set(DVDREAD_CFLAGS "-D_XBMC")
+ set(DVDREAD_CFLAGS "-D_XBMC -I${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include")
if(ENABLE_DVDCSS)
- set(DVDREAD_CFLAGS "${DVDREAD_CFLAGS} -DHAVE_DVDCSS_DVDCSS_H -I${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include")
+ set(DVDREAD_CFLAGS "${DVDREAD_CFLAGS} -DHAVE_DVDCSS_DVDCSS_H")
endif()
set(DVDREAD_LIBRARY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdread.a)
diff --git a/project/cmake/scripts/common/Macros.cmake b/project/cmake/scripts/common/Macros.cmake
index 6b5a2f1a7e..d8cdce9ce2 100644
--- a/project/cmake/scripts/common/Macros.cmake
+++ b/project/cmake/scripts/common/Macros.cmake
@@ -584,6 +584,7 @@ function(core_find_git_rev stamp)
else()
find_package(Git)
if(GIT_FOUND AND EXISTS ${CORE_SOURCE_DIR}/.git)
+ execute_process(COMMAND ${GIT_EXECUTABLE} update-index --ignore-submodules --refresh -q)
execute_process(COMMAND ${GIT_EXECUTABLE} diff-files --ignore-submodules --quiet --
RESULT_VARIABLE status_code
WORKING_DIRECTORY ${CORE_SOURCE_DIR})
diff --git a/system/settings/settings.xml b/system/settings/settings.xml
index c3804da962..f28f5daa81 100644
--- a/system/settings/settings.xml
+++ b/system/settings/settings.xml
@@ -581,6 +581,11 @@
</category>
<category id="pictures" label="14217" help="38105">
<group id="1" label="108">
+ <setting id="pictures.usetags" type="boolean" label="38207" help="38208">
+ <level>1</level>
+ <default>true</default>
+ <control type="toggle" />
+ </setting>
<setting id="slideshow.staytime" type="integer" label="12378" help="36312">
<level>0</level>
<default>5</default>
@@ -665,13 +670,24 @@
<control type="spinner" format="integer" delayed="true"/>
</setting>
<setting id="subtitles.font" type="string" label="14089" help="36185">
- <level>3</level>
+ <level>1</level>
<default>arial.ttf</default>
<constraints>
<options>fonts</options>
</constraints>
<control type="list" format="string" />
</setting>
+ <setting id="subtitles.charset" type="string" parent="subtitles.font" label="735" help="36189">
+ <level>1</level>
+ <default>DEFAULT</default>
+ <constraints>
+ <options>charsets</options>
+ </constraints>
+ <dependencies>
+ <dependency type="enable" on="property" name="IsUsingTTFSubtitles" setting="subtitles.font" />
+ </dependencies>
+ <control type="list" format="string" />
+ </setting>
<setting id="subtitles.height" type="integer" parent="subtitles.font" label="289" help="36186">
<level>3</level>
<default>28</default>
@@ -721,17 +737,6 @@
</dependencies>
<control type="list" format="string" />
</setting>
- <setting id="subtitles.charset" type="string" parent="subtitles.font" label="735" help="36189">
- <level>3</level>
- <default>DEFAULT</default>
- <constraints>
- <options>charsets</options>
- </constraints>
- <dependencies>
- <dependency type="enable" on="property" name="IsUsingTTFSubtitles" setting="subtitles.font" />
- </dependencies>
- <control type="list" format="string" />
- </setting>
<setting id="subtitles.overrideassfonts" type="boolean" label="21368" help="36190">
<level>3</level>
<default>false</default>
diff --git a/tools/android/packaging/Makefile.in b/tools/android/packaging/Makefile.in
index b34fa6c282..fb8b20b21b 100644
--- a/tools/android/packaging/Makefile.in
+++ b/tools/android/packaging/Makefile.in
@@ -117,6 +117,7 @@ res:
cp -fp media/drawable-mdpi/ic_launcher.png xbmc/res/drawable-mdpi/ic_launcher.png
cp -fp media/drawable-xhdpi/ic_launcher.png xbmc/res/drawable-xhdpi/ic_launcher.png
cp -fp media/drawable-xxhdpi/ic_launcher.png xbmc/res/drawable-xxhdpi/ic_launcher.png
+ cp -fp $(CORE_SOURCE_DIR)/media/Splash.png xbmc/res/drawable-xxxhdpi/splash.png
cp -fp media/drawable-xxxhdpi/ic_launcher.png xbmc/res/drawable-xxxhdpi/ic_launcher.png
cp -fp media/drawable-xhdpi/banner.png xbmc/res/drawable-xhdpi/banner.png
cp xbmc/strings.xml xbmc/res/values/
diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp
index b12b8e8283..c6ef0c0e08 100644
--- a/xbmc/Application.cpp
+++ b/xbmc/Application.cpp
@@ -4655,6 +4655,11 @@ const std::string& CApplication::CurrentFile()
return m_itemCurrentFile->GetPath();
}
+std::shared_ptr<CFileItem> CApplication::CurrentFileItemPtr()
+{
+ return m_itemCurrentFile;
+}
+
CFileItem& CApplication::CurrentFileItem()
{
return *m_itemCurrentFile;
diff --git a/xbmc/Application.h b/xbmc/Application.h
index 580fdce547..8d5876e03d 100644
--- a/xbmc/Application.h
+++ b/xbmc/Application.h
@@ -164,6 +164,7 @@ public:
void ReloadSkin(bool confirm = false);
const std::string& CurrentFile();
CFileItem& CurrentFileItem();
+ std::shared_ptr<CFileItem> CurrentFileItemPtr();
void SetCurrentFileItem(const CFileItem &item);
CFileItem& CurrentUnstackedItem();
virtual bool OnMessage(CGUIMessage& message) override;
diff --git a/xbmc/ContextMenuManager.cpp b/xbmc/ContextMenuManager.cpp
index 4329c542d3..92688728be 100644
--- a/xbmc/ContextMenuManager.cpp
+++ b/xbmc/ContextMenuManager.cpp
@@ -43,7 +43,13 @@ CContextMenuManager::CContextMenuManager(CAddonMgr& addonMgr)
CContextMenuManager::~CContextMenuManager()
{
+ Deinit();
+}
+
+void CContextMenuManager::Deinit()
+{
m_addonMgr.Events().Unsubscribe(this);
+ m_items.clear();
}
CContextMenuManager& CContextMenuManager::GetInstance()
diff --git a/xbmc/ContextMenuManager.h b/xbmc/ContextMenuManager.h
index 3a96b8a765..7f613b1687 100644
--- a/xbmc/ContextMenuManager.h
+++ b/xbmc/ContextMenuManager.h
@@ -40,6 +40,7 @@ public:
static CContextMenuManager& GetInstance();
void Init();
+ void Deinit();
ContextMenuView GetItems(const CFileItem& item, const CContextMenuItem& root = MAIN) const;
diff --git a/xbmc/addons/FilesystemInstaller.cpp b/xbmc/addons/FilesystemInstaller.cpp
index bd4a93171d..81b83e46d5 100644
--- a/xbmc/addons/FilesystemInstaller.cpp
+++ b/xbmc/addons/FilesystemInstaller.cpp
@@ -26,8 +26,35 @@
#include "utils/StringUtils.h"
#include "utils/URIUtils.h"
+#ifdef TARGET_POSIX
+#include "XTimeUtils.h"
+#endif
+
using namespace XFILE;
+namespace
+{
+
+bool renameOrRetry(const std::string & source, const std::string & dest, const char * description)
+{
+ auto count = 1;
+ auto result = false;
+ do
+ {
+ result = CFile::Rename(source, dest);
+ if (!result)
+ {
+ CLog::Log(LOGERROR, "Failed to move %s addon files from '%s' to '%s', retrying in 500ms",
+ description, source.c_str(), dest.c_str());
+ Sleep(500);
+ }
+ } while (!result && count++ < 4);
+
+ return result;
+}
+
+} // end namespace unnamed
+
CFilesystemInstaller::CFilesystemInstaller()
{
m_addonFolder = CSpecialProtocol::TranslatePath("special://home/addons/");
@@ -52,18 +79,12 @@ bool CFilesystemInstaller::InstallToFilesystem(const std::string& archive, const
bool hasOldData = CDirectory::Exists(addonFolder);
if (hasOldData)
{
- if (!CFile::Rename(addonFolder, oldAddonData))
- {
- CLog::Log(LOGERROR, "Failed to move old addon files from '%s' to '%s'", addonFolder.c_str(), oldAddonData.c_str());
+ if (!renameOrRetry(addonFolder, oldAddonData, "old"))
return false;
- }
}
- if (!CFile::Rename(newAddonData, addonFolder))
- {
- CLog::Log(LOGERROR, "Failed to move new addon files from '%s' to '%s'", newAddonData.c_str(), addonFolder.c_str());
+ if (!renameOrRetry(newAddonData, addonFolder, "new"))
return false;
- }
if (hasOldData)
{
diff --git a/xbmc/cores/AudioEngine/Makefile.in b/xbmc/cores/AudioEngine/Makefile.in
index 9a3d486dcb..edb6b110bf 100644
--- a/xbmc/cores/AudioEngine/Makefile.in
+++ b/xbmc/cores/AudioEngine/Makefile.in
@@ -83,6 +83,5 @@ SRCS += Utils/AELimiter.cpp
SRCS += Encoders/AEEncoderFFmpeg.cpp
LIB = audioengine.a
-$(shell touch AEDefines_override.h)
include @abs_top_srcdir@/Makefile.include
-include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS)))
diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
index 7149b34d66..1698b2f782 100644
--- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
+++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
@@ -469,7 +469,10 @@ bool CAESinkAUDIOTRACK::Initialize(AEAudioFormat &format, std::string &device)
Deinitialize();
return false;
}
- CLog::Log(LOGDEBUG, "CAESinkAUDIOTRACK::Initialize returned: m_sampleRate %u; format:%s; min_buffer_size %u; m_frames %u; m_frameSize %u; channels: %d", m_sink_sampleRate, CAEUtil::DataFormatToStr(m_format.m_dataFormat), m_min_buffer_size, m_format.m_frames, m_format.m_frameSize, m_format.m_channelLayout.Count());
+ const char* method = m_passthrough ? (m_info.m_wantsIECPassthrough ? "IEC (PT)" : "RAW (PT)") : "PCM";
+ CLog::Log(LOGNOTICE, "CAESinkAUDIOTRACK::Initializing with: m_sampleRate: %u format: %s (AE) method: %s stream-type: %s min_buffer_size: %u m_frames: %u m_frameSize: %u channels: %d",
+ m_sink_sampleRate, CAEUtil::DataFormatToStr(m_format.m_dataFormat), method, m_passthrough ? CAEUtil::StreamTypeToStr(m_format.m_streamInfo.m_type) : "PCM-STREAM",
+ m_min_buffer_size, m_format.m_frames, m_format.m_frameSize, m_format.m_channelLayout.Count());
}
format = m_format;
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
index 17c428cb28..420b5b5d8e 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
@@ -236,8 +236,8 @@ bool CRenderManager::Configure(DVDVideoPicture& picture, float fps, unsigned fla
m_NumberBuffers = buffers;
m_renderState = STATE_CONFIGURING;
m_stateEvent.Reset();
-
- CheckEnableClockSync();
+ m_clockSync.Reset();
+ m_dvdClock.SetVsyncAdjust(0);
CSingleLock lock2(m_presentlock);
m_presentstep = PRESENT_READY;
@@ -318,7 +318,7 @@ bool CRenderManager::Configure()
m_renderedOverlay = false;
m_renderDebug = false;
m_clockSync.Reset();
- CheckEnableClockSync();
+ m_dvdClock.SetVsyncAdjust(0);
m_renderState = STATE_CONFIGURED;
@@ -383,6 +383,8 @@ void CRenderManager::FrameMove()
CApplicationMessenger::GetInstance().PostMsg(TMSG_SWITCHTOFULLSCREEN);
}
}
+
+ CheckEnableClockSync();
}
{
CSingleLock lock2(m_presentlock);
@@ -1080,8 +1082,6 @@ void CRenderManager::UpdateResolution()
RESOLUTION res = CResolutionUtils::ChooseBestResolution(m_fps, m_width, CONF_FLAGS_STEREO_MODE_MASK(m_flags));
g_graphicsContext.SetVideoResolution(res);
UpdateDisplayLatency();
-
- CheckEnableClockSync();
}
m_bTriggerUpdateResolution = false;
m_playerPort->VideoParamsChange();
diff --git a/xbmc/epg/EpgContainer.cpp b/xbmc/epg/EpgContainer.cpp
index 85820b1a9b..f597fa0697 100644
--- a/xbmc/epg/EpgContainer.cpp
+++ b/xbmc/epg/EpgContainer.cpp
@@ -411,12 +411,24 @@ CEpgInfoTagPtr CEpgContainer::GetTagById(const CPVRChannelPtr &channel, unsigned
{
CEpgInfoTagPtr retval;
- if (!channel || iBroadcastId == EPG_TAG_INVALID_UID)
+ if (iBroadcastId == EPG_TAG_INVALID_UID)
return retval;
- const CEpgPtr epg(channel->GetEPG());
- if (epg)
- retval = epg->GetTagByBroadcastId(iBroadcastId);
+ if (channel)
+ {
+ const CEpgPtr epg(channel->GetEPG());
+ if (epg)
+ retval = epg->GetTagByBroadcastId(iBroadcastId);
+ }
+ else
+ {
+ for (const auto &epgEntry : m_epgs)
+ {
+ retval = epgEntry.second->GetTagByBroadcastId(iBroadcastId);
+ if (retval)
+ break;
+ }
+ }
return retval;
}
diff --git a/xbmc/filesystem/FavouritesDirectory.cpp b/xbmc/filesystem/FavouritesDirectory.cpp
index fc42ed3d5b..dd50787016 100644
--- a/xbmc/filesystem/FavouritesDirectory.cpp
+++ b/xbmc/filesystem/FavouritesDirectory.cpp
@@ -197,8 +197,13 @@ std::string CFavouritesDirectory::GetExecutePath(const CFileItem &item, const st
execute = StringUtils::Format("ActivateWindow(%s,%s,return)", contextWindow.c_str(), StringUtils::Paramify(item.GetPath()).c_str());
}
//! @todo STRING_CLEANUP
- else if (item.IsScript() && item.GetPath().size() > 9) // plugin://<foo>
+ else if (item.IsScript() && item.GetPath().size() > 9) // script://<foo>
execute = StringUtils::Format("RunScript(%s)", StringUtils::Paramify(item.GetPath().substr(9)).c_str());
+ else if (item.IsAddonsPath() && item.GetPath().size() > 9) // addons://<foo>
+ {
+ CURL url(item.GetPath());
+ execute = StringUtils::Format("RunAddon(%s)", url.GetFileName().c_str());
+ }
else if (item.IsAndroidApp() && item.GetPath().size() > 26) // androidapp://sources/apps/<foo>
execute = StringUtils::Format("StartAndroidActivity(%s)", StringUtils::Paramify(item.GetPath().substr(26)).c_str());
else // assume a media file
diff --git a/xbmc/guilib/Resolution.cpp b/xbmc/guilib/Resolution.cpp
index b86110cfe5..8c19be8151 100644
--- a/xbmc/guilib/Resolution.cpp
+++ b/xbmc/guilib/Resolution.cpp
@@ -224,11 +224,13 @@ RESOLUTION CResolutionUtils::FindClosestResolution(float fps, int width, bool is
// evaluate all higher modes and evalute them
// concerning dimension and refreshrate weight
// skip lower resolutions
+ // don't change resolutions when 3D is wanted
if ((width < orig.iScreenWidth) || // orig res large enough
(info.iScreenWidth < orig.iScreenWidth) || // new res is smaller
(info.iScreenHeight < orig.iScreenHeight) || // new height would be smaller
(info.dwFlags & D3DPRESENTFLAG_MODEMASK) != (curr.dwFlags & D3DPRESENTFLAG_MODEMASK) || // don't switch to interlaced modes
- (info.iScreen != curr.iScreen)) // skip not current displays
+ (info.iScreen != curr.iScreen) || // skip not current displays
+ is3D) // skip res changing when doing 3D
{
continue;
}
diff --git a/xbmc/interfaces/json-rpc/PVROperations.cpp b/xbmc/interfaces/json-rpc/PVROperations.cpp
index 0ebca7547f..6fbd6e2be7 100644
--- a/xbmc/interfaces/json-rpc/PVROperations.cpp
+++ b/xbmc/interfaces/json-rpc/PVROperations.cpp
@@ -337,34 +337,12 @@ JSONRPC_STATUS CPVROperations::GetTimerDetails(const std::string &method, ITrans
return OK;
}
-CFileItemPtr CPVROperations::GetBroadcastFromBroadcastid(unsigned int broadcastid)
-{
- EpgSearchFilter filter;
- filter.Reset();
- filter.m_iUniqueBroadcastId = broadcastid;
-
- CFileItemList broadcasts;
- int resultSize = g_EpgContainer.GetEPGSearch(broadcasts, filter);
-
- if (resultSize != 1)
- return CFileItemPtr();
-
- return broadcasts.Get(0);
-}
-
JSONRPC_STATUS CPVROperations::AddTimer(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
{
if (!g_PVRManager.IsStarted())
return FailedToExecute;
- CFileItemPtr broadcast = CPVROperations::GetBroadcastFromBroadcastid(parameterObject["broadcastid"].asUnsignedInteger());
- if (!broadcast)
- return InvalidParams;
-
- if (!broadcast->HasEPGInfoTag())
- return InvalidParams;
-
- CEpgInfoTagPtr epgTag = broadcast->GetEPGInfoTag();
+ const CEpgInfoTagPtr epgTag = g_EpgContainer.GetTagById(CPVRChannelPtr(), parameterObject["broadcastid"].asUnsignedInteger());
if (!epgTag)
return InvalidParams;
@@ -406,14 +384,7 @@ JSONRPC_STATUS CPVROperations::ToggleTimer(const std::string &method, ITransport
if (!g_PVRManager.IsStarted())
return FailedToExecute;
- CFileItemPtr broadcast = CPVROperations::GetBroadcastFromBroadcastid(parameterObject["broadcastid"].asUnsignedInteger());
- if (!broadcast)
- return InvalidParams;
-
- if (!broadcast->HasEPGInfoTag())
- return InvalidParams;
-
- CEpgInfoTagPtr epgTag = broadcast->GetEPGInfoTag();
+ const CEpgInfoTagPtr epgTag = g_EpgContainer.GetTagById(CPVRChannelPtr(), parameterObject["broadcastid"].asUnsignedInteger());
if (!epgTag)
return InvalidParams;
diff --git a/xbmc/interfaces/json-rpc/PVROperations.h b/xbmc/interfaces/json-rpc/PVROperations.h
index 96c262b2f2..12ab532991 100644
--- a/xbmc/interfaces/json-rpc/PVROperations.h
+++ b/xbmc/interfaces/json-rpc/PVROperations.h
@@ -51,7 +51,5 @@ namespace JSONRPC
private:
static JSONRPC_STATUS GetPropertyValue(const std::string &property, CVariant &result);
static void FillChannelGroupDetails(const PVR::CPVRChannelGroupPtr &channelGroup, const CVariant &parameterObject, CVariant &result, bool append = false);
-
- static CFileItemPtr GetBroadcastFromBroadcastid(unsigned int broadcastid);
};
}
diff --git a/xbmc/music/dialogs/GUIDialogMusicOSD.cpp b/xbmc/music/dialogs/GUIDialogMusicOSD.cpp
index 865d29b86f..c8c2b95ca0 100644
--- a/xbmc/music/dialogs/GUIDialogMusicOSD.cpp
+++ b/xbmc/music/dialogs/GUIDialogMusicOSD.cpp
@@ -91,7 +91,7 @@ bool CGUIDialogMusicOSD::OnAction(const CAction &action)
for (int i = 1; i <= 10; i++)
dialog->Add(StringUtils::Format("%s: %i", g_localizeStrings.Get(563).c_str(), i));
- auto track = std::make_shared<CFileItem>(g_application.CurrentFileItem());
+ auto track = g_application.CurrentFileItemPtr();
dialog->SetSelected(track->GetMusicInfoTag()->GetUserrating());
dialog->Open();
diff --git a/xbmc/pictures/GUIWindowPictures.cpp b/xbmc/pictures/GUIWindowPictures.cpp
index 4b5ec502a4..5be32ff4a2 100644
--- a/xbmc/pictures/GUIWindowPictures.cpp
+++ b/xbmc/pictures/GUIWindowPictures.cpp
@@ -203,7 +203,7 @@ void CGUIWindowPictures::OnPrepareFileItems(CFileItemList& items)
if (StringUtils::EqualsNoCase(items[i]->GetLabel(), "folder.jpg"))
items.Remove(i);
- if (items.GetFolderCount() == items.Size())
+ if (items.GetFolderCount()==items.Size() || !CSettings::GetInstance().GetBool(CSettings::SETTING_PICTURES_USETAGS))
return;
// Start the music info loader thread
diff --git a/xbmc/pictures/PictureInfoLoader.cpp b/xbmc/pictures/PictureInfoLoader.cpp
index dd3347277c..05304f9fc4 100644
--- a/xbmc/pictures/PictureInfoLoader.cpp
+++ b/xbmc/pictures/PictureInfoLoader.cpp
@@ -43,6 +43,7 @@ void CPictureInfoLoader::OnLoaderStart()
m_mapFileItems->SetFastLookup(true);
m_tagReads = 0;
+ m_loadTags = CSettings::GetInstance().GetBool(CSettings::SETTING_PICTURES_USETAGS);
if (m_pProgressCallback)
m_pProgressCallback->SetProgressMax(m_pVecItems->GetFileCount());
@@ -87,8 +88,11 @@ bool CPictureInfoLoader::LoadItemLookup(CFileItem* pItem)
if (pItem->HasPictureInfoTag())
return false;
- pItem->GetPictureInfoTag()->Load(pItem->GetPath());
- m_tagReads++;
+ if (m_loadTags)
+ { // Nothing found, load tag from file
+ pItem->GetPictureInfoTag()->Load(pItem->GetPath());
+ m_tagReads++;
+ }
return true;
}
diff --git a/xbmc/pictures/PictureInfoLoader.h b/xbmc/pictures/PictureInfoLoader.h
index 000b54fe1b..2a022ff0ff 100644
--- a/xbmc/pictures/PictureInfoLoader.h
+++ b/xbmc/pictures/PictureInfoLoader.h
@@ -39,5 +39,6 @@ protected:
CFileItemList* m_mapFileItems;
unsigned int m_tagReads;
+ bool m_loadTags;
};
diff --git a/xbmc/pvr/PVRManager.cpp b/xbmc/pvr/PVRManager.cpp
index d88593161a..53f3571dcb 100644
--- a/xbmc/pvr/PVRManager.cpp
+++ b/xbmc/pvr/PVRManager.cpp
@@ -424,6 +424,13 @@ void CPVRManager::Stop(void)
if (IsStopped())
return;
+ /* stop playback if needed */
+ if (IsPlaying())
+ {
+ CLog::Log(LOGNOTICE,"PVRManager - %s - stopping PVR playback", __FUNCTION__);
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP);
+ }
+
SetState(ManagerStateStopping);
m_pendingUpdates.Stop();
@@ -433,13 +440,6 @@ void CPVRManager::Stop(void)
CLog::Log(LOGNOTICE, "PVRManager - stopping");
- /* stop playback if needed */
- if (IsPlaying())
- {
- CLog::Log(LOGNOTICE,"PVRManager - %s - stopping PVR playback", __FUNCTION__);
- CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP);
- }
-
/* stop all update threads */
SetState(ManagerStateInterrupted);
diff --git a/xbmc/pvr/addons/PVRClients.cpp b/xbmc/pvr/addons/PVRClients.cpp
index e68d9fee63..7fea6d32ae 100644
--- a/xbmc/pvr/addons/PVRClients.cpp
+++ b/xbmc/pvr/addons/PVRClients.cpp
@@ -179,9 +179,13 @@ int CPVRClients::GetFirstConnectedClientID(void)
int CPVRClients::EnabledClientAmount(void) const
{
int iReturn(0);
- CSingleLock lock(m_critSection);
+ PVR_CLIENTMAP clientMap;
+ {
+ CSingleLock lock(m_critSection);
+ clientMap = m_clientMap;
+ }
- for (const auto &client : m_clientMap)
+ for (const auto &client : clientMap)
if (!CAddonMgr::GetInstance().IsAddonDisabled(client.second->ID()))
++iReturn;
@@ -190,7 +194,13 @@ int CPVRClients::EnabledClientAmount(void) const
bool CPVRClients::HasEnabledClients(void) const
{
- for (const auto &client : m_clientMap)
+ PVR_CLIENTMAP clientMap;
+ {
+ CSingleLock lock(m_critSection);
+ clientMap = m_clientMap;
+ }
+
+ for (const auto &client : clientMap)
if (!CAddonMgr::GetInstance().IsAddonDisabled(client.second->ID()))
return true;
return false;
@@ -198,8 +208,9 @@ bool CPVRClients::HasEnabledClients(void) const
bool CPVRClients::StopClient(AddonPtr client, bool bRestart)
{
- /* stop playback */
- CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP);
+ /* stop playback if needed */
+ if (IsPlaying())
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP);
CSingleLock lock(m_critSection);
int iId = GetClientId(client);
diff --git a/xbmc/pvr/channels/PVRChannelGroup.cpp b/xbmc/pvr/channels/PVRChannelGroup.cpp
index 3f2fd656a2..f117f54ce2 100644
--- a/xbmc/pvr/channels/PVRChannelGroup.cpp
+++ b/xbmc/pvr/channels/PVRChannelGroup.cpp
@@ -31,6 +31,7 @@
#include "settings/lib/Setting.h"
#include "settings/Settings.h"
#include "threads/SingleLock.h"
+#include "utils/JobManager.h"
#include "utils/log.h"
#include "utils/StringUtils.h"
@@ -265,26 +266,37 @@ bool CPVRChannelGroup::MoveChannel(unsigned int iOldChannelNumber, unsigned int
void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
{
+ // searching and setting channel icons may take some time, and (more important)
+ // it triggers GUI which might lead to deadlocks if directly called.
+ PVR_CHANNEL_GROUP_MEMBERS groupMembers;
+ {
+ CSingleLock lock(m_critSection);
+ groupMembers = m_members;
+ }
+
+ CJobManager::GetInstance().AddJob(new CPVRSearchAndSetChannelIcons(groupMembers, bUpdateDb), nullptr);
+}
+
+bool CPVRSearchAndSetChannelIcons::DoWork()
+{
std::string iconPath = CSettings::GetInstance().GetString(CSettings::SETTING_PVRMENU_ICONPATH);
if (iconPath.empty())
- return;
+ return true;
const CPVRDatabasePtr database(g_PVRManager.GetTVDatabase());
if (!database)
- return;
+ return false;
/* fetch files in icon path for fast lookup */
CFileItemList fileItemList;
XFILE::CDirectory::GetDirectory(iconPath, fileItemList, ".jpg|.png|.tbn");
if (fileItemList.IsEmpty())
- return;
+ return true;
CGUIDialogExtendedProgressBar* dlgProgress = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS);
CGUIDialogProgressBarHandle* dlgProgressHandle = dlgProgress ? dlgProgress->GetHandle(g_localizeStrings.Get(19287)) : NULL;
- CSingleLock lock(m_critSection);
-
/* create a map for fast lookup of normalized file base name */
std::map<std::string, std::string> fileItemMap;
const VECFILEITEMS &items = fileItemList.GetList();
@@ -298,14 +310,14 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
int channelIndex = 0;
CPVRChannelPtr channel;
- for(PVR_CHANNEL_GROUP_MEMBERS::const_iterator it = m_members.begin(); it != m_members.end(); ++it)
+ for(const auto &groupMember : m_groupMembers)
{
- channel = it->second.channel;
+ channel = groupMember.second.channel;
/* update progress dialog */
if (dlgProgressHandle)
{
- dlgProgressHandle->SetProgress(channelIndex++, m_members.size());
+ dlgProgressHandle->SetProgress(channelIndex++, m_groupMembers.size());
dlgProgressHandle->SetText(channel->ChannelName());
}
@@ -330,7 +342,7 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
channel->SetIconPath(itItem->second, g_advancedSettings.m_bPVRAutoScanIconsUserSet);
}
- if (bUpdateDb)
+ if (m_bUpdateDb)
channel->Persist();
//! @todo start channel icon scraper here if nothing was found
@@ -338,6 +350,8 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
if (dlgProgressHandle)
dlgProgressHandle->MarkFinished();
+
+ return true;
}
/********** sort methods **********/
diff --git a/xbmc/pvr/channels/PVRChannelGroup.h b/xbmc/pvr/channels/PVRChannelGroup.h
index dd2ede596a..90b9ef5291 100644
--- a/xbmc/pvr/channels/PVRChannelGroup.h
+++ b/xbmc/pvr/channels/PVRChannelGroup.h
@@ -546,4 +546,18 @@ namespace PVR
private:
CPVRChannelGroupPtr m_group;
};
+
+ class CPVRSearchAndSetChannelIcons : public CJob
+ {
+ public:
+ CPVRSearchAndSetChannelIcons(const PVR_CHANNEL_GROUP_MEMBERS &groupMembers, bool bUpdateDb)
+ : m_groupMembers(groupMembers), m_bUpdateDb(bUpdateDb) {}
+ virtual ~CPVRSearchAndSetChannelIcons() {}
+ virtual const char *GetType() const { return "pvr-channelgroup-searchandsetchannelicons"; }
+
+ virtual bool DoWork();
+ private:
+ PVR_CHANNEL_GROUP_MEMBERS m_groupMembers;
+ const bool m_bUpdateDb;
+ };
}
diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp
index 9940b6aac8..6e13ba61b9 100644
--- a/xbmc/settings/Settings.cpp
+++ b/xbmc/settings/Settings.cpp
@@ -296,6 +296,7 @@ const std::string CSettings::SETTING_AUDIOCDS_SETTINGS = "audiocds.settings";
const std::string CSettings::SETTING_AUDIOCDS_EJECTONRIP = "audiocds.ejectonrip";
const std::string CSettings::SETTING_MYMUSIC_SONGTHUMBINVIS = "mymusic.songthumbinvis";
const std::string CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW = "mymusic.defaultlibview";
+const std::string CSettings::SETTING_PICTURES_USETAGS = "pictures.usetags";
const std::string CSettings::SETTING_PICTURES_GENERATETHUMBS = "pictures.generatethumbs";
const std::string CSettings::SETTING_PICTURES_SHOWVIDEOS = "pictures.showvideos";
const std::string CSettings::SETTING_PICTURES_DISPLAYRESOLUTION = "pictures.displayresolution";
diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h
index 482f61db8a..269a3a7413 100644
--- a/xbmc/settings/Settings.h
+++ b/xbmc/settings/Settings.h
@@ -253,6 +253,7 @@ public:
static const std::string SETTING_AUDIOCDS_EJECTONRIP;
static const std::string SETTING_MYMUSIC_SONGTHUMBINVIS;
static const std::string SETTING_MYMUSIC_DEFAULTLIBVIEW;
+ static const std::string SETTING_PICTURES_USETAGS;
static const std::string SETTING_PICTURES_GENERATETHUMBS;
static const std::string SETTING_PICTURES_SHOWVIDEOS;
static const std::string SETTING_PICTURES_DISPLAYRESOLUTION;
diff --git a/xbmc/utils/StringUtils.cpp b/xbmc/utils/StringUtils.cpp
index d30fbf2530..1ba64076d5 100644
--- a/xbmc/utils/StringUtils.cpp
+++ b/xbmc/utils/StringUtils.cpp
@@ -944,6 +944,8 @@ long StringUtils::TimeStringToSeconds(const std::string &timeString)
std::string StringUtils::SecondsToTimeString(long lSeconds, TIME_FORMAT format)
{
+ bool isNegative = lSeconds < 0;
+ lSeconds = abs(lSeconds);
int hh = lSeconds / 3600;
lSeconds = lSeconds % 3600;
int mm = lSeconds / 60;
@@ -960,6 +962,8 @@ std::string StringUtils::SecondsToTimeString(long lSeconds, TIME_FORMAT format)
strHMS += StringUtils::Format(strHMS.empty() ? "%2.2i" : ":%2.2i", mm);
if (format & TIME_FORMAT_SS)
strHMS += StringUtils::Format(strHMS.empty() ? "%2.2i" : ":%2.2i", ss);
+ if (isNegative)
+ strHMS = "-" + strHMS;
return strHMS;
}
diff --git a/xbmc/windows/GUIWindowLoginScreen.cpp b/xbmc/windows/GUIWindowLoginScreen.cpp
index 5efb4b2052..63fb648c49 100644
--- a/xbmc/windows/GUIWindowLoginScreen.cpp
+++ b/xbmc/windows/GUIWindowLoginScreen.cpp
@@ -272,6 +272,8 @@ CFileItemPtr CGUIWindowLoginScreen::GetCurrentListItem(int offset)
void CGUIWindowLoginScreen::LoadProfile(unsigned int profile)
{
+ CServiceBroker::GetContextMenuManager().Deinit();
+
// stop service addons and give it some time before we start it again
ADDON::CAddonMgr::GetInstance().StopServices(true);
@@ -322,6 +324,9 @@ void CGUIWindowLoginScreen::LoadProfile(unsigned int profile)
JSONRPC::CJSONRPC::Initialize();
#endif
+ // Restart context menu manager
+ CServiceBroker::GetContextMenuManager().Init();
+
// restart PVR services
CServiceBroker::GetPVRManager().Reinit();