diff options
290 files changed, 6489 insertions, 2815 deletions
diff --git a/Kodi.xcodeproj/project.pbxproj b/Kodi.xcodeproj/project.pbxproj index f1f84a173b..c1e05cbb51 100644 --- a/Kodi.xcodeproj/project.pbxproj +++ b/Kodi.xcodeproj/project.pbxproj @@ -182,12 +182,33 @@ 3802709A13D5A653009493DD /* SystemClock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3802709813D5A653009493DD /* SystemClock.cpp */; }; 384718D81325BA04000486D6 /* XBDateTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 384718D61325BA04000486D6 /* XBDateTime.cpp */; }; 38F4E57013CCCB3B00664821 /* Implementation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38F4E56C13CCCB3B00664821 /* Implementation.cpp */; }; - 395F6DE21A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */; }; - 395F6DE31A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */; }; - 395F6DE41A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */; }; 395F6DDD1A8133360088CC74 /* GUIDialogSimpleMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DDB1A8133360088CC74 /* GUIDialogSimpleMenu.cpp */; }; 395F6DDE1A8133360088CC74 /* GUIDialogSimpleMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DDB1A8133360088CC74 /* GUIDialogSimpleMenu.cpp */; }; 395F6DDF1A8133360088CC74 /* GUIDialogSimpleMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DDB1A8133360088CC74 /* GUIDialogSimpleMenu.cpp */; }; + 395F6DE21A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */; }; + 395F6DE31A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */; }; + 395F6DE41A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */; }; + 3994425B1A8DD8D0006C39E9 /* ProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442591A8DD8D0006C39E9 /* ProgressJob.cpp */; }; + 3994425C1A8DD8D0006C39E9 /* ProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442591A8DD8D0006C39E9 /* ProgressJob.cpp */; }; + 3994425D1A8DD8D0006C39E9 /* ProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442591A8DD8D0006C39E9 /* ProgressJob.cpp */; }; + 3994426E1A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442611A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp */; }; + 3994426F1A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442611A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp */; }; + 399442701A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442611A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp */; }; + 399442711A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442631A8DD920006C39E9 /* VideoLibraryJob.cpp */; }; + 399442721A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442631A8DD920006C39E9 /* VideoLibraryJob.cpp */; }; + 399442731A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442631A8DD920006C39E9 /* VideoLibraryJob.cpp */; }; + 399442741A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442651A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp */; }; + 399442751A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442651A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp */; }; + 399442761A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442651A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp */; }; + 399442771A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442671A8DD920006C39E9 /* VideoLibraryProgressJob.cpp */; }; + 399442781A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442671A8DD920006C39E9 /* VideoLibraryProgressJob.cpp */; }; + 399442791A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442671A8DD920006C39E9 /* VideoLibraryProgressJob.cpp */; }; + 3994427A1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442691A8DD920006C39E9 /* VideoLibraryScanningJob.cpp */; }; + 3994427B1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442691A8DD920006C39E9 /* VideoLibraryScanningJob.cpp */; }; + 3994427C1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 399442691A8DD920006C39E9 /* VideoLibraryScanningJob.cpp */; }; + 3994427F1A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3994427D1A8DD96F006C39E9 /* VideoLibraryQueue.cpp */; }; + 399442801A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3994427D1A8DD96F006C39E9 /* VideoLibraryQueue.cpp */; }; + 399442811A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3994427D1A8DD96F006C39E9 /* VideoLibraryQueue.cpp */; }; 42DAC16E1A6E789E0066B4C8 /* PVRActionListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 42DAC16C1A6E789E0066B4C8 /* PVRActionListener.cpp */; }; 42DAC16F1A6E789E0066B4C8 /* PVRActionListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 42DAC16C1A6E789E0066B4C8 /* PVRActionListener.cpp */; }; 42DAC1701A6E789E0066B4C8 /* PVRActionListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 42DAC16C1A6E789E0066B4C8 /* PVRActionListener.cpp */; }; @@ -199,7 +220,6 @@ 43348AA4107747CD00F859CF /* Edl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43348AA1107747CD00F859CF /* Edl.cpp */; }; 43348AAE1077486D00F859CF /* PlayerCoreFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43348AA81077486D00F859CF /* PlayerCoreFactory.cpp */; }; 43348AAF1077486D00F859CF /* PlayerSelectionRule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43348AAA1077486D00F859CF /* PlayerSelectionRule.cpp */; }; - 43352CEE1071634600706B8A /* libsquish.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 43352CED1071634600706B8A /* libsquish.a */; }; 551C3A45175A12010051AAAD /* VDA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 551C3A43175A12010051AAAD /* VDA.cpp */; }; 552840CC1626163B00ED1333 /* UPnPPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 552840CA1626163B00ED1333 /* UPnPPlayer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP -I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 552A226915F7E14B0015C0D0 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 552A226815F7E14B0015C0D0 /* main.cpp */; }; @@ -406,8 +426,6 @@ 7CCDA1AA192753E30074CF51 /* PltXbox360.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCB192753E30074CF51 /* PltXbox360.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1AB192753E30074CF51 /* PltXbox360.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCB192753E30074CF51 /* PltXbox360.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1AC192753E30074CF51 /* PltXbox360.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCB192753E30074CF51 /* PltXbox360.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; - 7CCDA1AD192753E30074CF51 /* process_scpds.sh in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCD192753E30074CF51 /* process_scpds.sh */; }; - 7CCDA1AE192753E30074CF51 /* process_scpds.sh in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCD192753E30074CF51 /* process_scpds.sh */; }; 7CCDA1AF192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCE192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1B0192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCE192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp */; }; 7CCDA1B1192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FCE192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.cpp */; }; @@ -426,8 +444,6 @@ 7CCDA1D0192753E30074CF51 /* PltMediaRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FDC192753E30074CF51 /* PltMediaRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1D1192753E30074CF51 /* PltMediaRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FDC192753E30074CF51 /* PltMediaRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1D2192753E30074CF51 /* PltMediaRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FDC192753E30074CF51 /* PltMediaRenderer.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; - 7CCDA1D9192753E30074CF51 /* process_scpds.sh in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE0192753E30074CF51 /* process_scpds.sh */; }; - 7CCDA1DA192753E30074CF51 /* process_scpds.sh in Resources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE0192753E30074CF51 /* process_scpds.sh */; }; 7CCDA1DB192753E30074CF51 /* RdrConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE1192753E30074CF51 /* RdrConnectionManagerSCPD.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA1DC192753E30074CF51 /* RdrConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE1192753E30074CF51 /* RdrConnectionManagerSCPD.cpp */; }; 7CCDA1DD192753E30074CF51 /* RdrConnectionManagerSCPD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCD9FE1192753E30074CF51 /* RdrConnectionManagerSCPD.cpp */; }; @@ -476,8 +492,6 @@ 7CCDA24A192753E30074CF51 /* PltSyncMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA00F192753E30074CF51 /* PltSyncMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA24B192753E30074CF51 /* PltSyncMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA00F192753E30074CF51 /* PltSyncMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; 7CCDA24C192753E30074CF51 /* PltSyncMediaBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA00F192753E30074CF51 /* PltSyncMediaBrowser.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Core -I$SRCROOT/lib/libUPnP/Platinum/Source/Platinum -I$SRCROOT/lib/libUPnP/Platinum/Source/Extras -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaServer -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaConnect -I$SRCROOT/lib/libUPnP/Platinum/Source/Devices/MediaRenderer"; }; }; - 7CCDA253192753E30074CF51 /* process_scpds.sh in Resources */ = {isa = PBXBuildFile; fileRef = 7CCDA013192753E30074CF51 /* process_scpds.sh */; }; - 7CCDA254192753E30074CF51 /* process_scpds.sh in Resources */ = {isa = PBXBuildFile; fileRef = 7CCDA013192753E30074CF51 /* process_scpds.sh */; }; 7CCDA756192756250074CF51 /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = 7CCDA414192756240074CF51 /* README.txt */; }; 7CCDA757192756250074CF51 /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = 7CCDA414192756240074CF51 /* README.txt */; }; 7CCDA758192756250074CF51 /* SConstruct in Resources */ = {isa = PBXBuildFile; fileRef = 7CCDA415192756240074CF51 /* SConstruct */; }; @@ -584,459 +598,6 @@ 7CCDA86C192756250074CF51 /* NptZip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B0192756240074CF51 /* NptZip.cpp */; }; 7CCDA86D192756250074CF51 /* NptZip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B0192756240074CF51 /* NptZip.cpp */; }; 7CCDA86E192756250074CF51 /* NptZip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B0192756240074CF51 /* NptZip.cpp */; }; - 7CCDA86F192756250074CF51 /* NptTlsTrustAnchor_Base_0000.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B5192756240074CF51 /* NptTlsTrustAnchor_Base_0000.cpp */; }; - 7CCDA870192756250074CF51 /* NptTlsTrustAnchor_Base_0000.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B5192756240074CF51 /* NptTlsTrustAnchor_Base_0000.cpp */; }; - 7CCDA871192756250074CF51 /* NptTlsTrustAnchor_Base_0000.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B5192756240074CF51 /* NptTlsTrustAnchor_Base_0000.cpp */; }; - 7CCDA872192756250074CF51 /* NptTlsTrustAnchor_Base_0001.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B6192756240074CF51 /* NptTlsTrustAnchor_Base_0001.cpp */; }; - 7CCDA873192756250074CF51 /* NptTlsTrustAnchor_Base_0001.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B6192756240074CF51 /* NptTlsTrustAnchor_Base_0001.cpp */; }; - 7CCDA874192756250074CF51 /* NptTlsTrustAnchor_Base_0001.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B6192756240074CF51 /* NptTlsTrustAnchor_Base_0001.cpp */; }; - 7CCDA875192756250074CF51 /* NptTlsTrustAnchor_Base_0002.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B7192756240074CF51 /* NptTlsTrustAnchor_Base_0002.cpp */; }; - 7CCDA876192756250074CF51 /* NptTlsTrustAnchor_Base_0002.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B7192756240074CF51 /* NptTlsTrustAnchor_Base_0002.cpp */; }; - 7CCDA877192756250074CF51 /* NptTlsTrustAnchor_Base_0002.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B7192756240074CF51 /* NptTlsTrustAnchor_Base_0002.cpp */; }; - 7CCDA878192756250074CF51 /* NptTlsTrustAnchor_Base_0003.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B8192756240074CF51 /* NptTlsTrustAnchor_Base_0003.cpp */; }; - 7CCDA879192756250074CF51 /* NptTlsTrustAnchor_Base_0003.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B8192756240074CF51 /* NptTlsTrustAnchor_Base_0003.cpp */; }; - 7CCDA87A192756250074CF51 /* NptTlsTrustAnchor_Base_0003.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B8192756240074CF51 /* NptTlsTrustAnchor_Base_0003.cpp */; }; - 7CCDA87B192756250074CF51 /* NptTlsTrustAnchor_Base_0004.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B9192756240074CF51 /* NptTlsTrustAnchor_Base_0004.cpp */; }; - 7CCDA87C192756250074CF51 /* NptTlsTrustAnchor_Base_0004.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B9192756240074CF51 /* NptTlsTrustAnchor_Base_0004.cpp */; }; - 7CCDA87D192756250074CF51 /* NptTlsTrustAnchor_Base_0004.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4B9192756240074CF51 /* NptTlsTrustAnchor_Base_0004.cpp */; }; - 7CCDA87E192756250074CF51 /* NptTlsTrustAnchor_Base_0005.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BA192756240074CF51 /* NptTlsTrustAnchor_Base_0005.cpp */; }; - 7CCDA87F192756250074CF51 /* NptTlsTrustAnchor_Base_0005.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BA192756240074CF51 /* NptTlsTrustAnchor_Base_0005.cpp */; }; - 7CCDA880192756250074CF51 /* NptTlsTrustAnchor_Base_0005.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BA192756240074CF51 /* NptTlsTrustAnchor_Base_0005.cpp */; }; - 7CCDA881192756250074CF51 /* NptTlsTrustAnchor_Base_0006.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BB192756240074CF51 /* NptTlsTrustAnchor_Base_0006.cpp */; }; - 7CCDA882192756250074CF51 /* NptTlsTrustAnchor_Base_0006.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BB192756240074CF51 /* NptTlsTrustAnchor_Base_0006.cpp */; }; - 7CCDA883192756250074CF51 /* NptTlsTrustAnchor_Base_0006.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BB192756240074CF51 /* NptTlsTrustAnchor_Base_0006.cpp */; }; - 7CCDA884192756250074CF51 /* NptTlsTrustAnchor_Base_0007.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BC192756240074CF51 /* NptTlsTrustAnchor_Base_0007.cpp */; }; - 7CCDA885192756250074CF51 /* NptTlsTrustAnchor_Base_0007.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BC192756240074CF51 /* NptTlsTrustAnchor_Base_0007.cpp */; }; - 7CCDA886192756250074CF51 /* NptTlsTrustAnchor_Base_0007.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BC192756240074CF51 /* NptTlsTrustAnchor_Base_0007.cpp */; }; - 7CCDA887192756250074CF51 /* NptTlsTrustAnchor_Base_0008.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BD192756240074CF51 /* NptTlsTrustAnchor_Base_0008.cpp */; }; - 7CCDA888192756250074CF51 /* NptTlsTrustAnchor_Base_0008.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BD192756240074CF51 /* NptTlsTrustAnchor_Base_0008.cpp */; }; - 7CCDA889192756250074CF51 /* NptTlsTrustAnchor_Base_0008.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BD192756240074CF51 /* NptTlsTrustAnchor_Base_0008.cpp */; }; - 7CCDA88A192756250074CF51 /* NptTlsTrustAnchor_Base_0009.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BE192756240074CF51 /* NptTlsTrustAnchor_Base_0009.cpp */; }; - 7CCDA88B192756250074CF51 /* NptTlsTrustAnchor_Base_0009.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BE192756240074CF51 /* NptTlsTrustAnchor_Base_0009.cpp */; }; - 7CCDA88C192756250074CF51 /* NptTlsTrustAnchor_Base_0009.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BE192756240074CF51 /* NptTlsTrustAnchor_Base_0009.cpp */; }; - 7CCDA88D192756250074CF51 /* NptTlsTrustAnchor_Base_0010.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BF192756240074CF51 /* NptTlsTrustAnchor_Base_0010.cpp */; }; - 7CCDA88E192756250074CF51 /* NptTlsTrustAnchor_Base_0010.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BF192756240074CF51 /* NptTlsTrustAnchor_Base_0010.cpp */; }; - 7CCDA88F192756250074CF51 /* NptTlsTrustAnchor_Base_0010.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4BF192756240074CF51 /* NptTlsTrustAnchor_Base_0010.cpp */; }; - 7CCDA890192756250074CF51 /* NptTlsTrustAnchor_Base_0011.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C0192756240074CF51 /* NptTlsTrustAnchor_Base_0011.cpp */; }; - 7CCDA891192756250074CF51 /* NptTlsTrustAnchor_Base_0011.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C0192756240074CF51 /* NptTlsTrustAnchor_Base_0011.cpp */; }; - 7CCDA892192756250074CF51 /* NptTlsTrustAnchor_Base_0011.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C0192756240074CF51 /* NptTlsTrustAnchor_Base_0011.cpp */; }; - 7CCDA893192756250074CF51 /* NptTlsTrustAnchor_Base_0012.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C1192756240074CF51 /* NptTlsTrustAnchor_Base_0012.cpp */; }; - 7CCDA894192756250074CF51 /* NptTlsTrustAnchor_Base_0012.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C1192756240074CF51 /* NptTlsTrustAnchor_Base_0012.cpp */; }; - 7CCDA895192756250074CF51 /* NptTlsTrustAnchor_Base_0012.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C1192756240074CF51 /* NptTlsTrustAnchor_Base_0012.cpp */; }; - 7CCDA896192756250074CF51 /* NptTlsTrustAnchor_Base_0013.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C2192756240074CF51 /* NptTlsTrustAnchor_Base_0013.cpp */; }; - 7CCDA897192756250074CF51 /* NptTlsTrustAnchor_Base_0013.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C2192756240074CF51 /* NptTlsTrustAnchor_Base_0013.cpp */; }; - 7CCDA898192756250074CF51 /* NptTlsTrustAnchor_Base_0013.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C2192756240074CF51 /* NptTlsTrustAnchor_Base_0013.cpp */; }; - 7CCDA899192756250074CF51 /* NptTlsTrustAnchor_Base_0014.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C3192756240074CF51 /* NptTlsTrustAnchor_Base_0014.cpp */; }; - 7CCDA89A192756250074CF51 /* NptTlsTrustAnchor_Base_0014.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C3192756240074CF51 /* NptTlsTrustAnchor_Base_0014.cpp */; }; - 7CCDA89B192756250074CF51 /* NptTlsTrustAnchor_Base_0014.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C3192756240074CF51 /* NptTlsTrustAnchor_Base_0014.cpp */; }; - 7CCDA89C192756250074CF51 /* NptTlsTrustAnchor_Base_0015.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C4192756240074CF51 /* NptTlsTrustAnchor_Base_0015.cpp */; }; - 7CCDA89D192756250074CF51 /* NptTlsTrustAnchor_Base_0015.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C4192756240074CF51 /* NptTlsTrustAnchor_Base_0015.cpp */; }; - 7CCDA89E192756250074CF51 /* NptTlsTrustAnchor_Base_0015.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C4192756240074CF51 /* NptTlsTrustAnchor_Base_0015.cpp */; }; - 7CCDA89F192756250074CF51 /* NptTlsTrustAnchor_Base_0016.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C5192756240074CF51 /* NptTlsTrustAnchor_Base_0016.cpp */; }; - 7CCDA8A0192756250074CF51 /* NptTlsTrustAnchor_Base_0016.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C5192756240074CF51 /* NptTlsTrustAnchor_Base_0016.cpp */; }; - 7CCDA8A1192756250074CF51 /* NptTlsTrustAnchor_Base_0016.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C5192756240074CF51 /* NptTlsTrustAnchor_Base_0016.cpp */; }; - 7CCDA8A2192756250074CF51 /* NptTlsTrustAnchor_Base_0017.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C6192756240074CF51 /* NptTlsTrustAnchor_Base_0017.cpp */; }; - 7CCDA8A3192756250074CF51 /* NptTlsTrustAnchor_Base_0017.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C6192756240074CF51 /* NptTlsTrustAnchor_Base_0017.cpp */; }; - 7CCDA8A4192756250074CF51 /* NptTlsTrustAnchor_Base_0017.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C6192756240074CF51 /* NptTlsTrustAnchor_Base_0017.cpp */; }; - 7CCDA8A5192756250074CF51 /* NptTlsTrustAnchor_Base_0018.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C7192756240074CF51 /* NptTlsTrustAnchor_Base_0018.cpp */; }; - 7CCDA8A6192756250074CF51 /* NptTlsTrustAnchor_Base_0018.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C7192756240074CF51 /* NptTlsTrustAnchor_Base_0018.cpp */; }; - 7CCDA8A7192756250074CF51 /* NptTlsTrustAnchor_Base_0018.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C7192756240074CF51 /* NptTlsTrustAnchor_Base_0018.cpp */; }; - 7CCDA8A8192756250074CF51 /* NptTlsTrustAnchor_Base_0019.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C8192756240074CF51 /* NptTlsTrustAnchor_Base_0019.cpp */; }; - 7CCDA8A9192756250074CF51 /* NptTlsTrustAnchor_Base_0019.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C8192756240074CF51 /* NptTlsTrustAnchor_Base_0019.cpp */; }; - 7CCDA8AA192756250074CF51 /* NptTlsTrustAnchor_Base_0019.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C8192756240074CF51 /* NptTlsTrustAnchor_Base_0019.cpp */; }; - 7CCDA8AB192756250074CF51 /* NptTlsTrustAnchor_Base_0020.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C9192756240074CF51 /* NptTlsTrustAnchor_Base_0020.cpp */; }; - 7CCDA8AC192756250074CF51 /* NptTlsTrustAnchor_Base_0020.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C9192756240074CF51 /* NptTlsTrustAnchor_Base_0020.cpp */; }; - 7CCDA8AD192756250074CF51 /* NptTlsTrustAnchor_Base_0020.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4C9192756240074CF51 /* NptTlsTrustAnchor_Base_0020.cpp */; }; - 7CCDA8AE192756250074CF51 /* NptTlsTrustAnchor_Base_0021.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CA192756240074CF51 /* NptTlsTrustAnchor_Base_0021.cpp */; }; - 7CCDA8AF192756250074CF51 /* NptTlsTrustAnchor_Base_0021.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CA192756240074CF51 /* NptTlsTrustAnchor_Base_0021.cpp */; }; - 7CCDA8B0192756250074CF51 /* NptTlsTrustAnchor_Base_0021.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CA192756240074CF51 /* NptTlsTrustAnchor_Base_0021.cpp */; }; - 7CCDA8B1192756250074CF51 /* NptTlsTrustAnchor_Base_0022.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CB192756240074CF51 /* NptTlsTrustAnchor_Base_0022.cpp */; }; - 7CCDA8B2192756250074CF51 /* NptTlsTrustAnchor_Base_0022.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CB192756240074CF51 /* NptTlsTrustAnchor_Base_0022.cpp */; }; - 7CCDA8B3192756250074CF51 /* NptTlsTrustAnchor_Base_0022.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CB192756240074CF51 /* NptTlsTrustAnchor_Base_0022.cpp */; }; - 7CCDA8B4192756250074CF51 /* NptTlsTrustAnchor_Base_0023.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CC192756240074CF51 /* NptTlsTrustAnchor_Base_0023.cpp */; }; - 7CCDA8B5192756250074CF51 /* NptTlsTrustAnchor_Base_0023.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CC192756240074CF51 /* NptTlsTrustAnchor_Base_0023.cpp */; }; - 7CCDA8B6192756250074CF51 /* NptTlsTrustAnchor_Base_0023.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CC192756240074CF51 /* NptTlsTrustAnchor_Base_0023.cpp */; }; - 7CCDA8B7192756250074CF51 /* NptTlsTrustAnchor_Base_0024.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CD192756240074CF51 /* NptTlsTrustAnchor_Base_0024.cpp */; }; - 7CCDA8B8192756250074CF51 /* NptTlsTrustAnchor_Base_0024.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CD192756240074CF51 /* NptTlsTrustAnchor_Base_0024.cpp */; }; - 7CCDA8B9192756250074CF51 /* NptTlsTrustAnchor_Base_0024.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CD192756240074CF51 /* NptTlsTrustAnchor_Base_0024.cpp */; }; - 7CCDA8BA192756250074CF51 /* NptTlsTrustAnchor_Base_0025.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CE192756240074CF51 /* NptTlsTrustAnchor_Base_0025.cpp */; }; - 7CCDA8BB192756250074CF51 /* NptTlsTrustAnchor_Base_0025.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CE192756240074CF51 /* NptTlsTrustAnchor_Base_0025.cpp */; }; - 7CCDA8BC192756250074CF51 /* NptTlsTrustAnchor_Base_0025.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CE192756240074CF51 /* NptTlsTrustAnchor_Base_0025.cpp */; }; - 7CCDA8BD192756250074CF51 /* NptTlsTrustAnchor_Base_0026.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CF192756240074CF51 /* NptTlsTrustAnchor_Base_0026.cpp */; }; - 7CCDA8BE192756250074CF51 /* NptTlsTrustAnchor_Base_0026.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CF192756240074CF51 /* NptTlsTrustAnchor_Base_0026.cpp */; }; - 7CCDA8BF192756250074CF51 /* NptTlsTrustAnchor_Base_0026.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4CF192756240074CF51 /* NptTlsTrustAnchor_Base_0026.cpp */; }; - 7CCDA8C0192756250074CF51 /* NptTlsTrustAnchor_Base_0027.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D0192756240074CF51 /* NptTlsTrustAnchor_Base_0027.cpp */; }; - 7CCDA8C1192756250074CF51 /* NptTlsTrustAnchor_Base_0027.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D0192756240074CF51 /* NptTlsTrustAnchor_Base_0027.cpp */; }; - 7CCDA8C2192756250074CF51 /* NptTlsTrustAnchor_Base_0027.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D0192756240074CF51 /* NptTlsTrustAnchor_Base_0027.cpp */; }; - 7CCDA8C3192756250074CF51 /* NptTlsTrustAnchor_Base_0028.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D1192756240074CF51 /* NptTlsTrustAnchor_Base_0028.cpp */; }; - 7CCDA8C4192756250074CF51 /* NptTlsTrustAnchor_Base_0028.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D1192756240074CF51 /* NptTlsTrustAnchor_Base_0028.cpp */; }; - 7CCDA8C5192756250074CF51 /* NptTlsTrustAnchor_Base_0028.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D1192756240074CF51 /* NptTlsTrustAnchor_Base_0028.cpp */; }; - 7CCDA8C6192756250074CF51 /* NptTlsTrustAnchor_Base_0029.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D2192756240074CF51 /* NptTlsTrustAnchor_Base_0029.cpp */; }; - 7CCDA8C7192756250074CF51 /* NptTlsTrustAnchor_Base_0029.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D2192756240074CF51 /* NptTlsTrustAnchor_Base_0029.cpp */; }; - 7CCDA8C8192756250074CF51 /* NptTlsTrustAnchor_Base_0029.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D2192756240074CF51 /* NptTlsTrustAnchor_Base_0029.cpp */; }; - 7CCDA8C9192756250074CF51 /* NptTlsTrustAnchor_Base_0030.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D3192756240074CF51 /* NptTlsTrustAnchor_Base_0030.cpp */; }; - 7CCDA8CA192756250074CF51 /* NptTlsTrustAnchor_Base_0030.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D3192756240074CF51 /* NptTlsTrustAnchor_Base_0030.cpp */; }; - 7CCDA8CB192756250074CF51 /* NptTlsTrustAnchor_Base_0030.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D3192756240074CF51 /* NptTlsTrustAnchor_Base_0030.cpp */; }; - 7CCDA8CC192756250074CF51 /* NptTlsTrustAnchor_Base_0031.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D4192756240074CF51 /* NptTlsTrustAnchor_Base_0031.cpp */; }; - 7CCDA8CD192756250074CF51 /* NptTlsTrustAnchor_Base_0031.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D4192756240074CF51 /* NptTlsTrustAnchor_Base_0031.cpp */; }; - 7CCDA8CE192756250074CF51 /* NptTlsTrustAnchor_Base_0031.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D4192756240074CF51 /* NptTlsTrustAnchor_Base_0031.cpp */; }; - 7CCDA8CF192756250074CF51 /* NptTlsTrustAnchor_Base_0032.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D5192756240074CF51 /* NptTlsTrustAnchor_Base_0032.cpp */; }; - 7CCDA8D0192756250074CF51 /* NptTlsTrustAnchor_Base_0032.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D5192756240074CF51 /* NptTlsTrustAnchor_Base_0032.cpp */; }; - 7CCDA8D1192756250074CF51 /* NptTlsTrustAnchor_Base_0032.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D5192756240074CF51 /* NptTlsTrustAnchor_Base_0032.cpp */; }; - 7CCDA8D2192756250074CF51 /* NptTlsTrustAnchor_Base_0033.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D6192756240074CF51 /* NptTlsTrustAnchor_Base_0033.cpp */; }; - 7CCDA8D3192756250074CF51 /* NptTlsTrustAnchor_Base_0033.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D6192756240074CF51 /* NptTlsTrustAnchor_Base_0033.cpp */; }; - 7CCDA8D4192756250074CF51 /* NptTlsTrustAnchor_Base_0033.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D6192756240074CF51 /* NptTlsTrustAnchor_Base_0033.cpp */; }; - 7CCDA8D5192756250074CF51 /* NptTlsTrustAnchor_Base_0034.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D7192756240074CF51 /* NptTlsTrustAnchor_Base_0034.cpp */; }; - 7CCDA8D6192756250074CF51 /* NptTlsTrustAnchor_Base_0034.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D7192756240074CF51 /* NptTlsTrustAnchor_Base_0034.cpp */; }; - 7CCDA8D7192756250074CF51 /* NptTlsTrustAnchor_Base_0034.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D7192756240074CF51 /* NptTlsTrustAnchor_Base_0034.cpp */; }; - 7CCDA8D8192756250074CF51 /* NptTlsTrustAnchor_Base_0035.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D8192756240074CF51 /* NptTlsTrustAnchor_Base_0035.cpp */; }; - 7CCDA8D9192756250074CF51 /* NptTlsTrustAnchor_Base_0035.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D8192756240074CF51 /* NptTlsTrustAnchor_Base_0035.cpp */; }; - 7CCDA8DA192756250074CF51 /* NptTlsTrustAnchor_Base_0035.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D8192756240074CF51 /* NptTlsTrustAnchor_Base_0035.cpp */; }; - 7CCDA8DB192756250074CF51 /* NptTlsTrustAnchor_Base_0036.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D9192756240074CF51 /* NptTlsTrustAnchor_Base_0036.cpp */; }; - 7CCDA8DC192756250074CF51 /* NptTlsTrustAnchor_Base_0036.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D9192756240074CF51 /* NptTlsTrustAnchor_Base_0036.cpp */; }; - 7CCDA8DD192756250074CF51 /* NptTlsTrustAnchor_Base_0036.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4D9192756240074CF51 /* NptTlsTrustAnchor_Base_0036.cpp */; }; - 7CCDA8DE192756250074CF51 /* NptTlsTrustAnchor_Base_0037.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DA192756240074CF51 /* NptTlsTrustAnchor_Base_0037.cpp */; }; - 7CCDA8DF192756250074CF51 /* NptTlsTrustAnchor_Base_0037.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DA192756240074CF51 /* NptTlsTrustAnchor_Base_0037.cpp */; }; - 7CCDA8E0192756250074CF51 /* NptTlsTrustAnchor_Base_0037.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DA192756240074CF51 /* NptTlsTrustAnchor_Base_0037.cpp */; }; - 7CCDA8E1192756250074CF51 /* NptTlsTrustAnchor_Base_0038.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DB192756240074CF51 /* NptTlsTrustAnchor_Base_0038.cpp */; }; - 7CCDA8E2192756250074CF51 /* NptTlsTrustAnchor_Base_0038.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DB192756240074CF51 /* NptTlsTrustAnchor_Base_0038.cpp */; }; - 7CCDA8E3192756250074CF51 /* NptTlsTrustAnchor_Base_0038.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DB192756240074CF51 /* NptTlsTrustAnchor_Base_0038.cpp */; }; - 7CCDA8E4192756250074CF51 /* NptTlsTrustAnchor_Base_0039.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DC192756240074CF51 /* NptTlsTrustAnchor_Base_0039.cpp */; }; - 7CCDA8E5192756250074CF51 /* NptTlsTrustAnchor_Base_0039.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DC192756240074CF51 /* NptTlsTrustAnchor_Base_0039.cpp */; }; - 7CCDA8E6192756250074CF51 /* NptTlsTrustAnchor_Base_0039.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DC192756240074CF51 /* NptTlsTrustAnchor_Base_0039.cpp */; }; - 7CCDA8E7192756250074CF51 /* NptTlsTrustAnchor_Base_0040.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DD192756240074CF51 /* NptTlsTrustAnchor_Base_0040.cpp */; }; - 7CCDA8E8192756250074CF51 /* NptTlsTrustAnchor_Base_0040.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DD192756240074CF51 /* NptTlsTrustAnchor_Base_0040.cpp */; }; - 7CCDA8E9192756250074CF51 /* NptTlsTrustAnchor_Base_0040.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DD192756240074CF51 /* NptTlsTrustAnchor_Base_0040.cpp */; }; - 7CCDA8EA192756250074CF51 /* NptTlsTrustAnchor_Base_0041.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DE192756240074CF51 /* NptTlsTrustAnchor_Base_0041.cpp */; }; - 7CCDA8EB192756250074CF51 /* NptTlsTrustAnchor_Base_0041.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DE192756240074CF51 /* NptTlsTrustAnchor_Base_0041.cpp */; }; - 7CCDA8EC192756250074CF51 /* NptTlsTrustAnchor_Base_0041.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DE192756240074CF51 /* NptTlsTrustAnchor_Base_0041.cpp */; }; - 7CCDA8ED192756250074CF51 /* NptTlsTrustAnchor_Base_0042.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DF192756240074CF51 /* NptTlsTrustAnchor_Base_0042.cpp */; }; - 7CCDA8EE192756250074CF51 /* NptTlsTrustAnchor_Base_0042.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DF192756240074CF51 /* NptTlsTrustAnchor_Base_0042.cpp */; }; - 7CCDA8EF192756250074CF51 /* NptTlsTrustAnchor_Base_0042.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4DF192756240074CF51 /* NptTlsTrustAnchor_Base_0042.cpp */; }; - 7CCDA8F0192756250074CF51 /* NptTlsTrustAnchor_Base_0043.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E0192756240074CF51 /* NptTlsTrustAnchor_Base_0043.cpp */; }; - 7CCDA8F1192756250074CF51 /* NptTlsTrustAnchor_Base_0043.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E0192756240074CF51 /* NptTlsTrustAnchor_Base_0043.cpp */; }; - 7CCDA8F2192756250074CF51 /* NptTlsTrustAnchor_Base_0043.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E0192756240074CF51 /* NptTlsTrustAnchor_Base_0043.cpp */; }; - 7CCDA8F3192756250074CF51 /* NptTlsTrustAnchor_Base_0044.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E1192756240074CF51 /* NptTlsTrustAnchor_Base_0044.cpp */; }; - 7CCDA8F4192756250074CF51 /* NptTlsTrustAnchor_Base_0044.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E1192756240074CF51 /* NptTlsTrustAnchor_Base_0044.cpp */; }; - 7CCDA8F5192756250074CF51 /* NptTlsTrustAnchor_Base_0044.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E1192756240074CF51 /* NptTlsTrustAnchor_Base_0044.cpp */; }; - 7CCDA8F6192756250074CF51 /* NptTlsTrustAnchor_Base_0045.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E2192756240074CF51 /* NptTlsTrustAnchor_Base_0045.cpp */; }; - 7CCDA8F7192756250074CF51 /* NptTlsTrustAnchor_Base_0045.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E2192756240074CF51 /* NptTlsTrustAnchor_Base_0045.cpp */; }; - 7CCDA8F8192756250074CF51 /* NptTlsTrustAnchor_Base_0045.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E2192756240074CF51 /* NptTlsTrustAnchor_Base_0045.cpp */; }; - 7CCDA8F9192756250074CF51 /* NptTlsTrustAnchor_Base_0046.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E3192756240074CF51 /* NptTlsTrustAnchor_Base_0046.cpp */; }; - 7CCDA8FA192756250074CF51 /* NptTlsTrustAnchor_Base_0046.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E3192756240074CF51 /* NptTlsTrustAnchor_Base_0046.cpp */; }; - 7CCDA8FB192756250074CF51 /* NptTlsTrustAnchor_Base_0046.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E3192756240074CF51 /* NptTlsTrustAnchor_Base_0046.cpp */; }; - 7CCDA8FC192756250074CF51 /* NptTlsTrustAnchor_Base_0047.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E4192756240074CF51 /* NptTlsTrustAnchor_Base_0047.cpp */; }; - 7CCDA8FD192756250074CF51 /* NptTlsTrustAnchor_Base_0047.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E4192756240074CF51 /* NptTlsTrustAnchor_Base_0047.cpp */; }; - 7CCDA8FE192756250074CF51 /* NptTlsTrustAnchor_Base_0047.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E4192756240074CF51 /* NptTlsTrustAnchor_Base_0047.cpp */; }; - 7CCDA8FF192756250074CF51 /* NptTlsTrustAnchor_Base_0048.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E5192756240074CF51 /* NptTlsTrustAnchor_Base_0048.cpp */; }; - 7CCDA900192756250074CF51 /* NptTlsTrustAnchor_Base_0048.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E5192756240074CF51 /* NptTlsTrustAnchor_Base_0048.cpp */; }; - 7CCDA901192756250074CF51 /* NptTlsTrustAnchor_Base_0048.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E5192756240074CF51 /* NptTlsTrustAnchor_Base_0048.cpp */; }; - 7CCDA902192756250074CF51 /* NptTlsTrustAnchor_Base_0049.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E6192756240074CF51 /* NptTlsTrustAnchor_Base_0049.cpp */; }; - 7CCDA903192756250074CF51 /* NptTlsTrustAnchor_Base_0049.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E6192756240074CF51 /* NptTlsTrustAnchor_Base_0049.cpp */; }; - 7CCDA904192756250074CF51 /* NptTlsTrustAnchor_Base_0049.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E6192756240074CF51 /* NptTlsTrustAnchor_Base_0049.cpp */; }; - 7CCDA905192756250074CF51 /* NptTlsTrustAnchor_Base_0050.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E7192756240074CF51 /* NptTlsTrustAnchor_Base_0050.cpp */; }; - 7CCDA906192756250074CF51 /* NptTlsTrustAnchor_Base_0050.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E7192756240074CF51 /* NptTlsTrustAnchor_Base_0050.cpp */; }; - 7CCDA907192756250074CF51 /* NptTlsTrustAnchor_Base_0050.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E7192756240074CF51 /* NptTlsTrustAnchor_Base_0050.cpp */; }; - 7CCDA908192756250074CF51 /* NptTlsTrustAnchor_Base_0051.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E8192756240074CF51 /* NptTlsTrustAnchor_Base_0051.cpp */; }; - 7CCDA909192756250074CF51 /* NptTlsTrustAnchor_Base_0051.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E8192756240074CF51 /* NptTlsTrustAnchor_Base_0051.cpp */; }; - 7CCDA90A192756250074CF51 /* NptTlsTrustAnchor_Base_0051.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E8192756240074CF51 /* NptTlsTrustAnchor_Base_0051.cpp */; }; - 7CCDA90B192756250074CF51 /* NptTlsTrustAnchor_Base_0052.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E9192756240074CF51 /* NptTlsTrustAnchor_Base_0052.cpp */; }; - 7CCDA90C192756250074CF51 /* NptTlsTrustAnchor_Base_0052.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E9192756240074CF51 /* NptTlsTrustAnchor_Base_0052.cpp */; }; - 7CCDA90D192756250074CF51 /* NptTlsTrustAnchor_Base_0052.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4E9192756240074CF51 /* NptTlsTrustAnchor_Base_0052.cpp */; }; - 7CCDA90E192756250074CF51 /* NptTlsTrustAnchor_Base_0053.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EA192756240074CF51 /* NptTlsTrustAnchor_Base_0053.cpp */; }; - 7CCDA90F192756250074CF51 /* NptTlsTrustAnchor_Base_0053.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EA192756240074CF51 /* NptTlsTrustAnchor_Base_0053.cpp */; }; - 7CCDA910192756250074CF51 /* NptTlsTrustAnchor_Base_0053.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EA192756240074CF51 /* NptTlsTrustAnchor_Base_0053.cpp */; }; - 7CCDA911192756250074CF51 /* NptTlsTrustAnchor_Base_0054.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EB192756240074CF51 /* NptTlsTrustAnchor_Base_0054.cpp */; }; - 7CCDA912192756250074CF51 /* NptTlsTrustAnchor_Base_0054.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EB192756240074CF51 /* NptTlsTrustAnchor_Base_0054.cpp */; }; - 7CCDA913192756250074CF51 /* NptTlsTrustAnchor_Base_0054.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EB192756240074CF51 /* NptTlsTrustAnchor_Base_0054.cpp */; }; - 7CCDA914192756250074CF51 /* NptTlsTrustAnchor_Base_0055.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EC192756240074CF51 /* NptTlsTrustAnchor_Base_0055.cpp */; }; - 7CCDA915192756250074CF51 /* NptTlsTrustAnchor_Base_0055.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EC192756240074CF51 /* NptTlsTrustAnchor_Base_0055.cpp */; }; - 7CCDA916192756250074CF51 /* NptTlsTrustAnchor_Base_0055.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EC192756240074CF51 /* NptTlsTrustAnchor_Base_0055.cpp */; }; - 7CCDA917192756250074CF51 /* NptTlsTrustAnchor_Base_0056.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4ED192756240074CF51 /* NptTlsTrustAnchor_Base_0056.cpp */; }; - 7CCDA918192756250074CF51 /* NptTlsTrustAnchor_Base_0056.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4ED192756240074CF51 /* NptTlsTrustAnchor_Base_0056.cpp */; }; - 7CCDA919192756250074CF51 /* NptTlsTrustAnchor_Base_0056.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4ED192756240074CF51 /* NptTlsTrustAnchor_Base_0056.cpp */; }; - 7CCDA91A192756250074CF51 /* NptTlsTrustAnchor_Base_0057.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EE192756240074CF51 /* NptTlsTrustAnchor_Base_0057.cpp */; }; - 7CCDA91B192756250074CF51 /* NptTlsTrustAnchor_Base_0057.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EE192756240074CF51 /* NptTlsTrustAnchor_Base_0057.cpp */; }; - 7CCDA91C192756250074CF51 /* NptTlsTrustAnchor_Base_0057.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EE192756240074CF51 /* NptTlsTrustAnchor_Base_0057.cpp */; }; - 7CCDA91D192756250074CF51 /* NptTlsTrustAnchor_Base_0058.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EF192756240074CF51 /* NptTlsTrustAnchor_Base_0058.cpp */; }; - 7CCDA91E192756250074CF51 /* NptTlsTrustAnchor_Base_0058.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EF192756240074CF51 /* NptTlsTrustAnchor_Base_0058.cpp */; }; - 7CCDA91F192756250074CF51 /* NptTlsTrustAnchor_Base_0058.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4EF192756240074CF51 /* NptTlsTrustAnchor_Base_0058.cpp */; }; - 7CCDA920192756250074CF51 /* NptTlsTrustAnchor_Base_0059.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F0192756240074CF51 /* NptTlsTrustAnchor_Base_0059.cpp */; }; - 7CCDA921192756250074CF51 /* NptTlsTrustAnchor_Base_0059.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F0192756240074CF51 /* NptTlsTrustAnchor_Base_0059.cpp */; }; - 7CCDA922192756250074CF51 /* NptTlsTrustAnchor_Base_0059.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F0192756240074CF51 /* NptTlsTrustAnchor_Base_0059.cpp */; }; - 7CCDA923192756250074CF51 /* NptTlsTrustAnchor_Base_0060.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F1192756240074CF51 /* NptTlsTrustAnchor_Base_0060.cpp */; }; - 7CCDA924192756250074CF51 /* NptTlsTrustAnchor_Base_0060.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F1192756240074CF51 /* NptTlsTrustAnchor_Base_0060.cpp */; }; - 7CCDA925192756250074CF51 /* NptTlsTrustAnchor_Base_0060.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F1192756240074CF51 /* NptTlsTrustAnchor_Base_0060.cpp */; }; - 7CCDA926192756250074CF51 /* NptTlsTrustAnchor_Base_0061.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F2192756240074CF51 /* NptTlsTrustAnchor_Base_0061.cpp */; }; - 7CCDA927192756250074CF51 /* NptTlsTrustAnchor_Base_0061.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F2192756240074CF51 /* NptTlsTrustAnchor_Base_0061.cpp */; }; - 7CCDA928192756250074CF51 /* NptTlsTrustAnchor_Base_0061.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F2192756240074CF51 /* NptTlsTrustAnchor_Base_0061.cpp */; }; - 7CCDA929192756250074CF51 /* NptTlsTrustAnchor_Base_0062.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F3192756240074CF51 /* NptTlsTrustAnchor_Base_0062.cpp */; }; - 7CCDA92A192756250074CF51 /* NptTlsTrustAnchor_Base_0062.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F3192756240074CF51 /* NptTlsTrustAnchor_Base_0062.cpp */; }; - 7CCDA92B192756250074CF51 /* NptTlsTrustAnchor_Base_0062.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F3192756240074CF51 /* NptTlsTrustAnchor_Base_0062.cpp */; }; - 7CCDA92C192756250074CF51 /* NptTlsTrustAnchor_Base_0063.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F4192756240074CF51 /* NptTlsTrustAnchor_Base_0063.cpp */; }; - 7CCDA92D192756250074CF51 /* NptTlsTrustAnchor_Base_0063.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F4192756240074CF51 /* NptTlsTrustAnchor_Base_0063.cpp */; }; - 7CCDA92E192756250074CF51 /* NptTlsTrustAnchor_Base_0063.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F4192756240074CF51 /* NptTlsTrustAnchor_Base_0063.cpp */; }; - 7CCDA92F192756250074CF51 /* NptTlsTrustAnchor_Base_0064.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F5192756240074CF51 /* NptTlsTrustAnchor_Base_0064.cpp */; }; - 7CCDA930192756250074CF51 /* NptTlsTrustAnchor_Base_0064.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F5192756240074CF51 /* NptTlsTrustAnchor_Base_0064.cpp */; }; - 7CCDA931192756250074CF51 /* NptTlsTrustAnchor_Base_0064.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F5192756240074CF51 /* NptTlsTrustAnchor_Base_0064.cpp */; }; - 7CCDA932192756250074CF51 /* NptTlsTrustAnchor_Base_0065.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F6192756240074CF51 /* NptTlsTrustAnchor_Base_0065.cpp */; }; - 7CCDA933192756250074CF51 /* NptTlsTrustAnchor_Base_0065.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F6192756240074CF51 /* NptTlsTrustAnchor_Base_0065.cpp */; }; - 7CCDA934192756250074CF51 /* NptTlsTrustAnchor_Base_0065.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F6192756240074CF51 /* NptTlsTrustAnchor_Base_0065.cpp */; }; - 7CCDA935192756250074CF51 /* NptTlsTrustAnchor_Base_0066.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F7192756240074CF51 /* NptTlsTrustAnchor_Base_0066.cpp */; }; - 7CCDA936192756250074CF51 /* NptTlsTrustAnchor_Base_0066.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F7192756240074CF51 /* NptTlsTrustAnchor_Base_0066.cpp */; }; - 7CCDA937192756250074CF51 /* NptTlsTrustAnchor_Base_0066.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F7192756240074CF51 /* NptTlsTrustAnchor_Base_0066.cpp */; }; - 7CCDA938192756250074CF51 /* NptTlsTrustAnchor_Base_0067.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F8192756240074CF51 /* NptTlsTrustAnchor_Base_0067.cpp */; }; - 7CCDA939192756250074CF51 /* NptTlsTrustAnchor_Base_0067.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F8192756240074CF51 /* NptTlsTrustAnchor_Base_0067.cpp */; }; - 7CCDA93A192756250074CF51 /* NptTlsTrustAnchor_Base_0067.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F8192756240074CF51 /* NptTlsTrustAnchor_Base_0067.cpp */; }; - 7CCDA93B192756250074CF51 /* NptTlsTrustAnchor_Base_0068.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F9192756240074CF51 /* NptTlsTrustAnchor_Base_0068.cpp */; }; - 7CCDA93C192756250074CF51 /* NptTlsTrustAnchor_Base_0068.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F9192756240074CF51 /* NptTlsTrustAnchor_Base_0068.cpp */; }; - 7CCDA93D192756250074CF51 /* NptTlsTrustAnchor_Base_0068.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4F9192756240074CF51 /* NptTlsTrustAnchor_Base_0068.cpp */; }; - 7CCDA93E192756250074CF51 /* NptTlsTrustAnchor_Base_0069.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FA192756240074CF51 /* NptTlsTrustAnchor_Base_0069.cpp */; }; - 7CCDA93F192756250074CF51 /* NptTlsTrustAnchor_Base_0069.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FA192756240074CF51 /* NptTlsTrustAnchor_Base_0069.cpp */; }; - 7CCDA940192756250074CF51 /* NptTlsTrustAnchor_Base_0069.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FA192756240074CF51 /* NptTlsTrustAnchor_Base_0069.cpp */; }; - 7CCDA941192756250074CF51 /* NptTlsTrustAnchor_Base_0070.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FB192756240074CF51 /* NptTlsTrustAnchor_Base_0070.cpp */; }; - 7CCDA942192756250074CF51 /* NptTlsTrustAnchor_Base_0070.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FB192756240074CF51 /* NptTlsTrustAnchor_Base_0070.cpp */; }; - 7CCDA943192756250074CF51 /* NptTlsTrustAnchor_Base_0070.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FB192756240074CF51 /* NptTlsTrustAnchor_Base_0070.cpp */; }; - 7CCDA944192756250074CF51 /* NptTlsTrustAnchor_Base_0071.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FC192756240074CF51 /* NptTlsTrustAnchor_Base_0071.cpp */; }; - 7CCDA945192756250074CF51 /* NptTlsTrustAnchor_Base_0071.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FC192756240074CF51 /* NptTlsTrustAnchor_Base_0071.cpp */; }; - 7CCDA946192756250074CF51 /* NptTlsTrustAnchor_Base_0071.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FC192756240074CF51 /* NptTlsTrustAnchor_Base_0071.cpp */; }; - 7CCDA947192756250074CF51 /* NptTlsTrustAnchor_Base_0072.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FD192756240074CF51 /* NptTlsTrustAnchor_Base_0072.cpp */; }; - 7CCDA948192756250074CF51 /* NptTlsTrustAnchor_Base_0072.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FD192756240074CF51 /* NptTlsTrustAnchor_Base_0072.cpp */; }; - 7CCDA949192756250074CF51 /* NptTlsTrustAnchor_Base_0072.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FD192756240074CF51 /* NptTlsTrustAnchor_Base_0072.cpp */; }; - 7CCDA94A192756250074CF51 /* NptTlsTrustAnchor_Base_0073.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FE192756240074CF51 /* NptTlsTrustAnchor_Base_0073.cpp */; }; - 7CCDA94B192756250074CF51 /* NptTlsTrustAnchor_Base_0073.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FE192756240074CF51 /* NptTlsTrustAnchor_Base_0073.cpp */; }; - 7CCDA94C192756250074CF51 /* NptTlsTrustAnchor_Base_0073.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FE192756240074CF51 /* NptTlsTrustAnchor_Base_0073.cpp */; }; - 7CCDA94D192756250074CF51 /* NptTlsTrustAnchor_Base_0074.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FF192756240074CF51 /* NptTlsTrustAnchor_Base_0074.cpp */; }; - 7CCDA94E192756250074CF51 /* NptTlsTrustAnchor_Base_0074.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FF192756240074CF51 /* NptTlsTrustAnchor_Base_0074.cpp */; }; - 7CCDA94F192756250074CF51 /* NptTlsTrustAnchor_Base_0074.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA4FF192756240074CF51 /* NptTlsTrustAnchor_Base_0074.cpp */; }; - 7CCDA950192756250074CF51 /* NptTlsTrustAnchor_Base_0075.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA500192756240074CF51 /* NptTlsTrustAnchor_Base_0075.cpp */; }; - 7CCDA951192756250074CF51 /* NptTlsTrustAnchor_Base_0075.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA500192756240074CF51 /* NptTlsTrustAnchor_Base_0075.cpp */; }; - 7CCDA952192756250074CF51 /* NptTlsTrustAnchor_Base_0075.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA500192756240074CF51 /* NptTlsTrustAnchor_Base_0075.cpp */; }; - 7CCDA953192756250074CF51 /* NptTlsTrustAnchor_Base_0076.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA501192756240074CF51 /* NptTlsTrustAnchor_Base_0076.cpp */; }; - 7CCDA954192756250074CF51 /* NptTlsTrustAnchor_Base_0076.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA501192756240074CF51 /* NptTlsTrustAnchor_Base_0076.cpp */; }; - 7CCDA955192756250074CF51 /* NptTlsTrustAnchor_Base_0076.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA501192756240074CF51 /* NptTlsTrustAnchor_Base_0076.cpp */; }; - 7CCDA956192756250074CF51 /* NptTlsTrustAnchor_Base_0077.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA502192756240074CF51 /* NptTlsTrustAnchor_Base_0077.cpp */; }; - 7CCDA957192756250074CF51 /* NptTlsTrustAnchor_Base_0077.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA502192756240074CF51 /* NptTlsTrustAnchor_Base_0077.cpp */; }; - 7CCDA958192756250074CF51 /* NptTlsTrustAnchor_Base_0077.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA502192756240074CF51 /* NptTlsTrustAnchor_Base_0077.cpp */; }; - 7CCDA959192756250074CF51 /* NptTlsTrustAnchor_Base_0078.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA503192756240074CF51 /* NptTlsTrustAnchor_Base_0078.cpp */; }; - 7CCDA95A192756250074CF51 /* NptTlsTrustAnchor_Base_0078.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA503192756240074CF51 /* NptTlsTrustAnchor_Base_0078.cpp */; }; - 7CCDA95B192756250074CF51 /* NptTlsTrustAnchor_Base_0078.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA503192756240074CF51 /* NptTlsTrustAnchor_Base_0078.cpp */; }; - 7CCDA95C192756250074CF51 /* NptTlsTrustAnchor_Base_0079.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA504192756240074CF51 /* NptTlsTrustAnchor_Base_0079.cpp */; }; - 7CCDA95D192756250074CF51 /* NptTlsTrustAnchor_Base_0079.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA504192756240074CF51 /* NptTlsTrustAnchor_Base_0079.cpp */; }; - 7CCDA95E192756250074CF51 /* NptTlsTrustAnchor_Base_0079.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA504192756240074CF51 /* NptTlsTrustAnchor_Base_0079.cpp */; }; - 7CCDA95F192756250074CF51 /* NptTlsTrustAnchor_Base_0080.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA505192756240074CF51 /* NptTlsTrustAnchor_Base_0080.cpp */; }; - 7CCDA960192756250074CF51 /* NptTlsTrustAnchor_Base_0080.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA505192756240074CF51 /* NptTlsTrustAnchor_Base_0080.cpp */; }; - 7CCDA961192756250074CF51 /* NptTlsTrustAnchor_Base_0080.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA505192756240074CF51 /* NptTlsTrustAnchor_Base_0080.cpp */; }; - 7CCDA962192756250074CF51 /* NptTlsTrustAnchor_Base_0081.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA506192756240074CF51 /* NptTlsTrustAnchor_Base_0081.cpp */; }; - 7CCDA963192756250074CF51 /* NptTlsTrustAnchor_Base_0081.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA506192756240074CF51 /* NptTlsTrustAnchor_Base_0081.cpp */; }; - 7CCDA964192756250074CF51 /* NptTlsTrustAnchor_Base_0081.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA506192756240074CF51 /* NptTlsTrustAnchor_Base_0081.cpp */; }; - 7CCDA965192756250074CF51 /* NptTlsTrustAnchor_Base_0082.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA507192756240074CF51 /* NptTlsTrustAnchor_Base_0082.cpp */; }; - 7CCDA966192756250074CF51 /* NptTlsTrustAnchor_Base_0082.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA507192756240074CF51 /* NptTlsTrustAnchor_Base_0082.cpp */; }; - 7CCDA967192756250074CF51 /* NptTlsTrustAnchor_Base_0082.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA507192756240074CF51 /* NptTlsTrustAnchor_Base_0082.cpp */; }; - 7CCDA968192756250074CF51 /* NptTlsTrustAnchor_Base_0083.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA508192756240074CF51 /* NptTlsTrustAnchor_Base_0083.cpp */; }; - 7CCDA969192756250074CF51 /* NptTlsTrustAnchor_Base_0083.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA508192756240074CF51 /* NptTlsTrustAnchor_Base_0083.cpp */; }; - 7CCDA96A192756250074CF51 /* NptTlsTrustAnchor_Base_0083.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA508192756240074CF51 /* NptTlsTrustAnchor_Base_0083.cpp */; }; - 7CCDA96B192756250074CF51 /* NptTlsTrustAnchor_Base_0084.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA509192756240074CF51 /* NptTlsTrustAnchor_Base_0084.cpp */; }; - 7CCDA96C192756250074CF51 /* NptTlsTrustAnchor_Base_0084.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA509192756240074CF51 /* NptTlsTrustAnchor_Base_0084.cpp */; }; - 7CCDA96D192756250074CF51 /* NptTlsTrustAnchor_Base_0084.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA509192756240074CF51 /* NptTlsTrustAnchor_Base_0084.cpp */; }; - 7CCDA96E192756250074CF51 /* NptTlsTrustAnchor_Base_0085.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50A192756240074CF51 /* NptTlsTrustAnchor_Base_0085.cpp */; }; - 7CCDA96F192756250074CF51 /* NptTlsTrustAnchor_Base_0085.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50A192756240074CF51 /* NptTlsTrustAnchor_Base_0085.cpp */; }; - 7CCDA970192756250074CF51 /* NptTlsTrustAnchor_Base_0085.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50A192756240074CF51 /* NptTlsTrustAnchor_Base_0085.cpp */; }; - 7CCDA971192756250074CF51 /* NptTlsTrustAnchor_Base_0086.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50B192756240074CF51 /* NptTlsTrustAnchor_Base_0086.cpp */; }; - 7CCDA972192756250074CF51 /* NptTlsTrustAnchor_Base_0086.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50B192756240074CF51 /* NptTlsTrustAnchor_Base_0086.cpp */; }; - 7CCDA973192756250074CF51 /* NptTlsTrustAnchor_Base_0086.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50B192756240074CF51 /* NptTlsTrustAnchor_Base_0086.cpp */; }; - 7CCDA974192756250074CF51 /* NptTlsTrustAnchor_Base_0087.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50C192756240074CF51 /* NptTlsTrustAnchor_Base_0087.cpp */; }; - 7CCDA975192756250074CF51 /* NptTlsTrustAnchor_Base_0087.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50C192756240074CF51 /* NptTlsTrustAnchor_Base_0087.cpp */; }; - 7CCDA976192756250074CF51 /* NptTlsTrustAnchor_Base_0087.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50C192756240074CF51 /* NptTlsTrustAnchor_Base_0087.cpp */; }; - 7CCDA977192756250074CF51 /* NptTlsTrustAnchor_Base_0088.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50D192756240074CF51 /* NptTlsTrustAnchor_Base_0088.cpp */; }; - 7CCDA978192756250074CF51 /* NptTlsTrustAnchor_Base_0088.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50D192756240074CF51 /* NptTlsTrustAnchor_Base_0088.cpp */; }; - 7CCDA979192756250074CF51 /* NptTlsTrustAnchor_Base_0088.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50D192756240074CF51 /* NptTlsTrustAnchor_Base_0088.cpp */; }; - 7CCDA97A192756250074CF51 /* NptTlsTrustAnchor_Base_0089.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50E192756240074CF51 /* NptTlsTrustAnchor_Base_0089.cpp */; }; - 7CCDA97B192756250074CF51 /* NptTlsTrustAnchor_Base_0089.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50E192756240074CF51 /* NptTlsTrustAnchor_Base_0089.cpp */; }; - 7CCDA97C192756250074CF51 /* NptTlsTrustAnchor_Base_0089.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50E192756240074CF51 /* NptTlsTrustAnchor_Base_0089.cpp */; }; - 7CCDA97D192756250074CF51 /* NptTlsTrustAnchor_Base_0090.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50F192756240074CF51 /* NptTlsTrustAnchor_Base_0090.cpp */; }; - 7CCDA97E192756250074CF51 /* NptTlsTrustAnchor_Base_0090.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50F192756240074CF51 /* NptTlsTrustAnchor_Base_0090.cpp */; }; - 7CCDA97F192756250074CF51 /* NptTlsTrustAnchor_Base_0090.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA50F192756240074CF51 /* NptTlsTrustAnchor_Base_0090.cpp */; }; - 7CCDA980192756250074CF51 /* NptTlsTrustAnchor_Base_0091.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA510192756240074CF51 /* NptTlsTrustAnchor_Base_0091.cpp */; }; - 7CCDA981192756250074CF51 /* NptTlsTrustAnchor_Base_0091.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA510192756240074CF51 /* NptTlsTrustAnchor_Base_0091.cpp */; }; - 7CCDA982192756250074CF51 /* NptTlsTrustAnchor_Base_0091.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA510192756240074CF51 /* NptTlsTrustAnchor_Base_0091.cpp */; }; - 7CCDA983192756250074CF51 /* NptTlsTrustAnchor_Base_0092.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA511192756240074CF51 /* NptTlsTrustAnchor_Base_0092.cpp */; }; - 7CCDA984192756250074CF51 /* NptTlsTrustAnchor_Base_0092.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA511192756240074CF51 /* NptTlsTrustAnchor_Base_0092.cpp */; }; - 7CCDA985192756250074CF51 /* NptTlsTrustAnchor_Base_0092.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA511192756240074CF51 /* NptTlsTrustAnchor_Base_0092.cpp */; }; - 7CCDA986192756250074CF51 /* NptTlsTrustAnchor_Base_0093.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA512192756240074CF51 /* NptTlsTrustAnchor_Base_0093.cpp */; }; - 7CCDA987192756250074CF51 /* NptTlsTrustAnchor_Base_0093.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA512192756240074CF51 /* NptTlsTrustAnchor_Base_0093.cpp */; }; - 7CCDA988192756250074CF51 /* NptTlsTrustAnchor_Base_0093.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA512192756240074CF51 /* NptTlsTrustAnchor_Base_0093.cpp */; }; - 7CCDA989192756250074CF51 /* NptTlsTrustAnchor_Base_0094.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA513192756240074CF51 /* NptTlsTrustAnchor_Base_0094.cpp */; }; - 7CCDA98A192756250074CF51 /* NptTlsTrustAnchor_Base_0094.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA513192756240074CF51 /* NptTlsTrustAnchor_Base_0094.cpp */; }; - 7CCDA98B192756250074CF51 /* NptTlsTrustAnchor_Base_0094.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA513192756240074CF51 /* NptTlsTrustAnchor_Base_0094.cpp */; }; - 7CCDA98C192756250074CF51 /* NptTlsTrustAnchor_Base_0095.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA514192756240074CF51 /* NptTlsTrustAnchor_Base_0095.cpp */; }; - 7CCDA98D192756250074CF51 /* NptTlsTrustAnchor_Base_0095.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA514192756240074CF51 /* NptTlsTrustAnchor_Base_0095.cpp */; }; - 7CCDA98E192756250074CF51 /* NptTlsTrustAnchor_Base_0095.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA514192756240074CF51 /* NptTlsTrustAnchor_Base_0095.cpp */; }; - 7CCDA98F192756250074CF51 /* NptTlsTrustAnchor_Base_0096.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA515192756240074CF51 /* NptTlsTrustAnchor_Base_0096.cpp */; }; - 7CCDA990192756250074CF51 /* NptTlsTrustAnchor_Base_0096.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA515192756240074CF51 /* NptTlsTrustAnchor_Base_0096.cpp */; }; - 7CCDA991192756250074CF51 /* NptTlsTrustAnchor_Base_0096.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA515192756240074CF51 /* NptTlsTrustAnchor_Base_0096.cpp */; }; - 7CCDA992192756250074CF51 /* NptTlsTrustAnchor_Base_0097.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA516192756240074CF51 /* NptTlsTrustAnchor_Base_0097.cpp */; }; - 7CCDA993192756250074CF51 /* NptTlsTrustAnchor_Base_0097.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA516192756240074CF51 /* NptTlsTrustAnchor_Base_0097.cpp */; }; - 7CCDA994192756250074CF51 /* NptTlsTrustAnchor_Base_0097.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA516192756240074CF51 /* NptTlsTrustAnchor_Base_0097.cpp */; }; - 7CCDA995192756250074CF51 /* NptTlsTrustAnchor_Base_0098.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA517192756240074CF51 /* NptTlsTrustAnchor_Base_0098.cpp */; }; - 7CCDA996192756250074CF51 /* NptTlsTrustAnchor_Base_0098.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA517192756240074CF51 /* NptTlsTrustAnchor_Base_0098.cpp */; }; - 7CCDA997192756250074CF51 /* NptTlsTrustAnchor_Base_0098.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA517192756240074CF51 /* NptTlsTrustAnchor_Base_0098.cpp */; }; - 7CCDA998192756250074CF51 /* NptTlsTrustAnchor_Base_0099.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA518192756240074CF51 /* NptTlsTrustAnchor_Base_0099.cpp */; }; - 7CCDA999192756250074CF51 /* NptTlsTrustAnchor_Base_0099.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA518192756240074CF51 /* NptTlsTrustAnchor_Base_0099.cpp */; }; - 7CCDA99A192756250074CF51 /* NptTlsTrustAnchor_Base_0099.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA518192756240074CF51 /* NptTlsTrustAnchor_Base_0099.cpp */; }; - 7CCDA99B192756250074CF51 /* NptTlsTrustAnchor_Base_0100.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA519192756240074CF51 /* NptTlsTrustAnchor_Base_0100.cpp */; }; - 7CCDA99C192756250074CF51 /* NptTlsTrustAnchor_Base_0100.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA519192756240074CF51 /* NptTlsTrustAnchor_Base_0100.cpp */; }; - 7CCDA99D192756250074CF51 /* NptTlsTrustAnchor_Base_0100.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA519192756240074CF51 /* NptTlsTrustAnchor_Base_0100.cpp */; }; - 7CCDA99E192756250074CF51 /* NptTlsTrustAnchor_Base_0101.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51A192756240074CF51 /* NptTlsTrustAnchor_Base_0101.cpp */; }; - 7CCDA99F192756250074CF51 /* NptTlsTrustAnchor_Base_0101.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51A192756240074CF51 /* NptTlsTrustAnchor_Base_0101.cpp */; }; - 7CCDA9A0192756250074CF51 /* NptTlsTrustAnchor_Base_0101.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51A192756240074CF51 /* NptTlsTrustAnchor_Base_0101.cpp */; }; - 7CCDA9A1192756250074CF51 /* NptTlsTrustAnchor_Base_0102.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51B192756240074CF51 /* NptTlsTrustAnchor_Base_0102.cpp */; }; - 7CCDA9A2192756250074CF51 /* NptTlsTrustAnchor_Base_0102.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51B192756240074CF51 /* NptTlsTrustAnchor_Base_0102.cpp */; }; - 7CCDA9A3192756250074CF51 /* NptTlsTrustAnchor_Base_0102.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51B192756240074CF51 /* NptTlsTrustAnchor_Base_0102.cpp */; }; - 7CCDA9A4192756250074CF51 /* NptTlsTrustAnchor_Base_0103.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51C192756240074CF51 /* NptTlsTrustAnchor_Base_0103.cpp */; }; - 7CCDA9A5192756250074CF51 /* NptTlsTrustAnchor_Base_0103.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51C192756240074CF51 /* NptTlsTrustAnchor_Base_0103.cpp */; }; - 7CCDA9A6192756250074CF51 /* NptTlsTrustAnchor_Base_0103.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51C192756240074CF51 /* NptTlsTrustAnchor_Base_0103.cpp */; }; - 7CCDA9A7192756250074CF51 /* NptTlsTrustAnchor_Base_0104.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51D192756240074CF51 /* NptTlsTrustAnchor_Base_0104.cpp */; }; - 7CCDA9A8192756250074CF51 /* NptTlsTrustAnchor_Base_0104.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51D192756240074CF51 /* NptTlsTrustAnchor_Base_0104.cpp */; }; - 7CCDA9A9192756250074CF51 /* NptTlsTrustAnchor_Base_0104.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51D192756240074CF51 /* NptTlsTrustAnchor_Base_0104.cpp */; }; - 7CCDA9AA192756250074CF51 /* NptTlsTrustAnchor_Base_0105.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51E192756240074CF51 /* NptTlsTrustAnchor_Base_0105.cpp */; }; - 7CCDA9AB192756250074CF51 /* NptTlsTrustAnchor_Base_0105.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51E192756240074CF51 /* NptTlsTrustAnchor_Base_0105.cpp */; }; - 7CCDA9AC192756250074CF51 /* NptTlsTrustAnchor_Base_0105.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51E192756240074CF51 /* NptTlsTrustAnchor_Base_0105.cpp */; }; - 7CCDA9AD192756250074CF51 /* NptTlsTrustAnchor_Base_0106.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51F192756240074CF51 /* NptTlsTrustAnchor_Base_0106.cpp */; }; - 7CCDA9AE192756250074CF51 /* NptTlsTrustAnchor_Base_0106.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51F192756240074CF51 /* NptTlsTrustAnchor_Base_0106.cpp */; }; - 7CCDA9AF192756250074CF51 /* NptTlsTrustAnchor_Base_0106.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA51F192756240074CF51 /* NptTlsTrustAnchor_Base_0106.cpp */; }; - 7CCDA9B0192756250074CF51 /* NptTlsTrustAnchor_Base_0107.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA520192756240074CF51 /* NptTlsTrustAnchor_Base_0107.cpp */; }; - 7CCDA9B1192756250074CF51 /* NptTlsTrustAnchor_Base_0107.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA520192756240074CF51 /* NptTlsTrustAnchor_Base_0107.cpp */; }; - 7CCDA9B2192756250074CF51 /* NptTlsTrustAnchor_Base_0107.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA520192756240074CF51 /* NptTlsTrustAnchor_Base_0107.cpp */; }; - 7CCDA9B3192756250074CF51 /* NptTlsTrustAnchor_Base_0108.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA521192756240074CF51 /* NptTlsTrustAnchor_Base_0108.cpp */; }; - 7CCDA9B4192756250074CF51 /* NptTlsTrustAnchor_Base_0108.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA521192756240074CF51 /* NptTlsTrustAnchor_Base_0108.cpp */; }; - 7CCDA9B5192756250074CF51 /* NptTlsTrustAnchor_Base_0108.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA521192756240074CF51 /* NptTlsTrustAnchor_Base_0108.cpp */; }; - 7CCDA9B6192756250074CF51 /* NptTlsTrustAnchor_Base_0109.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA522192756240074CF51 /* NptTlsTrustAnchor_Base_0109.cpp */; }; - 7CCDA9B7192756250074CF51 /* NptTlsTrustAnchor_Base_0109.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA522192756240074CF51 /* NptTlsTrustAnchor_Base_0109.cpp */; }; - 7CCDA9B8192756250074CF51 /* NptTlsTrustAnchor_Base_0109.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA522192756240074CF51 /* NptTlsTrustAnchor_Base_0109.cpp */; }; - 7CCDA9B9192756250074CF51 /* NptTlsTrustAnchor_Base_0110.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA523192756240074CF51 /* NptTlsTrustAnchor_Base_0110.cpp */; }; - 7CCDA9BA192756250074CF51 /* NptTlsTrustAnchor_Base_0110.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA523192756240074CF51 /* NptTlsTrustAnchor_Base_0110.cpp */; }; - 7CCDA9BB192756250074CF51 /* NptTlsTrustAnchor_Base_0110.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA523192756240074CF51 /* NptTlsTrustAnchor_Base_0110.cpp */; }; - 7CCDA9BC192756250074CF51 /* NptTlsTrustAnchor_Base_0111.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA524192756240074CF51 /* NptTlsTrustAnchor_Base_0111.cpp */; }; - 7CCDA9BD192756250074CF51 /* NptTlsTrustAnchor_Base_0111.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA524192756240074CF51 /* NptTlsTrustAnchor_Base_0111.cpp */; }; - 7CCDA9BE192756250074CF51 /* NptTlsTrustAnchor_Base_0111.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA524192756240074CF51 /* NptTlsTrustAnchor_Base_0111.cpp */; }; - 7CCDA9BF192756250074CF51 /* NptTlsTrustAnchor_Base_0112.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA525192756240074CF51 /* NptTlsTrustAnchor_Base_0112.cpp */; }; - 7CCDA9C0192756250074CF51 /* NptTlsTrustAnchor_Base_0112.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA525192756240074CF51 /* NptTlsTrustAnchor_Base_0112.cpp */; }; - 7CCDA9C1192756250074CF51 /* NptTlsTrustAnchor_Base_0112.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA525192756240074CF51 /* NptTlsTrustAnchor_Base_0112.cpp */; }; - 7CCDA9C2192756250074CF51 /* NptTlsTrustAnchor_Base_0113.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA526192756240074CF51 /* NptTlsTrustAnchor_Base_0113.cpp */; }; - 7CCDA9C3192756250074CF51 /* NptTlsTrustAnchor_Base_0113.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA526192756240074CF51 /* NptTlsTrustAnchor_Base_0113.cpp */; }; - 7CCDA9C4192756250074CF51 /* NptTlsTrustAnchor_Base_0113.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA526192756240074CF51 /* NptTlsTrustAnchor_Base_0113.cpp */; }; - 7CCDA9C5192756250074CF51 /* NptTlsTrustAnchor_Base_0114.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA527192756240074CF51 /* NptTlsTrustAnchor_Base_0114.cpp */; }; - 7CCDA9C6192756250074CF51 /* NptTlsTrustAnchor_Base_0114.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA527192756240074CF51 /* NptTlsTrustAnchor_Base_0114.cpp */; }; - 7CCDA9C7192756250074CF51 /* NptTlsTrustAnchor_Base_0114.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA527192756240074CF51 /* NptTlsTrustAnchor_Base_0114.cpp */; }; - 7CCDA9C8192756250074CF51 /* NptTlsTrustAnchor_Base_0115.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA528192756240074CF51 /* NptTlsTrustAnchor_Base_0115.cpp */; }; - 7CCDA9C9192756250074CF51 /* NptTlsTrustAnchor_Base_0115.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA528192756240074CF51 /* NptTlsTrustAnchor_Base_0115.cpp */; }; - 7CCDA9CA192756250074CF51 /* NptTlsTrustAnchor_Base_0115.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA528192756240074CF51 /* NptTlsTrustAnchor_Base_0115.cpp */; }; - 7CCDA9CB192756250074CF51 /* NptTlsTrustAnchor_Base_0116.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA529192756240074CF51 /* NptTlsTrustAnchor_Base_0116.cpp */; }; - 7CCDA9CC192756250074CF51 /* NptTlsTrustAnchor_Base_0116.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA529192756240074CF51 /* NptTlsTrustAnchor_Base_0116.cpp */; }; - 7CCDA9CD192756250074CF51 /* NptTlsTrustAnchor_Base_0116.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA529192756240074CF51 /* NptTlsTrustAnchor_Base_0116.cpp */; }; - 7CCDA9CE192756250074CF51 /* NptTlsTrustAnchor_Base_0117.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52A192756240074CF51 /* NptTlsTrustAnchor_Base_0117.cpp */; }; - 7CCDA9CF192756250074CF51 /* NptTlsTrustAnchor_Base_0117.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52A192756240074CF51 /* NptTlsTrustAnchor_Base_0117.cpp */; }; - 7CCDA9D0192756250074CF51 /* NptTlsTrustAnchor_Base_0117.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52A192756240074CF51 /* NptTlsTrustAnchor_Base_0117.cpp */; }; - 7CCDA9D1192756250074CF51 /* NptTlsTrustAnchor_Base_0118.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52B192756240074CF51 /* NptTlsTrustAnchor_Base_0118.cpp */; }; - 7CCDA9D2192756250074CF51 /* NptTlsTrustAnchor_Base_0118.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52B192756240074CF51 /* NptTlsTrustAnchor_Base_0118.cpp */; }; - 7CCDA9D3192756250074CF51 /* NptTlsTrustAnchor_Base_0118.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52B192756240074CF51 /* NptTlsTrustAnchor_Base_0118.cpp */; }; - 7CCDA9D4192756250074CF51 /* NptTlsTrustAnchor_Base_0119.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52C192756240074CF51 /* NptTlsTrustAnchor_Base_0119.cpp */; }; - 7CCDA9D5192756250074CF51 /* NptTlsTrustAnchor_Base_0119.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52C192756240074CF51 /* NptTlsTrustAnchor_Base_0119.cpp */; }; - 7CCDA9D6192756250074CF51 /* NptTlsTrustAnchor_Base_0119.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52C192756240074CF51 /* NptTlsTrustAnchor_Base_0119.cpp */; }; - 7CCDA9D7192756250074CF51 /* NptTlsTrustAnchor_Base_0120.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52D192756240074CF51 /* NptTlsTrustAnchor_Base_0120.cpp */; }; - 7CCDA9D8192756250074CF51 /* NptTlsTrustAnchor_Base_0120.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52D192756240074CF51 /* NptTlsTrustAnchor_Base_0120.cpp */; }; - 7CCDA9D9192756250074CF51 /* NptTlsTrustAnchor_Base_0120.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52D192756240074CF51 /* NptTlsTrustAnchor_Base_0120.cpp */; }; - 7CCDA9DA192756250074CF51 /* NptTlsTrustAnchor_Base_0121.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52E192756240074CF51 /* NptTlsTrustAnchor_Base_0121.cpp */; }; - 7CCDA9DB192756250074CF51 /* NptTlsTrustAnchor_Base_0121.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52E192756240074CF51 /* NptTlsTrustAnchor_Base_0121.cpp */; }; - 7CCDA9DC192756250074CF51 /* NptTlsTrustAnchor_Base_0121.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52E192756240074CF51 /* NptTlsTrustAnchor_Base_0121.cpp */; }; - 7CCDA9DD192756250074CF51 /* NptTlsTrustAnchor_Base_0122.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52F192756240074CF51 /* NptTlsTrustAnchor_Base_0122.cpp */; }; - 7CCDA9DE192756250074CF51 /* NptTlsTrustAnchor_Base_0122.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52F192756240074CF51 /* NptTlsTrustAnchor_Base_0122.cpp */; }; - 7CCDA9DF192756250074CF51 /* NptTlsTrustAnchor_Base_0122.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA52F192756240074CF51 /* NptTlsTrustAnchor_Base_0122.cpp */; }; - 7CCDA9E0192756250074CF51 /* NptTlsTrustAnchor_Base_0123.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA530192756240074CF51 /* NptTlsTrustAnchor_Base_0123.cpp */; }; - 7CCDA9E1192756250074CF51 /* NptTlsTrustAnchor_Base_0123.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA530192756240074CF51 /* NptTlsTrustAnchor_Base_0123.cpp */; }; - 7CCDA9E2192756250074CF51 /* NptTlsTrustAnchor_Base_0123.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA530192756240074CF51 /* NptTlsTrustAnchor_Base_0123.cpp */; }; - 7CCDA9E3192756250074CF51 /* NptTlsTrustAnchor_Base_0124.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA531192756240074CF51 /* NptTlsTrustAnchor_Base_0124.cpp */; }; - 7CCDA9E4192756250074CF51 /* NptTlsTrustAnchor_Base_0124.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA531192756240074CF51 /* NptTlsTrustAnchor_Base_0124.cpp */; }; - 7CCDA9E5192756250074CF51 /* NptTlsTrustAnchor_Base_0124.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA531192756240074CF51 /* NptTlsTrustAnchor_Base_0124.cpp */; }; - 7CCDA9E6192756250074CF51 /* NptTlsTrustAnchor_Base_0125.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA532192756240074CF51 /* NptTlsTrustAnchor_Base_0125.cpp */; }; - 7CCDA9E7192756250074CF51 /* NptTlsTrustAnchor_Base_0125.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA532192756240074CF51 /* NptTlsTrustAnchor_Base_0125.cpp */; }; - 7CCDA9E8192756250074CF51 /* NptTlsTrustAnchor_Base_0125.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA532192756240074CF51 /* NptTlsTrustAnchor_Base_0125.cpp */; }; - 7CCDA9E9192756250074CF51 /* NptTlsTrustAnchor_Base_0126.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA533192756240074CF51 /* NptTlsTrustAnchor_Base_0126.cpp */; }; - 7CCDA9EA192756250074CF51 /* NptTlsTrustAnchor_Base_0126.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA533192756240074CF51 /* NptTlsTrustAnchor_Base_0126.cpp */; }; - 7CCDA9EB192756250074CF51 /* NptTlsTrustAnchor_Base_0126.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA533192756240074CF51 /* NptTlsTrustAnchor_Base_0126.cpp */; }; - 7CCDA9EC192756250074CF51 /* NptTlsTrustAnchor_Base_0127.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA534192756240074CF51 /* NptTlsTrustAnchor_Base_0127.cpp */; }; - 7CCDA9ED192756250074CF51 /* NptTlsTrustAnchor_Base_0127.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA534192756240074CF51 /* NptTlsTrustAnchor_Base_0127.cpp */; }; - 7CCDA9EE192756250074CF51 /* NptTlsTrustAnchor_Base_0127.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA534192756240074CF51 /* NptTlsTrustAnchor_Base_0127.cpp */; }; - 7CCDA9EF192756250074CF51 /* NptTlsTrustAnchor_Base_0128.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA535192756240074CF51 /* NptTlsTrustAnchor_Base_0128.cpp */; }; - 7CCDA9F0192756250074CF51 /* NptTlsTrustAnchor_Base_0128.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA535192756240074CF51 /* NptTlsTrustAnchor_Base_0128.cpp */; }; - 7CCDA9F1192756250074CF51 /* NptTlsTrustAnchor_Base_0128.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA535192756240074CF51 /* NptTlsTrustAnchor_Base_0128.cpp */; }; - 7CCDA9F2192756250074CF51 /* NptTlsTrustAnchor_Base_0129.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA536192756240074CF51 /* NptTlsTrustAnchor_Base_0129.cpp */; }; - 7CCDA9F3192756250074CF51 /* NptTlsTrustAnchor_Base_0129.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA536192756240074CF51 /* NptTlsTrustAnchor_Base_0129.cpp */; }; - 7CCDA9F4192756250074CF51 /* NptTlsTrustAnchor_Base_0129.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA536192756240074CF51 /* NptTlsTrustAnchor_Base_0129.cpp */; }; - 7CCDA9F5192756250074CF51 /* NptTlsTrustAnchor_Base_0130.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA537192756240074CF51 /* NptTlsTrustAnchor_Base_0130.cpp */; }; - 7CCDA9F6192756250074CF51 /* NptTlsTrustAnchor_Base_0130.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA537192756240074CF51 /* NptTlsTrustAnchor_Base_0130.cpp */; }; - 7CCDA9F7192756250074CF51 /* NptTlsTrustAnchor_Base_0130.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA537192756240074CF51 /* NptTlsTrustAnchor_Base_0130.cpp */; }; - 7CCDA9F8192756250074CF51 /* NptTlsTrustAnchor_Base_0131.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA538192756240074CF51 /* NptTlsTrustAnchor_Base_0131.cpp */; }; - 7CCDA9F9192756250074CF51 /* NptTlsTrustAnchor_Base_0131.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA538192756240074CF51 /* NptTlsTrustAnchor_Base_0131.cpp */; }; - 7CCDA9FA192756250074CF51 /* NptTlsTrustAnchor_Base_0131.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA538192756240074CF51 /* NptTlsTrustAnchor_Base_0131.cpp */; }; - 7CCDA9FB192756250074CF51 /* NptTlsTrustAnchor_Base_0132.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA539192756240074CF51 /* NptTlsTrustAnchor_Base_0132.cpp */; }; - 7CCDA9FC192756250074CF51 /* NptTlsTrustAnchor_Base_0132.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA539192756240074CF51 /* NptTlsTrustAnchor_Base_0132.cpp */; }; - 7CCDA9FD192756250074CF51 /* NptTlsTrustAnchor_Base_0132.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA539192756240074CF51 /* NptTlsTrustAnchor_Base_0132.cpp */; }; - 7CCDA9FE192756250074CF51 /* NptTlsTrustAnchor_Base_0133.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53A192756240074CF51 /* NptTlsTrustAnchor_Base_0133.cpp */; }; - 7CCDA9FF192756250074CF51 /* NptTlsTrustAnchor_Base_0133.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53A192756240074CF51 /* NptTlsTrustAnchor_Base_0133.cpp */; }; - 7CCDAA00192756250074CF51 /* NptTlsTrustAnchor_Base_0133.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53A192756240074CF51 /* NptTlsTrustAnchor_Base_0133.cpp */; }; - 7CCDAA01192756250074CF51 /* NptTlsTrustAnchor_Base_0134.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53B192756240074CF51 /* NptTlsTrustAnchor_Base_0134.cpp */; }; - 7CCDAA02192756250074CF51 /* NptTlsTrustAnchor_Base_0134.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53B192756240074CF51 /* NptTlsTrustAnchor_Base_0134.cpp */; }; - 7CCDAA03192756250074CF51 /* NptTlsTrustAnchor_Base_0134.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53B192756240074CF51 /* NptTlsTrustAnchor_Base_0134.cpp */; }; - 7CCDAA04192756250074CF51 /* NptTlsTrustAnchor_Base_0135.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53C192756240074CF51 /* NptTlsTrustAnchor_Base_0135.cpp */; }; - 7CCDAA05192756250074CF51 /* NptTlsTrustAnchor_Base_0135.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53C192756240074CF51 /* NptTlsTrustAnchor_Base_0135.cpp */; }; - 7CCDAA06192756250074CF51 /* NptTlsTrustAnchor_Base_0135.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53C192756240074CF51 /* NptTlsTrustAnchor_Base_0135.cpp */; }; - 7CCDAA07192756250074CF51 /* NptTlsTrustAnchor_Extended_0000.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53E192756240074CF51 /* NptTlsTrustAnchor_Extended_0000.cpp */; }; - 7CCDAA08192756250074CF51 /* NptTlsTrustAnchor_Extended_0000.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53E192756240074CF51 /* NptTlsTrustAnchor_Extended_0000.cpp */; }; - 7CCDAA09192756250074CF51 /* NptTlsTrustAnchor_Extended_0000.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53E192756240074CF51 /* NptTlsTrustAnchor_Extended_0000.cpp */; }; - 7CCDAA0A192756250074CF51 /* NptTlsTrustAnchor_Extended_0001.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53F192756240074CF51 /* NptTlsTrustAnchor_Extended_0001.cpp */; }; - 7CCDAA0B192756250074CF51 /* NptTlsTrustAnchor_Extended_0001.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53F192756240074CF51 /* NptTlsTrustAnchor_Extended_0001.cpp */; }; - 7CCDAA0C192756250074CF51 /* NptTlsTrustAnchor_Extended_0001.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA53F192756240074CF51 /* NptTlsTrustAnchor_Extended_0001.cpp */; }; - 7CCDAA0D192756250074CF51 /* NptTlsTrustAnchor_Extended_0002.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA540192756240074CF51 /* NptTlsTrustAnchor_Extended_0002.cpp */; }; - 7CCDAA0E192756250074CF51 /* NptTlsTrustAnchor_Extended_0002.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA540192756240074CF51 /* NptTlsTrustAnchor_Extended_0002.cpp */; }; - 7CCDAA0F192756250074CF51 /* NptTlsTrustAnchor_Extended_0002.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA540192756240074CF51 /* NptTlsTrustAnchor_Extended_0002.cpp */; }; - 7CCDAA10192756250074CF51 /* NptTlsTrustAnchor_Extended_0003.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA541192756240074CF51 /* NptTlsTrustAnchor_Extended_0003.cpp */; }; - 7CCDAA11192756250074CF51 /* NptTlsTrustAnchor_Extended_0003.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA541192756240074CF51 /* NptTlsTrustAnchor_Extended_0003.cpp */; }; - 7CCDAA12192756250074CF51 /* NptTlsTrustAnchor_Extended_0003.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA541192756240074CF51 /* NptTlsTrustAnchor_Extended_0003.cpp */; }; - 7CCDAA13192756250074CF51 /* NptTlsTrustAnchor_Extended_0004.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA542192756240074CF51 /* NptTlsTrustAnchor_Extended_0004.cpp */; }; - 7CCDAA14192756250074CF51 /* NptTlsTrustAnchor_Extended_0004.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA542192756240074CF51 /* NptTlsTrustAnchor_Extended_0004.cpp */; }; - 7CCDAA15192756250074CF51 /* NptTlsTrustAnchor_Extended_0004.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA542192756240074CF51 /* NptTlsTrustAnchor_Extended_0004.cpp */; }; - 7CCDAA16192756250074CF51 /* NptTlsTrustAnchor_Extended_0005.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA543192756240074CF51 /* NptTlsTrustAnchor_Extended_0005.cpp */; }; - 7CCDAA17192756250074CF51 /* NptTlsTrustAnchor_Extended_0005.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA543192756240074CF51 /* NptTlsTrustAnchor_Extended_0005.cpp */; }; - 7CCDAA18192756250074CF51 /* NptTlsTrustAnchor_Extended_0005.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA543192756240074CF51 /* NptTlsTrustAnchor_Extended_0005.cpp */; }; - 7CCDAA19192756250074CF51 /* NptTlsTrustAnchor_Extended_0006.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA544192756240074CF51 /* NptTlsTrustAnchor_Extended_0006.cpp */; }; - 7CCDAA1A192756250074CF51 /* NptTlsTrustAnchor_Extended_0006.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA544192756240074CF51 /* NptTlsTrustAnchor_Extended_0006.cpp */; }; - 7CCDAA1B192756250074CF51 /* NptTlsTrustAnchor_Extended_0006.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA544192756240074CF51 /* NptTlsTrustAnchor_Extended_0006.cpp */; }; - 7CCDAA1C192756250074CF51 /* NptTlsTrustAnchor_Extended_0007.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA545192756240074CF51 /* NptTlsTrustAnchor_Extended_0007.cpp */; }; - 7CCDAA1D192756250074CF51 /* NptTlsTrustAnchor_Extended_0007.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA545192756240074CF51 /* NptTlsTrustAnchor_Extended_0007.cpp */; }; - 7CCDAA1E192756250074CF51 /* NptTlsTrustAnchor_Extended_0007.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA545192756240074CF51 /* NptTlsTrustAnchor_Extended_0007.cpp */; }; - 7CCDAA1F192756250074CF51 /* NptTlsTrustAnchor_Extended_0008.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA546192756240074CF51 /* NptTlsTrustAnchor_Extended_0008.cpp */; }; - 7CCDAA20192756250074CF51 /* NptTlsTrustAnchor_Extended_0008.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA546192756240074CF51 /* NptTlsTrustAnchor_Extended_0008.cpp */; }; - 7CCDAA21192756250074CF51 /* NptTlsTrustAnchor_Extended_0008.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA546192756240074CF51 /* NptTlsTrustAnchor_Extended_0008.cpp */; }; - 7CCDAA22192756250074CF51 /* NptTlsTrustAnchor_Extended_0009.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA547192756240074CF51 /* NptTlsTrustAnchor_Extended_0009.cpp */; }; - 7CCDAA23192756250074CF51 /* NptTlsTrustAnchor_Extended_0009.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA547192756240074CF51 /* NptTlsTrustAnchor_Extended_0009.cpp */; }; - 7CCDAA24192756250074CF51 /* NptTlsTrustAnchor_Extended_0009.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA547192756240074CF51 /* NptTlsTrustAnchor_Extended_0009.cpp */; }; - 7CCDAA25192756250074CF51 /* NptTlsTrustAnchor_Extended_0010.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA548192756240074CF51 /* NptTlsTrustAnchor_Extended_0010.cpp */; }; - 7CCDAA26192756250074CF51 /* NptTlsTrustAnchor_Extended_0010.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA548192756240074CF51 /* NptTlsTrustAnchor_Extended_0010.cpp */; }; - 7CCDAA27192756250074CF51 /* NptTlsTrustAnchor_Extended_0010.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA548192756240074CF51 /* NptTlsTrustAnchor_Extended_0010.cpp */; }; - 7CCDAA28192756250074CF51 /* NptTlsTrustAnchor_Extended_0011.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA549192756240074CF51 /* NptTlsTrustAnchor_Extended_0011.cpp */; }; - 7CCDAA29192756250074CF51 /* NptTlsTrustAnchor_Extended_0011.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA549192756240074CF51 /* NptTlsTrustAnchor_Extended_0011.cpp */; }; - 7CCDAA2A192756250074CF51 /* NptTlsTrustAnchor_Extended_0011.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA549192756240074CF51 /* NptTlsTrustAnchor_Extended_0011.cpp */; }; - 7CCDAA2B192756250074CF51 /* NptTlsTrustAnchor_Extended_0012.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA54A192756240074CF51 /* NptTlsTrustAnchor_Extended_0012.cpp */; }; - 7CCDAA2C192756250074CF51 /* NptTlsTrustAnchor_Extended_0012.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA54A192756240074CF51 /* NptTlsTrustAnchor_Extended_0012.cpp */; }; - 7CCDAA2D192756250074CF51 /* NptTlsTrustAnchor_Extended_0012.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA54A192756240074CF51 /* NptTlsTrustAnchor_Extended_0012.cpp */; }; - 7CCDAA2E192756250074CF51 /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA54B192756240074CF51 /* NptTlsDefaultTrustAnchorsBase.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 7CCDAA2F192756250074CF51 /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA54B192756240074CF51 /* NptTlsDefaultTrustAnchorsBase.cpp */; }; - 7CCDAA30192756250074CF51 /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA54B192756240074CF51 /* NptTlsDefaultTrustAnchorsBase.cpp */; }; - 7CCDAA31192756250074CF51 /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA54C192756240074CF51 /* NptTlsDefaultTrustAnchorsExtended.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; - 7CCDAA32192756250074CF51 /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA54C192756240074CF51 /* NptTlsDefaultTrustAnchorsExtended.cpp */; }; - 7CCDAA33192756250074CF51 /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA54C192756240074CF51 /* NptTlsDefaultTrustAnchorsExtended.cpp */; }; 7CCDAA82192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA56F192756240074CF51 /* NptPosixDynamicLibraries.cpp */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; }; 7CCDAA83192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA56F192756240074CF51 /* NptPosixDynamicLibraries.cpp */; }; 7CCDAA84192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDA56F192756240074CF51 /* NptPosixDynamicLibraries.cpp */; }; @@ -1124,9 +685,6 @@ AE84CB5A15A5B8A600A3810E /* TagLibVFSStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE84CB5915A5B8A600A3810E /* TagLibVFSStream.cpp */; }; AE89ACA61621DAB800E17DBC /* DVDDemuxBXA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AE89ACA41621DAB800E17DBC /* DVDDemuxBXA.cpp */; }; AEC0083115ACAC6E0099888C /* TagLoaderTagLib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AEC0083015ACAC6E0099888C /* TagLoaderTagLib.cpp */; }; - B5011E3C19AA4989005ADF89 /* MarkWatchedJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5011E3B19AA4989005ADF89 /* MarkWatchedJob.cpp */; }; - B5011E3D19AA4989005ADF89 /* MarkWatchedJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5011E3B19AA4989005ADF89 /* MarkWatchedJob.cpp */; }; - B5011E3E19AA4989005ADF89 /* MarkWatchedJob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5011E3B19AA4989005ADF89 /* MarkWatchedJob.cpp */; }; B5011E4119AF3B56005ADF89 /* PosixFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5011E3F19AF3B56005ADF89 /* PosixFile.cpp */; }; B5011E4219AF3B56005ADF89 /* PosixFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5011E3F19AF3B56005ADF89 /* PosixFile.cpp */; }; B5011E4319AF3B56005ADF89 /* PosixFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5011E3F19AF3B56005ADF89 /* PosixFile.cpp */; }; @@ -1188,6 +746,9 @@ C8D0B2AF1265A9A800F0C0AC /* SystemGlobals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8D0B2AE1265A9A800F0C0AC /* SystemGlobals.cpp */; }; C8EC5D0E1369519D00CCC10D /* XBMC_keytable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C8EC5D0C1369519D00CCC10D /* XBMC_keytable.cpp */; }; DF00492D162DAEA200A971AD /* PVROperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF00492B162DAEA200A971AD /* PVROperations.cpp */; }; + DF02BA621A910623006DCA16 /* VideoSyncIos.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF02BA601A910623006DCA16 /* VideoSyncIos.cpp */; }; + DF02BA631A910624006DCA16 /* VideoSyncIos.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF02BA601A910623006DCA16 /* VideoSyncIos.cpp */; }; + DF02BA661A91065F006DCA16 /* VideoSyncOsx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF02BA641A91065F006DCA16 /* VideoSyncOsx.cpp */; }; DF033D381946612400BFC82E /* AEDeviceEnumerationOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF033D361946612400BFC82E /* AEDeviceEnumerationOSX.cpp */; }; DF07252E168734D7008DCAAD /* karaokevideobackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */; }; DF072534168734ED008DCAAD /* FFmpegVideoDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF072532168734ED008DCAAD /* FFmpegVideoDecoder.cpp */; }; @@ -1321,9 +882,6 @@ DF93D7F61444B568007C6459 /* HDHomeRunDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF93D7F51444B568007C6459 /* HDHomeRunDirectory.cpp */; }; DF98D98C1434F47D00A6EBE1 /* SkinVariable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF98D98A1434F47D00A6EBE1 /* SkinVariable.cpp */; }; DF9A71EE1639C8F6005ECB2E /* HTTPFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF9A71EC1639C8F6005ECB2E /* HTTPFile.cpp */; }; - DFA0E8C519FD6BEE00269A92 /* VideoSyncCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFA0E8C319FD6BEE00269A92 /* VideoSyncCocoa.cpp */; }; - DFA0E8C719FD7BD100269A92 /* VideoSyncCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFA0E8C319FD6BEE00269A92 /* VideoSyncCocoa.cpp */; }; - DFA0E8C819FD7BD100269A92 /* VideoSyncCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFA0E8C319FD6BEE00269A92 /* VideoSyncCocoa.cpp */; }; DFA8157E16713B1200E4E597 /* WakeOnAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFA8157C16713B1200E4E597 /* WakeOnAccess.cpp */; }; DFAB049813F8376700B70BFB /* InertialScrollingHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAB049613F8376700B70BFB /* InertialScrollingHandler.cpp */; }; DFAF6A4F16EBAE3800D6AE12 /* RssManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFAF6A4D16EBAE3800D6AE12 /* RssManager.cpp */; }; @@ -1421,7 +979,6 @@ DFF0EC891752822E002DA3A4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFF0EB9517528174002DA3A4 /* UIKit.framework */; }; DFF0EC8C17528283002DA3A4 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFF0EC8B17528283002DA3A4 /* VideoToolbox.framework */; }; DFF0ECA4175282AD002DA3A4 /* librtv.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E38E256C0D263A1C00618676 /* librtv.a */; }; - DFF0ECA5175282AD002DA3A4 /* libsquish.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 43352CED1071634600706B8A /* libsquish.a */; }; DFF0ECA6175282AD002DA3A4 /* libxdaap.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E38E25680D2639F100618676 /* libxdaap.a */; }; DFF0ECA7175282AD002DA3A4 /* SlingboxLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 18404DA51396C31B00863BBA /* SlingboxLib.a */; }; DFF0F0EF17528350002DA3A4 /* archive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1CE60D25F9FC00618676 /* archive.cpp */; settings = {COMPILER_FLAGS = "-DSILENT"; }; }; @@ -3533,7 +3090,6 @@ E499157C174E67EE00741B6D /* net_posix.c in Sources */ = {isa = PBXBuildFile; fileRef = F551107B0F5C424700955236 /* net_posix.c */; }; E499157D174E67EE00741B6D /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = F51CF2CE0F6055A4004F4602 /* sha1.c */; }; E499157E174E681200741B6D /* librtv.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E38E256C0D263A1C00618676 /* librtv.a */; }; - E499157F174E681600741B6D /* libsquish.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 43352CED1071634600706B8A /* libsquish.a */; }; E4991580174E681600741B6D /* libxdaap.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E38E25680D2639F100618676 /* libxdaap.a */; }; E4991581174E681600741B6D /* SlingboxLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 18404DA51396C31B00863BBA /* SlingboxLib.a */; }; E4991582174E682F00741B6D /* AutoPool.mm in Sources */ = {isa = PBXBuildFile; fileRef = F57A1D1D1329B15300498CC7 /* AutoPool.mm */; }; @@ -4076,10 +3632,24 @@ 38F4E56C13CCCB3B00664821 /* Implementation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Implementation.cpp; sourceTree = "<group>"; }; 38F4E56D13CCCB3B00664821 /* README.platform */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.platform; sourceTree = "<group>"; }; 38F4E56E13CCCB3B00664821 /* ThreadLocal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadLocal.h; sourceTree = "<group>"; }; - 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPImageTransformationHandler.cpp; sourceTree = "<group>"; }; - 395F6DE11A81FACF0088CC74 /* HTTPImageTransformationHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPImageTransformationHandler.h; sourceTree = "<group>"; }; 395F6DDB1A8133360088CC74 /* GUIDialogSimpleMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogSimpleMenu.cpp; sourceTree = "<group>"; }; 395F6DDC1A8133360088CC74 /* GUIDialogSimpleMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogSimpleMenu.h; sourceTree = "<group>"; }; + 395F6DE01A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPImageTransformationHandler.cpp; sourceTree = "<group>"; }; + 395F6DE11A81FACF0088CC74 /* HTTPImageTransformationHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPImageTransformationHandler.h; sourceTree = "<group>"; }; + 399442591A8DD8D0006C39E9 /* ProgressJob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProgressJob.cpp; sourceTree = "<group>"; }; + 3994425A1A8DD8D0006C39E9 /* ProgressJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProgressJob.h; sourceTree = "<group>"; }; + 399442611A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoLibraryCleaningJob.cpp; sourceTree = "<group>"; }; + 399442621A8DD920006C39E9 /* VideoLibraryCleaningJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoLibraryCleaningJob.h; sourceTree = "<group>"; }; + 399442631A8DD920006C39E9 /* VideoLibraryJob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoLibraryJob.cpp; sourceTree = "<group>"; }; + 399442641A8DD920006C39E9 /* VideoLibraryJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoLibraryJob.h; sourceTree = "<group>"; }; + 399442651A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoLibraryMarkWatchedJob.cpp; sourceTree = "<group>"; }; + 399442661A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoLibraryMarkWatchedJob.h; sourceTree = "<group>"; }; + 399442671A8DD920006C39E9 /* VideoLibraryProgressJob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoLibraryProgressJob.cpp; sourceTree = "<group>"; }; + 399442681A8DD920006C39E9 /* VideoLibraryProgressJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoLibraryProgressJob.h; sourceTree = "<group>"; }; + 399442691A8DD920006C39E9 /* VideoLibraryScanningJob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoLibraryScanningJob.cpp; sourceTree = "<group>"; }; + 3994426A1A8DD920006C39E9 /* VideoLibraryScanningJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoLibraryScanningJob.h; sourceTree = "<group>"; }; + 3994427D1A8DD96F006C39E9 /* VideoLibraryQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoLibraryQueue.cpp; sourceTree = "<group>"; }; + 3994427E1A8DD96F006C39E9 /* VideoLibraryQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoLibraryQueue.h; sourceTree = "<group>"; }; 42DAC16B1A6E780C0066B4C8 /* IActionListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IActionListener.h; sourceTree = "<group>"; }; 42DAC16C1A6E789E0066B4C8 /* PVRActionListener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PVRActionListener.cpp; sourceTree = "<group>"; }; 42DAC16D1A6E789E0066B4C8 /* PVRActionListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVRActionListener.h; sourceTree = "<group>"; }; @@ -4102,8 +3672,6 @@ 43348AA91077486D00F859CF /* PlayerCoreFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlayerCoreFactory.h; path = playercorefactory/PlayerCoreFactory.h; sourceTree = "<group>"; }; 43348AAA1077486D00F859CF /* PlayerSelectionRule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PlayerSelectionRule.cpp; path = playercorefactory/PlayerSelectionRule.cpp; sourceTree = "<group>"; }; 43348AAB1077486D00F859CF /* PlayerSelectionRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlayerSelectionRule.h; path = playercorefactory/PlayerSelectionRule.h; sourceTree = "<group>"; }; - 43352CE61071545C00706B8A /* squish.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = squish.h; path = libsquish/squish.h; sourceTree = "<group>"; }; - 43352CED1071634600706B8A /* libsquish.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsquish.a; path = lib/libsquish/libsquish.a; sourceTree = "<group>"; }; 436721A612D66A09002508E6 /* IAnnouncer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IAnnouncer.h; sourceTree = "<group>"; }; 436B38F3106628850049AB3B /* EndianSwap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EndianSwap.h; sourceTree = "<group>"; }; 43BF09DD1080D39300E25290 /* fastmemcpy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fastmemcpy.h; sourceTree = "<group>"; }; @@ -4689,8 +4257,6 @@ AE89ACA51621DAB800E17DBC /* DVDDemuxBXA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDDemuxBXA.h; sourceTree = "<group>"; }; AEC0083015ACAC6E0099888C /* TagLoaderTagLib.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TagLoaderTagLib.cpp; sourceTree = "<group>"; }; AEC0083315ACAC7C0099888C /* TagLoaderTagLib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TagLoaderTagLib.h; sourceTree = "<group>"; }; - B5011E3A19AA496D005ADF89 /* MarkWatchedJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarkWatchedJob.h; sourceTree = "<group>"; }; - B5011E3B19AA4989005ADF89 /* MarkWatchedJob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MarkWatchedJob.cpp; sourceTree = "<group>"; }; B5011E3F19AF3B56005ADF89 /* PosixFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PosixFile.cpp; sourceTree = "<group>"; }; B5011E4019AF3B56005ADF89 /* PosixFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PosixFile.h; sourceTree = "<group>"; }; B5101B5719DFF8DD00294D1E /* BlurayFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BlurayFile.cpp; sourceTree = "<group>"; }; @@ -4801,6 +4367,10 @@ C8EC5D0D1369519D00CCC10D /* XBMC_keytable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XBMC_keytable.h; sourceTree = "<group>"; }; DF00492B162DAEA200A971AD /* PVROperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PVROperations.cpp; sourceTree = "<group>"; }; DF00492C162DAEA200A971AD /* PVROperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVROperations.h; sourceTree = "<group>"; }; + DF02BA601A910623006DCA16 /* VideoSyncIos.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VideoSyncIos.cpp; path = videosync/VideoSyncIos.cpp; sourceTree = "<group>"; }; + DF02BA611A910623006DCA16 /* VideoSyncIos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VideoSyncIos.h; path = videosync/VideoSyncIos.h; sourceTree = "<group>"; }; + DF02BA641A91065F006DCA16 /* VideoSyncOsx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VideoSyncOsx.cpp; path = videosync/VideoSyncOsx.cpp; sourceTree = "<group>"; }; + DF02BA651A91065F006DCA16 /* VideoSyncOsx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VideoSyncOsx.h; path = videosync/VideoSyncOsx.h; sourceTree = "<group>"; }; DF033D361946612400BFC82E /* AEDeviceEnumerationOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AEDeviceEnumerationOSX.cpp; path = Sinks/osx/AEDeviceEnumerationOSX.cpp; sourceTree = "<group>"; }; DF033D371946612400BFC82E /* AEDeviceEnumerationOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AEDeviceEnumerationOSX.h; path = Sinks/osx/AEDeviceEnumerationOSX.h; sourceTree = "<group>"; }; DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokevideobackground.cpp; sourceTree = "<group>"; }; @@ -5058,8 +4628,6 @@ DF9A71EC1639C8F6005ECB2E /* HTTPFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPFile.cpp; sourceTree = "<group>"; }; DF9A71ED1639C8F6005ECB2E /* HTTPFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPFile.h; sourceTree = "<group>"; }; DFA0E8C219FD6BEE00269A92 /* VideoSync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VideoSync.h; path = videosync/VideoSync.h; sourceTree = "<group>"; }; - DFA0E8C319FD6BEE00269A92 /* VideoSyncCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VideoSyncCocoa.cpp; path = videosync/VideoSyncCocoa.cpp; sourceTree = "<group>"; }; - DFA0E8C419FD6BEE00269A92 /* VideoSyncCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VideoSyncCocoa.h; path = videosync/VideoSyncCocoa.h; sourceTree = "<group>"; }; DFA8157C16713B1200E4E597 /* WakeOnAccess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WakeOnAccess.cpp; sourceTree = "<group>"; }; DFA8157D16713B1200E4E597 /* WakeOnAccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WakeOnAccess.h; sourceTree = "<group>"; }; DFAB049613F8376700B70BFB /* InertialScrollingHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InertialScrollingHandler.cpp; sourceTree = "<group>"; }; @@ -6343,7 +5911,6 @@ files = ( E38E256D0D263A1C00618676 /* librtv.a in Frameworks */, E38E25690D2639F100618676 /* libxdaap.a in Frameworks */, - 43352CEE1071634600706B8A /* libsquish.a in Frameworks */, 18404DA61396C31B00863BBA /* SlingboxLib.a in Frameworks */, F56C8CE7131F5DC6000AD0F6 /* libz.dylib in Frameworks */, F5364D55155B3C7B0016D00B /* libm.dylib in Frameworks */, @@ -6384,7 +5951,6 @@ DFF0EC531752821B002DA3A4 /* Foundation.framework in Frameworks */, DFF0EC891752822E002DA3A4 /* UIKit.framework in Frameworks */, DFF0ECA4175282AD002DA3A4 /* librtv.a in Frameworks */, - DFF0ECA5175282AD002DA3A4 /* libsquish.a in Frameworks */, DFF0ECA6175282AD002DA3A4 /* libxdaap.a in Frameworks */, DFF0ECA7175282AD002DA3A4 /* SlingboxLib.a in Frameworks */, ); @@ -6409,7 +5975,6 @@ E49910F8174E561500741B6D /* libz.dylib in Frameworks */, E49910F9174E561D00741B6D /* libiconv.dylib in Frameworks */, E499157E174E681200741B6D /* librtv.a in Frameworks */, - E499157F174E681600741B6D /* libsquish.a in Frameworks */, E4991580174E681600741B6D /* libxdaap.a in Frameworks */, E4991581174E681600741B6D /* SlingboxLib.a in Frameworks */, DFF0EBB7175281E1002DA3A4 /* CoreAudio.framework in Frameworks */, @@ -6872,6 +6437,23 @@ path = pthreads; sourceTree = "<group>"; }; + 3994425F1A8DD920006C39E9 /* jobs */ = { + isa = PBXGroup; + children = ( + 399442611A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp */, + 399442621A8DD920006C39E9 /* VideoLibraryCleaningJob.h */, + 399442631A8DD920006C39E9 /* VideoLibraryJob.cpp */, + 399442641A8DD920006C39E9 /* VideoLibraryJob.h */, + 399442651A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp */, + 399442661A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.h */, + 399442671A8DD920006C39E9 /* VideoLibraryProgressJob.cpp */, + 399442681A8DD920006C39E9 /* VideoLibraryProgressJob.h */, + 399442691A8DD920006C39E9 /* VideoLibraryScanningJob.cpp */, + 3994426A1A8DD920006C39E9 /* VideoLibraryScanningJob.h */, + ); + path = jobs; + sourceTree = "<group>"; + }; 430C880812D649B10098821A /* powermanagement */ = { isa = PBXGroup; children = ( @@ -7261,6 +6843,7 @@ 43FAC85D12D62F4300F67914 /* video */ = { isa = PBXGroup; children = ( + 3994425F1A8DD920006C39E9 /* jobs */, 43FAC88612D6363B00F67914 /* dialogs */, DFA0E8C619FD6BFC00269A92 /* videosync */, 43FAC88812D6364800F67914 /* windows */, @@ -7285,6 +6868,8 @@ E38E1E960D25F9FD00618676 /* VideoInfoScanner.h */, E38E1E970D25F9FD00618676 /* VideoInfoTag.cpp */, E38E1E980D25F9FD00618676 /* VideoInfoTag.h */, + 3994427D1A8DD96F006C39E9 /* VideoLibraryQueue.cpp */, + 3994427E1A8DD96F006C39E9 /* VideoLibraryQueue.h */, F59876BF0FBA351D008EF4FB /* VideoReferenceClock.cpp */, F59876BE0FBA351D008EF4FB /* VideoReferenceClock.h */, 7CC30DBE16291C2C003E7579 /* VideoThumbLoader.cpp */, @@ -8370,8 +7955,10 @@ isa = PBXGroup; children = ( DFA0E8C219FD6BEE00269A92 /* VideoSync.h */, - DFA0E8C319FD6BEE00269A92 /* VideoSyncCocoa.cpp */, - DFA0E8C419FD6BEE00269A92 /* VideoSyncCocoa.h */, + DF02BA601A910623006DCA16 /* VideoSyncIos.cpp */, + DF02BA611A910623006DCA16 /* VideoSyncIos.h */, + DF02BA641A91065F006DCA16 /* VideoSyncOsx.cpp */, + DF02BA651A91065F006DCA16 /* VideoSyncOsx.h */, ); name = videosync; sourceTree = "<group>"; @@ -9481,7 +9068,6 @@ E38E196D0D25F9FB00618676 /* libhdhomerun */, F551106A0F5C424700955236 /* libhts */, E38E1A130D25F9FB00618676 /* libRTV */, - F5E55E601076B34F006E788A /* libsquish */, E38E1A550D25F9FB00618676 /* libUPnP */, E38E1C840D25F9FC00618676 /* libXDAAP */, E38E1CE40D25F9FC00618676 /* UnrarXLib */, @@ -9756,9 +9342,7 @@ children = ( DF56EF221A798A5E00CAAEFB /* HttpRangeUtils.cpp */, DF56EF231A798A5E00CAAEFB /* HttpRangeUtils.h */, - B5011E3B19AA4989005ADF89 /* MarkWatchedJob.cpp */, B542632E19917D3500726998 /* params_check_macros.h */, - B5011E3A19AA496D005ADF89 /* MarkWatchedJob.h */, F5CC22FB18150065006B5E91 /* ActorProtocol.cpp */, F5CC22FC18150065006B5E91 /* ActorProtocol.h */, E38E1E230D25F9FD00618676 /* AlarmClock.cpp */, @@ -9858,6 +9442,8 @@ E38E1E720D25F9FD00618676 /* PerformanceStats.h */, F5ED908C15538E2300842059 /* POUtils.cpp */, F5ED908D15538E2300842059 /* POUtils.h */, + 399442591A8DD8D0006C39E9 /* ProgressJob.cpp */, + 3994425A1A8DD8D0006C39E9 /* ProgressJob.h */, 18ACF84113596C9B00B67371 /* RecentlyAddedJob.cpp */, 18ACF84213596C9B00B67371 /* RecentlyAddedJob.h */, E38E1E730D25F9FD00618676 /* RegExp.cpp */, @@ -10170,7 +9756,6 @@ isa = PBXGroup; children = ( E38E256C0D263A1C00618676 /* librtv.a */, - 43352CED1071634600706B8A /* libsquish.a */, E38E25680D2639F100618676 /* libxdaap.a */, 18404DA51396C31B00863BBA /* SlingboxLib.a */, ); @@ -10329,14 +9914,6 @@ path = dialogs; sourceTree = "<group>"; }; - F5E55E601076B34F006E788A /* libsquish */ = { - isa = PBXGroup; - children = ( - 43352CE61071545C00706B8A /* squish.h */, - ); - name = libsquish; - sourceTree = "<group>"; - }; F5E56B11108284E6006E788A /* playercorefactory */ = { isa = PBXGroup; children = ( @@ -10452,18 +10029,15 @@ files = ( DFF0F49D1752838E002DA3A4 /* InfoPlist.strings in Resources */, DFFA43FF19104C0800C3923B /* AppIcon.png in Resources */, - 7CCDA1AE192753E30074CF51 /* process_scpds.sh in Resources */, 7CCDA1B9192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.xml in Resources */, 7CCDA1C4192753E30074CF51 /* AVTransportSCPD.xml in Resources */, 7CCDA1C6192753E30074CF51 /* AVTransportSCPDFull.xml in Resources */, - 7CCDA1DA192753E30074CF51 /* process_scpds.sh in Resources */, 7CCDA1E5192753E30074CF51 /* RdrConnectionManagerSCPD.xml in Resources */, 7CCDA1F0192753E30074CF51 /* RenderingControlSCPD.xml in Resources */, 7CCDA1F2192753E30074CF51 /* RenderingControlSCPD_Full.xml in Resources */, 7CCDA1FD192753E30074CF51 /* ConnectionManagerSCPD.xml in Resources */, 7CCDA208192753E30074CF51 /* ContentDirectorySCPD.xml in Resources */, 7CCDA213192753E30074CF51 /* ContentDirectorywSearchSCPD.xml in Resources */, - 7CCDA254192753E30074CF51 /* process_scpds.sh in Resources */, 7CCDA757192756250074CF51 /* README.txt in Resources */, 7CCDA759192756250074CF51 /* SConstruct in Resources */, ); @@ -10489,11 +10063,9 @@ DFFA440C19104C1300C3923B /* AppIcon72x72@2x.png in Resources */, DFFA440D19104C1300C3923B /* AppIcon76x76.png in Resources */, DFFA440E19104C1300C3923B /* AppIcon76x76@2x.png in Resources */, - 7CCDA1AD192753E30074CF51 /* process_scpds.sh in Resources */, 7CCDA1B8192753E30074CF51 /* X_MS_MediaReceiverRegistrarSCPD.xml in Resources */, 7CCDA1C3192753E30074CF51 /* AVTransportSCPD.xml in Resources */, 7CCDA1C5192753E30074CF51 /* AVTransportSCPDFull.xml in Resources */, - 7CCDA1D9192753E30074CF51 /* process_scpds.sh in Resources */, DFD7C7AE19D1DDA90071942C /* Default-736h@3x.png in Resources */, DFD7C7AD19D1DDA90071942C /* Default-667h@2x.png in Resources */, 7CCDA1E4192753E30074CF51 /* RdrConnectionManagerSCPD.xml in Resources */, @@ -10502,7 +10074,6 @@ 7CCDA1FC192753E30074CF51 /* ConnectionManagerSCPD.xml in Resources */, 7CCDA207192753E30074CF51 /* ContentDirectorySCPD.xml in Resources */, 7CCDA212192753E30074CF51 /* ContentDirectorywSearchSCPD.xml in Resources */, - 7CCDA253192753E30074CF51 /* process_scpds.sh in Resources */, 7CCDA756192756250074CF51 /* README.txt in Resources */, 7CCDA758192756250074CF51 /* SConstruct in Resources */, ); @@ -10731,6 +10302,7 @@ buildActionMask = 2147483647; files = ( E38E1F370D25F9FD00618676 /* Application.cpp in Sources */, + 399442771A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */, E38E1F380D25F9FD00618676 /* ApplicationMessenger.cpp in Sources */, E38E1F3C0D25F9FD00618676 /* Autorun.cpp in Sources */, E38E1F3D0D25F9FD00618676 /* AutoSwitch.cpp in Sources */, @@ -10906,6 +10478,7 @@ E38E209A0D25F9FD00618676 /* GUIDialogSongInfo.cpp in Sources */, E38E209B0D25F9FD00618676 /* GUIDialogSubMenu.cpp in Sources */, E38E209D0D25F9FD00618676 /* GUIDialogVideoBookmarks.cpp in Sources */, + 3994426E1A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp in Sources */, E38E20A00D25F9FD00618676 /* GUIDialogVisualisationPresetList.cpp in Sources */, E38E20A20D25F9FD00618676 /* GUIDialogVolumeBar.cpp in Sources */, E38E20A30D25F9FD00618676 /* GUIDialogYesNo.cpp in Sources */, @@ -11266,6 +10839,7 @@ 18B7C7DC1294222E009E7A26 /* GUIShader.cpp in Sources */, 18B7C7DD1294222E009E7A26 /* GUISliderControl.cpp in Sources */, 18B7C7DF1294222E009E7A26 /* GUISpinControl.cpp in Sources */, + 399442711A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */, 18B7C7E01294222E009E7A26 /* GUISpinControlEx.cpp in Sources */, 18B7C7E21294222E009E7A26 /* GUIStaticItem.cpp in Sources */, 18B7C7E31294222E009E7A26 /* GUITextBox.cpp in Sources */, @@ -11410,6 +10984,7 @@ DF93D6991444A8B1007C6459 /* AFPFile.cpp in Sources */, DF93D69A1444A8B1007C6459 /* DirectoryCache.cpp in Sources */, DF93D69B1444A8B1007C6459 /* FileCache.cpp in Sources */, + 3994427A1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */, DF93D69C1444A8B1007C6459 /* CDDAFile.cpp in Sources */, DF93D69D1444A8B1007C6459 /* CurlFile.cpp in Sources */, DF93D69E1444A8B1007C6459 /* DAAPFile.cpp in Sources */, @@ -11509,6 +11084,7 @@ DF830D0C15BB260C00602BE6 /* GUIDialogKeyboardGeneric.cpp in Sources */, DF830D1215BB262700602BE6 /* GUIKeyboardFactory.cpp in Sources */, 36A9466315CF1FA600727135 /* DbUrl.cpp in Sources */, + 3994427F1A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */, 36A9466715CF1FD200727135 /* MusicDbUrl.cpp in Sources */, 36A9466A15CF1FED00727135 /* UrlOptions.cpp in Sources */, 36A9466D15CF201F00727135 /* VideoDbUrl.cpp in Sources */, @@ -11554,6 +11130,7 @@ DFB25D40163D4743006C4A48 /* ModuleXbmcvfs.cpp in Sources */, DFB25D41163D4743006C4A48 /* Monitor.cpp in Sources */, DFB25D42163D4743006C4A48 /* Player.cpp in Sources */, + 3994425B1A8DD8D0006C39E9 /* ProgressJob.cpp in Sources */, DFB25D43163D4743006C4A48 /* PlayList.cpp in Sources */, DFB25D44163D4743006C4A48 /* String.cpp in Sources */, DFB25D45163D4743006C4A48 /* Window.cpp in Sources */, @@ -11694,6 +11271,7 @@ 7CCDA123192753E30074CF51 /* PltEvent.cpp in Sources */, 7CCDA12C192753E30074CF51 /* PltHttp.cpp in Sources */, 7CCDA135192753E30074CF51 /* PltHttpClientTask.cpp in Sources */, + DF02BA661A91065F006DCA16 /* VideoSyncOsx.cpp in Sources */, 7CCDA13E192753E30074CF51 /* PltHttpServer.cpp in Sources */, 7CCDA147192753E30074CF51 /* PltHttpServerTask.cpp in Sources */, 7CCDA150192753E30074CF51 /* PltIconsData.cpp in Sources */, @@ -11718,7 +11296,6 @@ 7CCDA209192753E30074CF51 /* ContentDirectorywSearchSCPD.cpp in Sources */, 7CCDA214192753E30074CF51 /* PltDidl.cpp in Sources */, 7CCDA21D192753E30074CF51 /* PltFileMediaServer.cpp in Sources */, - DFA0E8C519FD6BEE00269A92 /* VideoSyncCocoa.cpp in Sources */, 7CCDA226192753E30074CF51 /* PltMediaBrowser.cpp in Sources */, 7CCDA22F192753E30074CF51 /* PltMediaCache.cpp in Sources */, 7CCDA238192753E30074CF51 /* PltMediaItem.cpp in Sources */, @@ -11735,6 +11312,7 @@ DF4BF0161A4EF30F0053AC56 /* cc_decoder708.cpp in Sources */, 7CCDA7AF192756250074CF51 /* NptDebug.cpp in Sources */, 7CCDA7B8192756250074CF51 /* NptDigest.cpp in Sources */, + 399442741A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */, 7CCDA7BB192756250074CF51 /* NptDynamicLibraries.cpp in Sources */, 7CCDA7BE192756250074CF51 /* NptFile.cpp in Sources */, 7CCDA7C7192756250074CF51 /* NptHash.cpp in Sources */, @@ -11759,159 +11337,7 @@ 7CCDA85A192756250074CF51 /* NptUtils.cpp in Sources */, 7CCDA863192756250074CF51 /* NptXml.cpp in Sources */, 7CCDA86C192756250074CF51 /* NptZip.cpp in Sources */, - 7CCDA86F192756250074CF51 /* NptTlsTrustAnchor_Base_0000.cpp in Sources */, - 7CCDA872192756250074CF51 /* NptTlsTrustAnchor_Base_0001.cpp in Sources */, - B5011E3C19AA4989005ADF89 /* MarkWatchedJob.cpp in Sources */, - 7CCDA875192756250074CF51 /* NptTlsTrustAnchor_Base_0002.cpp in Sources */, - 7CCDA878192756250074CF51 /* NptTlsTrustAnchor_Base_0003.cpp in Sources */, - 7CCDA87B192756250074CF51 /* NptTlsTrustAnchor_Base_0004.cpp in Sources */, - 7CCDA87E192756250074CF51 /* NptTlsTrustAnchor_Base_0005.cpp in Sources */, - 7CCDA881192756250074CF51 /* NptTlsTrustAnchor_Base_0006.cpp in Sources */, - 7CCDA884192756250074CF51 /* NptTlsTrustAnchor_Base_0007.cpp in Sources */, - 7CCDA887192756250074CF51 /* NptTlsTrustAnchor_Base_0008.cpp in Sources */, - 7CCDA88A192756250074CF51 /* NptTlsTrustAnchor_Base_0009.cpp in Sources */, - 7CCDA88D192756250074CF51 /* NptTlsTrustAnchor_Base_0010.cpp in Sources */, - 7CCDA890192756250074CF51 /* NptTlsTrustAnchor_Base_0011.cpp in Sources */, - 7CCDA893192756250074CF51 /* NptTlsTrustAnchor_Base_0012.cpp in Sources */, - 7CCDA896192756250074CF51 /* NptTlsTrustAnchor_Base_0013.cpp in Sources */, - 7CCDA899192756250074CF51 /* NptTlsTrustAnchor_Base_0014.cpp in Sources */, - 7CCDA89C192756250074CF51 /* NptTlsTrustAnchor_Base_0015.cpp in Sources */, - 7CCDA89F192756250074CF51 /* NptTlsTrustAnchor_Base_0016.cpp in Sources */, - 7CCDA8A2192756250074CF51 /* NptTlsTrustAnchor_Base_0017.cpp in Sources */, - 7CCDA8A5192756250074CF51 /* NptTlsTrustAnchor_Base_0018.cpp in Sources */, - 7CCDA8A8192756250074CF51 /* NptTlsTrustAnchor_Base_0019.cpp in Sources */, - 7CCDA8AB192756250074CF51 /* NptTlsTrustAnchor_Base_0020.cpp in Sources */, - 7CCDA8AE192756250074CF51 /* NptTlsTrustAnchor_Base_0021.cpp in Sources */, - 7CCDA8B1192756250074CF51 /* NptTlsTrustAnchor_Base_0022.cpp in Sources */, - 7CCDA8B4192756250074CF51 /* NptTlsTrustAnchor_Base_0023.cpp in Sources */, - 7CCDA8B7192756250074CF51 /* NptTlsTrustAnchor_Base_0024.cpp in Sources */, - 7CCDA8BA192756250074CF51 /* NptTlsTrustAnchor_Base_0025.cpp in Sources */, - 7CCDA8BD192756250074CF51 /* NptTlsTrustAnchor_Base_0026.cpp in Sources */, - 7CCDA8C0192756250074CF51 /* NptTlsTrustAnchor_Base_0027.cpp in Sources */, - 7CCDA8C3192756250074CF51 /* NptTlsTrustAnchor_Base_0028.cpp in Sources */, - 7CCDA8C6192756250074CF51 /* NptTlsTrustAnchor_Base_0029.cpp in Sources */, - 7CCDA8C9192756250074CF51 /* NptTlsTrustAnchor_Base_0030.cpp in Sources */, - 7CCDA8CC192756250074CF51 /* NptTlsTrustAnchor_Base_0031.cpp in Sources */, - 7CCDA8CF192756250074CF51 /* NptTlsTrustAnchor_Base_0032.cpp in Sources */, - 7CCDA8D2192756250074CF51 /* NptTlsTrustAnchor_Base_0033.cpp in Sources */, - 7CCDA8D5192756250074CF51 /* NptTlsTrustAnchor_Base_0034.cpp in Sources */, DF56EF1F1A798A3F00CAAEFB /* HTTPFileHandler.cpp in Sources */, - 7CCDA8D8192756250074CF51 /* NptTlsTrustAnchor_Base_0035.cpp in Sources */, - 7CCDA8DB192756250074CF51 /* NptTlsTrustAnchor_Base_0036.cpp in Sources */, - 7CCDA8DE192756250074CF51 /* NptTlsTrustAnchor_Base_0037.cpp in Sources */, - 7CCDA8E1192756250074CF51 /* NptTlsTrustAnchor_Base_0038.cpp in Sources */, - 7CCDA8E4192756250074CF51 /* NptTlsTrustAnchor_Base_0039.cpp in Sources */, - 7CCDA8E7192756250074CF51 /* NptTlsTrustAnchor_Base_0040.cpp in Sources */, - 7CCDA8EA192756250074CF51 /* NptTlsTrustAnchor_Base_0041.cpp in Sources */, - 7CCDA8ED192756250074CF51 /* NptTlsTrustAnchor_Base_0042.cpp in Sources */, - 7CCDA8F0192756250074CF51 /* NptTlsTrustAnchor_Base_0043.cpp in Sources */, - 7CCDA8F3192756250074CF51 /* NptTlsTrustAnchor_Base_0044.cpp in Sources */, - 7CCDA8F6192756250074CF51 /* NptTlsTrustAnchor_Base_0045.cpp in Sources */, - 7CCDA8F9192756250074CF51 /* NptTlsTrustAnchor_Base_0046.cpp in Sources */, - 7CCDA8FC192756250074CF51 /* NptTlsTrustAnchor_Base_0047.cpp in Sources */, - 7CCDA8FF192756250074CF51 /* NptTlsTrustAnchor_Base_0048.cpp in Sources */, - 7CCDA902192756250074CF51 /* NptTlsTrustAnchor_Base_0049.cpp in Sources */, - 7CCDA905192756250074CF51 /* NptTlsTrustAnchor_Base_0050.cpp in Sources */, - 7CCDA908192756250074CF51 /* NptTlsTrustAnchor_Base_0051.cpp in Sources */, - 7CCDA90B192756250074CF51 /* NptTlsTrustAnchor_Base_0052.cpp in Sources */, - 7CCDA90E192756250074CF51 /* NptTlsTrustAnchor_Base_0053.cpp in Sources */, - 7CCDA911192756250074CF51 /* NptTlsTrustAnchor_Base_0054.cpp in Sources */, - 7CCDA914192756250074CF51 /* NptTlsTrustAnchor_Base_0055.cpp in Sources */, - 7CCDA917192756250074CF51 /* NptTlsTrustAnchor_Base_0056.cpp in Sources */, - 7CCDA91A192756250074CF51 /* NptTlsTrustAnchor_Base_0057.cpp in Sources */, - 7CCDA91D192756250074CF51 /* NptTlsTrustAnchor_Base_0058.cpp in Sources */, - 7CCDA920192756250074CF51 /* NptTlsTrustAnchor_Base_0059.cpp in Sources */, - 7CCDA923192756250074CF51 /* NptTlsTrustAnchor_Base_0060.cpp in Sources */, - 7CCDA926192756250074CF51 /* NptTlsTrustAnchor_Base_0061.cpp in Sources */, - 7CCDA929192756250074CF51 /* NptTlsTrustAnchor_Base_0062.cpp in Sources */, - 7CCDA92C192756250074CF51 /* NptTlsTrustAnchor_Base_0063.cpp in Sources */, - 7CCDA92F192756250074CF51 /* NptTlsTrustAnchor_Base_0064.cpp in Sources */, - 7CCDA932192756250074CF51 /* NptTlsTrustAnchor_Base_0065.cpp in Sources */, - 7CCDA935192756250074CF51 /* NptTlsTrustAnchor_Base_0066.cpp in Sources */, - 7CCDA938192756250074CF51 /* NptTlsTrustAnchor_Base_0067.cpp in Sources */, - 7CCDA93B192756250074CF51 /* NptTlsTrustAnchor_Base_0068.cpp in Sources */, - 7CCDA93E192756250074CF51 /* NptTlsTrustAnchor_Base_0069.cpp in Sources */, - 7CCDA941192756250074CF51 /* NptTlsTrustAnchor_Base_0070.cpp in Sources */, - 7CCDA944192756250074CF51 /* NptTlsTrustAnchor_Base_0071.cpp in Sources */, - 7CCDA947192756250074CF51 /* NptTlsTrustAnchor_Base_0072.cpp in Sources */, - 7CCDA94A192756250074CF51 /* NptTlsTrustAnchor_Base_0073.cpp in Sources */, - 7CCDA94D192756250074CF51 /* NptTlsTrustAnchor_Base_0074.cpp in Sources */, - 7CCDA950192756250074CF51 /* NptTlsTrustAnchor_Base_0075.cpp in Sources */, - 7CCDA953192756250074CF51 /* NptTlsTrustAnchor_Base_0076.cpp in Sources */, - 7CCDA956192756250074CF51 /* NptTlsTrustAnchor_Base_0077.cpp in Sources */, - 7CCDA959192756250074CF51 /* NptTlsTrustAnchor_Base_0078.cpp in Sources */, - 7CCDA95C192756250074CF51 /* NptTlsTrustAnchor_Base_0079.cpp in Sources */, - 7CCDA95F192756250074CF51 /* NptTlsTrustAnchor_Base_0080.cpp in Sources */, - 7CCDA962192756250074CF51 /* NptTlsTrustAnchor_Base_0081.cpp in Sources */, - 7CCDA965192756250074CF51 /* NptTlsTrustAnchor_Base_0082.cpp in Sources */, - 7CCDA968192756250074CF51 /* NptTlsTrustAnchor_Base_0083.cpp in Sources */, - 7CCDA96B192756250074CF51 /* NptTlsTrustAnchor_Base_0084.cpp in Sources */, - 7CCDA96E192756250074CF51 /* NptTlsTrustAnchor_Base_0085.cpp in Sources */, - 7CCDA971192756250074CF51 /* NptTlsTrustAnchor_Base_0086.cpp in Sources */, - 7CCDA974192756250074CF51 /* NptTlsTrustAnchor_Base_0087.cpp in Sources */, - 7CCDA977192756250074CF51 /* NptTlsTrustAnchor_Base_0088.cpp in Sources */, - 7CCDA97A192756250074CF51 /* NptTlsTrustAnchor_Base_0089.cpp in Sources */, - 7CCDA97D192756250074CF51 /* NptTlsTrustAnchor_Base_0090.cpp in Sources */, - 7CCDA980192756250074CF51 /* NptTlsTrustAnchor_Base_0091.cpp in Sources */, - 7CCDA983192756250074CF51 /* NptTlsTrustAnchor_Base_0092.cpp in Sources */, - 7CCDA986192756250074CF51 /* NptTlsTrustAnchor_Base_0093.cpp in Sources */, - 7CCDA989192756250074CF51 /* NptTlsTrustAnchor_Base_0094.cpp in Sources */, - 7CCDA98C192756250074CF51 /* NptTlsTrustAnchor_Base_0095.cpp in Sources */, - 7CCDA98F192756250074CF51 /* NptTlsTrustAnchor_Base_0096.cpp in Sources */, - 7CCDA992192756250074CF51 /* NptTlsTrustAnchor_Base_0097.cpp in Sources */, - 7CCDA995192756250074CF51 /* NptTlsTrustAnchor_Base_0098.cpp in Sources */, - 7CCDA998192756250074CF51 /* NptTlsTrustAnchor_Base_0099.cpp in Sources */, - 7CCDA99B192756250074CF51 /* NptTlsTrustAnchor_Base_0100.cpp in Sources */, - 7CCDA99E192756250074CF51 /* NptTlsTrustAnchor_Base_0101.cpp in Sources */, - 7CCDA9A1192756250074CF51 /* NptTlsTrustAnchor_Base_0102.cpp in Sources */, - 7CCDA9A4192756250074CF51 /* NptTlsTrustAnchor_Base_0103.cpp in Sources */, - 7CCDA9A7192756250074CF51 /* NptTlsTrustAnchor_Base_0104.cpp in Sources */, - 7CCDA9AA192756250074CF51 /* NptTlsTrustAnchor_Base_0105.cpp in Sources */, - 7CCDA9AD192756250074CF51 /* NptTlsTrustAnchor_Base_0106.cpp in Sources */, - 7CCDA9B0192756250074CF51 /* NptTlsTrustAnchor_Base_0107.cpp in Sources */, - 7CCDA9B3192756250074CF51 /* NptTlsTrustAnchor_Base_0108.cpp in Sources */, - 7CCDA9B6192756250074CF51 /* NptTlsTrustAnchor_Base_0109.cpp in Sources */, - 7CCDA9B9192756250074CF51 /* NptTlsTrustAnchor_Base_0110.cpp in Sources */, - 7CCDA9BC192756250074CF51 /* NptTlsTrustAnchor_Base_0111.cpp in Sources */, - 7CCDA9BF192756250074CF51 /* NptTlsTrustAnchor_Base_0112.cpp in Sources */, - 7CCDA9C2192756250074CF51 /* NptTlsTrustAnchor_Base_0113.cpp in Sources */, - 7CCDA9C5192756250074CF51 /* NptTlsTrustAnchor_Base_0114.cpp in Sources */, - 7CCDA9C8192756250074CF51 /* NptTlsTrustAnchor_Base_0115.cpp in Sources */, - 7CCDA9CB192756250074CF51 /* NptTlsTrustAnchor_Base_0116.cpp in Sources */, - 7CCDA9CE192756250074CF51 /* NptTlsTrustAnchor_Base_0117.cpp in Sources */, - 7CCDA9D1192756250074CF51 /* NptTlsTrustAnchor_Base_0118.cpp in Sources */, - 7CCDA9D4192756250074CF51 /* NptTlsTrustAnchor_Base_0119.cpp in Sources */, - 7CCDA9D7192756250074CF51 /* NptTlsTrustAnchor_Base_0120.cpp in Sources */, - 7CCDA9DA192756250074CF51 /* NptTlsTrustAnchor_Base_0121.cpp in Sources */, - 7CCDA9DD192756250074CF51 /* NptTlsTrustAnchor_Base_0122.cpp in Sources */, - 7CCDA9E0192756250074CF51 /* NptTlsTrustAnchor_Base_0123.cpp in Sources */, - 7CCDA9E3192756250074CF51 /* NptTlsTrustAnchor_Base_0124.cpp in Sources */, - 7CCDA9E6192756250074CF51 /* NptTlsTrustAnchor_Base_0125.cpp in Sources */, - 7CCDA9E9192756250074CF51 /* NptTlsTrustAnchor_Base_0126.cpp in Sources */, - 7CCDA9EC192756250074CF51 /* NptTlsTrustAnchor_Base_0127.cpp in Sources */, - 7CCDA9EF192756250074CF51 /* NptTlsTrustAnchor_Base_0128.cpp in Sources */, - 7CCDA9F2192756250074CF51 /* NptTlsTrustAnchor_Base_0129.cpp in Sources */, - 7CCDA9F5192756250074CF51 /* NptTlsTrustAnchor_Base_0130.cpp in Sources */, - 7CCDA9F8192756250074CF51 /* NptTlsTrustAnchor_Base_0131.cpp in Sources */, - 7CCDA9FB192756250074CF51 /* NptTlsTrustAnchor_Base_0132.cpp in Sources */, - 7CCDA9FE192756250074CF51 /* NptTlsTrustAnchor_Base_0133.cpp in Sources */, - 7CCDAA01192756250074CF51 /* NptTlsTrustAnchor_Base_0134.cpp in Sources */, - 7CCDAA04192756250074CF51 /* NptTlsTrustAnchor_Base_0135.cpp in Sources */, - 7CCDAA07192756250074CF51 /* NptTlsTrustAnchor_Extended_0000.cpp in Sources */, - 7CCDAA0A192756250074CF51 /* NptTlsTrustAnchor_Extended_0001.cpp in Sources */, - 7CCDAA0D192756250074CF51 /* NptTlsTrustAnchor_Extended_0002.cpp in Sources */, - 7CCDAA10192756250074CF51 /* NptTlsTrustAnchor_Extended_0003.cpp in Sources */, - 7CCDAA13192756250074CF51 /* NptTlsTrustAnchor_Extended_0004.cpp in Sources */, - 7CCDAA16192756250074CF51 /* NptTlsTrustAnchor_Extended_0005.cpp in Sources */, - 7CCDAA19192756250074CF51 /* NptTlsTrustAnchor_Extended_0006.cpp in Sources */, - 7CCDAA1C192756250074CF51 /* NptTlsTrustAnchor_Extended_0007.cpp in Sources */, - 7CCDAA1F192756250074CF51 /* NptTlsTrustAnchor_Extended_0008.cpp in Sources */, - 7CCDAA22192756250074CF51 /* NptTlsTrustAnchor_Extended_0009.cpp in Sources */, - 7CCDAA25192756250074CF51 /* NptTlsTrustAnchor_Extended_0010.cpp in Sources */, - 7CCDAA28192756250074CF51 /* NptTlsTrustAnchor_Extended_0011.cpp in Sources */, - 7CCDAA2B192756250074CF51 /* NptTlsTrustAnchor_Extended_0012.cpp in Sources */, - 7CCDAA2E192756250074CF51 /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */, - 7CCDAA31192756250074CF51 /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */, 7CCDAA82192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */, 7CCDAA85192756250074CF51 /* NptPosixEnvironment.cpp in Sources */, 7CCDAA8B192756250074CF51 /* NptPosixNetwork.cpp in Sources */, @@ -12011,6 +11437,7 @@ DFF0F13617528350002DA3A4 /* Exception.cpp in Sources */, DFF0F13717528350002DA3A4 /* ilog.cpp in Sources */, DFF0F13817528350002DA3A4 /* AEEncoderFFmpeg.cpp in Sources */, + 399442791A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */, DFF0F13E17528350002DA3A4 /* AEBitstreamPacker.cpp in Sources */, DFF0F13F17528350002DA3A4 /* AEBuffer.cpp in Sources */, DFF0F14017528350002DA3A4 /* AEChannelInfo.cpp in Sources */, @@ -12054,7 +11481,6 @@ DFF0F16F17528350002DA3A4 /* DVDDemuxPVRClient.cpp in Sources */, DFF0F17017528350002DA3A4 /* DVDDemuxShoutcast.cpp in Sources */, DFF0F17117528350002DA3A4 /* DVDDemuxUtils.cpp in Sources */, - DFA0E8C819FD7BD100269A92 /* VideoSyncCocoa.cpp in Sources */, DFF0F17217528350002DA3A4 /* DVDDemuxVobsub.cpp in Sources */, DFF0F17317528350002DA3A4 /* DVDFactoryDemuxer.cpp in Sources */, DFF0F17417528350002DA3A4 /* DVDFactoryInputStream.cpp in Sources */, @@ -12293,6 +11719,7 @@ DFF0F26117528350002DA3A4 /* DirectoryNodeRoot.cpp in Sources */, DFF0F26217528350002DA3A4 /* DirectoryNodeSeasons.cpp in Sources */, DFF0F26317528350002DA3A4 /* DirectoryNodeTitleMovies.cpp in Sources */, + 3994425D1A8DD8D0006C39E9 /* ProgressJob.cpp in Sources */, DFF0F26417528350002DA3A4 /* DirectoryNodeTitleMusicVideos.cpp in Sources */, DFF0F26517528350002DA3A4 /* DirectoryNodeTitleTvShows.cpp in Sources */, DFF0F26617528350002DA3A4 /* DirectoryNodeTvShowsOverview.cpp in Sources */, @@ -12362,6 +11789,7 @@ DFF0F2A517528350002DA3A4 /* GUISelectButtonControl.cpp in Sources */, DFF0F2A617528350002DA3A4 /* GUISettingsSliderControl.cpp in Sources */, DFF0F2A717528350002DA3A4 /* GUIShader.cpp in Sources */, + 399442811A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */, DFF0F2A817528350002DA3A4 /* GUISliderControl.cpp in Sources */, DFF0F2A917528350002DA3A4 /* GUISpinControl.cpp in Sources */, DFF0F2AA17528350002DA3A4 /* GUISpinControlEx.cpp in Sources */, @@ -12496,6 +11924,7 @@ DFF0F32B17528350002DA3A4 /* UPnP.cpp in Sources */, DFF0F32C17528350002DA3A4 /* UPnPInternal.cpp in Sources */, DFF0F32D17528350002DA3A4 /* UPnPPlayer.cpp in Sources */, + DF02BA631A910624006DCA16 /* VideoSyncIos.cpp in Sources */, DFF0F32E17528350002DA3A4 /* UPnPRenderer.cpp in Sources */, DFF0F32F17528350002DA3A4 /* UPnPServer.cpp in Sources */, DFF0F33017528350002DA3A4 /* UPnPSettings.cpp in Sources */, @@ -12583,6 +12012,7 @@ DFF0F38117528350002DA3A4 /* GUIDialogPVRTimerSettings.cpp in Sources */, DFF0F38217528350002DA3A4 /* PVRRecording.cpp in Sources */, DFF0F38317528350002DA3A4 /* PVRRecordings.cpp in Sources */, + 3994427C1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */, DFF0F38417528350002DA3A4 /* PVRTimerInfoTag.cpp in Sources */, DFF0F38517528350002DA3A4 /* PVRTimers.cpp in Sources */, DFF0F38617528350002DA3A4 /* GUIViewStatePVR.cpp in Sources */, @@ -12622,7 +12052,6 @@ DFF0F3B317528350002DA3A4 /* Implementation.cpp in Sources */, DFF0F3B417528350002DA3A4 /* Atomics.cpp in Sources */, DFF0F3B517528350002DA3A4 /* Event.cpp in Sources */, - B5011E3E19AA4989005ADF89 /* MarkWatchedJob.cpp in Sources */, DFF0F3B617528350002DA3A4 /* LockFree.cpp in Sources */, DFF0F3B717528350002DA3A4 /* SystemClock.cpp in Sources */, DFF0F3B817528350002DA3A4 /* Thread.cpp in Sources */, @@ -12660,6 +12089,7 @@ DFF0F3DA17528350002DA3A4 /* JSONVariantWriter.cpp in Sources */, DFF0F3DB17528350002DA3A4 /* LabelFormatter.cpp in Sources */, DFF0F3DC17528350002DA3A4 /* LangCodeExpander.cpp in Sources */, + 399442731A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */, DFF0F3DD17528350002DA3A4 /* LegacyPathTranslation.cpp in Sources */, DFF0F3DE17528350002DA3A4 /* log.cpp in Sources */, DFF0F3DF17528350002DA3A4 /* md5.cpp in Sources */, @@ -12720,6 +12150,7 @@ DFF0F41517528350002DA3A4 /* VideoInfoTag.cpp in Sources */, DFF0F41617528350002DA3A4 /* VideoReferenceClock.cpp in Sources */, DFF0F41717528350002DA3A4 /* VideoThumbLoader.cpp in Sources */, + 399442701A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp in Sources */, DFF0F41817528350002DA3A4 /* GUIViewControl.cpp in Sources */, DFF0F41917528350002DA3A4 /* GUIViewState.cpp in Sources */, DFF0F41A17528350002DA3A4 /* ViewDatabase.cpp in Sources */, @@ -12773,6 +12204,7 @@ DFF0F45117528350002DA3A4 /* XBDateTime.cpp in Sources */, DFF0F45217528350002DA3A4 /* xbmc.cpp in Sources */, DFF0F45317528350002DA3A4 /* XbmcContext.cpp in Sources */, + 399442761A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */, DFF0F45417528350002DA3A4 /* MouseStat.cpp in Sources */, DFF0F45517528350002DA3A4 /* Addon.cpp in Sources */, DFF0F45617528350002DA3A4 /* AddonCallback.cpp in Sources */, @@ -12963,157 +12395,6 @@ 7CCDA85C192756250074CF51 /* NptUtils.cpp in Sources */, 7CCDA865192756250074CF51 /* NptXml.cpp in Sources */, 7CCDA86E192756250074CF51 /* NptZip.cpp in Sources */, - 7CCDA871192756250074CF51 /* NptTlsTrustAnchor_Base_0000.cpp in Sources */, - 7CCDA874192756250074CF51 /* NptTlsTrustAnchor_Base_0001.cpp in Sources */, - 7CCDA877192756250074CF51 /* NptTlsTrustAnchor_Base_0002.cpp in Sources */, - 7CCDA87A192756250074CF51 /* NptTlsTrustAnchor_Base_0003.cpp in Sources */, - 7CCDA87D192756250074CF51 /* NptTlsTrustAnchor_Base_0004.cpp in Sources */, - 7CCDA880192756250074CF51 /* NptTlsTrustAnchor_Base_0005.cpp in Sources */, - 7CCDA883192756250074CF51 /* NptTlsTrustAnchor_Base_0006.cpp in Sources */, - 7CCDA886192756250074CF51 /* NptTlsTrustAnchor_Base_0007.cpp in Sources */, - 7CCDA889192756250074CF51 /* NptTlsTrustAnchor_Base_0008.cpp in Sources */, - 7CCDA88C192756250074CF51 /* NptTlsTrustAnchor_Base_0009.cpp in Sources */, - 7CCDA88F192756250074CF51 /* NptTlsTrustAnchor_Base_0010.cpp in Sources */, - 7CCDA892192756250074CF51 /* NptTlsTrustAnchor_Base_0011.cpp in Sources */, - 7CCDA895192756250074CF51 /* NptTlsTrustAnchor_Base_0012.cpp in Sources */, - 7CCDA898192756250074CF51 /* NptTlsTrustAnchor_Base_0013.cpp in Sources */, - 7CCDA89B192756250074CF51 /* NptTlsTrustAnchor_Base_0014.cpp in Sources */, - 7CCDA89E192756250074CF51 /* NptTlsTrustAnchor_Base_0015.cpp in Sources */, - 7CCDA8A1192756250074CF51 /* NptTlsTrustAnchor_Base_0016.cpp in Sources */, - 7CCDA8A4192756250074CF51 /* NptTlsTrustAnchor_Base_0017.cpp in Sources */, - 7CCDA8A7192756250074CF51 /* NptTlsTrustAnchor_Base_0018.cpp in Sources */, - 7CCDA8AA192756250074CF51 /* NptTlsTrustAnchor_Base_0019.cpp in Sources */, - 7CCDA8AD192756250074CF51 /* NptTlsTrustAnchor_Base_0020.cpp in Sources */, - 7CCDA8B0192756250074CF51 /* NptTlsTrustAnchor_Base_0021.cpp in Sources */, - 7CCDA8B3192756250074CF51 /* NptTlsTrustAnchor_Base_0022.cpp in Sources */, - 7CCDA8B6192756250074CF51 /* NptTlsTrustAnchor_Base_0023.cpp in Sources */, - 7CCDA8B9192756250074CF51 /* NptTlsTrustAnchor_Base_0024.cpp in Sources */, - 7CCDA8BC192756250074CF51 /* NptTlsTrustAnchor_Base_0025.cpp in Sources */, - 7CCDA8BF192756250074CF51 /* NptTlsTrustAnchor_Base_0026.cpp in Sources */, - 7CCDA8C2192756250074CF51 /* NptTlsTrustAnchor_Base_0027.cpp in Sources */, - 7CCDA8C5192756250074CF51 /* NptTlsTrustAnchor_Base_0028.cpp in Sources */, - 7CCDA8C8192756250074CF51 /* NptTlsTrustAnchor_Base_0029.cpp in Sources */, - 7CCDA8CB192756250074CF51 /* NptTlsTrustAnchor_Base_0030.cpp in Sources */, - 7CCDA8CE192756250074CF51 /* NptTlsTrustAnchor_Base_0031.cpp in Sources */, - 7CCDA8D1192756250074CF51 /* NptTlsTrustAnchor_Base_0032.cpp in Sources */, - 7CCDA8D4192756250074CF51 /* NptTlsTrustAnchor_Base_0033.cpp in Sources */, - 7CCDA8D7192756250074CF51 /* NptTlsTrustAnchor_Base_0034.cpp in Sources */, - 7CCDA8DA192756250074CF51 /* NptTlsTrustAnchor_Base_0035.cpp in Sources */, - 7CCDA8DD192756250074CF51 /* NptTlsTrustAnchor_Base_0036.cpp in Sources */, - 7CCDA8E0192756250074CF51 /* NptTlsTrustAnchor_Base_0037.cpp in Sources */, - 7CCDA8E3192756250074CF51 /* NptTlsTrustAnchor_Base_0038.cpp in Sources */, - 7CCDA8E6192756250074CF51 /* NptTlsTrustAnchor_Base_0039.cpp in Sources */, - 7CCDA8E9192756250074CF51 /* NptTlsTrustAnchor_Base_0040.cpp in Sources */, - 7CCDA8EC192756250074CF51 /* NptTlsTrustAnchor_Base_0041.cpp in Sources */, - 7CCDA8EF192756250074CF51 /* NptTlsTrustAnchor_Base_0042.cpp in Sources */, - 7CCDA8F2192756250074CF51 /* NptTlsTrustAnchor_Base_0043.cpp in Sources */, - 7CCDA8F5192756250074CF51 /* NptTlsTrustAnchor_Base_0044.cpp in Sources */, - 7CCDA8F8192756250074CF51 /* NptTlsTrustAnchor_Base_0045.cpp in Sources */, - 7CCDA8FB192756250074CF51 /* NptTlsTrustAnchor_Base_0046.cpp in Sources */, - 7CCDA8FE192756250074CF51 /* NptTlsTrustAnchor_Base_0047.cpp in Sources */, - 7CCDA901192756250074CF51 /* NptTlsTrustAnchor_Base_0048.cpp in Sources */, - 7CCDA904192756250074CF51 /* NptTlsTrustAnchor_Base_0049.cpp in Sources */, - 7CCDA907192756250074CF51 /* NptTlsTrustAnchor_Base_0050.cpp in Sources */, - 7CCDA90A192756250074CF51 /* NptTlsTrustAnchor_Base_0051.cpp in Sources */, - 7CCDA90D192756250074CF51 /* NptTlsTrustAnchor_Base_0052.cpp in Sources */, - 7CCDA910192756250074CF51 /* NptTlsTrustAnchor_Base_0053.cpp in Sources */, - 7CCDA913192756250074CF51 /* NptTlsTrustAnchor_Base_0054.cpp in Sources */, - 7CCDA916192756250074CF51 /* NptTlsTrustAnchor_Base_0055.cpp in Sources */, - 7CCDA919192756250074CF51 /* NptTlsTrustAnchor_Base_0056.cpp in Sources */, - 7CCDA91C192756250074CF51 /* NptTlsTrustAnchor_Base_0057.cpp in Sources */, - 7CCDA91F192756250074CF51 /* NptTlsTrustAnchor_Base_0058.cpp in Sources */, - 7CCDA922192756250074CF51 /* NptTlsTrustAnchor_Base_0059.cpp in Sources */, - 7CCDA925192756250074CF51 /* NptTlsTrustAnchor_Base_0060.cpp in Sources */, - 7CCDA928192756250074CF51 /* NptTlsTrustAnchor_Base_0061.cpp in Sources */, - 7CCDA92B192756250074CF51 /* NptTlsTrustAnchor_Base_0062.cpp in Sources */, - 7CCDA92E192756250074CF51 /* NptTlsTrustAnchor_Base_0063.cpp in Sources */, - 7CCDA931192756250074CF51 /* NptTlsTrustAnchor_Base_0064.cpp in Sources */, - 7CCDA934192756250074CF51 /* NptTlsTrustAnchor_Base_0065.cpp in Sources */, - 7CCDA937192756250074CF51 /* NptTlsTrustAnchor_Base_0066.cpp in Sources */, - 7CCDA93A192756250074CF51 /* NptTlsTrustAnchor_Base_0067.cpp in Sources */, - 7CCDA93D192756250074CF51 /* NptTlsTrustAnchor_Base_0068.cpp in Sources */, - 7CCDA940192756250074CF51 /* NptTlsTrustAnchor_Base_0069.cpp in Sources */, - 7CCDA943192756250074CF51 /* NptTlsTrustAnchor_Base_0070.cpp in Sources */, - 7CCDA946192756250074CF51 /* NptTlsTrustAnchor_Base_0071.cpp in Sources */, - 7CCDA949192756250074CF51 /* NptTlsTrustAnchor_Base_0072.cpp in Sources */, - 7CCDA94C192756250074CF51 /* NptTlsTrustAnchor_Base_0073.cpp in Sources */, - 7CCDA94F192756250074CF51 /* NptTlsTrustAnchor_Base_0074.cpp in Sources */, - 7CCDA952192756250074CF51 /* NptTlsTrustAnchor_Base_0075.cpp in Sources */, - 7CCDA955192756250074CF51 /* NptTlsTrustAnchor_Base_0076.cpp in Sources */, - 7CCDA958192756250074CF51 /* NptTlsTrustAnchor_Base_0077.cpp in Sources */, - 7CCDA95B192756250074CF51 /* NptTlsTrustAnchor_Base_0078.cpp in Sources */, - 7CCDA95E192756250074CF51 /* NptTlsTrustAnchor_Base_0079.cpp in Sources */, - 7CCDA961192756250074CF51 /* NptTlsTrustAnchor_Base_0080.cpp in Sources */, - 7CCDA964192756250074CF51 /* NptTlsTrustAnchor_Base_0081.cpp in Sources */, - 7CCDA967192756250074CF51 /* NptTlsTrustAnchor_Base_0082.cpp in Sources */, - 7CCDA96A192756250074CF51 /* NptTlsTrustAnchor_Base_0083.cpp in Sources */, - 7CCDA96D192756250074CF51 /* NptTlsTrustAnchor_Base_0084.cpp in Sources */, - 7CCDA970192756250074CF51 /* NptTlsTrustAnchor_Base_0085.cpp in Sources */, - 7CCDA973192756250074CF51 /* NptTlsTrustAnchor_Base_0086.cpp in Sources */, - 7CCDA976192756250074CF51 /* NptTlsTrustAnchor_Base_0087.cpp in Sources */, - 7CCDA979192756250074CF51 /* NptTlsTrustAnchor_Base_0088.cpp in Sources */, - 7CCDA97C192756250074CF51 /* NptTlsTrustAnchor_Base_0089.cpp in Sources */, - 7CCDA97F192756250074CF51 /* NptTlsTrustAnchor_Base_0090.cpp in Sources */, - 7CCDA982192756250074CF51 /* NptTlsTrustAnchor_Base_0091.cpp in Sources */, - 7CCDA985192756250074CF51 /* NptTlsTrustAnchor_Base_0092.cpp in Sources */, - 7CCDA988192756250074CF51 /* NptTlsTrustAnchor_Base_0093.cpp in Sources */, - 7CCDA98B192756250074CF51 /* NptTlsTrustAnchor_Base_0094.cpp in Sources */, - 7CCDA98E192756250074CF51 /* NptTlsTrustAnchor_Base_0095.cpp in Sources */, - 7CCDA991192756250074CF51 /* NptTlsTrustAnchor_Base_0096.cpp in Sources */, - 7CCDA994192756250074CF51 /* NptTlsTrustAnchor_Base_0097.cpp in Sources */, - 7CCDA997192756250074CF51 /* NptTlsTrustAnchor_Base_0098.cpp in Sources */, - 7CCDA99A192756250074CF51 /* NptTlsTrustAnchor_Base_0099.cpp in Sources */, - 7CCDA99D192756250074CF51 /* NptTlsTrustAnchor_Base_0100.cpp in Sources */, - 7CCDA9A0192756250074CF51 /* NptTlsTrustAnchor_Base_0101.cpp in Sources */, - 7CCDA9A3192756250074CF51 /* NptTlsTrustAnchor_Base_0102.cpp in Sources */, - 7CCDA9A6192756250074CF51 /* NptTlsTrustAnchor_Base_0103.cpp in Sources */, - 7CCDA9A9192756250074CF51 /* NptTlsTrustAnchor_Base_0104.cpp in Sources */, - 7CCDA9AC192756250074CF51 /* NptTlsTrustAnchor_Base_0105.cpp in Sources */, - 7CCDA9AF192756250074CF51 /* NptTlsTrustAnchor_Base_0106.cpp in Sources */, - 7CCDA9B2192756250074CF51 /* NptTlsTrustAnchor_Base_0107.cpp in Sources */, - 7CCDA9B5192756250074CF51 /* NptTlsTrustAnchor_Base_0108.cpp in Sources */, - 7CCDA9B8192756250074CF51 /* NptTlsTrustAnchor_Base_0109.cpp in Sources */, - 7CCDA9BB192756250074CF51 /* NptTlsTrustAnchor_Base_0110.cpp in Sources */, - 7CCDA9BE192756250074CF51 /* NptTlsTrustAnchor_Base_0111.cpp in Sources */, - 7CCDA9C1192756250074CF51 /* NptTlsTrustAnchor_Base_0112.cpp in Sources */, - 7CCDA9C4192756250074CF51 /* NptTlsTrustAnchor_Base_0113.cpp in Sources */, - 7CCDA9C7192756250074CF51 /* NptTlsTrustAnchor_Base_0114.cpp in Sources */, - 7CCDA9CA192756250074CF51 /* NptTlsTrustAnchor_Base_0115.cpp in Sources */, - 7CCDA9CD192756250074CF51 /* NptTlsTrustAnchor_Base_0116.cpp in Sources */, - 7CCDA9D0192756250074CF51 /* NptTlsTrustAnchor_Base_0117.cpp in Sources */, - 7CCDA9D3192756250074CF51 /* NptTlsTrustAnchor_Base_0118.cpp in Sources */, - 7CCDA9D6192756250074CF51 /* NptTlsTrustAnchor_Base_0119.cpp in Sources */, - 7CCDA9D9192756250074CF51 /* NptTlsTrustAnchor_Base_0120.cpp in Sources */, - 7CCDA9DC192756250074CF51 /* NptTlsTrustAnchor_Base_0121.cpp in Sources */, - 7CCDA9DF192756250074CF51 /* NptTlsTrustAnchor_Base_0122.cpp in Sources */, - 7CCDA9E2192756250074CF51 /* NptTlsTrustAnchor_Base_0123.cpp in Sources */, - 7CCDA9E5192756250074CF51 /* NptTlsTrustAnchor_Base_0124.cpp in Sources */, - 7CCDA9E8192756250074CF51 /* NptTlsTrustAnchor_Base_0125.cpp in Sources */, - 7CCDA9EB192756250074CF51 /* NptTlsTrustAnchor_Base_0126.cpp in Sources */, - 7CCDA9EE192756250074CF51 /* NptTlsTrustAnchor_Base_0127.cpp in Sources */, - 7CCDA9F1192756250074CF51 /* NptTlsTrustAnchor_Base_0128.cpp in Sources */, - 7CCDA9F4192756250074CF51 /* NptTlsTrustAnchor_Base_0129.cpp in Sources */, - 7CCDA9F7192756250074CF51 /* NptTlsTrustAnchor_Base_0130.cpp in Sources */, - 7CCDA9FA192756250074CF51 /* NptTlsTrustAnchor_Base_0131.cpp in Sources */, - 7CCDA9FD192756250074CF51 /* NptTlsTrustAnchor_Base_0132.cpp in Sources */, - 7CCDAA00192756250074CF51 /* NptTlsTrustAnchor_Base_0133.cpp in Sources */, - 7CCDAA03192756250074CF51 /* NptTlsTrustAnchor_Base_0134.cpp in Sources */, - 7CCDAA06192756250074CF51 /* NptTlsTrustAnchor_Base_0135.cpp in Sources */, - 7CCDAA09192756250074CF51 /* NptTlsTrustAnchor_Extended_0000.cpp in Sources */, - 7CCDAA0C192756250074CF51 /* NptTlsTrustAnchor_Extended_0001.cpp in Sources */, - 7CCDAA0F192756250074CF51 /* NptTlsTrustAnchor_Extended_0002.cpp in Sources */, - 7CCDAA12192756250074CF51 /* NptTlsTrustAnchor_Extended_0003.cpp in Sources */, - 7CCDAA15192756250074CF51 /* NptTlsTrustAnchor_Extended_0004.cpp in Sources */, - 7CCDAA18192756250074CF51 /* NptTlsTrustAnchor_Extended_0005.cpp in Sources */, - 7CCDAA1B192756250074CF51 /* NptTlsTrustAnchor_Extended_0006.cpp in Sources */, - 7CCDAA1E192756250074CF51 /* NptTlsTrustAnchor_Extended_0007.cpp in Sources */, - 7CCDAA21192756250074CF51 /* NptTlsTrustAnchor_Extended_0008.cpp in Sources */, - 7CCDAA24192756250074CF51 /* NptTlsTrustAnchor_Extended_0009.cpp in Sources */, - 7CCDAA27192756250074CF51 /* NptTlsTrustAnchor_Extended_0010.cpp in Sources */, - 7CCDAA2A192756250074CF51 /* NptTlsTrustAnchor_Extended_0011.cpp in Sources */, - 7CCDAA2D192756250074CF51 /* NptTlsTrustAnchor_Extended_0012.cpp in Sources */, - 7CCDAA30192756250074CF51 /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */, - 7CCDAA33192756250074CF51 /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */, 7CCDAA84192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */, 7CCDAA87192756250074CF51 /* NptPosixEnvironment.cpp in Sources */, 7CCDAA8D192756250074CF51 /* NptPosixNetwork.cpp in Sources */, @@ -13559,8 +12840,10 @@ E4991302174E5DAD00741B6D /* GUIListLabel.cpp in Sources */, E4991303174E5DAD00741B6D /* GUIMessage.cpp in Sources */, E4991304174E5DAD00741B6D /* GUIMoverControl.cpp in Sources */, + 399442751A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */, E4991305174E5DAD00741B6D /* GUIMultiImage.cpp in Sources */, E4991306174E5DAD00741B6D /* GUIMultiSelectText.cpp in Sources */, + 3994427B1A8DD920006C39E9 /* VideoLibraryScanningJob.cpp in Sources */, E4991307174E5DAD00741B6D /* GUIPanelContainer.cpp in Sources */, E4991308174E5DAD00741B6D /* GUIProgressControl.cpp in Sources */, E4991309174E5DAD00741B6D /* GUIRadioButtonControl.cpp in Sources */, @@ -13572,6 +12855,7 @@ E499130F174E5DAD00741B6D /* GUISettingsSliderControl.cpp in Sources */, E4991310174E5DAD00741B6D /* GUIShader.cpp in Sources */, E4991311174E5DAD00741B6D /* GUISliderControl.cpp in Sources */, + 3994426F1A8DD920006C39E9 /* VideoLibraryCleaningJob.cpp in Sources */, E4991312174E5DAD00741B6D /* GUISpinControl.cpp in Sources */, E4991313174E5DAD00741B6D /* GUISpinControlEx.cpp in Sources */, E4991314174E5DAD00741B6D /* GUIStaticItem.cpp in Sources */, @@ -13698,6 +12982,7 @@ E49913A6174E5F2100741B6D /* HTTPWebinterfaceAddonsHandler.cpp in Sources */, E49913A7174E5F2100741B6D /* HTTPWebinterfaceHandler.cpp in Sources */, E49913A8174E5F2100741B6D /* IHTTPRequestHandler.cpp in Sources */, + 3994425C1A8DD8D0006C39E9 /* ProgressJob.cpp in Sources */, E49913A9174E5F2100741B6D /* NetworkLinux.cpp in Sources */, E49913AA174E5F2100741B6D /* ZeroconfBrowserOSX.cpp in Sources */, E49913AB174E5F2100741B6D /* ZeroconfOSX.cpp in Sources */, @@ -13751,7 +13036,6 @@ E49913DA174E5F8D00741B6D /* Picture.cpp in Sources */, E49913DB174E5F8D00741B6D /* PictureInfoLoader.cpp in Sources */, E49913DC174E5F8D00741B6D /* PictureInfoTag.cpp in Sources */, - DFA0E8C719FD7BD100269A92 /* VideoSyncCocoa.cpp in Sources */, E49913DD174E5F8D00741B6D /* PictureThumbLoader.cpp in Sources */, E49913DE174E5F8D00741B6D /* SlideShowPicture.cpp in Sources */, E49913DF174E5F8D00741B6D /* PlayList.cpp in Sources */, @@ -13822,6 +13106,7 @@ E4991430174E603C00741B6D /* VideoSettings.cpp in Sources */, E4991431174E604300741B6D /* DarwinStorageProvider.cpp in Sources */, E4991432174E604300741B6D /* AutorunMediaJob.cpp in Sources */, + 399442721A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */, E4991433174E604300741B6D /* cdioSupport.cpp in Sources */, E4991434174E604300741B6D /* DetectDVDType.cpp in Sources */, E4991435174E604300741B6D /* IoSupport.cpp in Sources */, @@ -13834,6 +13119,7 @@ E499143C174E604700741B6D /* Thread.cpp in Sources */, E499143D174E604700741B6D /* Timer.cpp in Sources */, E499143E174E605900741B6D /* AlarmClock.cpp in Sources */, + 399442781A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */, DF4BF01E1A4EF3410053AC56 /* DVDDemuxCC.cpp in Sources */, E499143F174E605900741B6D /* AliasShortcutUtils.cpp in Sources */, E4991440174E605900741B6D /* Archive.cpp in Sources */, @@ -13937,6 +13223,7 @@ E49914A2174E607200741B6D /* GUIMediaWindow.cpp in Sources */, E49914A3174E607200741B6D /* GUIWindowDebugInfo.cpp in Sources */, E49914A4174E607200741B6D /* GUIWindowFileManager.cpp in Sources */, + 399442801A8DD96F006C39E9 /* VideoLibraryQueue.cpp in Sources */, E49914A5174E607200741B6D /* GUIWindowHome.cpp in Sources */, E49914A6174E607200741B6D /* GUIWindowLoginScreen.cpp in Sources */, E49914A7174E607200741B6D /* GUIWindowPointer.cpp in Sources */, @@ -14037,6 +13324,7 @@ DF40BC1E178B4BEC009DB567 /* PythonInvoker.cpp in Sources */, DF40BC29178B4C07009DB567 /* LanguageInvokerThread.cpp in Sources */, DF40BC2B178B4C07009DB567 /* ScriptInvocationManager.cpp in Sources */, + DF02BA621A910623006DCA16 /* VideoSyncIos.cpp in Sources */, DFBB4308178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */, F55BA70B17AB2264002A36D1 /* StereoscopicsManager.cpp in Sources */, F55BA71017AB2293002A36D1 /* RenderFlags.cpp in Sources */, @@ -14165,159 +13453,7 @@ 7CCDA85B192756250074CF51 /* NptUtils.cpp in Sources */, 7CCDA864192756250074CF51 /* NptXml.cpp in Sources */, 7CCDA86D192756250074CF51 /* NptZip.cpp in Sources */, - 7CCDA870192756250074CF51 /* NptTlsTrustAnchor_Base_0000.cpp in Sources */, - 7CCDA873192756250074CF51 /* NptTlsTrustAnchor_Base_0001.cpp in Sources */, - 7CCDA876192756250074CF51 /* NptTlsTrustAnchor_Base_0002.cpp in Sources */, - 7CCDA879192756250074CF51 /* NptTlsTrustAnchor_Base_0003.cpp in Sources */, - 7CCDA87C192756250074CF51 /* NptTlsTrustAnchor_Base_0004.cpp in Sources */, - 7CCDA87F192756250074CF51 /* NptTlsTrustAnchor_Base_0005.cpp in Sources */, - 7CCDA882192756250074CF51 /* NptTlsTrustAnchor_Base_0006.cpp in Sources */, - 7CCDA885192756250074CF51 /* NptTlsTrustAnchor_Base_0007.cpp in Sources */, - 7CCDA888192756250074CF51 /* NptTlsTrustAnchor_Base_0008.cpp in Sources */, - 7CCDA88B192756250074CF51 /* NptTlsTrustAnchor_Base_0009.cpp in Sources */, - 7CCDA88E192756250074CF51 /* NptTlsTrustAnchor_Base_0010.cpp in Sources */, - 7CCDA891192756250074CF51 /* NptTlsTrustAnchor_Base_0011.cpp in Sources */, - 7CCDA894192756250074CF51 /* NptTlsTrustAnchor_Base_0012.cpp in Sources */, - 7CCDA897192756250074CF51 /* NptTlsTrustAnchor_Base_0013.cpp in Sources */, - 7CCDA89A192756250074CF51 /* NptTlsTrustAnchor_Base_0014.cpp in Sources */, - 7CCDA89D192756250074CF51 /* NptTlsTrustAnchor_Base_0015.cpp in Sources */, - 7CCDA8A0192756250074CF51 /* NptTlsTrustAnchor_Base_0016.cpp in Sources */, - 7CCDA8A3192756250074CF51 /* NptTlsTrustAnchor_Base_0017.cpp in Sources */, - 7CCDA8A6192756250074CF51 /* NptTlsTrustAnchor_Base_0018.cpp in Sources */, - 7CCDA8A9192756250074CF51 /* NptTlsTrustAnchor_Base_0019.cpp in Sources */, - 7CCDA8AC192756250074CF51 /* NptTlsTrustAnchor_Base_0020.cpp in Sources */, - 7CCDA8AF192756250074CF51 /* NptTlsTrustAnchor_Base_0021.cpp in Sources */, - 7CCDA8B2192756250074CF51 /* NptTlsTrustAnchor_Base_0022.cpp in Sources */, - 7CCDA8B5192756250074CF51 /* NptTlsTrustAnchor_Base_0023.cpp in Sources */, - 7CCDA8B8192756250074CF51 /* NptTlsTrustAnchor_Base_0024.cpp in Sources */, - 7CCDA8BB192756250074CF51 /* NptTlsTrustAnchor_Base_0025.cpp in Sources */, - 7CCDA8BE192756250074CF51 /* NptTlsTrustAnchor_Base_0026.cpp in Sources */, - 7CCDA8C1192756250074CF51 /* NptTlsTrustAnchor_Base_0027.cpp in Sources */, - 7CCDA8C4192756250074CF51 /* NptTlsTrustAnchor_Base_0028.cpp in Sources */, - 7CCDA8C7192756250074CF51 /* NptTlsTrustAnchor_Base_0029.cpp in Sources */, - 7CCDA8CA192756250074CF51 /* NptTlsTrustAnchor_Base_0030.cpp in Sources */, - 7CCDA8CD192756250074CF51 /* NptTlsTrustAnchor_Base_0031.cpp in Sources */, - 7CCDA8D0192756250074CF51 /* NptTlsTrustAnchor_Base_0032.cpp in Sources */, - 7CCDA8D3192756250074CF51 /* NptTlsTrustAnchor_Base_0033.cpp in Sources */, - 7CCDA8D6192756250074CF51 /* NptTlsTrustAnchor_Base_0034.cpp in Sources */, - 7CCDA8D9192756250074CF51 /* NptTlsTrustAnchor_Base_0035.cpp in Sources */, - 7CCDA8DC192756250074CF51 /* NptTlsTrustAnchor_Base_0036.cpp in Sources */, - 7CCDA8DF192756250074CF51 /* NptTlsTrustAnchor_Base_0037.cpp in Sources */, - 7CCDA8E2192756250074CF51 /* NptTlsTrustAnchor_Base_0038.cpp in Sources */, - 7CCDA8E5192756250074CF51 /* NptTlsTrustAnchor_Base_0039.cpp in Sources */, - 7CCDA8E8192756250074CF51 /* NptTlsTrustAnchor_Base_0040.cpp in Sources */, - 7CCDA8EB192756250074CF51 /* NptTlsTrustAnchor_Base_0041.cpp in Sources */, - 7CCDA8EE192756250074CF51 /* NptTlsTrustAnchor_Base_0042.cpp in Sources */, - 7CCDA8F1192756250074CF51 /* NptTlsTrustAnchor_Base_0043.cpp in Sources */, - 7CCDA8F4192756250074CF51 /* NptTlsTrustAnchor_Base_0044.cpp in Sources */, - 7CCDA8F7192756250074CF51 /* NptTlsTrustAnchor_Base_0045.cpp in Sources */, - 7CCDA8FA192756250074CF51 /* NptTlsTrustAnchor_Base_0046.cpp in Sources */, - 7CCDA8FD192756250074CF51 /* NptTlsTrustAnchor_Base_0047.cpp in Sources */, - 7CCDA900192756250074CF51 /* NptTlsTrustAnchor_Base_0048.cpp in Sources */, - 7CCDA903192756250074CF51 /* NptTlsTrustAnchor_Base_0049.cpp in Sources */, - 7CCDA906192756250074CF51 /* NptTlsTrustAnchor_Base_0050.cpp in Sources */, - 7CCDA909192756250074CF51 /* NptTlsTrustAnchor_Base_0051.cpp in Sources */, - 7CCDA90C192756250074CF51 /* NptTlsTrustAnchor_Base_0052.cpp in Sources */, - 7CCDA90F192756250074CF51 /* NptTlsTrustAnchor_Base_0053.cpp in Sources */, - 7CCDA912192756250074CF51 /* NptTlsTrustAnchor_Base_0054.cpp in Sources */, - 7CCDA915192756250074CF51 /* NptTlsTrustAnchor_Base_0055.cpp in Sources */, - 7CCDA918192756250074CF51 /* NptTlsTrustAnchor_Base_0056.cpp in Sources */, - 7CCDA91B192756250074CF51 /* NptTlsTrustAnchor_Base_0057.cpp in Sources */, - 7CCDA91E192756250074CF51 /* NptTlsTrustAnchor_Base_0058.cpp in Sources */, - 7CCDA921192756250074CF51 /* NptTlsTrustAnchor_Base_0059.cpp in Sources */, - 7CCDA924192756250074CF51 /* NptTlsTrustAnchor_Base_0060.cpp in Sources */, - 7CCDA927192756250074CF51 /* NptTlsTrustAnchor_Base_0061.cpp in Sources */, - 7CCDA92A192756250074CF51 /* NptTlsTrustAnchor_Base_0062.cpp in Sources */, - 7CCDA92D192756250074CF51 /* NptTlsTrustAnchor_Base_0063.cpp in Sources */, - 7CCDA930192756250074CF51 /* NptTlsTrustAnchor_Base_0064.cpp in Sources */, - 7CCDA933192756250074CF51 /* NptTlsTrustAnchor_Base_0065.cpp in Sources */, - 7CCDA936192756250074CF51 /* NptTlsTrustAnchor_Base_0066.cpp in Sources */, - 7CCDA939192756250074CF51 /* NptTlsTrustAnchor_Base_0067.cpp in Sources */, - 7CCDA93C192756250074CF51 /* NptTlsTrustAnchor_Base_0068.cpp in Sources */, - 7CCDA93F192756250074CF51 /* NptTlsTrustAnchor_Base_0069.cpp in Sources */, - 7CCDA942192756250074CF51 /* NptTlsTrustAnchor_Base_0070.cpp in Sources */, - 7CCDA945192756250074CF51 /* NptTlsTrustAnchor_Base_0071.cpp in Sources */, - 7CCDA948192756250074CF51 /* NptTlsTrustAnchor_Base_0072.cpp in Sources */, - 7CCDA94B192756250074CF51 /* NptTlsTrustAnchor_Base_0073.cpp in Sources */, - 7CCDA94E192756250074CF51 /* NptTlsTrustAnchor_Base_0074.cpp in Sources */, - 7CCDA951192756250074CF51 /* NptTlsTrustAnchor_Base_0075.cpp in Sources */, - 7CCDA954192756250074CF51 /* NptTlsTrustAnchor_Base_0076.cpp in Sources */, - 7CCDA957192756250074CF51 /* NptTlsTrustAnchor_Base_0077.cpp in Sources */, - 7CCDA95A192756250074CF51 /* NptTlsTrustAnchor_Base_0078.cpp in Sources */, - 7CCDA95D192756250074CF51 /* NptTlsTrustAnchor_Base_0079.cpp in Sources */, - 7CCDA960192756250074CF51 /* NptTlsTrustAnchor_Base_0080.cpp in Sources */, - 7CCDA963192756250074CF51 /* NptTlsTrustAnchor_Base_0081.cpp in Sources */, - 7CCDA966192756250074CF51 /* NptTlsTrustAnchor_Base_0082.cpp in Sources */, - 7CCDA969192756250074CF51 /* NptTlsTrustAnchor_Base_0083.cpp in Sources */, - 7CCDA96C192756250074CF51 /* NptTlsTrustAnchor_Base_0084.cpp in Sources */, - 7CCDA96F192756250074CF51 /* NptTlsTrustAnchor_Base_0085.cpp in Sources */, - 7CCDA972192756250074CF51 /* NptTlsTrustAnchor_Base_0086.cpp in Sources */, - 7CCDA975192756250074CF51 /* NptTlsTrustAnchor_Base_0087.cpp in Sources */, - 7CCDA978192756250074CF51 /* NptTlsTrustAnchor_Base_0088.cpp in Sources */, - 7CCDA97B192756250074CF51 /* NptTlsTrustAnchor_Base_0089.cpp in Sources */, - 7CCDA97E192756250074CF51 /* NptTlsTrustAnchor_Base_0090.cpp in Sources */, - 7CCDA981192756250074CF51 /* NptTlsTrustAnchor_Base_0091.cpp in Sources */, - 7CCDA984192756250074CF51 /* NptTlsTrustAnchor_Base_0092.cpp in Sources */, - 7CCDA987192756250074CF51 /* NptTlsTrustAnchor_Base_0093.cpp in Sources */, - 7CCDA98A192756250074CF51 /* NptTlsTrustAnchor_Base_0094.cpp in Sources */, - 7CCDA98D192756250074CF51 /* NptTlsTrustAnchor_Base_0095.cpp in Sources */, - 7CCDA990192756250074CF51 /* NptTlsTrustAnchor_Base_0096.cpp in Sources */, - 7CCDA993192756250074CF51 /* NptTlsTrustAnchor_Base_0097.cpp in Sources */, - 7CCDA996192756250074CF51 /* NptTlsTrustAnchor_Base_0098.cpp in Sources */, - 7CCDA999192756250074CF51 /* NptTlsTrustAnchor_Base_0099.cpp in Sources */, - 7CCDA99C192756250074CF51 /* NptTlsTrustAnchor_Base_0100.cpp in Sources */, - 7CCDA99F192756250074CF51 /* NptTlsTrustAnchor_Base_0101.cpp in Sources */, - 7CCDA9A2192756250074CF51 /* NptTlsTrustAnchor_Base_0102.cpp in Sources */, - 7CCDA9A5192756250074CF51 /* NptTlsTrustAnchor_Base_0103.cpp in Sources */, - 7CCDA9A8192756250074CF51 /* NptTlsTrustAnchor_Base_0104.cpp in Sources */, - 7CCDA9AB192756250074CF51 /* NptTlsTrustAnchor_Base_0105.cpp in Sources */, - 7CCDA9AE192756250074CF51 /* NptTlsTrustAnchor_Base_0106.cpp in Sources */, - 7CCDA9B1192756250074CF51 /* NptTlsTrustAnchor_Base_0107.cpp in Sources */, B5011E4219AF3B56005ADF89 /* PosixFile.cpp in Sources */, - 7CCDA9B4192756250074CF51 /* NptTlsTrustAnchor_Base_0108.cpp in Sources */, - 7CCDA9B7192756250074CF51 /* NptTlsTrustAnchor_Base_0109.cpp in Sources */, - 7CCDA9BA192756250074CF51 /* NptTlsTrustAnchor_Base_0110.cpp in Sources */, - 7CCDA9BD192756250074CF51 /* NptTlsTrustAnchor_Base_0111.cpp in Sources */, - 7CCDA9C0192756250074CF51 /* NptTlsTrustAnchor_Base_0112.cpp in Sources */, - 7CCDA9C3192756250074CF51 /* NptTlsTrustAnchor_Base_0113.cpp in Sources */, - 7CCDA9C6192756250074CF51 /* NptTlsTrustAnchor_Base_0114.cpp in Sources */, - 7CCDA9C9192756250074CF51 /* NptTlsTrustAnchor_Base_0115.cpp in Sources */, - 7CCDA9CC192756250074CF51 /* NptTlsTrustAnchor_Base_0116.cpp in Sources */, - 7CCDA9CF192756250074CF51 /* NptTlsTrustAnchor_Base_0117.cpp in Sources */, - 7CCDA9D2192756250074CF51 /* NptTlsTrustAnchor_Base_0118.cpp in Sources */, - 7CCDA9D5192756250074CF51 /* NptTlsTrustAnchor_Base_0119.cpp in Sources */, - 7CCDA9D8192756250074CF51 /* NptTlsTrustAnchor_Base_0120.cpp in Sources */, - 7CCDA9DB192756250074CF51 /* NptTlsTrustAnchor_Base_0121.cpp in Sources */, - 7CCDA9DE192756250074CF51 /* NptTlsTrustAnchor_Base_0122.cpp in Sources */, - 7CCDA9E1192756250074CF51 /* NptTlsTrustAnchor_Base_0123.cpp in Sources */, - 7CCDA9E4192756250074CF51 /* NptTlsTrustAnchor_Base_0124.cpp in Sources */, - 7CCDA9E7192756250074CF51 /* NptTlsTrustAnchor_Base_0125.cpp in Sources */, - 7CCDA9EA192756250074CF51 /* NptTlsTrustAnchor_Base_0126.cpp in Sources */, - 7CCDA9ED192756250074CF51 /* NptTlsTrustAnchor_Base_0127.cpp in Sources */, - 7CCDA9F0192756250074CF51 /* NptTlsTrustAnchor_Base_0128.cpp in Sources */, - 7CCDA9F3192756250074CF51 /* NptTlsTrustAnchor_Base_0129.cpp in Sources */, - 7CCDA9F6192756250074CF51 /* NptTlsTrustAnchor_Base_0130.cpp in Sources */, - 7CCDA9F9192756250074CF51 /* NptTlsTrustAnchor_Base_0131.cpp in Sources */, - 7CCDA9FC192756250074CF51 /* NptTlsTrustAnchor_Base_0132.cpp in Sources */, - 7CCDA9FF192756250074CF51 /* NptTlsTrustAnchor_Base_0133.cpp in Sources */, - 7CCDAA02192756250074CF51 /* NptTlsTrustAnchor_Base_0134.cpp in Sources */, - 7CCDAA05192756250074CF51 /* NptTlsTrustAnchor_Base_0135.cpp in Sources */, - 7CCDAA08192756250074CF51 /* NptTlsTrustAnchor_Extended_0000.cpp in Sources */, - 7CCDAA0B192756250074CF51 /* NptTlsTrustAnchor_Extended_0001.cpp in Sources */, - 7CCDAA0E192756250074CF51 /* NptTlsTrustAnchor_Extended_0002.cpp in Sources */, - 7CCDAA11192756250074CF51 /* NptTlsTrustAnchor_Extended_0003.cpp in Sources */, - 7CCDAA14192756250074CF51 /* NptTlsTrustAnchor_Extended_0004.cpp in Sources */, - 7CCDAA17192756250074CF51 /* NptTlsTrustAnchor_Extended_0005.cpp in Sources */, - 7CCDAA1A192756250074CF51 /* NptTlsTrustAnchor_Extended_0006.cpp in Sources */, - 7CCDAA1D192756250074CF51 /* NptTlsTrustAnchor_Extended_0007.cpp in Sources */, - 7CCDAA20192756250074CF51 /* NptTlsTrustAnchor_Extended_0008.cpp in Sources */, - 7CCDAA23192756250074CF51 /* NptTlsTrustAnchor_Extended_0009.cpp in Sources */, - 7CCDAA26192756250074CF51 /* NptTlsTrustAnchor_Extended_0010.cpp in Sources */, - B5011E3D19AA4989005ADF89 /* MarkWatchedJob.cpp in Sources */, - 7CCDAA29192756250074CF51 /* NptTlsTrustAnchor_Extended_0011.cpp in Sources */, - 7CCDAA2C192756250074CF51 /* NptTlsTrustAnchor_Extended_0012.cpp in Sources */, - 7CCDAA2F192756250074CF51 /* NptTlsDefaultTrustAnchorsBase.cpp in Sources */, - 7CCDAA32192756250074CF51 /* NptTlsDefaultTrustAnchorsExtended.cpp in Sources */, 7CCDAA83192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */, 7CCDAA86192756250074CF51 /* NptPosixEnvironment.cpp in Sources */, 7CCDAA8C192756250074CF51 /* NptPosixNetwork.cpp in Sources */, @@ -14417,7 +13553,6 @@ "$(SRCROOT)/lib/libXDAAP", "$(SRCROOT)/lib/cmyth/libcmyth", "$(SRCROOT)/lib/cmyth/librefmem", - "$(SRCROOT)/lib/libsquish", "$(SRCROOT)/lib/SlingboxLib", "$(SRCROOT)/xbmc/interfaces/json-rpc", "\"$(SRCROOT)/xbmc/interfaces/python\"", @@ -14483,7 +13618,6 @@ "$(SRCROOT)/lib/libXDAAP", "$(SRCROOT)/lib/cmyth/libcmyth", "$(SRCROOT)/lib/cmyth/librefmem", - "$(SRCROOT)/lib/libsquish", "$(SRCROOT)/lib/SlingboxLib", "$(SRCROOT)/xbmc/interfaces/json-rpc", "\"$(SRCROOT)/xbmc/interfaces/python\"", @@ -14595,7 +13729,6 @@ "\"$(SRCROOT)/lib/libXDAAP\"", "\"$(SRCROOT)/lib/cmyth/libcmyth\"", "\"$(SRCROOT)/lib/cmyth/librefmem\"", - "\"$(SRCROOT)/lib/libsquish\"", "\"$(SRCROOT)/lib/SlingboxLib\"", "\"$(SRCROOT)/xbmc/interfaces/json-rpc\"", "\"$(SRCROOT)/xbmc/interfaces/legacy\"", @@ -14655,7 +13788,6 @@ "\"$(SRCROOT)/lib/libXDAAP\"", "\"$(SRCROOT)/lib/cmyth/libcmyth\"", "\"$(SRCROOT)/lib/cmyth/librefmem\"", - "\"$(SRCROOT)/lib/libsquish\"", "\"$(SRCROOT)/lib/SlingboxLib\"", "\"$(SRCROOT)/xbmc/interfaces/json-rpc\"", "\"$(SRCROOT)/xbmc/interfaces/legacy\"", diff --git a/Makefile.in b/Makefile.in index 6539711c05..0c6ad606fa 100644 --- a/Makefile.in +++ b/Makefile.in @@ -92,6 +92,7 @@ DIRECTORY_ARCHIVES=$(DVDPLAYER_ARCHIVES) \ xbmc/storage/storage.a \ xbmc/utils/utils.a \ xbmc/video/dialogs/videodialogs.a \ + xbmc/video/jobs/video-jobs.a \ xbmc/video/videosync/videosync.a \ xbmc/video/video.a \ xbmc/video/windows/videowindows.a \ diff --git a/addons/library.xbmc.gui/libXBMC_gui.h b/addons/library.xbmc.gui/libXBMC_gui.h index 72f732f0c9..8dbc38b8f6 100644 --- a/addons/library.xbmc.gui/libXBMC_gui.h +++ b/addons/library.xbmc.gui/libXBMC_gui.h @@ -36,13 +36,14 @@ typedef void* GUIHANDLE; #endif /* current ADDONGUI API version */ -#define XBMC_GUI_API_VERSION "5.7.0" +#define XBMC_GUI_API_VERSION "5.8.0" /* min. ADDONGUI API version */ -#define XBMC_GUI_MIN_API_VERSION "5.3.0" +#define XBMC_GUI_MIN_API_VERSION "5.8.0" #define ADDON_ACTION_PREVIOUS_MENU 10 #define ADDON_ACTION_CLOSE_DIALOG 51 +#define ADDON_ACTION_NAV_BACK 92 class CAddonGUIWindow; class CAddonGUISpinControl; @@ -50,6 +51,8 @@ class CAddonGUIRadioButton; class CAddonGUIProgressControl; class CAddonListItem; class CAddonGUIRenderingControl; +class CAddonGUISliderControl; +class CAddonGUISettingsSliderControl; class CHelper_libXBMC_gui { @@ -169,6 +172,125 @@ public: dlsym(m_libXBMC_gui, "GUI_control_release_rendering"); if (GUI_control_release_rendering == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + GUI_control_get_slider = (CAddonGUISliderControl* (*)(void *HANDLE, void *CB, CAddonGUIWindow *window, int controlId)) + dlsym(m_libXBMC_gui, "GUI_control_get_slider"); + if (GUI_control_get_slider == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_control_release_slider = (void (*)(CAddonGUISliderControl* p)) + dlsym(m_libXBMC_gui, "GUI_control_release_slider"); + if (GUI_control_release_slider == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_control_get_settings_slider = (CAddonGUISettingsSliderControl* (*)(void *HANDLE, void *CB, CAddonGUIWindow *window, int controlId)) + dlsym(m_libXBMC_gui, "GUI_control_get_settings_slider"); + if (GUI_control_get_settings_slider == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_control_release_settings_slider = (void (*)(CAddonGUISettingsSliderControl* p)) + dlsym(m_libXBMC_gui, "GUI_control_release_settings_slider"); + if (GUI_control_release_settings_slider == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_keyboard_show_and_get_input_with_head = (bool (*)(void *HANDLE, void *CB, char &aTextString, unsigned int iMaxStringSize, const char *heading, bool allowEmptyResult, bool hiddenInput, unsigned int autoCloseMs)) + dlsym(m_libXBMC_gui, "GUI_dialog_keyboard_show_and_get_input_with_head"); + if (GUI_dialog_keyboard_show_and_get_input_with_head == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_keyboard_show_and_get_input = (bool (*)(void *HANDLE, void *CB, char &aTextString, unsigned int iMaxStringSize, bool allowEmptyResult, unsigned int autoCloseMs)) + dlsym(m_libXBMC_gui, "GUI_dialog_keyboard_show_and_get_input"); + if (GUI_dialog_keyboard_show_and_get_input == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_keyboard_show_and_get_new_password_with_head = (bool (*)(void *HANDLE, void *CB, char &newPassword, unsigned int iMaxStringSize, const char *heading, bool allowEmptyResult, unsigned int autoCloseMs)) + dlsym(m_libXBMC_gui, "GUI_dialog_keyboard_show_and_get_new_password_with_head"); + if (GUI_dialog_keyboard_show_and_get_new_password_with_head == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_keyboard_show_and_get_new_password = (bool (*)(void *HANDLE, void *CB, char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs)) + dlsym(m_libXBMC_gui, "GUI_dialog_keyboard_show_and_get_new_password"); + if (GUI_dialog_keyboard_show_and_get_new_password == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_keyboard_show_and_verify_new_password_with_head = (bool (*)(void *HANDLE, void *CB, char &strNewPassword, unsigned int iMaxStringSize, const char *heading, bool allowEmptyResult, unsigned int autoCloseMs)) + dlsym(m_libXBMC_gui, "GUI_dialog_keyboard_show_and_verify_new_password_with_head"); + if (GUI_dialog_keyboard_show_and_verify_new_password_with_head == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_keyboard_show_and_verify_new_password = (bool (*)(void *HANDLE, void *CB, char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs)) + dlsym(m_libXBMC_gui, "GUI_dialog_keyboard_show_and_verify_new_password"); + if (GUI_dialog_keyboard_show_and_verify_new_password == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_keyboard_show_and_verify_password = (int (*)(void *HANDLE, void *CB, char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries, unsigned int autoCloseMs)) + dlsym(m_libXBMC_gui, "GUI_dialog_keyboard_show_and_verify_password"); + if (GUI_dialog_keyboard_show_and_verify_password == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_keyboard_show_and_get_filter = (bool (*)(void *HANDLE, void *CB, char &aTextString, unsigned int iMaxStringSize, bool searching, unsigned int autoCloseMs)) + dlsym(m_libXBMC_gui, "GUI_dialog_keyboard_show_and_get_filter"); + if (GUI_dialog_keyboard_show_and_get_filter == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_keyboard_send_text_to_active_keyboard = (bool (*)(void *HANDLE, void *CB, const char *aTextString, bool closeKeyboard)) + dlsym(m_libXBMC_gui, "GUI_dialog_keyboard_send_text_to_active_keyboard"); + if (GUI_dialog_keyboard_send_text_to_active_keyboard == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_keyboard_is_activated = (bool (*)(void *HANDLE, void *CB)) + dlsym(m_libXBMC_gui, "GUI_dialog_keyboard_is_activated"); + if (GUI_dialog_keyboard_is_activated == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_numeric_show_and_verify_new_password = (bool (*)(void *HANDLE, void *CB, char &strNewPassword, unsigned int iMaxStringSize)) + dlsym(m_libXBMC_gui, "GUI_dialog_numeric_show_and_verify_new_password"); + if (GUI_dialog_numeric_show_and_verify_new_password == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_numeric_show_and_verify_password = (int (*)(void *HANDLE, void *CB, char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries)) + dlsym(m_libXBMC_gui, "GUI_dialog_numeric_show_and_verify_password"); + if (GUI_dialog_numeric_show_and_verify_password == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_numeric_show_and_verify_input = (bool (*)(void *HANDLE, void *CB, char &strPassword, unsigned int iMaxStringSize, const char *strHeading, bool bGetUserInput)) + dlsym(m_libXBMC_gui, "GUI_dialog_numeric_show_and_verify_input"); + if (GUI_dialog_numeric_show_and_verify_input == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_numeric_show_and_get_time = (bool (*)(void *HANDLE, void *CB, tm &time, const char *strHeading)) + dlsym(m_libXBMC_gui, "GUI_dialog_numeric_show_and_get_time"); + if (GUI_dialog_numeric_show_and_get_time == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_numeric_show_and_get_date = (bool (*)(void *HANDLE, void *CB, tm &date, const char *strHeading)) + dlsym(m_libXBMC_gui, "GUI_dialog_numeric_show_and_get_date"); + if (GUI_dialog_numeric_show_and_get_date == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_numeric_show_and_get_ipaddress = (bool (*)(void *HANDLE, void *CB, char &IPAddress, unsigned int iMaxStringSize, const char *strHeading)) + dlsym(m_libXBMC_gui, "GUI_dialog_numeric_show_and_get_ipaddress"); + if (GUI_dialog_numeric_show_and_get_ipaddress == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_numeric_show_and_get_number = (bool (*)(void *HANDLE, void *CB, char &strInput, unsigned int iMaxStringSize, const char *strHeading, unsigned int iAutoCloseTimeoutMs)) + dlsym(m_libXBMC_gui, "GUI_dialog_numeric_show_and_get_number"); + if (GUI_dialog_numeric_show_and_get_number == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_numeric_show_and_get_seconds = (bool (*)(void *HANDLE, void *CB, char &strTime, unsigned int iMaxStringSize, const char *strHeading)) + dlsym(m_libXBMC_gui, "GUI_dialog_numeric_show_and_get_seconds"); + if (GUI_dialog_numeric_show_and_get_seconds == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_filebrowser_show_and_get_file = (bool (*)(void *HANDLE, void *CB, const char *directory, const char *mask, const char *heading, char &path, unsigned int iMaxStringSize, bool useThumbs, bool useFileDirectories, bool singleList)) + dlsym(m_libXBMC_gui, "GUI_dialog_filebrowser_show_and_get_file"); + if (GUI_dialog_filebrowser_show_and_get_file == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_ok_show_and_get_input_single_text = (void (*)(void *HANDLE, void *CB, const char *heading, const char *text)) + dlsym(m_libXBMC_gui, "GUI_dialog_ok_show_and_get_input_single_text"); + if (GUI_dialog_ok_show_and_get_input_single_text == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_ok_show_and_get_input_line_text = (void (*)(void *HANDLE, void *CB, const char *heading, const char *line0, const char *line1, const char *line2)) + dlsym(m_libXBMC_gui, "GUI_dialog_ok_show_and_get_input_line_text"); + if (GUI_dialog_ok_show_and_get_input_line_text == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_yesno_show_and_get_input_singletext = (bool (*)(void *HANDLE, void *CB, const char *heading, const char *text, bool& bCanceled, const char *noLabel, const char *yesLabel)) + dlsym(m_libXBMC_gui, "GUI_dialog_yesno_show_and_get_input_singletext"); + if (GUI_dialog_yesno_show_and_get_input_singletext == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_yesno_show_and_get_input_linetext = (bool (*)(void *HANDLE, void *CB, const char *heading, const char *line0, const char *line1, const char *line2, const char *noLabel, const char *yesLabel)) + dlsym(m_libXBMC_gui, "GUI_dialog_yesno_show_and_get_input_linetext"); + if (GUI_dialog_yesno_show_and_get_input_linetext == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_yesno_show_and_get_input_linebuttontext = (bool (*)(void *HANDLE, void *CB, const char *heading, const char *line0, const char *line1, const char *line2, bool &bCanceled, const char *noLabel, const char *yesLabel)) + dlsym(m_libXBMC_gui, "GUI_dialog_yesno_show_and_get_input_linebuttontext"); + if (GUI_dialog_yesno_show_and_get_input_linebuttontext == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_text_viewer = (void (*)(void *hdl, void *cb, const char *heading, const char *text)) + dlsym(m_libXBMC_gui, "GUI_dialog_text_viewer"); + if (GUI_dialog_text_viewer == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_dialog_select = (int (*)(void *hdl, void *cb, const char *heading, const char *entries[], unsigned int size, int selected)) + dlsym(m_libXBMC_gui, "GUI_dialog_select"); + if (GUI_dialog_select == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } m_Callbacks = GUI_register_me(m_Handle); return m_Callbacks != NULL; @@ -259,6 +381,177 @@ public: return GUI_control_release_rendering(p); } + CAddonGUISliderControl* Control_getSlider(CAddonGUIWindow *window, int controlId) + { + return GUI_control_get_slider(m_Handle, m_Callbacks, window, controlId); + } + + void Control_releaseSlider(CAddonGUISliderControl* p) + { + return GUI_control_release_slider(p); + } + + CAddonGUISettingsSliderControl* Control_getSettingsSlider(CAddonGUIWindow *window, int controlId) + { + return GUI_control_get_settings_slider(m_Handle, m_Callbacks, window, controlId); + } + + void Control_releaseSettingsSlider(CAddonGUISettingsSliderControl* p) + { + return GUI_control_release_settings_slider(p); + } + + /*! @name GUI Keyboard functions */ + //@{ + bool Dialog_Keyboard_ShowAndGetInput(char &strText, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, bool hiddenInput, unsigned int autoCloseMs = 0) + { + return GUI_dialog_keyboard_show_and_get_input_with_head(m_Handle, m_Callbacks, strText, iMaxStringSize, strHeading, allowEmptyResult, hiddenInput, autoCloseMs); + } + + bool Dialog_Keyboard_ShowAndGetInput(char &strText, unsigned int iMaxStringSize, bool allowEmptyResult, unsigned int autoCloseMs = 0) + { + return GUI_dialog_keyboard_show_and_get_input(m_Handle, m_Callbacks, strText, iMaxStringSize, allowEmptyResult, autoCloseMs); + } + + bool Dialog_Keyboard_ShowAndGetNewPassword(char &strNewPassword, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, unsigned int autoCloseMs = 0) + { + return GUI_dialog_keyboard_show_and_get_new_password_with_head(m_Handle, m_Callbacks, strNewPassword, iMaxStringSize, strHeading, allowEmptyResult, autoCloseMs); + } + + bool Dialog_Keyboard_ShowAndGetNewPassword(char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs = 0) + { + return GUI_dialog_keyboard_show_and_get_new_password(m_Handle, m_Callbacks, strNewPassword, iMaxStringSize, autoCloseMs); + } + + bool Dialog_Keyboard_ShowAndVerifyNewPassword(char &strNewPassword, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, unsigned int autoCloseMs = 0) + { + return GUI_dialog_keyboard_show_and_verify_new_password_with_head(m_Handle, m_Callbacks, strNewPassword, iMaxStringSize, strHeading, allowEmptyResult, autoCloseMs); + } + + bool Dialog_Keyboard_ShowAndVerifyNewPassword(char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs = 0) + { + return GUI_dialog_keyboard_show_and_verify_new_password(m_Handle, m_Callbacks, strNewPassword, iMaxStringSize, autoCloseMs); + } + + int Dialog_Keyboard_ShowAndVerifyPassword(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries, unsigned int autoCloseMs = 0) + { + return GUI_dialog_keyboard_show_and_verify_password(m_Handle, m_Callbacks, strPassword, iMaxStringSize, strHeading, iRetries, autoCloseMs); + } + + bool Dialog_Keyboard_ShowAndGetFilter(char &strText, unsigned int iMaxStringSize, bool searching, unsigned int autoCloseMs = 0) + { + return GUI_dialog_keyboard_show_and_get_filter(m_Handle, m_Callbacks, strText, iMaxStringSize, searching, autoCloseMs); + } + + bool Dialog_Keyboard_SendTextToActiveKeyboard(const char *aTextString, bool closeKeyboard = false) + { + return GUI_dialog_keyboard_send_text_to_active_keyboard(m_Handle, m_Callbacks, aTextString, closeKeyboard); + } + + bool Dialog_Keyboard_isKeyboardActivated() + { + return GUI_dialog_keyboard_is_activated(m_Handle, m_Callbacks); + } + //@} + + /*! @name GUI Numeric functions */ + //@{ + bool Dialog_Numeric_ShowAndVerifyNewPassword(char &strNewPassword, unsigned int iMaxStringSize) + { + return GUI_dialog_numeric_show_and_verify_new_password(m_Handle, m_Callbacks, strNewPassword, iMaxStringSize); + } + + int Dialog_Numeric_ShowAndVerifyPassword(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries) + { + return GUI_dialog_numeric_show_and_verify_password(m_Handle, m_Callbacks, strPassword, iMaxStringSize, strHeading, iRetries); + } + + bool Dialog_Numeric_ShowAndVerifyInput(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, bool bGetUserInput) + { + return GUI_dialog_numeric_show_and_verify_input(m_Handle, m_Callbacks, strPassword, iMaxStringSize, strHeading, bGetUserInput); + } + + bool Dialog_Numeric_ShowAndGetTime(tm &time, const char *strHeading) + { + return GUI_dialog_numeric_show_and_get_time(m_Handle, m_Callbacks, time, strHeading); + } + + bool Dialog_Numeric_ShowAndGetDate(tm &date, const char *strHeading) + { + return GUI_dialog_numeric_show_and_get_date(m_Handle, m_Callbacks, date, strHeading); + } + + bool Dialog_Numeric_ShowAndGetIPAddress(char &strIPAddress, unsigned int iMaxStringSize, const char *strHeading) + { + return GUI_dialog_numeric_show_and_get_ipaddress(m_Handle, m_Callbacks, strIPAddress, iMaxStringSize, strHeading); + } + + bool Dialog_Numeric_ShowAndGetNumber(char &strInput, unsigned int iMaxStringSize, const char *strHeading, unsigned int iAutoCloseTimeoutMs = 0) + { + return GUI_dialog_numeric_show_and_get_number(m_Handle, m_Callbacks, strInput, iMaxStringSize, strHeading, iAutoCloseTimeoutMs = 0); + } + + bool Dialog_Numeric_ShowAndGetSeconds(char &strTime, unsigned int iMaxStringSize, const char *strHeading) + { + return GUI_dialog_numeric_show_and_get_seconds(m_Handle, m_Callbacks, strTime, iMaxStringSize, strHeading); + } + //@} + + /*! @name GUI File browser functions */ + //@{ + bool Dialog_FileBrowser_ShowAndGetFile(const char *directory, const char *mask, const char *heading, char &strPath, unsigned int iMaxStringSize, bool useThumbs = false, bool useFileDirectories = false, bool singleList = false) + { + return GUI_dialog_filebrowser_show_and_get_file(m_Handle, m_Callbacks, directory, mask, heading, strPath, iMaxStringSize, useThumbs, useFileDirectories, singleList); + } + //@} + + /*! @name GUI OK Dialog functions */ + //@{ + void Dialog_OK_ShowAndGetInput(const char *heading, const char *text) + { + GUI_dialog_ok_show_and_get_input_single_text(m_Handle, m_Callbacks, heading, text); + } + + void Dialog_OK_ShowAndGetInput(const char *heading, const char *line0, const char *line1, const char *line2) + { + GUI_dialog_ok_show_and_get_input_line_text(m_Handle, m_Callbacks, heading, line0, line1, line2); + } + //@} + + /*! @name GUI Yes No Dialog functions */ + //@{ + bool Dialog_YesNo_ShowAndGetInput(const char *heading, const char *text, bool& bCanceled, const char *noLabel = "", const char *yesLabel = "") + { + return GUI_dialog_yesno_show_and_get_input_singletext(m_Handle, m_Callbacks, heading, text, bCanceled, noLabel, yesLabel); + } + + bool Dialog_YesNo_ShowAndGetInput(const char *heading, const char *line0, const char *line1, const char *line2, const char *noLabel = "", const char *yesLabel = "") + { + return GUI_dialog_yesno_show_and_get_input_linetext(m_Handle, m_Callbacks, heading, line0, line1, line2, noLabel, yesLabel); + } + + bool Dialog_YesNo_ShowAndGetInput(const char *heading, const char *line0, const char *line1, const char *line2, bool &bCanceled, const char *noLabel = "", const char *yesLabel = "") + { + return GUI_dialog_yesno_show_and_get_input_linebuttontext(m_Handle, m_Callbacks, heading, line0, line1, line2, bCanceled, noLabel, yesLabel); + } + //@} + + /*! @name GUI Text viewer Dialog */ + //@{ + void Dialog_TextViewer(const char *heading, const char *text) + { + return GUI_dialog_text_viewer(m_Handle, m_Callbacks, heading, text); + } + //@} + + /*! @name GUI select Dialog */ + //@{ + int Dialog_Select(const char *heading, const char *entries[], unsigned int size, int selected = -1) + { + return GUI_dialog_select(m_Handle, m_Callbacks, heading, entries, size, selected); + } + //@} + protected: void* (*GUI_register_me)(void *HANDLE); void (*GUI_unregister_me)(void *HANDLE, void* CB); @@ -279,6 +572,36 @@ protected: void (*GUI_ListItem_destroy)(CAddonListItem* p); CAddonGUIRenderingControl* (*GUI_control_get_rendering)(void *HANDLE, void* CB, CAddonGUIWindow *window, int controlId); void (*GUI_control_release_rendering)(CAddonGUIRenderingControl* p); + CAddonGUISliderControl* (*GUI_control_get_slider)(void *HANDLE, void* CB, CAddonGUIWindow *window, int controlId); + void (*GUI_control_release_slider)(CAddonGUISliderControl* p); + CAddonGUISettingsSliderControl* (*GUI_control_get_settings_slider)(void *HANDLE, void* CB, CAddonGUIWindow *window, int controlId); + void (*GUI_control_release_settings_slider)(CAddonGUISettingsSliderControl* p); + bool (*GUI_dialog_keyboard_show_and_get_input_with_head)(void *HANDLE, void *CB, char &aTextString, unsigned int iMaxStringSize, const char *heading, bool allowEmptyResult, bool hiddenInput, unsigned int autoCloseMs); + bool (*GUI_dialog_keyboard_show_and_get_input)(void *HANDLE, void *CB, char &aTextString, unsigned int iMaxStringSize, bool allowEmptyResult, unsigned int autoCloseMs); + bool (*GUI_dialog_keyboard_show_and_get_new_password_with_head)(void *HANDLE, void *CB, char &newPassword, unsigned int iMaxStringSize, const char *heading, bool allowEmptyResult, unsigned int autoCloseMs); + bool (*GUI_dialog_keyboard_show_and_get_new_password)(void *HANDLE, void *CB, char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs); + bool (*GUI_dialog_keyboard_show_and_verify_new_password_with_head)(void *HANDLE, void *CB, char &strNewPassword, unsigned int iMaxStringSize, const char *heading, bool allowEmptyResult, unsigned int autoCloseMs); + bool (*GUI_dialog_keyboard_show_and_verify_new_password)(void *HANDLE, void *CB, char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs); + int (*GUI_dialog_keyboard_show_and_verify_password)(void *HANDLE, void *CB, char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries, unsigned int autoCloseMs); + bool (*GUI_dialog_keyboard_show_and_get_filter)(void *HANDLE, void *CB, char &aTextString, unsigned int iMaxStringSize, bool searching, unsigned int autoCloseMs); + bool (*GUI_dialog_keyboard_send_text_to_active_keyboard)(void *HANDLE, void *CB, const char *aTextString, bool closeKeyboard); + bool (*GUI_dialog_keyboard_is_activated)(void *HANDLE, void *CB); + bool (*GUI_dialog_numeric_show_and_verify_new_password)(void *HANDLE, void *CB, char &strNewPassword, unsigned int iMaxStringSize); + int (*GUI_dialog_numeric_show_and_verify_password)(void *HANDLE, void *CB, char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries); + bool (*GUI_dialog_numeric_show_and_verify_input)(void *HANDLE, void *CB, char &strPassword, unsigned int iMaxStringSize, const char *strHeading, bool bGetUserInput); + bool (*GUI_dialog_numeric_show_and_get_time)(void *HANDLE, void *CB, tm &time, const char *strHeading); + bool (*GUI_dialog_numeric_show_and_get_date)(void *HANDLE, void *CB, tm &date, const char *strHeading); + bool (*GUI_dialog_numeric_show_and_get_ipaddress)(void *HANDLE, void *CB, char &IPAddress, unsigned int iMaxStringSize, const char *strHeading); + bool (*GUI_dialog_numeric_show_and_get_number)(void *HANDLE, void *CB, char &strInput, unsigned int iMaxStringSize, const char *strHeading, unsigned int iAutoCloseTimeoutMs); + bool (*GUI_dialog_numeric_show_and_get_seconds)(void *HANDLE, void *CB, char &strTime, unsigned int iMaxStringSize, const char *strHeading); + bool (*GUI_dialog_filebrowser_show_and_get_file)(void *HANDLE, void *CB, const char *directory, const char *mask, const char *heading, char &path, unsigned int iMaxStringSize, bool useThumbs, bool useFileDirectories, bool singleList); + void (*GUI_dialog_ok_show_and_get_input_single_text)(void *HANDLE, void *CB, const char *heading, const char *text); + void (*GUI_dialog_ok_show_and_get_input_line_text)(void *HANDLE, void *CB, const char *heading, const char *line0, const char *line1, const char *line2); + bool (*GUI_dialog_yesno_show_and_get_input_singletext)(void *HANDLE, void *CB, const char *heading, const char *text, bool& bCanceled, const char *noLabel, const char *yesLabel); + bool (*GUI_dialog_yesno_show_and_get_input_linetext)(void *HANDLE, void *CB, const char *heading, const char *line0, const char *line1, const char *line2, const char *noLabel, const char *yesLabel); + bool (*GUI_dialog_yesno_show_and_get_input_linebuttontext)(void *HANDLE, void *CB, const char *heading, const char *line0, const char *line1, const char *line2, bool &bCanceled, const char *noLabel, const char *yesLabel); + void (*GUI_dialog_text_viewer)(void *hdl, void *cb, const char *heading, const char *text); + int (*GUI_dialog_select)(void *hdl, void *cb, const char *heading, const char *entries[], unsigned int size, int selected); private: void *m_libXBMC_gui; @@ -350,6 +673,67 @@ private: void *m_cb; }; +class CAddonGUISliderControl +{ +public: + CAddonGUISliderControl(void *hdl, void *cb, CAddonGUIWindow *window, int controlId); + virtual ~CAddonGUISliderControl(void) {} + + virtual void SetVisible(bool yesNo); + virtual std::string GetDescription() const; + + virtual void SetIntRange(int iStart, int iEnd); + virtual void SetIntValue(int iValue); + virtual int GetIntValue() const; + virtual void SetIntInterval(int iInterval); + + virtual void SetPercentage(float fPercent); + virtual float GetPercentage() const; + + virtual void SetFloatRange(float fStart, float fEnd); + virtual void SetFloatValue(float fValue); + virtual float GetFloatValue() const; + virtual void SetFloatInterval(float fInterval); + +private: + CAddonGUIWindow *m_Window; + int m_ControlId; + GUIHANDLE m_SliderHandle; + void *m_Handle; + void *m_cb; +}; + +class CAddonGUISettingsSliderControl +{ +public: + CAddonGUISettingsSliderControl(void *hdl, void *cb, CAddonGUIWindow *window, int controlId); + virtual ~CAddonGUISettingsSliderControl(void) {} + + virtual void SetVisible(bool yesNo); + virtual void SetText(const char *label); + virtual std::string GetDescription() const; + + virtual void SetIntRange(int iStart, int iEnd); + virtual void SetIntValue(int iValue); + virtual int GetIntValue() const; + virtual void SetIntInterval(int iInterval); + + virtual void SetPercentage(float fPercent); + virtual float GetPercentage() const; + + virtual void SetFloatRange(float fStart, float fEnd); + virtual void SetFloatValue(float fValue); + virtual float GetFloatValue() const; + virtual void SetFloatInterval(float fInterval); + +private: + CAddonGUIWindow *m_Window; + int m_ControlId; + GUIHANDLE m_SettingsSliderHandle; + void *m_Handle; + void *m_cb; +}; + class CAddonListItem { friend class CAddonGUIWindow; @@ -383,6 +767,8 @@ friend class CAddonGUISpinControl; friend class CAddonGUIRadioButton; friend class CAddonGUIProgressControl; friend class CAddonGUIRenderingControl; +friend class CAddonGUISliderControl; +friend class CAddonGUISettingsSliderControl; public: CAddonGUIWindow(void *hdl, void *cb, const char *xmlFilename, const char *defaultSkin, bool forceFallback, bool asDialog); diff --git a/addons/skin.confluence/720p/DialogPVRChannelManager.xml b/addons/skin.confluence/720p/DialogPVRChannelManager.xml index 2bc8cda80f..b3130fe46f 100644 --- a/addons/skin.confluence/720p/DialogPVRChannelManager.xml +++ b/addons/skin.confluence/720p/DialogPVRChannelManager.xml @@ -245,16 +245,21 @@ </focusedlayout> </control> </control> - <control type="group" id="9002"> - <control type="group"> + <control type="group"> + <control type="grouplist" id="9002"> <left>490</left> - <top>70</top> - <control type="label"> + <top>75</top> + <onleft>60</onleft> + <onright>9000</onright> + <onup>34</onup> + <ondown>30</ondown> + <itemgap>5</itemgap> + <control type="label" id="9001"> <description>channel options Header</description> <left>0</left> <top>0</top> <width>380</width> - <height>20</height> + <height>25</height> <font>font12</font> <label>$LOCALIZE[31511]</label> <align>left</align> @@ -265,9 +270,9 @@ <control type="radiobutton" id="7"> <description>Channel activated</description> <left>0</left> - <top>25</top> + <top>0</top> <width>380</width> - <height>45</height> + <height>40</height> <font>font12</font> <textcolor>white</textcolor> <focusedcolor>white</focusedcolor> @@ -278,17 +283,13 @@ <texturenofocus border="5">button-nofocus.png</texturenofocus> <pulseonselect>no</pulseonselect> <label>19074</label> - <onleft>60</onleft> - <onright>9000</onright> - <onup>34</onup> - <ondown>8</ondown> </control> <control type="edit" id="8"> <description>Channel name</description> <left>0</left> - <top>75</top> + <top>0</top> <width>380</width> - <height>45</height> + <height>40</height> <font>font12</font> <textcolor>white</textcolor> <focusedcolor>white</focusedcolor> @@ -296,41 +297,43 @@ <texturefocus border="5">button-focus2.png</texturefocus> <texturenofocus border="5">button-nofocus.png</texturenofocus> <label>19201</label> - <onright>9000</onright> - <onleft>60</onleft> - <onup>7</onup> - <ondown>9</ondown> </control> - <control type="button" id="9"> - <description>Channel logo Button</description> + <control type="group" id="9005"> <left>0</left> - <top>125</top> + <top>0</top> <width>380</width> - <height>45</height> - <font>font12</font> - <texturefocus border="5">button-focus2.png</texturefocus> - <texturenofocus border="5">button-nofocus.png</texturenofocus> - <label>19202</label> - <onleft>60</onleft> - <onright>9000</onright> - <onup>8</onup> - <ondown>12</ondown> - </control> - <control type="image" id="10"> - <description>Current Channel Icon</description> - <left>337</left> - <top>128</top> - <width>39</width> - <height>39</height> - <aspectratio>keep</aspectratio> - <info>ListItem.Property(Icon)</info> + <height>40</height> + <control type="button" id="9"> + <description>Channel logo Button</description> + <left>0</left> + <top>0</top> + <width>380</width> + <height>40</height> + <font>font12</font> + <texturefocus border="5">button-focus2.png</texturefocus> + <texturenofocus border="5">button-nofocus.png</texturenofocus> + <label>19202</label> + <onleft>60</onleft> + <onright>9000</onright> + <onup>8</onup> + <ondown>12</ondown> + </control> + <control type="image"> + <description>Current Channel Icon</description> + <left>340</left> + <top>3</top> + <width>34</width> + <height>34</height> + <aspectratio>keep</aspectratio> + <info>ListItem.Property(Icon)</info> + </control> </control> <control type="radiobutton" id="12"> <description>EPG activated</description> <left>0</left> - <top>175</top> + <top>0</top> <width>380</width> - <height>45</height> + <height>40</height> <font>font12</font> <textcolor>white</textcolor> <focusedcolor>white</focusedcolor> @@ -341,32 +344,24 @@ <texturenofocus border="5">button-nofocus.png</texturenofocus> <pulseonselect>no</pulseonselect> <label>19206</label> - <onleft>60</onleft> - <onright>9000</onright> - <onup>9</onup> - <ondown>13</ondown> </control> <control type="spincontrolex" id="13"> <description>EPG source</description> <left>0</left> - <top>225</top> + <top>0</top> <width>380</width> - <height>45</height> + <height>40</height> <font>font12</font> <texturefocus border="5">button-focus2.png</texturefocus> <texturenofocus border="5">button-nofocus.png</texturenofocus> <label>19200</label> - <onright>9000</onright> - <onleft>60</onleft> - <onup>12</onup> - <ondown>14</ondown> </control> <control type="radiobutton" id="14"> <description>Parental locked</description> <left>0</left> - <top>275</top> + <top>0</top> <width>380</width> - <height>45</height> + <height>40</height> <font>font12</font> <textcolor>white</textcolor> <focusedcolor>white</focusedcolor> @@ -377,21 +372,23 @@ <texturenofocus border="5">button-nofocus.png</texturenofocus> <pulseonselect>no</pulseonselect> <label>19267</label> - <onleft>60</onleft> - <onright>9000</onright> - <onup>13</onup> - <ondown>30</ondown> </control> </control> - <control type="group"> + <control type="grouplist"> <left>490</left> - <top>420</top> - <control type="label"> + <top>375</top> + <itemgap>5</itemgap> + <onleft>60</onleft> + <onright>9000</onright> + <onup>14</onup> + <ondown>7</ondown> + <animation effect="slide" start="0,0" end="0,45" time="0" condition="!Control.IsVisible(31)">Conditional</animation> + <control type="label" id="9003"> <description>channel options Header</description> <left>0</left> <top>0</top> <width>380</width> - <height>20</height> + <height>25</height> <font>font12</font> <label>$LOCALIZE[31026]</label> <align>left</align> @@ -399,55 +396,46 @@ <textcolor>blue</textcolor> <shadowcolor>black</shadowcolor> </control> - <control type="button" id="30"> - <description>Group Manager Button</description> + <control type="button" id="31"> + <description>New channel Button</description> <left>0</left> - <top>25</top> + <top>0</top> <width>380</width> - <height>45</height> + <height>40</height> <font>font12</font> <texturefocus border="5">button-focus2.png</texturefocus> <texturenofocus border="5">button-nofocus.png</texturenofocus> <align>center</align> - <label>19205</label> - <onleft>60</onleft> - <onright>9000</onright> - <onup>14</onup> - <ondown>34</ondown> + <label>19204</label> </control> - <control type="button" id="34"> - <description>TV to Radio Button</description> + <control type="button" id="30"> + <description>Group Manager Button</description> <left>0</left> - <top>75</top> + <top>0</top> <width>380</width> - <height>45</height> + <height>40</height> <font>font12</font> - <visible>IsEmpty(Window.Property(IsRadio))</visible> <texturefocus border="5">button-focus2.png</texturefocus> <texturenofocus border="5">button-nofocus.png</texturenofocus> <align>center</align> - <label>19024</label> - <onleft>60</onleft> - <onright>9000</onright> - <onup>30</onup> - <ondown>7</ondown> + <label>19205</label> </control> - <control type="button" id="34"> - <description>Radio to TV Button</description> + <control type="togglebutton" id="34"> + <description>TV/Radio toggle</description> <left>0</left> - <top>75</top> + <top>0</top> <width>380</width> - <height>45</height> + <height>40</height> <font>font12</font> - <visible>!IsEmpty(Window.Property(IsRadio))</visible> <texturefocus border="5">button-focus2.png</texturefocus> <texturenofocus border="5">button-nofocus.png</texturenofocus> + <alttexturefocus border="5">button-focus2.png</alttexturefocus> + <alttexturenofocus border="5">button-nofocus.png</alttexturenofocus> <align>center</align> - <label>19023</label> - <onleft>60</onleft> - <onright>9000</onright> - <onup>30</onup> - <ondown>7</ondown> + <aligny>center</aligny> + <label>19024</label> + <altlabel>19023</altlabel> + <usealttexture>!IsEmpty(Window.Property(IsRadio))</usealttexture> </control> </control> </control> diff --git a/addons/skin.confluence/720p/DialogSeekBar.xml b/addons/skin.confluence/720p/DialogSeekBar.xml index 2e8d213319..694f749239 100644 --- a/addons/skin.confluence/720p/DialogSeekBar.xml +++ b/addons/skin.confluence/720p/DialogSeekBar.xml @@ -181,48 +181,8 @@ <visible>Player.Forwarding32x</visible> </control> </control> - - <control type="label"> - <description>Playing Label</description> - <left>20</left> - <top>7</top> - <width>240</width> - <height>20</height> - <align>left</align> - <aligny>center</aligny> - <font>font10_title</font> - <textcolor>blue</textcolor> - <label>$LOCALIZE[31042]</label> - <visible>Player.Playing + !Player.Seeking + !Player.DisplayAfterSeek</visible> - </control> - <control type="label"> - <description>Paused Label</description> - <left>20</left> - <top>7</top> - <width>240</width> - <height>20</height> - <align>left</align> - <aligny>center</aligny> - <font>font10_title</font> - <textcolor>blue</textcolor> - <label>31043</label> - <visible>[Player.Paused + !Player.Caching] + !Player.Seeking + !Player.DisplayAfterSeek</visible> - </control> <control type="label"> - <description>Cache Label</description> - <left>20</left> - <top>7</top> - <width>240</width> - <height>20</height> - <align>left</align> - <aligny>center</aligny> - <font>font10_title</font> - <textcolor>blue</textcolor> - <label>$LOCALIZE[15107] $INFO[Player.CacheLevel]%</label> - <visible>[Player.Paused + Player.Caching] + !Player.Seeking</visible> - </control> - <control type="label"> - <description>Seeking Label</description> + <description>Seekbar Label</description> <left>20</left> <top>7</top> <width>240</width> @@ -234,32 +194,6 @@ <label>$VAR[SeekLabel]</label> </control> <control type="label"> - <description>FF Label</description> - <left>20</left> - <top>7</top> - <width>240</width> - <height>20</height> - <align>left</align> - <aligny>center</aligny> - <font>font10_title</font> - <textcolor>blue</textcolor> - <label>31044</label> - <visible>Player.Forwarding</visible> - </control> - <control type="label"> - <description>RW Label</description> - <left>20</left> - <top>7</top> - <width>240</width> - <height>20</height> - <align>left</align> - <aligny>center</aligny> - <font>font10_title</font> - <textcolor>blue</textcolor> - <label>31045</label> - <visible>Player.Rewinding</visible> - </control> - <control type="label"> <description>Elapsed Time Label</description> <left>20</left> <top>23</top> diff --git a/addons/skin.confluence/720p/IncludesPVR.xml b/addons/skin.confluence/720p/IncludesPVR.xml index b1ea43ad6c..3b5285407a 100644 --- a/addons/skin.confluence/720p/IncludesPVR.xml +++ b/addons/skin.confluence/720p/IncludesPVR.xml @@ -189,7 +189,7 @@ <textcolor>blue</textcolor> <align>center</align> <aligny>center</aligny> - <visible>Control.IsVisible(5) | Control.IsVisible(6)</visible> + <visible>Control.IsVisible(5) | Control.IsVisible(6) | Control.IsVisible(7)</visible> </control> <control type="radiobutton" id="5"> <description>Group recording items by folder structure</description> @@ -205,6 +205,13 @@ <label>19051</label> <visible>Window.IsActive(TVChannels) | Window.IsActive(RadioChannels)</visible> </control> + <control type="radiobutton" id="7"> + <description>Show deleted recordings</description> + <textwidth>235</textwidth> + <include>ButtonCommonValues</include> + <label>19184</label> + <visible>Window.IsActive(TVRecordings) | Window.IsActive(RadioRecordings)</visible> + </control> <!-- Playback controls --> <include>CommonNowPlaying_Controls</include> </control> diff --git a/addons/skin.confluence/720p/includes.xml b/addons/skin.confluence/720p/includes.xml index d74023ff24..8cc7f5aae9 100644 --- a/addons/skin.confluence/720p/includes.xml +++ b/addons/skin.confluence/720p/includes.xml @@ -60,9 +60,14 @@ <value>$INFO[ListItem.VideoCodec]</value> </variable> <variable name="SeekLabel"> + <value condition="Player.Playing + !Player.Seeking + !Player.DisplayAfterSeek">$LOCALIZE[31042]</value> + <value condition="[Player.Paused + !Player.Caching] + !Player.Seeking + !Player.DisplayAfterSeek">$LOCALIZE[31043]</value> + <value condition="[Player.Paused + Player.Caching] + !Player.Seeking">$LOCALIZE[15107] $INFO[Player.CacheLevel]%</value> <value condition="!IsEmpty(Player.SeekStepSize) + ![player.forwarding | player.rewinding]">$LOCALIZE[31046][COLOR=grey] $INFO[Player.SeekStepSize][/COLOR]</value> <value condition="Player.DisplayAfterSeek + ![player.forwarding | player.rewinding]">$LOCALIZE[31046][COLOR=grey] $INFO[Player.SeekOffset][/COLOR]</value> <value condition="!Player.DisplayAfterSeek + Player.Seeking">$LOCALIZE[31046]</value> + <value condition="Player.Forwarding">$LOCALIZE[31044]</value> + <value condition="Player.Rewinding">$LOCALIZE[31045]</value> </variable> <include name="BehindDialogFadeOut"> @@ -74,7 +79,7 @@ <texture>black-back.png</texture> <animation effect="fade" time="400">Visible</animation> <animation effect="fade" time="200">Hidden</animation> - <visible>Window.IsActive(MovieInformation) | Window.IsActive(MusicInformation) | Window.IsActive(SongInformation) | Window.IsActive(FileBrowser) | Window.IsActive(TextViewer) | Window.IsActive(AddonSettings) | Window.IsActive(ContentSettings) | Window.IsActive(SelectDialog) | Window.IsActive(FileStackingDialog) | Window.IsActive(MediaSource) | Window.IsActive(PictureInfo) | Window.IsActive(PlayerControls) | Window.IsActive(VirtualKeyboard) | Window.IsActive(NumericInput) | Window.IsActive(ProfileSettings) | Window.IsActive(LockSettings) | Window.IsActive(SmartPlaylistEditor) | Window.IsActive(SmartPlaylistRule) | Window.IsActive(script-RSS_Editor-rssEditor.xml) | Window.IsActive(script-RSS_Editor-setEditor.xml) | Window.IsActive(AddonInformation) | Window.IsActive(Peripherals) | Window.IsActive(PeripheralSettings) | Window.IsActive(script-cu-lrclyrics-main.xml) | Window.IsActive(PVRChannelManager) | Window.IsActive(MediaFilter)</visible> + <visible>Window.IsActive(MovieInformation) | Window.IsActive(MusicInformation) | Window.IsActive(SongInformation) | Window.IsActive(FileBrowser) | Window.IsActive(TextViewer) | Window.IsActive(AddonSettings) | Window.IsActive(ContentSettings) | Window.IsActive(SelectDialog) | Window.IsActive(FileStackingDialog) | Window.IsActive(MediaSource) | Window.IsActive(PictureInfo) | Window.IsActive(PlayerControls) | Window.IsActive(VirtualKeyboard) | Window.IsActive(NumericInput) | Window.IsActive(ProfileSettings) | Window.IsActive(LockSettings) | Window.IsActive(SmartPlaylistEditor) | Window.IsActive(SmartPlaylistRule) | Window.IsActive(script-RSS_Editor-rssEditor.xml) | Window.IsActive(script-RSS_Editor-setEditor.xml) | Window.IsActive(AddonInformation) | Window.IsActive(Peripherals) | Window.IsActive(PeripheralSettings) | Window.IsActive(script-cu-lrclyrics-main.xml) | Window.IsActive(MediaFilter)</visible> </control> </include> <include name="WindowTitleCommons"> diff --git a/addons/skin.confluence/addon.xml b/addons/skin.confluence/addon.xml index c9182de5cc..08a5fe3947 100644 --- a/addons/skin.confluence/addon.xml +++ b/addons/skin.confluence/addon.xml @@ -5,7 +5,7 @@ name="Confluence" provider-name="Jezz_X, Team Kodi"> <requires> - <import addon="xbmc.gui" version="5.3.0"/> + <import addon="xbmc.gui" version="5.8.0"/> </requires> <extension point="xbmc.gui.skin" diff --git a/addons/skin.confluence/media/DefaultVideoDeleted.png b/addons/skin.confluence/media/DefaultVideoDeleted.png Binary files differnew file mode 100644 index 0000000000..cf6d3fb03c --- /dev/null +++ b/addons/skin.confluence/media/DefaultVideoDeleted.png diff --git a/addons/skin.re-touched b/addons/skin.re-touched -Subproject 5735e91eb92462b5a100d0aef0f673c1f7e0d72 +Subproject 1f7e925eaadda220f176ab3485ff6bc99b7c24e diff --git a/addons/xbmc.codec/addon.xml b/addons/xbmc.codec/addon.xml index 284c9b63b3..849ade5216 100644 --- a/addons/xbmc.codec/addon.xml +++ b/addons/xbmc.codec/addon.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<addon id="xbmc.codec" version="1.0.0" provider-name="Team-Kodi"> +<addon id="xbmc.codec" version="1.0.1" provider-name="Team-Kodi"> <requires> <import addon="xbmc.core" version="0.1.0"/> </requires> diff --git a/addons/xbmc.gui/addon.xml b/addons/xbmc.gui/addon.xml index bb2351c945..2e233be280 100644 --- a/addons/xbmc.gui/addon.xml +++ b/addons/xbmc.gui/addon.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<addon id="xbmc.gui" version="5.7.0" provider-name="Team-Kodi"> +<addon id="xbmc.gui" version="5.8.0" provider-name="Team-Kodi"> <backwards-compatibility abi="5.3.0"/> <requires> <import addon="xbmc.core" version="0.1.0"/> diff --git a/addons/xbmc.pvr/addon.xml b/addons/xbmc.pvr/addon.xml index 0d9187f52e..aa99e9f4d3 100644 --- a/addons/xbmc.pvr/addon.xml +++ b/addons/xbmc.pvr/addon.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<addon id="xbmc.pvr" version="1.9.3" provider-name="Team-Kodi"> +<addon id="xbmc.pvr" version="1.9.4" provider-name="Team-Kodi"> <requires> <import addon="xbmc.core" version="0.1.0"/> </requires> diff --git a/configure.in b/configure.in index b8bc6368f7..82c69470d6 100644 --- a/configure.in +++ b/configure.in @@ -611,6 +611,19 @@ case $host in use_cpu="i686" fi USE_STATIC_FFMPEG=1 + # Workaround a build issue on i386 with gcc 4.9: + # including <algorithm> pulls in SSE intrinsics. + # possible GCC bug? ideas welcome + if test "$GCC_CXX" = "yes"; then + GCC_VERSION=$($CXX -dumpversion) + GCC_MAJOR_VER=$(echo $GCC_VERSION | awk -F"." '{print $1}') + GCC_MINOR_VER=$(echo $GCC_VERSION | awk -F"." '{print $2}') + + if (test "$GCC_MAJOR_VER" -eq "4" && test "$GCC_MINOR_VER" -ge "9") || (test "$GCC_MAJOR_VER" -gt "4"); then + CXXFLAGS="$CXXFLAGS -msse" + AC_MSG_NOTICE("detected gcc version $GCC_VERSION - enabling SSE") + fi + fi ;; x86_64-*-linux-gnu*|x86_64-*-linux-uclibc*) ARCH="x86_64-linux" @@ -775,8 +788,8 @@ else DEBUG_FLAGS="-DNDEBUG=1" fi fi -CFLAGS="$CFLAGS $DEBUG_FLAGS" -CXXFLAGS="$CXXFLAGS $DEBUG_FLAGS" +CFLAGS="$DEBUG_FLAGS $CFLAGS" +CXXFLAGS="$DEBUG_FLAGS $CXXFLAGS" if test "$use_optimizations" = "yes"; then @@ -843,15 +856,15 @@ fi use_sse4=no if test "$ARCH" = "x86_64-linux" || test "$ARCH" = "i486-linux"; then - SAVE_CFLAGS="$CFLAGS" - CFLAGS="-msse4.1" - AC_COMPILE_IFELSE( - [AC_LANG_SOURCE([int foo;])], - [ use_sse4=yes - USE_SSE4=1], - [ use_sse=no - USE_SSE4=0]) - CFLAGS="$SAVE_CFLAGS" + SAVE_CFLAGS="$CFLAGS" + CFLAGS="-msse4.1" + AC_COMPILE_IFELSE( + [AC_LANG_SOURCE([int foo;])], + [ use_sse4=yes + USE_SSE4=1], + [ use_sse4=no + USE_SSE4=0]) + CFLAGS="$SAVE_CFLAGS" fi # Checks for library functions. @@ -1067,7 +1080,7 @@ AC_CHECK_HEADER([ogg/ogg.h],, AC_MSG_ERROR($missing_library)) AC_CHECK_HEADER([vorbis/vorbisfile.h],, AC_MSG_ERROR($missing_library)) AC_CHECK_HEADER([libmodplug/modplug.h],, AC_MSG_ERROR($missing_library)) -AC_CHECK_HEADER([curl/curl.h],, AC_MSG_ERROR($missing_library)) +PKG_CHECK_MODULES([LIBCURL], [libcurl],, AC_MSG_ERROR([libcurl not found])) XB_FIND_SONAME([CURL], [curl]) AC_MSG_CHECKING([for CRYPTO_set_locking_callback(0) in $CURL_SONAME]) if test "$host_vendor" = "apple" ; then diff --git a/docs/README.android b/docs/README.android index ed7689066d..dd636d757b 100644 --- a/docs/README.android +++ b/docs/README.android @@ -200,6 +200,8 @@ on with the Android toolchain and creating an Android Application Package having to input these with each configure. # make -j <jobs> + # make -j <jobs> -C target/xbmc-pvr-addons + # make -j <jobs> -C target/xbmc-audioencoder-addons This build was designed to be massively parallel. Don't be afraid to give it a 'make -j20' or so. diff --git a/docs/README.ios b/docs/README.ios index e1d0444612..e0b0a462c2 100644 --- a/docs/README.ios +++ b/docs/README.ios @@ -3,26 +3,28 @@ TOC 2. Getting the source code 3. Install required libs 3.1. Install Xcode + 3.1.1 Supported Xcode and OSX constellations 3.2. Install Cross libs and runtime environment 4. How to compile and run 4.1 Using XCode 4.2 Using Command line 5. Packaging 6. Gesture Handling on iPad/iPhone/iPod touch -7. Remote control on ATV2 -8. Usage/Development on un-jailbroken devices (only interesting for official +7. Usage/Development on un-jailbroken devices (only interesting for official apple developers!) ----------------------------------------------------------------------------- 1. Introduction ----------------------------------------------------------------------------- This is a platform port of Kodi for the Apple iOS operating system. -The current build system supports Xcode 3.2.6, 4.3.x, 5.x.x, 6.0.1, 6.1.0 with iOS SDK 4.3/5.1/6/7/8/8.1 +The current build system supports Xcode 6.0.1 and 6.1.0 with iOS SDK 8.1 There are two ways to build Kodi for Mac. 1) command-line or 2) Xcode. +The minimum version of iOS you need to run(!) Kodi is 5.1.1 atm. + Generally, Xcode is the easiest as it presents the build system in a GUI environment. The command-line build is still under development. @@ -44,45 +46,30 @@ character itself should NOT be typed as part of the command. $ git submodule update --init addons/skin.re-touched ----------------------------------------------------------------------------- -3.0 Install Xcode +3.1 Install Xcode ----------------------------------------------------------------------------- -See point 3.0a below for an updated list of supported Xcode/osx constellations!!! +See point 3.1.1 below for an updated list of supported Xcode/osx constellations!!! Install latest Xcode (6.1.0 as of the writing). You can download it from 1. The MacOSX AppStore (Xcode). -If you are using XCode 4.3.x you also need to install the "Command Line Tools". To do so -after installing Xcode you have to go to "Xcode->Preferences->Downloads" and install the -package "Command Line Tools". In later XCode versions as of 5.x those will be installed -automatically once they are invoked from the cmdline. -Xcode 3.2.6 only runs on 10.6.x (Snow Leopard). -Xcode 4.3.x only runs on 10.7.x (Lion). -Xcode 5.x.x only runs on 10.8.x and later. -Xcode 6.0.1 only runs on 10.9.4 and later. -Xcode 6.1.0 only runs on 10.9.5 and later. +Xcode 6.1.0 only runs on 10.9.5 and later (at least Mavericks). -The preferred iOS SDK Version is 4.3 (when using Xcode 3.2.6) or 5.1 (when using -Xcode 4.3.x) or 7.x (when using Xcode 5.x.x) or 8.x (when using Xcode 6.x.x) +The preferred iOS SDK Version is 8.1. ----------------------------------------------------------------------------- -3.0a Supported Xcode and OSX constellations +3.1.1 Supported Xcode and OSX constellations ----------------------------------------------------------------------------- -As far as we know the compilation for ios and atv2 should work with the following +As far as we know the compilation for ios should work with the following constellations of Xcode and osx versions (to be updated once we know more): -1. XCode 3.2.6 against iOS SDK 4.3 on 10.6.x (Snow Leopard) -2. XCode 4.3.x against iOS SDK 4.3 and 5.1 on 10.7.x (Lion) -3. XCode 4.6 against iOS SDK 4.3, 5.1 and 6.1 on 10.7.x (Lion) and 10.8.x (ML) -3.a Building against iOS SDK 6.0 will only allow to run on targets with iOS 5.1 and below. - There is no support for devices running iOS 6.0 for now! -4. Xcode 5.1.1 against iOS SDK 7.0 and 7.1 on 10.9.x (Mavericks) -5. Xcode 6.0.1 against iOS SDK 8.0 on 10.9.x (Mavericks) -6. Xcode 6.1.0 against iOS SDK 8.1 on 10.10.x (Yosemite) +1. Xcode 6.0.1 against iOS SDK 8.0 on 10.9.x (Mavericks) +2. Xcode 6.1.0 against iOS SDK 8.1 on 10.10.x (Yosemite) ----------------------------------------------------------------------------- -3.1 Install Cross libs and runtime environment +3.2 Install Cross libs and runtime environment ----------------------------------------------------------------------------- The following commands will build using the latest iOS SDK found on your @@ -93,16 +80,18 @@ constellations of Xcode and osx versions (to be updated once we know more): $ ./bootstrap $ ./configure --host=arm-apple-darwin $ make - + $ make -C target/xbmc-pvr-addons + $ make -C target/xbmc-audioencoder-addons + NOTE: You can speedup compilation on multicore systems by doing "make -j<number of cores>" instead of "make". For a dualcore this would read: "make -j2" ADVANCED developers only! If you want to specify an iOS SDK version (if multiple versions are installed) - then append it to the configure line - above (example below would use iOS SDK 6.0): + above (example below would use iOS SDK 8.0): - $ ./configure --host=arm-apple-darwin --with-sdk=6.0 + $ ./configure --host=arm-apple-darwin --with-sdk=8.0 Ensure that you also adapt the xcode project to use this SDK version or if building via cmdline the SDKROOT parameter of the xcodebuild command. @@ -111,7 +100,7 @@ constellations of Xcode and osx versions (to be updated once we know more): 4. How to compile ----------------------------------------------------------------------------- Both Xcode and Terminal compilation require that build environment be setup -from the step 3.1. +from the step 3.2. $ cd $HOME/Kodi $ make -C tools/depends/target/xbmc @@ -125,32 +114,23 @@ Start XCode and open the Kodi project (Kodi.xcodeproj) located in $HOME/Kodi. There are two relevant build configurations : Release and Debug. Compile always for device -end not simulator and select the wanted target (either Kodi-iOS or Kodi-ATV2) +end not simulator and select the target Kodi-iOS. -If you have selected a specific iOS SDK Version in step 3.1 then you might need +If you have selected a specific iOS SDK Version in step 3.2 then you might need to adapt the active target to use the same iOS SDK version. Else build will fail (you will see alot of errors with at least non-found boost/shared_ptr.hpp). -On XCode5.x apple removed the gcc compiler. On those XCode versions you need to switch the compiler -of the ATV2 project manually to "default/clang". - ----------------------------------------------------------------------------- 4.2 Using Terminal (command-line) ----------------------------------------------------------------------------- $ cd $HOME/Kodi $ xcodebuild -project Kodi.xcodeproj -target Kodi-iOS -configuration Release build \ - ONLY_ACTIVE_ARCH=YES ARCHS=armv7 VALID_ARCHS=armv7 IPHONEOS_DEPLOYMENT_TARGET=4.3 \ - SDKROOT=iphoneos4.3 - -or - - $ xcodebuild -project Kodi.xcodeproj -target Kodi-ATV2 -configuration Release build \ - ONLY_ACTIVE_ARCH=YES ARCHS=armv7 VALID_ARCHS=armv7 IPHONEOS_DEPLOYMENT_TARGET=4.3 \ - SDKROOT=iphoneos4.3 + ONLY_ACTIVE_ARCH=YES ARCHS=armv7 VALID_ARCHS=armv7 SDKROOT=iphoneos8.0 Make sure to set SDKROOT to the iOS SDK you want to use. This should be the same - you used on point 3.1! + you used on point 3.2! If latest SDK should be used (and you didn't specify anything + in step 3.2) - just remove the SDKROOT=iphoneos8.0 from the command line. ----------------------------------------------------------------------------- 5. Packaging @@ -159,23 +139,19 @@ or This section describes how to package Kodi in a deb image for distribution. - 1. build Kodi for iOS or ATV2 from XCode so that the application bundle is + 1. build Kodi for iOS from XCode so that the application bundle is correctly updated. 2. - $ cd tools/darwin/packaging/atv2 - or $ cd tools/darwin/packaging/ios - 3. $ chmod +x ./mkdeb-atv2.sh && ./mkdeb-atv2.sh release - or - $ chmod +x ./mkdeb-ios.sh && ./mkdeb-ios.sh release + 3. $ chmod +x ./mkdeb-ios.sh && ./mkdeb-ios.sh release 4. Use release or debug - you have to be sure that you build the corresponding version before. - 5. The resulting deb file can be copied to the iOS/ATV2 via ssh/scp and then be - installed manually. For this you need to ssh into the iOS/ATV2 and do: + 5. The resulting deb file can be copied to the iOS device via ssh/scp and then be + installed manually. For this you need to ssh into the iOS device and do: $ dpkg -i <name of the deb file> ----------------------------------------------------------------------------- @@ -188,26 +164,19 @@ distribution. - panning, and flicking -> for navigating in lists - dragging -> for scrollbars and sliders - zoom gesture -> in the pictureviewer - ------------------------------------------------------------------------------ -7. Remote control on ATV2 ------------------------------------------------------------------------------ - - - Select -> like enter/left click - OK button on other remotes (during playback its pause by defaul) - - Select long press -> During playback show the overlay - - Cursor keys -> for moving around and selecting controls - - Menu -> back - - Menu long press -> context menu + Gestures can be adapted in system/keymaps/touchscreen.xml + ------------------------------------------------------------------------------ -8. Usage/Development on un-jailbroken devices (only interesting for official apple developers!) +7. Usage/Development on un-jailbroken devices (only interesting for official apple developers!) ------------------------------------------------------------------------------ If you are a developer with an official apple code signing identity you can deploy Kodi via xcode to work on it on non-jailbroken devices. For this to happen you just need to alter the Xcode project by setting your codesign identity. Be sure to not just select the "iPhone Developer" shortcut but instead select your full identity "iPhone Developer: your name (your id)" (this is important else our sign -script won't detect a real sign identity). After that the last buildstep in our support script +script won't detect a real sign identity). Its also important that you select the signing on all 4 spots +in the project settings. After that the last buildstep in our support script will do a full sign of all binaries and the bundle with the given identity (all *.viz, *.pvr, *.so files Xcode doesn't know anything about). This should allow you to deploy Kodi to all non-jailbroken devices which you can deploy normal apps to. In that case (Kodi will be sandboxed like any other app) - all Kodi diff --git a/docs/README.linux b/docs/README.linux index a9f1f271e5..a40c2f61a1 100644 --- a/docs/README.linux +++ b/docs/README.linux @@ -98,9 +98,10 @@ Tip: By adding -j<number> to the make command, you describe how many $ make -j2 -Note: From v14 with commit 4090a5f a new API for binary audio encoder addons is available, if you need to compile them do: +Note: From v14 with commit 4090a5f a new API for binary audio encoder and pvr addons is available, if you need to compile them do: - $ make -C tools/depends/target/xbmc-audioencoder-addons PREFIX=/<system prefix you added on step 4.1 + $ make -C tools/depends/target/xbmc-audioencoder-addons PREFIX=/<system prefix you added on step 4.1> + $ make -C tools/depends/target/xbmc-pvr-addons PREFIX=/<system prefix you added on step 4.1> .3 $ make install diff --git a/docs/README.osx b/docs/README.osx index 9bba999d45..933d5a4f66 100644 --- a/docs/README.osx +++ b/docs/README.osx @@ -3,7 +3,11 @@ TOC 2. Getting the source code 3. Install required libs 3.1. Install Xcode + 3.1.1 Supported Xcode and OSX constellations 3.2. Install Kodi build depends + 3.2.1 Compiling as 32 Bit binary + 3.2.2 Compiling as 64 Bit binary + 3.2.3 Compile binary addons 4. How to compile and run 4.1 Using XCode 4.2 Using Command line @@ -13,31 +17,28 @@ TOC 1. Introduction ----------------------------------------------------------------------------- -This is a platform port of Kodi for the Apple OSX operating system. 10.6, 10.7 -10.8, 10.9 and 10.10 Intel development platforms are supported. Xcode 3.2.6 and 4.3 and newer -are the recommended versions. +This is a platform port of Kodi for the Apple OSX operating system. 10.9 and 10.10 Intel development +platforms are supported. Xcode 6 newer are the recommended versions. There are 3 ways to build Kodi for Mac, from command-line with make, from command-line using xcodebuild or from Xcode. +The minimum version of OSX you need to run(!) Kodi is 10.7 atm. + Generally, Xcode is the easiest as it presents the build system in a GUI environment. The command-line build is still under development. Kodi for Mac is composed of a main binary with numerous dynamic libraries and codecs that support a multitude of music and video formats. -On Snow Leopard (OSX 10.6.x) we recommend using Xcode 3.2.6. -On Lion (OSX 10.7.x) we recommend using Xcode 4.3.x. -On Mountain Lion (OSX 10.8.1) we recommend using Xcode 4.4. -On Mavericks (OSX 10.9.3) we recommend using Xcode 5.1.1 or 6.0.1. -On Yosemite (OSX 10.10) we recommend using Xcode 6.1. +On Mavericks (OSX 10.9.x) we recommend using Xcode 6.1. +On Yosemite (OSX 10.10.x) we recommend using Xcode 6.1. NOTE TO NEW OS X USERS: All lines that are prefixed with the '$' character are commands that need to be typed into a Terminal window. Note that the '$' character itself should NOT be typed as part of the command. -ATTENTION: When using Mountain Lion (OSX 10.8.x), Mavericks (10.9.x) or Yosemite (10.10.x) you -need to download and install XQuartz from https://xquartz.macosforge.org/landing/ since its not part of OSX -anymore. +ATTENTION: You need to download and install XQuartz from https://xquartz.macosforge.org/landing/ since +its not part of OSX anymore since 10.8. ----------------------------------------------------------------------------- 2. Getting the source code @@ -47,69 +48,56 @@ anymore. $ git clone git://github.com/xbmc/xbmc.git Kodi ----------------------------------------------------------------------------- -3.0 Install XCODE +3.1 Install XCODE ----------------------------------------------------------------------------- -See point 3.0a below for an updated list of supported/tested Xcode/osx constellations!!! - -Install latest Xcode (6.1.0 or 3.2.6 as of the writing). You can download it from - -1. Apple's site after registration at http://developer.apple.com/tools/download (Xcode 3.2.6) -2. In the MacOSX AppStore (Xcode 4.3.x and later). +See point 3.1.1 below for an updated list of supported/tested Xcode/osx constellations!!! -If you are using XCode 4.3.x or later you also need to install the "Command Line Tools". To do so -after installing Xcode you have to go to "Xcode->Preferences->Downloads" and install the -package "Command Line Tools". This is not needed anymore in Xcode 5.x. Command Line Tools are installed -automagically on first invoke. +Install latest Xcode (6.1.0 ). You can download it from the MacOSX AppStore (Xcode). -Xcode 3.2.6 only runs on 10.6.x (Snow Leopard). -Xcode 4.3.x only runs on 10.7.x (Lion). -Xcode 4.4 only runs on 10.8.x (Mountain Lion). -Xcode 5.1.1 runs on 10.8.x and 10.9.x (Mavericks). -Xcode 6.0.1 runs on 10.9.4 and later (Mavericks). -Xcode 6.1 runs on 10.9.5 and later (Mavericks). +Xcode 6.1 runs on 10.9.5 and later (at least Mavericks). ----------------------------------------------------------------------------- -3.0a Supported Xcode and OSX constellations +3.1.1 Supported Xcode and OSX constellations ----------------------------------------------------------------------------- As far as we know the compilation for mac osx should work with the following constellations of Xcode and osx versions (to be updated once we know more): -1. XCode 3.2.6 against OSX SDK 10.6 on 10.6.x (Snow Leopard) -2. XCode 4.3.x against OSX SDK 10.6 and 10.7 on 10.7.x (Lion) -3. XCode 4.6 against OSX SDK 10.6, 10.7 and 10.8 on 10.7.x (Lion) and 10.8.x (ML) -4. XCode 5.1.1 against OSX SDK 10.8 (ML) and 10.9 (M) -5. XCode 6.0.1 against OSX SDK 10.9 (M) -6. XCode 6.1.0 against OSX SDK 10.10 (Y) +1. XCode 6.0.1 against OSX SDK 10.9 (M) +2. XCode 6.1.0 against OSX SDK 10.10 (Y) ----------------------------------------------------------------------------- -3.1 Install Kodi build depends +3.2 Install Kodi build depends ----------------------------------------------------------------------------- The following commands will build using the latest OSX SDK found on your system. -3.1.1 Compiling as 32 Bit binary +3.2.1 Compiling as 32 Bit binary $ cd $HOME/Kodi $ cd tools/depends $ ./bootstrap $ ./configure --host=i386-apple-darwin $ make -3.1.2 Compiling as 64 Bit binary +3.2.2 Compiling as 64 Bit binary $ cd $HOME/Kodi $ cd tools/depends $ ./bootstrap $ ./configure --host=x86_64-apple-darwin $ make +3.2.3 Compile binary addons + $ make -C target/xbmc-pvr-addons + $ make -C target/xbmc-audioencoder-addons + NOTE: You can speedup compilation on multicore systems by doing "make -j<number of cores>" instead of "make". For a dualcore this would read: "make -j2" ADVANCED developers only! If you want to specify an OSX SDK version (if multiple versions are installed) - then append it to the configure line - above (example below would use OSX SDK 10.7 and build for 64bit): + above (example below would use OSX SDK 10.9 and build for 64bit): - $ ./configure --host=x86_64-apple-darwin --with-sdk=10.7 + $ ./configure --host=x86_64-apple-darwin --with-sdk=10.9 Ensure that you also adapt the xcode project to use this SDK version. @@ -146,12 +134,7 @@ For development, Kodi is run from the $HOME/Kodi directory and needs to have the KODI_HOME environment variable set to know where that directory is located. To set KODI_HOME environment variable: -Xcode 3.2.6 - Menu -> Project -> Edit Active Executable "Kodi", click "Arguments" tab and - add "KODI_HOME" as an enviroment variable. Set the value to the path to the - Kodi root folder. For example, "/Users/bigdog/Documents/Kodi" - -Xcode 4.3.x and later +Xcode 6 and later Menu -> Product -> Edit Sheme -> "Run Kodi"/"Debug" -> Add KODI_HOME into the List of "Environment Variables". Set the value to the path to the Kodi root folder. For example, "/Users/bigdog/Documents/Kodi" @@ -159,13 +142,13 @@ Xcode 4.3.x and later There are two build targets "Kodi" and "Kodi.app" (each in 32Bit and 64Bit flavour) with debug and release settings. The "Kodi" target is used for rapid build and debug cycles while the "Kodi.app" target is used to build a self contained -OSX application. +OSX application bundle. Set the build target to "Kodi" or "Kodi.app" and be sure to select the same -architecture as selected in step 3.1 (either i386 for 32Bit or x86_64 for 64Bit), +architecture as selected in step 3.2 (either i386 for 32Bit or x86_64 for 64Bit), then build. -If you have selected a specific OSX SDK Version in step 3.1 then you might need +If you have selected a specific OSX SDK Version in step 3.2 then you might need to adapt the active target to use the same OSX SDK version. Else build will fail (you will see alot of errors with at least non-found boost/shared_ptr.hpp). @@ -191,7 +174,7 @@ $ xcodebuild -configuration Release ONLY_ACTIVE_ARCH=YES ARCHS=i386 VALID_ARCHS= -target "Kodi.app" -project Kodi.xcodeproj You can specify "Release" instead of "Debug" as a configuration. Be sure to set *_ARCHS -variables to the same architecture as selected in step 3.1 (either i386 for 32Bit or x86_64 +variables to the same architecture as selected in step 3.2 (either i386 for 32Bit or x86_64 for 64Bit). ----------------------------------------------------------------------------- @@ -200,15 +183,14 @@ for 64Bit). There are two methods, a) make/Xcode and b) make (which might fail as it's under construction). -If you want to build a cross-compiled version that can run under 10.6/10.7, -you could try xcodebuild from the command-line (normally unneeded - for advanced -developers). +You could try xcodebuild from the command-line with altered SDK - like 10.9 in the example +below(normally unneeded - for advanced developers). a) $ cd $HOME/Kodi $ export KODI_HOME=`pwd` $ make xcode_depends - $ xcodebuild -sdk macosx10.7 -project Kodi.xcodeproj -target Kodi.app ONLY_ACTIVE_ARCH=YES \ + $ xcodebuild -sdk macosx10.9 -project Kodi.xcodeproj -target Kodi.app ONLY_ACTIVE_ARCH=YES \ ARCHS=x86_64 VALID_ARCHS=x86_64 -configuration Release build b) building via make @@ -227,7 +209,7 @@ distribution. 2. $ cd tools/darwin/packaging/osx - 3. $ ./mkdmg-osx.sh release + 3. $ chmod +x ./mkdeb-osx.sh && ./mkdmg-osx.sh release 4. Use release or debug - you have to be sure that you build the corresponding version before. diff --git a/language/English/strings.po b/language/English/strings.po index 140d4eb640..4871e3b3e9 100755..100644 --- a/language/English/strings.po +++ b/language/English/strings.po @@ -8292,7 +8292,11 @@ msgctxt "#19167" msgid "Scan for missing icons" msgstr "" -#empty string with id 19168 +#. Used in system info to show amount of it +#: xbmc/windows/GUIWindowSystemInfo.cpp +msgctxt "#19168" +msgid "Deleted and recoverable recordings" +msgstr "" msgctxt "#19169" msgid "Hide video information box" @@ -8343,7 +8347,11 @@ msgctxt "#19178" msgid "Show channel information when switching channels" msgstr "" -#empty string with id 19179 +#. Used as extension header on recordings window +#: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp +msgctxt "#19179" +msgid "Deleted" +msgstr "" #: system/settings/settings.xml msgctxt "#19180" @@ -8365,7 +8373,11 @@ msgctxt "#19183" msgid "Radio" msgstr "" -#empty string with id 19184 +#. Used on pvr recordings as button to show of them +#: skin.confluence +msgctxt "#19184" +msgid "Deleted recordings" +msgstr "" #: system/settings/settings.xml msgctxt "#19185" @@ -8839,7 +8851,37 @@ msgctxt "#19289" msgid "Hide group" msgstr "" -#empty strings from id 19290 to 19498 +#. Used on recordings context menu +#: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp +msgctxt "#19290" +msgid "Undelete" +msgstr "" + +#. Used on recordings context menu +#: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp +msgctxt "#19291" +msgid "Delete permanently" +msgstr "" + +#. Used on recordings context menu +#: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp +msgctxt "#19292" +msgid "Delete all permanently" +msgstr "" + +#. Used on yes no dialog +#: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp +msgctxt "#19293" +msgid "Delete all recordings permanently?" +msgstr "" + +#. Used on yes no dialog +#: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp +msgctxt "#19294" +msgid "Delete this recording permanently?" +msgstr "" + +#empty strings from id 19295 to 19498 #: xbmc/epg/Epg.cpp msgctxt "#19499" @@ -11280,7 +11322,10 @@ msgctxt "#21415" msgid "Default music video scraper" msgstr "" -#empty string with id 21416 +#: system/settings/settings.xml +msgctxt "#21416" +msgid "Jump to first unwatched TV show season/episode" +msgstr "" #: system/settings/settings.xml msgctxt "#21417" @@ -11503,7 +11548,11 @@ msgctxt "#21465" msgid "Above video" msgstr "" -#empty string with id 21466 +#. Description of setting "Videos -> Library -> Jump to first unwatched TV show season/episode" with label #21416 +#: system/settings/settings.xml +msgctxt "#21466" +msgid "When entering a TV show season or episode view automatically jump to the first unwatched season or episode." +msgstr "" #. Filter (media data) from float value to float value #: xbmc/dialogs/GUIDialogMediaFilter.cpp diff --git a/lib/addons/library.xbmc.gui/libXBMC_gui.cpp b/lib/addons/library.xbmc.gui/libXBMC_gui.cpp index 31b499e650..b7fb237069 100644 --- a/lib/addons/library.xbmc.gui/libXBMC_gui.cpp +++ b/lib/addons/library.xbmc.gui/libXBMC_gui.cpp @@ -81,6 +81,158 @@ DLLEXPORT int GUI_get_video_resolution(void *hdl, void *cb) return ((CB_GUILib*)cb)->GetVideoResolution(); } +/*! @name GUI Keyboard functions */ +//@{ +DLLEXPORT bool GUI_dialog_keyboard_show_and_get_input_with_head(void *hdl, void *cb, char &aTextString, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, bool hiddenInput, unsigned int autoCloseMs) +{ + return ((CB_GUILib*)cb)->Dialog_Keyboard_ShowAndGetInputWithHead(aTextString, iMaxStringSize, strHeading, allowEmptyResult, hiddenInput, autoCloseMs); +} + +DLLEXPORT bool GUI_dialog_keyboard_show_and_get_input(void *hdl, void *cb, char &aTextString, unsigned int iMaxStringSize, bool allowEmptyResult, unsigned int autoCloseMs) +{ + return ((CB_GUILib*)cb)->Dialog_Keyboard_ShowAndGetInput(aTextString, iMaxStringSize, allowEmptyResult, autoCloseMs); +} + +DLLEXPORT bool GUI_dialog_keyboard_show_and_get_new_password_with_head(void *hdl, void *cb, char &newPassword, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, unsigned int autoCloseMs) +{ + return ((CB_GUILib*)cb)->Dialog_Keyboard_ShowAndGetNewPasswordWithHead(newPassword, iMaxStringSize, strHeading, allowEmptyResult, autoCloseMs); +} + +DLLEXPORT bool GUI_dialog_keyboard_show_and_get_new_password(void *hdl, void *cb, char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs) +{ + return ((CB_GUILib*)cb)->Dialog_Keyboard_ShowAndGetNewPassword(strNewPassword, iMaxStringSize, autoCloseMs); +} + +DLLEXPORT bool GUI_dialog_keyboard_show_and_verify_new_password_with_head(void *hdl, void *cb, char &strNewPassword, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, unsigned int autoCloseMs) +{ + return ((CB_GUILib*)cb)->Dialog_Keyboard_ShowAndVerifyNewPasswordWithHead(strNewPassword, iMaxStringSize, strHeading, allowEmptyResult, autoCloseMs); +} + +DLLEXPORT bool GUI_dialog_keyboard_show_and_verify_new_password(void *hdl, void *cb, char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs) +{ + return ((CB_GUILib*)cb)->Dialog_Keyboard_ShowAndVerifyNewPassword(strNewPassword, iMaxStringSize, autoCloseMs); +} + +DLLEXPORT int GUI_dialog_keyboard_show_and_verify_password(void *hdl, void *cb, char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries, unsigned int autoCloseMs) +{ + return ((CB_GUILib*)cb)->Dialog_Keyboard_ShowAndVerifyPassword(strPassword, iMaxStringSize, strHeading, iRetries, autoCloseMs); +} + +DLLEXPORT bool GUI_dialog_keyboard_show_and_get_filter(void *hdl, void *cb, char &aTextString, unsigned int iMaxStringSize, bool searching, unsigned int autoCloseMs) +{ + return ((CB_GUILib*)cb)->Dialog_Keyboard_ShowAndGetFilter(aTextString, iMaxStringSize, searching, autoCloseMs); +} + +DLLEXPORT bool GUI_dialog_keyboard_send_text_to_active_keyboard(void *hdl, void *cb, const char *aTextString, bool closeKeyboard) +{ + return ((CB_GUILib*)cb)->Dialog_Keyboard_SendTextToActiveKeyboard(aTextString, closeKeyboard); +} + +DLLEXPORT bool GUI_dialog_keyboard_is_activated(void *hdl, void *cb) +{ + return ((CB_GUILib*)cb)->Dialog_Keyboard_isKeyboardActivated(); +} +//@} + +/*! @name GUI Numeric functions */ +//@{ +DLLEXPORT bool GUI_dialog_numeric_show_and_verify_new_password(void *hdl, void *cb, char &strNewPassword, unsigned int iMaxStringSize) +{ + return ((CB_GUILib*)cb)->Dialog_Numeric_ShowAndVerifyNewPassword(strNewPassword, iMaxStringSize); +} + +DLLEXPORT int GUI_dialog_numeric_show_and_verify_password(void *hdl, void *cb, char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries) +{ + return ((CB_GUILib*)cb)->Dialog_Numeric_ShowAndVerifyPassword(strPassword, iMaxStringSize, strHeading, iRetries); +} + +DLLEXPORT bool GUI_dialog_numeric_show_and_verify_input(void *hdl, void *cb, char &strPassword, unsigned int iMaxStringSize, const char *strHeading, bool bGetUserInput) +{ + return ((CB_GUILib*)cb)->Dialog_Numeric_ShowAndVerifyInput(strPassword, iMaxStringSize, strHeading, bGetUserInput); +} + +DLLEXPORT bool GUI_dialog_numeric_show_and_get_time(void *hdl, void *cb, tm &time, const char *strHeading) +{ + return ((CB_GUILib*)cb)->Dialog_Numeric_ShowAndGetTime(time, strHeading); +} + +DLLEXPORT bool GUI_dialog_numeric_show_and_get_date(void *hdl, void *cb, tm &date, const char *strHeading) +{ + return ((CB_GUILib*)cb)->Dialog_Numeric_ShowAndGetDate(date, strHeading); +} + +DLLEXPORT bool GUI_dialog_numeric_show_and_get_ipaddress(void *hdl, void *cb, char &IPAddress, unsigned int iMaxStringSize, const char *strHeading) +{ + return ((CB_GUILib*)cb)->Dialog_Numeric_ShowAndGetIPAddress(IPAddress, iMaxStringSize, strHeading); +} + +DLLEXPORT bool GUI_dialog_numeric_show_and_get_number(void *hdl, void *cb, char &strInput, unsigned int iMaxStringSize, const char *strHeading, unsigned int iAutoCloseTimeoutMs) +{ + return ((CB_GUILib*)cb)->Dialog_Numeric_ShowAndGetNumber(strInput, iMaxStringSize, strHeading, iAutoCloseTimeoutMs); +} + +DLLEXPORT bool GUI_dialog_numeric_show_and_get_seconds(void *hdl, void *cb, char &timeString, unsigned int iMaxStringSize, const char *strHeading) +{ + return ((CB_GUILib*)cb)->Dialog_Numeric_ShowAndGetSeconds(timeString, iMaxStringSize, strHeading); +} +//@} + +/*! @name GUI File browser functions */ +//@{ +DLLEXPORT bool GUI_dialog_filebrowser_show_and_get_file(void *hdl, void *cb, const char *directory, const char *mask, const char *heading, char &path, unsigned int iMaxStringSize, bool useThumbs = false, bool useFileDirectories = false, bool singleList = false) +{ + return ((CB_GUILib*)cb)->Dialog_FileBrowser_ShowAndGetFile(directory, mask, heading, path, iMaxStringSize, useThumbs, useFileDirectories, singleList); +} +//@} + +/*! @name GUI OK Dialog functions */ +//@{ +DLLEXPORT void GUI_dialog_ok_show_and_get_input_single_text(void *hdl, void *cb, const char *heading, const char *text) +{ + return ((CB_GUILib*)cb)->Dialog_OK_ShowAndGetInputSingleText(heading, text); +} + +DLLEXPORT void GUI_dialog_ok_show_and_get_input_line_text(void *hdl, void *cb, const char *heading, const char *line0, const char *line1, const char *line2) +{ + return ((CB_GUILib*)cb)->Dialog_OK_ShowAndGetInputLineText(heading, line0, line1, line2); +} +//@} + +/*! @name GUI OK Dialog functions */ +//@{ +DLLEXPORT bool GUI_dialog_yesno_show_and_get_input_linetext(void *hdl, void *cb, const char *heading, const char *line0, const char *line1, const char *line2, const char *noLabel, const char *yesLabel) +{ + return ((CB_GUILib*)cb)->Dialog_YesNo_ShowAndGetInputLineText(heading, line0, line1, line2, noLabel, yesLabel); +} + +DLLEXPORT bool GUI_dialog_yesno_show_and_get_input_singletext(void *hdl, void *cb, const char *heading, const char *text, bool& bCanceled, const char *noLabel, const char *yesLabel) +{ + return ((CB_GUILib*)cb)->Dialog_YesNo_ShowAndGetInputSingleText(heading, text, bCanceled, noLabel, yesLabel); +} + +DLLEXPORT bool GUI_dialog_yesno_show_and_get_input_linebuttontext(void *hdl, void *cb, const char *heading, const char *line0, const char *line1, const char *line2, bool &bCanceled, const char *noLabel, const char *yesLabel) +{ + return ((CB_GUILib*)cb)->Dialog_YesNo_ShowAndGetInputLineButtonText(heading, line0, line1, line2, bCanceled, noLabel, yesLabel); +} +//@} + +/*! @name GUI Text viewer Dialog */ +//@{ +DLLEXPORT void GUI_dialog_text_viewer(void *hdl, void *cb, const char *heading, const char *text) +{ + return ((CB_GUILib*)cb)->Dialog_TextViewer(heading, text); +} +//@} + +/*! @name GUI select Dialog */ +//@{ +DLLEXPORT int GUI_dialog_select(void *hdl, void *cb, const char *heading, const char *entries[], unsigned int size, int selected) +{ + return ((CB_GUILib*)cb)->Dialog_Select(heading, entries, size, selected); +} +//@} + + DLLEXPORT CAddonGUIWindow* GUI_Window_create(void *hdl, void *cb, const char *xmlFilename, const char *defaultSkin, bool forceFallback, bool asDialog) { return new CAddonGUIWindow(hdl, cb, xmlFilename, defaultSkin, forceFallback, asDialog); @@ -115,7 +267,6 @@ DLLEXPORT bool GUI_Window_OnAction(GUIHANDLE handle, int actionId) return window->OnAction(actionId); } - CAddonGUIWindow::CAddonGUIWindow(void *hdl, void *cb, const char *xmlFilename, const char *defaultSkin, bool forceFallback, bool asDialog) : m_Handle(hdl) , m_cb(cb) @@ -444,7 +595,7 @@ void CAddonGUIProgressControl::SetPercentage(float fPercent) float CAddonGUIProgressControl::GetPercentage() const { if (!m_ProgressHandle) - return 0.0; + return 0.0f; return ((CB_GUILib*)m_cb)->Control_Progress_GetPercentage(((AddonCB*)m_Handle)->addonData, m_ProgressHandle); } @@ -473,6 +624,214 @@ string CAddonGUIProgressControl::GetDescription() const ///------------------------------------- +/// cGUISliderControl + +DLLEXPORT CAddonGUISliderControl* GUI_control_get_slider(void *hdl, void *cb, CAddonGUIWindow *window, int controlId) +{ + return new CAddonGUISliderControl(hdl, cb, window, controlId); +} + +DLLEXPORT void GUI_control_release_slider(CAddonGUISliderControl* p) +{ + delete p; +} + +CAddonGUISliderControl::CAddonGUISliderControl(void *hdl, void *cb, CAddonGUIWindow *window, int controlId) + : m_Window(window) + , m_ControlId(controlId) + , m_Handle(hdl) + , m_cb(cb) +{ + m_SliderHandle = ((CB_GUILib*)m_cb)->Window_GetControl_Slider(((AddonCB*)m_Handle)->addonData, m_Window->m_WindowHandle, controlId); +} + +void CAddonGUISliderControl::SetVisible(bool yesNo) +{ + if (m_SliderHandle) + ((CB_GUILib*)m_cb)->Control_Slider_SetVisible(((AddonCB*)m_Handle)->addonData, m_SliderHandle, yesNo); +} + +string CAddonGUISliderControl::GetDescription() const +{ + if (!m_SliderHandle) + return ""; + + return ((CB_GUILib*)m_cb)->Control_Slider_GetDescription(((AddonCB*)m_Handle)->addonData, m_SliderHandle); +} + +void CAddonGUISliderControl::SetIntRange(int iStart, int iEnd) +{ + if (m_SliderHandle) + ((CB_GUILib*)m_cb)->Control_Slider_SetIntRange(((AddonCB*)m_Handle)->addonData, m_SliderHandle, iStart, iEnd); +} + +void CAddonGUISliderControl::SetIntValue(int iValue) +{ + if (m_SliderHandle) + ((CB_GUILib*)m_cb)->Control_Slider_SetIntValue(((AddonCB*)m_Handle)->addonData, m_SliderHandle, iValue); +} + +int CAddonGUISliderControl::GetIntValue() const +{ + if (!m_SliderHandle) + return 0; + return ((CB_GUILib*)m_cb)->Control_Slider_GetIntValue(((AddonCB*)m_Handle)->addonData, m_SliderHandle); +} + +void CAddonGUISliderControl::SetIntInterval(int iInterval) +{ + if (m_SliderHandle) + ((CB_GUILib*)m_cb)->Control_Slider_SetIntInterval(((AddonCB*)m_Handle)->addonData, m_SliderHandle, iInterval); +} + +void CAddonGUISliderControl::SetPercentage(float fPercent) +{ + if (m_SliderHandle) + ((CB_GUILib*)m_cb)->Control_Slider_SetPercentage(((AddonCB*)m_Handle)->addonData, m_SliderHandle, fPercent); +} + +float CAddonGUISliderControl::GetPercentage() const +{ + if (!m_SliderHandle) + return 0.0f; + + return ((CB_GUILib*)m_cb)->Control_Slider_GetPercentage(((AddonCB*)m_Handle)->addonData, m_SliderHandle); +} + +void CAddonGUISliderControl::SetFloatRange(float fStart, float fEnd) +{ + if (m_SliderHandle) + ((CB_GUILib*)m_cb)->Control_Slider_SetFloatRange(((AddonCB*)m_Handle)->addonData, m_SliderHandle, fStart, fEnd); +} + +void CAddonGUISliderControl::SetFloatValue(float fValue) +{ + if (m_SliderHandle) + ((CB_GUILib*)m_cb)->Control_Slider_SetFloatValue(((AddonCB*)m_Handle)->addonData, m_SliderHandle, fValue); +} + +float CAddonGUISliderControl::GetFloatValue() const +{ + if (!m_SliderHandle) + return 0.0f; + return ((CB_GUILib*)m_cb)->Control_Slider_GetFloatValue(((AddonCB*)m_Handle)->addonData, m_SliderHandle); +} + +void CAddonGUISliderControl::SetFloatInterval(float fInterval) +{ + if (m_SliderHandle) + ((CB_GUILib*)m_cb)->Control_Slider_SetFloatInterval(((AddonCB*)m_Handle)->addonData, m_SliderHandle, fInterval); +} + + +///------------------------------------- +/// cGUISettingsSliderControl + +DLLEXPORT CAddonGUISettingsSliderControl* GUI_control_get_settings_slider(void *hdl, void *cb, CAddonGUIWindow *window, int controlId) +{ + return new CAddonGUISettingsSliderControl(hdl, cb, window, controlId); +} + +DLLEXPORT void GUI_control_release_settings_slider(CAddonGUISettingsSliderControl* p) +{ + delete p; +} + +CAddonGUISettingsSliderControl::CAddonGUISettingsSliderControl(void *hdl, void *cb, CAddonGUIWindow *window, int controlId) + : m_Window(window) + , m_ControlId(controlId) + , m_Handle(hdl) + , m_cb(cb) +{ + m_SettingsSliderHandle = ((CB_GUILib*)m_cb)->Window_GetControl_SettingsSlider(((AddonCB*)m_Handle)->addonData, m_Window->m_WindowHandle, controlId); +} + +void CAddonGUISettingsSliderControl::SetVisible(bool yesNo) +{ + if (m_SettingsSliderHandle) + ((CB_GUILib*)m_cb)->Control_SettingsSlider_SetVisible(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle, yesNo); +} + +void CAddonGUISettingsSliderControl::SetText(const char *label) +{ + if (m_SettingsSliderHandle) + ((CB_GUILib*)m_cb)->Control_SettingsSlider_SetText(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle, label); +} + +string CAddonGUISettingsSliderControl::GetDescription() const +{ + if (!m_SettingsSliderHandle) + return ""; + + return ((CB_GUILib*)m_cb)->Control_SettingsSlider_GetDescription(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle); +} + +void CAddonGUISettingsSliderControl::SetIntRange(int iStart, int iEnd) +{ + if (m_SettingsSliderHandle) + ((CB_GUILib*)m_cb)->Control_SettingsSlider_SetIntRange(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle, iStart, iEnd); +} + +void CAddonGUISettingsSliderControl::SetIntValue(int iValue) +{ + if (m_SettingsSliderHandle) + ((CB_GUILib*)m_cb)->Control_SettingsSlider_SetIntValue(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle, iValue); +} + +int CAddonGUISettingsSliderControl::GetIntValue() const +{ + if (!m_SettingsSliderHandle) + return 0; + return ((CB_GUILib*)m_cb)->Control_SettingsSlider_GetIntValue(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle); +} + +void CAddonGUISettingsSliderControl::SetIntInterval(int iInterval) +{ + if (m_SettingsSliderHandle) + ((CB_GUILib*)m_cb)->Control_SettingsSlider_SetIntInterval(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle, iInterval); +} + +void CAddonGUISettingsSliderControl::SetPercentage(float fPercent) +{ + if (m_SettingsSliderHandle) + ((CB_GUILib*)m_cb)->Control_SettingsSlider_SetPercentage(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle, fPercent); +} + +float CAddonGUISettingsSliderControl::GetPercentage() const +{ + if (!m_SettingsSliderHandle) + return 0.0f; + + return ((CB_GUILib*)m_cb)->Control_SettingsSlider_GetPercentage(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle); +} + +void CAddonGUISettingsSliderControl::SetFloatRange(float fStart, float fEnd) +{ + if (m_SettingsSliderHandle) + ((CB_GUILib*)m_cb)->Control_SettingsSlider_SetFloatRange(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle, fStart, fEnd); +} + +void CAddonGUISettingsSliderControl::SetFloatValue(float fValue) +{ + if (m_SettingsSliderHandle) + ((CB_GUILib*)m_cb)->Control_SettingsSlider_SetFloatValue(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle, fValue); +} + +float CAddonGUISettingsSliderControl::GetFloatValue() const +{ + if (!m_SettingsSliderHandle) + return 0.0f; + return ((CB_GUILib*)m_cb)->Control_SettingsSlider_GetFloatValue(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle); +} + +void CAddonGUISettingsSliderControl::SetFloatInterval(float fInterval) +{ + if (m_SettingsSliderHandle) + ((CB_GUILib*)m_cb)->Control_SettingsSlider_SetFloatInterval(((AddonCB*)m_Handle)->addonData, m_SettingsSliderHandle, fInterval); +} + + +///------------------------------------- /// cListItem DLLEXPORT CAddonListItem* GUI_ListItem_create(void *hdl, void *cb, const char *label, const char *label2, const char *iconImage, const char *thumbnailImage, const char *path) diff --git a/lib/timidity/timidity/timidity.c b/lib/timidity/timidity/timidity.c index e5383138f2..23eb6e7138 100644 --- a/lib/timidity/timidity/timidity.c +++ b/lib/timidity/timidity/timidity.c @@ -922,6 +922,10 @@ static int set_gus_patchconf(char *name, int line, { ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "%s: line %d: Syntax error", name, line); +#ifdef SET_GUS_PATCHCONF_COMMENT + if(old_name != NULL) + free(old_name); +#endif return 1; } tone->name = safe_strdup(opts[0]); diff --git a/project/VS2010Express/XBMC.vcxproj b/project/VS2010Express/XBMC.vcxproj index 7e873102bb..b899013f5d 100644 --- a/project/VS2010Express/XBMC.vcxproj +++ b/project/VS2010Express/XBMC.vcxproj @@ -1001,8 +1001,8 @@ <ClInclude Include="..\..\xbmc\utils\IRssObserver.h" /> <ClInclude Include="..\..\xbmc\utils\IXmlDeserializable.h" /> <ClInclude Include="..\..\xbmc\utils\LegacyPathTranslation.h" /> - <ClInclude Include="..\..\xbmc\utils\MarkWatchedJob.h" /> <ClInclude Include="..\..\xbmc\utils\params_check_macros.h" /> + <ClInclude Include="..\..\xbmc\utils\ProgressJob.h" /> <ClInclude Include="..\..\xbmc\utils\RssManager.h" /> <ClInclude Include="..\..\xbmc\utils\StringValidation.h" /> <ClInclude Include="..\..\xbmc\utils\Utf8Utils.h" /> @@ -1145,7 +1145,7 @@ <ClCompile Include="..\..\xbmc\utils\CharsetDetection.cpp" /> <ClCompile Include="..\..\xbmc\utils\HttpRangeUtils.cpp" /> <ClCompile Include="..\..\xbmc\utils\LegacyPathTranslation.cpp" /> - <ClCompile Include="..\..\xbmc\utils\MarkWatchedJob.cpp" /> + <ClCompile Include="..\..\xbmc\utils\ProgressJob.cpp" /> <ClCompile Include="..\..\xbmc\utils\RssManager.cpp" /> <ClCompile Include="..\..\xbmc\utils\StringValidation.cpp" /> <ClCompile Include="..\..\xbmc\utils\test\TestHttpRangeUtils.cpp"> @@ -1161,8 +1161,14 @@ <ClCompile Include="..\..\xbmc\utils\win32\Win32InterfaceForCLog.cpp" /> <ClCompile Include="..\..\xbmc\utils\win32\Win32Log.cpp" /> <ClCompile Include="..\..\xbmc\utils\XSLTUtils.cpp" /> + <ClCompile Include="..\..\xbmc\video\jobs\VideoLibraryCleaningJob.cpp" /> + <ClCompile Include="..\..\xbmc\video\jobs\VideoLibraryJob.cpp" /> + <ClCompile Include="..\..\xbmc\video\jobs\VideoLibraryMarkWatchedJob.cpp" /> + <ClCompile Include="..\..\xbmc\video\jobs\VideoLibraryProgressJob.cpp" /> + <ClCompile Include="..\..\xbmc\video\jobs\VideoLibraryScanningJob.cpp" /> <ClCompile Include="..\..\xbmc\video\PlayerController.cpp" /> <ClCompile Include="..\..\xbmc\video\videosync\VideoSyncD3D.cpp" /> + <ClCompile Include="..\..\xbmc\video\VideoLibraryQueue.cpp" /> <ClCompile Include="..\..\xbmc\video\VideoThumbLoader.cpp" /> <ClCompile Include="..\..\xbmc\music\MusicThumbLoader.cpp" /> <ClCompile Include="..\..\xbmc\ThumbnailCache.cpp" /> @@ -1460,6 +1466,7 @@ <ClCompile Include="..\..\xbmc\view\GUIViewState.cpp" /> <ClCompile Include="..\..\xbmc\view\ViewDatabase.cpp" /> <ClCompile Include="..\..\xbmc\view\ViewStateSettings.cpp" /> + <ClCompile Include="..\..\xbmc\win32\crts_caller.cpp" /> <ClCompile Include="..\..\xbmc\win32\pch.cpp"> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug Testsuite|Win32'">Create</PrecompiledHeader> @@ -2037,9 +2044,15 @@ <ClInclude Include="..\..\xbmc\TextureDatabase.h" /> <ClInclude Include="..\..\xbmc\DatabaseManager.h" /> <ClInclude Include="..\..\xbmc\ThumbLoader.h" /> + <ClInclude Include="..\..\xbmc\video\jobs\VideoLibraryCleaningJob.h" /> + <ClInclude Include="..\..\xbmc\video\jobs\VideoLibraryJob.h" /> + <ClInclude Include="..\..\xbmc\video\jobs\VideoLibraryMarkWatchedJob.h" /> + <ClInclude Include="..\..\xbmc\video\jobs\VideoLibraryProgressJob.h" /> + <ClInclude Include="..\..\xbmc\video\jobs\VideoLibraryScanningJob.h" /> <ClInclude Include="..\..\xbmc\video\PlayerController.h" /> <ClInclude Include="..\..\xbmc\video\videosync\VideoSync.h" /> <ClInclude Include="..\..\xbmc\video\videosync\VideoSyncD3D.h" /> + <ClInclude Include="..\..\xbmc\video\VideoLibraryQueue.h" /> <ClInclude Include="..\..\xbmc\video\VideoThumbLoader.h" /> <ClInclude Include="..\..\xbmc\music\MusicThumbLoader.h" /> <ClInclude Include="..\..\xbmc\ThumbnailCache.h" /> @@ -2147,6 +2160,7 @@ <ClInclude Include="..\..\xbmc\view\ViewDatabase.h" /> <ClInclude Include="..\..\xbmc\view\ViewState.h" /> <ClInclude Include="..\..\xbmc\view\ViewStateSettings.h" /> + <ClInclude Include="..\..\xbmc\win32\crts_caller.h" /> <ClInclude Include="..\..\xbmc\win32\IMMNotificationClient.h" /> <ClInclude Include="..\..\xbmc\win32\pch.h" /> <ClInclude Include="..\..\xbmc\win32\PlatformDefs.h" /> diff --git a/project/VS2010Express/XBMC.vcxproj.filters b/project/VS2010Express/XBMC.vcxproj.filters index 9f19d9fc19..de9aaaf9d4 100644 --- a/project/VS2010Express/XBMC.vcxproj.filters +++ b/project/VS2010Express/XBMC.vcxproj.filters @@ -325,6 +325,9 @@ <Filter Include="network\test"> <UniqueIdentifier>{1bdb0045-3341-49b7-8d6f-30a53f812350}</UniqueIdentifier> </Filter> + <Filter Include="video\jobs"> + <UniqueIdentifier>{f413004c-1ab9-42ce-bb1a-0636e5286a00}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\..\xbmc\win32\pch.cpp"> @@ -3062,9 +3065,6 @@ <ClCompile Include="..\..\xbmc\filesystem\win32\Win32SMBFile.cpp"> <Filter>filesystem\win32</Filter> </ClCompile> - <ClCompile Include="..\..\xbmc\utils\MarkWatchedJob.cpp"> - <Filter>utils</Filter> - </ClCompile> <ClCompile Include="..\..\xbmc\filesystem\BlurayFile.cpp"> <Filter>filesystem</Filter> </ClCompile> @@ -3092,6 +3092,9 @@ <ClCompile Include="..\..\xbmc\utils\HttpRangeUtils.cpp"> <Filter>utils</Filter> </ClCompile> + <ClCompile Include="..\..\xbmc\win32\crts_caller.cpp"> + <Filter>win32</Filter> + </ClCompile> <ClCompile Include="..\..\xbmc\network\httprequesthandler\HTTPFileHandler.cpp"> <Filter>network\httprequesthandler</Filter> </ClCompile> @@ -3110,6 +3113,27 @@ <ClCompile Include="..\..\xbmc\dialogs\GUIDialogSimpleMenu.cpp"> <Filter>dialogs</Filter> </ClCompile> + <ClCompile Include="..\..\xbmc\video\jobs\VideoLibraryJob.cpp"> + <Filter>video\jobs</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\video\VideoLibraryQueue.cpp"> + <Filter>video</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\video\jobs\VideoLibraryScanningJob.cpp"> + <Filter>video\jobs</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\video\jobs\VideoLibraryMarkWatchedJob.cpp"> + <Filter>video\jobs</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\video\jobs\VideoLibraryCleaningJob.cpp"> + <Filter>video\jobs</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\utils\ProgressJob.cpp"> + <Filter>utils</Filter> + </ClCompile> + <ClCompile Include="..\..\xbmc\video\jobs\VideoLibraryProgressJob.cpp"> + <Filter>video\jobs</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\xbmc\win32\pch.h"> @@ -6003,9 +6027,6 @@ <ClInclude Include="..\..\xbmc\filesystem\win32\Win32SMBFile.h"> <Filter>filesystem\win32</Filter> </ClInclude> - <ClInclude Include="..\..\xbmc\utils\MarkWatchedJob.h"> - <Filter>utils</Filter> - </ClInclude> <ClInclude Include="..\..\xbmc\settings\DiscSettings.h"> <Filter>settings</Filter> </ClInclude> @@ -6021,6 +6042,9 @@ <ClInclude Include="..\..\xbmc\cores\DataCacheCore.h"> <Filter>cores</Filter> </ClInclude> + <ClInclude Include="..\..\xbmc\win32\crts_caller.h"> + <Filter>win32</Filter> + </ClInclude> <ClInclude Include="..\..\xbmc\filesystem\OverrideDirectory.h"> <Filter>filesystem</Filter> </ClInclude> @@ -6051,6 +6075,27 @@ <ClInclude Include="..\..\xbmc\dialogs\GUIDialogSimpleMenu.h"> <Filter>dialogs</Filter> </ClInclude> + <ClInclude Include="..\..\xbmc\video\jobs\VideoLibraryJob.h"> + <Filter>video\jobs</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\video\VideoLibraryQueue.h"> + <Filter>video</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\video\jobs\VideoLibraryScanningJob.h"> + <Filter>video\jobs</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\video\jobs\VideoLibraryMarkWatchedJob.h"> + <Filter>video\jobs</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\video\jobs\VideoLibraryCleaningJob.h"> + <Filter>video\jobs</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\utils\ProgressJob.h"> + <Filter>utils</Filter> + </ClInclude> + <ClInclude Include="..\..\xbmc\video\jobs\VideoLibraryProgressJob.h"> + <Filter>video\jobs</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ResourceCompile Include="..\..\xbmc\win32\XBMC_PC.rc"> diff --git a/project/Win32BuildSetup/BuildSetup.bat b/project/Win32BuildSetup/BuildSetup.bat index 9c29f2281f..8114e64af9 100644 --- a/project/Win32BuildSetup/BuildSetup.bat +++ b/project/Win32BuildSetup/BuildSetup.bat @@ -231,6 +231,9 @@ set WORKSPACE=%CD%\..\.. ECHO ------------------------------------------------------------ ECHO Building addons... cd ..\..\tools\buildsteps\win32 + IF %buildmode%==clean ( + call make-addons.bat clean + ) call make-addons.bat IF %errorlevel%==1 ( set DIETEXT="failed to build addons" diff --git a/project/Win32BuildSetup/buildpvraddons.bat b/project/Win32BuildSetup/buildpvraddons.bat index c13cc35d5b..8fdc4e4db4 100644 --- a/project/Win32BuildSetup/buildpvraddons.bat +++ b/project/Win32BuildSetup/buildpvraddons.bat @@ -9,7 +9,7 @@ SET DEPS_DIR=..\BuildDependencies SET TMP_DIR=%DEPS_DIR%\tmp SET LIBNAME=xbmc-pvr-addons -SET VERSION=b2dc035404e14f137033876d14ad92ae3bde5f27 +SET VERSION=2fb0fc22668b1efdec05e66161d6c419844ee9cd SET SOURCE=%LIBNAME% SET GIT_URL=git://github.com/opdenkamp/%LIBNAME%.git SET SOURCE_DIR=%TMP_DIR%\%SOURCE% diff --git a/project/cmake/addons/CMakeLists.txt b/project/cmake/addons/CMakeLists.txt index be08205410..f355aeebc2 100644 --- a/project/cmake/addons/CMakeLists.txt +++ b/project/cmake/addons/CMakeLists.txt @@ -38,6 +38,11 @@ else() endif() get_filename_component(DEPENDS_PATH "${DEPENDS_PATH}" ABSOLUTE) +if(NOT PLATFORM_DIR) + set(PLATFORM_DIR ${APP_ROOT}/project/cmake/platform/${CORE_SYSTEM_NAME}) + file(TO_CMAKE_PATH "${PLATFORM_DIR}" PLATFORM_DIR) +endif() + # make sure CMAKE_PREFIX_PATH is set if(NOT CMAKE_PREFIX_PATH) set(CMAKE_PREFIX_PATH "${DEPENDS_PATH}") @@ -60,9 +65,10 @@ list(APPEND CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX}) set(BUILD_ARGS -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DPACKAGE_CONFIG_PATH=${DEPENDS_PATH}/lib/pkgconfig - -DCMAKE_BUILD_TYPE=Release + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_USER_MAKE_RULES_OVERRIDE=${CMAKE_USER_MAKE_RULES_OVERRIDE} -DCMAKE_USER_MAKE_RULES_OVERRIDE_CXX=${CMAKE_USER_MAKE_RULES_OVERRIDE_CXX} + -DCORE_SYSTEM_NAME=${CORE_SYSTEM_NAME} -DBUILD_SHARED_LIBS=1) if(PACKAGE_ZIP) @@ -90,6 +96,18 @@ else() file(TO_CMAKE_PATH "${KODI_LIB_DIR}" KODI_LIB_DIR) endif() +# check for platform specific stuff +if(EXISTS ${PLATFORM_DIR}/defines.txt) + file(STRINGS ${PLATFORM_DIR}/defines.txt platformdefines) + + if(NOT ARCH_DEFINES AND platformdefines) + set(ARCH_DEFINES ${platformdefines}) + endif() +endif() + +# include check_target_platform() function +include(${APP_ROOT}/project/cmake/scripts/common/check_target_platform.cmake) + ### prepare the build environment for the binary addons # copy the prepare-env.cmake script to the depends path so that we can include it file(COPY ${APP_ROOT}/project/cmake/scripts/common/prepare-env.cmake DESTINATION ${KODI_LIB_DIR}) @@ -115,37 +133,10 @@ foreach(addon ${addons}) list(FIND ADDONS_TO_BUILD ${id} idx) if(idx GREATER -1 OR ADDONS_TO_BUILD STREQUAL "all") get_filename_component(dir ${addon} PATH) - set(platform_found FALSE) # check if the addon has a platforms.txt - if(EXISTS ${dir}/platforms.txt) - # get all the specified platforms - file(STRINGS ${dir}/platforms.txt platforms) - separate_arguments(platforms) - - # check if the addon should be built for the current platform - foreach(platform ${platforms}) - if(${platform} STREQUAL "all" OR ${platform} STREQUAL ${CORE_SYSTEM_NAME}) - set(platform_found TRUE) - else() - # check if the platform is defined as "!<platform>" - string(SUBSTRING ${platform} 0 1 platform_first) - if(${platform_first} STREQUAL "!") - # extract the platform - string(LENGTH ${platform} platform_length) - MATH(EXPR platform_length "${platform_length} - 1") - string(SUBSTRING ${platform} 1 ${platform_length} platform) - - # check if the current platform does not match the extracted platform - if (NOT ${platform} STREQUAL ${CORE_SYSTEM_NAME}) - set(platform_found TRUE) - endif() - endif() - endif() - endforeach() - else() - set(platform_found TRUE) - endif() + set(platform_found FALSE) + check_target_platform(${dir} ${CORE_SYSTEM_NAME} platform_found) if (${platform_found}) # make sure the output directory is clean diff --git a/project/cmake/platform/android/defines.txt b/project/cmake/platform/android/defines.txt new file mode 100644 index 0000000000..fa103d0060 --- /dev/null +++ b/project/cmake/platform/android/defines.txt @@ -0,0 +1 @@ +-DTARGET_POSIX -DTARGET_LINUX -D_LINUX -DTARGET_ANDROID diff --git a/project/cmake/platform/darwin/defines.txt b/project/cmake/platform/darwin/defines.txt new file mode 100644 index 0000000000..33b009e3a7 --- /dev/null +++ b/project/cmake/platform/darwin/defines.txt @@ -0,0 +1 @@ +-DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX -D_LINUX diff --git a/project/cmake/platform/freebsd/defines.txt b/project/cmake/platform/freebsd/defines.txt new file mode 100644 index 0000000000..94835971a3 --- /dev/null +++ b/project/cmake/platform/freebsd/defines.txt @@ -0,0 +1 @@ +-DTARGET_POSIX -DTARGET_FREEBSD -D_LINUX diff --git a/project/cmake/platform/ios/defines.txt b/project/cmake/platform/ios/defines.txt new file mode 100644 index 0000000000..d0989ea1ce --- /dev/null +++ b/project/cmake/platform/ios/defines.txt @@ -0,0 +1 @@ +-DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_IOS -D_LINUX diff --git a/project/cmake/platform/linux/defines.txt b/project/cmake/platform/linux/defines.txt new file mode 100644 index 0000000000..3fe9c5caad --- /dev/null +++ b/project/cmake/platform/linux/defines.txt @@ -0,0 +1 @@ +-DTARGET_POSIX -DTARGET_LINUX -D_LINUX -fPIC diff --git a/project/cmake/platform/rbpi/defines.txt b/project/cmake/platform/rbpi/defines.txt new file mode 100644 index 0000000000..08fe4cbdd2 --- /dev/null +++ b/project/cmake/platform/rbpi/defines.txt @@ -0,0 +1 @@ +-DTARGET_POSIX -DTARGET_LINUX -D_LINUX -D_ARMEL -DTARGET_RASPBERRY_PI diff --git a/project/cmake/platform/windows/defines.txt b/project/cmake/platform/windows/defines.txt new file mode 100644 index 0000000000..5ccd98a9c1 --- /dev/null +++ b/project/cmake/platform/windows/defines.txt @@ -0,0 +1 @@ +-DTARGET_WINDOWS -DNOMINMAX -D_CRT_SECURE_NO_WARNINGS -D_USE_32BIT_TIME_T -D_WINSOCKAPI_
\ No newline at end of file diff --git a/project/cmake/scripts/common/check_target_platform.cmake b/project/cmake/scripts/common/check_target_platform.cmake new file mode 100644 index 0000000000..19a9d1410c --- /dev/null +++ b/project/cmake/scripts/common/check_target_platform.cmake @@ -0,0 +1,40 @@ +# handle target platforms +function(check_target_platform dir target_platform build) + # param[in] dir path/directory of the addon/dependency + # param[in] target_platform target platform of the build + # param[out] build Result whether the addon/dependency should be built for the specified target platform + + set(${build} FALSE) + # check if the given directory exists and contains a platforms.txt + if(EXISTS ${dir} AND EXISTS ${dir}/platforms.txt) + # get all the specified platforms + file(STRINGS ${dir}/platforms.txt platforms) + separate_arguments(platforms) + + # check if the addon/dependency should be built for the current platform + foreach(platform ${platforms}) + if(${platform} STREQUAL "all" OR ${platform} STREQUAL ${target_platform}) + set(${build} TRUE) + else() + # check if the platform is defined as "!<platform>" + string(SUBSTRING ${platform} 0 1 platform_first) + if(${platform_first} STREQUAL "!") + # extract the platform + string(LENGTH ${platform} platform_length) + MATH(EXPR platform_length "${platform_length} - 1") + string(SUBSTRING ${platform} 1 ${platform_length} platform) + + # check if the current platform does not match the extracted platform + if (NOT ${platform} STREQUAL ${target_platform}) + set(${build} TRUE) + endif() + endif() + endif() + endforeach() + else() + set(${build} TRUE) + endif() + + # make the ${build} variable available to the calling script + set(${build} "${${build}}" PARENT_SCOPE) +endfunction() diff --git a/project/cmake/scripts/common/handle-depends.cmake b/project/cmake/scripts/common/handle-depends.cmake index 7f0b9f3cc0..145d1242e1 100644 --- a/project/cmake/scripts/common/handle-depends.cmake +++ b/project/cmake/scripts/common/handle-depends.cmake @@ -1,3 +1,5 @@ +include(${APP_ROOT}/project/cmake/scripts/common/check_target_platform.cmake) + # handle addon depends function(add_addon_depends addon searchpath) # input: string addon string searchpath @@ -12,28 +14,35 @@ function(add_addon_depends addon searchpath) file MATCHES install.txt OR file MATCHES noinstall.txt OR file MATCHES flags.txt OR - file MATCHES deps.txt)) + file MATCHES deps.txt OR + file MATCHES platforms.txt)) message(STATUS "Processing ${file}") file(STRINGS ${file} def) separate_arguments(def) list(LENGTH def deflength) get_filename_component(dir ${file} PATH) - # get the id and url of the dependency - set(url "") + # get the id of the dependency if(NOT "${def}" STREQUAL "") - # read the id and the url from the file + # read the id from the file list(GET def 0 id) - if(deflength GREATER 1) - list(GET def 1 url) - message(STATUS "${id} url: ${url}") - endif() else() # read the id from the filename get_filename_component(id ${file} NAME_WE) endif() - if(NOT TARGET ${id}) + # check if the dependency has a platforms.txt + set(platform_found FALSE) + check_target_platform(${dir} ${CORE_SYSTEM_NAME} platform_found) + + if(${platform_found} AND NOT TARGET ${id}) + # determine the download URL of the dependency + set(url "") + if(deflength GREATER 1) + list(GET def 1 url) + message(STATUS "${id} url: ${url}") + endif() + # check if there are any library specific flags that need to be passed on if(EXISTS ${dir}/flags.txt) file(STRINGS ${dir}/flags.txt extraflags) @@ -47,6 +56,7 @@ function(add_addon_depends addon searchpath) -DCMAKE_USER_MAKE_RULES_OVERRIDE=${CMAKE_USER_MAKE_RULES_OVERRIDE} -DCMAKE_USER_MAKE_RULES_OVERRIDE_CXX=${CMAKE_USER_MAKE_RULES_OVERRIDE_CXX} -DCMAKE_INSTALL_PREFIX=${OUTPUT_DIR} + -DCORE_SYSTEM_NAME=${CORE_SYSTEM_NAME} -DENABLE_STATIC=1 -DBUILD_SHARED_LIBS=0) # if there are no make rules override files available take care of manually passing on ARCH_DEFINES @@ -166,9 +176,15 @@ function(add_addon_depends addon searchpath) endif() endif() - set(${addon}_DEPS ${${addon}_DEPS} ${id}) - set(${addon}_DEPS "${${addon}_DEPS}" PARENT_SCOPE) + # if the dependency is available for the target platform add it to the list of the addon's dependencies + # (even if the target already exists as it still has to be built before the addon) + if(${platform_found}) + list(APPEND ${addon}_DEPS ${id}) + endif() endif() endforeach() + + # make the ${addon}_DEPS variable available to the calling script + set(${addon}_DEPS "${${addon}_DEPS}" PARENT_SCOPE) endfunction() diff --git a/system/keymaps/gamepad.xml b/system/keymaps/gamepad.xml index 04fe4b8ffb..5ef5d93f19 100644 --- a/system/keymaps/gamepad.xml +++ b/system/keymaps/gamepad.xml @@ -151,10 +151,10 @@ <back>LockPreset</back> <leftanalogtrigger>AnalogRewind</leftanalogtrigger> <rightanalogtrigger>AnalogFastForward</rightanalogtrigger> - <dpadleft>SkipPrevious</dpadleft> - <dpadright>SkipNext</dpadright> - <dpadup>NextPreset</dpadup> - <dpaddown>PreviousPreset</dpaddown> + <dpadleft>StepBack</dpadleft> + <dpadright>StepForward</dpadright> + <dpadup>SkipNext</dpadup> + <dpaddown>SkipPrevious</dpaddown> </gamepad> </Visualisation> <MusicOSD> diff --git a/system/keymaps/joystick.Harmony.xml b/system/keymaps/joystick.Harmony.xml index d8db5151e2..09c1dec842 100644 --- a/system/keymaps/joystick.Harmony.xml +++ b/system/keymaps/joystick.Harmony.xml @@ -203,8 +203,8 @@ <joystick name="Harmony"> <!-- up --> <button id="1">IncreaseRating</button> <!-- minus --> <button id="2">DecreaseRating</button> - <!-- left --> <button id="3">PreviousPreset</button> - <!-- right --> <button id="4">NextPreset</button> + <!-- left --> <button id="3">StepBack</button> + <!-- right --> <button id="4">StepForward</button> <!-- menu --> <button id="6">OSD</button> <!-- Prev --> <button id="32">LockPreset</button> <!-- Info --> <button id="31">Info</button> diff --git a/system/keymaps/joystick.Logitech.RumblePad.2.xml b/system/keymaps/joystick.Logitech.RumblePad.2.xml index 5954a32555..ff36f98fca 100644 --- a/system/keymaps/joystick.Logitech.RumblePad.2.xml +++ b/system/keymaps/joystick.Logitech.RumblePad.2.xml @@ -102,10 +102,10 @@ <button id="6">FastForward</button> <button id="10">OSD</button> - <hat id="1" position="left">SkipPrevious</hat> - <hat id="1" position="right">SkipNext</hat> - <hat id="1" position="up">NextPreset</hat> - <hat id="1" position="left">PreviousPreset</hat> + <hat id="1" position="left">StepBack</hat> + <hat id="1" position="right">StepForward</hat> + <hat id="1" position="up">SkipNext</hat> + <hat id="1" position="down">SkipPrevious</hat> </joystick> </Visualisation> diff --git a/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml b/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml index 626af98d55..3248d5e21a 100644 --- a/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml +++ b/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml @@ -394,8 +394,8 @@ <axis id="3" limit="-1">AnalogFastForward</axis> <hat id="1" position="up">SkipNext</hat> <hat id="1" position="down">SkipPrevious</hat> - <hat id="1" position="left">PreviousPreset</hat> - <hat id="1" position="right">NextPreset</hat> + <hat id="1" position="left">StepBack</hat> + <hat id="1" position="right">StepForward</hat> </joystick> <joystick family="Xbox 360 Controller (xpad)"> <button id="1">Pause</button> diff --git a/system/keymaps/joystick.PS3.Remote.Keyboard.xml b/system/keymaps/joystick.PS3.Remote.Keyboard.xml index f0af99ac85..36d6a24547 100644 --- a/system/keymaps/joystick.PS3.Remote.Keyboard.xml +++ b/system/keymaps/joystick.PS3.Remote.Keyboard.xml @@ -72,8 +72,8 @@ <button id="1">Info</button> <button id="2">Pause</button> <button id="3">Stop</button> - <hat id="1" position="left">SkipPrevious</hat> - <hat id="1" position="right">SkipNext</hat> + <hat id="1" position="left">StepBack</hat> + <hat id="1" position="right">StepForward</hat> <hat id="1" position="up">IncreaseRating</hat> <hat id="1" position="down">DecreaseRating</hat> </joystick> diff --git a/system/keymaps/joystick.WiiRemote.xml b/system/keymaps/joystick.WiiRemote.xml index 1e1d42b9f9..2f34b517c9 100644 --- a/system/keymaps/joystick.WiiRemote.xml +++ b/system/keymaps/joystick.WiiRemote.xml @@ -122,13 +122,13 @@ <joystick name="WiiRemote"> <button id="1">Pause</button> <button id="2">Stop</button> - <button id="3">SkipNext</button> - <button id="4">SkipPrevious</button> + <button id="3">StepForward</button> + <button id="4">StepBack</button> <button id="5">OSD</button> <button id="6">Info</button> <button id="8">ActivateWindow(music)</button> - <button id="10">IncreaseRating</button> - <button id="11">DecreaseRating</button> + <button id="10">SkipNext</button> + <button id="11">SkipPrevious</button> </joystick> </Visualisation> <MusicOSD> diff --git a/system/keymaps/joystick.xml.sample b/system/keymaps/joystick.xml.sample index 7c4dd161ee..b171d1a06c 100644 --- a/system/keymaps/joystick.xml.sample +++ b/system/keymaps/joystick.xml.sample @@ -178,8 +178,8 @@ <axis id="3" limit="-1">AnalogFastForward</axis> <hat id="1" position="up">SkipNext</hat> <hat id="1" position="down">SkipPrevious</hat> - <hat id="1" position="left">PreviousPreset</hat> - <hat id="1" position="right">NextPreset</hat> + <hat id="1" position="left">StepBack</hat> + <hat id="1" position="right">StepForward</hat> </joystick> </Visualisation> <MusicOSD> diff --git a/system/keymaps/keyboard.xml b/system/keymaps/keyboard.xml index 0d303ba44c..a896a4b2e4 100644 --- a/system/keymaps/keyboard.xml +++ b/system/keymaps/keyboard.xml @@ -311,10 +311,10 @@ <p>ActivateWindow(VisualisationPresetList)</p> <v>ActivateWindow(VisualisationSettings)</v> <n>ActivateWindow(MusicPlaylist)</n> - <left>SkipPrevious</left> - <right>SkipNext</right> - <up>IncreaseRating</up> - <down>DecreaseRating</down> <!--<back>NextPreset</back>!--> + <left>StepBack</left> + <right>StepForward</right> + <up>SkipNext</up> + <down>SkipPrevious</down> <o>CodecInfo</o> <l>LockPreset</l> <escape>FullScreen</escape> diff --git a/system/keymaps/remote.xml b/system/keymaps/remote.xml index 782aea7939..610ca76c2f 100644 --- a/system/keymaps/remote.xml +++ b/system/keymaps/remote.xml @@ -226,13 +226,13 @@ </PlayerControls> <Visualisation> <remote> - <left>PreviousPreset</left> - <right>NextPreset</right> - <up>IncreaseRating</up> - <down>DecreaseRating</down> + <left>StepBack</left> + <right>StepForward</right> + <up>SkipNext</up> + <down>SkipPrevious</down> <back>Back</back> <title>CodecInfo</title> - <select>ActivateWindow(VisualisationPresetList)</select> + <select>OSD</select> <menu>OSD</menu> <contentsmenu>OSD</contentsmenu> <rootmenu>OSD</rootmenu> diff --git a/system/keymaps/touchscreen.xml b/system/keymaps/touchscreen.xml index cebc1abaa6..7b015b8a95 100644 --- a/system/keymaps/touchscreen.xml +++ b/system/keymaps/touchscreen.xml @@ -22,6 +22,14 @@ <swipe direction="left" pointers="2">SmallStepBack</swipe> </touch> </FullScreenVideo> + <Visualisation> + <touch> + <swipe direction="left">StepBack</swipe> + <swipe direction="right">StepForward</swipe> + <swipe direction="up">SkipNext</swipe> + <swipe direction="down">SkipPrevious</swipe> + </touch> + </Visualisation> <SlideShow> <touch> <zoom>ZoomGesture</zoom> diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 100d74639e..ecd2e9010f 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -345,6 +345,11 @@ </constraints> <control type="spinner" format="string" /> </setting> + <setting id="videolibrary.jumptofirstunplayeditem" type="boolean" label="21416" help="21466"> + <level>1</level> + <default>false</default> + <control type="toggle" /> + </setting> <setting id="videolibrary.groupmoviesets" type="boolean" label="20458" help="36145"> <level>0</level> <default>false</default> @@ -414,9 +419,9 @@ </setting> <setting id="videoplayer.seekdelay" type="integer" label="13557" help="37043"> <level>2</level> - <default>1000</default> + <default>750</default> <constraints> - <minimum>500</minimum> + <minimum label="231">0</minimum> <!-- None --> <step>250</step> <maximum>3000</maximum> </constraints> @@ -1578,6 +1583,32 @@ </setting> </group> <group id="2"> + <setting id="musicplayer.seeksteps" type="list[integer]" label="13556" help="37042"> + <level>2</level> + <default>-60,-30,-15,-7,7,15,30,60</default> + <constraints> + <options>videoseeksteps</options> + <delimiter>,</delimiter> + <minimumItems>2</minimumItems> + </constraints> + <control type="list" format="string"> + <multiselect>true</multiselect> + </control> + </setting> + <setting id="musicplayer.seekdelay" type="integer" label="13557" help="37043"> + <level>2</level> + <default>750</default> + <constraints> + <minimum label="231">0</minimum> <!-- None --> + <step>250</step> + <maximum>3000</maximum> + </constraints> + <control type="spinner" format="string"> + <formatlabel>14046</formatlabel> + </control> + </setting> + </group> + <group id="3"> <setting id="musicplayer.replaygaintype" type="integer" label="638" help="36267"> <level>2</level> <default>1</default> <!-- REPLAY_GAIN_ALBUM --> @@ -1629,7 +1660,7 @@ </dependencies> </setting> </group> - <group id="3"> + <group id="4"> <setting id="musicplayer.crossfade" type="integer" label="13314" help="36271"> <level>1</level> <default>0</default> @@ -1651,7 +1682,7 @@ <control type="toggle" /> </setting> </group> - <group id="4"> + <group id="5"> <setting id="musicplayer.visualisation" type="addon" label="250" help="36273"> <level>0</level> <default>visualization.glspectrum</default> diff --git a/tools/android/packaging/xbmc/AndroidManifest.xml.in b/tools/android/packaging/xbmc/AndroidManifest.xml.in index 4232f1a852..f9498739d0 100644 --- a/tools/android/packaging/xbmc/AndroidManifest.xml.in +++ b/tools/android/packaging/xbmc/AndroidManifest.xml.in @@ -6,7 +6,7 @@ android:versionName="@APP_VERSION@" > <!-- This is the platform API where NativeActivity was introduced. --> - <uses-sdk android:minSdkVersion="14" /> + <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> diff --git a/tools/buildsteps/android/configure-depends b/tools/buildsteps/android/configure-depends index 344750c04e..746c11f73d 100644 --- a/tools/buildsteps/android/configure-depends +++ b/tools/buildsteps/android/configure-depends @@ -7,7 +7,7 @@ NDK_ARCH="arm" CURRENT_NDK_PATH=$ANDROID_DEV_ROOT/android-ndk-r$NDK_VERSION CURRENT_TOOLCHAIN=$ANDROID_DEV_ROOT/android-toolchain-$NDK_ARCH-$SDK_VERSION-r$NDK_VERSION -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then cd $WORKSPACE/tools/depends;./configure \ --with-tarballs=$TARBALLS \ diff --git a/tools/buildsteps/android/make-binary-addons b/tools/buildsteps/android/make-binary-addons new file mode 100644 index 0000000000..71adeb9690 --- /dev/null +++ b/tools/buildsteps/android/make-binary-addons @@ -0,0 +1,25 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=android +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #make jenkins fail + exit 1 +fi diff --git a/tools/buildsteps/android/make-depends b/tools/buildsteps/android/make-depends index 2d5509e7ac..c5869b26e2 100644 --- a/tools/buildsteps/android/make-depends +++ b/tools/buildsteps/android/make-depends @@ -2,8 +2,8 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=android . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then - cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulDependsBuild + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends fi diff --git a/tools/buildsteps/android/make-native-depends b/tools/buildsteps/android/make-native-depends new file mode 100644 index 0000000000..f67ced0eef --- /dev/null +++ b/tools/buildsteps/android/make-native-depends @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=android +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi diff --git a/tools/buildsteps/android/prepare-depends b/tools/buildsteps/android/prepare-depends index babe7e4d63..933ea4592e 100644 --- a/tools/buildsteps/android/prepare-depends +++ b/tools/buildsteps/android/prepare-depends @@ -3,9 +3,11 @@ XBMC_PLATFORM_DIR=android . $WORKSPACE/tools/buildsteps/defaultenv #clean without depends for skipping depends build if possible -cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" +#also skip binary addons (pvr, audioencoder) as long as they are deployed in tree +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} -if [ "$(rebuildDepends)" == "1" ] +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then #clean up the rest too cd $WORKSPACE;git clean -xffd diff --git a/tools/buildsteps/android/prepare-xbmc b/tools/buildsteps/android/prepare-xbmc index 3a82e5c600..b6402ee3c9 100644 --- a/tools/buildsteps/android/prepare-xbmc +++ b/tools/buildsteps/android/prepare-xbmc @@ -9,3 +9,6 @@ then rm -r $WORKSPACE/addons/skin.re-touched fi git submodule update --init $WORKSPACE/addons/skin.re-touched + +#build binary addons before building xbmc... +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff --git a/tools/buildsteps/androidx86/configure-depends b/tools/buildsteps/androidx86/configure-depends index 89fd36f34b..5c35987fad 100644 --- a/tools/buildsteps/androidx86/configure-depends +++ b/tools/buildsteps/androidx86/configure-depends @@ -7,7 +7,7 @@ NDK_ARCH=x86 CURRENT_NDK_PATH=$ANDROID_DEV_ROOT/android-ndk-r$NDK_VERSION CURRENT_TOOLCHAIN=$ANDROID_DEV_ROOT/android-toolchain-$NDK_ARCH-$SDK_VERSION-r$NDK_VERSION -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then cd $WORKSPACE/tools/depends;./configure \ --with-tarballs=$TARBALLS \ diff --git a/tools/buildsteps/androidx86/make-binary-addons b/tools/buildsteps/androidx86/make-binary-addons new file mode 100644 index 0000000000..60a288979f --- /dev/null +++ b/tools/buildsteps/androidx86/make-binary-addons @@ -0,0 +1,25 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=android +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #make jenkins fail + exit 1 +fi diff --git a/tools/buildsteps/androidx86/make-depends b/tools/buildsteps/androidx86/make-depends index 2d5509e7ac..c5869b26e2 100644 --- a/tools/buildsteps/androidx86/make-depends +++ b/tools/buildsteps/androidx86/make-depends @@ -2,8 +2,8 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=android . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then - cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulDependsBuild + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends fi diff --git a/tools/buildsteps/androidx86/make-native-depends b/tools/buildsteps/androidx86/make-native-depends new file mode 100644 index 0000000000..549ad2becb --- /dev/null +++ b/tools/buildsteps/androidx86/make-native-depends @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=android +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi
\ No newline at end of file diff --git a/tools/buildsteps/androidx86/prepare-depends b/tools/buildsteps/androidx86/prepare-depends index babe7e4d63..933ea4592e 100644 --- a/tools/buildsteps/androidx86/prepare-depends +++ b/tools/buildsteps/androidx86/prepare-depends @@ -3,9 +3,11 @@ XBMC_PLATFORM_DIR=android . $WORKSPACE/tools/buildsteps/defaultenv #clean without depends for skipping depends build if possible -cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" +#also skip binary addons (pvr, audioencoder) as long as they are deployed in tree +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} -if [ "$(rebuildDepends)" == "1" ] +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then #clean up the rest too cd $WORKSPACE;git clean -xffd diff --git a/tools/buildsteps/androidx86/prepare-xbmc b/tools/buildsteps/androidx86/prepare-xbmc index 3a82e5c600..b6402ee3c9 100644 --- a/tools/buildsteps/androidx86/prepare-xbmc +++ b/tools/buildsteps/androidx86/prepare-xbmc @@ -9,3 +9,6 @@ then rm -r $WORKSPACE/addons/skin.re-touched fi git submodule update --init $WORKSPACE/addons/skin.re-touched + +#build binary addons before building xbmc... +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff --git a/tools/buildsteps/atv2/configure-depends b/tools/buildsteps/atv2/configure-depends index 2c9aa26b4e..e12bc54f97 100755 --- a/tools/buildsteps/atv2/configure-depends +++ b/tools/buildsteps/atv2/configure-depends @@ -2,7 +2,7 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=atv2 . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then cd $WORKSPACE/tools/depends;./configure \ --with-tarballs=/Users/Shared/xbmc-depends/tarballs \ @@ -10,4 +10,3 @@ then --with-sdk=$SDK_VERSION \ --prefix=$XBMC_DEPENDS_ROOT fi - diff --git a/tools/buildsteps/atv2/make-binary-addons b/tools/buildsteps/atv2/make-binary-addons new file mode 100755 index 0000000000..639c4a2ff2 --- /dev/null +++ b/tools/buildsteps/atv2/make-binary-addons @@ -0,0 +1,25 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #make jenkins fail + exit 1 +fi diff --git a/tools/buildsteps/atv2/make-native-depends b/tools/buildsteps/atv2/make-native-depends new file mode 100755 index 0000000000..416c14f3cb --- /dev/null +++ b/tools/buildsteps/atv2/make-native-depends @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=atv2 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi
\ No newline at end of file diff --git a/tools/buildsteps/atv2/make-xbmc b/tools/buildsteps/atv2/make-xbmc index 2368622cc3..4f03e615c1 100755 --- a/tools/buildsteps/atv2/make-xbmc +++ b/tools/buildsteps/atv2/make-xbmc @@ -6,3 +6,4 @@ cd $WORKSPACE;make -j$BUILDTHREADS xcode_depends cd $WORKSPACE;xcodebuild -project Kodi.xcodeproj -target Kodi-ATV2 -configuration $Configuration build \ ONLY_ACTIVE_ARCH=YES ARCHS=armv7 VALID_ARCHS=armv7 \ SDKROOT=iphoneos$SDK_VERSION XBMC_DEPENDS_ROOT=$XBMC_DEPENDS_ROOT CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO + diff --git a/tools/buildsteps/atv2/prepare-depends b/tools/buildsteps/atv2/prepare-depends index 3224fcf5ad..c390d3bb76 100755 --- a/tools/buildsteps/atv2/prepare-depends +++ b/tools/buildsteps/atv2/prepare-depends @@ -4,12 +4,12 @@ XBMC_PLATFORM_DIR=atv2 #clean without depends for skipping depends build if possible #also skip binary addons (pvr, audioencoder) as long as they are deployed in tree -cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" -e "addons/pvr.*" -e "addons/audioencoder.*" +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} -if [ "$(rebuildDepends)" == "1" ] +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then #clean up the rest too cd $WORKSPACE;git clean -xffd cd $WORKSPACE/tools/depends/;./bootstrap fi - diff --git a/tools/buildsteps/atv2/prepare-xbmc b/tools/buildsteps/atv2/prepare-xbmc index c3738f9e7a..b24df067fd 100755 --- a/tools/buildsteps/atv2/prepare-xbmc +++ b/tools/buildsteps/atv2/prepare-xbmc @@ -2,5 +2,6 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=atv2 . $WORKSPACE/tools/buildsteps/defaultenv -#nothing on ios +#build binary addons before building xbmc... +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff --git a/tools/buildsteps/defaultenv b/tools/buildsteps/defaultenv index 6b9f29d583..b6db1b08f7 100644 --- a/tools/buildsteps/defaultenv +++ b/tools/buildsteps/defaultenv @@ -7,6 +7,10 @@ PATH_CHANGE_REV_FILENAME=".last_success_revision" #TARBALLS ENV-VAR is only used by android scripts atm TARBALLS=${TARBALLS:-"/opt/xbmc-tarballs"} +BINARY_ADDONS_ROOT=tools/depends/target +BINARY_ADDONS="xbmc-audioencoder-addons xbmc-pvr-addons" +DEPLOYED_BINARY_ADDONS="-e addons" + #set platform defaults #$XBMC_PLATFORM_DIR matches the platform subdirs! case $XBMC_PLATFORM_DIR in @@ -76,6 +80,7 @@ fi #helper functions #hash a dir based on the git revision, SDK_PATH, NDK_PATH, NDK_VERSION, SDK_VERSION, TOOLCHAIN TOOLCHAIN_X86 (for droidx86) and XBMC_DEPENDS_ROOT +#param1 path to be hashed function getBuildHash () { local checkPath @@ -86,6 +91,7 @@ function getBuildHash () echo $hashStr } +#param1 path to be checked for changes function pathChanged () { local ret @@ -112,26 +118,14 @@ function pathChanged () echo $ret } -function rebuildDepends () -{ - local ret - ret="0" - # check if depends need to be rebuilt - this is done by checking last - # successfull build revision of depends and cmake dir - if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] || [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] - then - ret="1" - fi - - echo $ret -} - -function tagSuccessFulDependsBuild () +#param1 path to be tagged with hash +function tagSuccessFulBuild () { - # tag last successful build of depends by marking the revisions of depends and cmake dir - # needs to match the checks in function rebuildDepends - echo "$(getBuildHash $WORKSPACE/tools/depends)" > $WORKSPACE/tools/depends/$PATH_CHANGE_REV_FILENAME - echo "$(getBuildHash $WORKSPACE/project/cmake)" > $WORKSPACE/project/cmake/$PATH_CHANGE_REV_FILENAME + local pathToTag + pathToTag="$1" + # tag last successful build with revisions of the given dir + # needs to match the checks in function getBuildHash + echo "$(getBuildHash $pathToTag)" > $pathToTag/$PATH_CHANGE_REV_FILENAME } function getBranchName () diff --git a/tools/buildsteps/ios/configure-depends b/tools/buildsteps/ios/configure-depends index 998f80a354..d09f0cb269 100755 --- a/tools/buildsteps/ios/configure-depends +++ b/tools/buildsteps/ios/configure-depends @@ -2,7 +2,7 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=ios . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then cd $WORKSPACE/tools/depends;./configure \ --with-tarballs=/Users/Shared/xbmc-depends/tarballs \ diff --git a/tools/buildsteps/ios/make-binary-addons b/tools/buildsteps/ios/make-binary-addons new file mode 100755 index 0000000000..f9f84b5873 --- /dev/null +++ b/tools/buildsteps/ios/make-binary-addons @@ -0,0 +1,25 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=ios +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #make jenkins fail + exit 1 +fi diff --git a/tools/buildsteps/ios/make-depends b/tools/buildsteps/ios/make-depends index ce3bdf6bc3..eb36ee2a16 100755 --- a/tools/buildsteps/ios/make-depends +++ b/tools/buildsteps/ios/make-depends @@ -2,8 +2,8 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=ios . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then - cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulDependsBuild + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends fi diff --git a/tools/buildsteps/ios/make-native-depends b/tools/buildsteps/ios/make-native-depends new file mode 100755 index 0000000000..36ebea8bb3 --- /dev/null +++ b/tools/buildsteps/ios/make-native-depends @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=ios +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi
\ No newline at end of file diff --git a/tools/buildsteps/ios/prepare-depends b/tools/buildsteps/ios/prepare-depends index ff83e1213d..01aa9ed766 100755 --- a/tools/buildsteps/ios/prepare-depends +++ b/tools/buildsteps/ios/prepare-depends @@ -4,9 +4,10 @@ XBMC_PLATFORM_DIR=ios #clean without depends for skipping depends build if possible #also skip binary addons (pvr, audioencoder) as long as they are deployed in tree -cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" -e "addons/pvr.*" -e "addons/audioencoder.*" +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} -if [ "$(rebuildDepends)" == "1" ] +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then #clean up the rest too cd $WORKSPACE;git clean -xffd diff --git a/tools/buildsteps/ios/prepare-xbmc b/tools/buildsteps/ios/prepare-xbmc index 1b93c2bdb7..9497ceab6b 100755 --- a/tools/buildsteps/ios/prepare-xbmc +++ b/tools/buildsteps/ios/prepare-xbmc @@ -9,3 +9,6 @@ then rm -r $WORKSPACE/addons/skin.re-touched fi git submodule update --init $WORKSPACE/addons/skin.re-touched + +#build binary addons before building xbmc... +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff --git a/tools/buildsteps/linux32/configure-depends b/tools/buildsteps/linux32/configure-depends index 9382b9514e..4e143d6992 100755 --- a/tools/buildsteps/linux32/configure-depends +++ b/tools/buildsteps/linux32/configure-depends @@ -2,7 +2,7 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=linux32 . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then cd $WORKSPACE/tools/depends;./configure \ --with-toolchain=/usr --prefix=$XBMC_DEPENDS_ROOT --host=i686-linux-gnu --with-tarballs=$TARBALLS diff --git a/tools/buildsteps/linux32/configure-xbmc b/tools/buildsteps/linux32/configure-xbmc index 5e532760bf..de0247a9cf 100755 --- a/tools/buildsteps/linux32/configure-xbmc +++ b/tools/buildsteps/linux32/configure-xbmc @@ -2,4 +2,4 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=linux32 . $WORKSPACE/tools/buildsteps/defaultenv -cd $WORKSPACE/;./configure +make -C $WORKSPACE/tools/depends/target/xbmc diff --git a/tools/buildsteps/linux32/make-binary-addons b/tools/buildsteps/linux32/make-binary-addons new file mode 100755 index 0000000000..413fff1c81 --- /dev/null +++ b/tools/buildsteps/linux32/make-binary-addons @@ -0,0 +1,25 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #make jenkins fail + exit 1 +fi diff --git a/tools/buildsteps/linux32/make-depends b/tools/buildsteps/linux32/make-depends index b7f1320260..d5371e837d 100755 --- a/tools/buildsteps/linux32/make-depends +++ b/tools/buildsteps/linux32/make-depends @@ -2,8 +2,8 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=linux32 . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then - cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulDependsBuild + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS || make && tagSuccessFulBuild $WORKSPACE/tools/depends fi diff --git a/tools/buildsteps/linux32/make-native-depends b/tools/buildsteps/linux32/make-native-depends new file mode 100755 index 0000000000..1f21d53375 --- /dev/null +++ b/tools/buildsteps/linux32/make-native-depends @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux32 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi
\ No newline at end of file diff --git a/tools/buildsteps/linux32/make-xbmc b/tools/buildsteps/linux32/make-xbmc index a2bc0a7afc..79f07e2dc4 100755 --- a/tools/buildsteps/linux32/make-xbmc +++ b/tools/buildsteps/linux32/make-xbmc @@ -2,4 +2,4 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=linux32 . $WORKSPACE/tools/buildsteps/defaultenv -cd $WORKSPACE;make -j$BUILDTHREADS +cd $WORKSPACE;make -j$BUILDTHREADS || make diff --git a/tools/buildsteps/linux32/package b/tools/buildsteps/linux32/package index 45dc4c34cf..b073061176 100755 --- a/tools/buildsteps/linux32/package +++ b/tools/buildsteps/linux32/package @@ -3,8 +3,3 @@ XBMC_PLATFORM_DIR=linux32 . $WORKSPACE/tools/buildsteps/defaultenv #nothing for linux atm - -#rename for upload -#e.x. xbmc-20130314-8c2fb31-Frodo-armeabi-v7a.apk -UPLOAD_FILENAME="xbmc-$(getBuildRevDateStr)-armeabi-v7a.apk" -#mv xbmcapp-armeabi-*.apk $UPLOAD_FILENAME diff --git a/tools/buildsteps/linux32/prepare-depends b/tools/buildsteps/linux32/prepare-depends index 13df413142..525d78b325 100755 --- a/tools/buildsteps/linux32/prepare-depends +++ b/tools/buildsteps/linux32/prepare-depends @@ -3,9 +3,11 @@ XBMC_PLATFORM_DIR=linux32 . $WORKSPACE/tools/buildsteps/defaultenv #clean without depends for skipping depends build if possible -cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" +#also skip binary addons (pvr, audioencoder) as long as they are deployed in tree +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} -if [ "$(rebuildDepends)" == "1" ] +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then #clean up the rest too cd $WORKSPACE;git clean -xffd diff --git a/tools/buildsteps/linux32/prepare-xbmc b/tools/buildsteps/linux32/prepare-xbmc index ca3a3d2774..0fbd21ee35 100755 --- a/tools/buildsteps/linux32/prepare-xbmc +++ b/tools/buildsteps/linux32/prepare-xbmc @@ -2,4 +2,5 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=linux32 . $WORKSPACE/tools/buildsteps/defaultenv -#nothing on linux +#build binary addons before building xbmc... +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff --git a/tools/buildsteps/linux64/configure-depends b/tools/buildsteps/linux64/configure-depends index 80e990b427..44edac1431 100755 --- a/tools/buildsteps/linux64/configure-depends +++ b/tools/buildsteps/linux64/configure-depends @@ -2,7 +2,7 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=linux64 . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then cd $WORKSPACE/tools/depends;./configure \ --with-toolchain=/usr --prefix=$XBMC_DEPENDS_ROOT --host=x86_64-linux-gnu --with-tarballs=$TARBALLS diff --git a/tools/buildsteps/linux64/make-binary-addons b/tools/buildsteps/linux64/make-binary-addons new file mode 100755 index 0000000000..c57ee7c19b --- /dev/null +++ b/tools/buildsteps/linux64/make-binary-addons @@ -0,0 +1,25 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux64 +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #make jenkins fail + exit 1 +fi diff --git a/tools/buildsteps/linux64/make-depends b/tools/buildsteps/linux64/make-depends index ef58af723f..1730a618c7 100755 --- a/tools/buildsteps/linux64/make-depends +++ b/tools/buildsteps/linux64/make-depends @@ -2,8 +2,8 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=linux64 . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then - cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS || make && tagSuccessFulDependsBuild + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS || make && tagSuccessFulBuild $WORKSPACE/tools/depends fi diff --git a/tools/buildsteps/linux64/make-native-depends b/tools/buildsteps/linux64/make-native-depends new file mode 100755 index 0000000000..c05850f7f3 --- /dev/null +++ b/tools/buildsteps/linux64/make-native-depends @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=linux64 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi
\ No newline at end of file diff --git a/tools/buildsteps/linux64/prepare-depends b/tools/buildsteps/linux64/prepare-depends index 31fde7a0f5..ae0a027a06 100755 --- a/tools/buildsteps/linux64/prepare-depends +++ b/tools/buildsteps/linux64/prepare-depends @@ -3,9 +3,11 @@ XBMC_PLATFORM_DIR=linux64 . $WORKSPACE/tools/buildsteps/defaultenv #clean without depends for skipping depends build if possible -cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" +#also skip binary addons (pvr, audioencoder) as long as they are deployed in tree +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} -if [ "$(rebuildDepends)" == "1" ] +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then #clean up the rest too cd $WORKSPACE;git clean -xffd diff --git a/tools/buildsteps/linux64/prepare-xbmc b/tools/buildsteps/linux64/prepare-xbmc index f71fcf6fef..6d6db0fcb2 100755 --- a/tools/buildsteps/linux64/prepare-xbmc +++ b/tools/buildsteps/linux64/prepare-xbmc @@ -2,4 +2,5 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=linux64 . $WORKSPACE/tools/buildsteps/defaultenv -#nothing on linux +#build binary addons before building xbmc... +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff --git a/tools/buildsteps/osx32/configure-depends b/tools/buildsteps/osx32/configure-depends index b475a1db8a..3ccfc3553c 100755 --- a/tools/buildsteps/osx32/configure-depends +++ b/tools/buildsteps/osx32/configure-depends @@ -2,7 +2,7 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=osx32 . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then cd $WORKSPACE/tools/depends;./configure \ --with-tarballs=/Users/Shared/xbmc-depends/tarballs \ diff --git a/tools/buildsteps/osx32/make-binary-addons b/tools/buildsteps/osx32/make-binary-addons new file mode 100755 index 0000000000..8c2d6a54c5 --- /dev/null +++ b/tools/buildsteps/osx32/make-binary-addons @@ -0,0 +1,25 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #make jenkins fail + exit 1 +fi diff --git a/tools/buildsteps/osx32/make-depends b/tools/buildsteps/osx32/make-depends index ecddc6dcde..ac149d74c3 100755 --- a/tools/buildsteps/osx32/make-depends +++ b/tools/buildsteps/osx32/make-depends @@ -2,8 +2,8 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=osx32 . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then - cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulDependsBuild + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends fi diff --git a/tools/buildsteps/osx32/make-native-depends b/tools/buildsteps/osx32/make-native-depends new file mode 100755 index 0000000000..6bdbc6665e --- /dev/null +++ b/tools/buildsteps/osx32/make-native-depends @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx32 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi
\ No newline at end of file diff --git a/tools/buildsteps/osx32/prepare-depends b/tools/buildsteps/osx32/prepare-depends index 2e356226f0..3feb117e4a 100755 --- a/tools/buildsteps/osx32/prepare-depends +++ b/tools/buildsteps/osx32/prepare-depends @@ -4,9 +4,10 @@ XBMC_PLATFORM_DIR=osx32 #clean without depends for skipping depends build if possible #also skip binary addons (pvr, audioencoder) as long as they are deployed in tree -cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" -e "addons/pvr.*" -e "addons/audioencoder.*" +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} -if [ "$(rebuildDepends)" == "1" ] +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then #clean up the rest too cd $WORKSPACE;git clean -xffd diff --git a/tools/buildsteps/osx32/prepare-xbmc b/tools/buildsteps/osx32/prepare-xbmc index 01f97dac74..59431ddb17 100755 --- a/tools/buildsteps/osx32/prepare-xbmc +++ b/tools/buildsteps/osx32/prepare-xbmc @@ -2,4 +2,5 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=osx32 . $WORKSPACE/tools/buildsteps/defaultenv -#nothing on osx +#build binary addons before building xbmc... +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff --git a/tools/buildsteps/osx64/configure-depends b/tools/buildsteps/osx64/configure-depends index 840643c33f..62f97700b3 100755 --- a/tools/buildsteps/osx64/configure-depends +++ b/tools/buildsteps/osx64/configure-depends @@ -2,7 +2,7 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=osx64 . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then cd $WORKSPACE/tools/depends;./configure \ --with-tarballs=/Users/Shared/xbmc-depends/tarballs \ diff --git a/tools/buildsteps/osx64/make-binary-addons b/tools/buildsteps/osx64/make-binary-addons new file mode 100755 index 0000000000..95a667a7e3 --- /dev/null +++ b/tools/buildsteps/osx64/make-binary-addons @@ -0,0 +1,25 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx64 +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #make jenkins fail + exit 1 +fi diff --git a/tools/buildsteps/osx64/make-depends b/tools/buildsteps/osx64/make-depends index 6749356afc..5a325e16e9 100755 --- a/tools/buildsteps/osx64/make-depends +++ b/tools/buildsteps/osx64/make-depends @@ -2,8 +2,8 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=osx64 . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then - cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulDependsBuild + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends fi diff --git a/tools/buildsteps/osx64/make-native-depends b/tools/buildsteps/osx64/make-native-depends new file mode 100755 index 0000000000..d74c80ee26 --- /dev/null +++ b/tools/buildsteps/osx64/make-native-depends @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=osx64 +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi
\ No newline at end of file diff --git a/tools/buildsteps/osx64/prepare-depends b/tools/buildsteps/osx64/prepare-depends index 03b10ea823..60df95379d 100755 --- a/tools/buildsteps/osx64/prepare-depends +++ b/tools/buildsteps/osx64/prepare-depends @@ -4,9 +4,10 @@ XBMC_PLATFORM_DIR=osx64 #clean without depends for skipping depends build if possible #also skip binary addons (pvr, audioencoder) as long as they are deployed in tree -cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" -e "addons/pvr.*" -e "addons/audioencoder.*" +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} -if [ "$(rebuildDepends)" == "1" ] +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then #clean up the rest too cd $WORKSPACE;git clean -xffd diff --git a/tools/buildsteps/osx64/prepare-xbmc b/tools/buildsteps/osx64/prepare-xbmc index 6eea638e97..2c30e4924c 100755 --- a/tools/buildsteps/osx64/prepare-xbmc +++ b/tools/buildsteps/osx64/prepare-xbmc @@ -2,4 +2,5 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=osx64 . $WORKSPACE/tools/buildsteps/defaultenv -#nothing on osx +#build binary addons before building xbmc... +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff --git a/tools/buildsteps/rbpi/configure-depends b/tools/buildsteps/rbpi/configure-depends index 96c75e1f9e..556469f359 100755 --- a/tools/buildsteps/rbpi/configure-depends +++ b/tools/buildsteps/rbpi/configure-depends @@ -2,7 +2,7 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=rbpi . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then cd $WORKSPACE/tools/depends; diff --git a/tools/buildsteps/rbpi/make-binary-addons b/tools/buildsteps/rbpi/make-binary-addons new file mode 100755 index 0000000000..c7cf4c0e45 --- /dev/null +++ b/tools/buildsteps/rbpi/make-binary-addons @@ -0,0 +1,25 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=rbpi +. $WORKSPACE/tools/buildsteps/defaultenv + +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends + +ALL_BINARY_ADDONS_BUILT="1" +#only build binary addons if something in the addons metadata changed +if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ] +then + for addon in $BINARY_ADDONS + do + echo "building $addon" + git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon + cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS || ALL_BINARY_ADDONS_BUILT="0" + done +fi + +if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ] +then + tagSuccessFulBuild $WORKSPACE/project/cmake +else + #make jenkins fail + exit 1 +fi diff --git a/tools/buildsteps/rbpi/make-depends b/tools/buildsteps/rbpi/make-depends index 4eb47575b7..ceeee09234 100755 --- a/tools/buildsteps/rbpi/make-depends +++ b/tools/buildsteps/rbpi/make-depends @@ -2,8 +2,8 @@ WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} XBMC_PLATFORM_DIR=rbpi . $WORKSPACE/tools/buildsteps/defaultenv -if [ "$(rebuildDepends)" == "1" ] +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then - cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS || make && tagSuccessFulDependsBuild + cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS || make && tagSuccessFulBuild $WORKSPACE/tools/depends fi diff --git a/tools/buildsteps/rbpi/make-native-depends b/tools/buildsteps/rbpi/make-native-depends new file mode 100755 index 0000000000..5f6d64c452 --- /dev/null +++ b/tools/buildsteps/rbpi/make-native-depends @@ -0,0 +1,9 @@ +WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )} +XBMC_PLATFORM_DIR=rbpi +. $WORKSPACE/tools/buildsteps/defaultenv + +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] +then + git clean -xffd $WORKSPACE/tools/depends/native + cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends +fi
\ No newline at end of file diff --git a/tools/buildsteps/rbpi/prepare-depends b/tools/buildsteps/rbpi/prepare-depends index c084909dfa..8205432d65 100755 --- a/tools/buildsteps/rbpi/prepare-depends +++ b/tools/buildsteps/rbpi/prepare-depends @@ -3,7 +3,8 @@ XBMC_PLATFORM_DIR=rbpi . $WORKSPACE/tools/buildsteps/defaultenv #clean without depends for skipping depends build if possible -cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" +#also skip binary addons (pvr, audioencoder) as long as they are deployed in tree +cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS} if [ -d $JENKINS_RBPI_DEVENV/firmware ] then @@ -12,7 +13,10 @@ else cd $JENKINS_RBPI_DEVENV;git clone git://github.com/raspberrypi/firmware.git --depth=1 -b master fi -if [ "$(rebuildDepends)" == "1" ] +cd $WORKSPACE + +# if depends path has changed - cleanout everything and do a full rebuild +if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] then #clean up the rest too cd $WORKSPACE;git clean -xffd diff --git a/tools/buildsteps/rbpi/prepare-xbmc b/tools/buildsteps/rbpi/prepare-xbmc index c47ee7dd9d..468c7ed5cb 100755 --- a/tools/buildsteps/rbpi/prepare-xbmc +++ b/tools/buildsteps/rbpi/prepare-xbmc @@ -4,3 +4,6 @@ XBMC_PLATFORM_DIR=rbpi cd $WORKSPACE JSON_BUILDER=$XBMC_DEPENDS_ROOT/i686-linux-gnu-native/bin/JsonSchemaBuilder ./bootstrap + +#build binary addons before building xbmc... +. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons diff --git a/tools/buildsteps/win32/make-addons.bat b/tools/buildsteps/win32/make-addons.bat index a123b377bb..ec94cef969 100644 --- a/tools/buildsteps/win32/make-addons.bat +++ b/tools/buildsteps/win32/make-addons.bat @@ -85,7 +85,6 @@ cmake "%ADDONS_PATH%" -G "NMake Makefiles" ^ -DBUILD_DIR=%ADDONS_BUILD_PATH% ^ -DDEPENDS_PATH=%ADDON_DEPENDS_PATH% ^ -DPACKAGE_ZIP=1 ^ - -DARCH_DEFINES="-DTARGET_WINDOWS -DNOMINMAX -D_CRT_SECURE_NO_WARNINGS -D_USE_32BIT_TIME_T -D_WINSOCKAPI_" ^ -DADDONS_TO_BUILD="%ADDONS_TO_BUILD%" IF ERRORLEVEL 1 ( ECHO cmake error level: %ERRORLEVEL% > %ERRORFILE% diff --git a/tools/darwin/Configurations/App.xcconfig.in b/tools/darwin/Configurations/App.xcconfig.in index 8453858dfc..bdf04a6ab8 100644 --- a/tools/darwin/Configurations/App.xcconfig.in +++ b/tools/darwin/Configurations/App.xcconfig.in @@ -25,7 +25,7 @@ HEADER_SEARCH_PATHS = $(inherited) $SRCROOT xbmc xbmc/linux xbmc/osx xbmc/cores/ LIBRARY_SEARCH_PATHS = $(inherited) $(SRCROOT) $(SRCROOT)/lib/libRTV $(SRCROOT)/lib/libXDAAP $(SRCROOT)/lib/cmyth/libcmyth $(SRCROOT)/lib/cmyth/librefmem $(SRCROOT)/lib/SlingboxLib $(SRCROOT)/xbmc/interfaces/json-rpc "$(SRCROOT)/xbmc/interfaces/python" "$(SRCROOT)/xbmc/interfaces/legacy" FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SDKROOT)/System/Library/PrivateFrameworks/" "$(SDKROOT)/System/Library/Frameworks/" -XBMC_OTHER_LDFLAGS_COMMON = $(inherited) -Wl,-headerpad_max_install_names -Wl,-all_load -L$XBMC_DEPENDS/lib -lbz2 -lintl -lexpat -lssl -lgpg-error -lresolv -lffi -lssh -llzo2 -lpcre -lpcrecpp -lfribidi -lfreetype -lfontconfig -lsqlite3 -ltinyxml -lmicrohttpd -lsmbclient -lpython2.6 -lyajl -ljpeg -lcrypto -lgcrypt -lavdevice -lavfilter -lavcodec -lavformat -lpostproc -lavutil -lswresample -lswscale -ltag -L$XBMC_DEPENDS/lib/mysql -lmysqlclient -lxml2 -lxslt -lnettle -lgmp -lhogweed -lgnutls +XBMC_OTHER_LDFLAGS_COMMON = $(inherited) -Wl,-headerpad_max_install_names -Wl,-all_load -L$XBMC_DEPENDS/lib -lbz2 -lintl -lexpat -lssl -lgpg-error -lresolv -lffi -lssh -llzo2 -lpcre -lpcrecpp -lfribidi -lfreetype -lfontconfig -lsqlite3 -ltinyxml -lmicrohttpd -lsmbclient -lpython2.6 -lyajl -ljpeg -lcrypto -lgcrypt -lavdevice -lavfilter -lavcodec -lavformat -lpostproc -lavutil -lswresample -lswscale -ltag -L$XBMC_DEPENDS/lib/mysql -lmysqlclient -lxml2 -lxslt -lnettle -lgmp -lhogweed -lgnutls -lsquish CLANG_CXX_LANGUAGE_STANDARD = c++0x CLANG_CXX_LIBRARY = libc++ diff --git a/tools/depends/configure.in b/tools/depends/configure.in index c0fdb59ea1..fb9f7760cb 100644 --- a/tools/depends/configure.in +++ b/tools/depends/configure.in @@ -5,6 +5,8 @@ AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_FILES([target/config.site native/config.site.native Makefile.include target/Toolchain.cmake]) AC_CANONICAL_HOST m4_include([../../m4/xbmc_arch.m4]) +m4_include([../../m4/ax_cxx_compile_stdcxx_11.m4]) +AX_CXX_COMPILE_STDCXX_11(,[optional]) AC_ARG_WITH([toolchain], [AS_HELP_STRING([--with-toolchain], diff --git a/tools/depends/native/TexturePacker/src/TexturePacker.cpp b/tools/depends/native/TexturePacker/src/TexturePacker.cpp index 9d093f280d..a345ebd2dd 100644 --- a/tools/depends/native/TexturePacker/src/TexturePacker.cpp +++ b/tools/depends/native/TexturePacker/src/TexturePacker.cpp @@ -389,7 +389,7 @@ int createBundle(const std::string& InputDir, const std::string& OutputFile, dou CXBTFFrame frame = createXBTFFrame(frames.frameList[j].rgbaImage, writer, maxMSE, flags); frame.SetDuration(frames.frameList[j].delay); file.GetFrames().push_back(frame); - printf("%s%c (%d,%d @ %"PRIu64" bytes)\n", GetFormatString(frame.GetFormat()), frame.HasAlpha() ? ' ' : '*', + printf("%s%c (%d,%d @ %" PRIu64 " bytes)\n", GetFormatString(frame.GetFormat()), frame.HasAlpha() ? ' ' : '*', frame.GetWidth(), frame.GetHeight(), frame.GetUnpackedSize()); } } diff --git a/tools/depends/target/Makefile b/tools/depends/target/Makefile index d1a0e69044..fd38bb8cab 100644 --- a/tools/depends/target/Makefile +++ b/tools/depends/target/Makefile @@ -15,7 +15,6 @@ DEPENDS = \ python26 afpfs-ng libshairplay \ libplist libcec libbluray boost tinyxml dummy-libxbmc \ libamplayer libssh taglib libusb libnfs libmp3lame \ - xbmc-pvr-addons xbmc-audioencoder-addons \ pythonmodule-pil libxslt ffmpeg FFMPEG_DEPENDS = gnutls @@ -88,8 +87,6 @@ afpfs-ng: libgcrypt $(ICONV) libplist: libxml2 $(ZLIB) libbluray: $(ICONV) libxml2 libssh: openssl -xbmc-pvr-addons: boost mysql -xbmc-audioencoder-addons: libvorbis libflac libmp3lame libogg mysql: openssl libzip: $(ZLIB) libmp3lame: $(ICONV) diff --git a/tools/depends/target/ffmpeg/FFMPEG-VERSION b/tools/depends/target/ffmpeg/FFMPEG-VERSION index a2df8328bd..391db9009d 100644 --- a/tools/depends/target/ffmpeg/FFMPEG-VERSION +++ b/tools/depends/target/ffmpeg/FFMPEG-VERSION @@ -1,5 +1,5 @@ LIBNAME=ffmpeg BASE_URL=https://github.com/xbmc/FFmpeg/archive -VERSION=2.5.2-Isengard-alpha +VERSION=2.5.4-Isengard-alpha ARCHIVE=$(LIBNAME)-$(VERSION).tar.gz diff --git a/tools/depends/target/pythonmodule-pil/Makefile b/tools/depends/target/pythonmodule-pil/Makefile index 0f1e32f7ed..0c40bb9cbb 100644 --- a/tools/depends/target/pythonmodule-pil/Makefile +++ b/tools/depends/target/pythonmodule-pil/Makefile @@ -40,8 +40,14 @@ $(LIBDYLIB): $(PLATFORM) cd $(PLATFORM); $(CROSSFLAGS) $(NATIVEPREFIX)/bin/python setup.py build -x bdist_egg --plat-name $(OS)-$(CPU) .installed-$(PLATFORM): $(LIBDYLIB) +ifeq ($(OS),android) mkdir -p $(PREFIX)/share/$(APP_NAME)/addons/script.module.pil/lib/PIL/ unzip -oq $(LIBDYLIB) -d $(PREFIX)/share/$(APP_NAME)/addons/script.module.pil/lib/PIL/ +else + mkdir -p $(PREFIX)/lib/python2.6/site-packages/PIL + unzip -oq $(LIBDYLIB) -d $(PREFIX)/lib/python2.6/site-packages/PIL/ + echo 'PIL' > $(PREFIX)/lib/python2.6/site-packages/PIL.pth +endif touch $@ clean: diff --git a/tools/depends/target/xbmc-pvr-addons/Makefile b/tools/depends/target/xbmc-pvr-addons/Makefile index 5abf2b7566..b981edc3f7 100644 --- a/tools/depends/target/xbmc-pvr-addons/Makefile +++ b/tools/depends/target/xbmc-pvr-addons/Makefile @@ -2,8 +2,8 @@ include ../../Makefile.include #DEPS= ../../Makefile.include Makefile LIBNAME=xbmc-pvr-addons -VERSION=b2dc035404e14f137033876d14ad92ae3bde5f27 -GIT_DIR=$(TARBALLS_LOCATION)/$(LIBNAME).git +VERSION=2fb0fc22668b1efdec05e66161d6c419844ee9cd +GIT_DIR=$(PREFIX)/gitrepos/$(LIBNAME).git BASE_URL=git://github.com/opdenkamp/$(LIBNAME).git DYLIB=$(PLATFORM)/addons/pvr.demo/.libs/libpvrdemo-addon.so XBMC_ADDONSDIR=../../../../addons @@ -23,7 +23,8 @@ CONFIGURE=./configure --prefix=$(PREFIX) --libdir=$(PREFIX)/lib/$(APP_NAME)/addo all: .installed-$(PLATFORM) $(GIT_DIR)/HEAD: - cd $(TARBALLS_LOCATION); git clone --bare $(BASE_URL) + mkdir -p $(PREFIX)/gitrepos/ + cd $(PREFIX)/gitrepos/; git clone --bare $(BASE_URL) $(GIT_DIR)/current/$(VERSION): $(GIT_DIR)/HEAD $(DEPS) git rev-list -1 $(VERSION) >/dev/null || git fetch origin "+refs/heads/*:refs/remotes/origin/*" diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index ade1e2388a..62d76597f2 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -37,6 +37,7 @@ #include "PlayListPlayer.h" #include "Autorun.h" #include "video/Bookmark.h" +#include "video/VideoLibraryQueue.h" #include "network/NetworkServices.h" #include "guilib/GUIControlProfiler.h" #include "utils/LangCodeExpander.h" @@ -294,9 +295,7 @@ CApplication::CApplication(void) , m_stackFileItemToUpdate(new CFileItem) , m_progressTrackingVideoResumeBookmark(*new CBookmark) , m_progressTrackingItem(new CFileItem) - , m_videoInfoScanner(new CVideoInfoScanner) , m_musicInfoScanner(new CMusicInfoScanner) - , m_seekHandler(&CSeekHandler::Get()) , m_playerController(new CPlayerController) { m_network = NULL; @@ -353,7 +352,6 @@ CApplication::CApplication(void) CApplication::~CApplication(void) { delete m_musicInfoScanner; - delete m_videoInfoScanner; delete &m_progressTrackingVideoResumeBookmark; #ifdef HAS_DVD_DRIVE delete m_Autorun; @@ -735,6 +733,10 @@ bool CApplication::Create() return false; } +#ifdef TARGET_WINDOWS + CWIN32Util::SetThreadLocalLocale(true); // enable independent locale for each thread, see https://connect.microsoft.com/VisualStudio/feedback/details/794122 +#endif // TARGET_WINDOWS + // start the AudioEngine if (!CAEFactory::StartEngine()) { @@ -1305,6 +1307,9 @@ bool CApplication::Initialize() CAddonMgr::Get().StartServices(true); + // register action listeners + RegisterActionListener(&CSeekHandler::Get()); + CLog::Log(LOGNOTICE, "initialize done"); m_bInitializing = false; @@ -1524,43 +1529,8 @@ bool CApplication::OnSettingUpdate(CSetting* &setting, const char *oldSettingId, return false; const std::string &settingId = setting->GetId(); - if (settingId == "audiooutput.channels") - { - // check if this is an update from Eden - if (oldSettingId != NULL && oldSettingNode != NULL && - StringUtils::EqualsNoCase(oldSettingId, "audiooutput.channellayout")) - { - bool ret = false; - CSettingInt* channels = (CSettingInt*)setting; - if (channels->FromString(oldSettingNode->FirstChild()->ValueStr()) && channels->GetValue() < AE_CH_LAYOUT_MAX - 1) - ret = channels->SetValue(channels->GetValue() + 1); - - // let's just reset the audiodevice settings as well - std::string audiodevice = CSettings::Get().GetString("audiooutput.audiodevice"); - CAEFactory::VerifyOutputDevice(audiodevice, false); - ret |= CSettings::Get().SetString("audiooutput.audiodevice", audiodevice.c_str()); - - return ret; - } - } - else if (settingId == "screensaver.mode") - { - CSettingString *screensaverMode = (CSettingString*)setting; - // we no longer ship the built-in slideshow screensaver, replace it if it's still in use - if (StringUtils::EqualsNoCase(screensaverMode->GetValue(), "screensaver.xbmc.builtin.slideshow")) - return screensaverMode->SetValue("screensaver.xbmc.builtin.dim"); - } - else if (settingId == "scrapers.musicvideosdefault") - { - CSettingAddon *musicvideoScraper = (CSettingAddon*)setting; - if (StringUtils::EqualsNoCase(musicvideoScraper->GetValue(), "metadata.musicvideos.last.fm")) - { - musicvideoScraper->Reset(); - return true; - } - } #if defined(HAS_LIBAMCODEC) - else if (settingId == "videoplayer.useamcodec") + if (settingId == "videoplayer.useamcodec") { // Do not permit amcodec to be used on non-aml platforms. // The setting will be hidden but the default value is true, @@ -1573,25 +1543,14 @@ bool CApplication::OnSettingUpdate(CSetting* &setting, const char *oldSettingId, } #endif #if defined(TARGET_ANDROID) - else if (settingId == "videoplayer.usemediacodec") - { - // Do not permit MediaCodec to be used Android platforms that do not have it. - // The setting will be hidden but the default value is true, - // so change it to false. - if (CAndroidFeatures::GetVersion() < 16) - { - CSettingBool *usemediacodec = (CSettingBool*)setting; - return usemediacodec->SetValue(false); - } - } - else if (settingId == "videoplayer.usestagefright") + if (settingId == "videoplayer.usestagefright") { CSettingBool *usestagefright = (CSettingBool*)setting; return usestagefright->SetValue(false); } #endif #if defined(TARGET_DARWIN_OSX) - else if (settingId == "audiooutput.audiodevice") + if (settingId == "audiooutput.audiodevice") { CSettingString *audioDevice = (CSettingString*)setting; // Gotham and older didn't enumerate audio devices per stream on osx @@ -2002,7 +1961,7 @@ void CApplication::Render() { // Less fps in DPMS - bool lowfps = m_dpmsIsActive || g_Windowing.EnableFrameLimiter(); + bool lowfps = g_Windowing.EnableFrameLimiter(); m_bPresentFrame = false; if (!extPlayerActive && g_graphicsContext.IsFullScreenVideo() && !m_pPlayer->IsPausedPlayback()) @@ -2659,13 +2618,6 @@ bool CApplication::OnAction(const CAction &action) ShowVolumeBar(&action); return true; } - // Check for global seek control - if (m_pPlayer->IsPlaying() && action.GetAmount() && (action.GetID() == ACTION_ANALOG_SEEK_FORWARD || action.GetID() == ACTION_ANALOG_SEEK_BACK)) - { - if (!m_pPlayer->CanSeek()) return false; - m_seekHandler->Seek(action.GetID() == ACTION_ANALOG_SEEK_FORWARD, action.GetAmount(), action.GetRepeat(), true); - return true; - } if (action.GetID() == ACTION_GUIPROFILE_BEGIN) { CGUIControlProfiler::Instance().SetOutputFile(CSpecialProtocol::TranslatePath("special://home/guiprofiler.xml")); @@ -2725,7 +2677,7 @@ void CApplication::FrameMove(bool processEvents, bool processGUI) if (processGUI && m_renderGUI) { m_pInertialScrollingHandler->ProcessInertialScroll(frameTime); - m_seekHandler->Process(); + CSeekHandler::Get().Process(); } } if (processGUI && m_renderGUI) @@ -2865,8 +2817,8 @@ void CApplication::Stop(int exitCode) if (m_musicInfoScanner->IsScanning()) m_musicInfoScanner->Stop(); - if (m_videoInfoScanner->IsScanning()) - m_videoInfoScanner->Stop(); + if (CVideoLibraryQueue::Get().IsRunning()) + CVideoLibraryQueue::Get().CancelAllJobs(); CApplicationMessenger::Get().Cleanup(); @@ -2922,6 +2874,9 @@ void CApplication::Stop(int exitCode) // Stop services before unloading Python CAddonMgr::Get().StopServices(false); + // unregister action listeners + UnregisterActionListener(&CSeekHandler::Get()); + // stop all remaining scripts; must be done after skin has been unloaded, // not before some windows still need it when deinitializing during skin // unloading @@ -3888,6 +3843,7 @@ bool CApplication::ToggleDPMS(bool manual) { m_dpmsIsActive = false; m_dpmsIsManual = false; + SetRenderGUI(true); CAnnouncementManager::Get().Announce(GUI, "xbmc", "OnDPMSDeactivated"); return m_dpms->DisablePowerSaving(); } @@ -3897,6 +3853,7 @@ bool CApplication::ToggleDPMS(bool manual) { m_dpmsIsActive = true; m_dpmsIsManual = manual; + SetRenderGUI(false); CAnnouncementManager::Get().Announce(GUI, "xbmc", "OnDPMSActivated"); return true; } @@ -4085,7 +4042,7 @@ void CApplication::CheckShutdown() if (m_bInhibitIdleShutdown || m_pPlayer->IsPlaying() || m_pPlayer->IsPausedPlayback() // is something playing? || m_musicInfoScanner->IsScanning() - || m_videoInfoScanner->IsScanning() + || CVideoLibraryQueue::Get().IsRunning() || g_windowManager.IsWindowActive(WINDOW_DIALOG_PROGRESS) // progress dialog is onscreen || !g_PVRManager.CanSystemPowerdown(false)) { @@ -4142,7 +4099,7 @@ bool CApplication::OnMessage(CGUIMessage& message) CDarwinUtils::SetScheduling(message.GetMessage()); #endif // reset the seek handler - m_seekHandler->Reset(); + CSeekHandler::Get().Reset(); CPlayList playList = g_playlistPlayer.GetPlaylist(g_playlistPlayer.GetCurrentPlaylist()); // Update our infoManager with the new details etc. @@ -4219,7 +4176,7 @@ bool CApplication::OnMessage(CGUIMessage& message) // Don't queue if next media type is different from current one if ((!file.IsVideo() && m_pPlayer->IsPlayingVideo()) - || (!file.IsAudio() && m_pPlayer->IsPlayingAudio())) + || ((!file.IsAudio() || file.IsVideo()) && m_pPlayer->IsPlayingAudio())) { m_pPlayer->OnNothingToQueueNotify(); return true; @@ -4998,7 +4955,7 @@ void CApplication::UpdateLibraries() bool CApplication::IsVideoScanning() const { - return m_videoInfoScanner->IsScanning(); + return CVideoLibraryQueue::Get().IsScanningLibrary(); } bool CApplication::IsMusicScanning() const @@ -5008,8 +4965,7 @@ bool CApplication::IsMusicScanning() const void CApplication::StopVideoScan() { - if (m_videoInfoScanner->IsScanning()) - m_videoInfoScanner->Stop(); + CVideoLibraryQueue::Get().StopLibraryScanning(); } void CApplication::StopMusicScan() @@ -5020,26 +4976,19 @@ void CApplication::StopMusicScan() void CApplication::StartVideoCleanup(bool userInitiated /* = true */) { - if (m_videoInfoScanner->IsScanning()) + if (userInitiated && CVideoLibraryQueue::Get().IsRunning()) return; + std::set<int> paths; if (userInitiated) - m_videoInfoScanner->CleanDatabase(NULL, NULL, true); + CVideoLibraryQueue::Get().CleanLibraryModal(paths); else - { - m_videoInfoScanner->ShowDialog(false); - m_videoInfoScanner->StartCleanDatabase(); - } + CVideoLibraryQueue::Get().CleanLibrary(paths, false); } void CApplication::StartVideoScan(const std::string &strDirectory, bool userInitiated /* = true */, bool scanAll /* = false */) { - if (m_videoInfoScanner->IsScanning()) - return; - - m_videoInfoScanner->ShowDialog(userInitiated); - - m_videoInfoScanner->Start(strDirectory,scanAll); + CVideoLibraryQueue::Get().ScanLibrary(strDirectory, scanAll, userInitiated); } void CApplication::StartMusicCleanup(bool userInitiated /* = true */) diff --git a/xbmc/Application.h b/xbmc/Application.h index 053f428c7a..bc4b5a8747 100644 --- a/xbmc/Application.h +++ b/xbmc/Application.h @@ -368,12 +368,6 @@ public: float GetDimScreenSaverLevel() const; - /*! \brief Retrieve the applications seek handler. - \return a constant pointer to the seek handler. - \sa CSeekHandler - */ - CSeekHandler* const GetSeekHandler() const { return m_seekHandler; }; - bool SwitchToFullScreen(); CSplash* GetSplash() { return m_splash; } @@ -477,7 +471,6 @@ protected: bool m_bTestMode; bool m_bSystemScreenSaverEnable; - VIDEO::CVideoInfoScanner *m_videoInfoScanner; MUSIC_INFO::CMusicInfoScanner *m_musicInfoScanner; bool m_muted; @@ -502,7 +495,6 @@ protected: bool InitDirectoriesWin32(); void CreateUserDirs(); - CSeekHandler *m_seekHandler; CPlayerController *m_playerController; CInertialScrollingHandler *m_pInertialScrollingHandler; CNetwork *m_network; diff --git a/xbmc/CueDocument.cpp b/xbmc/CueDocument.cpp index c7afad718c..58a225ed30 100644 --- a/xbmc/CueDocument.cpp +++ b/xbmc/CueDocument.cpp @@ -69,6 +69,94 @@ using namespace std; using namespace XFILE; +// Stuff for read CUE data from different sources. +class CueReader +{ +public: + virtual bool ready() const = 0; + virtual bool ReadLine(std::string &line) = 0; + virtual ~CueReader() {} +private: + std::string m_sourcePath; +}; + +class FileReader + : public CueReader +{ +public: + FileReader(const std::string &strFile) + { + m_opened = m_file.Open(strFile); + } + virtual bool ReadLine(std::string &line) + { + // Read the next line. + while (m_file.ReadString(m_szBuffer, 1023)) // Bigger than MAX_PATH_SIZE, for usage with relax! + { + // Remove the white space at the beginning and end of the line. + line = m_szBuffer; + StringUtils::Trim(line); + if (!line.empty()) + return true; + // If we are here, we have an empty line so try the next line + } + return false; + } + virtual bool ready() const + { + return m_opened; + } + virtual ~FileReader() + { + if (m_opened) + m_file.Close(); + + } +private: + CFile m_file; + bool m_opened; + char m_szBuffer[1024]; +}; + +class BufferReader + : public CueReader +{ +public: + BufferReader(const std::string &strContent) + : m_data(strContent) + , m_pos(0) + { + } + virtual bool ReadLine(std::string &line) + { + // Read the next line. + line.clear(); + bool stop = false; + while (m_pos < m_data.size()) + { + // Remove the white space at the beginning of the line. + char ch = m_data.at(m_pos++); + if (ch == '\r' || ch == '\n') { + StringUtils::Trim(line); + if (!line.empty()) + return true; + } + else + { + line.push_back(ch); + } + } + return false; + } + virtual bool ready() const + { + return m_data.size() > 0; + } +private: + std::string m_data; + size_t m_pos; +}; + CCueDocument::CCueDocument(void) { m_iYear = 0; @@ -83,12 +171,96 @@ CCueDocument::~CCueDocument(void) {} //////////////////////////////////////////////////////////////////////////////////// +// Function: ParseFile() +// Opens the CUE file for reading, and constructs the track database information +//////////////////////////////////////////////////////////////////////////////////// +bool CCueDocument::ParseFile(const std::string &strFilePath) +{ + FileReader reader(strFilePath); + return Parse(reader, strFilePath); +} + +//////////////////////////////////////////////////////////////////////////////////// +// Function: ParseTag() +// Reads CUE data from string buffer, and constructs the track database information +//////////////////////////////////////////////////////////////////////////////////// +bool CCueDocument::ParseTag(const std::string &strContent) +{ + BufferReader reader(strContent); + return Parse(reader); +} + +////////////////////////////////////////////////////////////////////////////////// +// Function:GetSongs() +// Returns the track information from the next item in the cuelist +////////////////////////////////////////////////////////////////////////////////// +void CCueDocument::GetSongs(VECSONGS &songs) +{ + for (int i = 0; i < m_iTotalTracks; i++) + { + CSong song; + if ((m_Track[i].strArtist.length() == 0) && (m_strArtist.length() > 0)) + song.artist = StringUtils::Split(m_strArtist, g_advancedSettings.m_musicItemSeparator); + else + song.artist = StringUtils::Split(m_Track[i].strArtist, g_advancedSettings.m_musicItemSeparator); + song.albumArtist = StringUtils::Split(m_strArtist, g_advancedSettings.m_musicItemSeparator); + song.strAlbum = m_strAlbum; + song.genre = StringUtils::Split(m_strGenre, g_advancedSettings.m_musicItemSeparator); + song.iYear = m_iYear; + song.iTrack = m_Track[i].iTrackNumber; + if ( m_iDiscNumber > 0 ) + song.iTrack |= (m_iDiscNumber << 16); // see CMusicInfoTag::GetDiscNumber() + if (m_Track[i].strTitle.length() == 0) // No track information for this track! + song.strTitle = StringUtils::Format("Track %2d", i + 1); + else + song.strTitle = m_Track[i].strTitle; + song.strFileName = m_Track[i].strFile; + song.iStartOffset = m_Track[i].iStartTime; + song.iEndOffset = m_Track[i].iEndTime; + if (song.iEndOffset) + song.iDuration = (song.iEndOffset - song.iStartOffset + 37) / 75; + else + song.iDuration = 0; + // TODO: replayGain goes here + songs.push_back(song); + } +} + +void CCueDocument::UpdateMediaFile(const std::string& oldMediaFile, const std::string& mediaFile) +{ + for (int i = 0; i < m_iTotalTracks; i++) + { + if (m_Track[i].strFile == oldMediaFile) + { + m_Track[i].strFile = mediaFile; + } + } +} + +void CCueDocument::GetMediaFiles(vector<std::string>& mediaFiles) +{ + set<std::string> uniqueFiles; + for (int i = 0; i < m_iTotalTracks; i++) + uniqueFiles.insert(m_Track[i].strFile); + + for (set<std::string>::iterator it = uniqueFiles.begin(); it != uniqueFiles.end(); it++) + mediaFiles.push_back(*it); +} + +std::string CCueDocument::GetMediaTitle() +{ + return m_strAlbum; +} + +// Private Functions start here + +//////////////////////////////////////////////////////////////////////////////////// // Function: Parse() -// Opens the .cue file for reading, and constructs the track database information +// Constructs the track database information from CUE source //////////////////////////////////////////////////////////////////////////////////// -bool CCueDocument::Parse(const std::string &strFile) +bool CCueDocument::Parse(CueReader& reader, const std::string& strFile) { - if (!m_file.Open(strFile)) + if (!reader.ready()) return false; std::string strLine; @@ -100,13 +272,13 @@ bool CCueDocument::Parse(const std::string &strFile) // Run through the .CUE file and extract the tracks... while (true) { - if (!ReadNextLine(strLine)) + if (!reader.ReadLine(strLine)) break; - if (StringUtils::StartsWithNoCase(strLine,"INDEX 01")) + if (StringUtils::StartsWithNoCase(strLine, "INDEX 01")) { if (bCurrentFileChanged) { - CLog::Log(LOGERROR, "Track split over multiple files, unsupported ('%s')", strFile.c_str()); + CLog::Log(LOGERROR, "Track split over multiple files, unsupported."); return false; } @@ -123,21 +295,21 @@ bool CCueDocument::Parse(const std::string &strFile) if (m_iTotalTracks >= 0) m_Track[m_iTotalTracks].iStartTime = time; // start time of the next track } - else if (StringUtils::StartsWithNoCase(strLine,"TITLE")) + else if (StringUtils::StartsWithNoCase(strLine, "TITLE")) { if (m_iTotalTracks == -1) // No tracks yet m_strAlbum = ExtractInfo(strLine.substr(5)); else m_Track[m_iTotalTracks].strTitle = ExtractInfo(strLine.substr(5)); } - else if (StringUtils::StartsWithNoCase(strLine,"PERFORMER")) + else if (StringUtils::StartsWithNoCase(strLine, "PERFORMER")) { if (m_iTotalTracks == -1) // No tracks yet m_strArtist = ExtractInfo(strLine.substr(9)); else // New Artist for this track m_Track[m_iTotalTracks].strArtist = ExtractInfo(strLine.substr(9)); } - else if (StringUtils::StartsWithNoCase(strLine,"TRACK")) + else if (StringUtils::StartsWithNoCase(strLine, "TRACK")) { int iTrackNumber = ExtractNumericInfo(strLine.substr(5)); @@ -154,41 +326,41 @@ bool CCueDocument::Parse(const std::string &strFile) bCurrentFileChanged = false; } - else if (StringUtils::StartsWithNoCase(strLine,"REM DISCNUMBER")) + else if (StringUtils::StartsWithNoCase(strLine, "REM DISCNUMBER")) { int iDiscNumber = ExtractNumericInfo(strLine.substr(14)); if (iDiscNumber > 0) m_iDiscNumber = iDiscNumber; } - else if (StringUtils::StartsWithNoCase(strLine,"FILE")) + else if (StringUtils::StartsWithNoCase(strLine, "FILE")) { // already a file name? then the time computation will be changed - if(strCurrentFile.size() > 0) + if (!strCurrentFile.empty()) bCurrentFileChanged = true; strCurrentFile = ExtractInfo(strLine.substr(4)); // Resolve absolute paths (if needed). - if (strCurrentFile.length() > 0) + if (!strFile.empty() && !strCurrentFile.empty()) ResolvePath(strCurrentFile, strFile); } - else if (StringUtils::StartsWithNoCase(strLine,"REM DATE")) + else if (StringUtils::StartsWithNoCase(strLine, "REM DATE")) { int iYear = ExtractNumericInfo(strLine.substr(8)); if (iYear > 0) m_iYear = iYear; } - else if (StringUtils::StartsWithNoCase(strLine,"REM GENRE")) + else if (StringUtils::StartsWithNoCase(strLine, "REM GENRE")) { m_strGenre = ExtractInfo(strLine.substr(9)); } - else if (StringUtils::StartsWithNoCase(strLine,"REM REPLAYGAIN_ALBUM_GAIN")) + else if (StringUtils::StartsWithNoCase(strLine, "REM REPLAYGAIN_ALBUM_GAIN")) m_replayGainAlbumGain = (float)atof(strLine.substr(26).c_str()); - else if (StringUtils::StartsWithNoCase(strLine,"REM REPLAYGAIN_ALBUM_PEAK")) + else if (StringUtils::StartsWithNoCase(strLine, "REM REPLAYGAIN_ALBUM_PEAK")) m_replayGainAlbumPeak = (float)atof(strLine.substr(26).c_str()); - else if (StringUtils::StartsWithNoCase(strLine,"REM REPLAYGAIN_TRACK_GAIN") && m_iTotalTracks >= 0) + else if (StringUtils::StartsWithNoCase(strLine, "REM REPLAYGAIN_TRACK_GAIN") && m_iTotalTracks >= 0) m_Track[m_iTotalTracks].replayGainTrackGain = (float)atof(strLine.substr(26).c_str()); - else if (StringUtils::StartsWithNoCase(strLine,"REM REPLAYGAIN_TRACK_PEAK") && m_iTotalTracks >= 0) + else if (StringUtils::StartsWithNoCase(strLine, "REM REPLAYGAIN_TRACK_PEAK") && m_iTotalTracks >= 0) m_Track[m_iTotalTracks].replayGainTrackPeak = (float)atof(strLine.substr(26).c_str()); } @@ -198,7 +370,6 @@ bool CCueDocument::Parse(const std::string &strFile) m_Track[m_iTotalTracks].iEndTime = 0; else CLog::Log(LOGERROR, "No INDEX 01 tags in CUE file!"); - m_file.Close(); if (m_iTotalTracks >= 0) { m_iTotalTracks++; @@ -206,79 +377,6 @@ bool CCueDocument::Parse(const std::string &strFile) return (m_iTotalTracks > 0); } -////////////////////////////////////////////////////////////////////////////////// -// Function:GetNextItem() -// Returns the track information from the next item in the cuelist -////////////////////////////////////////////////////////////////////////////////// -void CCueDocument::GetSongs(VECSONGS &songs) -{ - for (int i = 0; i < m_iTotalTracks; i++) - { - CSong song; - if ((m_Track[i].strArtist.length() == 0) && (m_strArtist.length() > 0)) - song.artist = StringUtils::Split(m_strArtist, g_advancedSettings.m_musicItemSeparator); - else - song.artist = StringUtils::Split(m_Track[i].strArtist, g_advancedSettings.m_musicItemSeparator); - song.albumArtist = StringUtils::Split(m_strArtist, g_advancedSettings.m_musicItemSeparator); - song.strAlbum = m_strAlbum; - song.genre = StringUtils::Split(m_strGenre, g_advancedSettings.m_musicItemSeparator); - song.iYear = m_iYear; - song.iTrack = m_Track[i].iTrackNumber; - if ( m_iDiscNumber > 0 ) - song.iTrack |= (m_iDiscNumber << 16); // see CMusicInfoTag::GetDiscNumber() - if (m_Track[i].strTitle.length() == 0) // No track information for this track! - song.strTitle = StringUtils::Format("Track %2d", i + 1); - else - song.strTitle = m_Track[i].strTitle; - song.strFileName = m_Track[i].strFile; - song.iStartOffset = m_Track[i].iStartTime; - song.iEndOffset = m_Track[i].iEndTime; - if (song.iEndOffset) - song.iDuration = (song.iEndOffset - song.iStartOffset + 37) / 75; - else - song.iDuration = 0; - // TODO: replayGain goes here - songs.push_back(song); - } -} - -void CCueDocument::GetMediaFiles(vector<std::string>& mediaFiles) -{ - set<std::string> uniqueFiles; - for (int i = 0; i < m_iTotalTracks; i++) - uniqueFiles.insert(m_Track[i].strFile); - - for (set<std::string>::iterator it = uniqueFiles.begin(); it != uniqueFiles.end(); ++it) - mediaFiles.push_back(*it); -} - -std::string CCueDocument::GetMediaTitle() -{ - return m_strAlbum; -} - -// Private Functions start here - -//////////////////////////////////////////////////////////////////////////////////// -// Function: ReadNextLine() -// Returns the next non-blank line of the textfile, stripping any whitespace from -// the left. -//////////////////////////////////////////////////////////////////////////////////// -bool CCueDocument::ReadNextLine(std::string &szLine) -{ - // Read the next line. - while (m_file.ReadString(m_szBuffer, 1023)) // Bigger than MAX_PATH_SIZE, for usage with relax! - { - // Remove the white space at the beginning and end of the line. - szLine = m_szBuffer; - StringUtils::Trim(szLine); - if (!szLine.empty()) - return true; - // If we are here, we have an empty line so try the next line - } - return false; -} - //////////////////////////////////////////////////////////////////////////////////// // Function: ExtractInfo() // Extracts the information in quotes from the string line, returning it in quote diff --git a/xbmc/CueDocument.h b/xbmc/CueDocument.h index 0040f6f59b..92654e6257 100644 --- a/xbmc/CueDocument.h +++ b/xbmc/CueDocument.h @@ -25,6 +25,8 @@ #define MAX_PATH_SIZE 1024 +class CueReader; + class CCueDocument { class CCueTrack @@ -47,22 +49,19 @@ class CCueDocument float replayGainTrackGain; float replayGainTrackPeak; }; - public: CCueDocument(void); ~CCueDocument(void); // USED - bool Parse(const std::string &strFile); + bool ParseFile(const std::string &strFilePath); + bool ParseTag(const std::string &strContent); void GetSongs(VECSONGS &songs); std::string GetMediaPath(); std::string GetMediaTitle(); void GetMediaFiles(std::vector<std::string>& mediaFiles); - + void UpdateMediaFile(const std::string& oldMediaFile, const std::string& mediaFile); private: - - // USED for file access - XFILE::CFile m_file; - char m_szBuffer[1024]; + bool Parse(CueReader& reader, const std::string& strFile = std::string()); // Member variables std::string m_strArtist; // album artist @@ -78,7 +77,6 @@ private: // cuetrack array std::vector<CCueTrack> m_Track; - bool ReadNextLine(std::string &strLine); std::string ExtractInfo(const std::string &line); int ExtractTimeFromIndex(const std::string &index); int ExtractNumericInfo(const std::string &info); diff --git a/xbmc/FileItem.cpp b/xbmc/FileItem.cpp index 755cf467f8..8550bea709 100644 --- a/xbmc/FileItem.cpp +++ b/xbmc/FileItem.cpp @@ -51,7 +51,6 @@ #include "pictures/PictureInfoTag.h" #include "music/Artist.h" #include "music/Album.h" -#include "music/Song.h" #include "URL.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" @@ -739,7 +738,22 @@ bool CFileItem::IsPVRChannel() const bool CFileItem::IsPVRRecording() const { - if (HasPVRRecordingInfoTag()) return true; /// is this enough? + if (HasPVRRecordingInfoTag()) + return true; + return false; +} + +bool CFileItem::IsUsablePVRRecording() const +{ + if (m_pvrRecordingInfoTag && !m_pvrRecordingInfoTag->IsDeleted()) + return true; + return false; +} + +bool CFileItem::IsDeletedPVRRecording() const +{ + if (m_pvrRecordingInfoTag && m_pvrRecordingInfoTag->IsDeleted()) + return true; return false; } @@ -1166,11 +1180,16 @@ void CFileItem::FillInDefaultIcon() { // archive SetIconImage("DefaultFile.png"); } - else if ( IsPVRRecording() ) + else if ( IsUsablePVRRecording() ) { // PVR recording SetIconImage("DefaultVideo.png"); } + else if ( IsDeletedPVRRecording() ) + { + // PVR deleted recording + SetIconImage("DefaultVideoDeleted.png"); + } else if ( IsAudio() ) { // audio @@ -1530,6 +1549,89 @@ bool CFileItem::IsPath(const std::string& path) const return URIUtils::PathEquals(m_strPath, path); } +void CFileItem::SetCueDocument(const CCueDocumentPtr& cuePtr) +{ + m_cueDocument = cuePtr; +} + +void CFileItem::LoadEmbeddedCue() +{ + CMusicInfoTag& tag = *GetMusicInfoTag(); + if (!tag.Loaded()) + return; + + const std::string embeddedCue = tag.GetCueSheet(); + if (!embeddedCue.empty()) + { + CCueDocumentPtr cuesheet(new CCueDocument); + if (cuesheet->ParseTag(embeddedCue)) + { + std::vector<std::string> MediaFileVec; + cuesheet->GetMediaFiles(MediaFileVec); + for (std::vector<std::string>::iterator itMedia = MediaFileVec.begin(); itMedia != MediaFileVec.end(); itMedia++) + cuesheet->UpdateMediaFile(*itMedia, GetPath()); + SetCueDocument(cuesheet); + } + } +} + +bool CFileItem::HasCueDocument() const +{ + return (nullptr != m_cueDocument.get()); +} + +bool CFileItem::LoadTracksFromCueDocument(CFileItemList& scannedItems) +{ + if (!m_cueDocument) + return false; + + CMusicInfoTag& tag = *GetMusicInfoTag(); + + VECSONGS tracks; + m_cueDocument->GetSongs(tracks); + m_cueDocument.reset(); + + int tracksFound = 0; + for (VECSONGS::iterator it = tracks.begin(); it != tracks.end(); ++it) + { + CSong& song = *it; + if (song.strFileName == GetPath()) + { + if (tag.Loaded()) + { + if (song.strAlbum.empty() && !tag.GetAlbum().empty()) + song.strAlbum = tag.GetAlbum(); + if (song.albumArtist.empty() && !tag.GetAlbumArtist().empty()) + song.albumArtist = tag.GetAlbumArtist(); + if (song.genre.empty() && !tag.GetGenre().empty()) + song.genre = tag.GetGenre(); + if (song.artist.empty() && !tag.GetArtist().empty()) + song.artist = tag.GetArtist(); + if (tag.GetDiscNumber()) + song.iTrack |= (tag.GetDiscNumber() << 16); // see CMusicInfoTag::GetDiscNumber() + if (!tag.GetCueSheet().empty()) + song.strCueSheet = tag.GetCueSheet(); + + SYSTEMTIME dateTime; + tag.GetReleaseDate(dateTime); + if (dateTime.wYear) + song.iYear = dateTime.wYear; + if (song.embeddedArt.empty() && !tag.GetCoverArtInfo().empty()) + song.embeddedArt = tag.GetCoverArtInfo(); + } + + if (!song.iDuration && tag.GetDuration() > 0) + { // must be the last song + song.iDuration = (tag.GetDuration() * 75 - song.iStartOffset + 37) / 75; + } + scannedItems.Add(CFileItemPtr(new CFileItem(song))); + ++tracksFound; + } + } + return 0 != tracksFound; +} + + ///////////////////////////////////////////////////////////////////////////////// ///// ///// CFileItemList @@ -2106,7 +2208,6 @@ void CFileItemList::FilterCueItems() { CSingleLock lock(m_lock); // Handle .CUE sheet files... - VECSONGS itemstoadd; vector<string> itemstodelete; for (int i = 0; i < (int)m_items.size(); i++) { @@ -2115,14 +2216,11 @@ void CFileItemList::FilterCueItems() { // see if it's a .CUE sheet if (pItem->IsCUESheet()) { - CCueDocument cuesheet; - if (cuesheet.Parse(pItem->GetPath())) + CCueDocumentPtr cuesheet(new CCueDocument); + if (cuesheet->ParseFile(pItem->GetPath())) { - VECSONGS newitems; - cuesheet.GetSongs(newitems); - std::vector<std::string> MediaFileVec; - cuesheet.GetMediaFiles(MediaFileVec); + cuesheet->GetMediaFiles(MediaFileVec); // queue the cue sheet and the underlying media file for deletion for(std::vector<std::string>::iterator itMedia = MediaFileVec.begin(); itMedia != MediaFileVec.end(); itMedia++) @@ -2131,7 +2229,6 @@ void CFileItemList::FilterCueItems() std::string fileFromCue = strMediaFile; // save the file from the cue we're matching against, // as we're going to search for others here... bool bFoundMediaFile = CFile::Exists(strMediaFile); - // queue the cue sheet and the underlying media file for deletion if (!bFoundMediaFile) { // try file in same dir, not matching case... @@ -2167,61 +2264,22 @@ void CFileItemList::FilterCueItems() } if (bFoundMediaFile) { - itemstodelete.push_back(pItem->GetPath()); - itemstodelete.push_back(strMediaFile); - // get the additional stuff (year, genre etc.) from the underlying media files tag. - CMusicInfoTag tag; - unique_ptr<IMusicInfoTagLoader> pLoader (CMusicInfoTagLoaderFactory::CreateLoader(strMediaFile)); - if (NULL != pLoader.get()) - { - // get id3tag - pLoader->Load(strMediaFile, tag); - } - // fill in any missing entries from underlying media file - for (int j = 0; j < (int)newitems.size(); j++) + cuesheet->UpdateMediaFile(fileFromCue, strMediaFile); + // apply CUE for later processing + for (int j = 0; j < (int)m_items.size(); j++) { - CSong song = newitems[j]; - // only for songs that actually match the current media file - if (song.strFileName == fileFromCue) - { - // we might have a new media file from the above matching code - song.strFileName = strMediaFile; - if (tag.Loaded()) - { - if (song.strAlbum.empty() && !tag.GetAlbum().empty()) song.strAlbum = tag.GetAlbum(); - if (song.albumArtist.empty() && !tag.GetAlbumArtist().empty()) song.albumArtist = tag.GetAlbumArtist(); - if (song.genre.empty() && !tag.GetGenre().empty()) song.genre = tag.GetGenre(); - if (song.artist.empty() && !tag.GetArtist().empty()) song.artist = tag.GetArtist(); - if (tag.GetDiscNumber()) song.iTrack |= (tag.GetDiscNumber() << 16); // see CMusicInfoTag::GetDiscNumber() - SYSTEMTIME dateTime; - tag.GetReleaseDate(dateTime); - if (dateTime.wYear) song.iYear = dateTime.wYear; - if (song.embeddedArt.empty() && !tag.GetCoverArtInfo().empty()) - song.embeddedArt = tag.GetCoverArtInfo(); - } - if (!song.iDuration && tag.GetDuration() > 0) - { // must be the last song - song.iDuration = (tag.GetDuration() * 75 - song.iStartOffset + 37) / 75; - } - // add this item to the list - itemstoadd.push_back(song); - } + CFileItemPtr pItem = m_items[j]; + if (stricmp(pItem->GetPath().c_str(), strMediaFile.c_str()) == 0) + pItem->SetCueDocument(cuesheet); } } - else - { // remove the .cue sheet from the directory - itemstodelete.push_back(pItem->GetPath()); - } } } - else - { // remove the .cue sheet from the directory (can't parse it - no point listing it) - itemstodelete.push_back(pItem->GetPath()); - } + itemstodelete.push_back(pItem->GetPath()); } } } - // now delete the .CUE files and underlying media files. + // now delete the .CUE files. for (int i = 0; i < (int)itemstodelete.size(); i++) { for (int j = 0; j < (int)m_items.size(); j++) @@ -2234,13 +2292,6 @@ void CFileItemList::FilterCueItems() } } } - // and add the files from the .CUE sheet - for (int i = 0; i < (int)itemstoadd.size(); i++) - { - // now create the file item, and add to the item list. - CFileItemPtr pItem(new CFileItem(itemstoadd[i])); - m_items.push_back(pItem); - } } // Remove the extensions from the filenames diff --git a/xbmc/FileItem.h b/xbmc/FileItem.h index e7066652df..7e8c9b61ea 100644 --- a/xbmc/FileItem.h +++ b/xbmc/FileItem.h @@ -62,6 +62,10 @@ class CGenre; class CURL; +class CFileItemList; +class CCueDocument; +typedef std::shared_ptr<CCueDocument> CCueDocumentPtr; + /* special startoffset used to indicate that we wish to resume */ #define STARTOFFSET_RESUME (-1) @@ -204,6 +208,8 @@ public: bool IsEPG() const; bool IsPVRChannel() const; bool IsPVRRecording() const; + bool IsUsablePVRRecording() const; + bool IsDeletedPVRRecording() const; bool IsPVRTimer() const; bool IsType(const char *ext) const; bool IsVirtualDirectoryRoot() const; @@ -466,6 +472,10 @@ public: int m_iHasLock; // 0 - no lock 1 - lock, but unlocked 2 - locked int m_iBadPwdCount; + void SetCueDocument(const CCueDocumentPtr& cuePtr); + void LoadEmbeddedCue(); + bool HasCueDocument() const; + bool LoadTracksFromCueDocument(CFileItemList& scannedItems); private: /*! \brief initialize all members of this class (not CGUIListItem members) to default values. Called from constructors, and from Reset() @@ -489,6 +499,8 @@ private: PVR::CPVRTimerInfoTag * m_pvrTimerInfoTag; CPictureInfoTag* m_pictureInfoTag; bool m_bIsAlbum; + + CCueDocumentPtr m_cueDocument; }; /*! diff --git a/xbmc/GUIInfoManager.cpp b/xbmc/GUIInfoManager.cpp index 79c0186123..700c13d175 100644 --- a/xbmc/GUIInfoManager.cpp +++ b/xbmc/GUIInfoManager.cpp @@ -657,6 +657,7 @@ const infomap pvr[] = {{ "isrecording", PVR_IS_RECORDING { "backendchannels", PVR_BACKEND_CHANNELS }, { "backendtimers", PVR_BACKEND_TIMERS }, { "backendrecordings", PVR_BACKEND_RECORDINGS }, + { "backenddeletedrecordings", PVR_BACKEND_DELETED_RECORDINGS }, { "backendnumber", PVR_BACKEND_NUMBER }, { "hasepg", PVR_HAS_EPG }, { "hastxt", PVR_HAS_TXT }, @@ -1316,6 +1317,20 @@ int CGUIInfoManager::TranslateSingleString(const std::string &strCondition, bool return AddMultiInfo(GUIInfo(TranslateListItem(info[2]), id, offset, INFOFLAG_LISTITEM_WRAP)); } } + else if (info[0].name == "control") + { + const Property &prop = info[1]; + for (size_t i = 0; i < sizeof(control_labels) / sizeof(infomap); i++) + { + if (prop.name == control_labels[i].str) + { // TODO: The parameter for these should really be on the first not the second property + int controlID = atoi(prop.param().c_str()); + if (controlID) + return AddMultiInfo(GUIInfo(control_labels[i].val, controlID, atoi(info[2].param(0).c_str()))); + return 0; + } + } + } } return 0; @@ -1418,6 +1433,7 @@ std::string CGUIInfoManager::GetLabel(int info, int contextWindow, std::string * case PVR_BACKEND_CHANNELS: case PVR_BACKEND_TIMERS: case PVR_BACKEND_RECORDINGS: + case PVR_BACKEND_DELETED_RECORDINGS: case PVR_BACKEND_NUMBER: case PVR_TOTAL_DISKSPACE: case PVR_NEXT_TIMER: @@ -1664,7 +1680,7 @@ std::string CGUIInfoManager::GetLabel(int info, int contextWindow, std::string * if(g_application.m_pPlayer->IsPlaying()) { SPlayerAudioStreamInfo info; - g_application.m_pPlayer->GetAudioStreamInfo(g_application.m_pPlayer->GetAudioStream(), info); + g_application.m_pPlayer->GetAudioStreamInfo(CURRENT_STREAM, info); strLabel = info.language; } break; @@ -2119,7 +2135,7 @@ bool CGUIInfoManager::GetInt(int &value, int info, int contextWindow, const CGUI value = (int)(g_application.GetCachePercentage()); break; case PLAYER_SEEKBAR: - value = (int)g_application.GetSeekHandler()->GetPercent(); + value = (int)CSeekHandler::Get().GetPercent(); break; case PLAYER_CACHELEVEL: value = (int)(g_application.m_pPlayer->GetCacheLevel()); @@ -3322,7 +3338,13 @@ std::string CGUIInfoManager::GetMultiInfoLabel(const GUIInfo &info, int contextW { const CGUIControl *control = window->GetControl(info.GetData1()); if (control) - return control->GetDescription(); + { + int data2 = info.GetData2(); + if (data2) + return control->GetDescriptionByIndex(data2); + else + return control->GetDescription(); + } } } else if (info.m_info == WINDOW_PROPERTY) @@ -4032,7 +4054,7 @@ std::string CGUIInfoManager::GetCurrentSeekTime(TIME_FORMAT format) const { if (format == TIME_FORMAT_GUESS && GetTotalPlayTime() >= 3600) format = TIME_FORMAT_HH_MM_SS; - float time = GetTotalPlayTime() * g_application.GetSeekHandler()->GetPercent() * 0.01f; + float time = GetTotalPlayTime() * CSeekHandler::Get().GetPercent() * 0.01f; return StringUtils::SecondsToTimeString((int)time, format); } @@ -4346,7 +4368,7 @@ void CGUIInfoManager::UpdateAVInfo() SPlayerAudioStreamInfo audio; g_application.m_pPlayer->GetVideoStreamInfo(video); - g_application.m_pPlayer->GetAudioStreamInfo(g_application.m_pPlayer->GetAudioStream(), audio); + g_application.m_pPlayer->GetAudioStreamInfo(CURRENT_STREAM, audio); m_videoInfo = video; m_audioInfo = audio; diff --git a/xbmc/GUIInfoManager.h b/xbmc/GUIInfoManager.h index 67e41bd67d..20fe8108b8 100644 --- a/xbmc/GUIInfoManager.h +++ b/xbmc/GUIInfoManager.h @@ -466,29 +466,30 @@ namespace INFO #define PVR_BACKEND_CHANNELS (PVR_STRINGS_START + 12) #define PVR_BACKEND_TIMERS (PVR_STRINGS_START + 13) #define PVR_BACKEND_RECORDINGS (PVR_STRINGS_START + 14) -#define PVR_BACKEND_NUMBER (PVR_STRINGS_START + 15) -#define PVR_TOTAL_DISKSPACE (PVR_STRINGS_START + 16) -#define PVR_NEXT_TIMER (PVR_STRINGS_START + 17) -#define PVR_PLAYING_DURATION (PVR_STRINGS_START + 18) -#define PVR_PLAYING_TIME (PVR_STRINGS_START + 19) -#define PVR_PLAYING_PROGRESS (PVR_STRINGS_START + 20) -#define PVR_ACTUAL_STREAM_CLIENT (PVR_STRINGS_START + 21) -#define PVR_ACTUAL_STREAM_DEVICE (PVR_STRINGS_START + 22) -#define PVR_ACTUAL_STREAM_STATUS (PVR_STRINGS_START + 23) -#define PVR_ACTUAL_STREAM_SIG (PVR_STRINGS_START + 24) -#define PVR_ACTUAL_STREAM_SNR (PVR_STRINGS_START + 25) -#define PVR_ACTUAL_STREAM_SIG_PROGR (PVR_STRINGS_START + 26) -#define PVR_ACTUAL_STREAM_SNR_PROGR (PVR_STRINGS_START + 27) -#define PVR_ACTUAL_STREAM_BER (PVR_STRINGS_START + 28) -#define PVR_ACTUAL_STREAM_UNC (PVR_STRINGS_START + 29) -#define PVR_ACTUAL_STREAM_VIDEO_BR (PVR_STRINGS_START + 30) -#define PVR_ACTUAL_STREAM_AUDIO_BR (PVR_STRINGS_START + 31) -#define PVR_ACTUAL_STREAM_DOLBY_BR (PVR_STRINGS_START + 32) -#define PVR_ACTUAL_STREAM_CRYPTION (PVR_STRINGS_START + 33) -#define PVR_ACTUAL_STREAM_SERVICE (PVR_STRINGS_START + 34) -#define PVR_ACTUAL_STREAM_MUX (PVR_STRINGS_START + 35) -#define PVR_ACTUAL_STREAM_PROVIDER (PVR_STRINGS_START + 36) -#define PVR_BACKEND_DISKSPACE_PROGR (PVR_STRINGS_START + 37) +#define PVR_BACKEND_DELETED_RECORDINGS (PVR_STRINGS_START + 15) +#define PVR_BACKEND_NUMBER (PVR_STRINGS_START + 16) +#define PVR_TOTAL_DISKSPACE (PVR_STRINGS_START + 17) +#define PVR_NEXT_TIMER (PVR_STRINGS_START + 18) +#define PVR_PLAYING_DURATION (PVR_STRINGS_START + 19) +#define PVR_PLAYING_TIME (PVR_STRINGS_START + 20) +#define PVR_PLAYING_PROGRESS (PVR_STRINGS_START + 21) +#define PVR_ACTUAL_STREAM_CLIENT (PVR_STRINGS_START + 22) +#define PVR_ACTUAL_STREAM_DEVICE (PVR_STRINGS_START + 23) +#define PVR_ACTUAL_STREAM_STATUS (PVR_STRINGS_START + 24) +#define PVR_ACTUAL_STREAM_SIG (PVR_STRINGS_START + 25) +#define PVR_ACTUAL_STREAM_SNR (PVR_STRINGS_START + 26) +#define PVR_ACTUAL_STREAM_SIG_PROGR (PVR_STRINGS_START + 27) +#define PVR_ACTUAL_STREAM_SNR_PROGR (PVR_STRINGS_START + 28) +#define PVR_ACTUAL_STREAM_BER (PVR_STRINGS_START + 29) +#define PVR_ACTUAL_STREAM_UNC (PVR_STRINGS_START + 30) +#define PVR_ACTUAL_STREAM_VIDEO_BR (PVR_STRINGS_START + 31) +#define PVR_ACTUAL_STREAM_AUDIO_BR (PVR_STRINGS_START + 32) +#define PVR_ACTUAL_STREAM_DOLBY_BR (PVR_STRINGS_START + 33) +#define PVR_ACTUAL_STREAM_CRYPTION (PVR_STRINGS_START + 34) +#define PVR_ACTUAL_STREAM_SERVICE (PVR_STRINGS_START + 35) +#define PVR_ACTUAL_STREAM_MUX (PVR_STRINGS_START + 36) +#define PVR_ACTUAL_STREAM_PROVIDER (PVR_STRINGS_START + 37) +#define PVR_BACKEND_DISKSPACE_PROGR (PVR_STRINGS_START + 38) #define PVR_STRINGS_END PVR_ACTUAL_STREAM_PROVIDER #define WINDOW_PROPERTY 9993 diff --git a/xbmc/LangInfo.cpp b/xbmc/LangInfo.cpp index 208cd2ccd6..9589a5f7f3 100644 --- a/xbmc/LangInfo.cpp +++ b/xbmc/LangInfo.cpp @@ -198,6 +198,7 @@ void CLangInfo::CRegion::SetGlobalLocale() strLocale = "C"; } + g_langInfo.m_locale = current_locale; // TODO: move to CLangInfo class locale::global(current_locale); #endif g_charsetConverter.resetSystemCharset(); @@ -421,6 +422,8 @@ void CLangInfo::SetDefaults() // Set the default region, we may be unable to load langinfo.xml m_currentRegion=&m_defaultRegion; + + m_locale = std::locale::classic(); m_languageCodeGeneral = "eng"; } diff --git a/xbmc/LangInfo.h b/xbmc/LangInfo.h index aa499fde8a..6c9898c41f 100644 --- a/xbmc/LangInfo.h +++ b/xbmc/LangInfo.h @@ -25,6 +25,7 @@ #include <map> #include <string> #include <vector> +#include <locale> #ifdef TARGET_WINDOWS #ifdef GetDateFormat @@ -130,6 +131,9 @@ public: void SetCurrentRegion(const std::string& strName); const std::string& GetCurrentRegion() const; + const std::locale& GetLocale() const + { return m_locale; } + static bool CheckLanguage(const std::string& language); static void LoadTokens(const TiXmlNode* pTokens, std::vector<std::string>& vecTokens); @@ -179,6 +183,7 @@ protected: MAPREGIONS m_regions; CRegion* m_currentRegion; // points to the current region CRegion m_defaultRegion; // default, will be used if no region available via langinfo.xml + std::locale m_locale; // current locale, matching GUI settings std::string m_audioLanguage; std::string m_subtitleLanguage; diff --git a/xbmc/addons/AddonCallbacks.h b/xbmc/addons/AddonCallbacks.h index 9ae3242a15..f0902e4e20 100644 --- a/xbmc/addons/AddonCallbacks.h +++ b/xbmc/addons/AddonCallbacks.h @@ -154,6 +154,33 @@ typedef float (*GUIControl_Progress_GetPercentage)(void *addonData, GUIHAN typedef void (*GUIControl_Progress_SetInfo)(void *addonData, GUIHANDLE handle, int iInfo); typedef int (*GUIControl_Progress_GetInfo)(void *addonData, GUIHANDLE handle); typedef const char* (*GUIControl_Progress_GetDescription)(void *addonData, GUIHANDLE handle); +typedef GUIHANDLE (*GUIWindow_GetControl_Slider)(void *addonData, GUIHANDLE handle, int controlId); +typedef void (*GUIControl_Slider_SetVisible)(void *addonData, GUIHANDLE handle, bool yesNo); +typedef const char *(*GUIControl_Slider_GetDescription)(void *addonData, GUIHANDLE handle); +typedef void (*GUIControl_Slider_SetIntRange)(void *addonData, GUIHANDLE handle, int iStart, int iEnd); +typedef void (*GUIControl_Slider_SetIntValue)(void *addonData, GUIHANDLE handle, int iValue); +typedef int (*GUIControl_Slider_GetIntValue)(void *addonData, GUIHANDLE handle); +typedef void (*GUIControl_Slider_SetIntInterval)(void *addonData, GUIHANDLE handle, int iInterval); +typedef void (*GUIControl_Slider_SetPercentage)(void *addonData, GUIHANDLE handle, float fPercent); +typedef float (*GUIControl_Slider_GetPercentage)(void *addonData, GUIHANDLE handle); +typedef void (*GUIControl_Slider_SetFloatRange)(void *addonData, GUIHANDLE handle, float fStart, float fEnd); +typedef void (*GUIControl_Slider_SetFloatValue)(void *addonData, GUIHANDLE handle, float fValue); +typedef float (*GUIControl_Slider_GetFloatValue)(void *addonData, GUIHANDLE handle); +typedef void (*GUIControl_Slider_SetFloatInterval)(void *addonData, GUIHANDLE handle, float fInterval); +typedef GUIHANDLE (*GUIWindow_GetControl_SettingsSlider)(void *addonData, GUIHANDLE handle, int controlId); +typedef void (*GUIControl_SettingsSlider_SetVisible)(void *addonData, GUIHANDLE handle, bool yesNo); +typedef void (*GUIControl_SettingsSlider_SetText)(void *addonData, GUIHANDLE handle, const char *label); +typedef const char *(*GUIControl_SettingsSlider_GetDescription)(void *addonData, GUIHANDLE handle); +typedef void (*GUIControl_SettingsSlider_SetIntRange)(void *addonData, GUIHANDLE handle, int iStart, int iEnd); +typedef void (*GUIControl_SettingsSlider_SetIntValue)(void *addonData, GUIHANDLE handle, int iValue); +typedef int (*GUIControl_SettingsSlider_GetIntValue)(void *addonData, GUIHANDLE handle); +typedef void (*GUIControl_SettingsSlider_SetIntInterval)(void *addonData, GUIHANDLE handle, int iInterval); +typedef void (*GUIControl_SettingsSlider_SetPercentage)(void *addonData, GUIHANDLE handle, float fPercent); +typedef float (*GUIControl_SettingsSlider_GetPercentage)(void *addonData, GUIHANDLE handle); +typedef void (*GUIControl_SettingsSlider_SetFloatRange)(void *addonData, GUIHANDLE handle, float fStart, float fEnd); +typedef void (*GUIControl_SettingsSlider_SetFloatValue)(void *addonData, GUIHANDLE handle, float fValue); +typedef float (*GUIControl_SettingsSlider_GetFloatValue)(void *addonData, GUIHANDLE handle); +typedef void (*GUIControl_SettingsSlider_SetFloatInterval)(void *addonData, GUIHANDLE handle, float fInterval); typedef GUIHANDLE (*GUIListItem_Create)(void *addonData, const char *label, const char *label2, const char *iconImage, const char *thumbnailImage, const char *path); typedef const char* (*GUIListItem_GetLabel)(void *addonData, GUIHANDLE handle); typedef void (*GUIListItem_SetLabel)(void *addonData, GUIHANDLE handle, const char *label); @@ -169,6 +196,39 @@ typedef void (*GUIRenderAddon_SetCallbacks)(void *addonData, GUIHANDLE ha typedef void (*GUIRenderAddon_Delete)(void *addonData, GUIHANDLE handle); typedef void (*GUIRenderAddon_MarkDirty)(void *addonData, GUIHANDLE handle); +typedef bool (*GUIDialog_Keyboard_ShowAndGetInputWithHead)(char &strTextString, unsigned int iMaxStringSize, const char *heading, bool allowEmptyResult, bool hiddenInput, unsigned int autoCloseMs); +typedef bool (*GUIDialog_Keyboard_ShowAndGetInput)(char &strTextString, unsigned int iMaxStringSize, bool allowEmptyResult, unsigned int autoCloseMs); +typedef bool (*GUIDialog_Keyboard_ShowAndGetNewPasswordWithHead)(char &newPassword, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, unsigned int autoCloseMs); +typedef bool (*GUIDialog_Keyboard_ShowAndGetNewPassword)(char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs); +typedef bool (*GUIDialog_Keyboard_ShowAndVerifyNewPasswordWithHead)(char &strNewPassword, unsigned int iMaxStringSize, const char *strHeading, bool allowEmpty, unsigned int autoCloseMs); +typedef bool (*GUIDialog_Keyboard_ShowAndVerifyNewPassword)(char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs); +typedef int (*GUIDialog_Keyboard_ShowAndVerifyPassword)(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries, unsigned int autoCloseMs); +typedef bool (*GUIDialog_Keyboard_ShowAndGetFilter)(char &aTextString, unsigned int iMaxStringSize, bool searching, unsigned int autoCloseMs); +typedef bool (*GUIDialog_Keyboard_SendTextToActiveKeyboard)(const char *aTextString, bool closeKeyboard); +typedef bool (*GUIDialog_Keyboard_isKeyboardActivated)(); + +typedef bool (*GUIDialog_Numeric_ShowAndVerifyNewPassword)(char &strNewPassword, unsigned int iMaxStringSize); +typedef int (*GUIDialog_Numeric_ShowAndVerifyPassword)(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries); +typedef bool (*GUIDialog_Numeric_ShowAndVerifyInput)(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, bool bGetUserInput); +typedef bool (*GUIDialog_Numeric_ShowAndGetTime)(tm &time, const char *strHeading); +typedef bool (*GUIDialog_Numeric_ShowAndGetDate)(tm &date, const char *strHeading); +typedef bool (*GUIDialog_Numeric_ShowAndGetIPAddress)(char &strIPAddress, unsigned int iMaxStringSize, const char *strHeading); +typedef bool (*GUIDialog_Numeric_ShowAndGetNumber)(char &strInput, unsigned int iMaxStringSize, const char *strHeading, unsigned int iAutoCloseTimeoutMs); +typedef bool (*GUIDialog_Numeric_ShowAndGetSeconds)(char &timeString, unsigned int iMaxStringSize, const char *strHeading); + +typedef bool (*GUIDialog_FileBrowser_ShowAndGetFile)(const char *directory, const char *mask, const char *heading, char &path, unsigned int iMaxStringSize, bool useThumbs, bool useFileDirectories, bool singleList); + +typedef void (*GUIDialog_OK_ShowAndGetInputSingleText)(const char *heading, const char *text); +typedef void (*GUIDialog_OK_ShowAndGetInputLineText)(const char *heading, const char *line0, const char *line1, const char *line2); + +typedef bool (*GUIDialog_YesNo_ShowAndGetInputSingleText)(const char *heading, const char *text, bool& bCanceled, const char *noLabel, const char *yesLabel); +typedef bool (*GUIDialog_YesNo_ShowAndGetInputLineText)(const char *heading, const char *line0, const char *line1, const char *line2, const char *noLabel, const char *yesLabel); +typedef bool (*GUIDialog_YesNo_ShowAndGetInputLineButtonText)(const char *heading, const char *line0, const char *line1, const char *line2, bool &bCanceled, const char *noLabel, const char *yesLabel); + +typedef void (*GUIDialog_TextViewer)(const char *heading, const char *text); + +typedef int (*GUIDialog_Select)(const char *heading, const char *entries[], unsigned int size, int selected); + typedef struct CB_GUILib { GUILock Lock; @@ -239,6 +299,66 @@ typedef struct CB_GUILib GUIRenderAddon_SetCallbacks RenderAddon_SetCallbacks; GUIRenderAddon_Delete RenderAddon_Delete; + GUIWindow_GetControl_Slider Window_GetControl_Slider; + GUIControl_Slider_SetVisible Control_Slider_SetVisible; + GUIControl_Slider_GetDescription Control_Slider_GetDescription; + GUIControl_Slider_SetIntRange Control_Slider_SetIntRange; + GUIControl_Slider_SetIntValue Control_Slider_SetIntValue; + GUIControl_Slider_GetIntValue Control_Slider_GetIntValue; + GUIControl_Slider_SetIntInterval Control_Slider_SetIntInterval; + GUIControl_Slider_SetPercentage Control_Slider_SetPercentage; + GUIControl_Slider_GetPercentage Control_Slider_GetPercentage; + GUIControl_Slider_SetFloatRange Control_Slider_SetFloatRange; + GUIControl_Slider_SetFloatValue Control_Slider_SetFloatValue; + GUIControl_Slider_GetFloatValue Control_Slider_GetFloatValue; + GUIControl_Slider_SetFloatInterval Control_Slider_SetFloatInterval; + + GUIWindow_GetControl_SettingsSlider Window_GetControl_SettingsSlider; + GUIControl_SettingsSlider_SetVisible Control_SettingsSlider_SetVisible; + GUIControl_SettingsSlider_SetText Control_SettingsSlider_SetText; + GUIControl_SettingsSlider_GetDescription Control_SettingsSlider_GetDescription; + GUIControl_SettingsSlider_SetIntRange Control_SettingsSlider_SetIntRange; + GUIControl_SettingsSlider_SetIntValue Control_SettingsSlider_SetIntValue; + GUIControl_SettingsSlider_GetIntValue Control_SettingsSlider_GetIntValue; + GUIControl_SettingsSlider_SetIntInterval Control_SettingsSlider_SetIntInterval; + GUIControl_SettingsSlider_SetPercentage Control_SettingsSlider_SetPercentage; + GUIControl_SettingsSlider_GetPercentage Control_SettingsSlider_GetPercentage; + GUIControl_SettingsSlider_SetFloatRange Control_SettingsSlider_SetFloatRange; + GUIControl_SettingsSlider_SetFloatValue Control_SettingsSlider_SetFloatValue; + GUIControl_SettingsSlider_GetFloatValue Control_SettingsSlider_GetFloatValue; + GUIControl_SettingsSlider_SetFloatInterval Control_SettingsSlider_SetFloatInterval; + + GUIDialog_Keyboard_ShowAndGetInputWithHead Dialog_Keyboard_ShowAndGetInputWithHead; + GUIDialog_Keyboard_ShowAndGetInput Dialog_Keyboard_ShowAndGetInput; + GUIDialog_Keyboard_ShowAndGetNewPasswordWithHead Dialog_Keyboard_ShowAndGetNewPasswordWithHead; + GUIDialog_Keyboard_ShowAndGetNewPassword Dialog_Keyboard_ShowAndGetNewPassword; + GUIDialog_Keyboard_ShowAndVerifyNewPasswordWithHead Dialog_Keyboard_ShowAndVerifyNewPasswordWithHead; + GUIDialog_Keyboard_ShowAndVerifyNewPassword Dialog_Keyboard_ShowAndVerifyNewPassword; + GUIDialog_Keyboard_ShowAndVerifyPassword Dialog_Keyboard_ShowAndVerifyPassword; + GUIDialog_Keyboard_ShowAndGetFilter Dialog_Keyboard_ShowAndGetFilter; + GUIDialog_Keyboard_SendTextToActiveKeyboard Dialog_Keyboard_SendTextToActiveKeyboard; + GUIDialog_Keyboard_isKeyboardActivated Dialog_Keyboard_isKeyboardActivated; + + GUIDialog_Numeric_ShowAndVerifyNewPassword Dialog_Numeric_ShowAndVerifyNewPassword; + GUIDialog_Numeric_ShowAndVerifyPassword Dialog_Numeric_ShowAndVerifyPassword; + GUIDialog_Numeric_ShowAndVerifyInput Dialog_Numeric_ShowAndVerifyInput; + GUIDialog_Numeric_ShowAndGetTime Dialog_Numeric_ShowAndGetTime; + GUIDialog_Numeric_ShowAndGetDate Dialog_Numeric_ShowAndGetDate; + GUIDialog_Numeric_ShowAndGetIPAddress Dialog_Numeric_ShowAndGetIPAddress; + GUIDialog_Numeric_ShowAndGetNumber Dialog_Numeric_ShowAndGetNumber; + GUIDialog_Numeric_ShowAndGetSeconds Dialog_Numeric_ShowAndGetSeconds; + + GUIDialog_FileBrowser_ShowAndGetFile Dialog_FileBrowser_ShowAndGetFile; + + GUIDialog_OK_ShowAndGetInputSingleText Dialog_OK_ShowAndGetInputSingleText; + GUIDialog_OK_ShowAndGetInputLineText Dialog_OK_ShowAndGetInputLineText; + + GUIDialog_YesNo_ShowAndGetInputSingleText Dialog_YesNo_ShowAndGetInputSingleText; + GUIDialog_YesNo_ShowAndGetInputLineText Dialog_YesNo_ShowAndGetInputLineText; + GUIDialog_YesNo_ShowAndGetInputLineButtonText Dialog_YesNo_ShowAndGetInputLineButtonText; + + GUIDialog_TextViewer Dialog_TextViewer; + GUIDialog_Select Dialog_Select; } CB_GUILib; typedef void (*PVRTransferEpgEntry)(void *userData, const ADDON_HANDLE handle, const EPG_TAG *epgentry); diff --git a/xbmc/addons/AddonCallbacksAddon.cpp b/xbmc/addons/AddonCallbacksAddon.cpp index 5824ce4201..e54aebe932 100644 --- a/xbmc/addons/AddonCallbacksAddon.cpp +++ b/xbmc/addons/AddonCallbacksAddon.cpp @@ -297,7 +297,7 @@ char* CAddonCallbacksAddon::GetDVDMenuLanguage(const void* addonData) void CAddonCallbacksAddon::FreeString(const void* addonData, char* str) { - delete[] str; + free(str); } void* CAddonCallbacksAddon::OpenFile(const void* addonData, const char* strFileName, unsigned int flags) diff --git a/xbmc/addons/AddonCallbacksCodec.cpp b/xbmc/addons/AddonCallbacksCodec.cpp index 8ae1e4effc..9c7be30d47 100644 --- a/xbmc/addons/AddonCallbacksCodec.cpp +++ b/xbmc/addons/AddonCallbacksCodec.cpp @@ -81,6 +81,11 @@ private: tmp.codec_type = XBMC_CODEC_TYPE_SUBTITLE; tmp.codec_id = AV_CODEC_ID_DVB_TELETEXT; m_lookup.insert(std::make_pair("TELETEXT", tmp)); + + // rds is not returned by av_codec_next. we got our own decoder + tmp.codec_type = XBMC_CODEC_TYPE_RDS; + tmp.codec_id = AV_CODEC_ID_NONE; + m_lookup.insert(std::make_pair("RDS", tmp)); } std::map<std::string, xbmc_codec_t> m_lookup; diff --git a/xbmc/addons/AddonCallbacksGUI.cpp b/xbmc/addons/AddonCallbacksGUI.cpp index c0ac3b234f..9028e1ac25 100644 --- a/xbmc/addons/AddonCallbacksGUI.cpp +++ b/xbmc/addons/AddonCallbacksGUI.cpp @@ -38,6 +38,13 @@ #include "guilib/GUIEditControl.h" #include "guilib/GUIProgressControl.h" #include "guilib/GUIRenderingControl.h" +#include "guilib/GUIKeyboardFactory.h" +#include "dialogs/GUIDialogNumeric.h" +#include "dialogs/GUIDialogOK.h" +#include "dialogs/GUIDialogYesNo.h" +#include "dialogs/GUIDialogFileBrowser.h" +#include "dialogs/GUIDialogTextViewer.h" +#include "dialogs/GUIDialogSelect.h" #define CONTROL_BTNVIEWASICONS 2 #define CONTROL_BTNSORTBY 3 @@ -96,6 +103,8 @@ CAddonCallbacksGUI::CAddonCallbacksGUI(CAddon* addon) m_callbacks->Window_GetControl_Edit = CAddonCallbacksGUI::Window_GetControl_Edit; m_callbacks->Window_GetControl_Progress = CAddonCallbacksGUI::Window_GetControl_Progress; m_callbacks->Window_GetControl_RenderAddon = CAddonCallbacksGUI::Window_GetControl_RenderAddon; + m_callbacks->Window_GetControl_Slider = CAddonCallbacksGUI::Window_GetControl_Slider; + m_callbacks->Window_GetControl_SettingsSlider= CAddonCallbacksGUI::Window_GetControl_SettingsSlider; m_callbacks->Window_SetControlLabel = CAddonCallbacksGUI::Window_SetControlLabel; m_callbacks->Window_MarkDirtyRegion = CAddonCallbacksGUI::Window_MarkDirtyRegion; @@ -132,6 +141,66 @@ CAddonCallbacksGUI::CAddonCallbacksGUI(CAddon* addon) m_callbacks->RenderAddon_SetCallbacks = CAddonCallbacksGUI::RenderAddon_SetCallbacks; m_callbacks->RenderAddon_Delete = CAddonCallbacksGUI::RenderAddon_Delete; + + m_callbacks->Control_Slider_SetVisible = CAddonCallbacksGUI::Control_Slider_SetVisible; + m_callbacks->Control_Slider_GetDescription = CAddonCallbacksGUI::Control_Slider_GetDescription; + m_callbacks->Control_Slider_SetIntRange = CAddonCallbacksGUI::Control_Slider_SetIntRange; + m_callbacks->Control_Slider_SetIntValue = CAddonCallbacksGUI::Control_Slider_SetIntValue; + m_callbacks->Control_Slider_GetIntValue = CAddonCallbacksGUI::Control_Slider_GetIntValue; + m_callbacks->Control_Slider_SetIntInterval = CAddonCallbacksGUI::Control_Slider_SetIntInterval; + m_callbacks->Control_Slider_SetPercentage = CAddonCallbacksGUI::Control_Slider_SetPercentage; + m_callbacks->Control_Slider_GetPercentage = CAddonCallbacksGUI::Control_Slider_GetPercentage; + m_callbacks->Control_Slider_SetFloatRange = CAddonCallbacksGUI::Control_Slider_SetFloatRange; + m_callbacks->Control_Slider_SetFloatValue = CAddonCallbacksGUI::Control_Slider_SetFloatValue; + m_callbacks->Control_Slider_GetFloatValue = CAddonCallbacksGUI::Control_Slider_GetFloatValue; + m_callbacks->Control_Slider_SetFloatInterval = CAddonCallbacksGUI::Control_Slider_SetFloatInterval; + + m_callbacks->Control_SettingsSlider_SetVisible = CAddonCallbacksGUI::Control_SettingsSlider_SetVisible; + m_callbacks->Control_SettingsSlider_SetText = CAddonCallbacksGUI::Control_SettingsSlider_SetText; + m_callbacks->Control_SettingsSlider_GetDescription = CAddonCallbacksGUI::Control_SettingsSlider_GetDescription; + m_callbacks->Control_SettingsSlider_SetIntRange = CAddonCallbacksGUI::Control_SettingsSlider_SetIntRange; + m_callbacks->Control_SettingsSlider_SetIntValue = CAddonCallbacksGUI::Control_SettingsSlider_SetIntValue; + m_callbacks->Control_SettingsSlider_GetIntValue = CAddonCallbacksGUI::Control_SettingsSlider_GetIntValue; + m_callbacks->Control_SettingsSlider_SetIntInterval = CAddonCallbacksGUI::Control_SettingsSlider_SetIntInterval; + m_callbacks->Control_SettingsSlider_SetPercentage = CAddonCallbacksGUI::Control_SettingsSlider_SetPercentage; + m_callbacks->Control_SettingsSlider_GetPercentage = CAddonCallbacksGUI::Control_SettingsSlider_GetPercentage; + m_callbacks->Control_SettingsSlider_SetFloatRange = CAddonCallbacksGUI::Control_SettingsSlider_SetFloatRange; + m_callbacks->Control_SettingsSlider_SetFloatValue = CAddonCallbacksGUI::Control_SettingsSlider_SetFloatValue; + m_callbacks->Control_SettingsSlider_GetFloatValue = CAddonCallbacksGUI::Control_SettingsSlider_GetFloatValue; + m_callbacks->Control_SettingsSlider_SetFloatInterval = CAddonCallbacksGUI::Control_SettingsSlider_SetFloatInterval; + + m_callbacks->Dialog_Keyboard_ShowAndGetInputWithHead = CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetInputWithHead; + m_callbacks->Dialog_Keyboard_ShowAndGetInput = CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetInput; + m_callbacks->Dialog_Keyboard_ShowAndGetNewPasswordWithHead = CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetNewPasswordWithHead; + m_callbacks->Dialog_Keyboard_ShowAndGetNewPassword = CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetNewPassword; + m_callbacks->Dialog_Keyboard_ShowAndVerifyNewPasswordWithHead = CAddonCallbacksGUI::Dialog_Keyboard_ShowAndVerifyNewPasswordWithHead; + m_callbacks->Dialog_Keyboard_ShowAndVerifyNewPassword = CAddonCallbacksGUI::Dialog_Keyboard_ShowAndVerifyNewPassword; + m_callbacks->Dialog_Keyboard_ShowAndVerifyPassword = CAddonCallbacksGUI::Dialog_Keyboard_ShowAndVerifyPassword; + m_callbacks->Dialog_Keyboard_ShowAndGetFilter = CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetFilter; + m_callbacks->Dialog_Keyboard_SendTextToActiveKeyboard = CAddonCallbacksGUI::Dialog_Keyboard_SendTextToActiveKeyboard; + m_callbacks->Dialog_Keyboard_isKeyboardActivated = CAddonCallbacksGUI::Dialog_Keyboard_isKeyboardActivated; + + m_callbacks->Dialog_Numeric_ShowAndVerifyNewPassword = CAddonCallbacksGUI::Dialog_Numeric_ShowAndVerifyNewPassword; + m_callbacks->Dialog_Numeric_ShowAndVerifyPassword = CAddonCallbacksGUI::Dialog_Numeric_ShowAndVerifyPassword; + m_callbacks->Dialog_Numeric_ShowAndVerifyInput = CAddonCallbacksGUI::Dialog_Numeric_ShowAndVerifyInput; + m_callbacks->Dialog_Numeric_ShowAndGetTime = CAddonCallbacksGUI::Dialog_Numeric_ShowAndGetTime; + m_callbacks->Dialog_Numeric_ShowAndGetDate = CAddonCallbacksGUI::Dialog_Numeric_ShowAndGetDate; + m_callbacks->Dialog_Numeric_ShowAndGetIPAddress = CAddonCallbacksGUI::Dialog_Numeric_ShowAndGetIPAddress; + m_callbacks->Dialog_Numeric_ShowAndGetNumber = CAddonCallbacksGUI::Dialog_Numeric_ShowAndGetNumber; + m_callbacks->Dialog_Numeric_ShowAndGetSeconds = CAddonCallbacksGUI::Dialog_Numeric_ShowAndGetSeconds; + + m_callbacks->Dialog_FileBrowser_ShowAndGetFile = CAddonCallbacksGUI::Dialog_FileBrowser_ShowAndGetFile; + + m_callbacks->Dialog_OK_ShowAndGetInputSingleText = CAddonCallbacksGUI::Dialog_OK_ShowAndGetInputSingleText; + m_callbacks->Dialog_OK_ShowAndGetInputLineText = CAddonCallbacksGUI::Dialog_OK_ShowAndGetInputLineText; + + m_callbacks->Dialog_YesNo_ShowAndGetInputSingleText = CAddonCallbacksGUI::Dialog_YesNo_ShowAndGetInputSingleText; + m_callbacks->Dialog_YesNo_ShowAndGetInputLineText = CAddonCallbacksGUI::Dialog_YesNo_ShowAndGetInputLineText; + m_callbacks->Dialog_YesNo_ShowAndGetInputLineButtonText = CAddonCallbacksGUI::Dialog_YesNo_ShowAndGetInputLineButtonText; + + m_callbacks->Dialog_TextViewer = CAddonCallbacksGUI::Dialog_TextViewer; + + m_callbacks->Dialog_Select = CAddonCallbacksGUI::Dialog_Select; } CAddonCallbacksGUI::~CAddonCallbacksGUI() @@ -1138,6 +1207,307 @@ const char* CAddonCallbacksGUI::Control_Progress_GetDescription(void *addonData, return buffer; } +/* + * GUI slider control callback functions + */ +GUIHANDLE CAddonCallbacksGUI::Window_GetControl_Slider(void *addonData, GUIHANDLE handle, int controlId) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return NULL; + + CGUIAddonWindow *pAddonWindow = (CGUIAddonWindow*)handle; + CGUIControl* pGUIControl = (CGUIControl*)pAddonWindow->GetControl(controlId); + if (pGUIControl && pGUIControl->GetControlType() != CGUIControl::GUICONTROL_SLIDER) + return NULL; + + return pGUIControl; +} + +void CAddonCallbacksGUI::Control_Slider_SetVisible(void *addonData, GUIHANDLE handle, bool yesNo) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUIControl *pControl = (CGUIControl*)handle; + pControl->SetVisible(yesNo); +} + +const char* CAddonCallbacksGUI::Control_Slider_GetDescription(void *addonData, GUIHANDLE handle) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return NULL; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + std::string string = pControl->GetDescription(); + + char *buffer = (char*) malloc (string.length()+1); + strcpy(buffer, string.c_str()); + return buffer; +} + +void CAddonCallbacksGUI::Control_Slider_SetIntRange(void *addonData, GUIHANDLE handle, int iStart, int iEnd) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + pControl->SetRange(iStart, iEnd); +} + +void CAddonCallbacksGUI::Control_Slider_SetIntValue(void *addonData, GUIHANDLE handle, int iValue) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + pControl->SetType(SPIN_CONTROL_TYPE_INT); + pControl->SetIntValue(iValue); +} + +int CAddonCallbacksGUI::Control_Slider_GetIntValue(void *addonData, GUIHANDLE handle) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return 0; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + return pControl->GetIntValue(); +} + +void CAddonCallbacksGUI::Control_Slider_SetIntInterval(void *addonData, GUIHANDLE handle, int iInterval) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + pControl->SetIntInterval(iInterval); +} + +void CAddonCallbacksGUI::Control_Slider_SetPercentage(void *addonData, GUIHANDLE handle, float fPercent) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + pControl->SetType(SPIN_CONTROL_TYPE_FLOAT); + pControl->SetPercentage(fPercent); +} + +float CAddonCallbacksGUI::Control_Slider_GetPercentage(void *addonData, GUIHANDLE handle) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return 0.0f; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + return pControl->GetPercentage(); +} + +void CAddonCallbacksGUI::Control_Slider_SetFloatRange(void *addonData, GUIHANDLE handle, float fStart, float fEnd) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + pControl->SetFloatRange(fStart, fEnd); +} + +void CAddonCallbacksGUI::Control_Slider_SetFloatValue(void *addonData, GUIHANDLE handle, float iValue) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + pControl->SetType(SPIN_CONTROL_TYPE_FLOAT); + pControl->SetFloatValue(iValue); +} + +float CAddonCallbacksGUI::Control_Slider_GetFloatValue(void *addonData, GUIHANDLE handle) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return 0.0f; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + return pControl->GetFloatValue(); +} + +void CAddonCallbacksGUI::Control_Slider_SetFloatInterval(void *addonData, GUIHANDLE handle, float fInterval) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISliderControl *pControl = (CGUISliderControl*)handle; + pControl->SetFloatInterval(fInterval); +} + +/* + * GUI settings slider control callback functions + */ +GUIHANDLE CAddonCallbacksGUI::Window_GetControl_SettingsSlider(void *addonData, GUIHANDLE handle, int controlId) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return NULL; + + CGUIAddonWindow *pAddonWindow = (CGUIAddonWindow*)handle; + CGUIControl* pGUIControl = (CGUIControl*)pAddonWindow->GetControl(controlId); + if (pGUIControl && pGUIControl->GetControlType() != CGUIControl::GUICONTROL_SETTINGS_SLIDER) + return NULL; + + return pGUIControl; +} + +void CAddonCallbacksGUI::Control_SettingsSlider_SetVisible(void *addonData, GUIHANDLE handle, bool yesNo) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUIControl *pControl = (CGUIControl*)handle; + pControl->SetVisible(yesNo); +} + +void CAddonCallbacksGUI::Control_SettingsSlider_SetText(void *addonData, GUIHANDLE handle, const char *label) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + pControl->SetText(label); +} + +const char* CAddonCallbacksGUI::Control_SettingsSlider_GetDescription(void *addonData, GUIHANDLE handle) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return NULL; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + std::string string = pControl->GetDescription(); + + char *buffer = (char*) malloc (string.length()+1); + strcpy(buffer, string.c_str()); + return buffer; +} + +void CAddonCallbacksGUI::Control_SettingsSlider_SetIntRange(void *addonData, GUIHANDLE handle, int iStart, int iEnd) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + pControl->SetRange(iStart, iEnd); +} + +void CAddonCallbacksGUI::Control_SettingsSlider_SetIntValue(void *addonData, GUIHANDLE handle, int iValue) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + pControl->SetType(SPIN_CONTROL_TYPE_INT); + pControl->SetIntValue(iValue); +} + +int CAddonCallbacksGUI::Control_SettingsSlider_GetIntValue(void *addonData, GUIHANDLE handle) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return 0; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + return pControl->GetIntValue(); +} + +void CAddonCallbacksGUI::Control_SettingsSlider_SetIntInterval(void *addonData, GUIHANDLE handle, int iInterval) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + pControl->SetIntInterval(iInterval); +} + +void CAddonCallbacksGUI::Control_SettingsSlider_SetPercentage(void *addonData, GUIHANDLE handle, float fPercent) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + pControl->SetType(SPIN_CONTROL_TYPE_FLOAT); + pControl->SetPercentage(fPercent); +} + +float CAddonCallbacksGUI::Control_SettingsSlider_GetPercentage(void *addonData, GUIHANDLE handle) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return 0.0f; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + return pControl->GetPercentage(); +} + +void CAddonCallbacksGUI::Control_SettingsSlider_SetFloatRange(void *addonData, GUIHANDLE handle, float fStart, float fEnd) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + pControl->SetFloatRange(fStart, fEnd); +} + +void CAddonCallbacksGUI::Control_SettingsSlider_SetFloatValue(void *addonData, GUIHANDLE handle, float fValue) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + pControl->SetType(SPIN_CONTROL_TYPE_FLOAT); + pControl->SetFloatValue(fValue); +} + +float CAddonCallbacksGUI::Control_SettingsSlider_GetFloatValue(void *addonData, GUIHANDLE handle) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return 0.0f; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + return pControl->GetFloatValue(); +} + +void CAddonCallbacksGUI::Control_SettingsSlider_SetFloatInterval(void *addonData, GUIHANDLE handle, float fInterval) +{ + CAddonCallbacks* helper = (CAddonCallbacks*) addonData; + if (!helper || !handle) + return; + + CGUISettingsSliderControl *pControl = (CGUISettingsSliderControl*)handle; + pControl->SetFloatInterval(fInterval); +} + +/* + * GUI list item control callback functions + */ GUIHANDLE CAddonCallbacksGUI::ListItem_Create(void *addonData, const char *label, const char *label2, const char *iconImage, const char *thumbnailImage, const char *path) { CAddonCallbacks* helper = (CAddonCallbacks*) addonData; @@ -1294,7 +1664,248 @@ void CAddonCallbacksGUI::RenderAddon_Delete(void *addonData, GUIHANDLE handle) Unlock(); } +/*! @name GUI Keyboard functions */ +//@{ +bool CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetInputWithHead(char &aTextString, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, bool hiddenInput, unsigned int autoCloseMs) +{ + std::string str = &aTextString; + bool bRet = CGUIKeyboardFactory::ShowAndGetInput(str, strHeading, allowEmptyResult, hiddenInput, autoCloseMs); + if (bRet) + strncpy(&aTextString, str.c_str(), iMaxStringSize); + return bRet; +} + +bool CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetInput(char &aTextString, unsigned int iMaxStringSize, bool allowEmptyResult, unsigned int autoCloseMs) +{ + std::string str = &aTextString; + bool bRet = CGUIKeyboardFactory::ShowAndGetInput(str, allowEmptyResult, autoCloseMs); + if (bRet) + strncpy(&aTextString, str.c_str(), iMaxStringSize); + return bRet; +} + +bool CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetNewPasswordWithHead(char &strNewPassword, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, unsigned int autoCloseMs) +{ + std::string str = &strNewPassword; + bool bRet = CGUIKeyboardFactory::ShowAndGetNewPassword(str, strHeading, allowEmptyResult, autoCloseMs); + if (bRet) + strncpy(&strNewPassword, str.c_str(), iMaxStringSize); + return bRet; +} + +bool CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetNewPassword(char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs) +{ + std::string str = &strNewPassword; + bool bRet = CGUIKeyboardFactory::ShowAndGetNewPassword(str, autoCloseMs); + if (bRet) + strncpy(&strNewPassword, str.c_str(), iMaxStringSize); + return bRet; +} + +bool CAddonCallbacksGUI::Dialog_Keyboard_ShowAndVerifyNewPasswordWithHead(char &strNewPassword, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, unsigned int autoCloseMs) +{ + std::string str = &strNewPassword; + bool bRet = CGUIKeyboardFactory::ShowAndVerifyNewPassword(str, strHeading, allowEmptyResult, autoCloseMs); + if (bRet) + strncpy(&strNewPassword, str.c_str(), iMaxStringSize); + return bRet; +} + +bool CAddonCallbacksGUI::Dialog_Keyboard_ShowAndVerifyNewPassword(char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs) +{ + std::string str = &strNewPassword; + bool bRet = CGUIKeyboardFactory::ShowAndVerifyNewPassword(str, autoCloseMs); + if (bRet) + strncpy(&strNewPassword, str.c_str(), iMaxStringSize); + return bRet; +} + +int CAddonCallbacksGUI::Dialog_Keyboard_ShowAndVerifyPassword(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries, unsigned int autoCloseMs) +{ + std::string str = &strPassword; + int bRet = CGUIKeyboardFactory::ShowAndVerifyNewPassword(str, strHeading, iRetries, autoCloseMs); + if (bRet) + strncpy(&strPassword, str.c_str(), iMaxStringSize); + return bRet; +} + +bool CAddonCallbacksGUI::Dialog_Keyboard_ShowAndGetFilter(char &aTextString, unsigned int iMaxStringSize, bool searching, unsigned int autoCloseMs) +{ + std::string strText = &aTextString; + bool bRet = CGUIKeyboardFactory::ShowAndGetFilter(strText, searching, autoCloseMs); + if (bRet) + strncpy(&aTextString, strText.c_str(), iMaxStringSize); + return bRet; +} + +bool CAddonCallbacksGUI::Dialog_Keyboard_SendTextToActiveKeyboard(const char *aTextString, bool closeKeyboard) +{ + return CGUIKeyboardFactory::SendTextToActiveKeyboard(aTextString, closeKeyboard); +} + +bool CAddonCallbacksGUI::Dialog_Keyboard_isKeyboardActivated() +{ + return CGUIKeyboardFactory::isKeyboardActivated(); +} +//@} + +/*! @name GUI Numeric functions */ +//@{ +bool CAddonCallbacksGUI::Dialog_Numeric_ShowAndVerifyNewPassword(char &strNewPassword, unsigned int iMaxStringSize) +{ + std::string str = &strNewPassword; + bool bRet = CGUIDialogNumeric::ShowAndVerifyNewPassword(str); + if (bRet) + strncpy(&strNewPassword, str.c_str(), iMaxStringSize); + return bRet; +} + +int CAddonCallbacksGUI::Dialog_Numeric_ShowAndVerifyPassword(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries) +{ + std::string str = &strPassword; + int bRet = CGUIDialogNumeric::ShowAndVerifyPassword(str, strHeading, iRetries); + if (bRet) + strncpy(&strPassword, str.c_str(), iMaxStringSize); + return bRet; +} + +bool CAddonCallbacksGUI::Dialog_Numeric_ShowAndVerifyInput(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, bool bGetUserInput) +{ + std::string str = &strPassword; + bool bRet = CGUIDialogNumeric::ShowAndVerifyInput(str, strHeading, bGetUserInput); + if (bRet) + strncpy(&strPassword, str.c_str(), iMaxStringSize); + return bRet; +} +bool CAddonCallbacksGUI::Dialog_Numeric_ShowAndGetTime(tm &time, const char *strHeading) +{ + SYSTEMTIME systemTime; + CDateTime dateTime(time); + dateTime.GetAsSystemTime(systemTime); + if (CGUIDialogNumeric::ShowAndGetTime(systemTime, strHeading)) + { + dateTime = systemTime; + dateTime.GetAsTm(time); + return true; + } + return false; +} + +bool CAddonCallbacksGUI::Dialog_Numeric_ShowAndGetDate(tm &date, const char *strHeading) +{ + SYSTEMTIME systemTime; + CDateTime dateTime(date); + dateTime.GetAsSystemTime(systemTime); + if (CGUIDialogNumeric::ShowAndGetDate(systemTime, strHeading)) + { + dateTime = systemTime; + dateTime.GetAsTm(date); + return true; + } + return false; +} + +bool CAddonCallbacksGUI::Dialog_Numeric_ShowAndGetIPAddress(char &strIPAddress, unsigned int iMaxStringSize, const char *strHeading) +{ + std::string strIP = &strIPAddress; + bool bRet = CGUIDialogNumeric::ShowAndGetIPAddress(strIP, strHeading); + if (bRet) + strncpy(&strIPAddress, strIP.c_str(), iMaxStringSize); + return bRet; +} + +bool CAddonCallbacksGUI::Dialog_Numeric_ShowAndGetNumber(char &strInput, unsigned int iMaxStringSize, const char *strHeading, unsigned int iAutoCloseTimeoutMs) +{ + std::string str = &strInput; + bool bRet = CGUIDialogNumeric::ShowAndGetNumber(str, strHeading, iAutoCloseTimeoutMs); + if (bRet) + strncpy(&strInput, str.c_str(), iMaxStringSize); + return bRet; +} + +bool CAddonCallbacksGUI::Dialog_Numeric_ShowAndGetSeconds(char &timeString, unsigned int iMaxStringSize, const char *strHeading) +{ + std::string str = &timeString; + bool bRet = CGUIDialogNumeric::ShowAndGetSeconds(str, strHeading); + if (bRet) + strncpy(&timeString, str.c_str(), iMaxStringSize); + return bRet; +} +//@} + +/*! @name GUI File browser functions */ +//@{ +bool CAddonCallbacksGUI::Dialog_FileBrowser_ShowAndGetFile(const char *directory, const char *mask, const char *heading, char &path, unsigned int iMaxStringSize, bool useThumbs, bool useFileDirectories, bool singleList) +{ + std::string strPath = &path; + bool bRet = CGUIDialogFileBrowser::ShowAndGetFile(directory, mask, heading, strPath, useThumbs, useFileDirectories, singleList); + if (bRet) + strncpy(&path, strPath.c_str(), iMaxStringSize); + return bRet; +} +//@} + +/*! @name GUI OK Dialog */ +//@{ +void CAddonCallbacksGUI::Dialog_OK_ShowAndGetInputSingleText(const char *heading, const char *text) +{ + CGUIDialogOK::ShowAndGetInput(heading, text); +} + +void CAddonCallbacksGUI::Dialog_OK_ShowAndGetInputLineText(const char *heading, const char *line0, const char *line1, const char *line2) +{ + CGUIDialogOK::ShowAndGetInput(heading, line0, line1, line2); +} +//@} + +/*! @name GUI Yes No Dialog */ +//@{ +bool CAddonCallbacksGUI::Dialog_YesNo_ShowAndGetInputSingleText(const char *heading, const char *text, bool& bCanceled, const char *noLabel, const char *yesLabel) +{ + return CGUIDialogYesNo::ShowAndGetInput(heading, text, bCanceled, noLabel, yesLabel); +} + +bool CAddonCallbacksGUI::Dialog_YesNo_ShowAndGetInputLineText(const char *heading, const char *line0, const char *line1, const char *line2, const char *noLabel, const char *yesLabel) +{ + return CGUIDialogYesNo::ShowAndGetInput(heading, line0, line1, line2, noLabel, yesLabel); +} + +bool CAddonCallbacksGUI::Dialog_YesNo_ShowAndGetInputLineButtonText(const char *heading, const char *line0, const char *line1, const char *line2, bool &bCanceled, const char *noLabel, const char *yesLabel) +{ + return CGUIDialogYesNo::ShowAndGetInput(heading, line0, line1, line2, bCanceled, noLabel, yesLabel); +} +//@} + +/*! @name GUI Text viewer Dialog */ +//@{ +void CAddonCallbacksGUI::Dialog_TextViewer(const char *heading, const char *text) +{ + CGUIDialogTextViewer* pDialog = (CGUIDialogTextViewer*)g_windowManager.GetWindow(WINDOW_DIALOG_TEXT_VIEWER); + pDialog->SetHeading(heading); + pDialog->SetText(text); + pDialog->DoModal(); +} +//@} + +/*! @name GUI select Dialog */ +//@{ +int CAddonCallbacksGUI::Dialog_Select(const char *heading, const char *entries[], unsigned int size, int selected) +{ + CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); + pDialog->Reset(); + pDialog->SetHeading(heading); + + for (unsigned int i = 0; i < size; i++) + pDialog->Add(entries[i]); + + if (selected > 0) + pDialog->SetSelected(selected); + + pDialog->DoModal(); + return pDialog->GetSelectedLabel(); +} +//@} CGUIAddonWindow::CGUIAddonWindow(int id, const std::string& strXML, CAddon* addon) : CGUIMediaWindow(id, strXML.c_str()) @@ -1593,7 +2204,7 @@ void CGUIAddonWindowDialog::Show_Internal(bool show /* = true */) // this dialog is derived from GUiMediaWindow // make sure it is rendered last - m_renderOrder = 2; + m_renderOrder = 1; while (m_bRunning && !g_application.m_bStop) { g_windowManager.ProcessRenderLoop(); diff --git a/xbmc/addons/AddonCallbacksGUI.h b/xbmc/addons/AddonCallbacksGUI.h index 2a3df8f9c1..ae032a7873 100644 --- a/xbmc/addons/AddonCallbacksGUI.h +++ b/xbmc/addons/AddonCallbacksGUI.h @@ -28,6 +28,7 @@ class CGUISpinControlEx; class CGUIButtonControl; class CGUIRadioButtonControl; +class CGUISliderControl; class CGUISettingsSliderControl; class CGUIEditControl; class CGUIRenderingControl; @@ -99,6 +100,36 @@ public: static void Control_Progress_SetInfo(void *addonData, GUIHANDLE handle, int iInfo); static int Control_Progress_GetInfo(void *addonData, GUIHANDLE handle); static const char * Control_Progress_GetDescription(void *addonData, GUIHANDLE handle); + + static GUIHANDLE Window_GetControl_Slider(void *addonData, GUIHANDLE handle, int controlId); + static void Control_Slider_SetVisible(void *addonData, GUIHANDLE handle, bool yesNo); + static const char * Control_Slider_GetDescription(void *addonData, GUIHANDLE handle); + static void Control_Slider_SetIntRange(void *addonData, GUIHANDLE handle, int iStart, int iEnd); + static void Control_Slider_SetIntValue(void *addonData, GUIHANDLE handle, int iValue); + static int Control_Slider_GetIntValue(void *addonData, GUIHANDLE handle); + static void Control_Slider_SetIntInterval(void *addonData, GUIHANDLE handle, int iInterval); + static void Control_Slider_SetPercentage(void *addonData, GUIHANDLE handle, float fPercent); + static float Control_Slider_GetPercentage(void *addonData, GUIHANDLE handle); + static void Control_Slider_SetFloatRange(void *addonData, GUIHANDLE handle, float fStart, float fEnd); + static void Control_Slider_SetFloatValue(void *addonData, GUIHANDLE handle, float fValue); + static float Control_Slider_GetFloatValue(void *addonData, GUIHANDLE handle); + static void Control_Slider_SetFloatInterval(void *addonData, GUIHANDLE handle, float fInterval); + + static GUIHANDLE Window_GetControl_SettingsSlider(void *addonData, GUIHANDLE handle, int controlId); + static void Control_SettingsSlider_SetVisible(void *addonData, GUIHANDLE handle, bool yesNo); + static void Control_SettingsSlider_SetText(void *addonData, GUIHANDLE handle, const char *label); + static const char * Control_SettingsSlider_GetDescription(void *addonData, GUIHANDLE handle); + static void Control_SettingsSlider_SetIntRange(void *addonData, GUIHANDLE handle, int iStart, int iEnd); + static void Control_SettingsSlider_SetIntValue(void *addonData, GUIHANDLE handle, int iValue); + static int Control_SettingsSlider_GetIntValue(void *addonData, GUIHANDLE handle); + static void Control_SettingsSlider_SetIntInterval(void *addonData, GUIHANDLE handle, int iInterval); + static void Control_SettingsSlider_SetPercentage(void *addonData, GUIHANDLE handle, float fPercent); + static float Control_SettingsSlider_GetPercentage(void *addonData, GUIHANDLE handle); + static void Control_SettingsSlider_SetFloatRange(void *addonData, GUIHANDLE handle, float fStart, float fEnd); + static void Control_SettingsSlider_SetFloatValue(void *addonData, GUIHANDLE handle, float fValue); + static float Control_SettingsSlider_GetFloatValue(void *addonData, GUIHANDLE handle); + static void Control_SettingsSlider_SetFloatInterval(void *addonData, GUIHANDLE handle, float fInterval); + static GUIHANDLE ListItem_Create(void *addonData, const char *label, const char *label2, const char *iconImage, const char *thumbnailImage, const char *path); static const char * ListItem_GetLabel(void *addonData, GUIHANDLE handle); static void ListItem_SetLabel(void *addonData, GUIHANDLE handle, const char *label); @@ -114,6 +145,38 @@ public: static void RenderAddon_Delete(void *addonData, GUIHANDLE handle); static void RenderAddon_MarkDirty(void *addonData, GUIHANDLE handle); + static bool Dialog_Keyboard_ShowAndGetInput(char &aTextString, unsigned int iMaxStringSize, bool allowEmptyResult, unsigned int autoCloseMs); + static bool Dialog_Keyboard_ShowAndGetInputWithHead(char &aTextString, unsigned int iMaxStringSize, const char *heading, bool allowEmptyResult, bool hiddenInput, unsigned int autoCloseMs); + static bool Dialog_Keyboard_ShowAndGetNewPassword(char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs); + static bool Dialog_Keyboard_ShowAndGetNewPasswordWithHead(char &newPassword, unsigned int iMaxStringSize, const char *strHeading, bool allowEmptyResult, unsigned int autoCloseMs); + static bool Dialog_Keyboard_ShowAndVerifyNewPassword(char &strNewPassword, unsigned int iMaxStringSize, unsigned int autoCloseMs); + static bool Dialog_Keyboard_ShowAndVerifyNewPasswordWithHead(char &strNewPassword, unsigned int iMaxStringSize, const char *strHeading, bool allowEmpty, unsigned int autoCloseMs); + static int Dialog_Keyboard_ShowAndVerifyPassword(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries, unsigned int autoCloseMs); + static bool Dialog_Keyboard_ShowAndGetFilter(char &aTextString, unsigned int iMaxStringSize, bool searching, unsigned int autoCloseMs); + static bool Dialog_Keyboard_SendTextToActiveKeyboard(const char *aTextString, bool closeKeyboard); + static bool Dialog_Keyboard_isKeyboardActivated(); + + static bool Dialog_Numeric_ShowAndVerifyNewPassword(char &strNewPasswor, unsigned int iMaxStringSized); + static int Dialog_Numeric_ShowAndVerifyPassword(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, int iRetries); + static bool Dialog_Numeric_ShowAndVerifyInput(char &strPassword, unsigned int iMaxStringSize, const char *strHeading, bool bGetUserInput); + static bool Dialog_Numeric_ShowAndGetTime(tm &time, const char *strHeading); + static bool Dialog_Numeric_ShowAndGetDate(tm &date, const char *strHeading); + static bool Dialog_Numeric_ShowAndGetIPAddress(char &strIPAddress, unsigned int iMaxStringSize, const char *strHeading); + static bool Dialog_Numeric_ShowAndGetNumber(char &strInput, unsigned int iMaxStringSize, const char *strHeading, unsigned int iAutoCloseTimeoutMs); + static bool Dialog_Numeric_ShowAndGetSeconds(char &timeString, unsigned int iMaxStringSize, const char *strHeading); + + static bool Dialog_FileBrowser_ShowAndGetFile(const char *directory, const char *mask, const char *heading, char &path, unsigned int iMaxStringSize, bool useThumbs, bool useFileDirectories, bool singleList); + + static void Dialog_OK_ShowAndGetInputSingleText(const char *heading, const char *text); + static void Dialog_OK_ShowAndGetInputLineText(const char *heading, const char *line0, const char *line1, const char *line2); + + static bool Dialog_YesNo_ShowAndGetInputSingleText(const char *heading, const char *text, bool& bCanceled, const char *noLabel, const char *yesLabel); + static bool Dialog_YesNo_ShowAndGetInputLineText(const char *heading, const char *line0, const char *line1, const char *line2, const char *noLabel, const char *yesLabel); + static bool Dialog_YesNo_ShowAndGetInputLineButtonText(const char *heading, const char *line0, const char *line1, const char *line2, bool &bCanceled, const char *noLabel, const char *yesLabel); + + static void Dialog_TextViewer(const char *heading, const char *text); + static int Dialog_Select(const char *heading, const char *entries[], unsigned int size, int selected); + private: CB_GUILib *m_callbacks; CAddon *m_addon; diff --git a/xbmc/addons/include/xbmc_codec_types.h b/xbmc/addons/include/xbmc_codec_types.h index 419196ed0b..98003e036e 100644 --- a/xbmc/addons/include/xbmc_codec_types.h +++ b/xbmc/addons/include/xbmc_codec_types.h @@ -34,6 +34,7 @@ typedef enum XBMC_CODEC_TYPE_AUDIO, XBMC_CODEC_TYPE_DATA, XBMC_CODEC_TYPE_SUBTITLE, + XBMC_CODEC_TYPE_RDS, XBMC_CODEC_TYPE_NB } xbmc_codec_type_t; diff --git a/xbmc/addons/include/xbmc_pvr_dll.h b/xbmc/addons/include/xbmc_pvr_dll.h index 6ef21f3b8e..3ad46fc64e 100644 --- a/xbmc/addons/include/xbmc_pvr_dll.h +++ b/xbmc/addons/include/xbmc_pvr_dll.h @@ -176,8 +176,9 @@ extern "C" * Show the channel scan dialog if this backend supports it. * @return PVR_ERROR_NO_ERROR if the dialog was displayed successfully. * @remarks Required if bSupportsChannelScan is set to true. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. + * @note see libXBMC_gui.h about related parts */ - PVR_ERROR DialogChannelScan(void); + PVR_ERROR OpenDialogChannelScan(void); /*! * @return The total amount of channels on the backend, or -1 on error. @@ -201,7 +202,7 @@ extern "C" * Delete a channel from the backend. * @param channel The channel to delete. * @return PVR_ERROR_NO_ERROR if the channel has been deleted successfully. - * @remarks Optional. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. + * @remarks Required if bSupportsChannelSettings is set to true. */ PVR_ERROR DeleteChannel(const PVR_CHANNEL& channel); @@ -209,7 +210,7 @@ extern "C" * Rename a channel on the backend. * @param channel The channel to rename, containing the new channel name. * @return PVR_ERROR_NO_ERROR if the channel has been renamed successfully. - * @remarks Optional. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. + * @remarks Optional, and only used if bSupportsChannelSettings is set to true. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. */ PVR_ERROR RenameChannel(const PVR_CHANNEL& channel); @@ -217,7 +218,7 @@ extern "C" * Move a channel to another channel number on the backend. * @param channel The channel to move, containing the new channel number. * @return PVR_ERROR_NO_ERROR if the channel has been moved successfully. - * @remarks Optional. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. + * @remarks Optional, and only used if bSupportsChannelSettings is set to true. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. */ PVR_ERROR MoveChannel(const PVR_CHANNEL& channel); @@ -225,17 +226,19 @@ extern "C" * Show the channel settings dialog, if supported by the backend. * @param channel The channel to show the dialog for. * @return PVR_ERROR_NO_ERROR if the dialog has been displayed successfully. - * @remarks Optional. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. + * @remarks Required if bSupportsChannelSettings is set to true. + * @note see libXBMC_gui.h about related parts */ - PVR_ERROR DialogChannelSettings(const PVR_CHANNEL& channel); + PVR_ERROR OpenDialogChannelSettings(const PVR_CHANNEL& channel); /*! * Show the dialog to add a channel on the backend, if supported by the backend. * @param channel The channel to add. * @return PVR_ERROR_NO_ERROR if the channel has been added successfully. - * @remarks Optional. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. + * @remarks Required if bSupportsChannelSettings is set to true. + * @note see libXBMC_gui.h about related parts */ - PVR_ERROR DialogAddChannel(const PVR_CHANNEL& channel); + PVR_ERROR OpenDialogChannelAdd(const PVR_CHANNEL& channel); //@} /** @name PVR recording methods @@ -245,19 +248,21 @@ extern "C" */ //@{ /*! - * @return The total amount of channels on the backend or -1 on error. + * @return The total amount of recordings on the backend or -1 on error. + * @param deleted if set return deleted recording (called if bSupportsRecordingsUndelete set to true) * @remarks Required if bSupportsRecordings is set to true. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. */ - int GetRecordingsAmount(void); + int GetRecordingsAmount(bool deleted); /*! * Request the list of all recordings from the backend, if supported. * Recording entries are added to XBMC by calling TransferRecordingEntry() on the callback. * @param handle Handle to pass to the callback method. + * @param deleted if set return deleted recording (called if bSupportsRecordingsUndelete set to true) * @return PVR_ERROR_NO_ERROR if the recordings have been fetched successfully. * @remarks Required if bSupportsRecordings is set to true. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. */ - PVR_ERROR GetRecordings(ADDON_HANDLE handle); + PVR_ERROR GetRecordings(ADDON_HANDLE handle, bool deleted); /*! * Delete a recording on the backend. @@ -268,6 +273,20 @@ extern "C" PVR_ERROR DeleteRecording(const PVR_RECORDING& recording); /*! + * Undelete a recording on the backend. + * @param recording The recording to undelete. + * @return PVR_ERROR_NO_ERROR if the recording has been undeleted successfully. + * @remarks Optional, and only used if bSupportsRecordingsUndelete is set to true. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. + */ + PVR_ERROR UndeleteRecording(const PVR_RECORDING& recording); + + /*! + * @brief Delete all recordings permanent which in the deleted folder on the backend. + * @return PVR_ERROR_NO_ERROR if the recordings has been deleted successfully. + */ + PVR_ERROR DeleteAllRecordingsFromTrash(); + + /*! * Rename a recording on the backend. * @param recording The recording to rename, containing the new name. * @return PVR_ERROR_NO_ERROR if the recording has been renamed successfully. @@ -617,7 +636,7 @@ extern "C" pClient->GetBackendName = GetBackendName; pClient->GetBackendVersion = GetBackendVersion; pClient->GetDriveSpace = GetDriveSpace; - pClient->DialogChannelScan = DialogChannelScan; + pClient->OpenDialogChannelScan = OpenDialogChannelScan; pClient->MenuHook = CallMenuHook; pClient->GetEpg = GetEPGForChannel; @@ -631,12 +650,14 @@ extern "C" pClient->DeleteChannel = DeleteChannel; pClient->RenameChannel = RenameChannel; pClient->MoveChannel = MoveChannel; - pClient->DialogChannelSettings = DialogChannelSettings; - pClient->DialogAddChannel = DialogAddChannel; + pClient->OpenDialogChannelSettings = OpenDialogChannelSettings; + pClient->OpenDialogChannelAdd = OpenDialogChannelAdd; pClient->GetRecordingsAmount = GetRecordingsAmount; pClient->GetRecordings = GetRecordings; pClient->DeleteRecording = DeleteRecording; + pClient->UndeleteRecording = UndeleteRecording; + pClient->DeleteAllRecordingsFromTrash = DeleteAllRecordingsFromTrash; pClient->RenameRecording = RenameRecording; pClient->SetRecordingPlayCount = SetRecordingPlayCount; pClient->SetRecordingLastPlayedPosition = SetRecordingLastPlayedPosition; diff --git a/xbmc/addons/include/xbmc_pvr_types.h b/xbmc/addons/include/xbmc_pvr_types.h index 8d78818e78..5285bd1551 100644 --- a/xbmc/addons/include/xbmc_pvr_types.h +++ b/xbmc/addons/include/xbmc_pvr_types.h @@ -75,10 +75,10 @@ struct DemuxPacket; #define PVR_STREAM_MAX_STREAMS 20 /* current PVR API version */ -#define XBMC_PVR_API_VERSION "1.9.3" +#define XBMC_PVR_API_VERSION "1.9.4" /* min. PVR API version */ -#define XBMC_PVR_MIN_API_VERSION "1.9.3" +#define XBMC_PVR_MIN_API_VERSION "1.9.4" #ifdef __cplusplus extern "C" { @@ -122,13 +122,14 @@ extern "C" { */ typedef enum { - PVR_MENUHOOK_UNKNOWN =-1, /*!< @brief unknown menu hook */ - PVR_MENUHOOK_ALL = 0, /*!< @brief all categories */ - PVR_MENUHOOK_CHANNEL = 1, /*!< @brief for channels */ - PVR_MENUHOOK_TIMER = 2, /*!< @brief for timers */ - PVR_MENUHOOK_EPG = 3, /*!< @brief for EPG */ - PVR_MENUHOOK_RECORDING = 4, /*!< @brief for recordings */ - PVR_MENUHOOK_SETTING = 5, /*!< @brief for settings */ + PVR_MENUHOOK_UNKNOWN =-1, /*!< @brief unknown menu hook */ + PVR_MENUHOOK_ALL = 0, /*!< @brief all categories */ + PVR_MENUHOOK_CHANNEL = 1, /*!< @brief for channels */ + PVR_MENUHOOK_TIMER = 2, /*!< @brief for timers */ + PVR_MENUHOOK_EPG = 3, /*!< @brief for EPG */ + PVR_MENUHOOK_RECORDING = 4, /*!< @brief for recordings */ + PVR_MENUHOOK_DELETED_RECORDING = 5, /*!< @brief for deleted recordings */ + PVR_MENUHOOK_SETTING = 6, /*!< @brief for settings */ } PVR_MENUHOOK_CAT; /*! @@ -150,9 +151,11 @@ extern "C" { bool bSupportsTV; /*!< @brief true if this add-on provides TV channels */ bool bSupportsRadio; /*!< @brief true if this add-on supports radio channels */ bool bSupportsRecordings; /*!< @brief true if this add-on supports playback of recordings stored on the backend */ + bool bSupportsRecordingsUndelete; /*!< @brief true if this add-on supports undelete of recordings stored on the backend */ bool bSupportsTimers; /*!< @brief true if this add-on supports the creation and editing of timers */ bool bSupportsChannelGroups; /*!< @brief true if this add-on supports channel groups */ bool bSupportsChannelScan; /*!< @brief true if this add-on support scanning for new channels on the backend */ + bool bSupportsChannelSettings; /*!< @brief true if this add-on supports the following functions: DeleteChannel, RenameChannel, MoveChannel, DialogChannelSettings and DialogAddChannel */ bool bHandlesInputStream; /*!< @brief true if this add-on provides an input stream. false if XBMC handles the stream. */ bool bHandlesDemuxing; /*!< @brief true if this add-on demultiplexes packets. */ bool bSupportsRecordingFolders; /*!< @brief true if the backend supports timers / recordings in folders. */ @@ -295,6 +298,7 @@ extern "C" { int iGenreSubType; /*!< @brief (optional) genre sub type */ int iPlayCount; /*!< @brief (optional) play count of this recording on the client */ int iLastPlayedPosition; /*!< @brief (optional) last played position of this recording on the client */ + bool bIsDeleted; /*!< @brief (optional) shows this recording is deleted and can be undelete */ } ATTRIBUTE_PACKED PVR_RECORDING; /*! @@ -349,17 +353,19 @@ extern "C" { int (__cdecl* GetChannelGroupsAmount)(void); PVR_ERROR (__cdecl* GetChannelGroups)(ADDON_HANDLE, bool); PVR_ERROR (__cdecl* GetChannelGroupMembers)(ADDON_HANDLE, const PVR_CHANNEL_GROUP&); - PVR_ERROR (__cdecl* DialogChannelScan)(void); + PVR_ERROR (__cdecl* OpenDialogChannelScan)(void); int (__cdecl* GetChannelsAmount)(void); PVR_ERROR (__cdecl* GetChannels)(ADDON_HANDLE, bool); PVR_ERROR (__cdecl* DeleteChannel)(const PVR_CHANNEL&); PVR_ERROR (__cdecl* RenameChannel)(const PVR_CHANNEL&); PVR_ERROR (__cdecl* MoveChannel)(const PVR_CHANNEL&); - PVR_ERROR (__cdecl* DialogChannelSettings)(const PVR_CHANNEL&); - PVR_ERROR (__cdecl* DialogAddChannel)(const PVR_CHANNEL&); - int (__cdecl* GetRecordingsAmount)(void); - PVR_ERROR (__cdecl* GetRecordings)(ADDON_HANDLE); + PVR_ERROR (__cdecl* OpenDialogChannelSettings)(const PVR_CHANNEL&); + PVR_ERROR (__cdecl* OpenDialogChannelAdd)(const PVR_CHANNEL&); + int (__cdecl* GetRecordingsAmount)(bool); + PVR_ERROR (__cdecl* GetRecordings)(ADDON_HANDLE, bool); PVR_ERROR (__cdecl* DeleteRecording)(const PVR_RECORDING&); + PVR_ERROR (__cdecl* UndeleteRecording)(const PVR_RECORDING&); + PVR_ERROR (__cdecl* DeleteAllRecordingsFromTrash)(void); PVR_ERROR (__cdecl* RenameRecording)(const PVR_RECORDING&); PVR_ERROR (__cdecl* SetRecordingPlayCount)(const PVR_RECORDING&, int); PVR_ERROR (__cdecl* SetRecordingLastPlayedPosition)(const PVR_RECORDING&, int); diff --git a/xbmc/android/activity/AndroidFeatures.cpp b/xbmc/android/activity/AndroidFeatures.cpp index 99f591acb0..7526cd0c81 100644 --- a/xbmc/android/activity/AndroidFeatures.cpp +++ b/xbmc/android/activity/AndroidFeatures.cpp @@ -63,23 +63,3 @@ int CAndroidFeatures::GetVersion() return version; } -std::string CAndroidFeatures::GetLibiomxName() -{ - std::string strOMXLibName; - int version = GetVersion(); - - // Gingerbread - if (version <= 10) - strOMXLibName = "libiomx-10.so"; - // Honeycomb - else if (version <= 13) - strOMXLibName = "libiomx-13.so"; - // IceCreamSandwich - else if (version <= 15) - strOMXLibName = "libiomx-14.so"; - else - strOMXLibName = "unknown"; - - return strOMXLibName; -} - diff --git a/xbmc/android/activity/AndroidFeatures.h b/xbmc/android/activity/AndroidFeatures.h index 3eeb50bc20..9d0c20b8cf 100644 --- a/xbmc/android/activity/AndroidFeatures.h +++ b/xbmc/android/activity/AndroidFeatures.h @@ -27,5 +27,4 @@ class CAndroidFeatures static bool HasNeon(); static int GetVersion(); - static std::string GetLibiomxName(); };
\ No newline at end of file diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp index 1ce8434349..6f5facd489 100644 --- a/xbmc/cores/AudioEngine/AEFactory.cpp +++ b/xbmc/cores/AudioEngine/AEFactory.cpp @@ -40,22 +40,11 @@ IAE *CAEFactory::GetEngine() bool CAEFactory::LoadEngine() { - return CAEFactory::LoadEngine(AE_ENGINE_ACTIVE); -} - -bool CAEFactory::LoadEngine(enum AEEngine engine) -{ /* can only load the engine once, XBMC restart is required to change it */ if (AE) return false; - switch(engine) - { - case AE_ENGINE_NULL : - case AE_ENGINE_ACTIVE : AE = new ActiveAE::CActiveAE(); break; - default: - return false; - } + AE = new ActiveAE::CActiveAE(); if (AE && !AE->CanInit()) { diff --git a/xbmc/cores/AudioEngine/AEFactory.h b/xbmc/cores/AudioEngine/AEFactory.h index 6f969222b2..8d4841f938 100644 --- a/xbmc/cores/AudioEngine/AEFactory.h +++ b/xbmc/cores/AudioEngine/AEFactory.h @@ -26,14 +26,6 @@ class CSetting; -enum AEEngine -{ - AE_ENGINE_NULL, - AE_ENGINE_COREAUDIO, - AE_ENGINE_ACTIVE, - AE_ENGINE_PIAUDIO -}; - class CAEFactory { public: @@ -84,7 +76,6 @@ public: static void UnregisterAudioCallback(); private: - static bool LoadEngine(enum AEEngine engine); static IAE *AE; static void SettingOptionsAudioDevicesFillerGeneral(const CSetting *setting, std::vector< std::pair<std::string, std::string> > &list, std::string ¤t, bool passthrough); diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResamplePi.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResamplePi.cpp index fee46e7528..7f4512e0ed 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResamplePi.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResamplePi.cpp @@ -531,7 +531,7 @@ int CActiveAEResamplePi::Resample(uint8_t **dst_buffer, int dst_samples, uint8_t } #ifdef DEBUG_VERBOSE CLog::Log(LOGINFO, "%s::%s format:%d->%d rate:%d->%d chan:%d->%d samples %d->%d (%f) %d", CLASSNAME, __func__, - (int)m_src_fmt, (int)m_dst_fmt, m_src_rate, m_dst_rate, m_src_channels, m_dst_channels, src_samples, dst_samples, ratio, m_Initialized, received); + (int)m_src_fmt, (int)m_dst_fmt, m_src_rate, m_dst_rate, m_src_channels, m_dst_channels, src_samples, dst_samples, ratio, received); #endif assert(received <= dst_samples); return received; @@ -539,9 +539,10 @@ int CActiveAEResamplePi::Resample(uint8_t **dst_buffer, int dst_samples, uint8_t int64_t CActiveAEResamplePi::GetDelay(int64_t base) { - int ret = m_dst_rate ? 1000 * GetBufferedSamples() / m_dst_rate : 0; + int64_t ret = av_rescale_rnd(GetBufferedSamples(), m_dst_rate, base, AV_ROUND_UP); + #ifdef DEBUG_VERBOSE - CLog::Log(LOGINFO, "%s::%s = %d", CLASSNAME, __func__, ret); + CLog::Log(LOGINFO, "%s::%s = %" PRId64, CLASSNAME, __func__, ret); #endif return ret; } @@ -562,7 +563,7 @@ int CActiveAEResamplePi::GetBufferedSamples() int CActiveAEResamplePi::CalcDstSampleCount(int src_samples, int dst_rate, int src_rate) { - int ret = ((long long)src_samples * dst_rate + src_rate-1) / src_rate; + int ret = av_rescale_rnd(src_samples, dst_rate, src_rate, AV_ROUND_UP); #ifdef DEBUG_VERBOSE CLog::Log(LOGINFO, "%s::%s = %d", CLASSNAME, __func__, ret); #endif @@ -571,7 +572,7 @@ int CActiveAEResamplePi::CalcDstSampleCount(int src_samples, int dst_rate, int s int CActiveAEResamplePi::GetSrcBufferSize(int samples) { - int ret = 0; + int ret = av_samples_get_buffer_size(NULL, m_src_channels, samples, m_src_fmt, 1); #ifdef DEBUG_VERBOSE CLog::Log(LOGINFO, "%s::%s = %d", CLASSNAME, __func__, ret); #endif @@ -580,7 +581,7 @@ int CActiveAEResamplePi::GetSrcBufferSize(int samples) int CActiveAEResamplePi::GetDstBufferSize(int samples) { - int ret = CalcDstSampleCount(samples, m_dst_rate, m_src_rate); + int ret = av_samples_get_buffer_size(NULL, m_dst_channels, samples, m_dst_fmt, 1); #ifdef DEBUG_VERBOSE CLog::Log(LOGINFO, "%s::%s = %d", CLASSNAME, __func__, ret); #endif diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp index 8b24703689..8159ab8627 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp @@ -209,6 +209,10 @@ bool CAESinkDirectSound::Initialize(AEAudioFormat &format, std::string &device) WAVEFORMATEXTENSIBLE wfxex = {0}; + // clamp samplerate to a minimum + if (format.m_sampleRate < 44100) + format.m_sampleRate = 44100; + //fill waveformatex ZeroMemory(&wfxex, sizeof(WAVEFORMATEXTENSIBLE)); wfxex.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX); diff --git a/xbmc/cores/IPlayer.h b/xbmc/cores/IPlayer.h index 499ff94dbf..29705d951b 100644 --- a/xbmc/cores/IPlayer.h +++ b/xbmc/cores/IPlayer.h @@ -26,6 +26,8 @@ #include "guilib/Geometry.h" #include <string> +#define CURRENT_STREAM -1 + struct TextCacheStruct_t; class TiXmlElement; class CStreamDetails; diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp index e3203a01c3..b452c78546 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp @@ -1609,10 +1609,11 @@ void CLinuxRendererGLES::RenderSurfaceTexture(int index, int field) GLint fieldLoc = g_Windowing.GUIShaderGetField(); GLint stepLoc = g_Windowing.GUIShaderGetStep(); + // Y is inverted, so invert fields if (field == FIELD_TOP) - glUniform1i(fieldLoc, 1); - else if(field == FIELD_BOT) glUniform1i(fieldLoc, 0); + else if(field == FIELD_BOT) + glUniform1i(fieldLoc, 1); glUniform1f(stepLoc, 1.0f / (float)plane.texheight); } else diff --git a/xbmc/cores/VideoRenderers/MMALRenderer.cpp b/xbmc/cores/VideoRenderers/MMALRenderer.cpp index 69ff30a5dd..0bc5f4bc1b 100644 --- a/xbmc/cores/VideoRenderers/MMALRenderer.cpp +++ b/xbmc/cores/VideoRenderers/MMALRenderer.cpp @@ -100,7 +100,7 @@ bool CMMALRenderer::init_vout(MMAL_ES_FORMAT_T *format) return false; } - m_vout_input->buffer_num = m_vout_input->buffer_num_recommended; + m_vout_input->buffer_num = std::max(m_vout_input->buffer_num_recommended, (uint32_t)m_NumYV12Buffers); m_vout_input->buffer_size = m_vout_input->buffer_size_recommended; status = mmal_port_enable(m_vout_input, vout_input_port_cb_static); @@ -149,6 +149,7 @@ CMMALRenderer::CMMALRenderer() m_vout_input_pool = NULL; memset(m_buffers, 0, sizeof m_buffers); m_release_queue = mmal_queue_create(); + m_iYV12RenderBuffer = 0; Create(); } @@ -229,7 +230,7 @@ bool CMMALRenderer::Configure(unsigned int width, unsigned int height, unsigned es_format->es->video.color_space = MMAL_COLOR_SPACE_SMPTE240M; } if (m_bConfigured) - UnInit(); + UnInitMMAL(); m_bConfigured = init_vout(es_format); mmal_format_free(es_format); } @@ -298,6 +299,9 @@ int CMMALRenderer::GetImage(YV12Image *image, int source, bool readonly) void CMMALRenderer::ReleaseBuffer(int idx) { + if (!m_bConfigured || m_format == RENDER_FMT_BYPASS) + return; + #if defined(MMAL_DEBUG_VERBOSE) CLog::Log(LOGDEBUG, "%s::%s - %d", CLASSNAME, __func__, idx); #endif @@ -319,6 +323,7 @@ void CMMALRenderer::Reset() void CMMALRenderer::Flush() { + m_iYV12RenderBuffer = 0; CLog::Log(LOGDEBUG, "%s::%s", CLASSNAME, __func__); } @@ -333,31 +338,25 @@ void CMMALRenderer::Update() void CMMALRenderer::RenderUpdate(bool clear, DWORD flags, DWORD alpha) { + int source = m_iYV12RenderBuffer; #if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - %d %x %d", CLASSNAME, __func__, clear, flags, alpha); + CLog::Log(LOGDEBUG, "%s::%s - %d %x %d %d", CLASSNAME, __func__, clear, flags, alpha, source); #endif if (!m_bConfigured) return; - CSingleLock lock(g_graphicsContext); - ManageDisplay(); // if running bypass, then the player might need the src/dst rects // for sizing video playback on a layer other than the gles layer. if (m_RenderUpdateCallBackFn) (*m_RenderUpdateCallBackFn)(m_RenderUpdateCallBackCtx, m_sourceRect, m_destRect); -} -void CMMALRenderer::FlipPage(int source) -{ -#if defined(MMAL_DEBUG_VERBOSE) - CLog::Log(LOGDEBUG, "%s::%s - %d", CLASSNAME, __func__, source); -#endif - - if (!m_bConfigured || m_format == RENDER_FMT_BYPASS) + if (m_format == RENDER_FMT_BYPASS) return; + SetVideoRect(m_sourceRect, m_destRect); + YUVBUFFER *buffer = &m_buffers[source]; // we only want to upload frames once if (buffer->flipindex++) @@ -384,9 +383,20 @@ void CMMALRenderer::FlipPage(int source) else assert(0); } +void CMMALRenderer::FlipPage(int source) +{ + if (!m_bConfigured || m_format == RENDER_FMT_BYPASS) + return; + +#if defined(MMAL_DEBUG_VERBOSE) + CLog::Log(LOGDEBUG, "%s::%s - %d", CLASSNAME, __func__, source); +#endif + + m_iYV12RenderBuffer = source; +} + unsigned int CMMALRenderer::PreInit() { - CSingleLock lock(g_graphicsContext); m_bConfigured = false; UnInit(); @@ -403,6 +413,7 @@ unsigned int CMMALRenderer::PreInit() m_formats.push_back(RENDER_FMT_MMAL); m_formats.push_back(RENDER_FMT_BYPASS); + m_iYV12RenderBuffer = 0; m_NumYV12Buffers = NUM_BUFFERS; return 0; @@ -414,9 +425,8 @@ void CMMALRenderer::ReleaseBuffers() ReleaseBuffer(i); } -void CMMALRenderer::UnInit() +void CMMALRenderer::UnInitMMAL() { - CSingleLock lock(g_graphicsContext); CLog::Log(LOGDEBUG, "%s::%s", CLASSNAME, __func__); if (m_vout) { @@ -456,6 +466,11 @@ void CMMALRenderer::UnInit() m_bConfigured = false; } +void CMMALRenderer::UnInit() +{ + UnInitMMAL(); +} + bool CMMALRenderer::RenderCapture(CRenderCapture* capture) { if (!m_bConfigured) diff --git a/xbmc/cores/VideoRenderers/MMALRenderer.h b/xbmc/cores/VideoRenderers/MMALRenderer.h index 62d513e838..e15cef1e2e 100644 --- a/xbmc/cores/VideoRenderers/MMALRenderer.h +++ b/xbmc/cores/VideoRenderers/MMALRenderer.h @@ -94,6 +94,7 @@ public: void vout_input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer); protected: + int m_iYV12RenderBuffer; int m_NumYV12Buffers; std::vector<ERenderFormat> m_formats; @@ -119,6 +120,7 @@ protected: CEvent m_sync; bool init_vout(MMAL_ES_FORMAT_T *m_format); void ReleaseBuffers(); + void UnInitMMAL(); }; #else diff --git a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp index 7fa7cc09ee..0cd267a7c1 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp @@ -192,6 +192,11 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, unsigne #else hwSupport += "iMXVPU:no "; #endif +#if defined(HAS_MMAL) + hwSupport += "MMAL:yes "; +#else + hwSupport += "MMAL:no "; +#endif CLog::Log(LOGDEBUG, "CDVDFactoryCodec: compiled in hardware support: %s", hwSupport.c_str()); if (hint.stills && (hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_MPEG1VIDEO)) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder.c b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder.c index 02afd175ab..0c9c6f0a9e 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder.c +++ b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder.c @@ -258,7 +258,7 @@ void ccmem_tobuf(cc_decoder_t *dec) if (buf->rows[i].cells[f].c != ' ') break; for (l = CC_COLUMNS-1; l>0; l--) - if (buf->rows[i].cells[f].c != ' ') + if (buf->rows[i].cells[l].c != ' ') break; for (j = f; j <= l; j++) dec->text[dec->textlen++] = buf->rows[i].cells[j].c; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp index d7c7ad8090..1dbd2c83ed 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp @@ -167,9 +167,7 @@ public: CBitstreamConverter::write_bits(&bs, 32, 0); // CODEC_HANDLE cntl_handle CBitstreamConverter::write_bits(&bs, 32, 0); // CODEC_HANDLE sub_handle - // added in JellyBean 4.2 - if (CAndroidFeatures::GetVersion() > 16) - CBitstreamConverter::write_bits(&bs, 32, 0); // CODEC_HANDLE audio_utils_handle + CBitstreamConverter::write_bits(&bs, 32, 0); // CODEC_HANDLE audio_utils_handle CBitstreamConverter::write_bits(&bs, 32, p_in->stream_type); // stream_type_t stream_type @@ -194,15 +192,6 @@ public: CBitstreamConverter::write_bits(&bs, 32, 0); // int vbuf_size CBitstreamConverter::write_bits(&bs, 32, 0); // int abuf_size - // ARM requires 8-byte alignment for 64-bit members (ratio64) - // and this will force am_sysinfo to be also have 8-byte alignment. - // Since the inclusion of audio_utils_handle for JellyBean 4.2 - // 'naturally' aligns am_sysinfo to 8-byte, we need to compensate - // when we are NOT JellyBean 4.2. If these member values get changed, - // then make sure you check that am_sysinfo has 8-byte alignment. - if (CAndroidFeatures::GetVersion() < 17) - CBitstreamConverter::write_bits(&bs, 32, 0); - CBitstreamConverter::write_bits(&bs, 32, p_in->format); // am_sysinfo, unsigned int format CBitstreamConverter::write_bits(&bs, 32, p_in->width); // am_sysinfo, unsigned int width CBitstreamConverter::write_bits(&bs, 32, p_in->height); // am_sysinfo, unsigned int height diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp index 4f3758f6a9..44cf9633fe 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp @@ -60,6 +60,12 @@ CDVDVideoCodecAmlogic::~CDVDVideoCodecAmlogic() bool CDVDVideoCodecAmlogic::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { + if (!aml_permissions()) + { + CLog::Log(LOGERROR, "AML: no proper permission, please contact the device vendor. Skipping codec..."); + return false; + } + m_hints = hints; switch(m_hints.codec) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp index 015d4bf4b3..86cd41fc9c 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp @@ -313,10 +313,6 @@ CDVDVideoCodecAndroidMediaCodec::~CDVDVideoCodecAndroidMediaCodec() bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { - // check for 4.1 Jellybean and above. - if (CAndroidFeatures::GetVersion() < 16) - return false; - // mediacodec crashes with null size. Trap this... if (!hints.width || !hints.height) { @@ -493,6 +489,7 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio "Open Android MediaCodec %s", m_codecname.c_str()); m_opened = true; + memset(&m_demux_pkt, 0, sizeof(m_demux_pkt)); return m_opened; } @@ -502,12 +499,8 @@ void CDVDVideoCodecAndroidMediaCodec::Dispose() m_opened = false; // release any retained demux packets - while (!m_demux.empty()) - { - amc_demux &demux_pkt = m_demux.front(); - free(demux_pkt.pData); - m_demux.pop(); - } + if (m_demux_pkt.pData) + free(m_demux_pkt.pData); // invalidate any inflight outputbuffers, make sure // m_output is empty so we do not create new ones @@ -546,7 +539,7 @@ int CDVDVideoCodecAndroidMediaCodec::Decode(uint8_t *pData, int iSize, double dt int rtn = VC_BUFFER; if (!m_opened) - return rtn; + return VC_ERROR; if (m_hints.ptsinvalid) pts = DVD_NOPTS_VALUE; @@ -556,24 +549,20 @@ int CDVDVideoCodecAndroidMediaCodec::Decode(uint8_t *pData, int iSize, double dt if (GetOutputPicture() > 0) rtn |= VC_PICTURE; - if (pData) + if (!pData) { - if (m_bitstream) + // Check if we have a saved buffer + if (m_demux_pkt.pData) { - m_bitstream->Convert(pData, iSize); - iSize = m_bitstream->GetConvertSize(); - pData = m_bitstream->GetConvertBuffer(); + pData = m_demux_pkt.pData; + iSize = m_demux_pkt.iSize; + pts = m_demux_pkt.pts; + dts = m_demux_pkt.dts; } + } - // queue demux pkt in case we cannot get an input buffer - amc_demux demux_pkt; - demux_pkt.dts = dts; - demux_pkt.pts = pts; - demux_pkt.iSize = iSize; - demux_pkt.pData = (uint8_t*)malloc(iSize); - memcpy(demux_pkt.pData, pData, iSize); - m_demux.push(demux_pkt); - + if (pData) + { // try to fetch an input buffer int64_t timeout_us = 5000; int index = m_codec->dequeueInputBuffer(timeout_us); @@ -582,9 +571,9 @@ int CDVDVideoCodecAndroidMediaCodec::Decode(uint8_t *pData, int iSize, double dt CLog::Log(LOGERROR, "CDVDVideoCodecAndroidMediaCodec::Decode ExceptionCheck"); xbmc_jnienv()->ExceptionDescribe(); xbmc_jnienv()->ExceptionClear(); - return VC_ERROR; + rtn = VC_ERROR; } - if (index >= 0) + else if (index >= 0) { // docs lie, getInputBuffers should be good after // m_codec->start() but the internal refs are not @@ -602,32 +591,33 @@ int CDVDVideoCodecAndroidMediaCodec::Decode(uint8_t *pData, int iSize, double dt } // we have an input buffer, fill it. + if (m_bitstream) + { + m_bitstream->Convert(pData, iSize); + iSize = m_bitstream->GetConvertSize(); + pData = m_bitstream->GetConvertBuffer(); + } int size = m_input[index].capacity(); - // fetch the front demux packet - amc_demux &demux_pkt = m_demux.front(); - if (demux_pkt.iSize > size) + if (iSize > size) { CLog::Log(LOGERROR, "CDVDVideoCodecAndroidMediaCodec::Decode, iSize(%d) > size(%d)", iSize, size); - demux_pkt.iSize = size; + iSize = size; } // fetch a pointer to the ByteBuffer backing store void *dst_ptr = xbmc_jnienv()->GetDirectBufferAddress(m_input[index].get_raw()); if (dst_ptr) - memcpy(dst_ptr, demux_pkt.pData, demux_pkt.iSize); - - free(demux_pkt.pData); - m_demux.pop(); + memcpy(dst_ptr, pData, iSize); // Translate from dvdplayer dts/pts to MediaCodec pts, // pts WILL get re-ordered by MediaCodec if needed. // Do not try to pass pts as a unioned double/int64_t, // some android devices will diddle with presentationTimeUs // and you will get NaN back and DVDPlayerVideo will barf. - int64_t presentationTimeUs = AV_NOPTS_VALUE; - if (demux_pkt.pts != DVD_NOPTS_VALUE) - presentationTimeUs = demux_pkt.pts; - else if (demux_pkt.dts != DVD_NOPTS_VALUE) - presentationTimeUs = demux_pkt.dts; + int64_t presentationTimeUs = 0; + if (pts != DVD_NOPTS_VALUE) + presentationTimeUs = pts; + else if (dts != DVD_NOPTS_VALUE) + presentationTimeUs = dts; /* CLog::Log(LOGDEBUG, "CDVDVideoCodecAndroidMediaCodec:: " "pts(%f), ipts(%lld), iSize(%d), GetDataSize(%d), loop_cnt(%d)", @@ -635,13 +625,34 @@ int CDVDVideoCodecAndroidMediaCodec::Decode(uint8_t *pData, int iSize, double dt */ int flags = 0; int offset = 0; - m_codec->queueInputBuffer(index, offset, demux_pkt.iSize, presentationTimeUs, flags); + m_codec->queueInputBuffer(index, offset, iSize, presentationTimeUs, flags); // clear any jni exceptions, jni gets upset if we do not. if (xbmc_jnienv()->ExceptionCheck()) { CLog::Log(LOGERROR, "CDVDVideoCodecAndroidMediaCodec::Decode ExceptionCheck"); xbmc_jnienv()->ExceptionClear(); } + + // Free saved buffer it there was one + if (m_demux_pkt.pData) + { + free(m_demux_pkt.pData); + memset(&m_demux_pkt, 0, sizeof(m_demux_pkt)); + } + } + else + { + // We couldn't get an input buffer. Save the packet for next iteration, if it wasn't already + if (!m_demux_pkt.pData) + { + m_demux_pkt.dts = dts; + m_demux_pkt.pts = pts; + m_demux_pkt.iSize = iSize; + m_demux_pkt.pData = (uint8_t*)malloc(iSize); + memcpy(m_demux_pkt.pData, pData, iSize); + } + + rtn &= ~VC_BUFFER; } } @@ -654,11 +665,10 @@ void CDVDVideoCodecAndroidMediaCodec::Reset() return; // dump any pending demux packets - while (!m_demux.empty()) + if (m_demux_pkt.pData) { - amc_demux &demux_pkt = m_demux.front(); - free(demux_pkt.pData); - m_demux.pop(); + free(m_demux_pkt.pData); + memset(&m_demux_pkt, 0, sizeof(m_demux_pkt)); } if (m_codec) @@ -831,7 +841,7 @@ int CDVDVideoCodecAndroidMediaCodec::GetOutputPicture(void) { int rtn = 0; - int64_t timeout_us = 50000; + int64_t timeout_us = 1000; CJNIMediaCodecBufferInfo bufferInfo; int index = m_codec->dequeueOutputBuffer(bufferInfo, timeout_us); if (xbmc_jnienv()->ExceptionCheck()) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.h index b29471b8e2..82da3f9c72 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.h @@ -132,7 +132,7 @@ protected: std::shared_ptr<CJNISurfaceTexture> m_surfaceTexture; std::shared_ptr<CDVDMediaCodecOnFrameAvailable> m_frameAvailable; - std::queue<amc_demux> m_demux; + amc_demux m_demux_pkt; std::vector<CJNIByteBuffer> m_input; std::vector<CJNIByteBuffer> m_output; std::vector<CDVDMediaCodecInfo*> m_inflight; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecMMAL.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecMMAL.cpp index 55b9969c27..262283d570 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecMMAL.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecMMAL.cpp @@ -96,4 +96,9 @@ bool CDVDVideoCodecMMAL::GetCodecStats(double &pts, int &droppedPics) return m_decoder->GetCodecStats(pts, droppedPics); } +void CDVDVideoCodecMMAL::SetSpeed(int iSpeed) +{ + m_decoder->SetSpeed(iSpeed); +} + #endif diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecMMAL.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecMMAL.h index 67aa505cb0..a768e70682 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecMMAL.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecMMAL.h @@ -42,6 +42,7 @@ public: virtual void SetDropState(bool bDrop); virtual const char* GetName(void); virtual bool GetCodecStats(double &pts, int &droppedPics); + virtual void SetSpeed(int iSpeed); protected: MMALVideoPtr m_decoder; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp index 098910ec8d..1bfec449a8 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp @@ -128,6 +128,8 @@ CMMALVideo::CMMALVideo() m_output_busy = 0; m_demux_queue_length = 0; m_es_format = mmal_format_alloc(); + m_preroll = true; + m_speed = DVD_PLAYSPEED_NORMAL; } CMMALVideo::~CMMALVideo() @@ -621,12 +623,12 @@ bool CMMALVideo::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options, MMALVide error_concealment.hdr.id = MMAL_PARAMETER_VIDEO_DECODE_ERROR_CONCEALMENT; error_concealment.hdr.size = sizeof(MMAL_PARAMETER_BOOLEAN_T); - error_concealment.enable = MMAL_FALSE; + error_concealment.enable = g_advancedSettings.m_omxDecodeStartWithValidFrame; status = mmal_port_parameter_set(m_dec_input, &error_concealment.hdr); if (status != MMAL_SUCCESS) CLog::Log(LOGERROR, "%s::%s Failed to disable error concealment on %s (status=%x %s)", CLASSNAME, __func__, m_dec_input->name, status, mmal_status_to_string(status)); - status = mmal_port_parameter_set_uint32(m_dec_input, MMAL_PARAMETER_EXTRA_BUFFERS, NUM_BUFFERS); + status = mmal_port_parameter_set_uint32(m_dec_input, MMAL_PARAMETER_EXTRA_BUFFERS, GetAllowedReferences()); if (status != MMAL_SUCCESS) CLog::Log(LOGERROR, "%s::%s Failed to enable extra buffers on %s (status=%x %s)", CLASSNAME, __func__, m_dec_input->name, status, mmal_status_to_string(status)); @@ -696,6 +698,8 @@ bool CMMALVideo::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options, MMALVide m_drop_state = false; m_startframe = false; + m_preroll = !m_hints.stills; + m_speed = DVD_PLAYSPEED_NORMAL; return true; } @@ -704,11 +708,11 @@ void CMMALVideo::Dispose() { // we are happy to exit, but let last shared pointer being deleted trigger the destructor bool done = false; + m_finished = true; Reset(); pthread_mutex_lock(&m_output_mutex); if (!m_output_busy) done = true; - m_finished = true; pthread_mutex_unlock(&m_output_mutex); if (g_advancedSettings.CanLogComponent(LOGVIDEO)) CLog::Log(LOGDEBUG, "%s::%s dts_queue(%d) ready_queue(%d) busy_queue(%d) done:%d", CLASSNAME, __func__, m_dts_queue.size(), m_output_ready.size(), m_output_busy, done); @@ -879,7 +883,7 @@ int CMMALVideo::Decode(uint8_t* pData, int iSize, double dts, double pts) bool deinterlace = m_interlace_mode != MMAL_InterlaceProgressive; - if (deinterlace_request == VS_DEINTERLACEMODE_OFF) + if (m_hints.stills || deinterlace_request == VS_DEINTERLACEMODE_OFF) deinterlace = false; else if (deinterlace_request == VS_DEINTERLACEMODE_FORCE) deinterlace = true; @@ -904,23 +908,29 @@ int CMMALVideo::Decode(uint8_t* pData, int iSize, double dts, double pts) break; } int ret = 0; - if (!m_output_ready.empty()) + if (mmal_queue_length(m_dec_input_pool->queue) > 0 && !m_demux_queue_length) { if (g_advancedSettings.CanLogComponent(LOGVIDEO)) CLog::Log(LOGDEBUG, "%s::%s - got space for output: demux_queue(%d) space(%d)", CLASSNAME, __func__, m_demux_queue_length, mmal_queue_length(m_dec_input_pool->queue) * m_dec_input->buffer_size); - ret |= VC_PICTURE; + ret |= VC_BUFFER; } - if (mmal_queue_length(m_dec_input_pool->queue) > 0 && !m_demux_queue_length) + else + m_preroll = false; + + if (m_preroll && m_output_ready.size() >= GetAllowedReferences()) + m_preroll = false; + + if (!m_output_ready.empty() && !m_preroll) { if (g_advancedSettings.CanLogComponent(LOGVIDEO)) CLog::Log(LOGDEBUG, "%s::%s - got output picture:%d", CLASSNAME, __func__, m_output_ready.size()); - ret |= VC_BUFFER; + ret |= VC_PICTURE; } if (!ret) { if (g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "%s::%s - Nothing to do: dts_queue(%d) ready_queue(%d) busy_queue(%d) demux_queue(%d) space(%d)", - CLASSNAME, __func__, m_dts_queue.size(), m_output_ready.size(), m_output_busy, m_demux_queue_length, mmal_queue_length(m_dec_input_pool->queue) * m_dec_input->buffer_size); + CLog::Log(LOGDEBUG, "%s::%s - Nothing to do: dts_queue(%d) ready_queue(%d) busy_queue(%d) demux_queue(%d) space(%d) preroll(%d)", + CLASSNAME, __func__, m_dts_queue.size(), m_output_ready.size(), m_output_busy, m_demux_queue_length, mmal_queue_length(m_dec_input_pool->queue) * m_dec_input->buffer_size, m_preroll); Sleep(10); // otherwise we busy spin } return ret; @@ -931,19 +941,21 @@ void CMMALVideo::Reset(void) if (g_advancedSettings.CanLogComponent(LOGVIDEO)) CLog::Log(LOGDEBUG, "%s::%s", CLASSNAME, __func__); - if (m_dec_input) + if (m_dec_input && m_dec_input->is_enabled) mmal_port_disable(m_dec_input); - if (m_deint_connection) + if (m_deint_connection && m_deint_connection->is_enabled) mmal_connection_disable(m_deint_connection); - if (m_dec_output) + if (m_dec_output && m_dec_output->is_enabled) mmal_port_disable(m_dec_output); - if (m_dec_input) - mmal_port_enable(m_dec_input, dec_input_port_cb); - if (m_deint_connection) - mmal_connection_enable(m_deint_connection); - if (m_dec_output) - mmal_port_enable(m_dec_output, dec_output_port_cb_static); - + if (!m_finished) + { + if (m_dec_input) + mmal_port_enable(m_dec_input, dec_input_port_cb); + if (m_deint_connection) + mmal_connection_enable(m_deint_connection); + if (m_dec_output) + mmal_port_enable(m_dec_output, dec_output_port_cb_static); + } // blow all ready video frames bool old_drop_state = m_drop_state; SetDropState(true); @@ -957,14 +969,23 @@ void CMMALVideo::Reset(void) if (!old_drop_state) SetDropState(false); - SendCodecConfigData(); + if (!m_finished) + SendCodecConfigData(); m_startframe = false; m_decoderPts = DVD_NOPTS_VALUE; m_droppedPics = 0; m_decode_frame_number = 1; + m_preroll = !m_hints.stills && (m_speed == DVD_PLAYSPEED_NORMAL || m_speed == DVD_PLAYSPEED_PAUSE); } +void CMMALVideo::SetSpeed(int iSpeed) +{ + if (g_advancedSettings.CanLogComponent(LOGVIDEO)) + CLog::Log(LOGDEBUG, "%s::%s %d->%d", CLASSNAME, __func__, m_speed, iSpeed); + + m_speed = iSpeed; +} void CMMALVideo::ReturnBuffer(CMMALVideoBuffer *buffer) { diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h index 4c04427dfd..ca513f6f4b 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h @@ -86,10 +86,11 @@ public: virtual void Reset(void); virtual bool GetPicture(DVDVideoPicture *pDvdVideoPicture); virtual bool ClearPicture(DVDVideoPicture* pDvdVideoPicture); - virtual unsigned GetAllowedReferences() { return NUM_BUFFERS; } + virtual unsigned GetAllowedReferences() { return 3; } virtual void SetDropState(bool bDrop); virtual const char* GetName(void) { return (const char*)m_pFormatName; } virtual bool GetCodecStats(double &pts, int &droppedPics); + virtual void SetSpeed(int iSpeed); // MMAL decoder callback routines. void ReleaseBuffer(CMMALVideoBuffer *buffer); @@ -140,6 +141,8 @@ protected: unsigned int m_decode_frame_number; double m_decoderPts; unsigned int m_droppedPics; + int m_speed; + bool m_preroll; MMAL_COMPONENT_T *m_dec; MMAL_PORT_T *m_dec_input; diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.cpp b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.cpp index 610bcce569..cb6b479303 100644 --- a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.cpp +++ b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.cpp @@ -294,7 +294,7 @@ bool CDVDInputStreamPVRManager::SelectChannel(const CPVRChannel &channel) return false; } -bool CDVDInputStreamPVRManager::GetSelectedChannel(CPVRChannelPtr& channel) const +bool CDVDInputStreamPVRManager::GetSelectedChannel(CPVRChannelPtr& channel) { return g_PVRManager.GetCurrentChannel(channel); } diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.h b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.h index 81dbdfce4a..00a7bd8bcf 100644 --- a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.h +++ b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamPVRManager.h @@ -59,7 +59,7 @@ public: bool SelectChannel(const PVR::CPVRChannel &channel); bool NextChannel(bool preview = false); bool PrevChannel(bool preview = false); - bool GetSelectedChannel(PVR::CPVRChannelPtr& channel) const; + bool GetSelectedChannel(PVR::CPVRChannelPtr& channel); int GetTotalTime(); int GetTime(); diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp index 260dd9021d..470f736ba3 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp @@ -4156,6 +4156,9 @@ int CDVDPlayer::GetSourceBitrate() void CDVDPlayer::GetAudioStreamInfo(int index, SPlayerAudioStreamInfo &info) { + if (index == CURRENT_STREAM) + index = GetAudioStream(); + if (index < 0 || index > GetAudioStreamCount() - 1 ) return; diff --git a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp index 70f00328b2..4e77185eca 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp @@ -657,6 +657,7 @@ void CDVDPlayerAudio::HandleSyncError(double duration) { m_syncclock = false; m_errors.Flush(); + m_integral = 0.0; } //check if measured error for 2 seconds diff --git a/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp b/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp index 94b673e4d4..1a920f7ae1 100644 --- a/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp +++ b/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp @@ -97,8 +97,8 @@ bool COMXAudioCodecOMX::Open(CDVDStreamInfo &hints) if (m_pCodecContext->request_channel_layout) CLog::Log(LOGNOTICE,"COMXAudioCodecOMX::Open() Requesting channel layout of %x", (unsigned)m_pCodecContext->request_channel_layout); - // vorbis has variable sized planar output, so skip concatenation - if (hints.codec == AV_CODEC_ID_VORBIS) + // vorbis and wma2v2 have variable sized planar output, so skip concatenation + if (hints.codec == AV_CODEC_ID_VORBIS || hints.codec == AV_CODEC_ID_WMAV2) m_bNoConcatenate = true; if(m_pCodecContext->bits_per_coded_sample == 0) diff --git a/xbmc/cores/omxplayer/OMXPlayerAudio.cpp b/xbmc/cores/omxplayer/OMXPlayerAudio.cpp index 66014d4305..c2da2d2385 100644 --- a/xbmc/cores/omxplayer/OMXPlayerAudio.cpp +++ b/xbmc/cores/omxplayer/OMXPlayerAudio.cpp @@ -525,17 +525,17 @@ AEDataFormat OMXPlayerAudio::GetDataFormat(CDVDStreamInfo hints) /* check our audio capabilties */ /* pathrought is overriding hw decode*/ - if(hints.codec == AV_CODEC_ID_AC3 && CAEFactory::SupportsRaw(AE_FMT_AC3, hints.samplerate) && !CSettings::Get().GetBool("audiooutput.dualaudio")) + if(hints.codec == AV_CODEC_ID_AC3 && CAEFactory::SupportsRaw(AE_FMT_AC3, hints.samplerate)) { dataFormat = AE_FMT_AC3; m_passthrough = true; } - if(hints.codec == AV_CODEC_ID_EAC3 && CAEFactory::SupportsRaw(AE_FMT_AC3, hints.samplerate * 4) && !CSettings::Get().GetBool("audiooutput.dualaudio")) + if(hints.codec == AV_CODEC_ID_EAC3 && CAEFactory::SupportsRaw(AE_FMT_AC3, hints.samplerate * 4)) { dataFormat = AE_FMT_EAC3; m_passthrough = true; } - if(hints.codec == AV_CODEC_ID_DTS && CAEFactory::SupportsRaw(AE_FMT_DTS, hints.samplerate) && !CSettings::Get().GetBool("audiooutput.dualaudio")) + if(hints.codec == AV_CODEC_ID_DTS && CAEFactory::SupportsRaw(AE_FMT_DTS, hints.samplerate)) { dataFormat = AE_FMT_DTS; m_passthrough = true; diff --git a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp index ac838ce9c0..bee70863cf 100644 --- a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp +++ b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp @@ -618,12 +618,18 @@ void OMXPlayerVideo::SetSpeed(int speed) std::string OMXPlayerVideo::GetPlayerInfo() { + double match = 0.0f, phase = 0.0f, pll = 0.0f; std::ostringstream s; s << "fr:" << fixed << setprecision(3) << m_fFrameRate; s << ", vq:" << setw(2) << min(99,GetLevel()) << "%"; s << ", dc:" << m_codecname; s << ", Mb/s:" << fixed << setprecision(2) << (double)GetVideoBitrate() / (1024.0*1024.0); - + if (m_omxVideo.GetPlayerInfo(match, phase, pll)) + { + s << ", match:" << fixed << setprecision(2) << match; + s << ", phase:" << fixed << setprecision(2) << phase; + s << ", pll:" << fixed << setprecision(5) << pll; + } return s.str(); } diff --git a/xbmc/cores/omxplayer/OMXVideo.cpp b/xbmc/cores/omxplayer/OMXVideo.cpp index 99bb7eb15f..55e16c4122 100644 --- a/xbmc/cores/omxplayer/OMXVideo.cpp +++ b/xbmc/cores/omxplayer/OMXVideo.cpp @@ -610,22 +610,6 @@ bool COMXVideo::Open(CDVDStreamInfo &hints, OMXClock *clock, EDEINTERLACEMODE de return false; } - if (m_deinterlace_request != VS_DEINTERLACEMODE_OFF) - { - // the deinterlace component requires 3 additional video buffers in addition to the DPB (this is normally 2). - OMX_PARAM_U32TYPE extra_buffers; - OMX_INIT_STRUCTURE(extra_buffers); - extra_buffers.nU32 = 3; - - omx_err = m_omx_decoder.SetParameter(OMX_IndexParamBrcmExtraBuffers, &extra_buffers); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXVideo::Open error OMX_IndexParamBrcmExtraBuffers omx_err(0x%08x)\n", omx_err); - return false; - } - } - - // broadcom omx entension: // When enabled, the timestamp fifo mode will change the way incoming timestamps are associated with output images. // In this mode the incoming timestamps get used without re-ordering on output images. @@ -759,6 +743,30 @@ unsigned int COMXVideo::GetSize() return m_omx_decoder.GetInputBufferSize(); } +bool COMXVideo::GetPlayerInfo(double &match, double &phase, double &pll) +{ + CSingleLock lock (m_critSection); + OMX_ERRORTYPE omx_err; + OMX_CONFIG_BRCMRENDERSTATSTYPE renderstats; + + if (!m_hdmi_clock_sync || !m_omx_render.IsInitialized()) + return false; + OMX_INIT_STRUCTURE(renderstats); + renderstats.nPortIndex = m_omx_render.GetInputPort(); + + omx_err = m_omx_render.GetParameter(OMX_IndexConfigBrcmRenderStats, &renderstats); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXVideo::GetPlayerInfo error GetParameter OMX_IndexParamPortDefinition omx_err(0x%08x)\n", omx_err); + return false; + } + match = renderstats.nMatch * 1e-6; + phase = (double)renderstats.nPhase / (double)renderstats.nPeriod; + pll = (double)renderstats.nPixelClock / (double)renderstats.nPixelClockNominal; + return true; +} + + int COMXVideo::Decode(uint8_t *pData, int iSize, double pts) { CSingleLock lock (m_critSection); diff --git a/xbmc/cores/omxplayer/OMXVideo.h b/xbmc/cores/omxplayer/OMXVideo.h index c8fd5fbce4..9f26427330 100644 --- a/xbmc/cores/omxplayer/OMXVideo.h +++ b/xbmc/cores/omxplayer/OMXVideo.h @@ -61,6 +61,7 @@ public: std::string GetDecoderName() { return m_video_codec_name; }; void SetVideoRect(const CRect& SrcRect, const CRect& DestRect, RENDER_STEREO_MODE video_mode, RENDER_STEREO_MODE display_mode); int GetInputBufferSize(); + bool GetPlayerInfo(double &match, double &phase, double &pll); void SubmitEOS(); bool IsEOS(); bool SubmittedEOS() const { return m_submitted_eos; } diff --git a/xbmc/dbwrappers/mysqldataset.cpp b/xbmc/dbwrappers/mysqldataset.cpp index 4b0a387083..5ad7723f1b 100644 --- a/xbmc/dbwrappers/mysqldataset.cpp +++ b/xbmc/dbwrappers/mysqldataset.cpp @@ -443,6 +443,7 @@ long MysqlDatabase::nextid(const char* sname) { void MysqlDatabase::start_transaction() { if (active) { + mysql_autocommit(conn, false); CLog::Log(LOGDEBUG,"Mysql Start transaction"); _in_transaction = true; } diff --git a/xbmc/dialogs/GUIDialogContextMenu.h b/xbmc/dialogs/GUIDialogContextMenu.h index 76cf6ca7a6..ce0c2b7b86 100644 --- a/xbmc/dialogs/GUIDialogContextMenu.h +++ b/xbmc/dialogs/GUIDialogContextMenu.h @@ -129,6 +129,8 @@ enum CONTEXT_BUTTON { CONTEXT_BUTTON_CANCELLED = 0, CONTEXT_BUTTON_MOVIESET_ADD_REMOVE_ITEMS, CONTEXT_BUTTON_BROWSE_INTO, CONTEXT_BUTTON_EDIT_SORTTITLE, + CONTEXT_BUTTON_UNDELETE, + CONTEXT_BUTTON_DELETE_ALL, CONTEXT_BUTTON_USER1, CONTEXT_BUTTON_USER2, CONTEXT_BUTTON_USER3, diff --git a/xbmc/dialogs/GUIDialogMediaSource.cpp b/xbmc/dialogs/GUIDialogMediaSource.cpp index bce1378242..533e6afabe 100644 --- a/xbmc/dialogs/GUIDialogMediaSource.cpp +++ b/xbmc/dialogs/GUIDialogMediaSource.cpp @@ -300,10 +300,16 @@ void CGUIDialogMediaSource::OnPathBrowse(int item) // add the recordings dir as needed if (CPVRDirectory::HasRecordings()) { - share1.strPath = "pvr://recordings/"; + share1.strPath = "pvr://recordings/active/"; share1.strName = g_localizeStrings.Get(19017); // TV Recordings extraShares.push_back(share1); } + if (CPVRDirectory::HasDeletedRecordings()) + { + share1.strPath = "pvr://recordings/deleted/"; + share1.strName = g_localizeStrings.Get(19108); // Deleted TV Recordings + extraShares.push_back(share1); + } } else if (m_type == "pictures") { diff --git a/xbmc/dialogs/GUIDialogSeekBar.cpp b/xbmc/dialogs/GUIDialogSeekBar.cpp index 0eabb66e96..686dd3e90b 100644 --- a/xbmc/dialogs/GUIDialogSeekBar.cpp +++ b/xbmc/dialogs/GUIDialogSeekBar.cpp @@ -68,7 +68,7 @@ void CGUIDialogSeekBar::FrameMove() } // update controls - if (!g_application.GetSeekHandler()->InProgress() && !g_infoManager.m_performingSeek + if (!CSeekHandler::Get().InProgress() && !g_infoManager.m_performingSeek && g_infoManager.GetTotalPlayTime()) { // position the bar at our current time CONTROL_SELECT_ITEM(POPUP_SEEK_PROGRESS, (unsigned int)(g_infoManager.GetPlayTime()/g_infoManager.GetTotalPlayTime() * 0.1f)); @@ -76,7 +76,7 @@ void CGUIDialogSeekBar::FrameMove() } else { - CONTROL_SELECT_ITEM(POPUP_SEEK_PROGRESS, (unsigned int)g_application.GetSeekHandler()->GetPercent()); + CONTROL_SELECT_ITEM(POPUP_SEEK_PROGRESS, (unsigned int)CSeekHandler::Get().GetPercent()); SET_CONTROL_LABEL(POPUP_SEEK_LABEL, g_infoManager.GetCurrentSeekTime()); } diff --git a/xbmc/filesystem/PVRDirectory.cpp b/xbmc/filesystem/PVRDirectory.cpp index 7680f58fba..e03a9a04c6 100644 --- a/xbmc/filesystem/PVRDirectory.cpp +++ b/xbmc/filesystem/PVRDirectory.cpp @@ -71,8 +71,13 @@ bool CPVRDirectory::GetDirectory(const CURL& url, CFileItemList &items) item->SetLabelPreformated(true); items.Add(item); - item.reset(new CFileItem(base + "recordings/", true)); - item->SetLabel(g_localizeStrings.Get(19017)); + item.reset(new CFileItem(base + "recordings/active/", true)); + item->SetLabel(g_localizeStrings.Get(19017)); // TV Recordings + item->SetLabelPreformated(true); + items.Add(item); + + item.reset(new CFileItem(base + "recordings/deleted/", true)); + item->SetLabel(g_localizeStrings.Get(19108)); // Deleted TV Recordings item->SetLabelPreformated(true); items.Add(item); @@ -121,3 +126,9 @@ bool CPVRDirectory::HasRecordings() return g_PVRManager.IsStarted() ? g_PVRRecordings->GetNumRecordings() > 0 : false; } + +bool CPVRDirectory::HasDeletedRecordings() +{ + return g_PVRManager.IsStarted() ? + g_PVRRecordings->HasDeletedRecordings() : false; +} diff --git a/xbmc/filesystem/PVRDirectory.h b/xbmc/filesystem/PVRDirectory.h index 5df52899a7..b4443a9e19 100644 --- a/xbmc/filesystem/PVRDirectory.h +++ b/xbmc/filesystem/PVRDirectory.h @@ -38,6 +38,7 @@ public: static bool SupportsWriteFileOperations(const std::string& strPath); static bool IsLiveTV(const std::string& strPath); static bool HasRecordings(); + static bool HasDeletedRecordings(); virtual bool Exists(const CURL& url); diff --git a/xbmc/filesystem/PVRFile.cpp b/xbmc/filesystem/PVRFile.cpp index 0563dd7e9a..2b6a3ac4a1 100644 --- a/xbmc/filesystem/PVRFile.cpp +++ b/xbmc/filesystem/PVRFile.cpp @@ -70,7 +70,7 @@ bool CPVRFile::Open(const CURL& url) return false; } } - else if (StringUtils::StartsWith(strURL, "pvr://recordings/")) + else if (StringUtils::StartsWith(strURL, "pvr://recordings/active")) { CFileItemPtr tag = g_PVRRecordings->GetByPath(strURL); if (tag && tag->HasPVRRecordingInfoTag()) @@ -87,6 +87,11 @@ bool CPVRFile::Open(const CURL& url) return false; } } + else if (StringUtils::StartsWith(strURL, "pvr://recordings/deleted/")) + { + CLog::Log(LOGNOTICE, "PVRFile - Playback of deleted recordings is not possible (%s)", strURL.c_str()); + return false; + } else { CLog::Log(LOGERROR, "%s - invalid path specified %s", __FUNCTION__, strURL.c_str()); @@ -298,7 +303,7 @@ bool CPVRFile::Rename(const CURL& url, const CURL& urlnew) if (found != std::string::npos) newname = newname.substr(found+1); - if (StringUtils::StartsWith(path, "recordings/") && path[path.size()-1] != '/') + if (StringUtils::StartsWith(path, "recordings/active/") && path[path.size()-1] != '/') { std::string strURL = url.Get(); CFileItemPtr tag = g_PVRRecordings->GetByPath(strURL); diff --git a/xbmc/filesystem/SAPFile.cpp b/xbmc/filesystem/SAPFile.cpp index fe7b7f6106..1ca8361e84 100644 --- a/xbmc/filesystem/SAPFile.cpp +++ b/xbmc/filesystem/SAPFile.cpp @@ -115,12 +115,10 @@ int CSAPFile::Stat(const CURL& url, struct __stat64* buffer) ssize_t CSAPFile::Read(void *lpBuf, size_t uiBufSize) { - if (uiBufSize > SSIZE_MAX) - uiBufSize = SSIZE_MAX; if (uiBufSize > std::numeric_limits<std::streamsize>::max()) - uiBufSize = (size_t)std::numeric_limits<std::streamsize>::max(); + uiBufSize = static_cast<size_t>(std::numeric_limits<std::streamsize>::max()); - return (ssize_t)m_stream.readsome((char*)lpBuf, (streamsize)uiBufSize); + return static_cast<ssize_t>(m_stream.readsome((char*)lpBuf, static_cast<std::streamsize>(uiBufSize))); } void CSAPFile::Close() diff --git a/xbmc/guilib/GUIControl.h b/xbmc/guilib/GUIControl.h index a2b567443b..1f2433d7c6 100644 --- a/xbmc/guilib/GUIControl.h +++ b/xbmc/guilib/GUIControl.h @@ -219,6 +219,7 @@ public: virtual void SetInvalid() { m_bInvalidated = true; }; virtual void SetPulseOnSelect(bool pulse) { m_pulseOnSelect = pulse; }; virtual std::string GetDescription() const { return ""; }; + virtual std::string GetDescriptionByIndex(int index) const { return ""; }; void SetAnimations(const std::vector<CAnimation> &animations); const std::vector<CAnimation> &GetAnimations() const { return m_animations; }; diff --git a/xbmc/guilib/GUIEditControl.cpp b/xbmc/guilib/GUIEditControl.cpp index 72f2f70d81..eb1fcdbafd 100644 --- a/xbmc/guilib/GUIEditControl.cpp +++ b/xbmc/guilib/GUIEditControl.cpp @@ -748,3 +748,13 @@ void CGUIEditControl::SetFocus(bool focus) CGUIControl::SetFocus(focus); SetInvalid(); } + +std::string CGUIEditControl::GetDescriptionByIndex(int index) const +{ + if (index == 0) + return GetDescription(); + else if(index == 1) + return GetLabel2(); + + return ""; +} diff --git a/xbmc/guilib/GUIEditControl.h b/xbmc/guilib/GUIEditControl.h index 6462f91e12..b6179de1ac 100644 --- a/xbmc/guilib/GUIEditControl.h +++ b/xbmc/guilib/GUIEditControl.h @@ -92,6 +92,7 @@ protected: virtual void RenderText(); virtual CGUILabel::COLOR GetTextColor() const; std::wstring GetDisplayedText() const; + std::string GetDescriptionByIndex(int index) const; bool SetStyledText(const std::wstring &text); void RecalcLabelPosition(); void ValidateCursor(); diff --git a/xbmc/guilib/XBTFReader.cpp b/xbmc/guilib/XBTFReader.cpp index 7dafc1ff4d..e5cb0e884f 100644 --- a/xbmc/guilib/XBTFReader.cpp +++ b/xbmc/guilib/XBTFReader.cpp @@ -31,16 +31,16 @@ #include "PlatformDefs.h" #define READ_STR(str, size, file) \ - if (!fread(str, size, 1, file)) \ + if (1 != fread(str, size, 1, file)) \ return false; #define READ_U32(i, file) \ - if (!fread(&i, 4, 1, file)) \ + if (1 != fread(&i, 4, 1, file)) \ return false; \ i = Endian_SwapLE32(i); #define READ_U64(i, file) \ - if (!fread(&i, 8, 1, file)) \ + if (1 != fread(&i, 8, 1, file)) \ return false; \ i = Endian_SwapLE64(i); diff --git a/xbmc/input/ButtonTranslator.cpp b/xbmc/input/ButtonTranslator.cpp index f3e2ad2103..c748ff86e0 100644 --- a/xbmc/input/ButtonTranslator.cpp +++ b/xbmc/input/ButtonTranslator.cpp @@ -796,7 +796,6 @@ void CButtonTranslator::MapJoystickFamily(TiXmlNode *pNode) void CButtonTranslator::MapJoystickActions(int windowID, TiXmlNode *pJoystick) { - string joyname = JOYSTICK_DEFAULT_MAP; // default global map name std::string joyFamilyName; map<int, string> buttonMap; map<int, string> axisMap; @@ -804,17 +803,21 @@ void CButtonTranslator::MapJoystickActions(int windowID, TiXmlNode *pJoystick) ActionMap hatMap; TiXmlElement *pJoy = pJoystick->ToElement(); - if (pJoy && pJoy->Attribute("name")) { + if (pJoy && pJoy->Attribute("family")) + joyFamilyName = pJoy->Attribute("family"); + else if (pJoy) { // transform loose name to new family, including altnames - std::string joyName = pJoy->Attribute("name"); + string joyName = JOYSTICK_DEFAULT_MAP; // default global map name + if (pJoy->Attribute("name")) + joyName = pJoy->Attribute("name"); joyFamilyName = joyName; JoystickFamily* joyFamily = &m_joystickFamilies[joyFamilyName]; std::shared_ptr<CRegExp> re(new CRegExp(true, CRegExp::asciiOnly)); - std::string joyRe = JoynameToRegex(joyname); + std::string joyRe = JoynameToRegex(joyName); if (!re->RegComp(joyRe, CRegExp::StudyRegExp)) { - CLog::Log(LOGNOTICE, "Invalid joystick regex specified: '%s'", joyname.c_str()); + CLog::Log(LOGNOTICE, "Invalid joystick regex specified: '%s'", joyName.c_str()); return; } AddFamilyRegex(joyFamily, re); @@ -836,11 +839,6 @@ void CButtonTranslator::MapJoystickActions(int windowID, TiXmlNode *pJoystick) } } - else if (pJoy && pJoy->Attribute("family")) - joyFamilyName = pJoy->Attribute("family"); - else - CLog::Log(LOGNOTICE, "No Joystick name specified, loading default map"); - // parse map TiXmlElement *pButton = pJoystick->FirstChildElement(); diff --git a/xbmc/interfaces/Builtins.cpp b/xbmc/interfaces/Builtins.cpp index 399460875a..501e80b428 100644 --- a/xbmc/interfaces/Builtins.cpp +++ b/xbmc/interfaces/Builtins.cpp @@ -61,6 +61,7 @@ #include "settings/SkinSettings.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" +#include "video/VideoLibraryQueue.h" #include "Util.h" #include "URL.h" #include "music/MusicDatabase.h" @@ -1458,8 +1459,8 @@ int CBuiltins::Execute(const std::string& execString) if (g_application.IsMusicScanning()) g_application.StopMusicScan(); - if (g_application.IsVideoScanning()) - g_application.StopVideoScan(); + if (CVideoLibraryQueue::Get().IsRunning()) + CVideoLibraryQueue::Get().CancelAllJobs(); ADDON::CAddonMgr::Get().StopServices(true); diff --git a/xbmc/interfaces/json-rpc/VideoLibrary.cpp b/xbmc/interfaces/json-rpc/VideoLibrary.cpp index 4f5ed89b94..7c83745bc2 100644 --- a/xbmc/interfaces/json-rpc/VideoLibrary.cpp +++ b/xbmc/interfaces/json-rpc/VideoLibrary.cpp @@ -1024,7 +1024,7 @@ void CVideoLibrary::UpdateVideoTag(const CVariant ¶meterObject, CVideoInfoTa if (ParameterNotNull(parameterObject, "lastplayed")) SetFromDBDateTime(parameterObject["lastplayed"], details.m_lastPlayed); if (ParameterNotNull(parameterObject, "firstaired")) - SetFromDBDateTime(parameterObject["firstaired"], details.m_firstAired); + SetFromDBDate(parameterObject["firstaired"], details.m_firstAired); if (ParameterNotNull(parameterObject, "productioncode")) details.m_strProductionCode = parameterObject["productioncode"].asString(); if (ParameterNotNull(parameterObject, "season")) diff --git a/xbmc/interfaces/json-rpc/schema/version.txt b/xbmc/interfaces/json-rpc/schema/version.txt index fe6750473a..261151bf6c 100644 --- a/xbmc/interfaces/json-rpc/schema/version.txt +++ b/xbmc/interfaces/json-rpc/schema/version.txt @@ -1 +1 @@ -6.22.0 +6.22.1 diff --git a/xbmc/interfaces/python/XBPython.cpp b/xbmc/interfaces/python/XBPython.cpp index f179b12dca..f205510071 100644 --- a/xbmc/interfaces/python/XBPython.cpp +++ b/xbmc/interfaces/python/XBPython.cpp @@ -585,7 +585,6 @@ bool XBPython::OnScriptInitialized(ILanguageInvoker *invoker) CLog::Log(LOGDEBUG, "PYTHONHOME -> %s", CSpecialProtocol::TranslatePath("special://frameworks").c_str()); CLog::Log(LOGDEBUG, "PYTHONPATH -> %s", CSpecialProtocol::TranslatePath("special://frameworks").c_str()); } - setenv("PYTHONCASEOK", "1", 1); //This line should really be removed #elif defined(TARGET_WINDOWS) // because the third party build of python is compiled with vs2008 we need // a hack to set the PYTHONPATH diff --git a/xbmc/linux/OMXCore.cpp b/xbmc/linux/OMXCore.cpp index 4ba2e4bc4b..5f91787a15 100644 --- a/xbmc/linux/OMXCore.cpp +++ b/xbmc/linux/OMXCore.cpp @@ -420,7 +420,7 @@ void COMXCoreComponent::FlushAll() void COMXCoreComponent::FlushInput() { - if(!m_handle) + if(!m_handle || m_resource_error) return; OMX_ERRORTYPE omx_err = OMX_SendCommand(m_handle, OMX_CommandFlush, m_input_port, NULL); @@ -435,7 +435,7 @@ void COMXCoreComponent::FlushInput() void COMXCoreComponent::FlushOutput() { - if(!m_handle) + if(!m_handle || m_resource_error) return; OMX_ERRORTYPE omx_err = OMX_SendCommand(m_handle, OMX_CommandFlush, m_output_port, NULL); diff --git a/xbmc/music/MusicDatabase.cpp b/xbmc/music/MusicDatabase.cpp index 98d0ad9913..6b80ccd8ea 100644 --- a/xbmc/music/MusicDatabase.cpp +++ b/xbmc/music/MusicDatabase.cpp @@ -178,6 +178,9 @@ void CMusicDatabase::CreateTables() CLog::Log(LOGINFO, "create art table"); m_pDS->exec("CREATE TABLE art(art_id INTEGER PRIMARY KEY, media_id INTEGER, media_type TEXT, type TEXT, url TEXT)"); + CLog::Log(LOGINFO, "create cue table"); + m_pDS->exec("CREATE TABLE cue (idPath integer, strFileName text, strCuesheet text)"); + // Add 'Karaoke' genre AddGenre( "Karaoke" ); } @@ -226,6 +229,8 @@ void CMusicDatabase::CreateAnalytics() m_pDS->exec("CREATE INDEX ix_art ON art(media_id, media_type(20), type(20))"); + m_pDS->exec("CREATE UNIQUE INDEX idxCue ON cue(idPath, strFileName(255))"); + CLog::Log(LOGINFO, "create triggers"); m_pDS->exec("CREATE TRIGGER tgrDeleteAlbum AFTER delete ON album FOR EACH ROW BEGIN" " DELETE FROM song WHERE song.idAlbum = old.idAlbum;" @@ -246,6 +251,9 @@ void CMusicDatabase::CreateAnalytics() " DELETE FROM karaokedata WHERE karaokedata.idSong = old.idSong;" " DELETE FROM art WHERE media_id=old.idSong AND media_type='song';" " END"); + m_pDS->exec("CREATE TRIGGER tgrDeletePath AFTER delete ON path FOR EACH ROW BEGIN" + " DELETE FROM cue WHERE cue.idPath = old.idPath;" + " END"); // we create views last to ensure all indexes are rolled in CreateViews(); @@ -367,6 +375,105 @@ std::string GetArtistString(const VECARTISTCREDITS &credits) return artistString; } +void CMusicDatabase::SaveCuesheet(const std::string& fullSongPath, const std::string& strCuesheet) +{ + std::string strPath, strFileName; + URIUtils::Split(fullSongPath, strPath, strFileName); + + int idPath = AddPath(strPath); + + if (idPath == -1) + return; + + std::string strSQL; + try + { + CueCache::const_iterator it; + + it = m_cueCache.find(fullSongPath); + if (it != m_cueCache.end() && it->second == strCuesheet) + return; + + if (NULL == m_pDB.get()) + return; + + if (NULL == m_pDS.get()) + return; + + strSQL = PrepareSQL("SELECT * FROM cue WHERE idPath=%i AND strFileName='%s'", idPath, strFileName.c_str()); + m_pDS->query(strSQL.c_str()); + if (m_pDS->num_rows() == 0) + { + if (strCuesheet.empty()) + { + m_pDS->close(); + m_cueCache.insert(CueCache::value_type(fullSongPath, strCuesheet)); + return; + } + strSQL = PrepareSQL("INSERT INTO cue (idPath, strFileName, strCuesheet) VALUES(%i, '%s', '%s')", + idPath, strFileName.c_str(), strCuesheet.c_str()); + } + else + { + if (strCuesheet.empty()) + { + strSQL = PrepareSQL("DELETE FROM cue SET WHERE idPath=%i AND strFileName='%s'", idPath, strFileName.c_str()); + } + else + { + strSQL = PrepareSQL("UPDATE cue SET strCuesheet='%s') WHERE idPath=%i AND strFileName='%s'", + strCuesheet.c_str(), idPath, strFileName.c_str()); + } + } + m_pDS->close(); + m_pDS->exec(strSQL.c_str()); + m_cueCache.insert(CueCache::value_type(fullSongPath, strCuesheet)); + } + catch (...) + { + CLog::Log(LOGERROR, "musicdatabase:unable to addcue (%s)", strSQL.c_str()); + } +} + +std::string CMusicDatabase::LoadCuesheet(const std::string& fullSongPath) +{ + CueCache::const_iterator it; + it = m_cueCache.find(fullSongPath); + if (it != m_cueCache.end()) + return it->second; + + std::string strCuesheet; + + std::string strPath, strFileName; + URIUtils::Split(fullSongPath, strPath, strFileName); + + int idPath = AddPath(strPath); + if (idPath == -1) + return strCuesheet; + + std::string strSQL; + try + { + if (NULL == m_pDB.get()) + return strCuesheet; + + if (NULL == m_pDS.get()) + return strCuesheet; + + strSQL = PrepareSQL("select strCuesheet from cue where idPath=%i AND strFileName='%s'", idPath, strFileName.c_str()); + m_pDS->query(strSQL.c_str()); + + if (0 < m_pDS->num_rows()) + strCuesheet = m_pDS->get_sql_record()->at(0).get_asString(); + m_pDS->close(); + } + catch (...) + { + CLog::Log(LOGERROR, "musicdatabase:unable to loadcue (%s)", strSQL.c_str()); + } + return strCuesheet; +} + bool CMusicDatabase::AddAlbum(CAlbum& album) { BeginTransaction(); @@ -404,6 +511,7 @@ bool CMusicDatabase::AddAlbum(CAlbum& album) song->lastPlayed, song->rating, song->iKaraokeNumber); + for (VECARTISTCREDITS::iterator artistCredit = song->artistCredits.begin(); artistCredit != song->artistCredits.end(); ++artistCredit) { artistCredit->idArtist = AddArtist(artistCredit->GetArtist(), @@ -415,6 +523,8 @@ bool CMusicDatabase::AddAlbum(CAlbum& album) artistCredit == song->artistCredits.begin() ? false : true, std::distance(song->artistCredits.begin(), artistCredit)); } + + SaveCuesheet(song->strFileName, song->strCueSheet); } for (VECSONGS::const_iterator infoSong = album.infoSongs.begin(); infoSong != album.infoSongs.end(); ++infoSong) AddAlbumInfoSong(album.idAlbum, *infoSong); @@ -488,6 +598,8 @@ bool CMusicDatabase::UpdateAlbum(CAlbum& album) artistCredit == song->artistCredits.begin() ? false : true, std::distance(song->artistCredits.begin(), artistCredit)); } + + SaveCuesheet(song->strFileName, song->strCueSheet); } for (VECSONGS::const_iterator infoSong = album.infoSongs.begin(); infoSong != album.infoSongs.end(); ++infoSong) AddAlbumInfoSong(album.idAlbum, *infoSong); @@ -3921,11 +4033,15 @@ void CMusicDatabase::UpdateTables(int version) m_pDS->exec("UPDATE karaokedata SET strKaraLyrFileCRC=NULL"); m_pDS->exec("UPDATE album SET idThumb=NULL"); } + if (version < 49) + { + m_pDS->exec("CREATE TABLE cue (idPath integer, strFileName text, strCuesheet text)"); + } } int CMusicDatabase::GetSchemaVersion() const { - return 48; + return 49; } unsigned int CMusicDatabase::GetSongIDs(const Filter &filter, vector<pair<int,int> > &songIDs) diff --git a/xbmc/music/MusicDatabase.h b/xbmc/music/MusicDatabase.h index 52d08b69e7..5e69b3b5a0 100644 --- a/xbmc/music/MusicDatabase.h +++ b/xbmc/music/MusicDatabase.h @@ -263,6 +263,12 @@ public: int GetArtistByName(const std::string& strArtist); ///////////////////////////////////////////////// + // Cuesheets + ///////////////////////////////////////////////// + void SaveCuesheet(const std::string& fullSongPath, const std::string& strCuesheet); + std::string LoadCuesheet(const std::string& fullSongPath); + + ///////////////////////////////////////////////// // Paths ///////////////////////////////////////////////// int AddPath(const std::string& strPath); @@ -465,6 +471,8 @@ protected: std::map<std::string, int> m_pathCache; std::map<std::string, int> m_thumbCache; std::map<std::string, CAlbum> m_albumCache; + typedef std::map<std::string, std::string> CueCache; + CueCache m_cueCache; virtual void CreateTables(); virtual void CreateAnalytics(); diff --git a/xbmc/music/MusicInfoLoader.cpp b/xbmc/music/MusicInfoLoader.cpp index 7b51fd7c96..c0140f9f49 100644 --- a/xbmc/music/MusicInfoLoader.cpp +++ b/xbmc/music/MusicInfoLoader.cpp @@ -177,6 +177,7 @@ bool CMusicInfoLoader::LoadItemLookup(CFileItem* pItem) if (it != m_songsMap.end()) { // Have we loaded this item from database before pItem->GetMusicInfoTag()->SetSong(it->second); + pItem->GetMusicInfoTag()->SetCueSheet(m_musicDatabase.LoadCuesheet(it->second.strFileName)); if (!it->second.strThumb.empty()) pItem->SetArt("thumb", it->second.strThumb); } diff --git a/xbmc/music/Song.cpp b/xbmc/music/Song.cpp index fe88466e1d..dc9f41011e 100644 --- a/xbmc/music/Song.cpp +++ b/xbmc/music/Song.cpp @@ -68,6 +68,7 @@ CSong::CSong(CFileItem& item) albumArtist = tag.GetAlbumArtist(); strMusicBrainzTrackID = tag.GetMusicBrainzTrackID(); strComment = tag.GetComment(); + strCueSheet = tag.GetCueSheet(); rating = tag.GetRating(); iYear = stTime.wYear; iTrack = tag.GetTrackAndDiscNumber(); diff --git a/xbmc/music/Song.h b/xbmc/music/Song.h index 594af187e0..c80e1f3133 100644 --- a/xbmc/music/Song.h +++ b/xbmc/music/Song.h @@ -92,6 +92,7 @@ public: MUSIC_INFO::EmbeddedArtInfo embeddedArt; std::string strMusicBrainzTrackID; std::string strComment; + std::string strCueSheet; char rating; int iTrack; int iDuration; diff --git a/xbmc/music/infoscanner/MusicInfoScanner.cpp b/xbmc/music/infoscanner/MusicInfoScanner.cpp index cb17456a6e..8f2a891312 100644 --- a/xbmc/music/infoscanner/MusicInfoScanner.cpp +++ b/xbmc/music/infoscanner/MusicInfoScanner.cpp @@ -52,6 +52,7 @@ #include "GUIUserMessages.h" #include "addons/AddonManager.h" #include "addons/Scraper.h" +#include "CueDocument.h" #include <algorithm> @@ -538,14 +539,23 @@ INFO_RET CMusicInfoScanner::ScanTags(const CFileItemList& items, CFileItemList& } if (m_handle && m_itemCount>0) - m_handle->SetPercentage(m_currentItem/(float)m_itemCount*100); + m_handle->SetPercentage(m_currentItem / (float)m_itemCount * 100); - if (!tag.Loaded()) + if (!tag.Loaded() && !pItem->HasCueDocument()) { CLog::Log(LOGDEBUG, "%s - No tag found for: %s", __FUNCTION__, pItem->GetPath().c_str()); continue; } - scannedItems.Add(pItem); + else + { + if (!tag.GetCueSheet().empty()) + pItem->LoadEmbeddedCue(); + } + + if (pItem->HasCueDocument()) + pItem->LoadTracksFromCueDocument(scannedItems); + else + scannedItems.Add(pItem); } return INFO_ADDED; } diff --git a/xbmc/music/tags/MusicInfoTag.cpp b/xbmc/music/tags/MusicInfoTag.cpp index 1b4f19f7eb..fa9c110c00 100644 --- a/xbmc/music/tags/MusicInfoTag.cpp +++ b/xbmc/music/tags/MusicInfoTag.cpp @@ -112,6 +112,7 @@ const CMusicInfoTag& CMusicInfoTag::operator =(const CMusicInfoTag& tag) m_strMusicBrainzTRMID = tag.m_strMusicBrainzTRMID; m_strComment = tag.m_strComment; m_strLyrics = tag.m_strLyrics; + m_cuesheet = tag.m_cuesheet; m_lastPlayed = tag.m_lastPlayed; m_bCompilation = tag.m_bCompilation; m_iDuration = tag.m_iDuration; @@ -238,6 +239,11 @@ const std::string &CMusicInfoTag::GetLyrics() const return m_strLyrics; } +const std::string &CMusicInfoTag::GetCueSheet() const +{ + return m_cuesheet; +} + char CMusicInfoTag::GetRating() const { return m_rating; @@ -394,6 +400,11 @@ void CMusicInfoTag::SetComment(const std::string& comment) m_strComment = comment; } +void CMusicInfoTag::SetCueSheet(const std::string& cueSheet) +{ + m_cuesheet = cueSheet; +} + void CMusicInfoTag::SetLyrics(const std::string& lyrics) { m_strLyrics = lyrics; @@ -556,6 +567,7 @@ void CMusicInfoTag::SetSong(const CSong& song) SetAlbumArtist(song.albumArtist); SetMusicBrainzTrackID(song.strMusicBrainzTrackID); SetComment(song.strComment); + SetCueSheet(song.strCueSheet); SetPlayCount(song.iTimesPlayed); SetLastPlayed(song.lastPlayed); SetCoverArtInfo(song.embeddedArt.size, song.embeddedArt.mime); @@ -663,6 +675,7 @@ void CMusicInfoTag::Archive(CArchive& ar) ar << m_bCompilation; ar << m_listeners; ar << m_coverArt; + ar << m_cuesheet; } else { @@ -692,6 +705,7 @@ void CMusicInfoTag::Archive(CArchive& ar) ar >> m_bCompilation; ar >> m_listeners; ar >> m_coverArt; + ar >> m_cuesheet; } } @@ -714,6 +728,7 @@ void CMusicInfoTag::Clear() m_lastPlayed.Reset(); m_bCompilation = false; m_strComment.clear(); + m_cuesheet.clear(); m_rating = '0'; m_iDbId = -1; m_type.clear(); diff --git a/xbmc/music/tags/MusicInfoTag.h b/xbmc/music/tags/MusicInfoTag.h index c2ff04b38e..4e031c3a3d 100644 --- a/xbmc/music/tags/MusicInfoTag.h +++ b/xbmc/music/tags/MusicInfoTag.h @@ -102,6 +102,7 @@ public: const std::string& GetMusicBrainzTRMID() const; const std::string& GetComment() const; const std::string& GetLyrics() const; + const std::string& GetCueSheet() const; const CDateTime& GetLastPlayed() const; bool GetCompilation() const; char GetRating() const; @@ -142,6 +143,7 @@ public: void SetMusicBrainzTRMID(const std::string& strTRMID); void SetComment(const std::string& comment); void SetLyrics(const std::string& lyrics); + void SetCueSheet(const std::string& cueSheet); void SetRating(char rating); void SetListeners(int listeners); void SetPlayCount(int playcount); @@ -197,6 +199,7 @@ protected: std::string m_strMusicBrainzTRMID; std::string m_strComment; std::string m_strLyrics; + std::string m_cuesheet; CDateTime m_lastPlayed; bool m_bCompilation; int m_iDuration; diff --git a/xbmc/music/tags/TagLoaderTagLib.cpp b/xbmc/music/tags/TagLoaderTagLib.cpp index 7058e278be..5e1ef3348b 100644 --- a/xbmc/music/tags/TagLoaderTagLib.cpp +++ b/xbmc/music/tags/TagLoaderTagLib.cpp @@ -495,6 +495,7 @@ bool CTagLoaderTagLib::ParseAPETag(APE::Tag *ape, EmbeddedArt *art, CMusicInfoTa else if (it->first == "YEAR") tag.SetYear(it->second.toString().toInt()); else if (it->first == "GENRE") SetGenre(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "COMMENT") tag.SetComment(it->second.toString().to8Bit(true)); + else if (it->first == "CUESHEET") tag.SetCueSheet(it->second.toString().to8Bit(true)); else if (it->first == "ENCODEDBY") {} else if (it->first == "COMPILATION") tag.SetCompilation(it->second.toString().toInt() == 1); else if (it->first == "LYRICS") tag.SetLyrics(it->second.toString().to8Bit(true)); @@ -535,6 +536,7 @@ bool CTagLoaderTagLib::ParseXiphComment(Ogg::XiphComment *xiph, EmbeddedArt *art else if (it->first == "DATE") tag.SetYear(it->second.front().toInt()); else if (it->first == "GENRE") SetGenre(tag, StringListToVectorString(it->second)); else if (it->first == "COMMENT") tag.SetComment(it->second.front().to8Bit(true)); + else if (it->first == "CUESHEET") tag.SetCueSheet(it->second.front().to8Bit(true)); else if (it->first == "ENCODEDBY") {} else if (it->first == "ENSEMBLE") {} else if (it->first == "COMPILATION") tag.SetCompilation(it->second.front().toInt() == 1); diff --git a/xbmc/music/windows/GUIWindowMusicBase.cpp b/xbmc/music/windows/GUIWindowMusicBase.cpp index 2e6f6329d0..5766a60532 100644 --- a/xbmc/music/windows/GUIWindowMusicBase.cpp +++ b/xbmc/music/windows/GUIWindowMusicBase.cpp @@ -67,6 +67,8 @@ #include "URL.h" #include "music/infoscanner/MusicInfoScanner.h" #include "cores/IPlayer.h" +#include "CueDocument.h" + using namespace std; using namespace XFILE; @@ -519,6 +521,38 @@ void CGUIWindowMusicBase::RetrieveMusicInfo() OnRetrieveMusicInfo(*m_vecItems); + // \todo Scan for multitrack items here... + vector<string> itemsForRemove; + CFileItemList itemsForAdd; + for (int i = 0; i < m_vecItems->Size(); ++i) + { + CFileItemPtr pItem = (*m_vecItems)[i]; + if (pItem->m_bIsFolder || pItem->IsPlayList() || pItem->IsPicture() || pItem->IsLyrics()) + continue; + + CMusicInfoTag& tag = *pItem->GetMusicInfoTag(); + if (tag.Loaded() && !tag.GetCueSheet().empty()) + pItem->LoadEmbeddedCue(); + + if (pItem->HasCueDocument() + && pItem->LoadTracksFromCueDocument(itemsForAdd)) + { + itemsForRemove.push_back(pItem->GetPath()); + } + } + for (size_t i = 0; i < itemsForRemove.size(); ++i) + { + for (int j = 0; j < m_vecItems->Size(); ++j) + { + if ((*m_vecItems)[j]->GetPath() == itemsForRemove[i]) + { + m_vecItems->Remove(j); + break; + } + } + } + m_vecItems->Append(itemsForAdd); + CLog::Log(LOGDEBUG, "RetrieveMusicInfo() took %u msec", XbmcThreads::SystemClockMillis() - startTick); } diff --git a/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp b/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp index 2fffff3628..49ea8a3094 100644 --- a/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp +++ b/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp @@ -37,6 +37,12 @@ int CHTTPJsonRpcHandler::HandleRequest() { CHTTPClient client; bool isRequest = false; + std::string jsonpCallback; + + // get all query arguments + std::map<std::string, std::string> arguments; + CWebServer::GetRequestHeaderValues(m_request.connection, MHD_GET_ARGUMENT_KIND, arguments); + if (m_request.method == POST) { std::string contentType = CWebServer::GetRequestHeaderValue(m_request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CONTENT_TYPE); @@ -54,27 +60,45 @@ int CHTTPJsonRpcHandler::HandleRequest() } else if (m_request.method == GET) { - std::map<std::string, std::string> arguments; - if (CWebServer::GetRequestHeaderValues(m_request.connection, MHD_GET_ARGUMENT_KIND, arguments) > 0) + std::map<std::string, std::string>::const_iterator argument = arguments.find("request"); + if (argument != arguments.end() && !argument->second.empty()) { - std::map<std::string, std::string>::const_iterator argument = arguments.find("request"); - if (argument != arguments.end() && !argument->second.empty()) - { - m_requestData = argument->second; - isRequest = true; - } + m_requestData = argument->second; + isRequest = true; } } + std::map<std::string, std::string>::const_iterator argument = arguments.find("jsonp"); + if (argument != arguments.end() && !argument->second.empty()) + jsonpCallback = argument->second; + else + { + argument = arguments.find("callback"); + if (argument != arguments.end() && !argument->second.empty()) + jsonpCallback = argument->second; + } + if (isRequest) + { m_responseData = JSONRPC::CJSONRPC::MethodCall(m_requestData, m_request.webserver, &client); - else + + if (!jsonpCallback.empty()) + m_responseData = jsonpCallback + "(" + m_responseData + ");"; + } + else if (jsonpCallback.empty()) { // get the whole output of JSONRPC.Introspect CVariant result; JSONRPC::CJSONServiceDescription::Print(result, m_request.webserver, &client); m_responseData = CJSONVariantWriter::Write(result, false); } + else + { + m_response.type = HTTPError; + m_response.status = MHD_HTTP_BAD_REQUEST; + + return MHD_YES; + } m_requestData.clear(); diff --git a/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp b/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp index 4e1e45a1c5..0507e51845 100644 --- a/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp +++ b/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp @@ -89,8 +89,8 @@ int CHTTPWebinterfaceHandler::ResolveUrl(const std::string &url, std::string &pa if (useDefaultWebInterface) { - ADDON::CAddonMgr::Get().GetDefault(ADDON::ADDON_WEB_INTERFACE, addon); - if (addon) + + if (ADDON::CAddonMgr::Get().GetDefault(ADDON::ADDON_WEB_INTERFACE, addon) && addon) addonPath = addon->Path(); } diff --git a/xbmc/network/upnp/UPnPServer.cpp b/xbmc/network/upnp/UPnPServer.cpp index e2fe2f9417..364b31d1f4 100644 --- a/xbmc/network/upnp/UPnPServer.cpp +++ b/xbmc/network/upnp/UPnPServer.cpp @@ -278,9 +278,11 @@ CUPnPServer::Build(CFileItemPtr item, object->m_ObjectID = "0"; object->m_ParentID = "-1"; // root has 5 children - if (with_count) { - ((PLT_MediaContainer*)object)->m_ChildrenCount = 5; - } + + //This is dead code because of the HACK a few lines up setting with_count to false + //if (with_count) { + // ((PLT_MediaContainer*)object)->m_ChildrenCount = 5; + //} } else { goto failure; } diff --git a/xbmc/osx/IOSEAGLView.h b/xbmc/osx/IOSEAGLView.h index 6440300d71..dfb45be9b1 100644 --- a/xbmc/osx/IOSEAGLView.h +++ b/xbmc/osx/IOSEAGLView.h @@ -47,11 +47,6 @@ NSThread* animationThread; UIScreen *currentScreen; - // Use of the CADisplayLink class is the preferred method for controlling the animation timing. - // CADisplayLink will link to the main display and fire every vsync when added to a given run-loop. - CADisplayLink *displayLink; - CFTimeInterval displayFPS; - BOOL displayLinkSupported; BOOL framebufferResizeRequested; } @property (readonly, nonatomic, getter=isAnimating) BOOL animating; @@ -62,9 +57,6 @@ @property BOOL framebufferResizeRequested; - (id)initWithFrame:(CGRect)frame withScreen:(UIScreen *)screen; -- (void) initDisplayLink; -- (void) deinitDisplayLink; -- (double) getDisplayLinkFPS; - (void) pauseAnimation; - (void) resumeAnimation; - (void) startAnimation; diff --git a/xbmc/osx/IOSEAGLView.mm b/xbmc/osx/IOSEAGLView.mm index 50cdf80986..51a7e31109 100644 --- a/xbmc/osx/IOSEAGLView.mm +++ b/xbmc/osx/IOSEAGLView.mm @@ -100,11 +100,9 @@ if(framebufferResizeRequested) { framebufferResizeRequested = FALSE; - [self deinitDisplayLink]; [self deleteFramebuffer]; [self createFramebuffer]; - [self setFramebuffer]; - [self initDisplayLink]; + [self setFramebuffer]; } } @@ -193,8 +191,6 @@ [self setContext:context]; [self createFramebuffer]; [self setFramebuffer]; - - displayLink = nil; } return self; @@ -351,7 +347,6 @@ selector:@selector(runAnimation:) object:animationThreadLock]; [animationThread start]; - [self initDisplayLink]; } } //-------------------------------------------------------------- @@ -360,7 +355,6 @@ PRINT_SIGNATURE(); if (animating && context) { - [self deinitDisplayLink]; animating = FALSE; xbmcAlive = FALSE; if (!g_application.m_bStop) @@ -448,52 +442,5 @@ //[g_xbmcController applicationDidExit]; exit(0); } - -//-------------------------------------------------------------- -- (void) runDisplayLink; -{ - NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; - - displayFPS = 1.0 / ([displayLink duration] * [displayLink frameInterval]); - if (animationThread && [animationThread isExecuting] == YES) - { - if (g_VideoReferenceClock.IsRunning()) - g_Windowing.VblankHandler(CurrentHostCounter(), displayFPS); - } - [pool release]; -} -//-------------------------------------------------------------- -- (void) initDisplayLink -{ - //init with the appropriate display link for the - //used screen - bool external = currentScreen != [UIScreen mainScreen]; - - if(external) - { - fprintf(stderr,"InitDisplayLink on external"); - } - else - { - fprintf(stderr,"InitDisplayLink on internal"); - } - - - displayLink = [currentScreen displayLinkWithTarget:self selector:@selector(runDisplayLink)]; - [displayLink setFrameInterval:1]; - [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; - displayFPS = 1.0 / ([displayLink duration] * [displayLink frameInterval]); -} -//-------------------------------------------------------------- -- (void) deinitDisplayLink -{ - [displayLink invalidate]; - displayLink = nil; -} -//-------------------------------------------------------------- -- (double) getDisplayLinkFPS; -{ - return displayFPS; -} //-------------------------------------------------------------- @end diff --git a/xbmc/osx/IOSScreenManager.h b/xbmc/osx/IOSScreenManager.h index 92b7870c74..0c1d9943f2 100644 --- a/xbmc/osx/IOSScreenManager.h +++ b/xbmc/osx/IOSScreenManager.h @@ -38,7 +38,7 @@ IOSExternalTouchController *_externalTouchController; UIInterfaceOrientation _lastTouchControllerOrientation; } -@property unsigned int _screenIdx; +@property (readonly, getter=GetScreenIdx)unsigned int _screenIdx; @property (readonly, getter=isExternalScreen)bool _externalScreen; @property (assign, setter=setView:) IOSEAGLView *_glView; @property UIInterfaceOrientation _lastTouchControllerOrientation; diff --git a/xbmc/osx/atv2/KodiController.h b/xbmc/osx/atv2/KodiController.h index 3902fbf619..a541d3a690 100644 --- a/xbmc/osx/atv2/KodiController.h +++ b/xbmc/osx/atv2/KodiController.h @@ -43,7 +43,6 @@ - (void) applicationDidExit; - (void) initDisplayLink; - (void) deinitDisplayLink; -- (double) getDisplayLinkFPS; - (void) setFramebuffer; - (bool) presentFramebuffer; - (CGSize) getScreenSize; diff --git a/xbmc/osx/atv2/KodiController.mm b/xbmc/osx/atv2/KodiController.mm index 1f3be7b2f0..1d26a606d7 100644 --- a/xbmc/osx/atv2/KodiController.mm +++ b/xbmc/osx/atv2/KodiController.mm @@ -325,13 +325,6 @@ static void KodiController$deinitDisplayLink(KodiController* self, SEL _cmd) [[self glView] deinitDisplayLink]; } -static double KodiController$getDisplayLinkFPS(KodiController* self, SEL _cmd) -{ - //NSLog(@"%s", __PRETTY_FUNCTION__); - - return [[self glView] getDisplayLinkFPS]; -} - static void KodiController$setFramebuffer(KodiController* self, SEL _cmd) { [[self glView] setFramebuffer]; @@ -1373,8 +1366,6 @@ static __attribute__((constructor)) void initControllerRuntimeClasses() class_addMethod(KodiControllerCls, @selector(initDisplayLink), (IMP)&KodiController$initDisplayLink, "v@:"); // KodiController::deinitDisplayLink class_addMethod(KodiControllerCls, @selector(deinitDisplayLink), (IMP)&KodiController$deinitDisplayLink, "v@:"); - // KodiController::getDisplayLinkFPS - class_addMethod(KodiControllerCls, @selector(getDisplayLinkFPS), (IMP)&KodiController$getDisplayLinkFPS, "d@:"); // KodiController::setFramebuffer class_addMethod(KodiControllerCls, @selector(setFramebuffer), (IMP)&KodiController$setFramebuffer, "v@:"); // KodiController::presentFramebuffer diff --git a/xbmc/osx/ios/XBMCController.h b/xbmc/osx/ios/XBMCController.h index 75fbd652e0..3378311e59 100644 --- a/xbmc/osx/ios/XBMCController.h +++ b/xbmc/osx/ios/XBMCController.h @@ -76,9 +76,6 @@ typedef enum - (void) setIOSNowPlayingInfo:(NSDictionary *)info; - (void) sendKey: (XBMCKey) key; - (void) observeDefaultCenterStuff: (NSNotification *) notification; -- (void) initDisplayLink; -- (void) deinitDisplayLink; -- (double) getDisplayLinkFPS; - (void) setFramebuffer; - (bool) presentFramebuffer; - (CGSize) getScreenSize; diff --git a/xbmc/osx/ios/XBMCController.mm b/xbmc/osx/ios/XBMCController.mm index 3e52de3ad6..8c4e1d565c 100644 --- a/xbmc/osx/ios/XBMCController.mm +++ b/xbmc/osx/ios/XBMCController.mm @@ -346,6 +346,7 @@ AnnounceReceiver *AnnounceReceiver::g_announceReceiver = NULL; break; case UIInterfaceOrientationLandscapeLeft: case UIInterfaceOrientationLandscapeRight: + case UIInterfaceOrientationUnknown: break;//just leave the rect as is } m_glView.frame = rect; @@ -886,21 +887,6 @@ AnnounceReceiver *AnnounceReceiver::g_announceReceiver = NULL; [super viewDidUnload]; } //-------------------------------------------------------------- -- (void) initDisplayLink -{ - [m_glView initDisplayLink]; -} -//-------------------------------------------------------------- -- (void) deinitDisplayLink -{ - [m_glView deinitDisplayLink]; -} -//-------------------------------------------------------------- -- (double) getDisplayLinkFPS; -{ - return [m_glView getDisplayLinkFPS]; -} -//-------------------------------------------------------------- - (void) setFramebuffer { [m_glView setFramebuffer]; @@ -1000,6 +986,7 @@ AnnounceReceiver *AnnounceReceiver::g_announceReceiver = NULL; UIView *view = [m_window.subviews objectAtIndex:0]; switch(newOrientation) { + case UIInterfaceOrientationUnknown: case UIInterfaceOrientationPortrait: angle = 0; break; diff --git a/xbmc/pvr/PVRDatabase.h b/xbmc/pvr/PVRDatabase.h index 32f15670a0..751303d31e 100644 --- a/xbmc/pvr/PVRDatabase.h +++ b/xbmc/pvr/PVRDatabase.h @@ -161,15 +161,14 @@ namespace PVR /*! * @brief Add a client to the database if it's not already in there. - * @param strClientName The name of the client. - * @param strGuid The unique ID of the client. + * @param addon The pointer to related addon * @return The database ID of the client. */ int Persist(const ADDON::AddonPtr addon); /*! * @brief Remove a client from the database - * @param strGuid The unique ID of the client. + * @param client The related PVR client to remove from Database. * @return True if the client was removed successfully, false otherwise. */ bool Delete(const CPVRClient &client); @@ -199,7 +198,6 @@ namespace PVR private: /*! * @brief Create the PVR database tables. - * @return True if the tables were created successfully, false otherwise. */ void CreateTables(); void CreateAnalytics(); diff --git a/xbmc/pvr/PVRGUIInfo.cpp b/xbmc/pvr/PVRGUIInfo.cpp index 796a0048a5..843c0b009a 100644 --- a/xbmc/pvr/PVRGUIInfo.cpp +++ b/xbmc/pvr/PVRGUIInfo.cpp @@ -71,6 +71,7 @@ void CPVRGUIInfo::ResetProperties(void) m_strBackendHost .clear(); m_strBackendTimers .clear(); m_strBackendRecordings .clear(); + m_strBackendDeletedRecordings .clear(); m_strBackendChannels .clear(); m_iBackendUsedDiskspace = 0; m_iBackendTotalDiskspace = 0; @@ -380,6 +381,9 @@ bool CPVRGUIInfo::TranslateCharInfo(DWORD dwInfo, std::string &strValue) const case PVR_BACKEND_RECORDINGS: CharInfoBackendRecordings(strValue); break; + case PVR_BACKEND_DELETED_RECORDINGS: + CharInfoBackendDeletedRecordings(strValue); + break; case PVR_BACKEND_NUMBER: CharInfoBackendNumber(strValue); break; @@ -637,6 +641,14 @@ void CPVRGUIInfo::CharInfoBackendRecordings(std::string &strValue) const strValue = m_strBackendRecordings; } +void CPVRGUIInfo::CharInfoBackendDeletedRecordings(std::string &strValue) const +{ + if (m_strBackendDeletedRecordings.empty()) + strValue = g_localizeStrings.Get(13205); /* Unknown */ + else + strValue = m_strBackendDeletedRecordings; +} + void CPVRGUIInfo::CharInfoPlayingClientName(std::string &strValue) const { if (m_strPlayingClientName.empty()) @@ -685,6 +697,7 @@ void CPVRGUIInfo::UpdateBackendCache(void) std::string strBackendHost; std::string strBackendTimers; std::string strBackendRecordings; + std::string strBackendDeletedRecordings; std::string strBackendChannels; long long iBackendkBUsed(0); long long iBackendkBTotal(0); @@ -727,27 +740,34 @@ void CPVRGUIInfo::UpdateBackendCache(void) else strBackendTimers = g_localizeStrings.Get(161); - int NumRecordings = activeClient->second->GetRecordingsAmount(); + int NumRecordings = activeClient->second->GetRecordingsAmount(false); if (NumRecordings >= 0) strBackendRecordings = StringUtils::Format("%i", NumRecordings); else strBackendRecordings = g_localizeStrings.Get(161); + int NumDeletedRecordings = activeClient->second->GetRecordingsAmount(true); + if (NumDeletedRecordings >= 0) + strBackendDeletedRecordings = StringUtils::Format("%i", NumDeletedRecordings); + else + strBackendDeletedRecordings = g_localizeStrings.Get(161); /* Unavailable */ + strBackendName = activeClient->second->GetBackendName(); strBackendVersion = activeClient->second->GetBackendVersion(); strBackendHost = activeClient->second->GetConnectionString(); } CSingleLock lock(m_critSection); - m_strBackendName = strBackendName; - m_strBackendVersion = strBackendVersion; - m_strBackendHost = strBackendHost; - m_strBackendTimers = strBackendTimers; - m_strBackendRecordings = strBackendRecordings; - m_strBackendChannels = strBackendChannels; - m_iActiveClients = iActiveClients; - m_iBackendUsedDiskspace = iBackendkBUsed; - m_iBackendTotalDiskspace = iBackendkBTotal; + m_strBackendName = strBackendName; + m_strBackendVersion = strBackendVersion; + m_strBackendHost = strBackendHost; + m_strBackendTimers = strBackendTimers; + m_strBackendRecordings = strBackendRecordings; + m_strBackendDeletedRecordings = strBackendDeletedRecordings; + m_strBackendChannels = strBackendChannels; + m_iActiveClients = iActiveClients; + m_iBackendUsedDiskspace = iBackendkBUsed; + m_iBackendTotalDiskspace = iBackendkBTotal; } void CPVRGUIInfo::UpdateTimersCache(void) diff --git a/xbmc/pvr/PVRGUIInfo.h b/xbmc/pvr/PVRGUIInfo.h index e71cc9d18f..d285345e1f 100644 --- a/xbmc/pvr/PVRGUIInfo.h +++ b/xbmc/pvr/PVRGUIInfo.h @@ -134,6 +134,7 @@ namespace PVR void CharInfoBackendChannels(std::string &strValue) const; void CharInfoBackendTimers(std::string &strValue) const; void CharInfoBackendRecordings(std::string &strValue) const; + void CharInfoBackendDeletedRecordings(std::string &strValue) const; void CharInfoPlayingClientName(std::string &strValue) const; void CharInfoEncryption(std::string &strValue) const; void CharInfoService(std::string &strValue) const; @@ -161,6 +162,7 @@ namespace PVR std::string m_strBackendHost; std::string m_strBackendTimers; std::string m_strBackendRecordings; + std::string m_strBackendDeletedRecordings; std::string m_strBackendChannels; long long m_iBackendUsedDiskspace; long long m_iBackendTotalDiskspace; diff --git a/xbmc/pvr/addons/PVRClient.cpp b/xbmc/pvr/addons/PVRClient.cpp index f327e15407..1049e8c052 100644 --- a/xbmc/pvr/addons/PVRClient.cpp +++ b/xbmc/pvr/addons/PVRClient.cpp @@ -246,6 +246,7 @@ void CPVRClient::WriteClientRecordingInfo(const CPVRRecording &xbmcRecording, PV addonRecording.iLifetime = xbmcRecording.m_iLifetime; addonRecording.iPlayCount = xbmcRecording.m_playCount; addonRecording.iLastPlayedPosition = (int)xbmcRecording.m_resumePoint.timeInSeconds; + addonRecording.bIsDeleted = xbmcRecording.IsDeleted(); strncpy(addonRecording.strDirectory, xbmcRecording.m_strDirectory.c_str(), sizeof(addonRecording.strDirectory) - 1); strncpy(addonRecording.strStreamURL, xbmcRecording.m_strStreamURL.c_str(), sizeof(addonRecording.strStreamURL) - 1); strncpy(addonRecording.strIconPath, xbmcRecording.m_strIconPath.c_str(), sizeof(addonRecording.strIconPath) - 1); @@ -270,6 +271,7 @@ void CPVRClient::WriteClientTimerInfo(const CPVRTimerInfoTag &xbmcTimer, PVR_TIM addonTimer.iClientIndex = xbmcTimer.m_iClientIndex; addonTimer.state = xbmcTimer.m_state; + addonTimer.iClientIndex = xbmcTimer.m_iClientIndex; addonTimer.iClientChannelUid = xbmcTimer.m_iClientChannelUid; strncpy(addonTimer.strTitle, xbmcTimer.m_strTitle.c_str(), sizeof(addonTimer.strTitle) - 1); strncpy(addonTimer.strDirectory, xbmcTimer.m_strDirectory.c_str(), sizeof(addonTimer.strDirectory) - 1); @@ -453,12 +455,112 @@ PVR_ERROR CPVRClient::StartChannelScan(void) if (!m_addonCapabilities.bSupportsChannelScan) return PVR_ERROR_NOT_IMPLEMENTED; - try { return m_pStruct->DialogChannelScan(); } + try { return m_pStruct->OpenDialogChannelScan(); } catch (std::exception &e) { LogException(e, __FUNCTION__); } return PVR_ERROR_UNKNOWN; } +PVR_ERROR CPVRClient::OpenDialogChannelAdd(const CPVRChannel &channel) +{ + if (!m_bReadyToUse) + return PVR_ERROR_REJECTED; + + if (!m_addonCapabilities.bSupportsChannelSettings) + return PVR_ERROR_NOT_IMPLEMENTED; + + PVR_ERROR retVal(PVR_ERROR_UNKNOWN); + try + { + PVR_CHANNEL addonChannel; + WriteClientChannelInfo(channel, addonChannel); + + retVal = m_pStruct->OpenDialogChannelAdd(addonChannel); + LogError(retVal, __FUNCTION__); + } + catch (std::exception &e) + { + LogException(e, __FUNCTION__); + } + + return retVal; +} + +PVR_ERROR CPVRClient::OpenDialogChannelSettings(const CPVRChannel &channel) +{ + if (!m_bReadyToUse) + return PVR_ERROR_REJECTED; + + if (!m_addonCapabilities.bSupportsChannelSettings) + return PVR_ERROR_NOT_IMPLEMENTED; + + PVR_ERROR retVal(PVR_ERROR_UNKNOWN); + try + { + PVR_CHANNEL addonChannel; + WriteClientChannelInfo(channel, addonChannel); + + retVal = m_pStruct->OpenDialogChannelSettings(addonChannel); + LogError(retVal, __FUNCTION__); + } + catch (std::exception &e) + { + LogException(e, __FUNCTION__); + } + + return retVal; +} + +PVR_ERROR CPVRClient::DeleteChannel(const CPVRChannel &channel) +{ + if (!m_bReadyToUse) + return PVR_ERROR_REJECTED; + + if (!m_addonCapabilities.bSupportsChannelSettings) + return PVR_ERROR_NOT_IMPLEMENTED; + + PVR_ERROR retVal(PVR_ERROR_UNKNOWN); + try + { + PVR_CHANNEL addonChannel; + WriteClientChannelInfo(channel, addonChannel); + + retVal = m_pStruct->DeleteChannel(addonChannel); + LogError(retVal, __FUNCTION__); + } + catch (std::exception &e) + { + LogException(e, __FUNCTION__); + } + + return retVal; +} + +PVR_ERROR CPVRClient::RenameChannel(const CPVRChannel &channel) +{ + if (!m_bReadyToUse) + return PVR_ERROR_REJECTED; + + if (!m_addonCapabilities.bSupportsChannelSettings) + return PVR_ERROR_NOT_IMPLEMENTED; + + PVR_ERROR retVal(PVR_ERROR_UNKNOWN); + try + { + PVR_CHANNEL addonChannel; + WriteClientChannelInfo(channel, addonChannel); + + retVal = m_pStruct->RenameChannel(addonChannel); + LogError(retVal, __FUNCTION__); + } + catch (std::exception &e) + { + LogException(e, __FUNCTION__); + } + + return retVal; +} + void CPVRClient::CallMenuHook(const PVR_MENUHOOK &hook, const CFileItem *item) { if (!m_bReadyToUse) @@ -480,11 +582,16 @@ void CPVRClient::CallMenuHook(const PVR_MENUHOOK &hook, const CFileItem *item) hookData.cat = PVR_MENUHOOK_CHANNEL; WriteClientChannelInfo(*item->GetPVRChannelInfoTag(), hookData.data.channel); } - else if (item->IsPVRRecording()) + else if (item->IsUsablePVRRecording()) { hookData.cat = PVR_MENUHOOK_RECORDING; WriteClientRecordingInfo(*item->GetPVRRecordingInfoTag(), hookData.data.recording); } + else if (item->IsDeletedPVRRecording()) + { + hookData.cat = PVR_MENUHOOK_DELETED_RECORDING; + WriteClientRecordingInfo(*item->GetPVRRecordingInfoTag(), hookData.data.recording); + } else if (item->IsPVRTimer()) { hookData.cat = PVR_MENUHOOK_TIMER; @@ -644,25 +751,31 @@ PVR_ERROR CPVRClient::GetChannels(CPVRChannelGroup &channels, bool radio) return retVal; } -int CPVRClient::GetRecordingsAmount(void) +int CPVRClient::GetRecordingsAmount(bool deleted) { int iReturn(-EINVAL); - if (m_addonCapabilities.bSupportsRecordings) + if (!m_addonCapabilities.bSupportsRecordings || (deleted && !m_addonCapabilities.bSupportsRecordingsUndelete)) + return iReturn; + + try { - try { iReturn = m_pStruct->GetRecordingsAmount(); } - catch (std::exception &e) { LogException(e, __FUNCTION__); } + iReturn = m_pStruct->GetRecordingsAmount(deleted); + } + catch (std::exception &e) + { + LogException(e, __FUNCTION__); } return iReturn; } -PVR_ERROR CPVRClient::GetRecordings(CPVRRecordings *results) +PVR_ERROR CPVRClient::GetRecordings(CPVRRecordings *results, bool deleted) { if (!m_bReadyToUse) return PVR_ERROR_REJECTED; - if (!m_addonCapabilities.bSupportsRecordings) + if (!m_addonCapabilities.bSupportsRecordings || (deleted && !m_addonCapabilities.bSupportsRecordingsUndelete)) return PVR_ERROR_NOT_IMPLEMENTED; PVR_ERROR retVal(PVR_ERROR_UNKNOWN); @@ -671,7 +784,7 @@ PVR_ERROR CPVRClient::GetRecordings(CPVRRecordings *results) ADDON_HANDLE_STRUCT handle; handle.callerAddress = this; handle.dataAddress = (CPVRRecordings*) results; - retVal = m_pStruct->GetRecordings(&handle); + retVal = m_pStruct->GetRecordings(&handle, deleted); LogError(retVal, __FUNCTION__); } @@ -709,6 +822,55 @@ PVR_ERROR CPVRClient::DeleteRecording(const CPVRRecording &recording) return retVal; } +PVR_ERROR CPVRClient::UndeleteRecording(const CPVRRecording &recording) +{ + if (!m_bReadyToUse) + return PVR_ERROR_REJECTED; + + if (!m_addonCapabilities.bSupportsRecordingsUndelete) + return PVR_ERROR_NOT_IMPLEMENTED; + + PVR_ERROR retVal(PVR_ERROR_UNKNOWN); + try + { + PVR_RECORDING tag; + WriteClientRecordingInfo(recording, tag); + + retVal = m_pStruct->UndeleteRecording(tag); + + LogError(retVal, __FUNCTION__); + } + catch (std::exception &e) + { + LogException(e, __FUNCTION__); + } + + return retVal; +} + +PVR_ERROR CPVRClient::DeleteAllRecordingsFromTrash() +{ + if (!m_bReadyToUse) + return PVR_ERROR_REJECTED; + + if (!m_addonCapabilities.bSupportsRecordingsUndelete) + return PVR_ERROR_NOT_IMPLEMENTED; + + PVR_ERROR retVal(PVR_ERROR_UNKNOWN); + try + { + retVal = m_pStruct->DeleteAllRecordingsFromTrash(); + + LogError(retVal, __FUNCTION__); + } + catch (std::exception &e) + { + LogException(e, __FUNCTION__); + } + + return retVal; +} + PVR_ERROR CPVRClient::RenameRecording(const CPVRRecording &recording) { if (!m_bReadyToUse) @@ -1263,6 +1425,11 @@ bool CPVRClient::SupportsChannelScan(void) const return m_addonCapabilities.bSupportsChannelScan; } +bool CPVRClient::SupportsChannelSettings(void) const +{ + return m_addonCapabilities.bSupportsChannelSettings; +} + bool CPVRClient::SupportsEPG(void) const { return m_addonCapabilities.bSupportsEPG; @@ -1283,6 +1450,11 @@ bool CPVRClient::SupportsRecordings(void) const return m_addonCapabilities.bSupportsRecordings; } +bool CPVRClient::SupportsRecordingsUndelete(void) const +{ + return m_addonCapabilities.bSupportsRecordingsUndelete; +} + bool CPVRClient::SupportsRecordingFolders(void) const { return m_addonCapabilities.bSupportsRecordingFolders; diff --git a/xbmc/pvr/addons/PVRClient.h b/xbmc/pvr/addons/PVRClient.h index b6f3eb5aba..79d568f5c2 100644 --- a/xbmc/pvr/addons/PVRClient.h +++ b/xbmc/pvr/addons/PVRClient.h @@ -157,6 +157,34 @@ namespace PVR PVR_ERROR StartChannelScan(void); /*! + * @brief Request the client to open dialog about given channel to add + * @param channel The channel to add + * @return PVR_ERROR_NO_ERROR if the add has been fetched successfully. + */ + PVR_ERROR OpenDialogChannelAdd(const CPVRChannel &channel); + + /*! + * @brief Request the client to open dialog about given channel settings + * @param channel The channel to edit + * @return PVR_ERROR_NO_ERROR if the edit has been fetched successfully. + */ + PVR_ERROR OpenDialogChannelSettings(const CPVRChannel &channel); + + /*! + * @brief Request the client to delete given channel + * @param channel The channel to delete + * @return PVR_ERROR_NO_ERROR if the delete has been fetched successfully. + */ + PVR_ERROR DeleteChannel(const CPVRChannel &channel); + + /*! + * @brief Request the client to rename given channel + * @param channel The channel to rename + * @return PVR_ERROR_NO_ERROR if the rename has been fetched successfully. + */ + PVR_ERROR RenameChannel(const CPVRChannel &channel); + + /*! * @return True if this add-on has menu hooks, false otherwise. */ bool HaveMenuHooks(PVR_MENUHOOK_CAT cat) const; @@ -233,16 +261,18 @@ namespace PVR //@{ /*! - * @return The total amount of channels on the server or -1 on error. + * @param deleted if set return deleted recording + * @return The total amount of recordingd on the server or -1 on error. */ - int GetRecordingsAmount(void); + int GetRecordingsAmount(bool deleted); /*! * @brief Request the list of all recordings from the backend. * @param results The container to add the recordings to. + * @param deleted if set return deleted recording * @return PVR_ERROR_NO_ERROR if the list has been fetched successfully. */ - PVR_ERROR GetRecordings(CPVRRecordings *results); + PVR_ERROR GetRecordings(CPVRRecordings *results, bool deleted); /*! * @brief Delete a recording on the backend. @@ -252,6 +282,19 @@ namespace PVR PVR_ERROR DeleteRecording(const CPVRRecording &recording); /*! + * @brief Undelete a recording on the backend. + * @param recording The recording to undelete. + * @return PVR_ERROR_NO_ERROR if the recording has been undeleted successfully. + */ + PVR_ERROR UndeleteRecording(const CPVRRecording &recording); + + /*! + * @brief Delete all recordings permanent which in the deleted folder on the backend. + * @return PVR_ERROR_NO_ERROR if the recordings has been deleted successfully. + */ + PVR_ERROR DeleteAllRecordingsFromTrash(); + + /*! * @brief Rename a recording on the backend. * @param recording The recording to rename. * @return PVR_ERROR_NO_ERROR if the recording has been renamed successfully. @@ -475,10 +518,12 @@ namespace PVR bool SupportsChannelGroups(void) const; bool SupportsChannelScan(void) const; + bool SupportsChannelSettings(void) const; bool SupportsEPG(void) const; bool SupportsLastPlayedPosition(void) const; bool SupportsRadio(void) const; bool SupportsRecordings(void) const; + bool SupportsRecordingsUndelete(void) const; bool SupportsRecordingFolders(void) const; bool SupportsRecordingPlayCount(void) const; bool SupportsRecordingEdl(void) const; diff --git a/xbmc/pvr/addons/PVRClients.cpp b/xbmc/pvr/addons/PVRClients.cpp index 961373b36b..7659104ded 100644 --- a/xbmc/pvr/addons/PVRClients.cpp +++ b/xbmc/pvr/addons/PVRClients.cpp @@ -438,7 +438,7 @@ PVR_ERROR CPVRClients::RenameTimer(const CPVRTimerInfoTag &timer, const std::str return error; } -PVR_ERROR CPVRClients::GetRecordings(CPVRRecordings *recordings) +PVR_ERROR CPVRClients::GetRecordings(CPVRRecordings *recordings, bool deleted) { PVR_ERROR error(PVR_ERROR_NO_ERROR); PVR_CLIENTMAP clients; @@ -446,7 +446,7 @@ PVR_ERROR CPVRClients::GetRecordings(CPVRRecordings *recordings) for (PVR_CLIENTMAP_CITR itrClients = clients.begin(); itrClients != clients.end(); itrClients++) { - PVR_ERROR currentError = (*itrClients).second->GetRecordings(recordings); + PVR_ERROR currentError = (*itrClients).second->GetRecordings(recordings, deleted); if (currentError != PVR_ERROR_NOT_IMPLEMENTED && currentError != PVR_ERROR_NO_ERROR) { @@ -486,6 +486,81 @@ PVR_ERROR CPVRClients::DeleteRecording(const CPVRRecording &recording) return error; } +PVR_ERROR CPVRClients::UndeleteRecording(const CPVRRecording &recording) +{ + PVR_ERROR error(PVR_ERROR_UNKNOWN); + + if (!recording.IsDeleted()) + return error; + + PVR_CLIENT client; + if (GetConnectedClient(recording.m_iClientId, client)) + error = client->UndeleteRecording(recording); + + if (error != PVR_ERROR_NO_ERROR) + CLog::Log(LOGERROR, "PVR - %s - cannot undelete recording from client '%d': %s",__FUNCTION__, recording.m_iClientId, CPVRClient::ToString(error)); + + return error; +} + +PVR_ERROR CPVRClients::DeleteAllRecordingsFromTrash() +{ + PVR_ERROR error(PVR_ERROR_NO_ERROR); + PVR_CLIENTMAP clients; + GetConnectedClients(clients); + + std::vector<PVR_CLIENT> suppClients; + for (PVR_CLIENTMAP_CITR itrClients = clients.begin(); itrClients != clients.end(); ++itrClients) + { + if (itrClients->second->SupportsRecordingsUndelete() && itrClients->second->GetRecordingsAmount(true) > 0) + suppClients.push_back(itrClients->second); + } + + int selection = 0; + if (suppClients.size() > 1) + { + // have user select client + CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); + pDialog->Reset(); + pDialog->SetHeading(19292); /* Delete all permanently */ + pDialog->Add(g_localizeStrings.Get(24032)); /* All Add-ons */ + + PVR_CLIENTMAP_CITR itrClients; + for (itrClients = clients.begin(); itrClients != clients.end(); ++itrClients) + { + if (itrClients->second->SupportsRecordingsUndelete() && itrClients->second->GetRecordingsAmount(true) > 0) + pDialog->Add(itrClients->second->GetBackendName()); + } + pDialog->DoModal(); + selection = pDialog->GetSelectedLabel(); + } + + if (selection == 0) + { + typedef std::vector<PVR_CLIENT>::const_iterator suppClientsCITR; + for (suppClientsCITR itrSuppClients = suppClients.begin(); itrSuppClients != suppClients.end(); ++itrSuppClients) + { + PVR_ERROR currentError = (*itrSuppClients)->DeleteAllRecordingsFromTrash(); + if (currentError != PVR_ERROR_NO_ERROR) + { + CLog::Log(LOGERROR, "PVR - %s - cannot delete all recordings from client '%d': %s",__FUNCTION__, (*itrSuppClients)->GetID(), CPVRClient::ToString(currentError)); + error = currentError; + } + } + } + else if (selection >= 1 && selection <= (int)suppClients.size()) + { + PVR_ERROR currentError = suppClients[selection-1]->DeleteAllRecordingsFromTrash(); + if (currentError != PVR_ERROR_NO_ERROR) + { + CLog::Log(LOGERROR, "PVR - %s - cannot delete all recordings from client '%d': %s",__FUNCTION__, suppClients[selection-1]->GetID(), CPVRClient::ToString(currentError)); + error = currentError; + } + } + + return error; +} + bool CPVRClients::SetRecordingLastPlayedPosition(const CPVRRecording &recording, int lastplayedposition, PVR_ERROR *error) { *error = PVR_ERROR_UNKNOWN; @@ -818,6 +893,93 @@ void CPVRClients::StartChannelScan(void) m_bChannelScanRunning = false; } +std::vector<PVR_CLIENT> CPVRClients::GetClientsSupportingChannelSettings(bool bRadio) const +{ + std::vector<PVR_CLIENT> possibleSettingsClients; + CSingleLock lock(m_critSection); + + /* get clients that support channel settings */ + for (PVR_CLIENTMAP_CITR itr = m_clientMap.begin(); itr != m_clientMap.end(); itr++) + { + if (itr->second->ReadyToUse() && itr->second->SupportsChannelSettings() && + ((bRadio && itr->second->SupportsRadio()) || (!bRadio && itr->second->SupportsTV()))) + possibleSettingsClients.push_back(itr->second); + } + + return possibleSettingsClients; +} + + +bool CPVRClients::OpenDialogChannelAdd(const CPVRChannel &channel) +{ + PVR_ERROR error = PVR_ERROR_UNKNOWN; + + PVR_CLIENT client; + if (GetConnectedClient(channel.ClientID(), client)) + error = client->OpenDialogChannelAdd(channel); + else + CLog::Log(LOGERROR, "PVR - %s - cannot find client %d",__FUNCTION__, channel.ClientID()); + + if (error == PVR_ERROR_NOT_IMPLEMENTED) + { + CGUIDialogOK::ShowAndGetInput(19033,19038,0,0); + return true; + } + + return error == PVR_ERROR_NO_ERROR; +} + +bool CPVRClients::OpenDialogChannelSettings(const CPVRChannel &channel) +{ + PVR_ERROR error = PVR_ERROR_UNKNOWN; + + PVR_CLIENT client; + if (GetConnectedClient(channel.ClientID(), client)) + error = client->OpenDialogChannelSettings(channel); + else + CLog::Log(LOGERROR, "PVR - %s - cannot find client %d",__FUNCTION__, channel.ClientID()); + + if (error == PVR_ERROR_NOT_IMPLEMENTED) + { + CGUIDialogOK::ShowAndGetInput(19033,19038,0,0); + return true; + } + + return error == PVR_ERROR_NO_ERROR; +} + +bool CPVRClients::DeleteChannel(const CPVRChannel &channel) +{ + PVR_ERROR error = PVR_ERROR_UNKNOWN; + + PVR_CLIENT client; + if (GetConnectedClient(channel.ClientID(), client)) + error = client->DeleteChannel(channel); + else + CLog::Log(LOGERROR, "PVR - %s - cannot find client %d",__FUNCTION__, channel.ClientID()); + + if (error == PVR_ERROR_NOT_IMPLEMENTED) + { + CGUIDialogOK::ShowAndGetInput(19033,19038,0,0); + return true; + } + + return error == PVR_ERROR_NO_ERROR; +} + +bool CPVRClients::RenameChannel(const CPVRChannel &channel) +{ + PVR_ERROR error = PVR_ERROR_UNKNOWN; + + PVR_CLIENT client; + if (GetConnectedClient(channel.ClientID(), client)) + error = client->RenameChannel(channel); + else + CLog::Log(LOGERROR, "PVR - %s - cannot find client %d",__FUNCTION__, channel.ClientID()); + + return (error == PVR_ERROR_NO_ERROR || error == PVR_ERROR_NOT_IMPLEMENTED); +} + bool CPVRClients::IsKnownClient(const AddonPtr client) const { // database IDs start at 1 @@ -1096,6 +1258,12 @@ bool CPVRClients::SupportsChannelScan(int iClientId) const return GetConnectedClient(iClientId, client) && client->SupportsChannelScan(); } +bool CPVRClients::SupportsChannelSettings(int iClientId) const +{ + PVR_CLIENT client; + return GetConnectedClient(iClientId, client) && client->SupportsChannelSettings(); +} + bool CPVRClients::SupportsEPG(int iClientId) const { PVR_CLIENT client; @@ -1120,6 +1288,12 @@ bool CPVRClients::SupportsRecordings(int iClientId) const return GetConnectedClient(iClientId, client) && client->SupportsRecordings(); } +bool CPVRClients::SupportsRecordingsUndelete(int iClientId) const +{ + PVR_CLIENT client; + return GetConnectedClient(iClientId, client) && client->SupportsRecordingsUndelete(); +} + bool CPVRClients::SupportsRecordingFolders(int iClientId) const { PVR_CLIENT client; diff --git a/xbmc/pvr/addons/PVRClients.h b/xbmc/pvr/addons/PVRClients.h index 23bb080a01..129bbaa5d3 100644 --- a/xbmc/pvr/addons/PVRClients.h +++ b/xbmc/pvr/addons/PVRClients.h @@ -362,11 +362,19 @@ namespace PVR bool SupportsRecordings(int iClientId) const; /*! + * @brief Check whether a client supports undelete of recordings. + * @param iClientId The id of the client to check. + * @return True if the supports undeleted of recordings, false otherwise. + */ + bool SupportsRecordingsUndelete(int iClientId) const; + + /*! * @brief Get all recordings from clients * @param recordings Store the recordings in this container. + * @param deleted Return deleted recordings * @return The amount of recordings that were added. */ - PVR_ERROR GetRecordings(CPVRRecordings *recordings); + PVR_ERROR GetRecordings(CPVRRecordings *recordings, bool deleted); /*! * @brief Rename a recordings on the backend. @@ -385,6 +393,20 @@ namespace PVR PVR_ERROR DeleteRecording(const CPVRRecording &recording); /*! + * @brief Undelete a recording from the backend. + * @param recording The recording to undelete. + * @param error An error if it occured. + * @return True if the recording was undeleted successfully, false otherwise. + */ + PVR_ERROR UndeleteRecording(const CPVRRecording &recording); + + /*! + * @brief Delete all recordings permanent which in the deleted folder on the backend. + * @return PVR_ERROR_NO_ERROR if the recordings has been deleted successfully. + */ + PVR_ERROR DeleteAllRecordingsFromTrash(); + + /*! * @brief Set play count of a recording on the backend. * @param recording The recording to set the play count. * @param count Play count. @@ -528,11 +550,50 @@ namespace PVR //@} + /*! @name Channel settings methods */ + //@{ + + /*! + * @return All clients that support channel settings inside addon. + */ + std::vector<PVR_CLIENT> GetClientsSupportingChannelSettings(bool bRadio) const; + + /*! + * @brief Open addon settings dialog to add a channel + * @param channel The channel to edit. + * @return True if the edit was successfull, false otherwise. + */ + bool OpenDialogChannelAdd(const CPVRChannel &channel); + + /*! + * @brief Open addon settings dialog to related channel + * @param channel The channel to edit. + * @return True if the edit was successfull, false otherwise. + */ + bool OpenDialogChannelSettings(const CPVRChannel &channel); + + /*! + * @brief Inform addon to delete channel + * @param channel The channel to delete. + * @return True if it was successfull, false otherwise. + */ + bool DeleteChannel(const CPVRChannel &channel); + + /*! + * @brief Request the client to rename given channel + * @param channel The channel to rename + * @return True if the edit was successfull, false otherwise. + */ + bool RenameChannel(const CPVRChannel &channel); + + //@} + void Notify(const Observable &obs, const ObservableMessage msg); bool GetClient(const std::string &strId, ADDON::AddonPtr &addon) const; bool SupportsChannelScan(int iClientId) const; + bool SupportsChannelSettings(int iClientId) const; bool SupportsLastPlayedPosition(int iClientId) const; bool SupportsRadio(int iClientId) const; bool SupportsRecordingFolders(int iClientId) const; diff --git a/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.cpp b/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.cpp index 6d9b428d43..79fe33796e 100644 --- a/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.cpp +++ b/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.cpp @@ -52,6 +52,7 @@ #define RADIOBUTTON_PARENTAL_LOCK 14 #define CONTROL_LIST_CHANNELS 20 #define BUTTON_GROUP_MANAGER 30 +#define BUTTON_NEW_CHANNEL 31 #define BUTTON_RADIO_TV 34 using namespace PVR; @@ -61,6 +62,7 @@ CGUIDialogPVRChannelManager::CGUIDialogPVRChannelManager(void) : m_bIsRadio(false), m_bMovingMode(false), m_bContainsChanges(false), + m_bAllowNewChannel(false), m_iSelected(0), m_channelItems(new CFileItemList) { @@ -160,6 +162,7 @@ void CGUIDialogPVRChannelManager::OnInitWindow() m_bIsRadio = false; m_bMovingMode = false; m_bContainsChanges = false; + m_bAllowNewChannel = false; SetProperty("IsRadio", ""); Update(); SetData(m_iSelected); @@ -246,6 +249,7 @@ bool CGUIDialogPVRChannelManager::OnClickButtonRadioTV(CGUIMessage &message) m_iSelected = 0; m_bMovingMode = false; + m_bAllowNewChannel = false; m_bContainsChanges = false; m_bIsRadio = !m_bIsRadio; SetProperty("IsRadio", m_bIsRadio ? "true" : ""); @@ -434,6 +438,42 @@ bool CGUIDialogPVRChannelManager::OnClickButtonGroupManager(CGUIMessage &message return true; } +bool CGUIDialogPVRChannelManager::OnClickButtonNewChannel() +{ + int iSelection = 0; + if (g_PVRClients->ConnectedClientAmount() > 1) + { + CGUIDialogSelect* pDlgSelect = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); + if (!pDlgSelect) + return false; + + pDlgSelect->SetHeading(19213); // Select Client + + PVR_CLIENT_ITR itr; + for (itr = m_clientsWithSettingsList.begin() ; itr != m_clientsWithSettingsList.end(); ++itr) + pDlgSelect->Add((*itr)->Name()); + pDlgSelect->DoModal(); + + iSelection = pDlgSelect->GetSelectedLabel(); + } + + if (iSelection >= 0 && iSelection < (int)m_clientsWithSettingsList.size()) + { + int iClientID = m_clientsWithSettingsList[iSelection]->GetID(); + + CPVRChannel channel(m_bIsRadio); + channel.SetChannelName(g_localizeStrings.Get(19204)); // New channel + channel.SetEPGEnabled(g_PVRClients->SupportsEPG(iClientID)); + channel.SetClientID(iClientID); + + if (g_PVRClients->OpenDialogChannelAdd(channel)) + Update(); + else + CGUIDialogOK::ShowAndGetInput(2103, 0, 16029, 0); // Add-on error;Check the log file for details. + } + return true; +} + bool CGUIDialogPVRChannelManager::OnMessageClick(CGUIMessage &message) { int iControl = message.GetSenderId(); @@ -463,6 +503,8 @@ bool CGUIDialogPVRChannelManager::OnMessageClick(CGUIMessage &message) return OnClickEPGSourceSpin(message); case BUTTON_GROUP_MANAGER: return OnClickButtonGroupManager(message); + case BUTTON_NEW_CHANNEL: + return OnClickButtonNewChannel(); default: return false; } @@ -517,7 +559,13 @@ bool CGUIDialogPVRChannelManager::OnPopupMenu(int iItem) if (!pItem) return false; - buttons.Add(CONTEXT_BUTTON_MOVE, 116); /* Move channel up or down */ + buttons.Add(CONTEXT_BUTTON_MOVE, 116); /* Move channel up or down */ + + if (pItem->GetProperty("SupportsSettings").asBoolean()) + { + buttons.Add(CONTEXT_BUTTON_SETTINGS, 10004); /* Open add-on channel settings dialog */ + buttons.Add(CONTEXT_BUTTON_DELETE, 117); /* Delete add-on channel */ + } int choice = CGUIDialogContextMenu::ShowAndGetChoice(buttons); @@ -545,6 +593,35 @@ bool CGUIDialogPVRChannelManager::OnContextButton(int itemNumber, CONTEXT_BUTTON m_bMovingMode = true; pItem->Select(true); } + else if (button == CONTEXT_BUTTON_SETTINGS) + { + if (!g_PVRClients->OpenDialogChannelSettings(*pItem->GetPVRChannelInfoTag())) + CGUIDialogOK::ShowAndGetInput(2103, 0, 16029, 0); // Add-on error;Check the log file for details. + } + else if (button == CONTEXT_BUTTON_DELETE) + { + CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); + if (!pDialog) + return true; + + pDialog->SetHeading(19211); // Delete channel + pDialog->SetText(750); // Are you sure? + pDialog->DoModal(); + + if (pDialog->IsConfirmed()) + { + CPVRChannel *channel = pItem->GetPVRChannelInfoTag(); + if (g_PVRClients->DeleteChannel(*channel)) + { + g_PVRChannelGroups->GetGroupAll(channel->IsRadio())->RemoveFromGroup(*channel); + m_channelItems->Remove(m_iSelected); + m_viewControl.SetItems(*m_channelItems); + Renumber(); + } + else + CGUIDialogOK::ShowAndGetInput(2103, 0, 16029, 0); // Add-on error;Check the log file for details. + } + } else if (button == CONTEXT_BUTTON_EDIT_SOURCE) { std::string strURL = pItem->GetProperty("StreamURL").asString(); @@ -605,6 +682,7 @@ void CGUIDialogPVRChannelManager::Update() std::string clientName; g_PVRClients->GetClientName(channel->ClientID(), clientName); channelFile->SetProperty("ClientName", clientName); + channelFile->SetProperty("SupportsSettings", g_PVRClients->SupportsChannelSettings(channel->ClientID())); m_channelItems->Add(channelFile); } @@ -616,6 +694,15 @@ void CGUIDialogPVRChannelManager::Update() SET_CONTROL_LABELS(SPIN_EPGSOURCE_SELECTION, 0, &labels); } + m_clientsWithSettingsList = g_PVRClients->GetClientsSupportingChannelSettings(m_bIsRadio); + if (!m_clientsWithSettingsList.empty()) + m_bAllowNewChannel = true; + + if (m_bAllowNewChannel) + SET_CONTROL_VISIBLE(BUTTON_NEW_CHANNEL); + else + SET_CONTROL_HIDDEN(BUTTON_NEW_CHANNEL); + Renumber(); m_viewControl.SetItems(*m_channelItems); m_viewControl.SetSelectedItem(m_iSelected); @@ -629,6 +716,19 @@ void CGUIDialogPVRChannelManager::Clear(void) m_channelItems->Clear(); } +void CGUIDialogPVRChannelManager::RenameChannel(CFileItemPtr pItem) +{ + std::string strChannelName = pItem->GetProperty("Name").asString(); + if (strChannelName != pItem->GetPVRChannelInfoTag()->ChannelName()) + { + CPVRChannel channel = pItem->GetPVRChannelInfoTag(); + channel.SetChannelName(strChannelName); + + if (!g_PVRClients->RenameChannel(channel)) + CGUIDialogOK::ShowAndGetInput(2103, 0, 16029, 0); // Add-on error;Check the log file for details. + } +} + bool CGUIDialogPVRChannelManager::PersistChannel(CFileItemPtr pItem, CPVRChannelGroupPtr group, unsigned int *iChannelNumber) { if (!pItem || !pItem->HasPVRChannelInfoTag() || !group) @@ -669,7 +769,13 @@ void CGUIDialogPVRChannelManager::SaveList(void) return; for (int iListPtr = 0; iListPtr < m_channelItems->Size(); iListPtr++) { + if (!m_channelItems->HasPVRChannelInfoTag()) + continue; + CFileItemPtr pItem = m_channelItems->Get(iListPtr); + if (pItem->GetProperty("SupportsSettings").asBoolean()) + RenameChannel(pItem); + PersistChannel(pItem, group, &iNextChannelNumber); pDlgProgress->SetPercentage(iListPtr * 100 / m_channelItems->Size()); diff --git a/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.h b/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.h index 2204c5ed8a..9101556a58 100644 --- a/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.h +++ b/xbmc/pvr/dialogs/GUIDialogPVRChannelManager.h @@ -22,7 +22,8 @@ #include "guilib/GUIDialog.h" #include "dialogs/GUIDialogContextMenu.h" #include "view/GUIViewControl.h" -#include "../channels/PVRChannelGroup.h" +#include "pvr/channels/PVRChannelGroup.h" +#include "pvr/addons/PVRClient.h" namespace PVR { @@ -61,6 +62,7 @@ namespace PVR virtual bool OnClickButtonUseEPG(CGUIMessage &message); virtual bool OnClickEPGSourceSpin(CGUIMessage &message); virtual bool OnClickButtonGroupManager(CGUIMessage &message); + virtual bool OnClickButtonNewChannel(); virtual bool PersistChannel(CFileItemPtr pItem, CPVRChannelGroupPtr group, unsigned int *iChannelNumber); virtual void SetItemsUnchanged(void); @@ -71,12 +73,17 @@ namespace PVR void SaveList(void); void Renumber(void); void SetData(int iItem); + void RenameChannel(CFileItemPtr pItem); bool m_bIsRadio; bool m_bMovingMode; bool m_bContainsChanges; + bool m_bAllowNewChannel; int m_iSelected; CFileItemList* m_channelItems; CGUIViewControl m_viewControl; + + typedef std::vector<PVR_CLIENT>::iterator PVR_CLIENT_ITR; + std::vector<PVR_CLIENT> m_clientsWithSettingsList; }; } diff --git a/xbmc/pvr/recordings/PVRRecording.cpp b/xbmc/pvr/recordings/PVRRecording.cpp index bb1713c170..96153a0571 100644 --- a/xbmc/pvr/recordings/PVRRecording.cpp +++ b/xbmc/pvr/recordings/PVRRecording.cpp @@ -103,6 +103,7 @@ CPVRRecording::CPVRRecording(const PVR_RECORDING &recording, unsigned int iClien m_strIconPath = recording.strIconPath; m_strThumbnailPath = recording.strThumbnailPath; m_strFanartPath = recording.strFanartPath; + m_bIsDeleted = recording.bIsDeleted; } bool CPVRRecording::operator ==(const CPVRRecording& right) const @@ -124,7 +125,8 @@ bool CPVRRecording::operator ==(const CPVRRecording& right) const m_strIconPath == right.m_strIconPath && m_strThumbnailPath == right.m_strThumbnailPath && m_strFanartPath == right.m_strFanartPath && - m_iRecordingId == right.m_iRecordingId); + m_iRecordingId == right.m_iRecordingId && + m_bIsDeleted == right.m_bIsDeleted); } bool CPVRRecording::operator !=(const CPVRRecording& right) const @@ -145,6 +147,7 @@ void CPVRRecording::Serialize(CVariant& value) const value["starttime"] = m_recordingTime.IsValid() ? m_recordingTime.GetAsDBDateTime() : ""; value["endtime"] = m_recordingTime.IsValid() ? (m_recordingTime + m_duration).GetAsDBDateTime() : ""; value["recordingid"] = m_iRecordingId; + value["deleted"] = m_bIsDeleted; if (!value.isMember("art")) value["art"] = CVariant(CVariant::VariantTypeObject); @@ -169,6 +172,7 @@ void CPVRRecording::Reset(void) m_strFanartPath .clear(); m_bGotMetaData = false; m_iRecordingId = 0; + m_bIsDeleted = false; m_recordingTime.Reset(); CVideoInfoTag::Reset(); @@ -194,6 +198,18 @@ bool CPVRRecording::Delete(void) return true; } +bool CPVRRecording::Undelete(void) +{ + PVR_ERROR error = g_PVRClients->UndeleteRecording(*this); + if (error != PVR_ERROR_NO_ERROR) + { + DisplayError(error); + return false; + } + + return true; +} + bool CPVRRecording::Rename(const std::string &strNewName) { m_strTitle = StringUtils::Format("%s", strNewName.c_str()); @@ -315,6 +331,7 @@ void CPVRRecording::Update(const CPVRRecording &tag) m_strIconPath = tag.m_strIconPath; m_strThumbnailPath = tag.m_strThumbnailPath; m_strFanartPath = tag.m_strFanartPath; + m_bIsDeleted = tag.m_bIsDeleted; if (g_PVRClients->SupportsRecordingPlayCount(m_iClientId)) m_playCount = tag.m_playCount; @@ -360,7 +377,7 @@ void CPVRRecording::UpdatePath(void) strDirectory = StringUtils::Format("%s/", m_strDirectory.c_str()); if (!m_strChannelName.empty()) strChannel = StringUtils::Format(" (%s)", m_strChannelName.c_str()); - m_strFileNameAndPath = StringUtils::Format("pvr://recordings/%s%s, TV%s, %s.pvr", strDirectory.c_str(), strTitle.c_str(), strChannel.c_str(), strDatetime.c_str()); + m_strFileNameAndPath = StringUtils::Format("pvr://recordings/%s/%s%s, TV%s, %s.pvr", (m_bIsDeleted ? "deleted" : "active"), strDirectory.c_str(), strTitle.c_str(), strChannel.c_str(), strDatetime.c_str()); } } diff --git a/xbmc/pvr/recordings/PVRRecording.h b/xbmc/pvr/recordings/PVRRecording.h index c3a9adac87..0eb0abb3f7 100644 --- a/xbmc/pvr/recordings/PVRRecording.h +++ b/xbmc/pvr/recordings/PVRRecording.h @@ -115,6 +115,12 @@ namespace PVR bool Delete(void); /*! + * @brief Undelete this recording on the client (if supported). + * @return True if it was undeleted successfully, false otherwise. + */ + bool Undelete(void); + + /*! * @brief Rename this recording on the client (if supported). * @param strNewName The new name. * @return True if it was renamed successfully, false otherwise. @@ -183,9 +189,15 @@ namespace PVR */ void CopyClientInfo(CVideoInfoTag *target) const; + /*! + * @brief If deleted but can be undeleted it is true + */ + bool IsDeleted() const { return m_bIsDeleted; } + private: CDateTime m_recordingTime; /*!< start time of the recording */ bool m_bGotMetaData; + bool m_bIsDeleted; /*!< set if entry is a deleted recording which can be undelete */ void UpdatePath(void); void DisplayError(PVR_ERROR err) const; diff --git a/xbmc/pvr/recordings/PVRRecordings.cpp b/xbmc/pvr/recordings/PVRRecordings.cpp index 56eff347de..91a7880601 100644 --- a/xbmc/pvr/recordings/PVRRecordings.cpp +++ b/xbmc/pvr/recordings/PVRRecordings.cpp @@ -57,7 +57,8 @@ void CPVRRecordings::UpdateFromClients(void) { CSingleLock lock(m_critSection); Clear(); - g_PVRClients->GetRecordings(this); + g_PVRClients->GetRecordings(this, false); + g_PVRClients->GetRecordings(this, true); } std::string CPVRRecordings::TrimSlashes(const std::string &strOrig) const @@ -107,10 +108,11 @@ bool CPVRRecordings::IsDirectoryMember(const std::string &strDirectory, const st StringUtils::StartsWithNoCase(strUseEntryDirectory, strUseDirectory); } -void CPVRRecordings::GetSubDirectories(const std::string &strBase, CFileItemList *results) +void CPVRRecordings::GetSubDirectories(const std::string &strBase, CFileItemList *results, bool bDeleted) { std::string strUseBase = TrimSlashes(strBase); std::set<CFileItemPtr> unwatchedFolders; + std::string strBasePath = bDeleted ? "deleted" : "active"; for (PVR_RECORDINGMAP_CITR it = m_recordings.begin(); it != m_recordings.end(); it++) { @@ -121,9 +123,9 @@ void CPVRRecordings::GetSubDirectories(const std::string &strBase, CFileItemList std::string strFilePath; if(strUseBase.empty()) - strFilePath = StringUtils::Format("pvr://recordings/%s/", strCurrent.c_str()); + strFilePath = StringUtils::Format("pvr://recordings/%s/%s/", strBasePath.c_str(), strCurrent.c_str()); else - strFilePath = StringUtils::Format("pvr://recordings/%s/%s/", strUseBase.c_str(), strCurrent.c_str()); + strFilePath = StringUtils::Format("pvr://recordings/%s/%s/%s/", strBasePath.c_str(), strUseBase.c_str(), strCurrent.c_str()); CFileItemPtr pFileItem; if (m_database.IsOpen()) @@ -194,17 +196,28 @@ int CPVRRecordings::GetNumRecordings() return m_recordings.size(); } -int CPVRRecordings::GetRecordings(CFileItemList* results) +bool CPVRRecordings::HasDeletedRecordings() +{ + CSingleLock lock(m_critSection); + return m_bHasDeleted; +} + +int CPVRRecordings::GetRecordings(CFileItemList* results, bool bDeleted) { CSingleLock lock(m_critSection); + int iRecCount = 0; for (PVR_RECORDINGMAP_CITR it = m_recordings.begin(); it != m_recordings.end(); it++) { + if (it->second->IsDeleted() != bDeleted) + continue; + CFileItemPtr pFileItem(new CFileItem(it->second)); results->Add(pFileItem); + iRecCount++; } - return m_recordings.size(); + return iRecCount; } bool CPVRRecordings::Delete(const CFileItem& item) @@ -240,9 +253,21 @@ bool CPVRRecordings::DeleteRecording(const CFileItem &item) return tag->Delete(); } +bool CPVRRecordings::Undelete(const CFileItem &item) +{ + if (!item.IsDeletedPVRRecording()) + { + CLog::Log(LOGERROR, "CPVRRecordings - %s - cannot undelete file: no valid recording tag", __FUNCTION__); + return false; + } + + CPVRRecordingPtr tag = item.GetPVRRecordingInfoTag(); + return tag->Undelete(); +} + bool CPVRRecordings::RenameRecording(CFileItem &item, std::string &strNewName) { - if (!item.IsPVRRecording()) + if (!item.IsUsablePVRRecording()) { CLog::Log(LOGERROR, "CPVRRecordings - %s - cannot rename file: no valid recording tag", __FUNCTION__); return false; @@ -252,6 +277,11 @@ bool CPVRRecordings::RenameRecording(CFileItem &item, std::string &strNewName) return tag->Rename(strNewName); } +bool CPVRRecordings::DeleteAllRecordingsFromTrash() +{ + return g_PVRClients->DeleteAllRecordingsFromTrash(); +} + bool CPVRRecordings::SetRecordingsPlayCount(const CFileItemPtr &item, int count) { bool bResult = false; @@ -320,9 +350,13 @@ bool CPVRRecordings::GetDirectory(const std::string& strPath, CFileItemList &ite { strDirectoryPath.erase(0, 10); + // Check directory name is for deleted recordings + bool bDeleted = StringUtils::StartsWith(strDirectoryPath, "/deleted"); + strDirectoryPath.erase(0, bDeleted ? 8 : 7); + // get the directory structure if in non-flatten mode if (m_bGroupItems) - GetSubDirectories(strDirectoryPath, &items); + GetSubDirectories(strDirectoryPath, &items, bDeleted); // get all files of the currrent directory or recursively all files starting at the current directory if in flatten mode for (PVR_RECORDINGMAP_CITR it = m_recordings.begin(); it != m_recordings.end(); it++) @@ -330,7 +364,7 @@ bool CPVRRecordings::GetDirectory(const std::string& strPath, CFileItemList &ite CPVRRecordingPtr current = it->second; // skip items that are not members of the target directory - if (!IsDirectoryMember(strDirectoryPath, current->m_strDirectory)) + if (!IsDirectoryMember(strDirectoryPath, current->m_strDirectory) || current->IsDeleted() != bDeleted) continue; if (m_database.IsOpen()) @@ -367,12 +401,15 @@ bool CPVRRecordings::GetDirectory(const std::string& strPath, CFileItemList &ite return false; } -void CPVRRecordings::GetAll(CFileItemList &items) +void CPVRRecordings::GetAll(CFileItemList &items, bool bDeleted) { CSingleLock lock(m_critSection); for (PVR_RECORDINGMAP_CITR it = m_recordings.begin(); it != m_recordings.end(); it++) { CPVRRecordingPtr current = it->second; + if (current->IsDeleted() != bDeleted) + continue; + if (m_database.IsOpen()) current->UpdateMetadata(m_database); @@ -409,14 +446,18 @@ CFileItemPtr CPVRRecordings::GetByPath(const std::string &path) if (StringUtils::StartsWith(fileName, "recordings/")) { + // Check directory name is for deleted recordings + fileName.erase(0, 11); + bool bDeleted = StringUtils::StartsWith(fileName, "deleted/"); + for (PVR_RECORDINGMAP_CITR it = m_recordings.begin(); it != m_recordings.end(); it++) { CPVRRecordingPtr current = it->second; - if (URIUtils::PathEquals(path, current->m_strFileNameAndPath)) - { - CFileItemPtr fileItem(new CFileItem(current)); - return fileItem; - } + if (!URIUtils::PathEquals(path, current->m_strFileNameAndPath) || bDeleted != current->IsDeleted()) + continue; + + CFileItemPtr fileItem(new CFileItem(current)); + return fileItem; } } @@ -438,6 +479,7 @@ CPVRRecordingPtr CPVRRecordings::GetById(int iClientId, const std::string &strRe void CPVRRecordings::Clear() { CSingleLock lock(m_critSection); + m_bHasDeleted = false; m_recordings.clear(); } @@ -445,6 +487,9 @@ void CPVRRecordings::UpdateFromClient(const CPVRRecordingPtr &tag) { CSingleLock lock(m_critSection); + if (tag->IsDeleted()) + m_bHasDeleted = true; + CPVRRecordingPtr newTag = GetById(tag->m_iClientId, tag->m_strRecordingId); if (newTag) { diff --git a/xbmc/pvr/recordings/PVRRecordings.h b/xbmc/pvr/recordings/PVRRecordings.h index 9463887222..367c01acdb 100644 --- a/xbmc/pvr/recordings/PVRRecordings.h +++ b/xbmc/pvr/recordings/PVRRecordings.h @@ -42,12 +42,13 @@ namespace PVR unsigned int m_iLastId; bool m_bGroupItems; CVideoDatabase m_database; + bool m_bHasDeleted; virtual void UpdateFromClients(void); virtual std::string TrimSlashes(const std::string &strOrig) const; virtual const std::string GetDirectoryFromPath(const std::string &strPath, const std::string &strBase) const; virtual bool IsDirectoryMember(const std::string &strDirectory, const std::string &strEntryDirectory) const; - virtual void GetSubDirectories(const std::string &strBase, CFileItemList *results); + virtual void GetSubDirectories(const std::string &strBase, CFileItemList *results, bool bDeleted = false); /** * @brief recursively deletes all recordings in the specified directory @@ -72,7 +73,8 @@ namespace PVR void Update(void); int GetNumRecordings(); - int GetRecordings(CFileItemList* results); + bool HasDeletedRecordings(); + int GetRecordings(CFileItemList* results, bool bDeleted = false); /** * Deletes the item in question, be it a directory or a file @@ -80,13 +82,15 @@ namespace PVR * @return whether the item was deleted successfully */ bool Delete(const CFileItem &item); + bool Undelete(const CFileItem &item); + bool DeleteAllRecordingsFromTrash(); bool RenameRecording(CFileItem &item, std::string &strNewName); bool SetRecordingsPlayCount(const CFileItemPtr &item, int count); bool GetDirectory(const std::string& strPath, CFileItemList &items); CFileItemPtr GetByPath(const std::string &path); CPVRRecordingPtr GetById(int iClientId, const std::string &strRecordingId) const; - void GetAll(CFileItemList &items); + void GetAll(CFileItemList &items, bool bDeleted = false); CFileItemPtr GetById(unsigned int iId) const; void SetGroupItems(bool value) { m_bGroupItems = value; }; diff --git a/xbmc/pvr/windows/GUIViewStatePVR.cpp b/xbmc/pvr/windows/GUIViewStatePVR.cpp index 3941bfa8bf..7f335802c3 100644 --- a/xbmc/pvr/windows/GUIViewStatePVR.cpp +++ b/xbmc/pvr/windows/GUIViewStatePVR.cpp @@ -63,7 +63,7 @@ void CGUIViewStateWindowPVRRecordings::SaveViewState(void) bool CGUIViewStateWindowPVRRecordings::HideParentDirItems(void) { - return (CGUIViewState::HideParentDirItems() || m_items.GetPath() == "pvr://recordings/"); + return (CGUIViewState::HideParentDirItems() || m_items.GetPath() == "pvr://recordings/active/" || m_items.GetPath() == "pvr://recordings/deleted/"); } CGUIViewStateWindowPVRGuide::CGUIViewStateWindowPVRGuide(const int windowId, const CFileItemList& items) : CGUIViewStatePVR(windowId, items) diff --git a/xbmc/pvr/windows/GUIWindowPVRBase.cpp b/xbmc/pvr/windows/GUIWindowPVRBase.cpp index 025125c41a..b4e73dc801 100644 --- a/xbmc/pvr/windows/GUIWindowPVRBase.cpp +++ b/xbmc/pvr/windows/GUIWindowPVRBase.cpp @@ -26,12 +26,11 @@ #include "dialogs/GUIDialogKaiToast.h" #include "dialogs/GUIDialogOK.h" #include "dialogs/GUIDialogYesNo.h" +#include "dialogs/GUIDialogSelect.h" #include "filesystem/StackDirectory.h" #include "guilib/Key.h" #include "guilib/GUIMessage.h" #include "guilib/GUIWindowManager.h" -#include "dialogs/GUIDialogKaiToast.h" -#include "dialogs/GUIDialogSelect.h" #include "pvr/PVRManager.h" #include "pvr/addons/PVRClients.h" #include "pvr/dialogs/GUIDialogPVRGuideInfo.h" @@ -178,7 +177,9 @@ bool CGUIWindowPVRBase::OnContextButton(int itemNumber, CONTEXT_BUTTON button) g_PVRClients->ProcessMenuHooks(item->GetEPGInfoTag()->ChannelTag()->ClientID(), PVR_MENUHOOK_EPG, item.get()); else if (item->IsPVRChannel()) g_PVRClients->ProcessMenuHooks(item->GetPVRChannelInfoTag()->ClientID(), PVR_MENUHOOK_CHANNEL, item.get()); - else if (item->IsPVRRecording()) + else if (item->IsDeletedPVRRecording()) + g_PVRClients->ProcessMenuHooks(item->GetPVRRecordingInfoTag()->m_iClientId, PVR_MENUHOOK_DELETED_RECORDING, item.get()); + else if (item->IsUsablePVRRecording()) g_PVRClients->ProcessMenuHooks(item->GetPVRRecordingInfoTag()->m_iClientId, PVR_MENUHOOK_RECORDING, item.get()); else if (item->IsPVRTimer()) g_PVRClients->ProcessMenuHooks(item->GetPVRTimerInfoTag()->m_iClientId, PVR_MENUHOOK_TIMER, item.get()); diff --git a/xbmc/pvr/windows/GUIWindowPVRBase.h b/xbmc/pvr/windows/GUIWindowPVRBase.h index 6bfbe38cc1..f8f0b0346e 100644 --- a/xbmc/pvr/windows/GUIWindowPVRBase.h +++ b/xbmc/pvr/windows/GUIWindowPVRBase.h @@ -28,6 +28,7 @@ #define CONTROL_BTNSORTASC 4 #define CONTROL_BTNGROUPITEMS 5 #define CONTROL_BTNSHOWHIDDEN 6 +#define CONTROL_BTNSHOWDELETED 7 #define CONTROL_BTNCHANNELGROUPS 28 #define CONTROL_BTNFILTERCHANNELS 31 diff --git a/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp b/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp index 8f20bad083..a135078c7c 100644 --- a/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp +++ b/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp @@ -39,7 +39,8 @@ using namespace PVR; CGUIWindowPVRRecordings::CGUIWindowPVRRecordings(bool bRadio) : - CGUIWindowPVRBase(bRadio, bRadio ? WINDOW_RADIO_RECORDINGS : WINDOW_TV_RECORDINGS, "MyPVRRecordings.xml") + CGUIWindowPVRBase(bRadio, bRadio ? WINDOW_RADIO_RECORDINGS : WINDOW_TV_RECORDINGS, "MyPVRRecordings.xml") , + m_bShowDeletedRecordings(false) { } @@ -69,15 +70,18 @@ void CGUIWindowPVRRecordings::OnWindowLoaded() std::string CGUIWindowPVRRecordings::GetDirectoryPath(void) { - if (StringUtils::StartsWith(m_vecItems->GetPath(), "pvr://recordings/")) + std::string basePath = StringUtils::Format("pvr://recordings/%s/", m_bShowDeletedRecordings ? "deleted" : "active"); + + if (StringUtils::StartsWith(m_vecItems->GetPath(), basePath)) return m_vecItems->GetPath(); - return "pvr://recordings/"; + + return basePath; } std::string CGUIWindowPVRRecordings::GetResumeString(const CFileItem& item) { std::string resumeString; - if (item.IsPVRRecording()) + if (item.IsUsablePVRRecording()) { // First try to find the resume position on the back-end, if that fails use video database @@ -109,40 +113,62 @@ void CGUIWindowPVRRecordings::GetContextButtons(int itemNumber, CContextButtons return; CFileItemPtr pItem = m_vecItems->Get(itemNumber); + bool isDeletedRecording = false; + if (pItem->HasPVRRecordingInfoTag()) { + isDeletedRecording = pItem->GetPVRRecordingInfoTag()->IsDeleted(); + buttons.Add(CONTEXT_BUTTON_INFO, 19053); /* Get Information of this recording */ - buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar program */ - buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 12021); /* Play this recording */ - std::string resumeString = GetResumeString(*pItem); - if (!resumeString.empty()) + if (!isDeletedRecording) { - buttons.Add(CONTEXT_BUTTON_RESUME_ITEM, resumeString); + buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar program */ + buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 12021); /* Play this recording */ + std::string resumeString = GetResumeString(*pItem); + if (!resumeString.empty()) + { + buttons.Add(CONTEXT_BUTTON_RESUME_ITEM, resumeString); + } + } + else + { + buttons.Add(CONTEXT_BUTTON_UNDELETE, 19290); /* Undelete this recording */ + buttons.Add(CONTEXT_BUTTON_DELETE, 19291); /* Delete this permanently */ + if (m_vecItems->GetObjectCount() > 1) + buttons.Add(CONTEXT_BUTTON_DELETE_ALL, 19292); /* Delete all permanently */ } } - if (pItem->m_bIsFolder) - { - // Have both options for folders since we don't know whether all childs are watched/unwatched - buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); /* Mark as UnWatched */ - buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); /* Mark as Watched */ - } - if (pItem->HasPVRRecordingInfoTag()) + if (!isDeletedRecording) { - if (pItem->GetPVRRecordingInfoTag()->m_playCount > 0) + if (pItem->m_bIsFolder) + { + // Have both options for folders since we don't know whether all childs are watched/unwatched buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); /* Mark as UnWatched */ - else buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); /* Mark as Watched */ + } + if (pItem->HasPVRRecordingInfoTag()) + { + if (pItem->GetPVRRecordingInfoTag()->m_playCount > 0) + buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); /* Mark as UnWatched */ + else + buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); /* Mark as Watched */ - buttons.Add(CONTEXT_BUTTON_RENAME, 118); /* Rename this recording */ + buttons.Add(CONTEXT_BUTTON_RENAME, 118); /* Rename this recording */ + } + + buttons.Add(CONTEXT_BUTTON_DELETE, 117); } - - buttons.Add(CONTEXT_BUTTON_DELETE, 117); - if (pItem->HasPVRRecordingInfoTag() && - g_PVRClients->HasMenuHooks(pItem->GetPVRRecordingInfoTag()->m_iClientId, PVR_MENUHOOK_RECORDING)) - buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ + if (pItem->HasPVRRecordingInfoTag()) + { + if (!isDeletedRecording && g_PVRClients->HasMenuHooks(pItem->GetPVRRecordingInfoTag()->m_iClientId, PVR_MENUHOOK_RECORDING)) + buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ + else if (isDeletedRecording && g_PVRClients->HasMenuHooks(pItem->GetPVRRecordingInfoTag()->m_iClientId, PVR_MENUHOOK_DELETED_RECORDING)) + buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ + } - CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons); + if (!isDeletedRecording) + CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons); } bool CGUIWindowPVRRecordings::OnAction(const CAction &action) @@ -150,7 +176,7 @@ bool CGUIWindowPVRRecordings::OnAction(const CAction &action) if (action.GetID() == ACTION_PARENT_DIR || action.GetID() == ACTION_NAV_BACK) { - if (m_vecItems->GetPath() != "pvr://recordings/") + if (m_vecItems->GetPath() != "pvr://recordings/active/" && m_vecItems->GetPath() != "pvr://recordings/deleted/") { GoParentFolder(); return true; @@ -168,6 +194,8 @@ bool CGUIWindowPVRRecordings::OnContextButton(int itemNumber, CONTEXT_BUTTON but return OnContextButtonPlay(pItem.get(), button) || OnContextButtonRename(pItem.get(), button) || OnContextButtonDelete(pItem.get(), button) || + OnContextButtonUndelete(pItem.get(), button) || + OnContextButtonDeleteAll(pItem.get(), button) || OnContextButtonInfo(pItem.get(), button) || OnContextButtonMarkWatched(pItem, button) || CGUIWindowPVRBase::OnContextButton(itemNumber, button); @@ -177,7 +205,30 @@ bool CGUIWindowPVRRecordings::Update(const std::string &strDirectory, bool updat { m_thumbLoader.StopThread(); - return CGUIWindowPVRBase::Update(strDirectory); + bool bReturn = CGUIWindowPVRBase::Update(strDirectory); + + /* empty list for deleted recordings */ + if (m_vecItems->GetObjectCount() == 0 && m_bShowDeletedRecordings) + { + /* show the normal recordings instead */ + m_bShowDeletedRecordings = false; + Update(GetDirectoryPath()); + } + + return bReturn; +} + +void CGUIWindowPVRRecordings::UpdateButtons(void) +{ + CGUIRadioButtonControl *btnShowDeleted = (CGUIRadioButtonControl*) GetControl(CONTROL_BTNSHOWDELETED); + if (btnShowDeleted) + { + btnShowDeleted->SetVisible(g_PVRRecordings->HasDeletedRecordings()); + btnShowDeleted->SetSelected(m_bShowDeletedRecordings); + } + + CGUIWindowPVRBase::UpdateButtons(); + SET_CONTROL_LABEL(CONTROL_LABEL_HEADER1, m_bShowDeletedRecordings ? g_localizeStrings.Get(19179) : ""); /* Deleted recordings trash */ } bool CGUIWindowPVRRecordings::OnMessage(CGUIMessage &message) @@ -236,6 +287,16 @@ bool CGUIWindowPVRRecordings::OnMessage(CGUIMessage &message) g_PVRRecordings->SetGroupItems(radioButton->IsSelected()); Refresh(true); } + else if (message.GetSenderId() == CONTROL_BTNSHOWDELETED) + { + CGUIRadioButtonControl *radioButton = (CGUIRadioButtonControl*) GetControl(CONTROL_BTNSHOWDELETED); + if (radioButton) + { + m_bShowDeletedRecordings = radioButton->IsSelected(); + Update(GetDirectoryPath()); + } + bReturn = true; + } break; case GUI_MSG_REFRESH_LIST: switch(message.GetParam1()) @@ -267,7 +328,7 @@ bool CGUIWindowPVRRecordings::ActionDeleteRecording(CFileItem *item) { bool bReturn = false; - if (!item->IsPVRRecording() && !item->m_bIsFolder) + if ((!item->IsPVRRecording() && !item->m_bIsFolder) || item->IsParentFolder()) return bReturn; /* show a confirmation dialog */ @@ -276,7 +337,7 @@ bool CGUIWindowPVRRecordings::ActionDeleteRecording(CFileItem *item) return bReturn; pDialog->SetHeading(122); // Confirm delete - pDialog->SetLine(0, item->m_bIsFolder ? 19113 : 19112); // Are you sure? + pDialog->SetLine(0, item->m_bIsFolder ? 19113 : item->GetPVRRecordingInfoTag()->IsDeleted() ? 19294 : 19112); // Delete all recordings in this folder? / Delete this recording permanently? / Delete this recording? pDialog->SetLine(1, ""); pDialog->SetLine(2, item->GetLabel()); pDialog->SetChoice(1, 117); // Delete @@ -297,7 +358,8 @@ bool CGUIWindowPVRRecordings::ActionDeleteRecording(CFileItem *item) m_vecItems->Remove(item); /* go to the parent folder if we're in a subdirectory and just deleted the last item */ - if (m_vecItems->GetPath() != "pvr://recordings/" && m_vecItems->GetObjectCount() == 0) + if (m_vecItems->GetPath() != "pvr://recordings/active/" && + m_vecItems->GetPath() != "pvr://recordings/deleted/" && m_vecItems->GetObjectCount() == 0) GoParentFolder(); } @@ -309,6 +371,72 @@ bool CGUIWindowPVRRecordings::OnContextButtonDelete(CFileItem *item, CONTEXT_BUT return button == CONTEXT_BUTTON_DELETE ? ActionDeleteRecording(item) : false; } +bool CGUIWindowPVRRecordings::OnContextButtonUndelete(CFileItem *item, CONTEXT_BUTTON button) +{ + bool bReturn = false; + + if (button != CONTEXT_BUTTON_UNDELETE || !item->IsDeletedPVRRecording()) + return bReturn; + + /* undelete the recording */ + if (g_PVRRecordings->Undelete(*item)) + { + g_PVRManager.TriggerRecordingsUpdate(); + bReturn = true; + + /* remove the item from the list immediately, otherwise the + item count further down may be wrong */ + m_vecItems->Remove(item); + + /* go to the parent folder if we're in a subdirectory and just deleted the last item */ + if (m_vecItems->GetPath() != "pvr://recordings/deleted/" && m_vecItems->GetObjectCount() == 0) + GoParentFolder(); + } + + return bReturn; +} + +bool CGUIWindowPVRRecordings::OnContextButtonDeleteAll(CFileItem *item, CONTEXT_BUTTON button) +{ + bool bReturn = false; + + if (button != CONTEXT_BUTTON_DELETE_ALL || !item->IsDeletedPVRRecording()) + return bReturn; + + /* show a confirmation dialog */ + CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); + if (!pDialog) + return bReturn; + + + pDialog->SetHeading(19292); // Delete all permanently + pDialog->SetLine(0, 19293); // Delete all recordings permanently? + pDialog->SetLine(1, ""); + pDialog->SetLine(2, ""); + pDialog->SetChoice(1, 117); // Delete + + /* prompt for the user's confirmation */ + pDialog->DoModal(); + if (!pDialog->IsConfirmed()) + return bReturn; + + /* undelete the recording */ + if (g_PVRRecordings->DeleteAllRecordingsFromTrash()) + { + g_PVRManager.TriggerRecordingsUpdate(); + bReturn = true; + + /* remove the item from the list immediately, otherwise the + item count further down may be wrong */ + m_vecItems->Clear(); + + /* go to the parent folder if we're in a subdirectory and just deleted the last item */ + if (m_vecItems->GetPath() != "pvr://recordings/deleted/" && m_vecItems->GetObjectCount() == 0) + GoParentFolder(); + } + return bReturn; +} + bool CGUIWindowPVRRecordings::OnContextButtonInfo(CFileItem *item, CONTEXT_BUTTON button) { bool bReturn = false; diff --git a/xbmc/pvr/windows/GUIWindowPVRRecordings.h b/xbmc/pvr/windows/GUIWindowPVRRecordings.h index 72ba2e8951..6d45ca0fe7 100644 --- a/xbmc/pvr/windows/GUIWindowPVRRecordings.h +++ b/xbmc/pvr/windows/GUIWindowPVRRecordings.h @@ -40,6 +40,7 @@ namespace PVR void GetContextButtons(int itemNumber, CContextButtons &buttons); bool OnContextButton(int itemNumber, CONTEXT_BUTTON button); bool Update(const std::string &strDirectory, bool updateFilterPath = true); + void UpdateButtons(void); void UnregisterObservers(void); void ResetObservers(void); @@ -50,6 +51,8 @@ namespace PVR private: bool ActionDeleteRecording(CFileItem *item); bool OnContextButtonDelete(CFileItem *item, CONTEXT_BUTTON button); + bool OnContextButtonUndelete(CFileItem *item, CONTEXT_BUTTON button); + bool OnContextButtonDeleteAll(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonInfo(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonPlay(CFileItem *item, CONTEXT_BUTTON button); bool OnContextButtonRename(CFileItem *item, CONTEXT_BUTTON button); @@ -57,5 +60,6 @@ namespace PVR CVideoThumbLoader m_thumbLoader; CVideoDatabase m_database; + bool m_bShowDeletedRecordings; }; } diff --git a/xbmc/pvr/windows/GUIWindowPVRSearch.cpp b/xbmc/pvr/windows/GUIWindowPVRSearch.cpp index bfbbaf134e..bcac15a25a 100644 --- a/xbmc/pvr/windows/GUIWindowPVRSearch.cpp +++ b/xbmc/pvr/windows/GUIWindowPVRSearch.cpp @@ -116,7 +116,7 @@ bool CGUIWindowPVRSearch::OnContextButton(const CFileItem &item, CONTEXT_BUTTON if (tag) m_searchfilter.m_strSearchTerm = "\"" + tag->Title() + "\""; } - else if (item.IsPVRRecording()) + else if (item.IsUsablePVRRecording()) m_searchfilter.m_strSearchTerm = "\"" + item.GetPVRRecordingInfoTag()->m_strTitle + "\""; else if (item.IsPVRTimer()) m_searchfilter.m_strSearchTerm = "\"" + item.GetPVRTimerInfoTag()->m_strTitle + "\""; diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp index d49da594de..eb39cecca0 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -115,8 +115,10 @@ void CAdvancedSettings::Initialize() m_limiterHold = 0.025f; m_limiterRelease = 0.1f; + m_seekSteps = { 7, 15, 30, 60, 180, 300, 600, 900, 1800 }; + m_omxHWAudioDecode = false; - m_omxDecodeStartWithValidFrame = false; + m_omxDecodeStartWithValidFrame = true; m_karaokeSyncDelayCDG = 0.0f; m_karaokeSyncDelayLRC = 0.0f; @@ -131,9 +133,6 @@ void CAdvancedSettings::Initialize() m_videoSubsDelayRange = 60; m_videoAudioDelayRange = 10; - m_videoSmallStepBackSeconds = 7; - m_videoSmallStepBackTries = 3; - m_videoSmallStepBackDelay = 300; m_videoUseTimeSeeking = true; m_videoTimeSeekForward = 30; m_videoTimeSeekBackward = -30; @@ -143,18 +142,7 @@ void CAdvancedSettings::Initialize() m_videoPercentSeekBackward = -2; m_videoPercentSeekForwardBig = 10; m_videoPercentSeekBackwardBig = -10; - - m_videoSeekSteps.clear(); - m_videoSeekSteps.push_back(7); - m_videoSeekSteps.push_back(15); - m_videoSeekSteps.push_back(30); - m_videoSeekSteps.push_back(60); - m_videoSeekSteps.push_back(180); - m_videoSeekSteps.push_back(300); - m_videoSeekSteps.push_back(600); - m_videoSeekSteps.push_back(900); - m_videoSeekSteps.push_back(1800); - + m_videoBlackBarColour = 0; m_videoPPFFmpegDeint = "linblenddeint"; m_videoPPFFmpegPostProc = "ha:128:7,va,dr"; @@ -294,6 +282,7 @@ void CAdvancedSettings::Initialize() m_iVideoLibraryRecentlyAddedItems = 25; m_bVideoLibraryHideEmptySeries = false; m_bVideoLibraryCleanOnUpdate = false; + m_bVideoLibraryUseFastHash = true; m_bVideoLibraryExportAutoThumbs = false; m_bVideoLibraryImportWatchedState = false; m_bVideoLibraryImportResumePoint = false; @@ -563,25 +552,11 @@ void CAdvancedSettings::ParseSettingsFile(const std::string &file) XMLUtils::GetInt(pElement, "ignoresecondsatstart", m_videoIgnoreSecondsAtStart, 0, 900); XMLUtils::GetFloat(pElement, "ignorepercentatend", m_videoIgnorePercentAtEnd, 0, 100.0f); - XMLUtils::GetInt(pElement, "smallstepbackseconds", m_videoSmallStepBackSeconds, 1, INT_MAX); - XMLUtils::GetInt(pElement, "smallstepbacktries", m_videoSmallStepBackTries, 1, 10); - XMLUtils::GetInt(pElement, "smallstepbackdelay", m_videoSmallStepBackDelay, 100, 5000); //MS - XMLUtils::GetBoolean(pElement, "usetimeseeking", m_videoUseTimeSeeking); XMLUtils::GetInt(pElement, "timeseekforward", m_videoTimeSeekForward, 0, 6000); XMLUtils::GetInt(pElement, "timeseekbackward", m_videoTimeSeekBackward, -6000, 0); XMLUtils::GetInt(pElement, "timeseekforwardbig", m_videoTimeSeekForwardBig, 0, 6000); XMLUtils::GetInt(pElement, "timeseekbackwardbig", m_videoTimeSeekBackwardBig, -6000, 0); - - std::string seekSteps; - XMLUtils::GetString(pRootElement, "seeksteps", seekSteps); - if (!seekSteps.empty()) - { - m_videoSeekSteps.clear(); - std::vector<string> steps = StringUtils::Split(seekSteps, ','); - for(std::vector<string>::iterator it = steps.begin(); it != steps.end(); ++it) - m_videoSeekSteps.push_back(atoi((*it).c_str())); - } XMLUtils::GetInt(pElement, "percentseekforward", m_videoPercentSeekForward, 0, 100); XMLUtils::GetInt(pElement, "percentseekbackward", m_videoPercentSeekBackward, -100, 0); @@ -788,6 +763,7 @@ void CAdvancedSettings::ParseSettingsFile(const std::string &file) XMLUtils::GetInt(pElement, "recentlyaddeditems", m_iVideoLibraryRecentlyAddedItems, 1, INT_MAX); XMLUtils::GetBoolean(pElement, "hideemptyseries", m_bVideoLibraryHideEmptySeries); XMLUtils::GetBoolean(pElement, "cleanonupdate", m_bVideoLibraryCleanOnUpdate); + XMLUtils::GetBoolean(pElement, "usefasthash", m_bVideoLibraryUseFastHash); XMLUtils::GetString(pElement, "itemseparator", m_videoItemSeparator); XMLUtils::GetBoolean(pElement, "exportautothumbs", m_bVideoLibraryExportAutoThumbs); XMLUtils::GetBoolean(pElement, "importwatchedstate", m_bVideoLibraryImportWatchedState); @@ -1200,6 +1176,16 @@ void CAdvancedSettings::ParseSettingsFile(const std::string &file) XMLUtils::GetInt(pElement, "nofliptimeout", m_guiDirtyRegionNoFlipTimeout); } + std::string seekSteps; + XMLUtils::GetString(pRootElement, "seeksteps", seekSteps); + if (!seekSteps.empty()) + { + m_seekSteps.clear(); + std::vector<string> steps = StringUtils::Split(seekSteps, ','); + for(std::vector<string>::iterator it = steps.begin(); it != steps.end(); ++it) + m_seekSteps.push_back(atoi((*it).c_str())); + } + // load in the settings overrides CSettings::Get().Load(pRootElement, true); // true to hide the settings we read in } diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h index 9194adb50c..ae56be0e04 100644 --- a/xbmc/settings/AdvancedSettings.h +++ b/xbmc/settings/AdvancedSettings.h @@ -149,9 +149,6 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler float m_videoSubsDelayRange; float m_videoAudioDelayRange; - int m_videoSmallStepBackSeconds; - int m_videoSmallStepBackTries; - int m_videoSmallStepBackDelay; bool m_videoUseTimeSeeking; int m_videoTimeSeekForward; int m_videoTimeSeekBackward; @@ -161,7 +158,7 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler int m_videoPercentSeekBackward; int m_videoPercentSeekForwardBig; int m_videoPercentSeekBackwardBig; - std::vector<int> m_videoSeekSteps; + std::vector<int> m_seekSteps; std::string m_videoPPFFmpegDeint; std::string m_videoPPFFmpegPostProc; bool m_videoVDPAUtelecine; @@ -281,6 +278,7 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler int m_iVideoLibraryRecentlyAddedItems; bool m_bVideoLibraryHideEmptySeries; bool m_bVideoLibraryCleanOnUpdate; + bool m_bVideoLibraryUseFastHash; bool m_bVideoLibraryExportAutoThumbs; bool m_bVideoLibraryImportWatchedState; bool m_bVideoLibraryImportResumePoint; diff --git a/xbmc/settings/SettingConditions.cpp b/xbmc/settings/SettingConditions.cpp index 450b02161a..c313bd0fad 100644 --- a/xbmc/settings/SettingConditions.cpp +++ b/xbmc/settings/SettingConditions.cpp @@ -237,8 +237,7 @@ void CSettingConditions::Initialize() m_simpleConditions.insert("have_libvdpau"); #endif #ifdef TARGET_ANDROID - if (CAndroidFeatures::GetVersion() > 15) - m_simpleConditions.insert("has_mediacodec"); + m_simpleConditions.insert("has_mediacodec"); #endif #ifdef HAS_LIBSTAGEFRIGHT m_simpleConditions.insert("have_libstagefrightdecoder"); diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp index 287118595e..996d50c62f 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -691,6 +691,8 @@ void CSettings::InitializeISettingCallbacks() settingSet.clear(); settingSet.insert("videoplayer.seekdelay"); settingSet.insert("videoplayer.seeksteps"); + settingSet.insert("musicplayer.seekdelay"); + settingSet.insert("musicplayer.seeksteps"); m_settingsManager->RegisterCallback(&CSeekHandler::Get(), settingSet); settingSet.clear(); diff --git a/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp b/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp index eba3967e33..668df0c9c6 100644 --- a/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp +++ b/xbmc/settings/dialogs/GUIDialogSettingsBase.cpp @@ -539,6 +539,11 @@ std::set<std::string> CGUIDialogSettingsBase::CreateSettings() return settingMap; } +std::string CGUIDialogSettingsBase::GetSettingsLabel(CSetting *pSetting) +{ + return GetLocalizedString(pSetting->GetLabel()); +} + void CGUIDialogSettingsBase::UpdateSettings() { for (vector<BaseSettingControlPtr>::iterator it = m_settingControls.begin(); it != m_settingControls.end(); ++it) @@ -562,7 +567,7 @@ CGUIControl* CGUIDialogSettingsBase::AddSetting(CSetting *pSetting, float width, CGUIControl *pControl = NULL; // determine the label and any possible indentation in case of sub settings - string label = GetLocalizedString(pSetting->GetLabel()); + std::string label = GetSettingsLabel(pSetting); int parentLevels = 0; CSetting *parentSetting = GetSetting(pSetting->GetParent()); while (parentSetting != NULL) diff --git a/xbmc/settings/dialogs/GUIDialogSettingsBase.h b/xbmc/settings/dialogs/GUIDialogSettingsBase.h index bac9cecba9..d7f39619dd 100644 --- a/xbmc/settings/dialogs/GUIDialogSettingsBase.h +++ b/xbmc/settings/dialogs/GUIDialogSettingsBase.h @@ -101,7 +101,19 @@ protected: virtual void SetupView(); virtual std::set<std::string> CreateSettings(); virtual void UpdateSettings(); - + + /*! + \brief Get the name for the setting entry + + Used as virtual to allow related settings dialog to give a std::string name of the setting. + If not used on own dialog class it handle the string from int CSetting::GetLabel(), + This must also be used if on related dialog no special entry is wanted. + + \param pSetting Base settings class which need the name + \return Name used on settings dialog + */ + virtual std::string GetSettingsLabel(CSetting *pSetting); + virtual CGUIControl* AddSetting(CSetting *pSetting, float width, int &iControlID); virtual CGUIControl* AddSettingControl(CGUIControl *pControl, BaseSettingControlPtr pSettingControl, float width, int &iControlID); diff --git a/xbmc/settings/lib/ISetting.cpp b/xbmc/settings/lib/ISetting.cpp index 755b1bf82f..921889aa3e 100644 --- a/xbmc/settings/lib/ISetting.cpp +++ b/xbmc/settings/lib/ISetting.cpp @@ -30,6 +30,7 @@ ISetting::ISetting(const std::string &id, CSettingsManager *settingsManager /* = : m_id(id), m_settingsManager(settingsManager), m_visible(true), + m_label(-1), m_help(-1), m_meetsRequirements(true), m_requirementCondition(settingsManager) { } @@ -43,6 +44,16 @@ bool ISetting::Deserialize(const TiXmlNode *node, bool update /* = false */) if (XMLUtils::GetBoolean(node, SETTING_XML_ELM_VISIBLE, value)) m_visible = value; + const TiXmlElement *element = node->ToElement(); + if (element == NULL) + return false; + + int iValue = -1; + if (element->QueryIntAttribute(SETTING_XML_ATTR_LABEL, &iValue) == TIXML_SUCCESS && iValue > 0) + m_label = iValue; + if (element->QueryIntAttribute(SETTING_XML_ATTR_HELP, &iValue) == TIXML_SUCCESS && iValue > 0) + m_help = iValue; + const TiXmlNode *requirementNode = node->FirstChild(SETTING_XML_ELM_REQUIREMENT); if (requirementNode == NULL) return true; diff --git a/xbmc/settings/lib/ISetting.h b/xbmc/settings/lib/ISetting.h index 4bfe65c4b9..b2df2b4a8d 100644 --- a/xbmc/settings/lib/ISetting.h +++ b/xbmc/settings/lib/ISetting.h @@ -73,7 +73,30 @@ public: \param visible Whether the setting object shall be visible or not */ virtual void SetVisible(bool visible) { m_visible = visible; } + /*! + \brief Gets the localizeable label ID of the setting group. + \return Localizeable label ID of the setting group + */ + const int GetLabel() const { return m_label; } + /*! + \brief Sets the localizeable label ID of the setting group. + + \param label Localizeable label ID of the setting group + */ + void SetLabel(int label) { m_label = label; } + /*! + \brief Gets the localizeable help ID of the setting group. + + \return Localizeable help ID of the setting group + */ + const int GetHelp() const { return m_help; } + /*! + \brief Sets the localizeable help ID of the setting group. + + \param label Localizeable help ID of the setting group + */ + void SetHelp(int help) { m_help = help; } /*! \brief Whether the setting object meets all necessary requirements. @@ -107,6 +130,8 @@ protected: private: bool m_visible; + int m_label; + int m_help; bool m_meetsRequirements; CSettingRequirement m_requirementCondition; }; diff --git a/xbmc/settings/lib/SettingSection.cpp b/xbmc/settings/lib/SettingSection.cpp index 9d0c45cb98..c970bffe8b 100644 --- a/xbmc/settings/lib/SettingSection.cpp +++ b/xbmc/settings/lib/SettingSection.cpp @@ -153,7 +153,6 @@ void CSettingGroup::AddSettings(const SettingList &settings) CSettingCategory::CSettingCategory(const std::string &id, CSettingsManager *settingsManager /* = NULL */) : ISetting(id, settingsManager), - m_label(-1), m_help(-1), m_accessCondition(settingsManager) { } @@ -170,16 +169,6 @@ bool CSettingCategory::Deserialize(const TiXmlNode *node, bool update /* = false // handle <visible> conditions if (!ISetting::Deserialize(node, update)) return false; - - const TiXmlElement *element = node->ToElement(); - if (element == NULL) - return false; - - int tmp = -1; - if (element->QueryIntAttribute(SETTING_XML_ATTR_LABEL, &tmp) == TIXML_SUCCESS && tmp > 0) - m_label = tmp; - if (element->QueryIntAttribute(SETTING_XML_ATTR_HELP, &tmp) == TIXML_SUCCESS && tmp > 0) - m_help = tmp; const TiXmlNode *accessNode = node->FirstChild(SETTING_XML_ELM_ACCESS); if (accessNode != NULL && !m_accessCondition.Deserialize(accessNode)) @@ -254,8 +243,7 @@ void CSettingCategory::AddGroups(const SettingGroupList &groups) } CSettingSection::CSettingSection(const std::string &id, CSettingsManager *settingsManager /* = NULL */) - : ISetting(id, settingsManager), - m_label(-1), m_help(-1) + : ISetting(id, settingsManager) { } CSettingSection::~CSettingSection() @@ -272,16 +260,6 @@ bool CSettingSection::Deserialize(const TiXmlNode *node, bool update /* = false if (!ISetting::Deserialize(node, update)) return false; - const TiXmlElement *element = node->ToElement(); - if (element == NULL) - return false; - - int tmp = -1; - if (element->QueryIntAttribute(SETTING_XML_ATTR_LABEL, &tmp) == TIXML_SUCCESS && tmp > 0) - m_label = tmp; - if (element->QueryIntAttribute(SETTING_XML_ATTR_HELP, &tmp) == TIXML_SUCCESS && tmp > 0) - m_help = tmp; - const TiXmlNode *categoryNode = node->FirstChild(SETTING_XML_ELM_CATEGORY); while (categoryNode != NULL) { diff --git a/xbmc/settings/lib/SettingSection.h b/xbmc/settings/lib/SettingSection.h index fd43743bda..1be382d3d8 100644 --- a/xbmc/settings/lib/SettingSection.h +++ b/xbmc/settings/lib/SettingSection.h @@ -96,30 +96,6 @@ public: virtual bool Deserialize(const TiXmlNode *node, bool update = false); /*! - \brief Gets the localizeable label ID of the setting category. - - \return Localizeable label ID of the setting category - */ - const int GetLabel() const { return m_label; } - /*! - \brief Sets the localizeable label ID of the setting category. - - \param label Localizeable label ID of the setting category - */ - void SetLabel(int label) { m_label = label; } - /*! - \brief Gets the localizeable help ID of the setting category. - - \return Localizeable help ID of the setting category - */ - const int GetHelp() const { return m_help; } - /*! - \brief Sets the localizeable help ID of the setting category. - - \param label Localizeable help ID of the setting category - */ - void SetHelp(int help) { m_help = help; } - /*! \brief Gets the full list of setting groups belonging to the setting category. @@ -147,8 +123,6 @@ public: void AddGroups(const SettingGroupList &groups); private: - int m_label; - int m_help; SettingGroupList m_groups; CSettingCategoryAccess m_accessCondition; }; @@ -177,30 +151,6 @@ public: virtual bool Deserialize(const TiXmlNode *node, bool update = false); /*! - \brief Gets the localizeable label ID of the setting section. - - \return Localizeable label ID of the setting section - */ - const int GetLabel() const { return m_label; } - /*! - \brief Sets the localizeable label ID of the setting section. - - \param label Localizeable label ID of the setting section - */ - void SetLabel(int label) { m_label = label; } - /*! - \brief Gets the localizeable help ID of the setting section. - - \return Localizeable help ID of the setting section - */ - const int GetHelp() const { return m_help; } - /*! - \brief Sets the localizeable help ID of the setting section. - - \param label Localizeable help ID of the setting section - */ - void SetHelp(int help) { m_help = help; } - /*! \brief Gets the full list of setting categories belonging to the setting section. @@ -221,7 +171,5 @@ public: void AddCategories(const SettingCategoryList &categories); private: - int m_label; - int m_help; SettingCategoryList m_categories; }; diff --git a/xbmc/threads/Atomics.cpp b/xbmc/threads/Atomics.cpp index ca5d981970..417b2b6c6f 100644 --- a/xbmc/threads/Atomics.cpp +++ b/xbmc/threads/Atomics.cpp @@ -50,7 +50,7 @@ long cas(volatile long *pAddr, long expectedVal, long swapVal) return prev; #elif defined(__arm__) - register long prev; + long prev; asm volatile ( "dmb ish \n" // Memory barrier. Make sure all memory accesses appearing before this complete before any that appear after "1: \n" @@ -172,7 +172,7 @@ long AtomicIncrement(volatile long* pAddr) return val; #elif defined(__arm__) && !defined(__ARM_ARCH_5__) - register long val; + long val; asm volatile ( "dmb ish \n" // Memory barrier. Make sure all memory accesses appearing before this complete before any that appear after "1: \n" @@ -203,7 +203,7 @@ long AtomicIncrement(volatile long* pAddr) return val; #elif defined(__x86_64__) - register long result; + long result; __asm__ __volatile__ ( "lock/xaddq %q0, %1" : "=r" (result), "=m" (*pAddr) @@ -211,7 +211,7 @@ long AtomicIncrement(volatile long* pAddr) return *pAddr; #else // Linux / OSX86 (GCC) - register long reg __asm__ ("eax") = 1; + long reg __asm__ ("eax") = 1; __asm__ __volatile__ ( "lock/xadd %0, %1 \n" "inc %%eax" @@ -247,7 +247,7 @@ long AtomicAdd(volatile long* pAddr, long amount) return val; #elif defined(__arm__) && !defined(__ARM_ARCH_5__) - register long val; + long val; asm volatile ( "dmb ish \n" // Memory barrier. Make sure all memory accesses appearing before this complete before any that appear after "1: \n" @@ -278,7 +278,7 @@ long AtomicAdd(volatile long* pAddr, long amount) return amount; #elif defined(__x86_64__) - register long result; + long result; __asm__ __volatile__ ( "lock/xaddq %q0, %1" : "=r" (result), "=m" (*pAddr) @@ -286,7 +286,7 @@ long AtomicAdd(volatile long* pAddr, long amount) return *pAddr; #else // Linux / OSX86 (GCC) - register long reg __asm__ ("eax") = amount; + long reg __asm__ ("eax") = amount; __asm__ __volatile__ ( "lock/xadd %0, %1 \n" "dec %%eax" @@ -322,7 +322,7 @@ long AtomicDecrement(volatile long* pAddr) return val; #elif defined(__arm__) - register long val; + long val; asm volatile ( "dmb ish \n" // Memory barrier. Make sure all memory accesses appearing before this complete before any that appear after "1: \n" @@ -353,7 +353,7 @@ long AtomicDecrement(volatile long* pAddr) return val; #elif defined(__x86_64__) - register long result; + long result; __asm__ __volatile__ ( "lock/xaddq %q0, %1" : "=r" (result), "=m" (*pAddr) @@ -361,7 +361,7 @@ long AtomicDecrement(volatile long* pAddr) return *pAddr; #else // Linux / OSX86 (GCC) - register long reg __asm__ ("eax") = -1; + long reg __asm__ ("eax") = -1; __asm__ __volatile__ ( "lock/xadd %0, %1 \n" "dec %%eax" @@ -398,7 +398,7 @@ long AtomicSubtract(volatile long* pAddr, long amount) return val; #elif defined(__arm__) - register long val; + long val; asm volatile ( "dmb ish \n" // Memory barrier. Make sure all memory accesses appearing before this complete before any that appear after "1: \n" @@ -430,7 +430,7 @@ long AtomicSubtract(volatile long* pAddr, long amount) return amount; #elif defined(__x86_64__) - register long result; + long result; __asm__ __volatile__ ( "lock/xaddq %q0, %1" : "=r" (result), "=m" (*pAddr) @@ -438,7 +438,7 @@ long AtomicSubtract(volatile long* pAddr, long amount) return *pAddr; #else // Linux / OSX86 (GCC) - register long reg __asm__ ("eax") = -1 * amount; + long reg __asm__ ("eax") = -1 * amount; __asm__ __volatile__ ( "lock/xadd %0, %1 \n" "dec %%eax" diff --git a/xbmc/threads/platform/win/ThreadImpl.cpp b/xbmc/threads/platform/win/ThreadImpl.cpp index 76b60fa83e..843839fd75 100644 --- a/xbmc/threads/platform/win/ThreadImpl.cpp +++ b/xbmc/threads/platform/win/ThreadImpl.cpp @@ -19,18 +19,22 @@ */ #include <windows.h> +#include <process.h> #include "threads/platform/win/Win32Exception.h" +#include "../../win32/WIN32Util.h" void CThread::SpawnThread(unsigned stacksize) { // Create in the suspended state, so that no matter the thread priorities and scheduled order, the handle will be assigned // before the new thread exits. - m_ThreadOpaque.handle = CreateThread(NULL, stacksize, (LPTHREAD_START_ROUTINE)&staticThread, this, CREATE_SUSPENDED, &m_ThreadId); + unsigned threadId; + m_ThreadOpaque.handle = (HANDLE)_beginthreadex(NULL, stacksize, &staticThread, this, CREATE_SUSPENDED, &threadId); if (m_ThreadOpaque.handle == NULL) { if (logger) logger->Log(LOGERROR, "%s - fatal error %d creating thread", __FUNCTION__, GetLastError()); return; } + m_ThreadId = threadId; if (ResumeThread(m_ThreadOpaque.handle) == -1) if (logger) logger->Log(LOGERROR, "%s - fatal error %d resuming thread", __FUNCTION__, GetLastError()); @@ -70,6 +74,8 @@ void CThread::SetThreadInfo() { } + CWIN32Util::SetThreadLocalLocale(true); // avoid crashing with setlocale(), see https://connect.microsoft.com/VisualStudio/feedback/details/794122 + win32_exception::install_handler(); } diff --git a/xbmc/threads/platform/win/ThreadImpl.h b/xbmc/threads/platform/win/ThreadImpl.h index ca423e737c..b670df3cb2 100644 --- a/xbmc/threads/platform/win/ThreadImpl.h +++ b/xbmc/threads/platform/win/ThreadImpl.h @@ -30,7 +30,7 @@ struct threadOpaque typedef DWORD ThreadIdentifier; typedef threadOpaque ThreadOpaque; -typedef DWORD THREADFUNC; +#define THREADFUNC unsigned __stdcall namespace XbmcThreads { diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp index 2c91094ffe..d5d32920fa 100644 --- a/xbmc/utils/AMLUtils.cpp +++ b/xbmc/utils/AMLUtils.cpp @@ -77,33 +77,71 @@ bool aml_wired_present() return has_wired == 1; } -void aml_permissions() -{ +bool aml_permissions() +{ if (!aml_present()) - return; - - // most all aml devices are already rooted. - int ret = system("ls /system/xbin/su"); - if (ret != 0) - { - CLog::Log(LOGWARNING, "aml_permissions: missing su, playback might fail"); - } - else + return false; + + static int permissions_ok = -1; + if (permissions_ok == -1) { - // certain aml devices have 664 permission, we need 666. - system("su -c chmod 666 /dev/amvideo"); - system("su -c chmod 666 /dev/amstream*"); - system("su -c chmod 666 /sys/class/video/axis"); - system("su -c chmod 666 /sys/class/video/screen_mode"); - system("su -c chmod 666 /sys/class/video/disable_video"); - system("su -c chmod 666 /sys/class/tsync/pts_pcrscr"); - system("su -c chmod 666 /sys/class/audiodsp/digital_raw"); - system("su -c chmod 666 /sys/class/ppmgr/ppmgr_3d_mode"); - system("su -c chmod 666 /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq"); - system("su -c chmod 666 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq"); - system("su -c chmod 666 /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"); - CLog::Log(LOGINFO, "aml_permissions: permissions changed"); + permissions_ok = 1; + + if (!SysfsUtils::HasRW("/dev/amvideo")) + { + CLog::Log(LOGERROR, "AML: no rw on /dev/amvideo"); + permissions_ok = 0; + } + if (!SysfsUtils::HasRW("/dev/amstream_mpts")) + { + CLog::Log(LOGERROR, "AML: no rw on /dev/amstream*"); + permissions_ok = 0; + } + if (!SysfsUtils::HasRW("/sys/class/video/axis")) + { + CLog::Log(LOGERROR, "AML: no rw on /sys/class/video/axis"); + permissions_ok = 0; + } + if (!SysfsUtils::HasRW("/sys/class/video/screen_mode")) + { + CLog::Log(LOGERROR, "AML: no rw on /sys/class/video/screen_mode"); + permissions_ok = 0; + } + if (!SysfsUtils::HasRW("/sys/class/video/disable_video")) + { + CLog::Log(LOGERROR, "AML: no rw on /sys/class/video/disable_video"); + permissions_ok = 0; + } + if (!SysfsUtils::HasRW("/sys/class/tsync/pts_pcrscr")) + { + CLog::Log(LOGERROR, "AML: no rw on /sys/class/tsync/pts_pcrscr"); + permissions_ok = 0; + } + if (!SysfsUtils::HasRW("/sys/class/audiodsp/digital_raw")) + { + CLog::Log(LOGERROR, "AML: no rw on /sys/class/audiodsp/digital_raw"); + } + if (!SysfsUtils::HasRW("/sys/class/ppmgr/ppmgr_3d_mode")) + { + CLog::Log(LOGERROR, "AML: no rw on /sys/class/ppmgr/ppmgr_3d_mode"); + } +#ifndef TARGET_ANDROID + if (!SysfsUtils::HasRW("/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq")) + { + CLog::Log(LOGERROR, "AML: no rw on /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq"); + } + if (!SysfsUtils::HasRW("/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq")) + { + CLog::Log(LOGERROR, "AML: no rw on /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq"); + } + if (!SysfsUtils::HasRW("/sys/devices/cpu/cpu/cpu0/cpufreq/scaling_governor")) + { + CLog::Log(LOGERROR, "AML: no rw on /sys/devices/cpu/cpu/cpu0/cpufreq/scaling_governor"); + } +#endif } + + return permissions_ok == 1; } bool aml_support_hevc() diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h index 6b0048adea..76efcaf67d 100644 --- a/xbmc/utils/AMLUtils.h +++ b/xbmc/utils/AMLUtils.h @@ -42,7 +42,7 @@ enum AML_DISPLAY_AXIS_PARAM }; bool aml_present(); -void aml_permissions(); +bool aml_permissions(); bool aml_hw3d_present(); bool aml_wired_present(); bool aml_support_hevc(); diff --git a/xbmc/utils/CPUInfo.h b/xbmc/utils/CPUInfo.h index baf87514e9..1c5e5ba7b8 100644 --- a/xbmc/utils/CPUInfo.h +++ b/xbmc/utils/CPUInfo.h @@ -102,7 +102,7 @@ public: private: bool readProcStat(unsigned long long& user, unsigned long long& nice, unsigned long long& system, - unsigned long long& idle, unsigned long long& io); + unsigned long long& idle, unsigned long long& io); void ReadCPUFeatures(); static bool HasNeon(); diff --git a/xbmc/utils/JSONVariantWriter.cpp b/xbmc/utils/JSONVariantWriter.cpp index 61fdd4cb17..0d0a7aa32f 100644 --- a/xbmc/utils/JSONVariantWriter.cpp +++ b/xbmc/utils/JSONVariantWriter.cpp @@ -33,13 +33,23 @@ string CJSONVariantWriter::Write(const CVariant &value, bool compact) yajl_gen_config(g, yajl_gen_indent_string, "\t"); // Set locale to classic ("C") to ensure valid JSON numbers +#ifndef TARGET_WINDOWS const char *currentLocale = setlocale(LC_NUMERIC, NULL); std::string backupLocale; - if (currentLocale != NULL) + if (currentLocale != NULL && (currentLocale[0] != 'C' || currentLocale[1] != 0)) { backupLocale = currentLocale; setlocale(LC_NUMERIC, "C"); } +#else // TARGET_WINDOWS + const wchar_t* const currentLocale = _wsetlocale(LC_NUMERIC, NULL); + std::wstring backupLocale; + if (currentLocale != NULL && (currentLocale[0] != L'C' || currentLocale[1] != 0)) + { + backupLocale = currentLocale; + _wsetlocale(LC_NUMERIC, L"C"); + } +#endif // TARGET_WINDOWS if (InternalWrite(g, value)) { @@ -51,8 +61,13 @@ string CJSONVariantWriter::Write(const CVariant &value, bool compact) } // Re-set locale to what it was before using yajl +#ifndef TARGET_WINDOWS if (!backupLocale.empty()) setlocale(LC_NUMERIC, backupLocale.c_str()); +#else // TARGET_WINDOWS + if (!backupLocale.empty()) + _wsetlocale(LC_NUMERIC, backupLocale.c_str()); +#endif // TARGET_WINDOWS yajl_gen_clear(g); yajl_gen_free(g); diff --git a/xbmc/utils/JobManager.cpp b/xbmc/utils/JobManager.cpp index 8f690fe636..b452e0a67d 100644 --- a/xbmc/utils/JobManager.cpp +++ b/xbmc/utils/JobManager.cpp @@ -120,7 +120,7 @@ void CJobQueue::CancelJob(const CJob *job) } } -void CJobQueue::AddJob(CJob *job) +bool CJobQueue::AddJob(CJob *job) { CSingleLock lock(m_section); // check if we have this job already. If so, we're done. @@ -128,7 +128,7 @@ void CJobQueue::AddJob(CJob *job) find(m_processing.begin(), m_processing.end(), job) != m_processing.end()) { delete job; - return; + return false; } if (m_lifo) @@ -136,6 +136,8 @@ void CJobQueue::AddJob(CJob *job) else m_jobQueue.push_front(CJobPointer(job)); QueueNextJob(); + + return true; } void CJobQueue::QueueNextJob() @@ -159,6 +161,10 @@ void CJobQueue::CancelJobs() m_processing.clear(); } +bool CJobQueue::IsProcessing() const +{ + return !m_processing.empty() || !m_jobQueue.empty(); +} bool CJobQueue::QueueEmpty() const { diff --git a/xbmc/utils/JobManager.h b/xbmc/utils/JobManager.h index 1df2287207..f563bd6af4 100644 --- a/xbmc/utils/JobManager.h +++ b/xbmc/utils/JobManager.h @@ -100,7 +100,7 @@ public: \param job a pointer to the job to add. The job should be subclassed from CJob. \sa CJob */ - void AddJob(CJob *job); + bool AddJob(CJob *job); /*! \brief Cancel a job in the queue @@ -121,6 +121,11 @@ public: void CancelJobs(); /*! + \brief Check whether the queue is processing a job + */ + bool IsProcessing() const; + + /*! \brief The callback used when a job completes. OnJobComplete is called at the completion of the CJob::DoWork function, and is used diff --git a/xbmc/utils/Makefile.in b/xbmc/utils/Makefile.in index a5ca180639..53e72084af 100644 --- a/xbmc/utils/Makefile.in +++ b/xbmc/utils/Makefile.in @@ -41,13 +41,13 @@ SRCS += LangCodeExpander.cpp SRCS += LegacyPathTranslation.cpp SRCS += log.cpp SRCS += md5.cpp -SRCS += MarkWatchedJob.cpp SRCS += Mime.cpp SRCS += Observer.cpp SRCS += PerformanceSample.cpp SRCS += PerformanceStats.cpp SRCS += posix/PosixInterfaceForCLog.cpp SRCS += POUtils.cpp +SRCS += ProgressJob.cpp SRCS += RecentlyAddedJob.cpp SRCS += RegExp.cpp SRCS += RingBuffer.cpp diff --git a/xbmc/utils/MarkWatchedJob.cpp b/xbmc/utils/MarkWatchedJob.cpp deleted file mode 100644 index 054da5c124..0000000000 --- a/xbmc/utils/MarkWatchedJob.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2014 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -#include "FileItem.h" -#include "filesystem/Directory.h" -#include "GUIUserMessages.h" -#include "guilib/GUIWindowManager.h" -#include "MarkWatchedJob.h" -#include "profiles/ProfilesManager.h" -#include "Util.h" -#include "utils/URIUtils.h" -#include "video/VideoDatabase.h" - -#ifdef HAS_UPNP -#include "network/upnp/UPnP.h" -#endif - -#include <vector> - -CMarkWatchedJob::CMarkWatchedJob(const CFileItemPtr &item, bool bMark) -{ - m_item = item; - m_bMark = bMark; -} - -CMarkWatchedJob::~CMarkWatchedJob() -{ -} - -bool CMarkWatchedJob::operator==(const CJob* job) const -{ - if (strcmp(job->GetType(), GetType()) == 0) - { - const CMarkWatchedJob* markJob = dynamic_cast<const CMarkWatchedJob*>(job); - if (markJob) - return (m_item->IsSamePath(markJob->m_item.get()) && markJob->m_bMark == m_bMark); - } - return false; -} - -bool CMarkWatchedJob::DoWork() -{ - if (!CProfilesManager::Get().GetCurrentProfile().canWriteDatabases()) - return false; - - CFileItemList items; - items.Add(CFileItemPtr(new CFileItem(*m_item))); - - if (m_item->m_bIsFolder) - CUtil::GetRecursiveListing(m_item->GetPath(), items, "", XFILE::DIR_FLAG_NO_FILE_INFO); - - std::vector<CFileItemPtr> markItems; - for (int i = 0; i < items.Size(); i++) - { - if (items[i]->HasVideoInfoTag() && - (( m_bMark && items[i]->GetVideoInfoTag()->m_playCount) || - (!m_bMark && !(items[i]->GetVideoInfoTag()->m_playCount)))) - continue; - -#ifdef HAS_UPNP - if (!URIUtils::IsUPnP(items[i]->GetPath()) || !UPNP::CUPnP::MarkWatched(*items[i], m_bMark)) -#endif - { - markItems.push_back(items[i]); - } - } - - if (!markItems.empty()) - { - CVideoDatabase database; - if (!database.Open()) - return false; - - database.BeginTransaction(); - - for (std::vector<CFileItemPtr>::const_iterator iter = markItems.begin(); iter != markItems.end(); ++iter) - { - CFileItemPtr pItem = *iter; - if (m_bMark) - { - std::string path(pItem->GetPath()); - if (pItem->HasVideoInfoTag()) - path = pItem->GetVideoInfoTag()->GetPath(); - - database.ClearBookMarksOfFile(path, CBookmark::RESUME); - database.IncrementPlayCount(*pItem); - } - else - database.SetPlayCount(*pItem, 0); - } - - database.CommitTransaction(); - database.Close(); - } - - return true; -} - -CMarkWatchedQueue &CMarkWatchedQueue::Get() -{ - static CMarkWatchedQueue markWatchedQueue; - return markWatchedQueue; -} - -void CMarkWatchedQueue::OnJobComplete(unsigned int jobID, bool success, CJob *job) -{ - if (success) - { - if (QueueEmpty()) - { - CUtil::DeleteVideoDatabaseDirectoryCache(); - CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE); - g_windowManager.SendThreadMessage(msg); - } - return CJobQueue::OnJobComplete(jobID, success, job); - } - CancelJobs(); -} diff --git a/xbmc/utils/ProgressJob.cpp b/xbmc/utils/ProgressJob.cpp new file mode 100644 index 0000000000..a3a2885003 --- /dev/null +++ b/xbmc/utils/ProgressJob.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2015 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "ProgressJob.h" +#include "dialogs/GUIDialogExtendedProgressBar.h" + +using namespace std; + +CProgressJob::CProgressJob(CGUIDialogProgressBarHandle* progressBar) + : m_progress(progressBar) +{ } + +CProgressJob::~CProgressJob() +{ + MarkFinished(); + + m_progress = NULL; +} + +void CProgressJob::SetTitle(const std::string &title) +{ + if (m_progress == NULL) + return; + + m_progress->SetTitle(title); +} + +void CProgressJob::SetText(const std::string &text) +{ + if (m_progress == NULL) + return; + + m_progress->SetText(text); +} + +void CProgressJob::SetProgress(float percentage) +{ + if (m_progress == NULL) + return; + + m_progress->SetPercentage(percentage); +} + +void CProgressJob::SetProgress(int currentStep, int totalSteps) +{ + if (m_progress == NULL) + return; + + m_progress->SetProgress(currentStep, totalSteps); +} + +void CProgressJob::MarkFinished() +{ + if (m_progress == NULL) + return; + + m_progress->MarkFinished(); +} diff --git a/xbmc/utils/ProgressJob.h b/xbmc/utils/ProgressJob.h new file mode 100644 index 0000000000..db1b356132 --- /dev/null +++ b/xbmc/utils/ProgressJob.h @@ -0,0 +1,85 @@ +#pragma once +/* + * Copyright (C) 2015 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include <string> + +#include "utils/Job.h" + +class CGUIDialogProgressBarHandle; + +/*! + \brief Basic implementation of a CJob with a progress bar to indicate the + progress of the job being processed. + */ +class CProgressJob : public CJob +{ +public: + virtual ~CProgressJob(); + + // implementation of CJob + virtual const char *GetType() const { return "ProgressJob"; } + virtual bool operator==(const CJob* job) const { return false; } + +protected: + CProgressJob(CGUIDialogProgressBarHandle* progressBar); + + /*! + \brief Returns the progress bar indicating the progress of the job. + */ + CGUIDialogProgressBarHandle* GetProgressBar() { return m_progress; } + + /*! + \brief Sets the given title as the title of the progress bar. + + \param[in] title Title to be set + */ + void SetTitle(const std::string &title); + + /*! + \brief Sets the given text as the description of the progress bar. + + \param[in] text Text to be set + */ + void SetText(const std::string &text); + + /*! + \brief Sets the progress of the progress bar to the given value in percentage. + + \param[in] percentage Percentage to be set as the current progress + */ + void SetProgress(float percentage); + + /*! + \brief Sets the progress of the progress bar to the given value. + + \param[in] currentStep Current step being processed + \param[in] totalSteps Total steps to be processed + */ + void SetProgress(int currentStep, int totalSteps); + + /*! + \brief Marks the progress as finished by setting it to 100%. + */ + void MarkFinished(); + +private: + CGUIDialogProgressBarHandle* m_progress; +}; diff --git a/xbmc/utils/SeekHandler.cpp b/xbmc/utils/SeekHandler.cpp index 82e68afcfa..f50d7769c9 100644 --- a/xbmc/utils/SeekHandler.cpp +++ b/xbmc/utils/SeekHandler.cpp @@ -22,6 +22,7 @@ #include "guilib/LocalizeStrings.h" #include "GUIInfoManager.h" #include "Application.h" +#include "FileItem.h" #include "settings/AdvancedSettings.h" #include "settings/Settings.h" #include "settings/lib/Setting.h" @@ -40,6 +41,9 @@ CSeekHandler::CSeekHandler() CSeekHandler::~CSeekHandler() { + m_seekDelays.clear(); + m_forwardSeekSteps.clear(); + m_backwardSeekSteps.clear(); } CSeekHandler& CSeekHandler::Get() @@ -53,46 +57,67 @@ void CSeekHandler::Reset() m_requireSeek = false; m_percent = 0; m_seekStep = 0; - m_seekDelay = CSettings::Get().GetInt("videoplayer.seekdelay"); - std::vector<CVariant> seekSteps = CSettings::Get().GetList("videoplayer.seeksteps"); + m_seekDelays.clear(); + m_seekDelays.insert(std::make_pair(SEEK_TYPE_VIDEO, CSettings::Get().GetInt("videoplayer.seekdelay"))); + m_seekDelays.insert(std::make_pair(SEEK_TYPE_MUSIC, CSettings::Get().GetInt("musicplayer.seekdelay"))); + m_forwardSeekSteps.clear(); m_backwardSeekSteps.clear(); - for (std::vector<CVariant>::iterator it = seekSteps.begin(); it != seekSteps.end(); ++it) { - int stepSeconds = (*it).asInteger(); - if (stepSeconds < 0) - m_backwardSeekSteps.insert(m_backwardSeekSteps.begin(), stepSeconds); - else - m_forwardSeekSteps.push_back(stepSeconds); + + std::map<SeekType, std::string> seekTypeSettingMap; + seekTypeSettingMap.insert(std::make_pair(SEEK_TYPE_VIDEO, "videoplayer.seeksteps")); + seekTypeSettingMap.insert(std::make_pair(SEEK_TYPE_MUSIC, "musicplayer.seeksteps")); + + for (std::map<SeekType, std::string>::iterator it = seekTypeSettingMap.begin(); it!=seekTypeSettingMap.end(); ++it) + { + std::vector<int> forwardSeekSteps; + std::vector<int> backwardSeekSteps; + + std::vector<CVariant> seekSteps = CSettings::Get().GetList(it->second); + for (std::vector<CVariant>::iterator it = seekSteps.begin(); it != seekSteps.end(); ++it) + { + int stepSeconds = (*it).asInteger(); + if (stepSeconds < 0) + backwardSeekSteps.insert(backwardSeekSteps.begin(), stepSeconds); + else + forwardSeekSteps.push_back(stepSeconds); + } + + m_forwardSeekSteps.insert(std::make_pair(it->first, forwardSeekSteps)); + m_backwardSeekSteps.insert(std::make_pair(it->first, backwardSeekSteps)); } } -int CSeekHandler::GetSeekSeconds(bool forward) +int CSeekHandler::GetSeekSeconds(bool forward, SeekType type) { m_seekStep = m_seekStep + (forward ? 1 : -1); + std::vector<int> forwardSeekSteps(m_forwardSeekSteps.at(type)); + std::vector<int> backwardSeekSteps(m_backwardSeekSteps.at(type)); + int seconds = 0; if (m_seekStep > 0) { // when exceeding the selected amount of steps repeat/sum up the last step size - if ((size_t)m_seekStep <= m_forwardSeekSteps.size()) - seconds = m_forwardSeekSteps.at(m_seekStep - 1); + if ((size_t)m_seekStep <= forwardSeekSteps.size()) + seconds = forwardSeekSteps.at(m_seekStep - 1); else - seconds = m_forwardSeekSteps.back() * (m_seekStep - m_forwardSeekSteps.size() + 1); + seconds = forwardSeekSteps.back() * (m_seekStep - forwardSeekSteps.size() + 1); } else if (m_seekStep < 0) { // when exceeding the selected amount of steps repeat/sum up the last step size - if ((size_t)m_seekStep*-1 <= m_backwardSeekSteps.size()) - seconds = m_backwardSeekSteps.at((m_seekStep*-1) - 1); + if ((size_t)m_seekStep*-1 <= backwardSeekSteps.size()) + seconds = backwardSeekSteps.at((m_seekStep*-1) - 1); else - seconds = m_backwardSeekSteps.back() * ((m_seekStep*-1) - m_backwardSeekSteps.size() + 1); + seconds = backwardSeekSteps.back() * ((m_seekStep*-1) - backwardSeekSteps.size() + 1); } return seconds; } -void CSeekHandler::Seek(bool forward, float amount, float duration /* = 0 */, bool analogSeek /* = false */) +void CSeekHandler::Seek(bool forward, float amount, float duration /* = 0 */, bool analogSeek /* = false */, SeekType type /* = SEEK_TYPE_VIDEO */) { // not yet seeking if (!m_requireSeek) @@ -108,14 +133,7 @@ void CSeekHandler::Seek(bool forward, float amount, float duration /* = 0 */, bo g_infoManager.SetSeeking(true); m_seekStep = 0; m_analogSeek = analogSeek; - - if (!analogSeek) - { - // don't apply a seek delay if only one seek step for the given direction exists - if ((m_backwardSeekSteps.size() == 1 && forward == false) || - (m_forwardSeekSteps.size() == 1 && forward == true)) - m_seekDelay = 0; - } + m_seekDelay = analogSeek ? analogSeekDelay : m_seekDelays.at(type); } // calculate our seek amount @@ -141,7 +159,7 @@ void CSeekHandler::Seek(bool forward, float amount, float duration /* = 0 */, bo if (g_infoManager.GetTotalPlayTime()) percentPerSecond = 100.0f / (float)g_infoManager.GetTotalPlayTime(); - int seekSeconds = GetSeekSeconds(forward); + int seekSeconds = GetSeekSeconds(forward, type); g_infoManager.SetSeekStepSize(seekSeconds); m_percent = m_percentPlayTime + percentPerSecond * seekSeconds; @@ -166,31 +184,26 @@ bool CSeekHandler::InProgress() const void CSeekHandler::Process() { - if (m_timer.GetElapsedMilliseconds() > m_seekDelay) + if (m_timer.GetElapsedMilliseconds() > m_seekDelay && m_requireSeek) { - if (!g_infoManager.m_performingSeek && m_timer.GetElapsedMilliseconds() > time_for_display) // TODO: Why? - g_infoManager.SetSeeking(false); + g_infoManager.m_performingSeek = true; - if (m_requireSeek) - { - g_infoManager.m_performingSeek = true; - - // reset seek step size - g_infoManager.SetSeekStepSize(0); + // reset seek step size + g_infoManager.SetSeekStepSize(0); - // calculate the seek time - double time = g_infoManager.GetTotalPlayTime() * m_percent * 0.01; + // calculate the seek time + double time = g_infoManager.GetTotalPlayTime() * m_percent * 0.01; - g_application.SeekTime(time); - m_requireSeek = false; - } + g_application.SeekTime(time); + m_requireSeek = false; + g_infoManager.SetSeeking(false); } } void CSeekHandler::SettingOptionsSeekStepsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data) { std::string label; - for (std::vector<int>::iterator it = g_advancedSettings.m_videoSeekSteps.begin(); it != g_advancedSettings.m_videoSeekSteps.end(); ++it) { + for (std::vector<int>::iterator it = g_advancedSettings.m_seekSteps.begin(); it != g_advancedSettings.m_seekSteps.end(); ++it) { int seconds = *it; if (seconds > 60) label = StringUtils::Format(g_localizeStrings.Get(14044).c_str(), seconds / 60); @@ -208,6 +221,66 @@ void CSeekHandler::OnSettingChanged(const CSetting *setting) return; if (setting->GetId() == "videoplayer.seekdelay" || - setting->GetId() == "videoplayer.seeksteps") + setting->GetId() == "videoplayer.seeksteps" || + setting->GetId() == "musicplayer.seekdelay" || + setting->GetId() == "musicplayer.seeksteps") Reset(); } + +bool CSeekHandler::OnAction(const CAction &action) +{ + if (!g_application.m_pPlayer->IsPlaying() || !g_application.m_pPlayer->CanSeek()) + return false; + + SeekType type = g_application.CurrentFileItem().IsAudio() ? SEEK_TYPE_MUSIC : SEEK_TYPE_VIDEO; + + switch (action.GetID()) + { + case ACTION_SMALL_STEP_BACK: + case ACTION_STEP_BACK: + { + Seek(false, action.GetAmount(), action.GetRepeat(), false, type); + return true; + } + case ACTION_STEP_FORWARD: + { + Seek(true, action.GetAmount(), action.GetRepeat(), false, type); + return true; + } + case ACTION_BIG_STEP_BACK: + case ACTION_CHAPTER_OR_BIG_STEP_BACK: + { + g_application.m_pPlayer->Seek(false, true, action.GetID() == ACTION_CHAPTER_OR_BIG_STEP_BACK); + return true; + } + case ACTION_BIG_STEP_FORWARD: + case ACTION_CHAPTER_OR_BIG_STEP_FORWARD: + { + g_application.m_pPlayer->Seek(true, true, action.GetID() == ACTION_CHAPTER_OR_BIG_STEP_FORWARD); + return true; + } + case ACTION_NEXT_SCENE: + { + if (g_application.m_pPlayer->SeekScene(true)) + g_infoManager.SetDisplayAfterSeek(); + return true; + } + case ACTION_PREV_SCENE: + { + if (g_application.m_pPlayer->SeekScene(false)) + g_infoManager.SetDisplayAfterSeek(); + return true; + } + case ACTION_ANALOG_SEEK_FORWARD: + case ACTION_ANALOG_SEEK_BACK: + { + if (action.GetAmount()) + Seek(action.GetID() == ACTION_ANALOG_SEEK_FORWARD, action.GetAmount(), action.GetRepeat(), true); + return true; + } + default: + break; + } + + return false; +} diff --git a/xbmc/utils/SeekHandler.h b/xbmc/utils/SeekHandler.h index 4f80140db6..bae1506037 100644 --- a/xbmc/utils/SeekHandler.h +++ b/xbmc/utils/SeekHandler.h @@ -20,11 +20,19 @@ */ #include <vector> +#include "guilib/Key.h" +#include "interfaces/IActionListener.h" #include "settings/Settings.h" #include "settings/lib/ISettingCallback.h" #include "utils/Stopwatch.h" -class CSeekHandler : public ISettingCallback +enum SeekType +{ + SEEK_TYPE_VIDEO = 0, + SEEK_TYPE_MUSIC = 1 +}; + +class CSeekHandler : public ISettingCallback, public IActionListener { public: static CSeekHandler& Get(); @@ -32,8 +40,9 @@ public: static void SettingOptionsSeekStepsFiller(const CSetting *setting, std::vector< std::pair<std::string, int> > &list, int ¤t, void *data); virtual void OnSettingChanged(const CSetting *setting); + virtual bool OnAction(const CAction &action); - void Seek(bool forward, float amount, float duration = 0, bool analogSeek = false); + void Seek(bool forward, float amount, float duration = 0, bool analogSeek = false, SeekType type = SEEK_TYPE_VIDEO); void Process(); void Reset(); @@ -47,15 +56,17 @@ protected: virtual ~CSeekHandler(); private: - static const int time_for_display = 2000; // TODO: WTF? - int GetSeekSeconds(bool forward); + static const int analogSeekDelay = 500; + + int GetSeekSeconds(bool forward, SeekType type); int m_seekDelay; + std::map<SeekType, int > m_seekDelays; bool m_requireSeek; float m_percent; float m_percentPlayTime; bool m_analogSeek; int m_seekStep; - std::vector<int> m_forwardSeekSteps; - std::vector<int> m_backwardSeekSteps; + std::map<SeekType, std::vector<int> > m_forwardSeekSteps; + std::map<SeekType, std::vector<int> > m_backwardSeekSteps; CStopWatch m_timer; }; diff --git a/xbmc/utils/StringUtils.cpp b/xbmc/utils/StringUtils.cpp index 5963bf3d1f..6950bf66f5 100644 --- a/xbmc/utils/StringUtils.cpp +++ b/xbmc/utils/StringUtils.cpp @@ -32,6 +32,7 @@ #include "StringUtils.h" #include "utils/fstrcmp.h" #include "Util.h" +#include "LangInfo.h" #include <locale> #include <functional> @@ -740,7 +741,7 @@ int64_t StringUtils::AlphaNumericCompare(const wchar_t *left, const wchar_t *rig wchar_t *ld, *rd; wchar_t lc, rc; int64_t lnum, rnum; - const collate<wchar_t>& coll = use_facet< collate<wchar_t> >( locale() ); + const collate<wchar_t>& coll = use_facet< collate<wchar_t> >( g_langInfo.GetLocale() ); int cmp_res = 0; while (*l != 0 && *r != 0) { diff --git a/xbmc/utils/SysfsUtils.cpp b/xbmc/utils/SysfsUtils.cpp index ca629865b6..530df5ae28 100644 --- a/xbmc/utils/SysfsUtils.cpp +++ b/xbmc/utils/SysfsUtils.cpp @@ -102,3 +102,14 @@ bool SysfsUtils::Has(const std::string &path) } return false; } + +bool SysfsUtils::HasRW(const std::string &path) +{ + int fd = open(path.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0644); + if (fd >= 0) + { + close(fd); + return true; + } + return false; +} diff --git a/xbmc/utils/SysfsUtils.h b/xbmc/utils/SysfsUtils.h index fe038bf5ef..7f617364a3 100644 --- a/xbmc/utils/SysfsUtils.h +++ b/xbmc/utils/SysfsUtils.h @@ -29,4 +29,5 @@ public: static int SetInt(const std::string& path, const int val); static int GetInt(const std::string& path, int& val); static bool Has(const std::string& path); + static bool HasRW(const std::string &path); }; diff --git a/xbmc/utils/md5.cpp b/xbmc/utils/md5.cpp index ce9ff6b703..5582dd35df 100644 --- a/xbmc/utils/md5.cpp +++ b/xbmc/utils/md5.cpp @@ -233,7 +233,7 @@ MD5Final(md5byte digest[16], struct MD5Context *ctx) static void MD5Transform(uint32_t buf[4], uint32_t const in[16]) { - register uint32_t a, b, c, d; + uint32_t a, b, c, d; a = buf[0]; b = buf[1]; diff --git a/xbmc/video/GUIViewStateVideo.cpp b/xbmc/video/GUIViewStateVideo.cpp index 21cc661a8e..2d4a3fc9ad 100644 --- a/xbmc/video/GUIViewStateVideo.cpp +++ b/xbmc/video/GUIViewStateVideo.cpp @@ -436,6 +436,31 @@ bool CGUIViewStateWindowVideoNav::AutoPlayNextItem() return CSettings::Get().GetBool("videoplayer.autoplaynextitem"); } +bool CGUIViewStateWindowVideoNav::JumpToFirstUnplayedItem() +{ + if (m_items.IsVideoDb()) + { + NODE_TYPE NodeType = CVideoDatabaseDirectory::GetDirectoryChildType(m_items.GetPath()); + switch (NodeType) + { + case NODE_TYPE_EPISODES: + if (GetSortMethod().sortBy == SortBy::SortByEpisodeNumber) + return CSettings::Get().GetBool("videolibrary.jumptofirstunplayeditem"); + else + return false; + + case NODE_TYPE_SEASONS: + return CSettings::Get().GetBool("videolibrary.jumptofirstunplayeditem"); + + default: + return false; + break; + } + } + + return CGUIViewStateWindowVideo::JumpToFirstUnplayedItem(); +} + CGUIViewStateWindowVideoPlaylist::CGUIViewStateWindowVideoPlaylist(const CFileItemList& items) : CGUIViewStateWindowVideo(items) { AddSortMethod(SortByNone, 551, LABEL_MASKS("%L", "", "%L", "")); // Label, empty | Label, empty diff --git a/xbmc/video/GUIViewStateVideo.h b/xbmc/video/GUIViewStateVideo.h index 31d7dba5cd..532e59aa6f 100644 --- a/xbmc/video/GUIViewStateVideo.h +++ b/xbmc/video/GUIViewStateVideo.h @@ -49,6 +49,7 @@ class CGUIViewStateWindowVideoNav : public CGUIViewStateWindowVideo public: CGUIViewStateWindowVideoNav(const CFileItemList& items); virtual bool AutoPlayNextItem(); + virtual bool JumpToFirstUnplayedItem(); protected: virtual void SaveViewState(); diff --git a/xbmc/video/Makefile b/xbmc/video/Makefile index 45b29c642f..9c2484262c 100644 --- a/xbmc/video/Makefile +++ b/xbmc/video/Makefile @@ -8,6 +8,7 @@ SRCS=Bookmark.cpp \ VideoInfoDownloader.cpp \ VideoInfoScanner.cpp \ VideoInfoTag.cpp \ + VideoLibraryQueue.cpp \ VideoReferenceClock.cpp \ VideoThumbLoader.cpp \ diff --git a/xbmc/video/VideoDatabase.cpp b/xbmc/video/VideoDatabase.cpp index 4346379f91..f862563ab7 100644 --- a/xbmc/video/VideoDatabase.cpp +++ b/xbmc/video/VideoDatabase.cpp @@ -7816,7 +7816,7 @@ void CVideoDatabase::GetMusicVideoDirectorsByName(const std::string& strSearch, } } -void CVideoDatabase::CleanDatabase(CGUIDialogProgressBarHandle* handle, const set<int>* paths, bool showProgress) +void CVideoDatabase::CleanDatabase(CGUIDialogProgressBarHandle* handle, const set<int>& paths, bool showProgress) { CGUIDialogProgress *progress=NULL; try @@ -7832,17 +7832,10 @@ void CVideoDatabase::CleanDatabase(CGUIDialogProgressBarHandle* handle, const se // find all the files std::string sql = "SELECT files.idFile, files.strFileName, path.strPath FROM files, path WHERE files.idPath = path.idPath"; - if (paths) + if (!paths.empty()) { - if (paths->empty()) - { - RollbackTransaction(); - ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnCleanFinished"); - return; - } - std::string strPaths; - for (std::set<int>::const_iterator it = paths->begin(); it != paths->end(); ++it) + for (std::set<int>::const_iterator it = paths.begin(); it != paths.end(); ++it) strPaths += StringUtils::Format(",%i", *it); sql += PrepareSQL(" AND path.idPath IN (%s)", strPaths.substr(1).c_str()); } diff --git a/xbmc/video/VideoDatabase.h b/xbmc/video/VideoDatabase.h index fcab0a865d..8942b439f4 100644 --- a/xbmc/video/VideoDatabase.h +++ b/xbmc/video/VideoDatabase.h @@ -668,7 +668,7 @@ public: bool HasContent(VIDEODB_CONTENT_TYPE type); bool HasSets() const; - void CleanDatabase(CGUIDialogProgressBarHandle* handle=NULL, const std::set<int>* paths=NULL, bool showProgress=true); + void CleanDatabase(CGUIDialogProgressBarHandle* handle = NULL, const std::set<int>& paths = std::set<int>(), bool showProgress = true); /*! \brief Add a file to the database, if necessary If the file is already in the database, we simply return its id. diff --git a/xbmc/video/VideoInfoScanner.cpp b/xbmc/video/VideoInfoScanner.cpp index b7244a1fd0..eb90a17aaf 100644 --- a/xbmc/video/VideoInfoScanner.cpp +++ b/xbmc/video/VideoInfoScanner.cpp @@ -46,6 +46,7 @@ #include "utils/log.h" #include "utils/URIUtils.h" #include "utils/Variant.h" +#include "video/VideoLibraryQueue.h" #include "video/VideoThumbLoader.h" #include "TextureCache.h" #include "GUIUserMessages.h" @@ -58,8 +59,9 @@ using namespace ADDON; namespace VIDEO { - CVideoInfoScanner::CVideoInfoScanner() : CThread("VideoInfoScanner") + CVideoInfoScanner::CVideoInfoScanner() { + m_bStop = false; m_bRunning = false; m_handle = NULL; m_showDialog = false; @@ -76,6 +78,8 @@ namespace VIDEO void CVideoInfoScanner::Process() { + m_bStop = false; + try { if (m_showDialog && !CSettings::Get().GetBool("videolibrary.backgroundupdate")) @@ -89,7 +93,8 @@ namespace VIDEO // check if we only need to perform a cleaning if (m_bClean && m_pathsToScan.empty()) { - CleanDatabase(m_handle, NULL, false); + std::set<int> paths; + CVideoLibraryQueue::Get().CleanLibrary(paths, false, m_handle); if (m_handle) m_handle->MarkFinished(); @@ -113,8 +118,6 @@ namespace VIDEO m_currentItem = 0; m_itemCount = -1; - SetPriority(GetMinPriority()); - // Database operations should not be canceled // using Interupt() while scanning as it could // result in unexpected behaviour. @@ -147,7 +150,7 @@ namespace VIDEO if (!bCancelled) { if (m_bClean) - CleanDatabase(m_handle,&m_pathsToClean, false); + CVideoLibraryQueue::Get().CleanLibrary(m_pathsToClean, false, m_handle); else { if (m_handle) @@ -156,6 +159,7 @@ namespace VIDEO } } + g_infoManager.ResetLibraryBools(); m_database.Close(); tick = XbmcThreads::SystemClockMillis() - tick; @@ -168,11 +172,6 @@ namespace VIDEO m_bRunning = false; ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnScanFinished"); - - // we need to clear the videodb cache and update any active lists - CUtil::DeleteVideoDatabaseDirectoryCache(); - CGUIMessage msg(GUI_MSG_SCAN_FINISHED, 0, 0, 0); - g_windowManager.SendThreadMessage(msg); if (m_handle) m_handle->MarkFinished(); @@ -212,28 +211,8 @@ namespace VIDEO m_database.Close(); m_bClean = g_advancedSettings.m_bVideoLibraryCleanOnUpdate; - StopThread(); - Create(); - m_bRunning = true; - } - - void CVideoInfoScanner::StartCleanDatabase() - { - m_strStartDir.clear(); - m_scanAll = false; - m_pathsToScan.clear(); - m_pathsToClean.clear(); - - m_bClean = true; - - StopThread(); - Create(); m_bRunning = true; - } - - bool CVideoInfoScanner::IsScanning() - { - return m_bRunning; + Process(); } void CVideoInfoScanner::Stop() @@ -241,16 +220,7 @@ namespace VIDEO if (m_bCanInterrupt) m_database.Interupt(); - StopThread(false); - } - - void CVideoInfoScanner::CleanDatabase(CGUIDialogProgressBarHandle* handle /*= NULL */, const set<int>* paths /*= NULL */, bool showProgress /*= true */) - { - m_bRunning = true; - m_database.Open(); - m_database.CleanDatabase(handle, paths, showProgress); - m_database.Close(); - m_bRunning = false; + m_bStop = true; } static void OnDirectoryScanned(const std::string& strDirectory) @@ -317,7 +287,10 @@ namespace VIDEO m_handle->SetTitle(StringUtils::Format(g_localizeStrings.Get(str).c_str(), info->Name().c_str())); } - std::string fastHash = GetFastHash(strDirectory, regexps); + std::string fastHash; + if (g_advancedSettings.m_bVideoLibraryUseFastHash) + fastHash = GetFastHash(strDirectory, regexps); + if (m_database.GetPathHash(strDirectory, dbHash) && !fastHash.empty() && fastHash == dbHash) { // fast hashes match - no need to process anything hash = fastHash; @@ -519,7 +492,6 @@ namespace VIDEO if(pDlgProgress) pDlgProgress->ShowProgressBar(false); - g_infoManager.ResetLibraryBools(); m_database.Close(); return FoundSomeInfo; } @@ -729,7 +701,9 @@ namespace VIDEO m_pathsToScan.erase(it); std::string hash, dbHash; - hash = GetRecursiveFastHash(item->GetPath(), regexps); + if (g_advancedSettings.m_bVideoLibraryUseFastHash) + hash = GetRecursiveFastHash(item->GetPath(), regexps); + if (m_database.GetPathHash(item->GetPath(), dbHash) && !hash.empty() && dbHash == hash) { // fast hashes match - no need to process anything @@ -1253,7 +1227,7 @@ namespace VIDEO CFileItemPtr itemCopy = CFileItemPtr(new CFileItem(*pItem)); CVariant data; - if (IsScanning()) + if (m_bRunning) data["transaction"] = true; ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnUpdate", itemCopy, data); return lResult; @@ -1776,6 +1750,9 @@ namespace VIDEO bool CVideoInfoScanner::CanFastHash(const CFileItemList &items, const vector<string> &excludes) const { + if (!g_advancedSettings.m_bVideoLibraryUseFastHash) + return false; + for (int i = 0; i < items.Size(); ++i) { if (items[i]->m_bIsFolder && !CUtil::ExcludeFileOrFolder(items[i]->GetPath(), excludes)) diff --git a/xbmc/video/VideoInfoScanner.h b/xbmc/video/VideoInfoScanner.h index af63b1e7b3..b30d8ec017 100644 --- a/xbmc/video/VideoInfoScanner.h +++ b/xbmc/video/VideoInfoScanner.h @@ -18,7 +18,6 @@ * <http://www.gnu.org/licenses/>. * */ -#include "threads/Thread.h" #include "VideoDatabase.h" #include "addons/Scraper.h" #include "NfoFile.h" @@ -48,7 +47,7 @@ namespace VIDEO INFO_NOT_FOUND, INFO_ADDED }; - class CVideoInfoScanner : CThread + class CVideoInfoScanner { public: CVideoInfoScanner(); @@ -59,9 +58,7 @@ namespace VIDEO \param scanAll whether to scan everything not already scanned (regardless of whether the user normally doesn't want a folder scanned.) Defaults to false. */ void Start(const std::string& strDirectory, bool scanAll = false); - void StartCleanDatabase(); - bool IsScanning(); - void CleanDatabase(CGUIDialogProgressBarHandle* handle=NULL, const std::set<int>* paths=NULL, bool showProgress=true); + bool IsScanning() const { return m_bRunning; } void Stop(); //! \brief Set whether or not to show a progress dialog @@ -247,6 +244,7 @@ namespace VIDEO CGUIDialogProgressBarHandle* m_handle; int m_currentItem; int m_itemCount; + bool m_bStop; bool m_bRunning; bool m_bCanInterrupt; bool m_bClean; diff --git a/xbmc/video/VideoLibraryQueue.cpp b/xbmc/video/VideoLibraryQueue.cpp new file mode 100644 index 0000000000..cc5530a239 --- /dev/null +++ b/xbmc/video/VideoLibraryQueue.cpp @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "VideoLibraryQueue.h" +#include "GUIUserMessages.h" +#include "Util.h" +#include "guilib/GUIWindowManager.h" +#include "threads/SingleLock.h" +#include "video/VideoDatabase.h" +#include "video/jobs/VideoLibraryCleaningJob.h" +#include "video/jobs/VideoLibraryJob.h" +#include "video/jobs/VideoLibraryMarkWatchedJob.h" +#include "video/jobs/VideoLibraryScanningJob.h" + +using namespace std; + +CVideoLibraryQueue::CVideoLibraryQueue() + : CJobQueue(false, 1, CJob::PRIORITY_LOW_PAUSABLE), + m_jobs(), + m_cleaning(false) +{ } + +CVideoLibraryQueue::~CVideoLibraryQueue() +{ + CSingleLock lock(m_critical); + m_jobs.clear(); +} + +CVideoLibraryQueue& CVideoLibraryQueue::Get() +{ + static CVideoLibraryQueue s_instance; + return s_instance; +} + +void CVideoLibraryQueue::ScanLibrary(const std::string& directory, bool scanAll /* = false */ , bool showProgress /* = true */) +{ + AddJob(new CVideoLibraryScanningJob(directory, scanAll, showProgress)); +} + +bool CVideoLibraryQueue::IsScanningLibrary() const +{ + // check if the library is being cleaned synchronously + if (m_cleaning) + return true; + + // check if the library is being scanned asynchronously + VideoLibraryJobMap::const_iterator scanningJobs = m_jobs.find("VideoLibraryScanningJob"); + if (scanningJobs != m_jobs.end() && !scanningJobs->second.empty()) + return true; + + // check if the library is being cleaned asynchronously + VideoLibraryJobMap::const_iterator cleaningJobs = m_jobs.find("VideoLibraryCleaningJob"); + if (cleaningJobs != m_jobs.end() && !cleaningJobs->second.empty()) + return true; + + return false; +} + +void CVideoLibraryQueue::StopLibraryScanning() +{ + CSingleLock lock(m_critical); + VideoLibraryJobMap::const_iterator scanningJobs = m_jobs.find("VideoLibraryScanningJob"); + if (scanningJobs == m_jobs.end()) + return; + + // get a copy of the scanning jobs because CancelJob() will modify m_scanningJobs + VideoLibraryJobs tmpScanningJobs(scanningJobs->second.begin(), scanningJobs->second.end()); + + // cancel all scanning jobs + for (VideoLibraryJobs::const_iterator job = tmpScanningJobs.begin(); job != tmpScanningJobs.end(); ++job) + CancelJob(*job); +} + +void CVideoLibraryQueue::CleanLibrary(const std::set<int>& paths /* = std::set<int>() */, bool asynchronous /* = true */, CGUIDialogProgressBarHandle* progressBar /* = NULL */) +{ + CVideoLibraryCleaningJob* cleaningJob = new CVideoLibraryCleaningJob(paths, progressBar); + + if (asynchronous) + AddJob(cleaningJob); + else + { + m_cleaning = true; + cleaningJob->DoWork(); + + delete cleaningJob; + m_cleaning = false; + } +} + +void CVideoLibraryQueue::CleanLibraryModal(const std::set<int>& paths /* = std::set<int>() */) +{ + // we can't perform a modal library cleaning if other jobs are running + if (IsRunning()) + return; + + m_cleaning = true; + CVideoLibraryCleaningJob cleaningJob(paths, true); + cleaningJob.DoWork(); + m_cleaning = false; +} + +void CVideoLibraryQueue::MarkAsWatched(const CFileItemPtr &item, bool watched) +{ + if (item == NULL) + return; + + AddJob(new CVideoLibraryMarkWatchedJob(item, watched)); +} + +void CVideoLibraryQueue::AddJob(CVideoLibraryJob *job) +{ + if (job == NULL) + return; + + CSingleLock lock(m_critical); + if (!CJobQueue::AddJob(job)) + return; + + // add the job to our list of queued/running jobs + std::string jobType = job->GetType(); + VideoLibraryJobMap::iterator jobsIt = m_jobs.find(jobType); + if (jobsIt == m_jobs.end()) + { + VideoLibraryJobs jobs; + jobs.insert(job); + m_jobs.insert(std::make_pair(jobType, jobs)); + } + else + jobsIt->second.insert(job); +} + +void CVideoLibraryQueue::CancelJob(CVideoLibraryJob *job) +{ + if (job == NULL) + return; + + CSingleLock lock(m_critical); + if (job->CanBeCancelled()) + job->Cancel(); + + CJobQueue::CancelJob(job); + + // remove the job from our list of queued/running jobs + VideoLibraryJobMap::iterator jobsIt = m_jobs.find(job->GetType()); + if (jobsIt != m_jobs.end()) + jobsIt->second.erase(job); +} + +void CVideoLibraryQueue::CancelAllJobs() +{ + CSingleLock lock(m_critical); + CJobQueue::CancelJobs(); + + // remove all scanning jobs + m_jobs.clear(); +} + +bool CVideoLibraryQueue::IsRunning() const +{ + return CJobQueue::IsProcessing() || m_cleaning; +} + +void CVideoLibraryQueue::OnJobComplete(unsigned int jobID, bool success, CJob *job) +{ + if (success) + { + if (QueueEmpty()) + { + CUtil::DeleteVideoDatabaseDirectoryCache(); + CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE); + g_windowManager.SendThreadMessage(msg); + } + } + + { + CSingleLock lock(m_critical); + // remove the job from our list of queued/running jobs + VideoLibraryJobMap::iterator jobsIt = m_jobs.find(job->GetType()); + if (jobsIt != m_jobs.end()) + jobsIt->second.erase(static_cast<CVideoLibraryJob*>(job)); + } + + return CJobQueue::OnJobComplete(jobID, success, job); +} diff --git a/xbmc/video/VideoLibraryQueue.h b/xbmc/video/VideoLibraryQueue.h new file mode 100644 index 0000000000..8ebf0aadcb --- /dev/null +++ b/xbmc/video/VideoLibraryQueue.h @@ -0,0 +1,132 @@ +#pragma once +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include <map> +#include <set> + +#include "FileItem.h" +#include "threads/CriticalSection.h" +#include "utils/JobManager.h" + +class CGUIDialogProgressBarHandle; +class CVideoLibraryJob; + +/*! + \brief Queue for video library jobs. + + The queue can only process a single job at any time and every job will be + executed at the lowest priority. + */ +class CVideoLibraryQueue : protected CJobQueue +{ +public: + ~CVideoLibraryQueue(); + + /*! + \brief Gets the singleton instance of the video library queue. + */ + static CVideoLibraryQueue& Get(); + + /*! + \brief Enqueue a library scan job. + + \param[in] directory Directory to scan + \param[in] scanAll Ignore exclude setting for items. Defaults to false + \param[in] showProgress Whether or not to show a progress dialog. Defaults to true + */ + void ScanLibrary(const std::string& directory, bool scanAll = false, bool showProgress = true); + + /*! + \brief Check if a library scan is in progress. + + \return True if a scan is in progress, false otherwise + */ + bool IsScanningLibrary() const; + + /*! + \brief Stop and dequeue all scanning jobs. + */ + void StopLibraryScanning(); + + /*! + \brief Enqueue a library cleaning job. + + \param[in] paths Set with database IDs of paths to be cleaned + \param[in] asynchronous Run the clean job asynchronously. Defaults to true + \param[in] progressBar Progress bar to update in GUI. Defaults to NULL (no progress bar to update) + */ + void CleanLibrary(const std::set<int>& paths = std::set<int>(), bool asynchronous = true, CGUIDialogProgressBarHandle* progressBar = NULL); + + /*! + \brief Executes a library cleaning with a modal dialog. + + \param[in] paths Set with database IDs of paths to be cleaned + */ + void CleanLibraryModal(const std::set<int>& paths = std::set<int>()); + + /*! + \brief Queue a watched status update job. + + \param[in] item Item to update watched status for + \param[in] watched New watched status + */ + void MarkAsWatched(const CFileItemPtr &item, bool watched); + + /*! + \brief Adds the given job to the queue. + + \param[in] job Video library job to be queued. + */ + void AddJob(CVideoLibraryJob *job); + + /*! + \brief Cancels the given job and removes it from the queue. + + \param[in] job Video library job to be canceld and removed from the queue. + */ + void CancelJob(CVideoLibraryJob *job); + + /*! + \brief Cancels all running and queued jobs. + */ + void CancelAllJobs(); + + /*! + \brief Whether any jobs are running or not. + */ + bool IsRunning() const; + +protected: + // implementation of IJobCallback + virtual void OnJobComplete(unsigned int jobID, bool success, CJob *job); + +private: + CVideoLibraryQueue(); + CVideoLibraryQueue(const CVideoLibraryQueue&); + CVideoLibraryQueue const& operator=(CVideoLibraryQueue const&); + + typedef std::set<CVideoLibraryJob*> VideoLibraryJobs; + typedef std::map<std::string, VideoLibraryJobs> VideoLibraryJobMap; + VideoLibraryJobMap m_jobs; + CCriticalSection m_critical; + + bool m_cleaning; +}; diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp index a3ee195eed..f97e0bf401 100644 --- a/xbmc/video/VideoReferenceClock.cpp +++ b/xbmc/video/VideoReferenceClock.cpp @@ -40,8 +40,11 @@ #if defined(TARGET_WINDOWS) #include "video/videosync/VideoSyncD3D.h" #endif -#if defined(TARGET_DARWIN) -#include "video/videosync/VideoSyncCocoa.h" +#if defined(TARGET_DARWIN_OSX) +#include "video/videosync/VideoSyncOsx.h" +#endif +#if defined(TARGET_DARWIN_IOS) +#include "video/videosync/VideoSyncIos.h" #endif using namespace std; @@ -106,8 +109,10 @@ void CVideoReferenceClock::Process() #endif #elif defined(TARGET_WINDOWS) m_pVideoSync = new CVideoSyncD3D(); -#elif defined(TARGET_DARWIN) - m_pVideoSync = new CVideoSyncCocoa(); +#elif defined(TARGET_DARWIN_OSX) + m_pVideoSync = new CVideoSyncOsx(); +#elif defined(TARGET_DARWIN_IOS) + m_pVideoSync = new CVideoSyncIos(); #elif defined(TARGET_RASPBERRY_PI) m_pVideoSync = new CVideoSyncPi(); #endif diff --git a/xbmc/video/dialogs/GUIDialogSubtitles.cpp b/xbmc/video/dialogs/GUIDialogSubtitles.cpp index 248240b9ac..688a7674ec 100644 --- a/xbmc/video/dialogs/GUIDialogSubtitles.cpp +++ b/xbmc/video/dialogs/GUIDialogSubtitles.cpp @@ -341,8 +341,7 @@ void CGUIDialogSubtitles::Search(const std::string &search/*=""*/) SPlayerAudioStreamInfo info; std::string strLanguage; - int currentAudio = g_application.m_pPlayer->GetAudioStream(); - g_application.m_pPlayer->GetAudioStreamInfo(currentAudio, info); + g_application.m_pPlayer->GetAudioStreamInfo(CURRENT_STREAM, info); if (!g_LangCodeExpander.Lookup(strLanguage, info.language)) strLanguage = "Unknown"; diff --git a/xbmc/video/dialogs/GUIDialogVideoInfo.cpp b/xbmc/video/dialogs/GUIDialogVideoInfo.cpp index 7ca6253c2b..14f934cebb 100644 --- a/xbmc/video/dialogs/GUIDialogVideoInfo.cpp +++ b/xbmc/video/dialogs/GUIDialogVideoInfo.cpp @@ -1216,21 +1216,10 @@ bool CGUIDialogVideoInfo::DeleteVideoItemFromDatabase(const CFileItemPtr &item, break; case VIDEODB_CONTENT_MOVIE_SETS: database.DeleteSet(item->GetVideoInfoTag()->m_iDbId); - return true; // no need to invalidate path hashes + break; default: return false; } - - std::string path; - database.GetFilePathById(item->GetVideoInfoTag()->m_iDbId, path, type); - if (!path.empty()) - { - if (type == VIDEODB_CONTENT_TVSHOWS) - database.SetPathHash(path,""); - else - database.SetPathHash(URIUtils::GetDirectory(path), ""); - } - return true; } diff --git a/xbmc/video/jobs/Makefile b/xbmc/video/jobs/Makefile new file mode 100644 index 0000000000..7fd9e0ba27 --- /dev/null +++ b/xbmc/video/jobs/Makefile @@ -0,0 +1,10 @@ +SRCS=VideoLibraryCleaningJob.cpp \ + VideoLibraryJob.cpp \ + VideoLibraryMarkWatchedJob.cpp \ + VideoLibraryProgressJob.cpp \ + VideoLibraryScanningJob.cpp \ + +LIB=video-jobs.a + +include ../../../Makefile.include +-include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS))) diff --git a/xbmc/video/jobs/VideoLibraryCleaningJob.cpp b/xbmc/video/jobs/VideoLibraryCleaningJob.cpp new file mode 100644 index 0000000000..035d91bcf2 --- /dev/null +++ b/xbmc/video/jobs/VideoLibraryCleaningJob.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "VideoLibraryCleaningJob.h" +#include "dialogs/GUIDialogExtendedProgressBar.h" +#include "video/VideoDatabase.h" + +using namespace std; + +CVideoLibraryCleaningJob::CVideoLibraryCleaningJob(const std::set<int>& paths /* = std::set<int>() */, bool showDialog /* = false */) + : CVideoLibraryProgressJob(NULL), + m_paths(paths), + m_showDialog(showDialog) +{ } + +CVideoLibraryCleaningJob::CVideoLibraryCleaningJob(const std::set<int>& paths, CGUIDialogProgressBarHandle* progressBar) + : CVideoLibraryProgressJob(progressBar), + m_paths(paths), + m_showDialog(false) +{ } + +CVideoLibraryCleaningJob::~CVideoLibraryCleaningJob() +{ } + +bool CVideoLibraryCleaningJob::operator==(const CJob* job) const +{ + if (strcmp(job->GetType(), GetType()) != 0) + return false; + + const CVideoLibraryCleaningJob* cleaningJob = dynamic_cast<const CVideoLibraryCleaningJob*>(job); + if (cleaningJob == NULL) + return false; + + return m_paths == cleaningJob->m_paths && + m_showDialog == cleaningJob->m_showDialog; +} + +bool CVideoLibraryCleaningJob::Work(CVideoDatabase &db) +{ + db.CleanDatabase(GetProgressBar(), m_paths, m_showDialog); + return true; +} diff --git a/xbmc/video/jobs/VideoLibraryCleaningJob.h b/xbmc/video/jobs/VideoLibraryCleaningJob.h new file mode 100644 index 0000000000..429a541ab8 --- /dev/null +++ b/xbmc/video/jobs/VideoLibraryCleaningJob.h @@ -0,0 +1,62 @@ +#pragma once +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include <set> + +#include "video/jobs/VideoLibraryProgressJob.h" + +class CGUIDialogProgressBarHandle; + +/*! + \brief Video library job implementation for cleaning the video library. +*/ +class CVideoLibraryCleaningJob : public CVideoLibraryProgressJob +{ +public: + /*! + \brief Creates a new video library cleaning job for the given paths. + + \param[in] paths Set with database IDs of paths to be cleaned + \param[in] showDialog Whether to show a modal dialog or not + */ + CVideoLibraryCleaningJob(const std::set<int>& paths = std::set<int>(), bool showDialog = false); + + /*! + \brief Creates a new video library cleaning job for the given paths. + + \param[in] paths Set with database IDs of paths to be cleaned + \param[in] progressBar Progress bar to be used to display the cleaning progress + */ + CVideoLibraryCleaningJob(const std::set<int>& paths, CGUIDialogProgressBarHandle* progressBar); + virtual ~CVideoLibraryCleaningJob(); + + // specialization of CJob + virtual const char *GetType() const { return "VideoLibraryCleaningJob"; } + virtual bool operator==(const CJob* job) const; + +protected: + // implementation of CVideoLibraryJob + virtual bool Work(CVideoDatabase &db); + +private: + std::set<int> m_paths; + bool m_showDialog; +}; diff --git a/xbmc/video/jobs/VideoLibraryJob.cpp b/xbmc/video/jobs/VideoLibraryJob.cpp new file mode 100644 index 0000000000..ad6f81bcee --- /dev/null +++ b/xbmc/video/jobs/VideoLibraryJob.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "VideoLibraryJob.h" +#include "video/VideoDatabase.h" + +using namespace std; + +CVideoLibraryJob::CVideoLibraryJob() +{ } + +CVideoLibraryJob::~CVideoLibraryJob() +{ } + +bool CVideoLibraryJob::DoWork() +{ + CVideoDatabase db; + if (!db.Open()) + return false; + + return Work(db); +} diff --git a/xbmc/video/jobs/VideoLibraryJob.h b/xbmc/video/jobs/VideoLibraryJob.h new file mode 100644 index 0000000000..ff5b8598c4 --- /dev/null +++ b/xbmc/video/jobs/VideoLibraryJob.h @@ -0,0 +1,62 @@ +#pragma once +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "utils/Job.h" + +class CVideoDatabase; + +/*! + \brief Basic implementation/interface of a CJob which interacts with the + video database. + */ +class CVideoLibraryJob : public CJob +{ +public: + virtual ~CVideoLibraryJob(); + + /*! + \brief Whether the job can be cancelled or not. + */ + virtual bool CanBeCancelled() const { return false; } + + /*! + \brief Tries to cancel the running job. + + \return True if the job was cancelled, false otherwise + */ + virtual bool Cancel() { return false; } + + // implementation of CJob + virtual bool DoWork(); + virtual const char *GetType() const { return "VideoLibraryJob"; } + virtual bool operator==(const CJob* job) const { return false; } + +protected: + CVideoLibraryJob(); + + /*! + \brief Worker method to be implemented by an actual implementation. + + \param[in] db Already open video database to be used for interaction + \return True if the process succeeded, false otherwise + */ + virtual bool Work(CVideoDatabase &db) = 0; +}; diff --git a/xbmc/video/jobs/VideoLibraryMarkWatchedJob.cpp b/xbmc/video/jobs/VideoLibraryMarkWatchedJob.cpp new file mode 100644 index 0000000000..452152f4c8 --- /dev/null +++ b/xbmc/video/jobs/VideoLibraryMarkWatchedJob.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include <vector> + +#include "VideoLibraryMarkWatchedJob.h" +#include "FileItem.h" +#include "Util.h" +#include "filesystem/Directory.h" +#ifdef HAS_UPNP +#include "network/upnp/UPnP.h" +#endif +#include "profiles/ProfilesManager.h" +#include "utils/URIUtils.h" +#include "video/VideoDatabase.h" + +CVideoLibraryMarkWatchedJob::CVideoLibraryMarkWatchedJob(const CFileItemPtr &item, bool mark) + : m_item(item), + m_mark(mark) +{ } + +CVideoLibraryMarkWatchedJob::~CVideoLibraryMarkWatchedJob() +{ } + +bool CVideoLibraryMarkWatchedJob::operator==(const CJob* job) const +{ + if (strcmp(job->GetType(), GetType()) != 0) + return false; + + const CVideoLibraryMarkWatchedJob* markJob = dynamic_cast<const CVideoLibraryMarkWatchedJob*>(job); + if (markJob == NULL) + return false; + + return m_item->IsSamePath(markJob->m_item.get()) && markJob->m_mark == m_mark; +} + +bool CVideoLibraryMarkWatchedJob::Work(CVideoDatabase &db) +{ + if (!CProfilesManager::Get().GetCurrentProfile().canWriteDatabases()) + return false; + + CFileItemList items; + items.Add(CFileItemPtr(new CFileItem(*m_item))); + + if (m_item->m_bIsFolder) + CUtil::GetRecursiveListing(m_item->GetPath(), items, "", XFILE::DIR_FLAG_NO_FILE_INFO); + + std::vector<CFileItemPtr> markItems; + for (int i = 0; i < items.Size(); i++) + { + CFileItemPtr item = items.Get(i); + if (item->HasVideoInfoTag() && m_mark == (item->GetVideoInfoTag()->m_playCount > 0)) + continue; + +#ifdef HAS_UPNP + if (URIUtils::IsUPnP(item->GetPath()) && UPNP::CUPnP::MarkWatched(*item, m_mark)) + continue; +#endif + + markItems.push_back(item); + } + + if (markItems.empty()) + return true; + + db.BeginTransaction(); + + for (std::vector<CFileItemPtr>::const_iterator iter = markItems.begin(); iter != markItems.end(); ++iter) + { + CFileItemPtr item = *iter; + if (m_mark) + { + std::string path(item->GetPath()); + if (item->HasVideoInfoTag()) + path = item->GetVideoInfoTag()->GetPath(); + + db.ClearBookMarksOfFile(path, CBookmark::RESUME); + db.IncrementPlayCount(*item); + } + else + db.SetPlayCount(*item, 0); + } + + db.CommitTransaction(); + db.Close(); + + return true; +} diff --git a/xbmc/video/jobs/VideoLibraryMarkWatchedJob.h b/xbmc/video/jobs/VideoLibraryMarkWatchedJob.h new file mode 100644 index 0000000000..995d23a959 --- /dev/null +++ b/xbmc/video/jobs/VideoLibraryMarkWatchedJob.h @@ -0,0 +1,49 @@ +#pragma once +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "FileItem.h" +#include "video/jobs/VideoLibraryJob.h" + +/*! + \brief Video library job implementation for marking items as watched/unwatched. + */ +class CVideoLibraryMarkWatchedJob : public CVideoLibraryJob +{ +public: + /*! + \brief Creates a new video library scanning job. + + \param[in] item Item to be marked as watched/unwatched + \param[in] mark Whether to mark the item as watched or unwatched + */ + CVideoLibraryMarkWatchedJob(const CFileItemPtr &item, bool mark); + virtual ~CVideoLibraryMarkWatchedJob(); + + virtual const char *GetType() const { return "CVideoLibraryMarkWatchedJob"; } + virtual bool operator==(const CJob* job) const; + +protected: + virtual bool Work(CVideoDatabase &db); + +private: + CFileItemPtr m_item; + bool m_mark; +}; diff --git a/xbmc/video/jobs/VideoLibraryProgressJob.cpp b/xbmc/video/jobs/VideoLibraryProgressJob.cpp new file mode 100644 index 0000000000..ff9e34dab0 --- /dev/null +++ b/xbmc/video/jobs/VideoLibraryProgressJob.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "VideoLibraryProgressJob.h" + +using namespace std; + +CVideoLibraryProgressJob::CVideoLibraryProgressJob(CGUIDialogProgressBarHandle* progressBar) + : CProgressJob(progressBar) +{ } + +CVideoLibraryProgressJob::~CVideoLibraryProgressJob() +{ } + +bool CVideoLibraryProgressJob::DoWork() +{ + SetProgress(0.0f); + + bool result = CVideoLibraryJob::DoWork(); + + SetProgress(100.0f); + MarkFinished(); + + return result; +} diff --git a/xbmc/utils/MarkWatchedJob.h b/xbmc/video/jobs/VideoLibraryProgressJob.h index cd59fd746e..9832f16746 100644 --- a/xbmc/utils/MarkWatchedJob.h +++ b/xbmc/video/jobs/VideoLibraryProgressJob.h @@ -19,26 +19,22 @@ * */ -#include "Job.h" -#include "utils/JobManager.h" +#include "utils/ProgressJob.h" +#include "video/jobs/VideoLibraryJob.h" -class CMarkWatchedJob : public CJob +/*! + \brief Combined base implementation of a video library job with a progress bar. + */ +class CVideoLibraryProgressJob : public CProgressJob, public CVideoLibraryJob { public: - CMarkWatchedJob(const CFileItemPtr &item, bool bMark); -private: - virtual ~CMarkWatchedJob(); - virtual const char *GetType() const { return "markwatched"; } - virtual bool operator==(const CJob* job) const; + virtual ~CVideoLibraryProgressJob(); + + // implementation of CJob virtual bool DoWork(); - CFileItemPtr m_item; - bool m_bMark; -}; + virtual const char *GetType() const { return "CVideoLibraryProgressJob"; } + virtual bool operator==(const CJob* job) const { return false; } -class CMarkWatchedQueue: public CJobQueue -{ -public: - static CMarkWatchedQueue &Get(); -private: - virtual void OnJobComplete(unsigned int jobID, bool success, CJob *job); +protected: + CVideoLibraryProgressJob(CGUIDialogProgressBarHandle* progressBar); }; diff --git a/xbmc/video/jobs/VideoLibraryScanningJob.cpp b/xbmc/video/jobs/VideoLibraryScanningJob.cpp new file mode 100644 index 0000000000..957d9d6f08 --- /dev/null +++ b/xbmc/video/jobs/VideoLibraryScanningJob.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "VideoLibraryScanningJob.h" +#include "video/VideoDatabase.h" + +using namespace std; + +CVideoLibraryScanningJob::CVideoLibraryScanningJob(const std::string& directory, bool scanAll /* = false */, bool showProgress /* = true */) + : m_scanner(), + m_directory(directory), + m_showProgress(showProgress), + m_scanAll(scanAll) +{ } + +CVideoLibraryScanningJob::~CVideoLibraryScanningJob() +{ } + +bool CVideoLibraryScanningJob::Cancel() +{ + if (!m_scanner.IsScanning()) + return true; + + m_scanner.Stop(); + return true; +} + +bool CVideoLibraryScanningJob::operator==(const CJob* job) const +{ + if (strcmp(job->GetType(), GetType()) != 0) + return false; + + const CVideoLibraryScanningJob* scanningJob = dynamic_cast<const CVideoLibraryScanningJob*>(job); + if (scanningJob == NULL) + return false; + + return m_directory == scanningJob->m_directory && + m_scanAll == scanningJob->m_scanAll; +} + +bool CVideoLibraryScanningJob::Work(CVideoDatabase &db) +{ + m_scanner.ShowDialog(m_showProgress); + m_scanner.Start(m_directory, m_scanAll); + + return true; +} diff --git a/xbmc/video/jobs/VideoLibraryScanningJob.h b/xbmc/video/jobs/VideoLibraryScanningJob.h new file mode 100644 index 0000000000..d858692378 --- /dev/null +++ b/xbmc/video/jobs/VideoLibraryScanningJob.h @@ -0,0 +1,63 @@ +#pragma once +/* + * Copyright (C) 2014 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include <string> + +#include "video/VideoInfoScanner.h" +#include "video/jobs/VideoLibraryJob.h" + +/*! + \brief Video library job implementation for scanning items. + + Uses CVideoInfoScanner for the whole filesystem scanning and can be run with + or without a visible progress bar. + */ +class CVideoLibraryScanningJob : public CVideoLibraryJob +{ +public: + /*! + \brief Creates a new video library scanning job. + + \param[in] directory Directory to be scanned for new items + \param[in] scanAll Whether to scan all items or not + \param[in] showProgress Whether to show a progress bar or not + */ + CVideoLibraryScanningJob(const std::string& directory, bool scanAll = false, bool showProgress = true); + virtual ~CVideoLibraryScanningJob(); + + // specialization of CVideoLibraryJob + virtual bool CanBeCancelled() const { return true; } + virtual bool Cancel(); + + // specialization of CJob + virtual const char *GetType() const { return "VideoLibraryScanningJob"; } + virtual bool operator==(const CJob* job) const; + +protected: + // implementation of CVideoLibraryJob + virtual bool Work(CVideoDatabase &db); + +private: + VIDEO::CVideoInfoScanner m_scanner; + std::string m_directory; + bool m_showProgress; + bool m_scanAll; +}; diff --git a/xbmc/video/videosync/Makefile b/xbmc/video/videosync/Makefile index cd8f397a05..04184a9b41 100644 --- a/xbmc/video/videosync/Makefile +++ b/xbmc/video/videosync/Makefile @@ -1,5 +1,6 @@ SRCS=VideoSyncGLX.cpp \ - VideoSyncCocoa.cpp \ + VideoSyncOsx.cpp \ + VideoSyncIos.cpp \ VideoSyncDRM.cpp \ VideoSyncPi.cpp \ diff --git a/xbmc/video/videosync/VideoSyncDRM.cpp b/xbmc/video/videosync/VideoSyncDRM.cpp index 389e01f29c..b30fb433d0 100644 --- a/xbmc/video/videosync/VideoSyncDRM.cpp +++ b/xbmc/video/videosync/VideoSyncDRM.cpp @@ -32,6 +32,22 @@ #include "guilib/GraphicContext.h" #include "utils/log.h" +static drmVBlankSeqType CrtcSel(void) +{ + int crtc = g_Windowing.GetCrtc(); + int ret = 0; + + if (crtc == 1) + { + ret = DRM_VBLANK_SECONDARY; + } + else if (crtc > 1) + { + ret = (crtc << DRM_VBLANK_HIGH_CRTC_SHIFT) & DRM_VBLANK_HIGH_CRTC_MASK; + } + return (drmVBlankSeqType)ret; +} + bool CVideoSyncDRM::Setup(PUPDATECLOCK func) { CLog::Log(LOGDEBUG, "CVideoSyncDRM::%s - setting up DRM", __FUNCTION__); @@ -47,7 +63,7 @@ bool CVideoSyncDRM::Setup(PUPDATECLOCK func) drmVBlank vbl; int ret; - vbl.request.type = DRM_VBLANK_RELATIVE; + vbl.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | CrtcSel()); vbl.request.sequence = 0; ret = drmWaitVBlank(m_fd, &vbl); if (ret != 0) @@ -67,18 +83,9 @@ void CVideoSyncDRM::Run(volatile bool& stop) drmVBlank vbl; VblInfo info; int ret; - int crtc = g_Windowing.GetCrtc(); + drmVBlankSeqType crtcSel = CrtcSel(); - vbl.request.type = DRM_VBLANK_RELATIVE; - if (crtc == 1) - { - vbl.request.type = (drmVBlankSeqType)(vbl.request.type | DRM_VBLANK_SECONDARY); - } - else if (crtc > 1) - { - vbl.request.type = (drmVBlankSeqType)(vbl.request.type | - ((crtc << DRM_VBLANK_HIGH_CRTC_SHIFT) & DRM_VBLANK_HIGH_CRTC_MASK)); - } + vbl.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | crtcSel); vbl.request.sequence = 0; ret = drmWaitVBlank(m_fd, &vbl); if (ret != 0) @@ -90,16 +97,7 @@ void CVideoSyncDRM::Run(volatile bool& stop) info.start = CurrentHostCounter(); info.videoSync = this; - vbl.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT); - if (crtc == 1) - { - vbl.request.type = (drmVBlankSeqType)(vbl.request.type | DRM_VBLANK_SECONDARY); - } - else if (crtc > 1) - { - vbl.request.type = (drmVBlankSeqType)(vbl.request.type | - ((crtc << DRM_VBLANK_HIGH_CRTC_SHIFT) & DRM_VBLANK_HIGH_CRTC_MASK)); - } + vbl.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT | crtcSel); vbl.request.sequence = 1; vbl.request.signal = (unsigned long)&info; ret = drmWaitVBlank(m_fd, &vbl); @@ -151,18 +149,9 @@ void CVideoSyncDRM::EventHandler(int fd, unsigned int frame, unsigned int sec, { drmVBlank vbl; VblInfo *info = (VblInfo*)data; - int crtc = g_Windowing.GetCrtc(); + drmVBlankSeqType crtcSel = CrtcSel(); - vbl.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT); - if (crtc == 1) - { - vbl.request.type = (drmVBlankSeqType)(vbl.request.type | DRM_VBLANK_SECONDARY); - } - else if (crtc > 1) - { - vbl.request.type = (drmVBlankSeqType)(vbl.request.type | - ((crtc << DRM_VBLANK_HIGH_CRTC_SHIFT) & DRM_VBLANK_HIGH_CRTC_MASK)); - } + vbl.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT | crtcSel); vbl.request.sequence = 1; vbl.request.signal = (unsigned long)data; diff --git a/xbmc/video/videosync/VideoSyncIos.cpp b/xbmc/video/videosync/VideoSyncIos.cpp new file mode 100644 index 0000000000..5203a66c56 --- /dev/null +++ b/xbmc/video/videosync/VideoSyncIos.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2015 Team Kodi + * http://kodi.tv + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "system.h" + +#if defined(TARGET_DARWIN_IOS) +#include "utils/log.h" +#include "VideoSyncIos.h" +#include "utils/MathUtils.h" +#include "video/VideoReferenceClock.h" +#include "guilib/GraphicContext.h" +#include "windowing/WindowingFactory.h" +#include "utils/TimeUtils.h" + +bool CVideoSyncIos::Setup(PUPDATECLOCK func) +{ + CLog::Log(LOGDEBUG, "CVideoSyncIos::%s setting up OSX", __FUNCTION__); + bool setupOk = false; + + //init the vblank timestamp + m_LastVBlankTime = CurrentHostCounter(); + UpdateClock = func; + m_abort = false; + + setupOk = InitDisplayLink(); + if (setupOk) + { + g_Windowing.Register(this); + } + + return setupOk; +} + +void CVideoSyncIos::Run(volatile bool& stop) +{ + //because cocoa has a vblank callback, we just keep sleeping until we're asked to stop the thread + while(!stop && !m_abort) + { + Sleep(100); + } +} + +void CVideoSyncIos::Cleanup() +{ + CLog::Log(LOGDEBUG, "CVideoSyncIos::%s cleaning up OSX", __FUNCTION__); + DeinitDisplayLink(); + g_Windowing.Unregister(this); +} + +float CVideoSyncIos::GetFps() +{ + m_fps = g_graphicsContext.GetFPS(); + CLog::Log(LOGDEBUG, "CVideoSyncIos::%s Detected refreshrate: %f hertz", __FUNCTION__, m_fps); + return m_fps; +} + +void CVideoSyncIos::OnResetDevice() +{ + m_abort = true; +} + +void CVideoSyncIos::IosVblankHandler() +{ + int NrVBlanks; + double VBlankTime; + int64_t nowtime = CurrentHostCounter(); + + //calculate how many vblanks happened + VBlankTime = (double)(nowtime - m_LastVBlankTime) / (double)g_VideoReferenceClock.GetFrequency(); + NrVBlanks = MathUtils::round_int(VBlankTime * m_fps); + + //save the timestamp of this vblank so we can calculate how many happened next time + m_LastVBlankTime = nowtime; + + //update the vblank timestamp, update the clock and send a signal that we got a vblank + UpdateClock(NrVBlanks, nowtime); +} + +bool CVideoSyncIos::InitDisplayLink() +{ + bool ret = true; + CLog::Log(LOGDEBUG, "CVideoSyncIos: setting up displaylink"); + if (!g_Windowing.InitDisplayLink(this)) + { + CLog::Log(LOGDEBUG, "CVideoSyncIos: InitDisplayLink failed"); + ret = false; + } + return ret; +} + +void CVideoSyncIos::DeinitDisplayLink() +{ + g_Windowing.DeinitDisplayLink(); +} + +#endif//TARGET_DARWIN_IOS diff --git a/xbmc/video/videosync/VideoSyncIos.h b/xbmc/video/videosync/VideoSyncIos.h new file mode 100644 index 0000000000..cde45745b1 --- /dev/null +++ b/xbmc/video/videosync/VideoSyncIos.h @@ -0,0 +1,52 @@ +#pragma once +/* + * Copyright (C) 20015 Team Kodi + * http://kodi.tv + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#if defined(TARGET_DARWIN_IOS) +#include "VideoSync.h" +#include "guilib/DispResource.h" + +class CVideoSyncIos : public CVideoSync, IDispResource +{ +public: + CVideoSyncIos() : m_LastVBlankTime(0), m_abort(false){} + + // CVideoSync interface + virtual bool Setup(PUPDATECLOCK func); + virtual void Run(volatile bool& stop); + virtual void Cleanup(); + virtual float GetFps(); + + // IDispResource interface + virtual void OnResetDevice(); + + // used in the displaylink callback + void IosVblankHandler(); + +private: + // CVideoSyncDarwin interface + virtual bool InitDisplayLink(); + virtual void DeinitDisplayLink(); + + int64_t m_LastVBlankTime; //timestamp of the last vblank, used for calculating how many vblanks happened + volatile bool m_abort; +}; + +#endif// TARGET_DARWIN_IOS diff --git a/xbmc/video/videosync/VideoSyncCocoa.cpp b/xbmc/video/videosync/VideoSyncOsx.cpp index f9fe46d871..53992fe9f9 100644 --- a/xbmc/video/videosync/VideoSyncCocoa.cpp +++ b/xbmc/video/videosync/VideoSyncOsx.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2014 Team XBMC - * http://xbmc.org + * Copyright (C) 2005-2014 Team Kodi + * http://kodi.tv * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,135 +20,112 @@ #include "system.h" -#if defined(TARGET_DARWIN) +#if defined(TARGET_DARWIN_OSX) #include "utils/log.h" -#include "VideoSyncCocoa.h" +#include "VideoSyncOsx.h" #include "utils/MathUtils.h" #include "video/VideoReferenceClock.h" +#include "guilib/GraphicContext.h" #include "utils/TimeUtils.h" - #include "windowing/WindowingFactory.h" - -//osx specifics -#if defined(TARGET_DARWIN_OSX) #include <QuartzCore/CVDisplayLink.h> #include "osx/CocoaInterface.h" -// Called by the Core Video Display Link whenever it's appropriate to render a frame. -static CVReturn DisplayLinkCallBack(CVDisplayLinkRef displayLink, const CVTimeStamp* inNow, const CVTimeStamp* inOutputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext) -{ - double fps = 60.0; - - if (inNow->videoRefreshPeriod > 0) - fps = (double)inOutputTime->videoTimeScale / (double)inOutputTime->videoRefreshPeriod; - - // Create an autorelease pool (necessary to call into non-Obj-C code from Obj-C code) - void* pool = Cocoa_Create_AutoReleasePool(); - - CVideoSyncCocoa *VideoSyncCocoa = reinterpret_cast<CVideoSyncCocoa*>(displayLinkContext); - VideoSyncCocoa->VblankHandler(inOutputTime->hostTime, fps); - - // Destroy the autorelease pool - Cocoa_Destroy_AutoReleasePool(pool); - - return kCVReturnSuccess; -} -#endif -void CVideoSyncCocoa::VblankHandler(int64_t nowtime, double fps) +bool CVideoSyncOsx::Setup(PUPDATECLOCK func) { - int NrVBlanks; - double VBlankTime; - int RefreshRate = MathUtils::round_int(fps); - - if (RefreshRate != MathUtils::round_int(m_fps)) - { - CLog::Log(LOGDEBUG, "CVideoSyncCocoa: Detected refreshrate: %f hertz, rounding to %i hertz", fps, RefreshRate); - UpdateFPS(fps); - } - - //calculate how many vblanks happened - VBlankTime = (double)(nowtime - m_LastVBlankTime) / (double)g_VideoReferenceClock.GetFrequency(); - NrVBlanks = MathUtils::round_int(VBlankTime * m_fps); - - //save the timestamp of this vblank so we can calculate how many happened next time - m_LastVBlankTime = nowtime; - - //update the vblank timestamp, update the clock and send a signal that we got a vblank - UpdateClock(NrVBlanks, nowtime); -} - -bool CVideoSyncCocoa::Setup(PUPDATECLOCK func) -{ - CLog::Log(LOGDEBUG, "CVideoSyncCocoa: setting up Cocoa"); + CLog::Log(LOGDEBUG, "CVideoSyncOsx::%s setting up OSX", __FUNCTION__); bool setupOk = false; - + //init the vblank timestamp m_LastVBlankTime = CurrentHostCounter(); UpdateClock = func; m_abort = false; -#if defined(TARGET_DARWIN_IOS) - g_Windowing.InitDisplayLink(this); - setupOk = true; -#else - setupOk = Cocoa_CVDisplayLinkCreate((void*)DisplayLinkCallBack, reinterpret_cast<void*>(this)); + setupOk = InitDisplayLink(); if (setupOk) + { g_Windowing.Register(this); - else - CLog::Log(LOGDEBUG, "CVideoSyncCocoa: Cocoa_CVDisplayLinkCreate failed"); -#endif - - if (setupOk) - GetFps(); - + } + return setupOk; } -void CVideoSyncCocoa::Run(volatile bool& stop) +void CVideoSyncOsx::Run(volatile bool& stop) { //because cocoa has a vblank callback, we just keep sleeping until we're asked to stop the thread while(!stop && !m_abort) { - Sleep(1000); + Sleep(100); } } -void CVideoSyncCocoa::Cleanup() +void CVideoSyncOsx::Cleanup() { - CLog::Log(LOGDEBUG, "CVideoSyncCocoa: cleaning up Cocoa"); -#if defined(TARGET_DARWIN_IOS) - g_Windowing.DeinitDisplayLink(); -#else - Cocoa_CVDisplayLinkRelease(); + CLog::Log(LOGDEBUG, "CVideoSyncOsx::%s cleaning up OSX", __FUNCTION__); + DeinitDisplayLink(); g_Windowing.Unregister(this); -#endif } -void CVideoSyncCocoa::UpdateFPS(double fps) +float CVideoSyncOsx::GetFps() { - int fpsInt = MathUtils::round_int(fps); - - if (fpsInt != MathUtils::round_int(m_fps)) - { - CLog::Log(LOGDEBUG, "CVideoSyncCocoa: Detected refreshrate: %i hertz", fpsInt); - m_fps = fpsInt; - } + m_fps = g_graphicsContext.GetFPS(); + CLog::Log(LOGDEBUG, "CVideoSyncOsx::%s Detected refreshrate: %f hertz", __FUNCTION__, m_fps); + return m_fps; } -void CVideoSyncCocoa::OnResetDevice() +void CVideoSyncOsx::OnResetDevice() { m_abort = true; } -float CVideoSyncCocoa::GetFps() +void CVideoSyncOsx::VblankHandler(int64_t nowtime) { -#if defined(TARGET_DARWIN_IOS) - UpdateFPS(g_Windowing.GetDisplayLinkFPS() + 0.5); -#else - UpdateFPS(Cocoa_GetCVDisplayLinkRefreshPeriod()); -#endif + int NrVBlanks; + double VBlankTime; + + //calculate how many vblanks happened + VBlankTime = (double)(nowtime - m_LastVBlankTime) / (double)g_VideoReferenceClock.GetFrequency(); + NrVBlanks = MathUtils::round_int(VBlankTime * m_fps); + + //save the timestamp of this vblank so we can calculate how many happened next time + m_LastVBlankTime = nowtime; + + //update the vblank timestamp, update the clock and send a signal that we got a vblank + UpdateClock(NrVBlanks, nowtime); +} - return m_fps; +// Called by the Core Video Display Link whenever it's appropriate to render a frame. +static CVReturn DisplayLinkCallBack(CVDisplayLinkRef displayLink, const CVTimeStamp* inNow, const CVTimeStamp* inOutputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext) +{ + // Create an autorelease pool (necessary to call into non-Obj-C code from Obj-C code) + void* pool = Cocoa_Create_AutoReleasePool(); + + CVideoSyncOsx *VideoSyncOsx = reinterpret_cast<CVideoSyncOsx*>(displayLinkContext); + + VideoSyncOsx->VblankHandler(inOutputTime->hostTime); + + // Destroy the autorelease pool + Cocoa_Destroy_AutoReleasePool(pool); + + return kCVReturnSuccess; +} + +bool CVideoSyncOsx::InitDisplayLink() +{ + bool ret = true; + CLog::Log(LOGDEBUG, "CVideoSyncOsx::%s setting up displaylink", __FUNCTION__); + + if (!Cocoa_CVDisplayLinkCreate((void*)DisplayLinkCallBack, reinterpret_cast<void*>(this))) + { + CLog::Log(LOGDEBUG, "CVideoSyncOsx::%s Cocoa_CVDisplayLinkCreate failed", __FUNCTION__); + ret = false; + } + return ret; +} + +void CVideoSyncOsx::DeinitDisplayLink() +{ + Cocoa_CVDisplayLinkRelease(); } -#endif//TARGET_DARWIN +#endif//TARGET_DARWIN_OSX diff --git a/xbmc/video/videosync/VideoSyncCocoa.h b/xbmc/video/videosync/VideoSyncOsx.h index 621d2dacc0..d24204a690 100644 --- a/xbmc/video/videosync/VideoSyncCocoa.h +++ b/xbmc/video/videosync/VideoSyncOsx.h @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2014 Team XBMC - * http://xbmc.org + * Copyright (C) 2005-2014 Team Kodi + * http://kodi.tv * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,23 +19,34 @@ * */ -#if defined(TARGET_DARWIN) +#if defined(TARGET_DARWIN_OSX) #include "VideoSync.h" #include "guilib/DispResource.h" -class CVideoSyncCocoa : public CVideoSync, IDispResource +class CVideoSyncOsx : public CVideoSync, IDispResource { public: + + CVideoSyncOsx() : m_LastVBlankTime(0), m_abort(false){} + + // CVideoSync interface virtual bool Setup(PUPDATECLOCK func); virtual void Run(volatile bool& stop); virtual void Cleanup(); virtual float GetFps(); - void VblankHandler(int64_t nowtime, double fps); + + // IDispResource interface virtual void OnResetDevice(); + + // used in the displaylink callback + void VblankHandler(int64_t nowtime); + private: - void UpdateFPS(double fps); + virtual bool InitDisplayLink(); + virtual void DeinitDisplayLink(); + int64_t m_LastVBlankTime; //timestamp of the last vblank, used for calculating how many vblanks happened volatile bool m_abort; }; -#endif +#endif// TARGET_DARWIN_OSX diff --git a/xbmc/video/windows/GUIWindowFullScreen.cpp b/xbmc/video/windows/GUIWindowFullScreen.cpp index 4bc6b97294..79a6574fa6 100644 --- a/xbmc/video/windows/GUIWindowFullScreen.cpp +++ b/xbmc/video/windows/GUIWindowFullScreen.cpp @@ -157,46 +157,24 @@ bool CGUIWindowFullScreen::OnAction(const CAction &action) } break; + case ACTION_SMALL_STEP_BACK: case ACTION_STEP_BACK: - if (m_timeCodePosition > 0) - SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); - else - g_application.GetSeekHandler()->Seek(false, action.GetAmount(), action.GetRepeat()); - return true; - - case ACTION_STEP_FORWARD: - if (m_timeCodePosition > 0) - SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD); - else - g_application.GetSeekHandler()->Seek(true, action.GetAmount(), action.GetRepeat()); - return true; - case ACTION_BIG_STEP_BACK: case ACTION_CHAPTER_OR_BIG_STEP_BACK: if (m_timeCodePosition > 0) + { SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); - else - g_application.m_pPlayer->Seek(false, true, action.GetID() == ACTION_CHAPTER_OR_BIG_STEP_BACK); - return true; - + return true; + } + break; + case ACTION_STEP_FORWARD: case ACTION_BIG_STEP_FORWARD: case ACTION_CHAPTER_OR_BIG_STEP_FORWARD: if (m_timeCodePosition > 0) + { SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD); - else - g_application.m_pPlayer->Seek(true, true, action.GetID() == ACTION_CHAPTER_OR_BIG_STEP_FORWARD); - return true; - - case ACTION_NEXT_SCENE: - if (g_application.m_pPlayer->SeekScene(true)) - g_infoManager.SetDisplayAfterSeek(); - return true; - break; - - case ACTION_PREV_SCENE: - if (g_application.m_pPlayer->SeekScene(false)) - g_infoManager.SetDisplayAfterSeek(); - return true; + return true; + } break; case ACTION_SHOW_OSD_TIME: @@ -251,18 +229,6 @@ bool CGUIWindowFullScreen::OnAction(const CAction &action) } return true; break; - case ACTION_SMALL_STEP_BACK: - if (m_timeCodePosition > 0) - SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD); - else - { - int orgpos = (int)g_application.GetTime(); - int jumpsize = g_advancedSettings.m_videoSmallStepBackSeconds; // secs - int setpos = (orgpos > jumpsize) ? orgpos - jumpsize : 0; - g_application.SeekTime((double)setpos); - } - return true; - break; case ACTION_SHOW_PLAYLIST: { CFileItem item(g_application.CurrentFileItem()); diff --git a/xbmc/video/windows/GUIWindowVideoBase.cpp b/xbmc/video/windows/GUIWindowVideoBase.cpp index c78b5bdaf7..62ea99550d 100644 --- a/xbmc/video/windows/GUIWindowVideoBase.cpp +++ b/xbmc/video/windows/GUIWindowVideoBase.cpp @@ -276,7 +276,7 @@ void CGUIWindowVideoBase::UpdateButtons() CGUIMediaWindow::UpdateButtons(); } -void CGUIWindowVideoBase::OnInfo(CFileItem* pItem, const ADDON::ScraperPtr& scraper) +void CGUIWindowVideoBase::OnInfo(CFileItem* pItem, ADDON::ScraperPtr& scraper) { if (!pItem) return; @@ -1410,7 +1410,7 @@ bool CGUIWindowVideoBase::OnPlayMedia(int iItem) } CLog::Log(LOGDEBUG, "%s %s", __FUNCTION__, CURL::GetRedacted(item.GetPath()).c_str()); - if (StringUtils::StartsWith(item.GetPath(), "pvr://recordings/")) + if (StringUtils::StartsWith(item.GetPath(), "pvr://recordings/active/")) { if (!g_PVRManager.IsStarted()) return false; diff --git a/xbmc/video/windows/GUIWindowVideoBase.h b/xbmc/video/windows/GUIWindowVideoBase.h index 23bc00b858..35269f05ea 100644 --- a/xbmc/video/windows/GUIWindowVideoBase.h +++ b/xbmc/video/windows/GUIWindowVideoBase.h @@ -49,7 +49,7 @@ public: static bool HasResumeItemOffset(const CFileItem *item); void AddToDatabase(int iItem); - virtual void OnInfo(CFileItem* pItem, const ADDON::ScraperPtr& scraper); + virtual void OnInfo(CFileItem* pItem, ADDON::ScraperPtr& scraper); /*! \brief Show the resume menu for this item (if it has a resume bookmark) diff --git a/xbmc/video/windows/GUIWindowVideoNav.cpp b/xbmc/video/windows/GUIWindowVideoNav.cpp index f70851f6f8..8d4128703f 100644 --- a/xbmc/video/windows/GUIWindowVideoNav.cpp +++ b/xbmc/video/windows/GUIWindowVideoNav.cpp @@ -192,7 +192,6 @@ bool CGUIWindowVideoNav::OnMessage(CGUIMessage& message) } break; // update the display - case GUI_MSG_SCAN_FINISHED: case GUI_MSG_REFRESH_THUMBS: Refresh(); break; @@ -814,7 +813,7 @@ void CGUIWindowVideoNav::GetContextButtons(int itemNumber, CContextButtons &butt } } - if (info && !g_application.IsVideoScanning()) + if (info) buttons.Add(CONTEXT_BUTTON_SCAN, 13349); } } @@ -902,8 +901,8 @@ void CGUIWindowVideoNav::GetContextButtons(int itemNumber, CContextButtons &butt { if (g_application.IsVideoScanning()) buttons.Add(CONTEXT_BUTTON_STOP_SCANNING, 13353); - else - buttons.Add(CONTEXT_BUTTON_SCAN, 13349); + + buttons.Add(CONTEXT_BUTTON_SCAN, 13349); } if (node == NODE_TYPE_SEASONS && item->m_bIsFolder) @@ -934,13 +933,13 @@ void CGUIWindowVideoNav::GetContextButtons(int itemNumber, CContextButtons &butt if (!g_application.IsVideoScanning()) { if (info && info->Content() != CONTENT_NONE) - { buttons.Add(CONTEXT_BUTTON_SET_CONTENT, 20442); - buttons.Add(CONTEXT_BUTTON_SCAN, 13349); - } else buttons.Add(CONTEXT_BUTTON_SET_CONTENT, 20333); } + + if (info && info->Content() != CONTENT_NONE) + buttons.Add(CONTEXT_BUTTON_SCAN, 13349); } } if (item->IsPlugin() || item->IsScript() || m_vecItems->IsPlugin()) diff --git a/xbmc/view/GUIViewState.cpp b/xbmc/view/GUIViewState.cpp index 0b61778748..63692d3415 100644 --- a/xbmc/view/GUIViewState.cpp +++ b/xbmc/view/GUIViewState.cpp @@ -395,6 +395,11 @@ bool CGUIViewState::AutoPlayNextItem() return false; } +bool CGUIViewState::JumpToFirstUnplayedItem() +{ + return false; +} + std::string CGUIViewState::GetLockType() { return ""; diff --git a/xbmc/view/GUIViewState.h b/xbmc/view/GUIViewState.h index 2a6eba6feb..2b207951ed 100644 --- a/xbmc/view/GUIViewState.h +++ b/xbmc/view/GUIViewState.h @@ -56,6 +56,7 @@ public: void SetPlaylistDirectory(const std::string& strDirectory); bool IsCurrentPlaylistDirectory(const std::string& strDirectory); virtual bool AutoPlayNextItem(); + virtual bool JumpToFirstUnplayedItem(); virtual std::string GetLockType(); virtual std::string GetExtensions(); diff --git a/xbmc/win32/WIN32Util.cpp b/xbmc/win32/WIN32Util.cpp index 662b6663f1..89755a1a96 100644 --- a/xbmc/win32/WIN32Util.cpp +++ b/xbmc/win32/WIN32Util.cpp @@ -42,6 +42,7 @@ #include "utils/Environment.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" +#include "win32/crts_caller.h" #include <cassert> @@ -53,6 +54,8 @@ "special://xbmc/system/webserver/;" \ "special://xbmc/" +#include <locale.h> + extern HWND g_hWnd; using namespace std; @@ -1606,3 +1609,10 @@ std::string CWIN32Util::WUSysMsg(DWORD dwError) else return StringUtils::Format("Unknown error (0x%X)", dwError); } + +bool CWIN32Util::SetThreadLocalLocale(bool enable /* = true */) +{ + const int param = enable ? _ENABLE_PER_THREAD_LOCALE : _DISABLE_PER_THREAD_LOCALE; + return CALL_IN_CRTS(_configthreadlocale, param) != -1; +} + diff --git a/xbmc/win32/WIN32Util.h b/xbmc/win32/WIN32Util.h index 572823ba26..55b1ee8efb 100644 --- a/xbmc/win32/WIN32Util.h +++ b/xbmc/win32/WIN32Util.h @@ -94,6 +94,8 @@ public: static bool IsUsbDevice(const std::wstring &strWdrive); static std::string WUSysMsg(DWORD dwError); + + static bool SetThreadLocalLocale(bool enable = true); private: static DEVINST GetDrivesDevInstByDiskNumber(long DiskNumber); }; diff --git a/xbmc/win32/crts_caller.cpp b/xbmc/win32/crts_caller.cpp new file mode 100644 index 0000000000..a30e0e593d --- /dev/null +++ b/xbmc/win32/crts_caller.cpp @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2015 Team Kodi + * http://kodi.tv + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +/** + * \file win32\crts_caller.h + * \brief Implements crts_caller class for calling same function for all loaded CRTs. + * \author Karlson2k + */ + +#include "crts_caller.h" +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif // WIN32_LEAN_AND_MEAN +#include <Windows.h> +#include <cassert> + +namespace win32_utils +{ + +static const wchar_t* const s_listOfCrts[] = +{ + { L"msvcrt.dll" }, // Visual Studio 6.0 / MinGW[-w64] + { L"msvcr70.dll" }, // Visual Studio 2002 + { L"msvcr71.dll" }, // Visual Studio 2003 + { L"msvcr80.dll" }, // Visual Studio 2005 + { L"msvcr90.dll" }, // Visual Studio 2008 +#ifdef _DEBUG + { L"msvcr90d.dll" }, // Visual Studio 2008 (debug) +#endif + { L"msvcr100.dll" }, // Visual Studio 2010 +#ifdef _DEBUG + { L"msvcr100d.dll" },// Visual Studio 2010 (debug) +#endif + { L"msvcr110.dll" }, // Visual Studio 2012 +#ifdef _DEBUG + { L"msvcr110d.dll" },// Visual Studio 2012 (debug) +#endif + { L"msvcr120.dll" }, // Visual Studio 2013 +#ifdef _DEBUG + { L"msvcr120d.dll" },// Visual Studio 2013 (debug) +#endif +}; + +std::vector<std::wstring> crts_caller::getCrtNames() +{ + return std::vector<std::wstring>(s_listOfCrts, s_listOfCrts + (sizeof(s_listOfCrts) / sizeof(s_listOfCrts[0]))); +} + + +crts_caller::crts_caller(const char* func_name) +{ + assert(func_name); + assert(func_name[0]); + if (func_name == NULL) + return; + + for (const wchar_t* const crtName : s_listOfCrts) + { + HMODULE hCrt = NULL; + if (!GetModuleHandleExW(0, crtName, &hCrt) || hCrt == NULL) // Flag 0 ensures that CRL will not be unloaded while we are using it here + continue; // Module not loaded + + void* func_ptr = GetProcAddress(hCrt, func_name); + if (func_ptr != NULL) + { + m_crts.push_back(hCrt); + m_funcPointers.push_back(func_ptr); + } + else + FreeLibrary(hCrt); // this CRT will not be used + } +} + +crts_caller::~crts_caller() +{ + for (void* hCrt : m_crts) + FreeLibrary((HMODULE)hCrt); +} + +} diff --git a/xbmc/win32/crts_caller.h b/xbmc/win32/crts_caller.h new file mode 100644 index 0000000000..6fe06722a3 --- /dev/null +++ b/xbmc/win32/crts_caller.h @@ -0,0 +1,74 @@ +#pragma once +/* + * Copyright (C) 2015 Team Kodi + * http://kodi.tv + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +/** + * \file win32\crts_caller.h + * \brief Declares crts_caller class for calling same function for all loaded CRTs. + * \author Karlson2k + */ + +#include <string> +#include <vector> + +#include <boost/preprocessor/stringize.hpp> + +namespace win32_utils +{ + +class crts_caller +{ +public: + crts_caller(const char* func_name); + const std::vector<void*>& get_pointers(void) + { return m_funcPointers; } + ~crts_caller(); + + template <typename ret_type, typename... param_types> + static typename ret_type call_in_all_crts(const char* func_name, ret_type(*cur_fnc_ptr) (param_types...), param_types... params) + { + typedef ret_type(*ptr_type)(param_types...); + + if (cur_fnc_ptr == NULL) + return (ret_type)0; // cur_fnc_ptr must point to process default CRT function + + crts_caller crts(func_name); + for (void* func_ptr : crts.m_funcPointers) + { + ptr_type func = (ptr_type)func_ptr; + if (func != cur_fnc_ptr) + (void)func(params...); // ignoring result of function call + } + + return cur_fnc_ptr(params...); // return result of calling process's CRT function + } + + static std::vector<std::wstring> getCrtNames(); +private: + std::vector<void*> m_funcPointers; + std::vector<void*> m_crts; // actually contains HMODULE +}; + +// Call function in all loaded CRTs +// Function must have same return type and same parameters in all CRTs +#define CALL_IN_CRTS(function,...) ::win32_utils::crts_caller::call_in_all_crts(BOOST_PP_STRINGIZE(function),&(function),##__VA_ARGS__) + + +} diff --git a/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp b/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp index 810588a56f..641d53daf4 100644 --- a/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp +++ b/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp @@ -25,9 +25,6 @@ #include "guilib/gui3d.h" #if defined(TARGET_ANDROID) #include "android/activity/XBMCApp.h" - #if defined(HAS_AMLPLAYER) || defined(HAS_LIBAMCODEC) - #include "utils/AMLUtils.h" - #endif #endif #include "utils/StringUtils.h" @@ -49,21 +46,10 @@ bool CEGLNativeTypeAndroid::CheckCompatibility() void CEGLNativeTypeAndroid::Initialize() { -#if defined(TARGET_ANDROID) && (defined(HAS_AMLPLAYER) || defined(HAS_LIBAMCODEC)) - aml_permissions(); - aml_cpufreq_min(true); - aml_cpufreq_max(true); -#endif - return; } void CEGLNativeTypeAndroid::Destroy() { -#if defined(TARGET_ANDROID) && (defined(HAS_AMLPLAYER) || defined(HAS_LIBAMCODEC)) - aml_cpufreq_min(false); - aml_cpufreq_max(false); -#endif - return; } diff --git a/xbmc/windowing/osx/WinSystemIOS.h b/xbmc/windowing/osx/WinSystemIOS.h index b221b6ec5a..cc4115ecc6 100644 --- a/xbmc/windowing/osx/WinSystemIOS.h +++ b/xbmc/windowing/osx/WinSystemIOS.h @@ -30,7 +30,8 @@ #include "threads/CriticalSection.h" class IDispResource; -class CVideoSyncCocoa; +class CVideoSyncIos; +struct CADisplayLinkWrapper; class CWinSystemIOS : public CWinSystemBase, public CRenderSystemGLES { @@ -68,10 +69,8 @@ public: virtual int GetNumScreens(); virtual int GetCurrentScreen(); - void InitDisplayLink(CVideoSyncCocoa *syncImpl); - void VblankHandler(int64_t nowtime, double fps); + bool InitDisplayLink(CVideoSyncIos *syncImpl); void DeinitDisplayLink(void); - double GetDisplayLinkFPS(void); void OnAppFocusChange(bool focus); bool IsBackgrounded() const { return m_bIsBackgrounded; } @@ -87,12 +86,12 @@ protected: CCriticalSection m_resourceSection; std::vector<IDispResource*> m_resources; bool m_bIsBackgrounded; - CVideoSyncCocoa *m_VideoSync; private: bool GetScreenResolution(int* w, int* h, double* fps, int screenIdx); void FillInVideoModes(); bool SwitchToVideoMode(int width, int height, double refreshrate, int screenIdx); + CADisplayLinkWrapper *m_pDisplayLink; }; XBMC_GLOBAL_REF(CWinSystemIOS,g_Windowing); diff --git a/xbmc/windowing/osx/WinSystemIOS.mm b/xbmc/windowing/osx/WinSystemIOS.mm index 1170d0de84..b853ab925a 100644 --- a/xbmc/windowing/osx/WinSystemIOS.mm +++ b/xbmc/windowing/osx/WinSystemIOS.mm @@ -36,13 +36,15 @@ #include "utils/StringUtils.h" #include "guilib/DispResource.h" #include "threads/SingleLock.h" -#include "video/videosync/VideoSyncCocoa.h" +#include "video/videosync/VideoSyncIos.h" #include <vector> #undef BOOL #import <Foundation/Foundation.h> #import <OpenGLES/ES2/gl.h> #import <OpenGLES/ES2/glext.h> +#import <QuartzCore/CADisplayLink.h> + #if defined(TARGET_DARWIN_IOS_ATV2) #import "atv2/KodiController.h" #else @@ -52,17 +54,36 @@ #include "osx/DarwinUtils.h" #import <dlfcn.h> +// IOSDisplayLinkCallback is declared in the lower part of the file +@interface IOSDisplayLinkCallback : NSObject +{ +@private CVideoSyncIos *_videoSyncImpl; +} +@property (nonatomic, setter=SetVideoSyncImpl:) CVideoSyncIos *_videoSyncImpl; +- (void) runDisplayLink; +@end + +struct CADisplayLinkWrapper +{ + CADisplayLink* impl; + IOSDisplayLinkCallback *callbackClass; +}; + CWinSystemIOS::CWinSystemIOS() : CWinSystemBase() { m_eWindowSystem = WINDOW_SYSTEM_IOS; m_iVSyncErrors = 0; m_bIsBackgrounded = false; - m_VideoSync = NULL; + m_pDisplayLink = new CADisplayLinkWrapper; + m_pDisplayLink->callbackClass = [[IOSDisplayLinkCallback alloc] init]; + } CWinSystemIOS::~CWinSystemIOS() { + [m_pDisplayLink->callbackClass release]; + delete m_pDisplayLink; } bool CWinSystemIOS::InitWindowSystem() @@ -346,26 +367,56 @@ void CWinSystemIOS::OnAppFocusChange(bool focus) (*i)->OnAppFocusChange(focus); } -void CWinSystemIOS::VblankHandler(int64_t nowtime, double fps) +//-------------------------------------------------------------- +//-------------------DisplayLink stuff +@implementation IOSDisplayLinkCallback +@synthesize _videoSyncImpl; +//-------------------------------------------------------------- +- (void) runDisplayLink; { - if (m_VideoSync) - m_VideoSync->VblankHandler(nowtime, fps); + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + if (_videoSyncImpl != nil) + { + _videoSyncImpl->IosVblankHandler(); + } + [pool release]; } +@end -void CWinSystemIOS::InitDisplayLink(CVideoSyncCocoa *syncImpl) +bool CWinSystemIOS::InitDisplayLink(CVideoSyncIos *syncImpl) { - m_VideoSync = syncImpl; + //init with the appropriate display link for the + //used screen + if([[IOSScreenManager sharedInstance] isExternalScreen]) + { + fprintf(stderr,"InitDisplayLink on external"); + } + else + { + fprintf(stderr,"InitDisplayLink on internal"); + } + + unsigned int currentScreenIdx = [[IOSScreenManager sharedInstance] GetScreenIdx]; + UIScreen * currentScreen = [[UIScreen screens] objectAtIndex:currentScreenIdx]; + [m_pDisplayLink->callbackClass SetVideoSyncImpl:syncImpl]; + m_pDisplayLink->impl = [currentScreen displayLinkWithTarget:m_pDisplayLink->callbackClass selector:@selector(runDisplayLink)]; + + [m_pDisplayLink->impl setFrameInterval:1]; + [m_pDisplayLink->impl addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; + return m_pDisplayLink->impl != nil; } + void CWinSystemIOS::DeinitDisplayLink(void) { + if (m_pDisplayLink->impl) + { + [m_pDisplayLink->impl invalidate]; + m_pDisplayLink->impl = nil; + [m_pDisplayLink->callbackClass SetVideoSyncImpl:nil]; + } } -double CWinSystemIOS::GetDisplayLinkFPS(void) -{ - double fps; - - fps = [g_xbmcController getDisplayLinkFPS]; - return fps; -} +//------------DispalyLink stuff end +//-------------------------------------------------------------- bool CWinSystemIOS::PresentRenderImpl(const CDirtyRegionList &dirty) { diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp index c8ccc85dfc..eaf9dcf7cd 100644 --- a/xbmc/windows/GUIMediaWindow.cpp +++ b/xbmc/windows/GUIMediaWindow.cpp @@ -50,7 +50,7 @@ #include "dialogs/GUIDialogOK.h" #include "playlists/PlayList.h" #include "storage/MediaManager.h" -#include "utils/MarkWatchedJob.h" +#include "video/VideoLibraryQueue.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" #include "guilib/Key.h" @@ -71,6 +71,7 @@ #include "xbmc/android/activity/XBMCApp.h" #endif #include "FileItemListModification.h" +#include "video/VideoInfoTag.h" #define CONTROL_BTNVIEWASICONS 2 #define CONTROL_BTNSORTBY 3 @@ -851,9 +852,35 @@ bool CGUIMediaWindow::Update(const std::string &strDirectory, bool updateFilterP } } - // if we haven't found the selected item, select the first item + // if we haven't found the selected item, see if we should select the first unplayed item + // if yes, find the first unplayed item and select it + // if no, select the first item if (!bSelectedFound) - m_viewControl.SetSelectedItem(0); + { + int iIndex = 0; // index of the item to select, default to the first item + + // Check if we should select the first unplayed item + if (m_guiState.get()->JumpToFirstUnplayedItem()) + { + // Find the index of the + for (int i = 0; i < m_vecItems->Size(); ++i) + { + CFileItemPtr pItem = m_vecItems->Get(i); + // We don't want to jump to the parent folder item or an All Seasons item + if (pItem->IsParentFolder() || !pItem->HasVideoInfoTag() || + (pItem->GetVideoInfoTag()->m_type == MediaTypeSeason && pItem->GetVideoInfoTag()->m_iSeason < 0)) + continue; + + if (pItem->GetVideoInfoTag()->m_playCount == 0) + { + iIndex = i; + break; + } + } + } + + m_viewControl.SetSelectedItem(iIndex); + } m_history.AddPath(m_vecItems->GetPath(), m_strFilterPath); @@ -1523,8 +1550,12 @@ void CGUIMediaWindow::GetContextButtons(int itemNumber, CContextButtons &buttons { CFileItemPtr item = (itemNumber >= 0 && itemNumber < m_vecItems->Size()) ? m_vecItems->Get(itemNumber) : CFileItemPtr(); - if (!item) + // ensure that the "go to parent" item doesn't have any context menu items + if (!item || item->IsParentFolder()) + { + buttons.clear(); return; + } // user added buttons std::string label; @@ -1570,7 +1601,7 @@ bool CGUIMediaWindow::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item = m_vecItems->Get(itemNumber); m_viewControl.SetSelectedItem(m_viewControl.GetSelectedItem() + 1); - CMarkWatchedQueue::Get().AddJob(new CMarkWatchedJob(item, (button == CONTEXT_BUTTON_MARK_WATCHED))); + CVideoLibraryQueue::Get().MarkAsWatched(item, (button == CONTEXT_BUTTON_MARK_WATCHED)); return true; } case CONTEXT_BUTTON_ADD_FAVOURITE: diff --git a/xbmc/windows/GUIWindowSystemInfo.cpp b/xbmc/windows/GUIWindowSystemInfo.cpp index 9e281b5439..68f3a437f9 100644 --- a/xbmc/windows/GUIWindowSystemInfo.cpp +++ b/xbmc/windows/GUIWindowSystemInfo.cpp @@ -182,6 +182,7 @@ void CGUIWindowSystemInfo::FrameMove() SetControlLabel(i++, "%s: %s", 19116, PVR_BACKEND_DISKSPACE); SetControlLabel(i++, "%s: %s", 19019, PVR_BACKEND_CHANNELS); SetControlLabel(i++, "%s: %s", 19163, PVR_BACKEND_RECORDINGS); + SetControlLabel(i++, "%s: %s", 19168, PVR_BACKEND_DELETED_RECORDINGS); // Deleted and recoverable recordings SetControlLabel(i++, "%s: %s", 19025, PVR_BACKEND_TIMERS); } |