From 7eef57707763ab60ea0f71d6a24f45fa30e280f1 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 25 Jul 2013 04:31:02 +0200 Subject: [PATCH 001/103] xbmc: update to xbmc-12.2-8e4f924 Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc-theme-Confluence/meta | 2 +- packages/mediacenter/xbmc/meta | 2 +- .../todo/xbmc-990.27-PR2232.patch.bk | 0 ...-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk | 0 .../xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk | 0 .../xbmc-321-texturepacker-hostflags-and-rework.patch | 0 ...bmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch | 0 .../xbmc-452-change_lcd_content-0.1.patch | 0 .../xbmc-453-add_openelec.tv_RSS_news-0.1.patch | 0 .../xbmc-990.00-remove-windowed-display-mode.patch | 0 .../xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch | 0 .../xbmc-995.11-enable-vpp-deinterlacing.patch | 0 .../xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch | 0 .../xbmc-995.13-vpp-fix-skipping.patch | 0 14 files changed, 2 insertions(+), 2 deletions(-) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/todo/xbmc-990.27-PR2232.patch.bk (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/todo/xbmc-995.03-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/todo/xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/xbmc-321-texturepacker-hostflags-and-rework.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/xbmc-452-change_lcd_content-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/xbmc-453-add_openelec.tv_RSS_news-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/xbmc-990.00-remove-windowed-display-mode.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/xbmc-995.11-enable-vpp-deinterlacing.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-49610fa => 12.2-8e4f924}/xbmc-995.13-vpp-fix-skipping.patch (100%) diff --git a/packages/mediacenter/xbmc-theme-Confluence/meta b/packages/mediacenter/xbmc-theme-Confluence/meta index 91cf69272c..6541659273 100644 --- a/packages/mediacenter/xbmc-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-theme-Confluence/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xbmc-theme-Confluence" -PKG_VERSION="12.2-49610fa" +PKG_VERSION="12.2-8e4f924" if [ "$XBMC" = "master" ]; then PKG_VERSION="c218d5c" elif [ "$XBMC" = "xbmc-aml" ]; then diff --git a/packages/mediacenter/xbmc/meta b/packages/mediacenter/xbmc/meta index ae89ab4895..a0369ad6b7 100644 --- a/packages/mediacenter/xbmc/meta +++ b/packages/mediacenter/xbmc/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xbmc" -PKG_VERSION="12.2-49610fa" +PKG_VERSION="12.2-8e4f924" if [ "$XBMC" = "master" ]; then PKG_VERSION="c218d5c" elif [ "$XBMC" = "xbmc-aml" ]; then diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/todo/xbmc-990.27-PR2232.patch.bk b/packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-990.27-PR2232.patch.bk similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/todo/xbmc-990.27-PR2232.patch.bk rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-990.27-PR2232.patch.bk diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/todo/xbmc-995.03-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk b/packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-995.03-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/todo/xbmc-995.03-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-995.03-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/todo/xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk b/packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/todo/xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-321-texturepacker-hostflags-and-rework.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-321-texturepacker-hostflags-and-rework.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-452-change_lcd_content-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-452-change_lcd_content-0.1.patch rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-452-change_lcd_content-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-990.00-remove-windowed-display-mode.patch b/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-990.00-remove-windowed-display-mode.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-990.00-remove-windowed-display-mode.patch rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-990.00-remove-windowed-display-mode.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch b/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-995.11-enable-vpp-deinterlacing.patch b/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.11-enable-vpp-deinterlacing.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-995.11-enable-vpp-deinterlacing.patch rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.11-enable-vpp-deinterlacing.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch b/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-995.13-vpp-fix-skipping.patch b/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.13-vpp-fix-skipping.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-49610fa/xbmc-995.13-vpp-fix-skipping.patch rename to packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.13-vpp-fix-skipping.patch From cd4b9bd1002ff544489a5fa0b8de8083517daf3e Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 25 Jul 2013 04:44:55 +0200 Subject: [PATCH 002/103] bcm2835-driver: update to bcm2835-driver-89ac8f4 Signed-off-by: Stephan Raue --- packages/graphics/bcm2835-driver/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphics/bcm2835-driver/package.mk b/packages/graphics/bcm2835-driver/package.mk index 7a1f89a218..b8d37792d5 100644 --- a/packages/graphics/bcm2835-driver/package.mk +++ b/packages/graphics/bcm2835-driver/package.mk @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="bcm2835-driver" -PKG_VERSION="82ca326" +PKG_VERSION="89ac8f4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="nonfree" From 992c281b98cca662446c4ec244c93dc91a1f8b83 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 25 Jul 2013 04:45:14 +0200 Subject: [PATCH 003/103] bcm2835-bootloader: update to bcm2835-bootloader-89ac8f4 Signed-off-by: Stephan Raue --- packages/tools/bcm2835-bootloader/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tools/bcm2835-bootloader/package.mk b/packages/tools/bcm2835-bootloader/package.mk index f9eb762fd0..3ecac88b1c 100644 --- a/packages/tools/bcm2835-bootloader/package.mk +++ b/packages/tools/bcm2835-bootloader/package.mk @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="bcm2835-bootloader" -PKG_VERSION="82ca326" +PKG_VERSION="89ac8f4" PKG_REV="1" PKG_ARCH="arm" PKG_LICENSE="nonfree" From b1e15665b55b8b3df052d0ec3a1630a2cbbc26d8 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 25 Jul 2013 17:46:00 +0200 Subject: [PATCH 004/103] projects/RPi/patches/linux: update RPi kernel patch Signed-off-by: Stephan Raue --- ...tch => linux-01-RPi_support-0e20c99.patch} | 786 +++++++++++++++--- 1 file changed, 683 insertions(+), 103 deletions(-) rename projects/RPi/patches/linux/{linux-01-RPi_support-b04d3b1.patch => linux-01-RPi_support-0e20c99.patch} (99%) diff --git a/projects/RPi/patches/linux/linux-01-RPi_support-b04d3b1.patch b/projects/RPi/patches/linux/linux-01-RPi_support-0e20c99.patch similarity index 99% rename from projects/RPi/patches/linux/linux-01-RPi_support-b04d3b1.patch rename to projects/RPi/patches/linux/linux-01-RPi_support-0e20c99.patch index d1ba3eb691..13472c3fdb 100644 --- a/projects/RPi/patches/linux/linux-01-RPi_support-b04d3b1.patch +++ b/projects/RPi/patches/linux/linux-01-RPi_support-0e20c99.patch @@ -1,7 +1,7 @@ From c8c2c38e2e6f946c4eb5bec85a4d119f9e4187fb Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sun, 12 May 2013 12:24:19 +0100 -Subject: [PATCH 01/99] Main bcm2708 linux port +Subject: [PATCH 001/102] Main bcm2708 linux port Signed-off-by: popcornmix --- @@ -8262,7 +8262,7 @@ index b838ffc..f3a39c1 100644 From ebc13205d511583860ae7ba112a89135329c4dda Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 1 May 2013 19:46:17 +0100 -Subject: [PATCH 02/99] Add dwc_otg driver +Subject: [PATCH 002/102] Add dwc_otg driver Signed-off-by: popcornmix --- @@ -65344,7 +65344,7 @@ index 0000000..abcf284 From e5b4e5d798579eb1f9e596acf6c17b0549e2f873 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 1 May 2013 19:54:32 +0100 -Subject: [PATCH 03/99] bcm2708 watchdog driver +Subject: [PATCH 003/102] bcm2708 watchdog driver Signed-off-by: popcornmix --- @@ -65781,7 +65781,7 @@ index 0000000..dd33c35 From 378f91f6bc45eb06c549f8cf1b09995715327701 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 1 May 2013 19:55:09 +0100 -Subject: [PATCH 04/99] bcm2708 framebuffer driver +Subject: [PATCH 004/102] bcm2708 framebuffer driver Signed-off-by: popcornmix --- @@ -68819,7 +68819,7 @@ index 3c14e43..7626beb 100644 From da834fbe72658bafb431c63b0160b0a57a0ea06d Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 2 Jul 2013 23:42:01 +0100 -Subject: [PATCH 05/99] bcm2708 vchiq driver +Subject: [PATCH 005/102] bcm2708 vchiq driver Signed-off-by: popcornmix --- @@ -81270,7 +81270,7 @@ index 0000000..b6bfa21 From 00bd6a3906ca51ab52a07aad2c908fc76b1da39c Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Jul 2013 00:31:47 +0100 -Subject: [PATCH 06/99] cma: Add vc_cma driver to enable use of CMA +Subject: [PATCH 006/102] cma: Add vc_cma driver to enable use of CMA Signed-off-by: popcornmix --- @@ -82569,7 +82569,7 @@ index 0000000..bdc9d79 From d7f919d0ce6207f0e98520ca9045f4dc18de52c9 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Mon, 26 Mar 2012 22:15:50 +0100 -Subject: [PATCH 07/99] bcm2708: alsa sound driver +Subject: [PATCH 007/102] bcm2708: alsa sound driver Signed-off-by: popcornmix --- @@ -84895,7 +84895,7 @@ index 0000000..af3e6eb From bf8b3a360e26791caa1d9114df7c80d5c27a0711 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 26 Mar 2013 17:26:38 +0000 -Subject: [PATCH 08/99] Allow mac address to be set in smsc95xx +Subject: [PATCH 008/102] Allow mac address to be set in smsc95xx Signed-off-by: popcornmix --- @@ -84992,7 +84992,7 @@ index 3f38ba8..60076fe 100644 From 43f606bf172f727d4d65c74c4f42cf58db19fcf8 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 8 May 2012 23:12:13 +0100 -Subject: [PATCH 09/99] possible fix for sdcard missing status. Thank naren +Subject: [PATCH 009/102] possible fix for sdcard missing status. Thank naren --- drivers/mmc/host/sdhci-bcm2708.c | 9 +++++++++ @@ -85032,7 +85032,7 @@ index e79723d..a405114 100644 From d725e274b999e4326449ff3629066edb42d00c3a Mon Sep 17 00:00:00 2001 From: popcornmix Date: Thu, 17 May 2012 14:44:19 +0100 -Subject: [PATCH 10/99] sdcard patch improvements from naren +Subject: [PATCH 010/102] sdcard patch improvements from naren --- drivers/mmc/host/sdhci-bcm2708.c | 23 +++++++---------------- @@ -85094,7 +85094,7 @@ index a405114..ae8edf7 100644 From 14a9f7efae05898a45ac550af36323e2c9682e28 Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Mon, 4 Jun 2012 04:27:48 +0200 -Subject: [PATCH 11/99] sdhci-bcm2708: speed up DMA sync +Subject: [PATCH 011/102] sdhci-bcm2708: speed up DMA sync Experiments show that it doesn't really take that long to sync, so we can reduce the poll interval slightly. Might improve performance a bit. @@ -85122,7 +85122,7 @@ index ae8edf7..a6bdc25 100644 From ad970a2722da54be80dc810d81c75a6938d3e58a Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Mon, 11 Jun 2012 18:52:04 +0200 -Subject: [PATCH 12/99] sdhci-bcm2708: remove custom clock handling +Subject: [PATCH 012/102] sdhci-bcm2708: remove custom clock handling The custom clock handling code is redundant and buggy. The MMC/SDHCI subsystem does a better job than it, so remove it for good. @@ -85223,7 +85223,7 @@ index a6bdc25..0ed4d85 100644 From 38cd27c91c8ea233aec8ae9477a2108a3ca519ea Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Mon, 11 Jun 2012 18:53:59 +0200 -Subject: [PATCH 13/99] sdhci-bcm2708: add additional quirks +Subject: [PATCH 013/102] sdhci-bcm2708: add additional quirks Some additional quirks are needed for correct operation. There's no SDHCI capabilities register documented, and it always reads @@ -85256,7 +85256,7 @@ index 0ed4d85..3001836 100644 From f14d342ff13c3262cb31b9138cd1d3833c75a5a7 Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Mon, 11 Jun 2012 18:57:13 +0200 -Subject: [PATCH 14/99] sdhci-bcm2708: add allow_highspeed parameter +Subject: [PATCH 014/102] sdhci-bcm2708: add allow_highspeed parameter Add a parameter to disable high-speed mode for the few cards that still might have problems. High-speed mode is enabled by default. @@ -85307,7 +85307,7 @@ index 3001836..c64de21 100644 From 02fd8aacce57a8c77e02ceb3e6aff3e46fb06a72 Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Mon, 11 Jun 2012 18:58:40 +0200 -Subject: [PATCH 15/99] sdhci-bcm2708: assume 50 MHz eMMC clock +Subject: [PATCH 015/102] sdhci-bcm2708: assume 50 MHz eMMC clock 80 MHz clock isnt't suited well to be dividable to get SD clocks of 25 MHz (default mode) or 50 MHz (high speed mode). 50 MHz are perfect to @@ -85336,7 +85336,7 @@ index c64de21..d174938 100644 From 2186ee5f876aad0d666d6f31692ad2a883f60196 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sat, 16 Jun 2012 22:31:55 +0100 -Subject: [PATCH 16/99] Allow emmc clock to be specified as command line +Subject: [PATCH 016/102] Allow emmc clock to be specified as command line parameter --- @@ -85386,7 +85386,7 @@ index d174938..0ee983c 100644 From bd13f67e2f81a783890c9083fcba77dde0b29809 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sat, 16 Jun 2012 22:35:38 +0100 -Subject: [PATCH 17/99] sdhci-bcm2708: raise DMA sync timeout +Subject: [PATCH 017/102] sdhci-bcm2708: raise DMA sync timeout Commit d64b84c by accident reduced the maximum overall DMA sync timeout. The maximum overall timeout was reduced from 100ms to 30ms, @@ -85419,7 +85419,7 @@ index 0ee983c..b0cdd7d 100644 From a892f560e785c614c47ef60fc38950e47cf644be Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 22 Jun 2012 12:57:42 +0100 -Subject: [PATCH 18/99] Use ndelay rather than udelay. Thanks lb +Subject: [PATCH 018/102] Use ndelay rather than udelay. Thanks lb --- drivers/mmc/host/sdhci-bcm2708.c | 8 ++++---- @@ -85469,7 +85469,7 @@ index b0cdd7d..7bba950 100644 From 20c684aea3aafbbb1424905b7cd63e241db44b88 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Jul 2013 00:41:10 +0100 -Subject: [PATCH 19/99] Backport of Chris Boot's i2c and spi drivers. +Subject: [PATCH 019/102] Backport of Chris Boot's i2c and spi drivers. --- arch/arm/configs/bcmrpi_cutdown_defconfig | 10 + @@ -86761,7 +86761,7 @@ index 0000000..9f1580e From fa218dd798563865e7d1845fbd3cdf88ddac4568 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Thu, 19 Jul 2012 16:00:28 +0100 -Subject: [PATCH 20/99] Add SPI_SPI_DEV module +Subject: [PATCH 020/102] Add SPI_SPI_DEV module --- arch/arm/configs/bcmrpi_defconfig | 1 + @@ -86786,9 +86786,9 @@ index 6219df3..31f5afaa 100644 From 65bfccc3a8523cef7b80230e972f4d6fff68bcc8 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 13 Jul 2012 18:34:18 +0100 -Subject: [PATCH 21/99] Fix for quitting X hang. Interrupted mailbox reads are - not something we can reliably recover from, so down_interruptable is not a - safe call. +Subject: [PATCH 021/102] Fix for quitting X hang. Interrupted mailbox reads + are not something we can reliably recover from, so down_interruptable is not + a safe call. --- arch/arm/mach-bcm2708/vcio.c | 12 ++++-------- @@ -86824,7 +86824,7 @@ index 799a0ac..3874051 100644 From 98a3d88e3a7f8e3e51f0a7e87bacf9779bbeac06 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 17 Jul 2012 00:48:27 +0100 -Subject: [PATCH 22/99] Add sync_after_dma module parameter +Subject: [PATCH 022/102] Add sync_after_dma module parameter --- drivers/mmc/host/sdhci-bcm2708.c | 60 +++++++++++++++++++++------------------- @@ -86944,7 +86944,7 @@ index 7bba950..3792b9f 100644 From 53a6e2c9df4180d614cd49425b0387569788f4a8 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sun, 12 May 2013 12:25:52 +0100 -Subject: [PATCH 23/99] sdhci-bcm2708: use extension FIFO to buffer DMA +Subject: [PATCH 023/102] sdhci-bcm2708: use extension FIFO to buffer DMA transfers The additional FIFO might speed up transfers in some cases. @@ -86999,8 +86999,8 @@ index 3792b9f..326b962 100644 From 889c54183fcb491aa8738f73b569c8f64a2f83b6 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Jul 2013 00:42:49 +0100 -Subject: [PATCH 24/99] sdhci-bcm2708: use multiblock-type transfers for single - blocks +Subject: [PATCH 024/102] sdhci-bcm2708: use multiblock-type transfers for + single blocks There are issues with both single block reads (missed completion) and writes (data loss in some cases!). Just don't do single block @@ -87058,7 +87058,7 @@ index e326ae2..70020e3 100644 From 3dbb84a60f62598345aa3a5aa0478753c8d2058f Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 1 Aug 2012 19:02:14 +0100 -Subject: [PATCH 25/99] Add module parameter for missing_status quirk. +Subject: [PATCH 025/102] Add module parameter for missing_status quirk. sdhci-bcm2708.missing_status=0 may improve interrupt latency --- @@ -87117,7 +87117,7 @@ index c6d6bb0..8243593 100644 From 669d28370d45ac6cfe4dc07b2889abffbd1aff52 Mon Sep 17 00:00:00 2001 From: ddv2005 Date: Sun, 5 Aug 2012 10:42:12 -0400 -Subject: [PATCH 26/99] Fix spinlock recursion in sdhci-bcm2708.c +Subject: [PATCH 026/102] Fix spinlock recursion in sdhci-bcm2708.c --- drivers/mmc/host/sdhci-bcm2708.c | 14 +++++++------- @@ -87189,7 +87189,7 @@ index 8243593..7a703c2 100644 From bb9a79055bf7d1596b9f1c6d08c9526fa3d616ed Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 21 Aug 2012 18:49:44 +0100 -Subject: [PATCH 27/99] Read memory size for vc_mem through mailbox property +Subject: [PATCH 027/102] Read memory size for vc_mem through mailbox property channel --- @@ -87363,7 +87363,7 @@ index fd9d4be..7a7748e 100644 From 375ad1bb17db91b98602924bbbbc6a9ac7fa5e11 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 8 May 2013 11:46:50 +0100 -Subject: [PATCH 28/99] enabling the realtime clock 1-wire chip DS1307 and +Subject: [PATCH 028/102] enabling the realtime clock 1-wire chip DS1307 and 1-wire on GPIO4 (as a module) --- @@ -87429,7 +87429,7 @@ index 510be0b..d61e747 100644 From 4154023606fb33c371aca4c5075218b0df54d864 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sun, 12 May 2013 12:27:48 +0100 -Subject: [PATCH 29/99] Add low-latency mode to sdcard driver. Disable with +Subject: [PATCH 029/102] Add low-latency mode to sdcard driver. Disable with sdhci-bcm2708.enable_llm=0. Thanks ddv2005. --- @@ -87955,7 +87955,7 @@ index f3a39c1..58bfab0 100644 From 681651078bf2d1cad92b3eb803ccb5f141b06db0 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Jul 2013 00:46:42 +0100 -Subject: [PATCH 30/99] Add FIQ patch to dwc_otg driver. Enable with +Subject: [PATCH 030/102] Add FIQ patch to dwc_otg driver. Enable with dwc_otg.fiq_fix_enable=1. Should give about 10% more ARM performance. Thanks to Gordon and Costas @@ -89118,7 +89118,7 @@ index a7e9076..bb1c42d 100644 From 02516ae111bbdec2a3e03ef8f42e6a54f7ebc48d Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 12 Apr 2013 23:58:47 +0100 -Subject: [PATCH 33/99] Add verious user config requests. +Subject: [PATCH 033/102] Add verious user config requests. CONFIG_DEVTMPFS_MOUNT, CONFIG_NFS_V4_1=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y, drbd and IPSEC modules @@ -89531,8 +89531,8 @@ index 31f5afaa..ef43466 100644 From d9f05b5596f47c80bebf7acd9a2bbce6d4521375 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sat, 8 Sep 2012 15:17:53 +0100 -Subject: [PATCH 34/99] Avoid dynamic memory allocation for channel lock in USB - driver. Thanks ddv2005. +Subject: [PATCH 034/102] Avoid dynamic memory allocation for channel lock in + USB driver. Thanks ddv2005. --- drivers/usb/host/dwc_otg/dwc_otg_hcd.c | 6 +++--- @@ -89641,7 +89641,7 @@ index f1658fa..21e8f09 100644 From b7e56e22e1128f99388c5869769590c812ee3467 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Jul 2013 00:49:20 +0100 -Subject: [PATCH 35/99] Add cpufreq driver +Subject: [PATCH 035/102] Add cpufreq driver --- arch/arm/Kconfig | 1 + @@ -90171,7 +90171,7 @@ index 0000000..aa6fc66 From bde86bb81df0a9119108b8baadd3c87bc7394167 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Mon, 8 Apr 2013 21:12:48 +0100 -Subject: [PATCH 36/99] Add NAK holdoff scheme. Enabled by default, disable +Subject: [PATCH 036/102] Add NAK holdoff scheme. Enabled by default, disable with dwc_otg.nak_holdoff_enable=0. Thanks gsh --- @@ -90384,7 +90384,7 @@ index ac10323..e6b2a7b 100644 From c9748c8b0dab670e3e963708b253b471a14cc4b6 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 26 Mar 2013 19:24:24 +0000 -Subject: [PATCH 37/99] Added hwmon/thermal driver for reporting core +Subject: [PATCH 037/102] Added hwmon/thermal driver for reporting core temperature. Thanks Dorian --- @@ -90911,7 +90911,7 @@ index 0000000..f1ecdb2 From 278f0aa4868514d23a3c21fd71782638105b3cc1 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 12 Apr 2013 23:59:27 +0100 -Subject: [PATCH 38/99] Add config options for thermal sensor, L2TP, +Subject: [PATCH 038/102] Add config options for thermal sensor, L2TP, RT2800USB_UNKNOWN, and various I2C and SPI RTCs. Tidy of thermal driver. --- @@ -91082,7 +91082,7 @@ index f1ecdb2..3f9a733 100644 From cb7b29a8bab3312bea4b37cff8fb08477a9dd280 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Thu, 28 Mar 2013 01:19:54 +0000 -Subject: [PATCH 39/99] 2708fb: Remove some unnecessary dmesg output. +Subject: [PATCH 039/102] 2708fb: Remove some unnecessary dmesg output. --- drivers/video/bcm2708_fb.c | 34 +++++++++++++++++++--------------- @@ -91212,7 +91212,7 @@ index c82dd90..08d9238 100644 From 317d5b4df2b5ef8a2227d778a3d267657940d8f5 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Thu, 28 Mar 2013 01:20:34 +0000 -Subject: [PATCH 40/99] cpufreq: Remove some unnecessary dmesg output. +Subject: [PATCH 040/102] cpufreq: Remove some unnecessary dmesg output. --- drivers/cpufreq/bcm2835-cpufreq.c | 2 +- @@ -91238,8 +91238,8 @@ index aa6fc66..6ff1edb 100755 From 371d191f321a252cfac87e7ffb09e24cc6e0f452 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Mon, 17 Sep 2012 22:57:29 +0100 -Subject: [PATCH 41/99] Switch to powersave governor. We'll enable ondemand in - the distribution +Subject: [PATCH 041/102] Switch to powersave governor. We'll enable ondemand + in the distribution --- arch/arm/configs/bcmrpi_defconfig | 5 +++-- @@ -91269,7 +91269,7 @@ index d11f688..c1afa47 100644 From 707f3a7af88b74b654c77687f276e1afbc480e82 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 17 Apr 2013 12:16:36 +0100 -Subject: [PATCH 42/99] Enable multiple ALSA channels +Subject: [PATCH 042/102] Enable multiple ALSA channels --- arch/arm/mach-bcm2708/bcm2708.c | 54 ++++++++++++++++++++++++++++++++++++----- @@ -91347,7 +91347,7 @@ index 2875cd2..27e9553 100644 From a6db2e423dc8ce4d6fa43c2237258805a1146ee5 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Oct 2012 20:08:19 +0100 -Subject: [PATCH 43/99] set i2c speed via module-parameter or menuconfig. +Subject: [PATCH 043/102] set i2c speed via module-parameter or menuconfig. Thanks FrankBoesing --- @@ -91425,7 +91425,7 @@ index 7cae615..3391889 100644 From 1d18bb9dd8c8b62e45cad2d0dcc30eaecc2c6a69 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Oct 2012 21:31:48 +0100 -Subject: [PATCH 44/99] Allow the number of cycles delay between sdcard +Subject: [PATCH 044/102] Allow the number of cycles delay between sdcard peripheral writes to be specified on command line with sdhci-bcm2708.cycle_delay @@ -91470,7 +91470,7 @@ index 7ce2829..ffd7310 100644 From 4aecef94dd8c0705a023c89db4c370500f340e10 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 17 Apr 2013 14:37:25 +0100 -Subject: [PATCH 45/99] Fix vc-mem by using module parameters +Subject: [PATCH 045/102] Fix vc-mem by using module parameters --- arch/arm/mach-bcm2708/bcm2708.c | 12 ++--- @@ -91708,7 +91708,7 @@ index 5ef68b3..057f74f 100644 From d4d52a1403731c1c673e97be27b28d9e3a8a4136 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 5 Oct 2012 22:44:47 +0100 -Subject: [PATCH 46/99] Support dummy vc-mem ioctl used by vcdbg +Subject: [PATCH 046/102] Support dummy vc-mem ioctl used by vcdbg --- arch/arm/mach-bcm2708/include/mach/vc_mem.h | 1 + @@ -91759,8 +91759,8 @@ index 057f74f..aeae4d5 100644 From ea6d83f5c4fa383d86f7b8c410c62cceea3ecb36 Mon Sep 17 00:00:00 2001 From: dero Date: Mon, 19 Nov 2012 12:46:06 +0100 -Subject: [PATCH 47/99] Lazy CRC quirk: Implemented retrying mechanisms for SD - SSR and SCR, disabled missing_status and spurious CRC ACMD51 quirks by +Subject: [PATCH 047/102] Lazy CRC quirk: Implemented retrying mechanisms for + SD SSR and SCR, disabled missing_status and spurious CRC ACMD51 quirks by default (should be fixed by the retrying-mechanishm) --- @@ -91994,7 +91994,7 @@ index ffd7310..3556ed3 100644 From 3bcecc233a96399a4e88a2a209a34fcfac8dc3fd Mon Sep 17 00:00:00 2001 From: popcornmix Date: Thu, 28 Mar 2013 00:10:32 +0000 -Subject: [PATCH 48/99] bcm2708: Add vc_cma driver to enable use of CMA +Subject: [PATCH 048/102] bcm2708: Add vc_cma driver to enable use of CMA --- arch/arm/mach-bcm2708/bcm2708.c | 18 ++++++++++++++++++ @@ -92058,7 +92058,7 @@ index e010515..9d38d40 100644 From 027f6c9ff7ef276abc540ad4269803884d3099e2 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 24 Oct 2012 22:00:43 +0100 -Subject: [PATCH 49/99] Fix reboot with new restart method of machine driver +Subject: [PATCH 049/102] Fix reboot with new restart method of machine driver --- arch/arm/mach-bcm2708/bcm2708.c | 18 +++++++++++++++++- @@ -92139,7 +92139,7 @@ index bc9d458..2d0b821 100644 From 5a11b596dde3ab3f1ed7e3bc26ba213461c5aa35 Mon Sep 17 00:00:00 2001 From: Gordon Hollingworth Date: Sun, 4 Nov 2012 15:55:01 +0000 -Subject: [PATCH 50/99] Make sure we wait for the reset to finish +Subject: [PATCH 050/102] Make sure we wait for the reset to finish --- drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c | 2 ++ @@ -92165,7 +92165,7 @@ index 3e762e2..e8c91e7 100644 From 4b12c94e5ad7ea1e93ba52d7c6160cc0fefd4c61 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Mon, 19 Nov 2012 18:27:05 +0000 -Subject: [PATCH 51/99] Add Simon Hall's dma helper module, useful in future +Subject: [PATCH 051/102] Add Simon Hall's dma helper module, useful in future for X acceleration --- @@ -93506,7 +93506,7 @@ index 0000000..5cb1335 From 7ba8d6a7442791f9c67095d49705ce9fa94c58a3 Mon Sep 17 00:00:00 2001 From: Aron Szabo Date: Sat, 16 Jun 2012 12:15:55 +0200 -Subject: [PATCH 52/99] lirc: added support for RaspberryPi GPIO +Subject: [PATCH 052/102] lirc: added support for RaspberryPi GPIO --- drivers/staging/media/lirc/Kconfig | 6 + @@ -94244,8 +94244,8 @@ index 0000000..96acab0 From 8372f6fe360b00d43a27f3fce9b24a47d088dd75 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sun, 25 Nov 2012 18:28:09 +0000 -Subject: [PATCH 53/99] Allow mailbox driver to be called from user code though - ioctl +Subject: [PATCH 053/102] Allow mailbox driver to be called from user code + though ioctl --- arch/arm/mach-bcm2708/include/mach/vcio.h | 33 +++++++ @@ -94484,7 +94484,7 @@ index 468fdef..09b78b5 100644 From 3182ee5f146dddc9bbcbb4d73c670b5a5b6c2866 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 11 Dec 2012 18:23:03 +0000 -Subject: [PATCH 54/99] Default to dwc_otp.lpm_enable=0 +Subject: [PATCH 054/102] Default to dwc_otp.lpm_enable=0 --- drivers/usb/host/dwc_otg/dwc_otg_driver.c | 2 +- @@ -94510,7 +94510,7 @@ index d353a9a..cea8fcb 100644 From d25b264279de2a98dfeb74d68dd8b6bb8838ef93 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 11 Dec 2012 19:04:27 +0000 -Subject: [PATCH 55/99] Increase default coherent pool so vchiq starts up +Subject: [PATCH 055/102] Increase default coherent pool so vchiq starts up --- arch/arm/mach-bcm2708/bcm2708.c | 4 +--- @@ -94538,7 +94538,7 @@ index 9f456e9..87fd348 100644 From 540d544c17f3ee3614f50c7807989639ba15fc91 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Mon, 7 Jan 2013 21:34:59 +0000 -Subject: [PATCH 56/99] Add mutex around bcm_mailbox_property function +Subject: [PATCH 056/102] Add mutex around bcm_mailbox_property function --- arch/arm/mach-bcm2708/vcio.c | 5 ++++- @@ -94581,7 +94581,7 @@ index 09b78b5..599eb63 100644 From db66ac826bbca8163eaa233ae74d93611a1d6830 Mon Sep 17 00:00:00 2001 From: P33M Date: Wed, 9 Jan 2013 16:12:04 +0000 -Subject: [PATCH 57/99] dwc_otg: fix bug in dwc_otg_hcd.c resulting in silent +Subject: [PATCH 057/102] dwc_otg: fix bug in dwc_otg_hcd.c resulting in silent kernel memory corruption, escalating to OOPS under high USB load. --- @@ -94621,7 +94621,7 @@ index e6b2a7b..b337e1b 100644 From 6be8954eb70b616249353fdf4ea69d4c43df36aa Mon Sep 17 00:00:00 2001 From: popcornmix Date: Mon, 21 Jan 2013 23:03:53 +0000 -Subject: [PATCH 58/99] Return error value from bcm2708_setup_state. Thanks +Subject: [PATCH 058/102] Return error value from bcm2708_setup_state. Thanks notro --- @@ -94647,7 +94647,7 @@ index 9f1580e..8513704 100644 From 1962bb39b3a61eac199da29f057c5998a3b3fb26 Mon Sep 17 00:00:00 2001 From: Kamal Mostafa Date: Mon, 22 Oct 2012 15:52:44 -0700 -Subject: [PATCH 59/99] spi/spi-bcm2708: respect per-transfer SPI clock +Subject: [PATCH 059/102] spi/spi-bcm2708: respect per-transfer SPI clock speed_hz value The bcm2708 SPI driver's bcm2708_process_transfer() was ignoring the @@ -94695,7 +94695,7 @@ index 8513704..b74aa32 100644 From 2b5353b5e7245753a6709986b79f413838ad38e4 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Jul 2013 00:51:55 +0100 -Subject: [PATCH 60/99] Add hwrng (hardware random number generator) driver +Subject: [PATCH 060/102] Add hwrng (hardware random number generator) driver --- arch/arm/mach-bcm2708/include/mach/platform.h | 1 + @@ -94876,7 +94876,7 @@ index 0000000..1ffa7d7 From 1a7fa1b69ae87ca896420024791322ad9eb53184 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Thu, 7 Feb 2013 17:04:13 +0000 -Subject: [PATCH 61/99] Add missing newlines to log messages +Subject: [PATCH 061/102] Add missing newlines to log messages --- drivers/cpufreq/bcm2835-cpufreq.c | 20 ++++++++++---------- @@ -94978,7 +94978,7 @@ index 6ff1edb..5a19212 100755 From 91d1e7dc598707cc207231eb3da6af7fb4220dfe Mon Sep 17 00:00:00 2001 From: Technion Date: Mon, 11 Feb 2013 22:08:53 +1100 -Subject: [PATCH 62/99] Changed wording on logging. Previously, we received +Subject: [PATCH 062/102] Changed wording on logging. Previously, we received errors like this: mmc0: could read SD Status register (SSR) at the 3th attempt A more sensible response is now returned. A typo also fixed in comments. @@ -95016,7 +95016,7 @@ index 1ee6cf3..90228f9 100644 From c7d43ef857410811f7e87deca3cae3ede61a6960 Mon Sep 17 00:00:00 2001 From: P33M Date: Fri, 15 Feb 2013 22:36:47 +0000 -Subject: [PATCH 63/99] dwc_otg: Fix unsafe access of QTD during URB enqueue +Subject: [PATCH 063/102] dwc_otg: Fix unsafe access of QTD during URB enqueue In dwc_otg_hcd_urb_enqueue during qtd creation, it was possible that the transaction could complete almost immediately after the qtd was assigned @@ -95106,7 +95106,7 @@ index b337e1b..b3e6e52 100644 From 0d56c0c2af666dbc6760d0ac1da67b4da2556fc3 Mon Sep 17 00:00:00 2001 From: P33M Date: Fri, 15 Feb 2013 22:38:40 +0000 -Subject: [PATCH 64/99] dwc_otg: Fix incorrect URB allocation error handling +Subject: [PATCH 064/102] dwc_otg: Fix incorrect URB allocation error handling If the memory allocation for a dwc_otg_urb failed, the kernel would OOPS because for some reason a member of the *unallocated* struct was set to @@ -95150,7 +95150,7 @@ index e653d84..fcec97f 100644 From 317fc23a9cd49bbf6afd6fadf89edddb817db9a9 Mon Sep 17 00:00:00 2001 From: pjennings Date: Wed, 20 Feb 2013 17:51:43 -0600 -Subject: [PATCH 65/99] Added inverted transmitter support +Subject: [PATCH 065/102] Added inverted transmitter support --- drivers/staging/media/lirc/lirc_rpi.c | 17 +++++++++++------ @@ -95234,7 +95234,7 @@ index 96acab0..5bb0dfe 100644 From 95ed7f785da984ace8ccf7524fb450d0a44e9d9c Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sun, 24 Feb 2013 16:30:57 +0000 -Subject: [PATCH 66/99] Add retry on error and tidy of temperature driver +Subject: [PATCH 066/102] Add retry on error and tidy of temperature driver --- drivers/thermal/bcm2835-thermal.c | 78 ++++++++++++++------------------------- @@ -95364,8 +95364,8 @@ index 3f9a733..85fceb5 100644 From f6c2e77434c76596ffd86e09ccd5d108ea124a0b Mon Sep 17 00:00:00 2001 From: P33M Date: Thu, 28 Feb 2013 16:52:51 +0000 -Subject: [PATCH 67/99] dwc_otg: fix potential use-after-free case in interrupt - handler +Subject: [PATCH 067/102] dwc_otg: fix potential use-after-free case in + interrupt handler If a transaction had previously aborted, certain interrupts are enabled to track error counts and reset where necessary. On IN @@ -95399,8 +95399,8 @@ index e8c91e7..0c81a64 100644 From 749b88c3d2636de12adfdb247f0da98f331dbe88 Mon Sep 17 00:00:00 2001 From: P33M Date: Sun, 3 Mar 2013 14:45:53 +0000 -Subject: [PATCH 68/99] dwc_otg: add handling of SPLIT transaction data toggle - errors +Subject: [PATCH 068/102] dwc_otg: add handling of SPLIT transaction data + toggle errors Previously a data toggle error on packets from a USB1.1 device behind a TT would result in the Pi locking up as the driver never handled @@ -95457,7 +95457,7 @@ index 0c81a64..16e8c6c 100644 From 39c5e0cc5dec38fb9c530fad0250c3047c752dc0 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 1 May 2013 21:14:28 +0100 -Subject: [PATCH 69/99] Add bitbanging pullups, use them for w1-gpio +Subject: [PATCH 069/102] Add bitbanging pullups, use them for w1-gpio Allows parasite power to work, uses module option pullup=1 --- @@ -95599,7 +95599,7 @@ index e10acc2..667fdd5 100644 From b8fab4e6dfef8a0c150536a9232477c67cdd8065 Mon Sep 17 00:00:00 2001 From: notro Date: Sat, 26 Jan 2013 20:38:03 +0100 -Subject: [PATCH 70/99] spi-bcm2708: add 9-bit support using LoSSI mode +Subject: [PATCH 070/102] spi-bcm2708: add 9-bit support using LoSSI mode --- drivers/spi/spi-bcm2708.c | 30 ++++++++++++++++++++++++++++-- @@ -95672,7 +95672,7 @@ index b74aa32..abaa5a6 100644 From d9028dd04d2ad83ebc5713159603fffd24f3a22b Mon Sep 17 00:00:00 2001 From: P33M Date: Thu, 21 Mar 2013 19:36:17 +0000 -Subject: [PATCH 71/99] dwc_otg: implement tasklet for returning URBs to +Subject: [PATCH 071/102] dwc_otg: implement tasklet for returning URBs to usbcore hcd layer The dwc_otg driver interrupt handler for transfer completion will spend @@ -95917,8 +95917,8 @@ index 9702f81..7bb133a 100644 From c71f14fd40a4fadb40a7449f583de733895dc2e2 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 16 Apr 2013 15:36:01 +0100 -Subject: [PATCH 73/99] Add v6wbi_flush_kern_tlb_range to allow zsmalloc to be - built as a module +Subject: [PATCH 073/102] Add v6wbi_flush_kern_tlb_range to allow zsmalloc to + be built as a module --- arch/arm/kernel/armksyms.c | 4 ++++ @@ -95943,7 +95943,7 @@ index 60d3b73..cba4d28 100644 From 07b4444a2c199eebf90b6d3556c06be61162a4aa Mon Sep 17 00:00:00 2001 From: P33M Date: Mon, 22 Apr 2013 00:08:36 +0100 -Subject: [PATCH 74/99] dwc_otg: fix NAK holdoff and allow on split +Subject: [PATCH 074/102] dwc_otg: fix NAK holdoff and allow on split transactions only This corrects a bug where if a single active non-periodic endpoint @@ -96016,7 +96016,7 @@ index 91eefecd..eaa8f38 100644 From 847b720d29f170f59838851ef89fa16d4e8be328 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 26 Apr 2013 10:08:31 -0700 -Subject: [PATCH 75/99] Merge pull request #286 from +Subject: [PATCH 075/102] Merge pull request #286 from martinezjavier/rpi-3.6.y-dev add mmap support and some cleanups to bcm2835 ALSA driver @@ -96500,7 +96500,7 @@ index b966e28..08c763d 100755 From b084004a4e4956baa6caae26892c987a814e5b86 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 7 May 2013 22:20:24 +0100 -Subject: [PATCH 76/99] Add quick config. +Subject: [PATCH 076/102] Add quick config. This is designed for quick compiling when developing. No modules are needed and it includes all Pi specific drivers @@ -96719,7 +96719,7 @@ index 0000000..e5efe75 From ce78b69a10967de55daa264905bf5c3c082fa58e Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 10 May 2013 19:42:38 +0100 -Subject: [PATCH 77/99] mmc: suppress sdcard warnings we are happy about by +Subject: [PATCH 077/102] mmc: suppress sdcard warnings we are happy about by default --- @@ -96788,7 +96788,7 @@ index 3556ed3..c2409b9 100644 From 82a33c8bf57a7973e6a9e691b26b2302623cc283 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 14 May 2013 11:42:25 +0100 -Subject: [PATCH 78/99] Allow reboot=q on command line to set a flag that +Subject: [PATCH 078/102] Allow reboot=q on command line to set a flag that bootcode.bin can use to boot from alternate partition --- @@ -96822,7 +96822,7 @@ index 87fd348..1ed4d73 100644 From c59cd6c169dbd7bfbaac7f0db70202d1ea77f998 Mon Sep 17 00:00:00 2001 From: hutorny Date: Mon, 13 May 2013 10:26:14 +0300 -Subject: [PATCH 80/99] Update bcm2708.c to use CONFIG_BCM2708_SPIDEV rather +Subject: [PATCH 080/102] Update bcm2708.c to use CONFIG_BCM2708_SPIDEV rather than CONFIG_SPI --- @@ -96875,7 +96875,7 @@ index 1ed4d73..68c577a 100644 From f49ef700428e660617cb2af4c5ac3b7b21422d3e Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sat, 8 Jun 2013 22:14:13 +0100 -Subject: [PATCH 82/99] Only init gpio pins of selected i2c bus +Subject: [PATCH 082/102] Only init gpio pins of selected i2c bus --- drivers/i2c/busses/i2c-bcm2708.c | 8 +++++--- @@ -96922,7 +96922,7 @@ index 3391889..edc90c0 100644 From 10bf7045ddd880bbe4f7dde8b4f49598d83b6efa Mon Sep 17 00:00:00 2001 From: popcornmix Date: Thu, 13 Jun 2013 16:46:54 +0100 -Subject: [PATCH 83/99] Avoid responding to unexpected I2C interrupts +Subject: [PATCH 083/102] Avoid responding to unexpected I2C interrupts --- drivers/i2c/busses/i2c-bcm2708.c | 6 ++++++ @@ -96959,7 +96959,7 @@ index edc90c0..33f4e7d 100644 From 2b64a5202b8a2de9976bea21b8b2274bd42ef958 Mon Sep 17 00:00:00 2001 From: Harm Hanemaaijer Date: Thu, 20 Jun 2013 20:21:39 +0200 -Subject: [PATCH 84/99] Speed up console framebuffer imageblit function +Subject: [PATCH 084/102] Speed up console framebuffer imageblit function Especially on platforms with a slower CPU but a relatively high framebuffer fill bandwidth, like current ARM devices, the existing @@ -97174,7 +97174,7 @@ index baed57d..ce91bf2 100644 From e61adeb1dbd2011d96b2c0be749694577232a547 Mon Sep 17 00:00:00 2001 From: Siarhei Siamashka Date: Mon, 17 Jun 2013 13:32:11 +0300 -Subject: [PATCH 85/99] fbdev: add FBIOCOPYAREA ioctl +Subject: [PATCH 085/102] fbdev: add FBIOCOPYAREA ioctl Based on the patch authored by Ali Gholami Rudi at https://lkml.org/lkml/2009/7/13/153 @@ -97273,7 +97273,7 @@ index fb795c3..fa72af0 100644 From c989cdcb64873668a5fd83cf853c0a229ee55292 Mon Sep 17 00:00:00 2001 From: Siarhei Siamashka Date: Mon, 17 Jun 2013 16:00:25 +0300 -Subject: [PATCH 86/99] bcm2708_fb: DMA acceleration for fb_copyarea +Subject: [PATCH 086/102] bcm2708_fb: DMA acceleration for fb_copyarea Based on http://www.raspberrypi.org/phpBB3/viewtopic.php?p=62425#p62425 Also used Simon's dmaer_master module as a reference for tweaking DMA @@ -97520,8 +97520,8 @@ index 08d9238..c10c5ee 100644 From d1ea37d0b0639cce0beae86bae421df4d55701ee Mon Sep 17 00:00:00 2001 From: Mike Bradley Date: Mon, 17 Jun 2013 11:31:42 -0700 -Subject: [PATCH 87/99] dwc_otg: Call usb_hcd_unlink_urb_from_ep with lock held - in completion handler +Subject: [PATCH 087/102] dwc_otg: Call usb_hcd_unlink_urb_from_ep with lock + held in completion handler usb_hcd_unlink_urb_from_ep must be called with the HCD lock held. Calling it asynchronously in the tasklet was not safe (regression in @@ -97610,7 +97610,7 @@ index 7bb133a..fef557d 100644 From 3a7b4e1205985ac992799c956d9a9e2085a43f06 Mon Sep 17 00:00:00 2001 From: Gordon Hollingworth Date: Thu, 4 Apr 2013 11:05:21 +0100 -Subject: [PATCH 88/99] USB fix using a FIQ to implement split transactions +Subject: [PATCH 088/102] USB fix using a FIQ to implement split transactions This commit adds a FIQ implementaion that schedules the split transactions using a FIQ so we don't get @@ -99032,7 +99032,7 @@ index 27061d3..9720937 100644 From ba0e64bf9cdac248ffe00961a6fa07e3fbdbdf7b Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Jul 2013 11:39:46 +0100 -Subject: [PATCH 89/99] dwc_otg: fix device attributes and avoid kernel +Subject: [PATCH 089/102] dwc_otg: fix device attributes and avoid kernel warnings on boot --- @@ -99104,7 +99104,7 @@ index 95eb7f8..9602fda 100644 From 36657f543f34a08f35d438911997ac6eab7a9bfd Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Jul 2013 13:55:00 +0100 -Subject: [PATCH 90/99] hack: fix for incorrect uart fifo size detection +Subject: [PATCH 090/102] hack: fix for incorrect uart fifo size detection --- drivers/tty/serial/amba-pl011.c | 2 +- @@ -99127,10 +99127,409 @@ index e2774f9..5254f10 100644 1.8.1.6 +From 3881972318c5363731d977d69e70c131cb15d49d Mon Sep 17 00:00:00 2001 +From: popcornmix +Date: Sat, 6 Jul 2013 15:25:50 +0100 +Subject: [PATCH 091/102] Re-enable RTL8192CU driver + +--- + arch/arm/configs/bcmrpi_defconfig | 230 +++++++------------------------------- + 1 file changed, 42 insertions(+), 188 deletions(-) + +diff --git a/arch/arm/configs/bcmrpi_defconfig b/arch/arm/configs/bcmrpi_defconfig +index c1afa47..f488d9e 100644 +--- a/arch/arm/configs/bcmrpi_defconfig ++++ b/arch/arm/configs/bcmrpi_defconfig +@@ -1,12 +1,13 @@ + # CONFIG_ARM_PATCH_PHYS_VIRT is not set +-CONFIG_EXPERIMENTAL=y + # CONFIG_LOCALVERSION_AUTO is not set + CONFIG_SYSVIPC=y + CONFIG_POSIX_MQUEUE=y +-CONFIG_BSD_PROCESS_ACCT=y +-CONFIG_BSD_PROCESS_ACCT_V3=y + CONFIG_FHANDLE=y + CONFIG_AUDIT=y ++CONFIG_NO_HZ=y ++CONFIG_HIGH_RES_TIMERS=y ++CONFIG_BSD_PROCESS_ACCT=y ++CONFIG_BSD_PROCESS_ACCT_V3=y + CONFIG_IKCONFIG=y + CONFIG_IKCONFIG_PROC=y + CONFIG_CGROUP_FREEZER=y +@@ -28,10 +29,10 @@ CONFIG_MODVERSIONS=y + CONFIG_MODULE_SRCVERSION_ALL=y + # CONFIG_BLK_DEV_BSG is not set + CONFIG_BLK_DEV_THROTTLING=y ++CONFIG_PARTITION_ADVANCED=y ++CONFIG_MAC_PARTITION=y + CONFIG_CFQ_GROUP_IOSCHED=y + CONFIG_ARCH_BCM2708=y +-CONFIG_NO_HZ=y +-CONFIG_HIGH_RES_TIMERS=y + CONFIG_AEABI=y + CONFIG_SECCOMP=y + CONFIG_CC_STACKPROTECTOR=y +@@ -98,10 +99,8 @@ CONFIG_NETFILTER_XT_TARGET_AUDIT=m + CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m + CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m + CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +-CONFIG_NETFILTER_XT_TARGET_CT=m + CONFIG_NETFILTER_XT_TARGET_DSCP=m + CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +-CONFIG_NETFILTER_XT_TARGET_LED=m + CONFIG_NETFILTER_XT_TARGET_MARK=m + CONFIG_NETFILTER_XT_TARGET_NFLOG=m + CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +@@ -167,12 +166,7 @@ CONFIG_IP_NF_MATCH_ECN=m + CONFIG_IP_NF_MATCH_TTL=m + CONFIG_IP_NF_FILTER=m + CONFIG_IP_NF_TARGET_REJECT=m +-CONFIG_IP_NF_TARGET_LOG=m + CONFIG_IP_NF_TARGET_ULOG=m +-CONFIG_NF_NAT=m +-CONFIG_IP_NF_TARGET_MASQUERADE=m +-CONFIG_IP_NF_TARGET_NETMAP=m +-CONFIG_IP_NF_TARGET_REDIRECT=m + CONFIG_IP_NF_MANGLE=m + CONFIG_IP_NF_TARGET_ECN=m + CONFIG_IP_NF_TARGET_TTL=m +@@ -191,7 +185,6 @@ CONFIG_IP6_NF_MATCH_IPV6HEADER=m + CONFIG_IP6_NF_MATCH_MH=m + CONFIG_IP6_NF_MATCH_RT=m + CONFIG_IP6_NF_TARGET_HL=m +-CONFIG_IP6_NF_TARGET_LOG=m + CONFIG_IP6_NF_FILTER=m + CONFIG_IP6_NF_TARGET_REJECT=m + CONFIG_IP6_NF_MANGLE=m +@@ -282,8 +275,6 @@ CONFIG_USB_IRDA=m + CONFIG_SIGMATEL_FIR=m + CONFIG_MCS_FIR=m + CONFIG_BT=m +-CONFIG_BT_L2CAP=y +-CONFIG_BT_SCO=y + CONFIG_BT_RFCOMM=m + CONFIG_BT_RFCOMM_TTY=y + CONFIG_BT_BNEP=m +@@ -315,7 +306,6 @@ CONFIG_BLK_DEV_DRBD=m + CONFIG_BLK_DEV_NBD=m + CONFIG_BLK_DEV_RAM=y + CONFIG_CDROM_PKTCDVD=m +-CONFIG_MISC_DEVICES=y + CONFIG_SCSI=y + # CONFIG_SCSI_PROC_FS is not set + CONFIG_BLK_DEV_SD=m +@@ -324,45 +314,16 @@ CONFIG_SCSI_MULTI_LUN=y + # CONFIG_SCSI_LOWLEVEL is not set + CONFIG_MD=y + CONFIG_NETDEVICES=y ++CONFIG_NETCONSOLE=m + CONFIG_TUN=m +-CONFIG_PHYLIB=m + CONFIG_MDIO_BITBANG=m +-CONFIG_NET_ETHERNET=y +-# CONFIG_NETDEV_1000 is not set +-# CONFIG_NETDEV_10000 is not set +-CONFIG_LIBERTAS_THINFIRM=m +-CONFIG_LIBERTAS_THINFIRM_USB=m +-CONFIG_AT76C50X_USB=m +-CONFIG_USB_ZD1201=m +-CONFIG_USB_NET_RNDIS_WLAN=m +-CONFIG_RTL8187=m +-CONFIG_MAC80211_HWSIM=m +-CONFIG_ATH_COMMON=m +-CONFIG_ATH9K=m +-CONFIG_ATH9K_HTC=m +-CONFIG_CARL9170=m +-CONFIG_B43=m +-CONFIG_B43LEGACY=m +-CONFIG_HOSTAP=m +-CONFIG_IWM=m +-CONFIG_LIBERTAS=m +-CONFIG_LIBERTAS_USB=m +-CONFIG_LIBERTAS_SDIO=m +-CONFIG_P54_COMMON=m +-CONFIG_P54_USB=m +-CONFIG_RT2X00=m +-CONFIG_RT2500USB=m +-CONFIG_RT73USB=m +-CONFIG_RT2800USB=m +-CONFIG_RT2800USB_RT53XX=y +-CONFIG_RT2800USB_UNKNOWN=y +-CONFIG_WL1251=m +-CONFIG_WL12XX_MENU=m +-CONFIG_ZD1211RW=m +-CONFIG_MWIFIEX=m +-CONFIG_MWIFIEX_SDIO=m +-CONFIG_RTL8192CU=m +-CONFIG_WIMAX_I2400M_USB=m ++CONFIG_PPP=m ++CONFIG_PPP_BSDCOMP=m ++CONFIG_PPP_DEFLATE=m ++CONFIG_PPP_ASYNC=m ++CONFIG_PPP_SYNC_TTY=m ++CONFIG_SLIP=m ++CONFIG_SLIP_COMPRESSED=y + CONFIG_USB_CATC=m + CONFIG_USB_KAWETH=m + CONFIG_USB_PEGASUS=m +@@ -389,14 +350,32 @@ CONFIG_USB_NET_INT51X1=m + CONFIG_USB_IPHETH=m + CONFIG_USB_SIERRA_NET=m + CONFIG_USB_VL600=m +-CONFIG_PPP=m +-CONFIG_PPP_ASYNC=m +-CONFIG_PPP_SYNC_TTY=m +-CONFIG_PPP_DEFLATE=m +-CONFIG_PPP_BSDCOMP=m +-CONFIG_SLIP=m +-CONFIG_SLIP_COMPRESSED=y +-CONFIG_NETCONSOLE=m ++CONFIG_LIBERTAS_THINFIRM=m ++CONFIG_LIBERTAS_THINFIRM_USB=m ++CONFIG_AT76C50X_USB=m ++CONFIG_USB_ZD1201=m ++CONFIG_USB_NET_RNDIS_WLAN=m ++CONFIG_RTL8187=m ++CONFIG_MAC80211_HWSIM=m ++CONFIG_B43=m ++CONFIG_B43LEGACY=m ++CONFIG_HOSTAP=m ++CONFIG_LIBERTAS=m ++CONFIG_LIBERTAS_USB=m ++CONFIG_LIBERTAS_SDIO=m ++CONFIG_P54_COMMON=m ++CONFIG_P54_USB=m ++CONFIG_RT2X00=m ++CONFIG_RT2500USB=m ++CONFIG_RT73USB=m ++CONFIG_RT2800USB=m ++CONFIG_RT2800USB_RT53XX=y ++CONFIG_RT2800USB_UNKNOWN=y ++CONFIG_ZD1211RW=m ++CONFIG_MWIFIEX=m ++CONFIG_MWIFIEX_SDIO=m ++CONFIG_RTL8192CU=m ++CONFIG_WIMAX_I2400M_USB=m + CONFIG_INPUT_POLLDEV=m + # CONFIG_INPUT_MOUSEDEV_PSAUX is not set + CONFIG_INPUT_JOYDEV=m +@@ -405,7 +384,6 @@ CONFIG_INPUT_EVDEV=m + # CONFIG_INPUT_MOUSE is not set + CONFIG_INPUT_MISC=y + CONFIG_INPUT_AD714X=m +-CONFIG_INPUT_ATI_REMOTE=m + CONFIG_INPUT_ATI_REMOTE2=m + CONFIG_INPUT_KEYSPAN_REMOTE=m + CONFIG_INPUT_POWERMATE=m +@@ -440,115 +418,6 @@ CONFIG_THERMAL_BCM2835=y + CONFIG_WATCHDOG=y + CONFIG_BCM2708_WDT=m + CONFIG_MEDIA_SUPPORT=m +-CONFIG_VIDEO_DEV=m +-CONFIG_DVB_CORE=m +-CONFIG_RC_ATI_REMOTE=m +-CONFIG_IR_IMON=m +-CONFIG_IR_MCEUSB=m +-CONFIG_IR_REDRAT3=m +-CONFIG_IR_STREAMZAP=m +-CONFIG_RC_LOOPBACK=m +-CONFIG_MEDIA_ATTACH=y +-CONFIG_USB_VIDEO_CLASS=m +-CONFIG_USB_M5602=m +-CONFIG_USB_STV06XX=m +-CONFIG_USB_GL860=m +-CONFIG_USB_GSPCA_BENQ=m +-CONFIG_USB_GSPCA_CONEX=m +-CONFIG_USB_GSPCA_CPIA1=m +-CONFIG_USB_GSPCA_ETOMS=m +-CONFIG_USB_GSPCA_FINEPIX=m +-CONFIG_USB_GSPCA_JEILINJ=m +-CONFIG_USB_GSPCA_KINECT=m +-CONFIG_USB_GSPCA_KONICA=m +-CONFIG_USB_GSPCA_MARS=m +-CONFIG_USB_GSPCA_MR97310A=m +-CONFIG_USB_GSPCA_NW80X=m +-CONFIG_USB_GSPCA_OV519=m +-CONFIG_USB_GSPCA_OV534=m +-CONFIG_USB_GSPCA_OV534_9=m +-CONFIG_USB_GSPCA_PAC207=m +-CONFIG_USB_GSPCA_PAC7302=m +-CONFIG_USB_GSPCA_PAC7311=m +-CONFIG_USB_GSPCA_SE401=m +-CONFIG_USB_GSPCA_SN9C2028=m +-CONFIG_USB_GSPCA_SN9C20X=m +-CONFIG_USB_GSPCA_SONIXB=m +-CONFIG_USB_GSPCA_SONIXJ=m +-CONFIG_USB_GSPCA_SPCA500=m +-CONFIG_USB_GSPCA_SPCA501=m +-CONFIG_USB_GSPCA_SPCA505=m +-CONFIG_USB_GSPCA_SPCA506=m +-CONFIG_USB_GSPCA_SPCA508=m +-CONFIG_USB_GSPCA_SPCA561=m +-CONFIG_USB_GSPCA_SPCA1528=m +-CONFIG_USB_GSPCA_SQ905=m +-CONFIG_USB_GSPCA_SQ905C=m +-CONFIG_USB_GSPCA_SQ930X=m +-CONFIG_USB_GSPCA_STK014=m +-CONFIG_USB_GSPCA_STV0680=m +-CONFIG_USB_GSPCA_SUNPLUS=m +-CONFIG_USB_GSPCA_T613=m +-CONFIG_USB_GSPCA_TV8532=m +-CONFIG_USB_GSPCA_VC032X=m +-CONFIG_USB_GSPCA_VICAM=m +-CONFIG_USB_GSPCA_XIRLINK_CIT=m +-CONFIG_USB_GSPCA_ZC3XX=m +-CONFIG_VIDEO_PVRUSB2=m +-CONFIG_VIDEO_HDPVR=m +-CONFIG_VIDEO_EM28XX=m +-CONFIG_VIDEO_EM28XX_ALSA=m +-CONFIG_VIDEO_EM28XX_DVB=m +-CONFIG_VIDEO_TLG2300=m +-CONFIG_VIDEO_CX231XX=m +-CONFIG_VIDEO_CX231XX_ALSA=m +-CONFIG_VIDEO_CX231XX_DVB=m +-CONFIG_VIDEO_USBVISION=m +-CONFIG_USB_ET61X251=m +-CONFIG_USB_SN9C102=m +-CONFIG_USB_PWC=m +-CONFIG_USB_ZR364XX=m +-CONFIG_USB_STKWEBCAM=m +-CONFIG_USB_S2255=m +-CONFIG_USB_DSBR=m +-CONFIG_RADIO_SI470X=y +-CONFIG_USB_SI470X=m +-CONFIG_USB_MR800=m +-CONFIG_DVB_USB=m +-CONFIG_DVB_USB_A800=m +-CONFIG_DVB_USB_DIBUSB_MB=m +-CONFIG_DVB_USB_DIBUSB_MC=m +-CONFIG_DVB_USB_DIB0700=m +-CONFIG_DVB_USB_UMT_010=m +-CONFIG_DVB_USB_CXUSB=m +-CONFIG_DVB_USB_M920X=m +-CONFIG_DVB_USB_GL861=m +-CONFIG_DVB_USB_AU6610=m +-CONFIG_DVB_USB_DIGITV=m +-CONFIG_DVB_USB_VP7045=m +-CONFIG_DVB_USB_VP702X=m +-CONFIG_DVB_USB_GP8PSK=m +-CONFIG_DVB_USB_NOVA_T_USB2=m +-CONFIG_DVB_USB_TTUSB2=m +-CONFIG_DVB_USB_DTT200U=m +-CONFIG_DVB_USB_OPERA1=m +-CONFIG_DVB_USB_AF9005=m +-CONFIG_DVB_USB_AF9005_REMOTE=m +-CONFIG_DVB_USB_DW2102=m +-CONFIG_DVB_USB_CINERGY_T2=m +-CONFIG_DVB_USB_ANYSEE=m +-CONFIG_DVB_USB_DTV5100=m +-CONFIG_DVB_USB_AF9015=m +-CONFIG_DVB_USB_CE6230=m +-CONFIG_DVB_USB_FRIIO=m +-CONFIG_DVB_USB_EC168=m +-CONFIG_DVB_USB_AZ6027=m +-CONFIG_DVB_USB_LME2510=m +-CONFIG_DVB_USB_TECHNISAT_USB2=m +-CONFIG_SMS_SIANO_MDTV=m +-CONFIG_SMS_USB_DRV=m +-CONFIG_DVB_B2C2_FLEXCOP=m +-CONFIG_DVB_B2C2_FLEXCOP_USB=m + CONFIG_FB=y + CONFIG_FB_BCM2708=y + CONFIG_FRAMEBUFFER_CONSOLE=y +@@ -575,8 +444,6 @@ CONFIG_SND_USB_UA101=m + CONFIG_SND_USB_CAIAQ=m + CONFIG_SND_USB_6FIRE=m + CONFIG_SOUND_PRIME=m +-CONFIG_HID_PID=y +-CONFIG_USB_HIDDEV=y + CONFIG_HID_A4TECH=m + CONFIG_HID_ACRUX=m + CONFIG_HID_APPLE=m +@@ -607,7 +474,6 @@ CONFIG_HID_ORTEK=m + CONFIG_HID_PANTHERLORD=m + CONFIG_HID_PETALYNX=m + CONFIG_HID_PICOLCD=m +-CONFIG_HID_QUANTA=m + CONFIG_HID_ROCCAT=m + CONFIG_HID_SAMSUNG=m + CONFIG_HID_SONY=m +@@ -617,10 +483,10 @@ CONFIG_HID_GREENASIA=m + CONFIG_HID_SMARTJOYPLUS=m + CONFIG_HID_TOPSEED=m + CONFIG_HID_THRUSTMASTER=m +-CONFIG_HID_WACOM=m +-CONFIG_HID_WIIMOTE=m + CONFIG_HID_ZEROPLUS=m + CONFIG_HID_ZYDACRON=m ++CONFIG_HID_PID=y ++CONFIG_USB_HIDDEV=y + CONFIG_USB=y + CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + CONFIG_USB_MON=m +@@ -639,8 +505,6 @@ CONFIG_USB_STORAGE_ONETOUCH=m + CONFIG_USB_STORAGE_KARMA=m + CONFIG_USB_STORAGE_CYPRESS_ATACB=m + CONFIG_USB_STORAGE_ENE_UB6250=m +-CONFIG_USB_UAS=m +-CONFIG_USB_LIBUSUAL=y + CONFIG_USB_MDC800=m + CONFIG_USB_MICROTEK=m + CONFIG_USB_SERIAL=m +@@ -717,10 +581,6 @@ CONFIG_MMC_SDHCI=y + CONFIG_MMC_SDHCI_PLTFM=y + CONFIG_MMC_SDHCI_BCM2708=y + CONFIG_MMC_SDHCI_BCM2708_DMA=y +-CONFIG_LEDS_GPIO=y +-CONFIG_LEDS_TRIGGER_TIMER=m +-CONFIG_LEDS_TRIGGER_HEARTBEAT=m +-CONFIG_LEDS_TRIGGER_DEFAULT_ON=m + CONFIG_RTC_CLASS=y + CONFIG_RTC_DRV_DS1307=m + CONFIG_RTC_DRV_DS1374=m +@@ -798,7 +658,6 @@ CONFIG_SQUASHFS_XATTR=y + CONFIG_SQUASHFS_LZO=y + CONFIG_SQUASHFS_XZ=y + CONFIG_NFS_FS=y +-CONFIG_NFS_V3=y + CONFIG_NFS_V3_ACL=y + CONFIG_NFS_V4=y + CONFIG_ROOT_NFS=y +@@ -812,9 +671,6 @@ CONFIG_CIFS_XATTR=y + CONFIG_CIFS_POSIX=y + CONFIG_9P_FS=m + CONFIG_9P_FS_POSIX_ACL=y +-CONFIG_PARTITION_ADVANCED=y +-CONFIG_MAC_PARTITION=y +-CONFIG_EFI_PARTITION=y + CONFIG_NLS_DEFAULT="utf8" + CONFIG_NLS_CODEPAGE_437=y + CONFIG_NLS_CODEPAGE_737=m +@@ -862,7 +718,6 @@ CONFIG_DEBUG_INFO=y + CONFIG_DEBUG_MEMORY_INIT=y + CONFIG_BOOT_PRINTK_DELAY=y + CONFIG_LATENCYTOP=y +-CONFIG_SYSCTL_SYSCALL_CHECK=y + CONFIG_IRQSOFF_TRACER=y + CONFIG_SCHED_TRACER=y + CONFIG_STACK_TRACER=y +@@ -878,7 +733,6 @@ CONFIG_CRYPTO_HMAC=y + CONFIG_CRYPTO_XCBC=m + CONFIG_CRYPTO_MD5=y + CONFIG_CRYPTO_SHA1=y +-CONFIG_CRYPTO_SHA256=m + CONFIG_CRYPTO_SHA512=m + CONFIG_CRYPTO_TGR192=m + CONFIG_CRYPTO_WP512=m +-- +1.8.1.6 + + From 894b002d9f89d5e68ef2b28fb190b4a983096ec7 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 10 Jul 2013 23:53:31 +0100 -Subject: [PATCH 93/99] sdhci-bcm2807: Increase sync_after_dma timeout +Subject: [PATCH 093/102] sdhci-bcm2807: Increase sync_after_dma timeout The current timeout is being hit with some cards that complete successfully with a longer timeout. The timeout is not handled well, and is believed to be a code path that causes corruption. @@ -99159,7 +99558,7 @@ index c2409b9..4770680 100644 From 7d1ed3501217a5c3d40fbdf2d8168ceca2517c54 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Mon, 15 Jul 2013 23:55:52 +0100 -Subject: [PATCH 94/99] dcw_otg: avoid logging function that can cause panics +Subject: [PATCH 094/102] dcw_otg: avoid logging function that can cause panics See: https://github.com/raspberrypi/firmware/issues/21 Thanks to cleverca22 for fix @@ -99187,7 +99586,7 @@ index 9602fda..c6966af 100644 From 2b902d2bcd1ae9e5801a24615aaaa9129680a639 Mon Sep 17 00:00:00 2001 From: P33M Date: Sat, 13 Jul 2013 20:41:26 +0100 -Subject: [PATCH 95/99] dwc_otg: mask correct interrupts after transaction +Subject: [PATCH 095/102] dwc_otg: mask correct interrupts after transaction error recovery The dwc_otg driver will unmask certain interrupts on a transaction @@ -99257,7 +99656,7 @@ index e8b4d35..27b673f 100644 From 07ce82f9461cb966d2ee549bcd44e59d4019bf5e Mon Sep 17 00:00:00 2001 From: P33M Date: Sat, 13 Jul 2013 21:48:41 +0100 -Subject: [PATCH 96/99] dwc_otg: fiq: prevent FIQ thrash and incorrect state +Subject: [PATCH 096/102] dwc_otg: fiq: prevent FIQ thrash and incorrect state passing to IRQ In the case of a transaction to a device that had previously aborted @@ -99317,7 +99716,7 @@ index 27b673f..d655363 100644 From 2538878c1c3ec2da6d3cbf13d3e2820b06ce5ac5 Mon Sep 17 00:00:00 2001 From: Gordon Hollingworth Date: Mon, 8 Jul 2013 04:12:19 +0100 -Subject: [PATCH 97/99] Fix function tracing +Subject: [PATCH 097/102] Fix function tracing --- drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c | 12 ++++++------ @@ -99385,7 +99784,7 @@ index d655363..765451b 100644 From 3199ec63629973afe0dc99a9f11cf83b0f0a3c12 Mon Sep 17 00:00:00 2001 From: P33M Date: Thu, 18 Jul 2013 16:32:41 +0100 -Subject: [PATCH 98/99] dwc_otg: whitespace cleanup in dwc_otg_urb_enqueue +Subject: [PATCH 098/102] dwc_otg: whitespace cleanup in dwc_otg_urb_enqueue --- drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c | 59 ++++++++++++++-------------- @@ -99479,7 +99878,7 @@ index 0d6f5f4..0f72bd5 100644 From b04d3b18742ce3a66b166c4bd7dabce67950c0ec Mon Sep 17 00:00:00 2001 From: P33M Date: Thu, 18 Jul 2013 17:07:26 +0100 -Subject: [PATCH 99/99] dwc_otg: prevent OOPSes during device disconnects +Subject: [PATCH 099/102] dwc_otg: prevent OOPSes during device disconnects The dwc_otg_urb_enqueue function is thread-unsafe. In particular the access of urb->hcpriv, usb_hcd_link_urb_to_ep, dwc_otg_urb->qtd and @@ -99619,3 +100018,184 @@ index 8125307..5aed416 100644 -- 1.8.1.6 + +From 2fa6869094ea6b6a84a7b4e1cd20cb0c2f823f8b Mon Sep 17 00:00:00 2001 +From: Alexander Kolesen +Date: Mon, 22 Jul 2013 15:23:32 +0300 +Subject: [PATCH 100/102] bcm_vc_cma: create_proc_entry replaced by proc_create + +Commit 80e928f7 kills create_proc_entry, so need to get rid if it and replace by proc_create + +drivers/char/broadcom/vc_cma/vc_cma.c: In function 'vc_cma_init': +drivers/char/broadcom/vc_cma/vc_cma.c:1088:2: error: implicit declaration of function 'create_proc_entry' [-Werror=implicit-function-declaration] +drivers/char/broadcom/vc_cma/vc_cma.c:1088:20: error: assignment makes pointer from integer without a cast [-Werror] +drivers/char/broadcom/vc_cma/vc_cma.c:1095:19: error: dereferencing pointer to incomplete type +drivers/char/broadcom/vc_cma/vc_cma.c: In function 'vc_cma_exit': +drivers/char/broadcom/vc_cma/vc_cma.c:1134:38: error: dereferencing pointer to incomplete type +cc1: all warnings being treated as errors +distcc[13074] ERROR: compile drivers/char/broadcom/vc_cma/vc_cma.c on localhost failed +make[4]: *** [drivers/char/broadcom/vc_cma/vc_cma.o] Error 1 +make[3]: *** [drivers/char/broadcom/vc_cma] Error 2 +make[2]: *** [drivers/char/broadcom] Error 2 +make[1]: *** [drivers/char] Error 2 +make: *** [drivers] Error 2 +--- + drivers/char/broadcom/vc_cma/vc_cma.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +diff --git a/drivers/char/broadcom/vc_cma/vc_cma.c b/drivers/char/broadcom/vc_cma/vc_cma.c +index 6d8b4df..fe80887 100644 +--- a/drivers/char/broadcom/vc_cma/vc_cma.c ++++ b/drivers/char/broadcom/vc_cma/vc_cma.c +@@ -1085,15 +1085,13 @@ static int vc_cma_init(void) + goto out_class_destroy; + } + +- vc_cma_proc_entry = create_proc_entry(DRIVER_NAME, 0444, NULL); ++ vc_cma_proc_entry = proc_create(DRIVER_NAME, 0444, NULL, &vc_cma_proc_fops); + if (vc_cma_proc_entry == NULL) { + rc = -EFAULT; +- LOG_ERR("%s: create_proc_entry failed", __func__); ++ LOG_ERR("%s: proc_create failed", __func__); + goto out_device_destroy; + } +- +- vc_cma_proc_entry->proc_fops = &vc_cma_proc_fops; +- ++ + vc_cma_inited = 1; + return 0; + +@@ -1131,7 +1129,7 @@ static void __exit vc_cma_exit(void) + LOG_DBG("%s: called", __func__); + + if (vc_cma_inited) { +- remove_proc_entry(vc_cma_proc_entry->name, NULL); ++ remove_proc_entry(DRIVER_NAME, NULL); + device_destroy(vc_cma_class, vc_cma_devnum); + class_destroy(vc_cma_class); + cdev_del(&vc_cma_cdev); +-- +1.8.1.6 + + +From 66b432c09a26d3952d3ed847aa8924f3b8178cc8 Mon Sep 17 00:00:00 2001 +From: P33M +Date: Mon, 22 Jul 2013 14:08:26 +0100 +Subject: [PATCH 101/102] dwc_otg: prevent BUG() in TT allocation if hub + address is > 16 + +A fixed-size array is used to track TT allocation. This was +previously set to 16 which caused a crash because +dwc_otg_hcd_allocate_port would read past the end of the array. + +This was hit if a hub was plugged in which enumerated as addr > 16, +due to previous device resets or unplugs. + +Also add #ifdef FIQ_DEBUG around hcd->hub_port_alloc[], which grows +to a large size if 128 hub addresses are supported. This field is +for debug only for tracking which frame an allocate happened in. +--- + drivers/usb/host/dwc_otg/dwc_otg_hcd.c | 7 ++++++- + drivers/usb/host/dwc_otg/dwc_otg_hcd.h | 6 ++++-- + drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c | 3 ++- + 3 files changed, 12 insertions(+), 4 deletions(-) + +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c +index a1970dc..3c619b4 100644 +--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c +@@ -983,7 +983,9 @@ int dwc_otg_hcd_init(dwc_otg_hcd_t * hcd, dwc_otg_core_if_t * core_if) + hcd->periodic_qh_count = 0; + + DWC_MEMSET(hcd->hub_port, 0, sizeof(hcd->hub_port)); ++#ifdef FIQ_DEBUG + DWC_MEMSET(hcd->hub_port_alloc, -1, sizeof(hcd->hub_port_alloc)); ++#endif + + out: + return retval; +@@ -1317,7 +1319,9 @@ int dwc_otg_hcd_allocate_port(dwc_otg_hcd_t * hcd, dwc_otg_qh_t *qh) + qh->skip_count = 0; + hcd->hub_port[hub_addr] |= 1 << port_addr; + fiq_print(FIQDBG_PORTHUB, "H%dP%d:A %d", hub_addr, port_addr, DWC_CIRCLEQ_FIRST(&qh->qtd_list)->urb->pipe_info.ep_num); ++#ifdef FIQ_DEBUG + hcd->hub_port_alloc[hub_addr * 16 + port_addr] = dwc_otg_hcd_get_frame_number(hcd); ++#endif + return 0; + } + } +@@ -1331,8 +1335,9 @@ void dwc_otg_hcd_release_port(dwc_otg_hcd_t * hcd, dwc_otg_qh_t *qh) + hcd->fops->hub_info(hcd, DWC_CIRCLEQ_FIRST(&qh->qtd_list)->urb->priv, &hub_addr, &port_addr); + + hcd->hub_port[hub_addr] &= ~(1 << port_addr); ++#ifdef FIQ_DEBUG + hcd->hub_port_alloc[hub_addr * 16 + port_addr] = -1; +- ++#endif + fiq_print(FIQDBG_PORTHUB, "H%dP%d:RO%d", hub_addr, port_addr, DWC_CIRCLEQ_FIRST(&qh->qtd_list)->urb->pipe_info.ep_num); + + } +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd.h b/drivers/usb/host/dwc_otg/dwc_otg_hcd.h +index d3d6e997..80a3af2 100644 +--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.h ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.h +@@ -577,8 +577,10 @@ struct dwc_otg_hcd { + uint32_t *frame_list; + + /** Hub - Port assignment */ +- int hub_port[16]; +- int hub_port_alloc[256]; ++ int hub_port[128]; ++#ifdef FIQ_DEBUG ++ int hub_port_alloc[2048]; ++#endif + + /** Frame List DMA address */ + dma_addr_t frame_list_dma; +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c +index 765451b..dbff763 100644 +--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c +@@ -1419,8 +1419,9 @@ static void release_channel(dwc_otg_hcd_t * hcd, + } + + hcd->hub_port[hc->hub_addr] &= ~(1 << hc->port_addr); ++#ifdef FIQ_DEBUG + hcd->hub_port_alloc[hc->hub_addr * 16 + hc->port_addr] = -1; +- ++#endif + fiq_print(FIQDBG_PORTHUB, "H%dP%d:RR%d", hc->hub_addr, hc->port_addr, endp); + } + +-- +1.8.1.6 + + +From 0e20c990dd161db77006bb77bb75335a5e55e6a8 Mon Sep 17 00:00:00 2001 +From: popcornmix +Date: Tue, 23 Jul 2013 12:29:27 +0100 +Subject: [PATCH 102/102] config: Add back in CONFIG_TASKSTATS + +--- + arch/arm/configs/bcmrpi_defconfig | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/arch/arm/configs/bcmrpi_defconfig b/arch/arm/configs/bcmrpi_defconfig +index f488d9e..194c0d6 100644 +--- a/arch/arm/configs/bcmrpi_defconfig ++++ b/arch/arm/configs/bcmrpi_defconfig +@@ -8,6 +8,10 @@ CONFIG_NO_HZ=y + CONFIG_HIGH_RES_TIMERS=y + CONFIG_BSD_PROCESS_ACCT=y + CONFIG_BSD_PROCESS_ACCT_V3=y ++CONFIG_TASKSTATS=y ++CONFIG_TASK_DELAY_ACCT=y ++CONFIG_TASK_XACCT=y ++CONFIG_TASK_IO_ACCOUNTING=y + CONFIG_IKCONFIG=y + CONFIG_IKCONFIG_PROC=y + CONFIG_CGROUP_FREEZER=y +-- +1.8.1.6 + From 45b61d6b7600abca7693b4a2d6e29c985fa992a2 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 27 Jul 2013 01:59:22 +0200 Subject: [PATCH 005/103] libdrm: update to libdrm-2.4.46 Signed-off-by: Stephan Raue --- packages/graphics/libdrm/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphics/libdrm/meta b/packages/graphics/libdrm/meta index abd352431d..c09fa43a37 100644 --- a/packages/graphics/libdrm/meta +++ b/packages/graphics/libdrm/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="libdrm" -PKG_VERSION="2.4.45" +PKG_VERSION="2.4.46" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" From 845fbe941d97f3ce255e81ef1d991d1c2da0798b Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 27 Jul 2013 02:00:28 +0200 Subject: [PATCH 006/103] Mesa: fix install of llvm Signed-off-by: Stephan Raue --- packages/graphics/Mesa/package.mk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/graphics/Mesa/package.mk b/packages/graphics/Mesa/package.mk index cd44f5da08..472c8a1d98 100644 --- a/packages/graphics/Mesa/package.mk +++ b/packages/graphics/Mesa/package.mk @@ -35,6 +35,9 @@ PKG_LONGDESC="Mesa is a 3-D graphics library with an API which is very similar t PKG_IS_ADDON="no" PKG_AUTORECONF="yes" +# configure GPU drivers and dependencies: + get_graphicdrivers + if [ "$LLVM_SUPPORT" = "yes" ]; then PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET llvm" PKG_DEPENDS="$PKG_DEPENDS llvm" @@ -57,8 +60,6 @@ if [ "$MESA_VAAPI_SUPPORT" = "yes" ]; then PKG_DEPENDS="$PKG_DEPENDS libva" fi -get_graphicdrivers - XA_CONFIG="--disable-xa" for drv in $GRAPHIC_DRIVERS; do [ "$drv" = "vmware" ] && XA_CONFIG="--enable-xa" From effa3c2f5d30ab786ccd5fa53e885a9f83852708 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 27 Jul 2013 02:02:38 +0200 Subject: [PATCH 007/103] linux: add and update new radeon firmwares Signed-off-by: Stephan Raue --- packages/linux/firmware/radeon/ARUBA_rlc.bin | Bin 6144 -> 6144 bytes packages/linux/firmware/radeon/BARTS_smc.bin | Bin 0 -> 24840 bytes packages/linux/firmware/radeon/BONAIRE_ce.bin | Bin 0 -> 8576 bytes packages/linux/firmware/radeon/BONAIRE_mc.bin | Bin 0 -> 31464 bytes packages/linux/firmware/radeon/BONAIRE_me.bin | Bin 0 -> 8576 bytes .../linux/firmware/radeon/BONAIRE_mec.bin | Bin 0 -> 16768 bytes .../linux/firmware/radeon/BONAIRE_pfp.bin | Bin 0 -> 8576 bytes .../linux/firmware/radeon/BONAIRE_rlc.bin | Bin 0 -> 8192 bytes .../linux/firmware/radeon/BONAIRE_sdma.bin | Bin 0 -> 4200 bytes .../linux/firmware/radeon/BONAIRE_uvd.bin | Bin 0 -> 224408 bytes packages/linux/firmware/radeon/BTC_rlc.bin | Bin 3072 -> 3072 bytes packages/linux/firmware/radeon/CAICOS_smc.bin | Bin 0 -> 24512 bytes packages/linux/firmware/radeon/CAYMAN_rlc.bin | Bin 4096 -> 4096 bytes packages/linux/firmware/radeon/CAYMAN_smc.bin | Bin 0 -> 31212 bytes packages/linux/firmware/radeon/CEDAR_rlc.bin | Bin 3072 -> 3072 bytes packages/linux/firmware/radeon/CEDAR_smc.bin | Bin 0 -> 23888 bytes .../linux/firmware/radeon/CYPRESS_rlc.bin | Bin 3072 -> 3072 bytes .../linux/firmware/radeon/CYPRESS_smc.bin | Bin 0 -> 25080 bytes .../linux/firmware/radeon/CYPRESS_uvd.bin | Bin 0 -> 115736 bytes packages/linux/firmware/radeon/HAINAN_ce.bin | Bin 0 -> 8576 bytes packages/linux/firmware/radeon/HAINAN_mc.bin | Bin 0 -> 31452 bytes packages/linux/firmware/radeon/HAINAN_me.bin | Bin 0 -> 8576 bytes packages/linux/firmware/radeon/HAINAN_pfp.bin | Bin 0 -> 8576 bytes packages/linux/firmware/radeon/HAINAN_rlc.bin | Bin 0 -> 8192 bytes packages/linux/firmware/radeon/HAINAN_smc.bin | Bin 0 -> 59004 bytes .../linux/firmware/radeon/JUNIPER_rlc.bin | Bin 3072 -> 3072 bytes .../linux/firmware/radeon/JUNIPER_smc.bin | Bin 0 -> 24352 bytes packages/linux/firmware/radeon/KABINI_ce.bin | Bin 0 -> 8576 bytes packages/linux/firmware/radeon/KABINI_me.bin | Bin 0 -> 8576 bytes packages/linux/firmware/radeon/KABINI_mec.bin | Bin 0 -> 16768 bytes packages/linux/firmware/radeon/KABINI_pfp.bin | Bin 0 -> 8576 bytes packages/linux/firmware/radeon/KABINI_rlc.bin | Bin 0 -> 10240 bytes .../linux/firmware/radeon/KABINI_sdma.bin | Bin 0 -> 4200 bytes .../{LICENSE.radeon_rlc => LICENSE.radeon} | 2 +- packages/linux/firmware/radeon/OLAND_ce.bin | Bin 0 -> 8576 bytes packages/linux/firmware/radeon/OLAND_mc.bin | Bin 0 -> 31452 bytes packages/linux/firmware/radeon/OLAND_me.bin | Bin 0 -> 8576 bytes packages/linux/firmware/radeon/OLAND_pfp.bin | Bin 0 -> 8576 bytes packages/linux/firmware/radeon/OLAND_rlc.bin | Bin 0 -> 8192 bytes packages/linux/firmware/radeon/OLAND_smc.bin | Bin 0 -> 59316 bytes .../linux/firmware/radeon/PITCAIRN_rlc.bin | Bin 8192 -> 8192 bytes .../linux/firmware/radeon/PITCAIRN_smc.bin | Bin 0 -> 59892 bytes packages/linux/firmware/radeon/R700_rlc.bin | Bin 4096 -> 4096 bytes .../linux/firmware/radeon/REDWOOD_rlc.bin | Bin 3072 -> 3072 bytes .../linux/firmware/radeon/REDWOOD_smc.bin | Bin 0 -> 24332 bytes packages/linux/firmware/radeon/RV710_smc.bin | Bin 0 -> 16160 bytes packages/linux/firmware/radeon/RV710_uvd.bin | Bin 0 -> 116120 bytes packages/linux/firmware/radeon/RV730_smc.bin | Bin 0 -> 16684 bytes packages/linux/firmware/radeon/RV740_smc.bin | Bin 0 -> 16840 bytes packages/linux/firmware/radeon/RV770_smc.bin | Bin 0 -> 16656 bytes packages/linux/firmware/radeon/SUMO_rlc.bin | Bin 3072 -> 3072 bytes packages/linux/firmware/radeon/SUMO_uvd.bin | Bin 0 -> 205080 bytes packages/linux/firmware/radeon/TAHITI_rlc.bin | Bin 8192 -> 8192 bytes packages/linux/firmware/radeon/TAHITI_smc.bin | Bin 0 -> 62552 bytes packages/linux/firmware/radeon/TAHITI_uvd.bin | Bin 0 -> 219672 bytes packages/linux/firmware/radeon/TURKS_smc.bin | Bin 0 -> 24668 bytes packages/linux/firmware/radeon/VERDE_rlc.bin | Bin 8192 -> 8192 bytes packages/linux/firmware/radeon/VERDE_smc.bin | Bin 0 -> 60388 bytes projects/Generic_OSS/linux/linux.i386.conf | 2 +- 59 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 packages/linux/firmware/radeon/BARTS_smc.bin create mode 100644 packages/linux/firmware/radeon/BONAIRE_ce.bin create mode 100644 packages/linux/firmware/radeon/BONAIRE_mc.bin create mode 100644 packages/linux/firmware/radeon/BONAIRE_me.bin create mode 100644 packages/linux/firmware/radeon/BONAIRE_mec.bin create mode 100644 packages/linux/firmware/radeon/BONAIRE_pfp.bin create mode 100644 packages/linux/firmware/radeon/BONAIRE_rlc.bin create mode 100644 packages/linux/firmware/radeon/BONAIRE_sdma.bin create mode 100644 packages/linux/firmware/radeon/BONAIRE_uvd.bin create mode 100644 packages/linux/firmware/radeon/CAICOS_smc.bin create mode 100644 packages/linux/firmware/radeon/CAYMAN_smc.bin create mode 100644 packages/linux/firmware/radeon/CEDAR_smc.bin create mode 100644 packages/linux/firmware/radeon/CYPRESS_smc.bin create mode 100644 packages/linux/firmware/radeon/CYPRESS_uvd.bin create mode 100644 packages/linux/firmware/radeon/HAINAN_ce.bin create mode 100644 packages/linux/firmware/radeon/HAINAN_mc.bin create mode 100644 packages/linux/firmware/radeon/HAINAN_me.bin create mode 100644 packages/linux/firmware/radeon/HAINAN_pfp.bin create mode 100644 packages/linux/firmware/radeon/HAINAN_rlc.bin create mode 100644 packages/linux/firmware/radeon/HAINAN_smc.bin create mode 100644 packages/linux/firmware/radeon/JUNIPER_smc.bin create mode 100644 packages/linux/firmware/radeon/KABINI_ce.bin create mode 100644 packages/linux/firmware/radeon/KABINI_me.bin create mode 100644 packages/linux/firmware/radeon/KABINI_mec.bin create mode 100644 packages/linux/firmware/radeon/KABINI_pfp.bin create mode 100644 packages/linux/firmware/radeon/KABINI_rlc.bin create mode 100644 packages/linux/firmware/radeon/KABINI_sdma.bin rename packages/linux/firmware/radeon/{LICENSE.radeon_rlc => LICENSE.radeon} (97%) create mode 100644 packages/linux/firmware/radeon/OLAND_ce.bin create mode 100644 packages/linux/firmware/radeon/OLAND_mc.bin create mode 100644 packages/linux/firmware/radeon/OLAND_me.bin create mode 100644 packages/linux/firmware/radeon/OLAND_pfp.bin create mode 100644 packages/linux/firmware/radeon/OLAND_rlc.bin create mode 100644 packages/linux/firmware/radeon/OLAND_smc.bin create mode 100644 packages/linux/firmware/radeon/PITCAIRN_smc.bin create mode 100644 packages/linux/firmware/radeon/REDWOOD_smc.bin create mode 100644 packages/linux/firmware/radeon/RV710_smc.bin create mode 100644 packages/linux/firmware/radeon/RV710_uvd.bin create mode 100644 packages/linux/firmware/radeon/RV730_smc.bin create mode 100644 packages/linux/firmware/radeon/RV740_smc.bin create mode 100644 packages/linux/firmware/radeon/RV770_smc.bin create mode 100644 packages/linux/firmware/radeon/SUMO_uvd.bin create mode 100644 packages/linux/firmware/radeon/TAHITI_smc.bin create mode 100644 packages/linux/firmware/radeon/TAHITI_uvd.bin create mode 100644 packages/linux/firmware/radeon/TURKS_smc.bin create mode 100644 packages/linux/firmware/radeon/VERDE_smc.bin diff --git a/packages/linux/firmware/radeon/ARUBA_rlc.bin b/packages/linux/firmware/radeon/ARUBA_rlc.bin index dc133c4338506d37caf461f2caa08ecbdfb86738..3582fe6c493bc746f37cde2f48fed6ab177195c1 100644 GIT binary patch delta 2837 zcmZ`*YiwM_6+ScfdVRfK+v{g+$B*mSfyJ?tZAxGPuUL|_SYV_g+CWi7BdaZ`gev-r z0$w~VrdU-#Nygr+oq%XDC@oS@N`?F*l_zR{+{nAO+qx-85g=4rsjWmxLj{WM+wa`# zbvKo|l07qL=FE9~-#K$tQYDY|OMC73!2YN;MffSAj9#nQd2fQOoU$KhSy54K|55Q# z-dKNg9TJ%T*>mMxV;`7E-q`IdD=4xQ$yq)>$^Y;(4$%b3N42SK8?Q>=;?<;Yoig&5 zyyw-YQ(klWHm@^%yVsMx!`qqOXP=?u(ht)=DqKiETNLSu;$7+IiWky9UJ~i&~8{?z+DC9*q7RDG3%U7*Aa`PYJbPf)5NPMK`fkavk}(?PcPAvKMAf1$pm zs2ExLo)~coWIK~&NB==~)nyVh#{Z0!i&1g75Eb8o;kyycRhE^4QDnbjlH!7wpo*Ll z3EtztIXMMI6{X+{N**Zb;Jo4a@;TBEG~JglF^ZTtiLn*afRUz*|0nn&3URqd5uJqN zVuI)$eWj+WMSL>Wq$&$WcH^(dbLgoF5})Y4+WwgJG%nrrOutvLL$6iu-fIt5&XZU? zMih)dbAqgf=ou2T%KtYjOpv``oSs({(r*%E>$!%TQ{E~O5-1`riOz?}&mLC|*_V_x zHlymN747SM$fxE!Ic4%X$oJ@xMpqw+)QS(W~6VJsHs5lv42uzn*6=xa&Le- zW{p2MHfSnge~tG%M~W#$ImEVy)9A(I;MfaPKTTv|6rj`*)9m~Dorc|y_`l&0p!&Jn zL>ZtUa>{4X77AXBdVmDfLK@=QgI}2>2Wdl6iDry-9*7|g75BL@7Rtxm6ws!QIGAe@)*u)+<=w%HGS-;oVAw`W|YurCBf5E+Bf@q%4BNf6V ztvuGZRDGop|r~C|Xc&2`ctv8MTR2poCE+${z_dz&0LHTLCNMpHUY)dK~8^ zd&x9G_1Js{*$A-MtU+{9iAaOG#9jzI?vA28RC+1>6VWQgoIV^&=+*jfjL#UV_L7w8 zO_E&3gN1mWg%yis-AQYmW#|G!$kCzAbD8j*{55;Od2XTn9B>m{BLzgpodX`e!QBIt z8a}BuE_o@rAJk&+tJr<$qNa^#*6C>dA$x(BrD(i9nVHROoMK%>W1xEgcdzrA?1&L) zZsc{))6JJDp6%p@w*jsN`miqtgIYy#=*Jp|0ai!=lXTI_s9URw7KtHW(V^W)yIlJ~ z4@KG|R{rjJwDiN3ZFe3mbr%2IHn&+k1;zWzJB$C#aybJ2Ij?cKDjK;<4^m1G0o?;5 zBwk~ki-jO4+=GB)J#Txz16K-_)%U-|lIz0^JvfPXkoQ7Q)`CV1*RO@1h%fT3i51G= zJLeqe)RVeQnQ7xcuYVQqZ?M{U8<~x8Wy;}R_X!w}`+!l3TUH^deR`4KA@=^Q{ zmYq}A0!Yh3v%}Ez!}bj)Dtm6-dZgCxIEV)aUtj-2rS*N~a+p5HYdslrld!N0ZNHPP zg`^(!<+@;_{0+5rFn delta 2713 zcmZ`*eP|p-6n{Irx3`yU(#s{6wrP@XKD5_snx3_kQ)@ZXqCtXG1Y0DClp<>V`a`AK zyJo=rkw0Rwous|C3bBY(5UW%|K*3Q&w&Y@?RI6A@g$gRD6+{F-*5BLPOJmT3W#+y2 zd%yQ)=FOXvIhlJgE6nVnzJW$#jPR30ck!sk?amSE;i)8ggh$^M=7gqto_j7CqhxGP z{!X138zZ^f%M+cDlwu6qn`US=M%FW)ainvGp1lbiz)tGmn{$%P(g)gRJnJM(tn)U& zi6<2jhVM}Ogd~rN=Oi`q2r`qMq9i4(Pk&RU}b6;MpeN9f)wOL{TV z#drjV0Eb=UfWH8~W;0-O)RfgavY;}d3fIOVv*X6MWgYBicg(N&p17@eS=(i8+{`-A znTzNw_{KTxqHxwCd+a~#vCuwJ%{5yCaPUzwk20AApSOYxtYzI2`w0m?+8}E9Od|d z&Uxm!w~598;?nfh8vsf)eV{#`Opv#*be zi4d1qu5q2Mg#EMVIassXHSK?jv95(m39^q7J;VAXeU_L#=5VB#pPX$X>Ofzg z(A74A0&kzt!5@4^h_jc+4%Z;qZ`8S4PtP`>8=|@)Z-BgsM_d?q5@!V|#ZmUQ@VJCkJuyyk}MxVC2x6NMw{09|xd-6R3Bv-K@Q7uM&{Hn>OCW@g!jxchm;p|8?TjO7bzD%Ra^ zeGSzbM99?KwG+ZGFdT*SY?dr>>+v}>)z;IDzQrQ9Xhj}n8c)LBvD`@W8 z?J2V^oI9q6T*KGVcf_jFpiH8T^djmi=pR%=@fCfw47C#vv*YmEF)*(>0=yD(l4Uhi z-_~YLGX&}maJG4_h44A|sSI)A~ z5l|FK{Ha*zM`zL5J2OGh>QVB*Nx87YnRzPU-rs^^>&joG!lb4q^-@!|)p|NiJ5TmG zDY`(nhh_E7vV(mV`Xp9_uE3^RV%qIJuamuBaMZcE>KUF*tB>Q?t3B?pnz5fzyUmSi z*y_KXEG7WwS6&Mh{PTofOor`|(Xoqy(jl2Dy)4b*G1)XJgI_y#1(Yt6vq--T`kz$A z^wdWUgIVp8jUHkY=XDAr_lB4Q!b(zXK#*TzuvN2E2kY7eHLEx323oAY88b?;^qdy! SBKzOQU1uIjmxX#V?f(Owq;iY^ diff --git a/packages/linux/firmware/radeon/BARTS_smc.bin b/packages/linux/firmware/radeon/BARTS_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..a4d1e0860d36c8e5e69b9b07f4c9c0392a0e30ec GIT binary patch literal 24840 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 R=FzsJmmghwbp288{{UNh+N=No literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/BONAIRE_ce.bin b/packages/linux/firmware/radeon/BONAIRE_ce.bin new file mode 100644 index 0000000000000000000000000000000000000000..7d40fbf14c1b9f597d60151a9c1b149eb8303bd1 GIT binary patch literal 8576 zcmeHHU1%It6#nkcWH-CrW;e?wZnkMMY1cIUQPWx!ZE0rPf>02)QmW!hEdirG_C;ZL zGqFW0RcWEgwi_!|TM%i%(kD@Iq?6F%?iyo|eTdo@A)v%o6RA)$es_|ou|D}I+<}jK z?wxbbJ?A?=brW56XulKl#2oP(@hfqYxIz3v%;rr?90f2vM0^2!Cx|TIB$22C!ihpp zO^Dl7Kx?m{{iKbcUP0=J4Ol=Iv4&V{H$vD^6TH(>xz@XfXPM=wn$Vp_=&>)>A){&qCz( z!N_MVA@$qNVMn0_>9)7gH@*qMU=KvwN8;A74SmGM%K8DU;JrO{1K}EluM9MmO$52$ zT0M*S*9JmdLl(s65_STnjH_;9MOApQJ?Uf+jU0fWZz=jF4;N*w#4#?$;aP$LdDCG%++md%~TN6XYjquz2t{=kXXzWX8hbNuJ}=|d#7O(-a(pn z=RNt1l|F4k8+*_5Z~ofSI`%GeW1^wq6vWthK;};7jdk&d{}$^awD{KDbs@qs=31L) zLzg!88!+U)WV;Q^>%#Yeb=^`+-_h4SeeOqX_hr8>WKYuXh~y)egYgDLUw*<)`#tA; z3&>s@VO`YOU(V{@%R2jxJs04L!t-XB|1{P_K=wd>7kf2>WSR9{@7LzWU({}vE!X8b z8~gyGc21kE_G>@YGuj+E3jc7JeR>uNzPn5MQpUpM_#thUxpJjn^4#~8@duslXd1Qg ziZ@r-+j7r(D0+LK)sG{eH3k1Que%LFeimd*6E;%pkv1oeu6)iG6&q>VyhpyX>}(bN zXus>MgEOh~j_pNThScHty|mFSW%>VV935Aa=q$8YO{Xoyn1hY-tgzQg6yCIBr)~F7 z>Tk?lXV12paz5#WgH~eF!a8YV0*kAhne=~KjzDG#?l2be)svc>?GeX7Qu^wAqj__^+GS^#&ZDX0oi{eer9MKb z8qtblqDU$pQ21{g`~`g9F1-K% literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/BONAIRE_mc.bin b/packages/linux/firmware/radeon/BONAIRE_mc.bin new file mode 100644 index 0000000000000000000000000000000000000000..a3c70472a8bc1e18f53bd484e4eeb28fc088f5ef GIT binary patch literal 31464 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 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/BONAIRE_mec.bin b/packages/linux/firmware/radeon/BONAIRE_mec.bin new file mode 100644 index 0000000000000000000000000000000000000000..65fd6fb8cc509561b2b906563bda6322cfe1ed24 GIT binary patch literal 16768 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 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/BONAIRE_pfp.bin b/packages/linux/firmware/radeon/BONAIRE_pfp.bin new file mode 100644 index 0000000000000000000000000000000000000000..e12a1af2b6baa17d2923aec4b7ff23416b7f4785 GIT binary patch literal 8576 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 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/BONAIRE_rlc.bin b/packages/linux/firmware/radeon/BONAIRE_rlc.bin new file mode 100644 index 0000000000000000000000000000000000000000..7e322354a88d51461d18c790d260b0eecb72689b GIT binary patch literal 8192 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 RC?iltpo~Bnf&UW({tI`FwmSd- literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/BONAIRE_sdma.bin b/packages/linux/firmware/radeon/BONAIRE_sdma.bin new file mode 100644 index 0000000000000000000000000000000000000000..4766a2a96bd7cba06096d7378f50a6c6931dde18 GIT binary patch literal 4200 zcma)9TWl298UD`fcz5mfWo*_MlU=h2S8*jGxrwW871R#438WaXLkXl!FGSFQlB!9| zLlW(*M}`L;OhpwSwgJ&fjWBA15{0%zdB~JXl`ms^S@DoIL{wGUG%ZvJXoCdp^!sOa z*2_h1#`^c1^Pm5A{@XbQ0KL6vP7QEU`bMGsSnnuwO^pVK^tgdB8@jA)MCxSBnKphZ z6Mn8uFrf$uf<}lCbV60~ARb5?P=~3;r!~<`{9+gILRlsLkbWuYBlpmoh>|asGaa}N z;;F0Ud3EaISH0x>Fs$q5iqd`!`6HsQv`)y_-;az{>tu4PO{{qyD*u7qBs7D+HZ%E+ zc4pRw_T)HZjLev5p+0rDogyc75vjvYAfNl+^X1l=8QG&9dgBOm(lpFCSR^uXtAQDy zhLA`bF)!C+qkji7`B&_Wwbb!#$X`NcQ75#)7Be$P-)-Fk8LO=NV87`m_kKYfpl$8+ z$4F>f^5;m456fq42yCIB%D$03u4_^k8oXoyMipaXy&9Z9*X>}|LF}>1#Qgw)Pu`-h z&YKx)r@g}Zjc=1yvMF*OJq=+DN_vb1^wj+yJ>|30ca0@^O|(4`o>yX4nKPuT7P?d+ z=82z^E{xLr&Ybxu$QeIg^FF%Q_M7z4-(Wov@L+1>-112v6RzL797VzcZ1$gnHs5 zx%X|AyJV`l-GCJ*{a)^!2=;_0cY=Fc*aHvRigs)6>w*ow%9xD8`;TDhn!23L+;Ooi z9f-7{R=e&mAzMG}o%dzlVN{Pes+n@1noJ2LaMlCo}0(w$9{7~M#~sKkFbHT zakd+e6TZeX_A;Jph}$&Bx@3I)TI0G$bc$}lhjih7xK|iLkJPT%QPBKaeVnu+cRitx zut97!*6}SogkIM18tU7~9=7YwUM%+VYKA8{cHzJ}(;m2D3l=)ZgGht6)++GMM{2Z)e-$}FYMA``> z&h49(@oqkb)`~bw9!1jy`M)5Dv*eS=3Tb3cJJK>zpMU2*$a{viM$^MktS6oIag}!W z(|7N(u0gy`e1iCEf@g2CnWL!YTQ}@O#OX7@PT?WF=F90Q8nPB$Q^)0(XXYDw)Cv4h z&e>rlbsUlXBk6Uwcn47Kjtcrr zh}S#tFXmA>S1M?Xqb1%juPWY6#u2&CvbZrC*|D|8$&w! z24$Kv?DH={RrWT%1`5okK}&L{rid2T5>k>Z#lkz z^;nG;F@V$9jt`;X7MfHPi_`(EP{;6yI*A^28k^NS(A95Ir9MDZ{T(rN199yERBQW? Y&`zONn?;>=32E&kJf!^t_1cyH0qTwc0{{R3 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/BONAIRE_uvd.bin b/packages/linux/firmware/radeon/BONAIRE_uvd.bin new file mode 100644 index 0000000000000000000000000000000000000000..0876de9e9b1465453106ce480bed0838ff257b7c GIT binary patch literal 224408 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 z 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 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/BTC_rlc.bin b/packages/linux/firmware/radeon/BTC_rlc.bin index 93e8c401d86302dc046a4275215191fa5472dc65..e529a7277a38e1ffff79eddada4ad97b88f62759 100644 GIT binary patch literal 3072 zcmeH{%WD%+6vn@s#G0lLqpdaA*pAdfC@4{UjE{i`f}$cWq}>QE-RZ`K3rlaBR)ZE4 z?MoC~2^K^VMFR>>5#iQm5_I9xMZpR#M8Sn9?f9KZ0{J5{FgfSm^W8h={Lam_Y{dHt zKv`o$5g3mopgfIszB!IZX|uE~8nD2}q!6Cg@WdD0z=Zlb>*9(Pg(_-R9QCI>~sH@m9v;jCXn;7>_Z2 zobl`Gq!&}Ci!pVExg6C%R=zQiS8rxDUWq>iOo%0~5P3BTAK^ttAzfpXf|}O;W6{;c zRV`k=k1koW@Dqs@9W-YG8cF_Maa~%bAvi2bvOKqZEYzDYT zu2#FQ)<#{syu!;$sdvl|;xpgzksEp~ZI*p_D&LSZESCG;lKk8jf0ddh9_;wYO}$p~ z4!*@0&q0K}{x15uUPpBGEHKZ965}{vOm5-&^|d^y3;IGE^u$doH(+D)%(?z2>9sHv zJsAZ1$sF|o7w#LSKWEv#FTU^ya<8(oY$f#soP?2^-uhB%5Z%Hb({!{QD$eh$Ec?c5? uT;zEEuDklJde4Na_sn0e30Lo#mHK-|_Gml}0u2HU0u2HU0u2Hc0{;QP(o`w{ literal 3072 zcmeHFO=}ZT6g`s(X==aHR@$J!jARqK8o@=})rA{(ZqnZ%xa?BtOJkv+phD85v@2JF zxNswZ3clhdrBkzT;~#M0PN54y+vhox49stk85r(;_nmw0z31Jafl_S%j0~0{U?*RO zcV;lpzs>VDZHsos0QbR<{=EKS3EM&4`y5mN`NJZ1ww{?O+E&LP6xIMu*^>zEj>W3{ zr@($N3y=0)&;WV{i#*TSFqn>h0kl`_?Q(f}6UEwQxqLbYJU+Jt@?Ps36j;yeSocR< z2Dtm=*cQlT7YC?LIK{0Rh zy?qz%fw;9J;uqh(#mq3odM!k51gtav8?nA()zH6Cj9g9bNOOW)pWuFI4<@)zX&gDu z$8~}t{l7uOIrd-F{=}Muet#VIq*FhR^F?fU^Mm@D>{-mA8o~&_Jit}k3wgzutp$X{`M0%M{2I$P~yF$P~yF I`2Q662O^6C&Hw-a diff --git a/packages/linux/firmware/radeon/CAICOS_smc.bin b/packages/linux/firmware/radeon/CAICOS_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc8840cf04364f2fb1467b883ab06751a2b85db7 GIT binary patch literal 24512 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 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/CAYMAN_rlc.bin b/packages/linux/firmware/radeon/CAYMAN_rlc.bin index 2ba672fb2470ec9aaed0f9463a422cbbb0d06461..d7f3ceb805b7f1bc840ae31d8cb6c35ee2e8ac6d 100644 GIT binary patch delta 1833 zcmZ8iU2GIp6#nkawENq#K*1Ka+iAOyb=#0Nq7-G!7)dNmV|-BBm_BF%4;n-x@r`Y7 zp+X-TL%Hoj`H50d3Qrn%XoAMu_~0P3+lCNH42gXmw z_uTJ%=dQG+eWEM&9q5t344`gBx2kKA58CgrO^5B6Zgk<_0K7O(*$Ifl?QUocIHYz* zw;J?05KXF_nNH}iIjQ3?IhOqU)xY(rJ~O=pTw>Qa!TAw}G;MPK$nahmXY;)>;Y(aB zx;Q%qvAJqLSG9l1>&SOb4aGhl$v_k&?s1GAhA2ujQd;e_UP#~{wtErhd9T6QF{O=M zFkkERcpIFZUaRwh*Y3RNZE>En=8!9mI!F8k=V(zlW5t)9Pl^l9v666(C&pn~6KM7d z*fs4MZQd?JxZ$J!MJ~A^XS2j9{p1K6wd{o2x8J14M^6sI@dw_H)D*8(YMSs|b z6&{Bb{R>v)F2sy3|IJAiqvCBpD)!OFuSys5PNKqCIX}O0J|o3| z-5ebGwqEB7FN3avG%^7)Q8EUzna7@u%U&8+h@Gn(PZ%91b72?1p)BJ#I;HU&O(_%eBRd{snzDO zw3851xHTg_r*Mq{0q zgWH*du?VwzcKV|JcUSKCqY4HVSh2NKL?$sv&FQtzftn4C4%8h$_bSD>0~2 zCUeIe-rNZR)g2$)M_Jsq#sgja#Dq~T2iMM{jq1y6(mY_7>MS&^0y8|V%Lf;UEGCrW z*~YqHo3^Q=(=bc#aNE{#b^6qa`b`;egbs44=wgl&@Y{hK^rkZ9@$ZyH)2+3gHgJ;l2a0`9Kt~SeZsbBP^`fT)R?E3(Hi@;uG{bsVtA`g z6!h|r;ji?Xf`-XBhqG=d|3Hf2S+*@xoq{w*S`KFsq6XZ1R+d|-yrA&_jW=jLC=c7x>_I$f**>@5Y-oX%nXeIZwB^NRImKk(Ba?)=u=De$!?-^f*0s;C=gy{ zENEQ$?;!Qf=&(reT+N3%HW`OFgv{ruI%nt>Ic}#}^Tr|dIMfjr+o-RB5TPKl{=V5=vq&8n-h03A z_x--_z4^V7p7h=yjh!JplIXm;Zx209C)>-5JO(aJ&uMy+=QBj#c`gZzyIz6lillxu z8yPLz-XMuN-TaGLlIU#dp0>ey*#8wBZ?idzvq|TLUVny&6>7S%?)QX>ddr#{?(F9Nt@QR{XM{n{&)>lyLxEL<__y6FXuMvgCdvk;lX%o%klvjZL3! zqTyV3!5I=)2~XhBjUY=m!B2Q865x$q`VaB*{~?ad%jWAG;~hZoo5%6+LGCgxQ9wP6 zq*M^ks=UZzlhlAM?&-W|Zhb*i0f{Ywqw@8@$5e8)jn{2xI)N`YjW1_`5(@DMi%dg2 zw3}>yZD1$ROo+E_721dG$NF5SuBkW3Q`yht$=D+D(YXV%3D7^DH~(e~f)^n+&KP)p zn|GLP*5-ZN&4Wf3`tZ5uU_Ry*noXXwJ$X|)Z!WZO5zZT@h7pKyApIqG*79*ngo|_% zRIw+e_If<<- zhYT~VesT}-@W>tNF61=oxNP@&xqDrQQ~568pKwSI_yUfz zc(+)){O@5!Xucgga^~P~BqoP-avr9f{7fe>nj9?V{AlS{DJEA!EY29x&lhtPRlYTr z8rdelPILh`<67`6trQ-RU(<9{ZCjbcr@K9Z4|=7T_M_T8$9>1yMcVeD4-h6jyZt_FhOpmt%m0Uch?jktQtdbwK2DywHgHN-pWz1S$bq*rNk zOjVpq*C?@h%xvG{$~jTy8#pcD?@% z(qB%2d|Mx&$Ri=$_pj+_;n!k+zY0uaI|Z%!-8NyK;fpmU8wBTVMxy=<#`zk#P=-P2VR7q5-7!TK!7t*kD@s|Bc-Y(!&Dh{h6g>{^4Q zC0trkA_#FIG!gVT2{gP>&vy=phO1sbyQ^qSucSp#L5sACT7q}sqvjjM&@ZT$>wh45>kQBJ)IFN>i22t7Q|4qn`KHPyRXo@M>B0Ns#9xyM&6bJRpXi zFkh=r^2sU95@2tUiCb5owyV5W>n_k@@!P?W^;)-A>%yBbCc1f1{f5Ynf)*jtS>7F> zI$d6nrn6K_3Z4Fr(k_2w$Ga`Vk#2uSc~{`OrEiu+zUzOpB%-CH_C5hnYP!p7x&t-c zj()+zT}3Ie)fM%=-&NEr4zm?uwxFvhDVkgs^(+D>FnkTOx~O*@;hmXj(Bo~fn)8b~ zz%It;EEf!kZERR<1O2XTel1%Zz5I1YHOxAOZ8BxIKP>n;4-liqhKJ|v@t@0K2fGW1 z8$pF`cGz>x0K3El;kPIDlYyCW3K(!wC3+C`a?B?!GcOoB^5~zbkqK@djAkx zlAP38nw)6z0KR*oo3HLH9Z(;vsX6NDVv+htn<$)M`qu?QhD~xE6o$*|*H00b52z0v zDH~9~lfx5xi;C+vSd%y|}cFOB@R zF<% zg&W@uH_73~;c(-J(SkqsKl{y>OAIx3Y-#H^LDyqNtx`hhe|E=#VPnktke^s=gO+l& zNrILVb<|td`cDZA`WV9sclC<*{>LFTa_`zhKaE5;zhH@pq%_FtAyEd|rCNkIIihu! zh6Vh;1Phd;j7hXbHqxD?-To-s$Awi)U=UOJzZB&E(isQ~qryTtL4LhF^4s7efk-aM zVE%?cqvEt*#yP%p`yoqHQine!08b2sOLGh+i#3?wG+6(|p5%=u2m#4-Gu$3NNZ5Qm`#e7@^utozsom&_ug}; zE^@DMNQ%svUEAhqh+g_ZO--Bk?C51Hu{y9yh0yp;7CH-?DggHSuyVUf+d#F=FMrtN z9cc2Ji@Vp?Aar4o->%S5u_`BsjE0Ct?Y%zM-sjWe$^lo^H`C&w&eF8_N=8h%FhKBP zjmdbiW3{dRgi!PwJq>NDi`8~{Yr6`tKh<<&S44wqndT_OCPwTE#gt+xD-F`Zmp&!FQ!= zqQ0l18$KVMdmG=oxz0zsCs!#*>L)!AEo!G9+T56L2p?3rwgr#558l!Zu~{{f(P}@t)l*}DP?@?v0Yw11KZ^lqtfC_G`}yJ^NVd^ zXi$7Kn3Ezzk}Z!V&WSOVuNrkV+V?>-bbAW z18AWry5?51UUbb@@Bp#CNi-BL+DXPIW#hb7F(K$vNZ|7!ZhN(Fla6FsZ|1jdv;o1TnVZfRw7~LzOd39R(7_E z1IkKXM!(bQeV~lG)1(ZRoT%TJTSnB!C2`D6U|P5QRz@;mjfnqNN9?})A#t$!i9{1W|^=<-$i4ZM8C*Y&m0 z6+hCiicWh|zbrak(U*nUavd`>fIsu28(!9Hq8noR`MmbZ-TEZ+;RpKJ(bA@ReH^%D z-Y@h379U@T!uFJKkq&)ph)fmOCR`1*^bDw1_JXB)v15zk&{)Y77+{}^^;8gtuO<$^ zD%P_E9Gt)$u7;g)RV`kkrBBC>T|yh6yLCGjvqPh*$5LEv=;s#U?^VX!b89=9u~EMX zZ&w?$rdHzbTH`YPD$MpsUYf>v=^V~W`kd%SSw9b)q)(-)XJ90~fLe&oadJ^%4iMu` zNuUN$y)`?)Yhyh+4R9R|@aiG9t~SDlRlXv2>^2&fO1L>vf#4m1uQ@PypFmaVz-S%-RJ z6Gh<)Oyh@KIHJXeS%l*kk)38-AL|k00!^!880Rwll?}hX9DkV+!f&rJO|Omh2yvkm zf)u~q`egG};jgM*VZJi{>d_0$SBO(o_7SxeYDpxNExa;Fn8KbuVOQbvh-J4!Xpw2N zl)+k~x2g|J_O)&wP#=gcJr~A(tmmZ)K^`l}1eR|>4&%$Q$vLe*NN!V2?et^q;ISO` zU4SpH%`faOe`8c+ci@d6Hv-8Z^ur+BY4z`lu9@d(e%dxtPMi9xx&j1=<&<8&q@#R? zY$^gYHdj;&phR?*jH*P5&?4F6cST3t)KUJ;?WjCz0soXC4N9Iw33_%^PMRGHEq=!k zYM0ujx}$WyV3yY9AX$0|VCqhoH~s)6sFdwRd!(Zroa2g?AF%;%cK{B)pKBNAY8&9t zV>8=?n{5uQb*usUwyI62%`Ac1R-NpdV{6-l#b#k^9STP9k7?tZT5nhghJ^q)s-qlA zT)>ii4jnbtv$Uhs)bGfuxAZI6|N0^Bbh2174!4Kj>@q1Ofx_a}ebljo+cL@uK-&Cu zq^xDUDQ0032`$%yXi%%&WD=3^m56~*prU|SOu+&Zjaiw;YR!I>jG6Sf78P8^1^VUW z)RNr%zvGYtOZ9mG2)oKE)2MKnUOl4Pa=q--YAX)uv>cc6O@s;LN^|ZUdy9VEGkd6K zcIcxEM$lP{z{*jfl(}gkRgUQcSti=Vj2%0hh8V}Xj~(-q^o$+TTV4E(3z`8_qB;mj z(_Kk3bard8v(<<;v11dGQm+6j&=j^Ax}Q4lZ4wNzl-N=3?h25Fn4R6$VrX4mqc-y+&8trz8EX=Atip(blu-W_si z$+_OD9YZYwoLAhz^$`BDBc3kkb_*k# zh@u3%0Is;uGC)L1h~UVzYuC0gFl0h#-f#Q1YEBVJxmdS4@jv z9}>4m*X-a3SQIIQ?c{;f2Qx`V98M6EVCGkRW2RjNS65tt9*LenJ6aE-Lwy0R=)X-+ zK;!6|!+5m_OxV}rzr95oRw%fn)M6F-kdoW`BuJKY;{f!|#`oJFm#RILi#tl&AD1gH zN;km=l7^cBGtNI$n;*ud8&6X8KI=nKC0GP4s@wpj!)pwGXi$qB2~rnt7Z}inuK*zj zwS;mcxR%pW;bg2o63n_8!Lxan0UR&27*uT=n`|1M>~k7O^I#TSOeUx6erddL0;Vbmak!(3XHC8vSNlkslNhmO~ZwD{d2@nODI`&x^m<93kY zrn~8J9RYz7=-O8K0J+r2Mf4|N*h#)tc#cN!Zn~u~vg3o6V(zQR=Wk7m`-a4)fFXQb zOEiEJ_)6(4Cx$;29t?oa(tL2byvcINus|mSaa<;WyyFD6K!Cf*^aGPD&v<}$6vF`w z?f=Eo;uVWSO2BVCCM9V}4PLld&*fZW^S1X^kQN}cRG5It*XD#xaDRUq?=t6wRYbys z1dPW3W3AIq9%&a4!YXTlJ=akh9Y2xC5lh^!B`XO59r84>TT6!MWda;DV;>`Xdr7aK zP*Gb>MDkJJr2J|8+__vZ57Rz7%LSA1YDCAK=U{|l!Wu?|#SDm$n6K-)iog!AU394A zOX8!zXZ0KA%!cPRhh;&Ofm2vEQ)semnk_jf_~EbOe%oi@wSvR9-j_@P*q^sDzDV3poh?$AvH!FNEfp&V>e9O*8HZ_v_`$bH)@ z*o% zZSRA#9{iAmc?oL6io<5Kss#Z+zZNgl-Y%YSGjY-Fg`Z#?s6&jJkD|_Tz}UsONum>p zsE_JB9Ra+wKQ6-CXVh1FJIdQ1cU99f)k&)Dz3zj$Kps)-A{_x#tS+XihcXrM1Pu?B z_xZHr1rcqZM?3C~0BPo!4nJfkszG{Uzw(2g^p*uYV}^}J_0Js8f1o#Iu=oaH;mKf8 z>8akpQK(w`sr%1@%=TaTvuc&Yt$d2hd5j{n(a=7VtmyVeayOY%82oZT4+fZ zbX8CTl;CB=05fJ_LaO+rZ~UuHdgUH-N3W!9SI>Goxm>`;W-q_oeXVi`j8DrkS&14+ z9Xl`0BP12%Q{0kMamcAT;IY~fYEfo8ajHd`LTiu7mE<5*USY0}5a7HwF2%8>2;Ru7 zQ}?Rejf$#iky)o`bx?4@wYQHHaOsxu5O7iUb1pJs0tIu30bDI_IVBghdMO@3*R z`IC);wkA}wa zX~q0P!J&yoqy`g9QwnQEeU!cu4?x#$8M#1U1jFiqj%><}Q>|o6qkoHQ^nk?mCYbqB zvb-0Ti9m5x+awt8TvN~`ELnu`9qiUG!U?8uha@aYnCTAX)Aq-5yO&3_uw1*nT}4o) zya}zM-T~Rlazx(F|Z^!NomO%^MBp!b@uHcy{yAasS3r;V$1H&;LA;5%LjIB zdRl_3EG;3>OVLDF^!?&{lqR%oT3dALmQL@G15jRPonGAst*@I!cCkpecS!6#S#s1p1hA3TtZk4;(M5iNLrGBibV4(E?EO+0u6^HFJc*)x?%A>TRdmklH@Z? z_WHQbbS}CNKDDDW&>(F%`IImrOoNGo?g&JS78Yl5CO}R*guj-80~H;k0&Jb!I3)n=%@z4#2ZTMGu1 zhhse#Q-;a5?fHjAqXI<>ww>3Bq2~azQV)cd;XI>uX*4C6FtV{2rX_3jQ0-XLnGoZH zMiyaq(4VAsX3*i^EsgHi0q_?ewCtxXrs2j!V*8K zeGES5aIm$~evOp|vy}8W*(fAv3PAgz>}Hg1T_%R(Zlw`kB~j2z;0(qO^26Y{hl9zF z^um`hV;Kh%wt0qqFzaK|lHT2=Zu#H(-u$haHcwf(wv%z{zE} zx3Xm!|Bez}@Tc{L(p3~!5YpRZpcP!?6@tX$tlU`GBpG9&hhog|FAM%Tv$@}nJXMyB zL%P`s5>rn`M$#?gC9-6^W%RFG5b1C7!nwxv^*2ghEeX9(AfneDNsHef5+8&2pHG)) zz?BcKly!x#4-gPjsN)$d*v*-x0O^IafZ;P&NuV890q6XGh+h4x=-OAYmPYWn6+#%` zp>gn-moo_rjXC>mwu$xB9Vr7Vi;oV8d-&2oUh|UrIE4)$FDa7@LRZlPc}m?}em)t= z;gDPzmw)ISjREz0;J*5iR74Ilc4~W{M9!o+7nb8R4;B!%km6^=qD}B(IMLJ11SA%i z0HdW1HDf<>?qJAHfZT!uiu~k(wD@CMY|oemKy}bIs>t0vDE^poAH`?*WJ<;un~zM_ zuhUQlOaf^_e3l^ol+>w!w#Q$6PNmXSzNfV6?6mkieR*!Ak@`Ftsn3CZqcax~A(a93 z`*C$ZeSCywP7GU+v9@g)%{dIhe*%JAknH^TMDm51S-G@|raNCpM9VTNmZ>ZnipAK4DY#kC?;0BCtLd4k-A9mOxmYUl3hCR z7BK@~Jr&D5t21Z`rr@hVQ!r)ZmbH`9Rw5c6>{BFaW-c1JCLMi( zHlL`^Q-on=g`!VLyFo7P6bi9IA4e9bb{y%9BUh+HY3Aw5j9mpke1g;zUaU5jhKw}CgV|d0h z(jlFPW2RiTr7_vxm^{e}s^%eB5uz{$%xTG(kX9~)TS2LXRM`&=D7~LFpa6_O1YC=` z>!Fe%?=jq%)IIPjVF*Bz^3;&(+KRk})95ZXvJ@V3AX|#)6_OBSGoNmHO3*I?>a<0N zCJz8be%7Q)-_n@sZ%mzJg;fPn&v&p>iWpn|{vFz1(U`~Gh8y;nj?AWv^F-vj$z?I6{sYNO^oWkMan8=(Qp7FyE%nYMcKP%C~l;P-WDi=*8cnF@(xC zNuc_I`=bjN(1?@t9E-!!wlrD~XxviFR~TXkSYgDR*PT>9toFxmImrFtF)2Se zJUQgx1a;SM$jk(fAtz`ika^G5I@MJ0m=?#Rke`s!Xz`nE100TUxpHxG$m| z^J?G6Q5GJlMgFn&R_WKFPxAp&=$V9*8<9CmWkX2&OG4l)LJ-<;VI?B;rByIsUk^Ye z^FeZ2MJ~q~JBJ%OzXD(rWdn7IPTo?`E9KCP%qPq7ly{J|fL>1P9;f!)KhBfKbh6iw zET;3fx_s#u_*$2vVNleF%wzTbw?(4>DI`mN#5Y^@ew&Hx-P4iKnHGOJB>o>zrP`#* zIK&T()5n8yIy?io%CoD9$dzL#9Fac?kpqf$r<14dPVkQ`Y9k`!oUQsG*3`vowk^50 zU;Pf1;pFR@(}XY(sD$*usVfV=_ZW~j%JkKqVUU#{P9s;h^3 z#Hy@^qw|gqs06fi+sQ{fVvINm4>zO=+WWkAjtAys828Rg9oJclcU~8a#N7*?bL9G=oC@xk{chmRU}R8zepr1jt-e5gfiB#f8HQ8Jt39D;@2FXl z45}{-tG^mjU$lW}`($kF$PJLR<1PStX;^(xi>Z6GVYUPk>#s8n#3*jvQ&JE1qL57H@9ErR#RVb7^YO|{4zEiyBD$t^hXYAac=KaZB+7&+3F^az#_ z{41}PRE`Q^ZJXKt#ZYMtI_#~xkCfoB`Brte;R>s}od>7;)d!k?X6viKhoAjM;sN5( z*npB^7os)4^V}m)0IJFbwye)eZ!&330B}Z9=E=0=aS!5x8DGWk%5fe3 zQ5*1vXWQo}MJ|W8w8Y}79Egxv*EBzqfs5B`o4@CHeW*F&czduJ(Hm<|#7rZv-`X1x zM}(P16ZCMVI=*HcE#`M18eNtSJL>eSkA#ZRDaKJ*PR$?D1Beg9ON^oit65lmgw9*J zaNg>S9ZR34&6cw}s4ME?S9rKl4$#}X=}I+C&C zfE>C_zl?trLm>;mIQr-|I zKPzv;)N{;4OG+?@N>l{>>S&Nmp^;u1C@~Q^vUttW5;*=SEs_K^P6$-5p&o9B@h2Vd zRQ)I4%PFG64~m=%>t|B#QDKB85D25A!m-3`*rRl^+1FxXNsDr_0s|9%9oUxU;Vb(J z69?t_7gU4qCsS$;*&ZjI9I`FYVv2eBk-K!o>yW@#Of}0TFlWQg=0iL36Sxo(BWHo@Wj!>R z@L4=0#&B;;ESF3e0wOcSA#f-h()F{$Y;kT45OUC}L1GdKAgwb7O|V{dCl1t(KNt62$wpw? z>bv0|CFR)?YC0s86tbjJ$J50+20mH8p@mHz38O=#@Lt z;{Kc~l z?3(OxRCpN{Q=F2xl=|vtHyn@=a9bVbRM2Ak-+@_2moUZl_rSihQ8%*}a5s@j2e*Z| zIeJ<-H^F_$sbaS<2diWUt5|I|V5C5qPMmL`6X)yOKB7w_`ocI2L}&rn4b}pt94AwR zk*@<0^~C#e0rGx0{ksxwQL)Of`(R_tzT+bCUTcAVWi0U?#5g5Cy7g-F1$s-Xs%z#8 zw3k*7E>PgrAnjYZ$wnvPVD;G>1@aI=NIL{1V1!#8MnTQL>Ke0vW0??+lyFQlmo#D9 zwl+0C3Hxl|gkqV|)eq4I0v#l?##_CBn0=G2HzESoN%mkJnd%{ao)3<-&eHk~be zPv8i9Vo7O8TS1;gM=9<6I{xx}A)J4s50dpk(s7{-iFNKM+47s5{&5gCClhZgXfZyP zw^O8M$Ke@lc%;XR34Rd;#Csm+~gO@soeuxcUqU8>*Sz zgB>924&vkg(wWoxa{4ouDiMgBlc3D^K>c!S6C+TMeI}qh1nQ@s0VtD_S;d7mOpp;iw!^d? z6({H@0gvrKN*tF^j4WeyFD08I2U-j@k-x(g`cf=002x?FN}(+nu#V}hhgf5H(&B|f zVlCwi;WOaAEYVqEItd^eNiH1BbI*flpNKI6CN*+!xu+&5CY;SR<$QaY45=C`b1EB2gmyO=`9?+*WU3X zdWwC}xFQzcVupK73&e5DMQL|IEdFiE30tMT1HDd!$lRwQriL^_Ixpqcjw`TJ;&+*X zvFryfJFMS@d3c>O7J<$%mw8eJUwAZEi#>aH{1$CqdOuE| zruWZ8Y$tw;+l?5AdEhT{@Y$zm2bSPt1d0W<{re}u?HCv6Y^DX@oM)#V#i37c_0FSg zhU6`SOiJE7$Sf6rSakW2xD<*^<~VvS4WM8BkYh@tc>6jG;kwl{p8ecCk#Lb2BN-6n z;@j6va9yhxQss>h^6~4;X7oEQnkm|d!vpoZBkBF;(zvF~nawk_JH6zdr$Hf+V9x9$ zt{20XxNFW#J|c9d0c~xbHp>JCG~^A@Yk!-;m}>BD-o6f+)%xc^gI9^hCJkr-b6!Wn z4azx%lh+NZA11FIR6j^=9ArxJ)7T?QU;qVj5$Gg%JvoXe7ulx_iozC@fJW3Sq?||}f@7546Bk32)No@3MYoXoLP;-f{N9D%&Kw^{ z?oDNTpU!ny#3xb$!o(>r&Z4FeeVLdi2Zs}sGH|FjItJrTdV3WQCE~!|bR!{z-HHUH zL3XQo+hnX~k*Q;wTTyPPIKyDEo@OMWBRGqkEi>$`A?GJ!st=Q96TM*>ZN!vul@-Wj zFWe7b3i2o0PMolto;ZEea~wh_(i>F|g< z!IJ@Cp0w%K%~4?SW~``}bz>sfi^u03$LeRF(($(24g*^>s56x4jT`X_BF3cww)uc7 zG#=?vrhK5(t7VjW1rZ4I30YB;4~68o?fq;s(Lb>QGV$g}tmmn$twkvZy=IAReo;}% zDsq-3?J{TKA2Wr{(&Mq7-RO}p8bufdV?9s9C)qNdhRat>tmk3+dKP^h4T3yn3j}EX zI3P;(vbPbLXTE#(P>b=@Vr;BuA4w`3BApkH^*l!3tLXdLbW+X%)N*car&HvRx#Zj| z#uDZ0x469zN64R`wg$DOpz2fl1w^p;3Pd4Rb3j}!W?Y#>q8>EL65eWxZu#9A*o`TK zE8>to`XX^)ZP@(k1)86pog*f}>Jax%U{*0e%0nikW)M=iP3#SNnMyCX)r=ZD37)di zMcQ)De^br5RC7+Or-NQ*(aZUKwQP@GKWOvAN<>wrVg26@wx>wtTxbzv7q-N&{87NTEKIE z3n=?HbMG!uAazN5-$Km&yUJ`pp7jf5CO?ESs9e|)7*uNem6cFiZb|ny;X-L_pO{srK{7GqkR@oVeZr*QiEufY4-FeyVpmHDbx|N;% zO}H&}wHCkhWK&^P3DDHyt4*T{`-P5zF2A$r>Otk+VdZWvgAs#rZM*HBGfUueYzcgh zmLdrp>v_xEEoj|nsR>Tam!~1v{O-k&NKNQHCl$i{lL`$xp@OKET+roBLF`|YV)k8R zT?N~2eQZ7E_tqb!!5&1~%jV3+JrtPZAm*5#!q0FBKKBA2e&~bX;pQ!kuHI_zy$tow z!p~?k@;$Nz_5sdNneEeTF&-_(=5JBj-e+!Kc7BrCq6#g}&flWEy^r6rK*kF0SGKV- z(4snji!tqe8eb3RXvz7haa!_%6fQ65XB$C3Z(?Tq**%5d0dB?Zf)w^)G%F1rVAe8cPBOnRI;}SOParEN^=)USPE4QD05?9&gW+# zUlUP+Z#?$a2{9{$N&p*~3H{34FuQ$#ZPL$zU?cfk#(PDw0+Q)JQs&+RU+L|T9#}Co zk$&Z}fu=&7$m&<_=VrMU8Gt~Ekc#*!Qedj&!yX-mDP37l-6q@vO+MWN6$OiZP`TTp zFZUPfI3a~Qcv|3i{erQo&D{f480hj#L)zSN`wco^J9pWep%Zdc*e)J&SsU0GIBU zNq5O}f)&0yxb$#l>UO_LNXlYx@J z>7O{jKe~V&0x9fL%ALf?Vpqy_q~w6R>R{fhrwKRnEQc+^5$eJvDOr+6Hy^F38DMu> zT6NZtcRE7)SwrXsGeC;_@PVp}qbmL`Xrk)KW3wEcX<|jp5Y=4Pi${V${%7ReZ*ZQHuq~|U?ceWbcm5Ytz&kR_hR>8qIl7+TfsREv+f8sv??k%X z-idTCg{g0UX6SGLusaNfe}v(Vkkq_0ql04=a}kGWf#k;)j#!Ui6wiLr`sY;6i+CcT zlNwLCL0AToBFT)Y$m}%cHh&pJ`8`fE7Ffm7$4QU>pQ-Enb7mreFs1u080u!;ho!9i@xc5CJ@)hw&}63ta~ho3QR_%|gd?o#I;H z7ozcv(DX1AU8tvpIzhnCOXt>!JFcyh7T;UvV!xyOo` z560@))#*CVn8|gXj&*h3N556)yZ(6{-*x4S_vomjt22MDqn@tz|BsHkI{QUHM}6JX zbg_;$x_AB^I@;;p;YW3}^}FAS`_bO7EEx0yhF^I+;0GMPDo^$UmS6q+LO)j0aG4;m*1{|5%^%w)5j1^C2z?HF!e$Id|V|QH4fHPx{#Tf8r z?A3J)xHFIVKMeRY&v|z;jDdM>Of!swd3N2+Fc#)%DPtH9^Srm0VNA?hJ&9pl%)9z| zhOsg4KQ3SxAM-xn&M-#iO{`-WC-aSZhhePDxAYE1K^fzg-6@ZZ zvCE3PUdH%kW$c48Xdo-I-jqQHS-DJ?K?_;Ax<0N>(TCmO(FBt$R}j&17|*E`x5edgm=NXeX=p zJS~HMvidJ4WzbMoe>q169cA^ktukmStH)oGK~I^vm<*cA?5xXV&{byV@0LMZnXPzJ z27P6A^LQCFmf4oi%b>H&c0VnH)-rqMqzrn??B&@qXfCtPEi&jXv-e+;L3`O##AMK4 z_Jl5zF$c2e!d)`vLH4Zqt&F*lJq_b!%!lmx*5_r+iR{_?w2XO?JwHDoV{T;6;n_0g zNA~n=kugWIS9nRrJjveCs*Jgky)!PAF<-KG*)AD#CVOxAt&Dk-y^Z5#%$@9g;AR=~ zCwuqplQD;~_oWju=27(>(jWceCvK;kRVpzwMKK2ij#{`w7|iW~uCp&yszAS}Xg8n&blS zqjEv{0smqA(|*@v?qyFX{2`TDi{cm8$u|4E*mczxXSNPIu;-8qhrd#3T7?#DU4 zPy75yXz^+5d>q~WH{U;w#{Zk|A2%oeoA0Na%g>_R7fh7CS^B5a;j)6@F+3;AMwf-~ zl=)xT`DM$?t|_~o|L=!oN6I?Nj+ON|zJHi~{xnYkrR;9{-|5>1Mh7YbmjTeRtM(>{yp%U;Huzt!JC7(1vdx(A-E;@ zwP0KDSm2)m-v~S!cslrx!3ec2+gSF`!Pc@LjD*AAp9@CwmS-sR|Jm2qSHHaGyw$Ja ZryD;>{Jb#c(AYzDhZY`Md}!IB{|8twhg|>w literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/CEDAR_rlc.bin b/packages/linux/firmware/radeon/CEDAR_rlc.bin index 1358c7a1838618edb262cb4dbfdd13808e476f47..674e580d3c4d4fc86ec0a9bf9a8743de92fd23c4 100644 GIT binary patch literal 3072 zcmeHG&r4KM6#nkaOJ~L(jA{0$DMwTgSJUq?doZoqxD4I42;8-DnRuPik}`_&C%F!{ zLc~NtZwTRvZ$>f@g*F8SL5rjoLgni_&#@$0^asp?$2s?$bIw#1bEO|=hje-NvWMKHi$_vd?xkp@KV~%Uv3DK$ihA1tZ!!0*Z8r`g(l%(@D|IC1 zn_DG#XEn0P1k|MKf0tewNDUR3OQVlmona32`{}2oE;vUpLasNZo)|H${q+MFk>DME z&kNS9NR0;Giaogizob#SzaNuArj73^kRkRb!i~gQQsGw;(%hc)w;1|=^!^3y`D5gDh35@@DokI%sO+2*%i*}q<1(NnThy$-mh z&pnL|-__N$!ux>S(d4FV7u}R96zBJJEc>T^wk5~7D>wxM_hfNTpCo=@SC%g8iTnls z0BxXA+CZPuBfu|xU4K*bF8YvqnZ^4{5+g4Uf?d@3yTn=*_Yfbxud5IKuO{l8H+9Yh zYORMbU>cmXIpTDi6V64`>hzcn=bW{GRB6P?dIcv}RL*GevNKjJIJZj5xg8%z*qVTC zrg3R1<9C@gbPjbuMXy3x9y;f+r(yFD=|gd3hGH(vIxIH<%X~nS`H1#XO!by-sNRSN zi@UI5pJ7GcK~Wz&f~go&*Swgz&be1Kz|95RscF3%{2vFnQ_S0vuRIk7DhyN@s4!4r Kpu)iaGw=)9-${M| literal 3072 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 W{QTx6oBw9>O8jrc|10pn_WuE2V;Nll literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/CYPRESS_rlc.bin b/packages/linux/firmware/radeon/CYPRESS_rlc.bin index 1358c7a1838618edb262cb4dbfdd13808e476f47..674e580d3c4d4fc86ec0a9bf9a8743de92fd23c4 100644 GIT binary patch literal 3072 zcmeHG&r4KM6#nkaOJ~L(jA{0$DMwTgSJUq?doZoqxD4I42;8-DnRuPik}`_&C%F!{ zLc~NtZwTRvZ$>f@g*F8SL5rjoLgni_&#@$0^asp?$2s?$bIw#1bEO|=hje-NvWMKHi$_vd?xkp@KV~%Uv3DK$ihA1tZ!!0*Z8r`g(l%(@D|IC1 zn_DG#XEn0P1k|MKf0tewNDUR3OQVlmona32`{}2oE;vUpLasNZo)|H${q+MFk>DME z&kNS9NR0;Giaogizob#SzaNuArj73^kRkRb!i~gQQsGw;(%hc)w;1|=^!^3y`D5gDh35@@DokI%sO+2*%i*}q<1(NnThy$-mh z&pnL|-__N$!ux>S(d4FV7u}R96zBJJEc>T^wk5~7D>wxM_hfNTpCo=@SC%g8iTnls z0BxXA+CZPuBfu|xU4K*bF8YvqnZ^4{5+g4Uf?d@3yTn=*_Yfbxud5IKuO{l8H+9Yh zYORMbU>cmXIpTDi6V64`>hzcn=bW{GRB6P?dIcv}RL*GevNKjJIJZj5xg8%z*qVTC zrg3R1<9C@gbPjbuMXy3x9y;f+r(yFD=|gd3hGH(vIxIH<%X~nS`H1#XO!by-sNRSN zi@UI5pJ7GcK~Wz&f~go&*Swgz&be1Kz|95RscF3%{2vFnQ_S0vuRIk7DhyN@s4!4r Kpu)iaGw=)9-${M| literal 3072 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 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/CYPRESS_uvd.bin b/packages/linux/firmware/radeon/CYPRESS_uvd.bin new file mode 100644 index 0000000000000000000000000000000000000000..570b652abb88d433a0b95a83c4c32984caae48fd GIT binary patch literal 115736 zcmeEudstIf_UK7Y$nyXRfdB?f2;u#dhYE`FP~_!{R&7#?)4Pz`5%LZSBnb=J&hbcfar6KW;vD za?U<$uf6tq?X}n5ht!|z^ZQaRG&Boy?i7f7NA504(bxOeMPpQpcc#nra+s!;xXr+1bc z)5Uy%n{yFc)cwl0i#9j%Uw4*$yLf!sp1*BdPF>r*@#_~2OGbxI+uo}c0NfM)pJnHq zaNl(EQc2C~?K7_|?U?Y~uxb^KzCW1$>_Av!<(lRJn%4iPKc8g^|CTAgni>6bCK87r zmnmdz9~2?NSQ`Z#K83MV|B?RBc*4K&^~$OqC&XQ@ewlf8XZu+8$`klaKH=_4A_d@{((L%MS8X$9S7Q_#cwJ;t)tLA#0W!-FvSQeMp$CRNi38jNTwLca9k9N5w#ep79$N} z<37Gyt3wBPKEOo*1!+kx#@(zZkKKk@I3?Sd5H{5t|sfB}VLG%r5_dMw7$D z&~3Pjbqi|Ul4jkq*Sh7CnDY!ojwlStF$M%4*|#9}EkgSixqVCY)T4)O@GU65B@N%Q z7k9LQz7+=fRGZ2zNaYq`}dTR-TK!rY=Pq%Q%?Qd{+B!Gc`j4_otSB03Dg*ZF)$b}#=@L1HpY>wlk+xB zVj>I?I=BiX2<3=qA?3G_nz4{dV8U0lgG+K1;+ICroy1q~A`$!G#x(l9Zjx>(=Tww^pAz(9?ABLu}8<45pil8{PU&)Z9 zKImg2H8&|lZbRiZaWJdcUBbLi*NsxhOg|)g6b+4ywuyahbYFhRFBabN8R#-adjd1l z%~1*U|NrwpgrK^BetpDPpX!Gh?^B4?O+aJ4s{F;UlF%g7%?D?a1^zR^) z$3M@&O%#;*(1ru$B0OIK<@`e+wzInr{K?@j0RBSxF796NCxyT1@TWi+EUpt1W%Dp+ zK1bl-i{kuXxe;>*bDF5#HqdNNe>rh_$Z{W7V zbGoemZ{VJU=L?|FpHHE@1AKcG$`&Xqq0E624aFVGIPmf^6f=|~P&81=pe%zD2gM7@ z1Hdr^#qnV%!{zY>n6rzkP~;|d_mFscc~6u2`1($l$>n|ug}=X284wT<7#J7? zpGQsUUss5OIZOe|nd^e0PELG2hPghfV6%A-seZi0|K4>JA``kY5T++f%Jr2`M>$Rc zzBA_H8Wa`Ai4a6O3tdpQ6OS*${KWwtq0_>B{QMOG%Fy8OAVwH7f)&XXiQL@W-MzfT zY!BWviI2CZT6)p9d5yv#a& zR=ps5AC|MHz@?3e)Yn9IXDgCt7 zjnb#z@OkEt@0vHKKl_&KxwqvigWuXFMLyxb?yz$Gk${5cz`~*=$*YEKxQ`HdmG;nVKbb=2FH_0_WPvhInU~C4HcjR%bCJ2qgb0`6#B)YrIW_fh_T@Qw1kQ|M zaXitWS+U4}MepTX58ieUns~dP;vfy+!`_F5AYy;;cFi3WL4JAgHr#P3ik2qAaF-)0 znhCSv_ks*jX&~T6=qkDmaEPL)`Sb-c_TX*xpL7Tk`QYsd-UAA(3PmRG)40^N&<5bZ zdJr>3J%{WbpP;^XhC2kwXa0gBFM%_I=MxSEN(R^}8-=KO2=y@qc(`iHM*pH}=mrWK z3IhtziogoM5w)3-Bm_yG`zAw$AS^Y4I77jpIH?gYz;}(Jpu1$`9*k}B!Q1jB2>ls? zLWg07*&D$Ap_BnS2!9bn5Tf!5MO2qX@D$nsZ9oZyTqp)#M=Sb#Ag>igzBd94+~0tD zghHrsUqA?yCIfHe0K=3c$gD3@Cki`m@85T8DQA5tg0zEG3%Q7De>9>RhIY}gXhskv z60rtBTA=R>P*y>|?f_?oXKEMSI7|9fqWbmtq5>K4J8?h z5K04-Wl-c$3{X^1qM@`y*#yM~#SEnn$`FWJ2t^JhdKz3qkwc000T?K1D9KRdP=v`q z(~yG?6z2$xwJnIDat~mr7@(sJ;CKp@1(Px)VZ)ph znfoF`b>Rty>cgE3)k`ZGDmjcT6pFfvq2l5U)u(EP>hdmz%I5`!>cMW{-IEN}o>dH$ zE{~xqTg_0ltzf9OKE+T85GJw=+9f-9vm82E24xeJ%}_uIU{;aE!2B=+E|GpH2cYyp zX+W6p7}oj-QvwBag9)-^x&zJd3qwF;kVlclLV?&`wh9;peaHa44Stz!01M-jt%ULv zl-0mw44yv;*SRoM`g%D~1HVkrG~%i9@q$D%w(uq;CERz zL$#^`c(RS5YFG;V+00Pw-_B6U!hmXk2kb!q5ba-7vS_$O+7V$rLuH`vSHSHz58ej9 z1`ZOg$p>%CnmC9?%TNjb2r_|i2t*1$v_M#(&p&|~KcK+n(9nCK04EUI`h-wwzzNYV zgQ8r)DqhH_B(6~jPf^WPO6M5Cz z&uyB8Mn}iRltMZ`1%%P9wE!{6-r|oJ>H8V~9a7 z2Sj*86uyzLM-BqOtwhus5w-6uVc^&X<<^aZ%{+=Qa8J%bEoZq`xfE7E~i$?HV~=7EOjnlNDw{5oHOV(Nj*7 zl^?|h%fln052T>#>Xe2K;Xw_PorP$>pd^`c;)@58bE%du?n}zjKb&P(MA5v?py|(# z(s3~7i*Fq&A$lmuIjN~6wt^$gMpOB;_gC^bro3pNVm`{k)yLIz7>3E|Ais zn)FuM}qv1*(npd>e+!o2YO%$f_dwgG{< zI!TDAWvvAUEjV>ZYHVG*zlg>&DRI6@p`pT zcg*s+tGQ$P;$C~>-h(<63-94zzSjKA^jE3jC8bN7(ot>5Y=d5C@8@bO66{e4_H{<9f16ez?=!RdhFEzU7XWgy z2^ksz1(4$kIq@!K&pSb4m^ft`+cnI+AuyS z5D=u9LxyKs`?-5=+Qx)rd9*bmdOW)>6Ps@T>!j`7y?tOGWto7J09pE9vzE@Wgw8RW z-7Teah|oEKi4L3=2W93ymKi8>NrW!2P(v#imfWt8?->A(V0X|3Ou+rG;Tz}LBj?&| z?)Hsy$;i2Z^M0kv*Rrk+SPE3Nl(u^JjiMJrE|xScLQjnZ^h}!ic^%igvn{=ok`Lz| z=Ky1OVg(Hd7*Hi`JQxoTiapNJ=0^^3X|A_EV;DtS=MsjLg6}5>W?8?ym-m9_Hubbe zG$h$0lN>Z8k&#K{R}+%2gf(|)ohQO)Nl%-~W*tiqz<@3N+ye{HmF2^?KsTq86^p@g z(gidePB7K`%y}&zNrDP=9D!b<&j;lN9b;3#*;^SX8NLAcX$fCQf?-PUjafFTP0)C9 z62W8#z<9Z)^DH7{L90L;vQY1aucPWXpw;Z#lL)l8gf9S-)@_!AWP&L-beh{uDZp0{ zl)axfUWH+#BFT2&Fyd+{k55N|97G!yFKs0@#2=h3u=rmy^>eF%?y@Pmt+W+R5wF>d zxsv@n^|yO3zL@@xNdzbXB8Z~tK!vu*7gr?VMKbnhlO~5u+s&-@K33jh87X#ELzv5l+CoR4VZ5CH`+JOzZHj)k@Ino z9hY`p>x_VxIJWF$CTaqGdGn;P*tCF8kd?35nzGPYrxT~dEXC&b za7^HKjFX7&P6N)$8#grpH*?HA@}4`U&;_OLGacF}m*^k)4^HD$hAWRHx$yPb@jNfs%r z5sNO?S`@xL2Tcl}Q^yE@d+P^U|DW`q)C9u3gX%3E{d3INa|tGi>5 zTwpKqBO@1*Me_6|lgOS?Lz|FT*Vg4uA$!J#eiV}H+S0GndPyr_-lSs&U_UttaPK(a zsz8>epy_9`(Nmk--%Bxf3QhSEOVITG927&%W@TTm!P?L3c>#Po7>rdRv6g}2M}OeM zmBua-qv>}kX}C5?%@e+K~`i4P*+V^T2T z8fTivU97yagP=Y+uC}}KyLZTl1!U1QYs5lpk$3vf6UY<~(MjUiDxmyi4hj_0)R#qD z!=o>52I8BO5g@m<3P#fvHwo$p7wOMW(p`4LoyN<-0!guBINcgAnBKTDElfK-I&W>y zl2t@-vPqF-)8i%z(mtKu(Lb7uh%TeiIjF)4VN$J9W#B+l?kBtXI9?ZuU4m_ z;ez&4@>6$+U@&?wJa{2q0AAc){Sx7+W6zU zal_^PA4~Q1osMZby%SIYYtOZWw(btpk7CZ)JjXajHdr@!v^--luv+(NQks^b>N*^_ zXw(p2c;Oq|$5X5ug6tba){U9nFthSnUH0D?|7v_`pe!Gc#PDENU~p7_I?ZuQc%0UN z^z{lY>x|kBynvUGE6YLbTx&$!5X6(~j1C5+>nD%{OTZCu@!&YSf!zQT={lo*1Fw0^ zvndy5Nv<{|jt)-O8QDKknD2pfbo{F+Xbi)aOo8i8Xg9cNs_O2KziQtg?0IM83+o1+ zWkYbm3Srao-{T-D;Px?A-lan)(@?8H-FH!b@s1^Ifu+dD6t>V*BxM&&I0$2JaYz_D zvF(HhPU}U>PED{uW0qtHq@9G}vQZE0?)ai3+w{d`-foQ62CNMjJ+O2Co6=6waCubE zhRMMWj_t4GQFnJ1zCk-ejO&=F>Uil-gKTG8442Jc;QN}+8S6?h%u?#HBL#q}m!X?> zP#Z5SF90uy`cPc;(fyk6ip|HBhnIDlfW zNd1_2WH9w6MU>d79ExDbY{<-fT3cp4h^}> zO^=yCD!=fepHIWEo(;qXkAW|(8zkvI69@_DKI+G&0ldA(3!4iO>du~$yIh!sYm^hP zm$Md94+ZNd55%HPskC{SLOwgi&@eC``$g8l9UP*htA`2OGA#^^YyT6dK_jnY3^PVt zttDNK&6=4h2w_kcs3s4j(XFv*txP;54KGQ98~VYTN!aHBm?k9P*-5B_ez0lPiD;`E zUeZOwz=Nl!V9J@n=>7}2C(H`V{ACJZY3@_7A5@ChId+8r2ga$Mhe9`Nv(e-yQW~|Y z0HLBJd7GL~gd`tx<4L#Ida`QngBw1%7~MXHlPp(8D-6Cij3%ERC+2c17VUo$JIXaABGv2SN}{@4HI|8sI}sfwk!(|6(4vCRjao)z}l+f zs5a`VHPnwh;X0%j_FaxQ4~hVnw&E%tDnIZvdS&%LLr#II9|z0)4TcPrS3iRe4Q+Mw zc+?syzp@7H>)T4J6Z948(f=&k(6H6f#ZlZ}rVW*VwY z{t9cTWOUG4_B8JAPlihB0pJ-tOoEr?z%Z9Thpttj2iBtf`Dn}$H#{_M^E$M$Y)NX^ z^vW<98Ri?kK&0L-8X6OA8j~lF$)jlo*eb)6u$__`rX<6Zn|3OrXDSWb8GYM@=2%8@ znsR7JIkbS$5G&jiD_1QLB4eUuW5S1R^H*BKe5_@;+Ay}ZVjRL%T821~4YV$OjMlEd zgS7 zBC`82>}5X?eh9rdE*sVQPbd6kxW8|-UZggPhBP8D6p**}h#M{SGFx>%TIsK}`z!PP zX-=5@X-=rO3#-?nwqKNHiUA9NO_Y4I3RSIB4iz$>lg-be?d?jWQ?#j5sOps4=xoAD zLg9JxDb!%t>ge|v{o^MFOK1NefkjW{e3< z*2bc#Cno!pd$+0Q6M@$t^bSmnvH(zc9ENq>qolpqyPtp5h52I4nx8 zFo*52cl}5Mo%kHqg<}-bRDlkA7=S&+sRJtvU|}Vx-SGyEdi42 zPO5uydoex`U@gYGJuJnk9V<*FsV(sY4VW3y;nBTfAbxmZOTad@Piin86P%hGlA0fE z84p?1I5z8z>njfp7rlA)&U7aG4uypybC0$Qk7B$%_lV+ZdB|R0n-#{8#8r&~C3x3W z>egn|=IF4Cq=1Jr%F*h0G^GsPV^Y!r=YYKT_gNw#fj zZt^G`{4fW-&jj}g5P&1K>GrlGtX0fe9#8@I;pn!*zIY`IuUvpvzJynPidz}@4i>&+ z0lwoUe8;B>D|lIe^Q#1J4feR0d4>V=zO#mG+Je?G3YKz{_$RlZ0fcu5YB|reEBx$b zCx#hhS-Um7y~C7yo==>2zSLgQ4W`8AkZ{a!`J6Zsj@7?V``Sp$w*0vgGR(EK$_Q;t8e zK32OvZffi>4`7%}{|?mDjLjw?8^maTPu+K39WX%Ab6`Ars|@WgN3U!`$qL*Oh2v2= z?2A1Q=)_osj*QY-Dyl6NXM21tPz}Yjb-Y3LM+At-UO7f3# zvQ!Qp8b2`sGXz|Nosc2d=&7Qw&z+uB0%tS9P5^elkEx{X>`qjxaKEw+#m|=}gF%;O z;lVTT(j2mMi8ZS6BBO(GU>8bf6)PHvs74Kg4yq~|?NN=*L$uhCnbkej8nN5 zNsPzQ*8+=~m1(b4??$mu(1%+uplA1>`RHr+ekP-;_Dr1nOgctZRNdN%R;C@QOnaj; zO=~T~E6etpl)6(4V!ckQ)X}qj&y2IXP}(i5Z?q~KO@7FM7l90+X?-K1Y}BsDaU~8z zC>WrQJC*nq)F7C*&%Sbg_YA1S&kajvyPLvySLV+&<;N2NKWfD>n9N|fEzlp+yIKQo zSj6#teYXX@Ums#%u6yoauqiwx9NSG1nLqRNpD~w9e=GQi7S5G;^epK1CKO+f+m(3b z`s&K{XLtHkmZem#PpRBkO@JgK<%V_^r<4P^ntMWf3GK3Ah4-=?-zdi;=|ws4Y$GiQ zd&srBqG8d{kUK4pz@$flkP;xiJ6H#S9>R`m1J**e$xyyms@E2*t(9ywb&W{oaLKMw zNhH_a^@}8mE2xopafz;RtS*9M2-zE`jXzKY2|T$#k1O|%&n3gtOv*G!g#!PEI_3M{ zk<>W>>cCJZ_AivAhh;(!L15Y*u{RJG2WsQCyYYN{K6gv?S^TvdN=GgjoRacMO&_JS zWqaF4%@{Aw<+?tF%|m=r*;gqax32Ff1XDO*u25KrHto<=4=#2*eT2edd~L-fHm$j9 z0`fxv$0p>2JfM#{`6Buy+q51(sYVGUj`5q1PGHlnS|*OO2mCBYlFxNnb3Umo{IRm| zMrBTKWzH9sIhLKh0VPQHjNz1WzR%0jv9G5wyXvWtl)|^(?$Us}L}oV8^Dm9ifPCrH z+(aWhGqJWBy@G?WW4OO$^eVn_TdKl6b>nucLTuf*!-5TI4eHVYvzcWne9@%vGZpT} z17953occGu#OoQ{f3{@y8p40Jz$n@EoXLMS@JJH&tVJ22%}Gi)0KX>mCqfxI0cP%Tx-y>Ht9u%?ZSrb@}0w0|3r&2;`Do!?@--0`ubU_LD8mOAtalv%7~sZ zOIVCn8DS}Z5to(%iWuoGKw*{ELlct}EFuCgsl<3OMO%o_%Gn338@HOup0^yfnNC!- zWns?e4sTO?OF=gxDyJ1e!%LdV;%#JPWtcI0@Y*R>7oA@N97O0AjQ7v*+aJR3AS1W@ z3;fo9g|B@Gzl)6A`Y-U$1AOSY!x;969&*}27~eS!S-i&@@jSryetn7w^k96gG7?80 zR4OCudPsEAs*D`DV?imXwUi5Sbi8#rJVG@7bv)dE4ylaXa}hwuNU>VOvS~yOV?sJM zEfQP&=U^N{8EO91-BK=sJ3vr2fh!}mA!76AEZ8&Y(+kadxz+Hg<;1s_&TC5{7ewQ` zxE5LgzJ@=s+Vvvyn6QDKf@yq!!Frr}h{7S^b_a@In_Awb9=6r8)c?{p@dHdlcYc<& z=~3s<(qef3O^&%!J-l{cdFAKAZ7ovhfDkN`_JnmdYKRP#<92D7{v3USY2M^Oi^LD4 zgXCAjk+m0>pX)3vw_qIHa2w<4MfH2@{NCh*a{(s$12v$1gs=S(KC=Vgi79;M0nxBu z<>$$7LMlC3I(Shu;#U{}5D^+p<=;?DmaRd&k`b!OUbJ9%-O%?b3EqxbKtSfI2 zo;N_}O$Mgf!ZLT717f_1mDlZ_H%QM>+Zax+ylM3uh1G_2rOo1bL$?_gUchq8%3CH+ zo2g_MQL+>FyrtGOsH^?(lHJgw-E$Q5M?l$ENvxjNEy|-Ne;>i1^;u8TGfV=t5k*T) z{)yTn!Hs`xZ)ce@FA_mZ1E;xap2E8)C9@SRPZ8%PBz(EW(`G)KVp(Z7dESEE7Sqa~ z?8-=clo*?iIoocrY~Sp)W)6TTX-AOxcN2OK>GU@hEh5nSh|!-Y%E0~W@uGOU|2})s zOwvDLZp5`SthtHl421AcfH2qsrjj$y6!@ag4M~_YP)+zJ+LaL}SD`@r_)Wu6mfR?6 zr-TLw?uYIEiJ;;5yVSsswx3zBPp2Lf!j{>^G4MPXXGR$+;R*;q!A~O2eI!{eHi1P8 z=6&!XX5n4jUpBDW8c`=%;|Ym@%paO!(P4!)bda-=4>QeOp}lkvvIu)RF)zp_w!<7# zI(VxF#lF{`XW@p)raz!3Uqb!LQJC4z?nNu}pSbilOMV81nbxU^b!Lb}PXD=%hw)SM zlkNGl$-uqjIt%6!uoPx>AlT|WFYnCHcJHUjqfg$M$Lva?9YnYe&zi^Xrw|kC%e;NJ z_0>BW*tBl4XGU`o?d}UQCa%o2d)wHEl}=*Ne=;EUd8%W%=69|xA8 zJ}^UKGY^!Zn_osTAIxi4B@uMGl|h8mV6KLv&l|?~N?bWujVWMypuoefJWh%;q|}|a zp3*AYaB;R&e^9rCP+pesxo4P`w2v-+M+Bu66d**}$CjW@OHrCBKq2omnEt`)c>2&j zGC+Yj%f}4lH!SN$U%S#Tf-R-&>-~Ifk6-)XzP97cW-}A>*)t)im$Z0j(e4`wfuVja z41$kbc@_0}`h!GfO#*WA6=1QULonKDfW7z#wy%vuyCsp%*imf0J?&$*6#@Xl*MPZTID3v0AI$iOhPJ@*?LU(+sBTMCpW=;93sPp&{LSdI$xMC4x0e0x+H z8JPy_)u|vw@`{I~&I3og3xmG~k|aGI&`}}`6%&}!&icG^P4a>r{XEGgq4)r_Uk6VU zv}qrwx5M6K8A=)uGVOCyST*cGw|BDIOJ6GtWTyKgcJyQWU++u)Is$@$ByGkBfqo3) zz`Vdq+PN?R?L{ zI?UBx;9ql*LbPZLZjc}BVAd!RXn9qD7)s?dbJMMq&$b#mP$AInyvEyImnc(ETF3R3 z*O}0c1d+RV;L7865V@xI?J7dqrUj83kLkCAZV)^RxF|E#~YQ zgkTo|8uM2D+`6^~j)mB>t1&K~U5{t)!v$Mf*GhB}!ey-_QDTp@!nUk^!R<591~xV}I{y^^p4kNhDf>Xo`gLa>!c^TP#O_wRsvLhwA1rT_pu@>}|G z79rS9q{(r?_We8P#*srY#cU$Vucfi=93JJT(G_}S#3-xrrZ{LLk8Q7yjq!gsVH%;V zhSqXpd%ckeJ<;k9)Y4T=aezZ^G$caph1ONLvYKwCF(hj6;I=yc_}aoKcOvrbm`Fpl z7KI#=Ay%%AmB*Ci3^U0{CTHyVD^+NcO)v&B$w-I^Nwb4Y7RZy~1U@B~Eaga+a0tOZ z@++z^^fDQ6ZDa;4zs&AEGdgAz&KUzn+XDvgrldQ8RA>REXi`8b#kV?A;L-Md-s34M zNCFiMk^zGwDcvdbW`IK~U^4;NT9@mVH#E5Gmur?6&K?V13yv((DxlJjQhDxR5 zhoq30C|z{)*7PG_YIF_(b3X7IDtQSBbPowsCI-eWGJhgEXKC!!VpTtcF#qn&2n@*& zOb`TS&M$n*iNw^BZ&=`^We=h3Icfj|&44Y^sdiRJO}dT3mOQK>bE>dR_6-Ue=S4nf zdL6aqRGmSMM6;74UkG<#GA0As^heZ`Qx*N5+(4+WqK;=kUxr&QGc<-7CS8!}wo>ek zal(T`3-Z}q>565`w$}dHIX5-b;cF0u0Vd+gsXJ(w$_%5ewuSK}pUz+fG&2sJhT|K| z(C}a#Q~G{;`&Qb#@{!t3X8SwxV}~61Yb!G>bTDQymq-npvTxvz7-xp1GD9(@dVx9F zAM!d=cAtB`m<;HIu=|KGdd$!`);fK_Zh{IQI8l<=+1T0FwwK7hp&=Vz(~D}0dB;%` z?=t3db(rcFSulH{kAU=JSPh7Ei9O)k$<2R4Qx2j!@}v%3t4AAdu_Ui1?b?e6%e3eD z`WX^#IuQcPBmE4+yDUlKLTf;$$#9{45XZ1f=dFVROSzH=fa4lCG&deTZM^ysD1-y# z*Q(|&1gIqp7Yt)~etyn_HsVD~6B zp6>S%&kTdm`=#^1HPWTWI>@&=cVF{OfZlNsKV_(=#$^wpV2GB0PGF;<7kBVc%j?mI z&V6Fm8|Wd1#Nph_c%~>Fj-W;#mIth6Ku^#Ew4ntvNH>ENm-!R5qk|sHWxfULhF#FS z4_$#5_Mkar&>RDWgDmd-H2PgBWp~Xi9V1;bY-47Li&HwBF_gY4;l}HjU$-*ZR-{El z@b63Nr$HB_;lj`$e(C(_L5nj_&}&%?XH4b*Lf|5>s(}J--TTSGFB&VH2{Y$aadl+v z$Y~;I4#*G0W;|SKB>0&aCK-){K(!IwLv2&1<5Re4cGuTufs?Gz1b^Kk22Kp=fd`F^ zS$b_qg_h@bXatDI4Hwk37-_0AvyIZ;Yjc?}@h918Zcqr2>7en_rK~|~M8yO)5Rq=D zom7erB|x2lQ4T`Poj{92b$Y%;Prui0G@N15x1n*(O-P4b@(+>SZ~=Hq4?CdK){EN) zaadZN`{dGj2S-7Cg3<4WdJXhlcpMlHK$;x(bm@E+%^)ewAm|b-%6K@-c(v{~J#pM0 zK%fV}4eg*Gz)kni`m42Zy6yR35yU{L_k$U}wgwGLGVn#i5td}v z7sr`r&;S=&5o$uI<7mJjt$l1AOtcQ2=moMZmj#w^rKHRYdIZtaMkpX7mE) z5X$NIN;^%042&sxgAHqHKO&$r+GrpyZD^Tx@(mPxy202E6{n5O*BL-Vx1SY^+My(e zvh+kr1rGM9!7&%mr2Sct->8CKf3&yB*(q9N#ZEzF&-f)u1Jw zlv1$Y(nym~7-j4_JPGp%%t`?Z8HP}~uMN0c+R8}(Y!Z70HhLFV_b}M46wnHmNpnbG zk5bxQ#Sq=(Q9pn?1YwVJfftXgh`1ymLX`wxBB{R$)nB5t>KXAfOj@bwM*+|Orf#4N z#>2E*YF_(KmF-4#K?!X$ST5->?%(DDn4y3i+SYzY5q%``7af^SuiyS1J$dz)+5doN zux0~{m^4K6CX+ZKOg&#@QQpVc6YS_-gR!^7M{_qi-Y{$BgS8&>6g zfWnpc!Gwo;@gWU3n}=2a4t~lGrX2ioJqj+(tTE?xCu1%SAK(8bq+&f025j()nPx9$ zA4$>glNjN`8K z-193@@BR}}!C6|SSUQ+(H1$m6bq00hYp&N0Gt&5a$~FMx+ry!e$74;}i~hqz#D zbm#XFaKR7VB87uzq}}>z+O4mq-TIxkmI42bhfVzZt$u*+!#RK%a9%ne`k&nRYI@qE zv1HWBK7n+{aTNM$K8UpVb^S!G5&9Vo!fL*qxYo$;{Y(Ojo1!87CRQ#wJ>3gK`ccGsTzy=uw; zp2Qv%hs`l96$2>%MiW6n&r?(1y`OA@2Kq80&a~Kliry(oX@5wQ`529+90`mC(40Ym z6hQQ7dVs|m%%^>{6QZXFn&nR*q@z1p{~k}qwKF@qawr`GnwPjk<7~a2L2vsage%vwlz;3) z4_ljIn;Oe6bvLVJ0es(rD%uy}*3vo#9y|x) zVyz=uIq()*k2_)&jMY%7mgsoP-$Y{!2oY2@=7bTcgBbF47az*K4} z?X_T;*|E|EpU3sVlE8xG9ue*@T^(aZ?@L~AB7>?@-bP{AFxpWP0!^3dWie{Wvj`54 zyIIS6M2uKus?WXH3sovU*Kr&;iY(6a;7TFpgxHvxa$wiSa?#iWgRX&PZj8b3bEg z1KELbO3r#rw=E{b#RAH;j&bOQ=Xya#&A|60E55dzv467m17Fa!@sSvKTw%@o>4DUk zzrj7b6A(L&zrtz?)wO+p>+EcJtmqSIcI&CDUcHr=3)^5L9#==Qhk1@GTR6p)_xGsWv2$N zlklYc?|Dlm*|#ar^}`u8sxfS2!i6>xJ4xwq%rV19F@-FAepL#@-@}FtqJ*0_1 zeQK+;DhZVimswJ*9XYE0&OuPoqs0 zcYimC)|LsisS<6fyA_R>L?GH!kAeK;_vN4sa1es@_ptlB+soa_a*t*%@;H`+$|=%- z6risC5pA09+6U$Bz4F@PX+RqgM*K=xefzJ3fv;&nTNS!AeGHDy#Obj@htO?+4`T6W z^~9LanI^h+ijwAOKnZIEjAEvht_69L3U=<1%4JWeP1D^h)5X^5?&Ne2iMzYqN&Sol z9A32nj*H#yR0!4{Q^z>cz#Ev&Q&ka zD@fP4?kJs1Grw+*WRu6jd~C$-9B9Z*i$!>akgNda{>s6_k2pAoQGEn>cZNTlkA;03>Ei)nvG|DTX$^MIZ)Z_97@hfcb3CKFQil&?Gfz&dy%b4L;`PP^!RD)dzNz^LX1Ca?_(Yl}IWk=kOW$-vOz?L(}N zN;P1F{g_cOU5vlK4CX6LratjncfO%-t2HOS?Pb{QYq>%4;>O+XmYG1~%S2>O9PH|9 zaL|Ywz<}{e$KWA9c$^x(f%D?VhM#kucN8l1D< zIaR@#{r$37Va$3LsP$aW%NU0LhLSl9H-T{+SPP}PgDHsO&nJAMH4SchCrP%72&Qtar(%oc(?7f_PP|FyVU#Vpk2GF`Szb4`<#| zi|M`spm< z+SL9R!zfvg5B*?B>@HqP)3dv=H@9p7u&CX^qJvW`vhdtZNA_IqC3xb%#57JR7Z2g! z!7jDK0?*P&B7{qXy402iw8y9|Xv3j46S~QQZn7$?j1#V3 z11G%@O^If>w)lO>P0&)q1ON>$u{;iqJjz{4;sy9;LdgJs8EI%)V&aSXn;}x6qTet} zPVp>!@%{&we$hr%=}Ymbs=8gUvbkFinWrqVCCkH-7nAU_faKI*NfYI$Yu*O;@KJ-G%;#)`2 zi;Q1(jaDCn!*+&o*LunTuizrkALar*J37^PNxT#-eyNAYv(iR(jbwrQiz7l^C0V}s zIZD#vtA#h$dZdtySw)!?_brfg>cr2sK&t5+XuX_Z-6pa{zBa;-35{|in362%87ItV zzz=hoKnE5FtU@$?;|w_Toe>Ww)r(2ReXZfbtroOl42L0&es>Q7%RMJsz~4(Ydc%Mk z=q1Ey$gS$_3o@NmSK)}vjNjs5dIrX_vRCAHF+QK! z_ba#~*#JDfy85wkgM;GJBM*2HqJaCDFU0nc?!Gs6aXPyR)af?{L6R;4g+qF9c%oqU zKM4x*7td1cKT<8u9TDAr(dXp_5UxL>61s(?ES=;icmiHLd|begj(wV9*HRY6{T5$f z-jp_U_?`QtuUB25`DYxoKCGhHyD0=3K(>M``>Ez-$_m$m2D1E4O+96YYsx@Y+^VVl z-58fO%cn?hjzwx-rI4CK)RYZFF2v!x`yZ`7>hVjo<4%G&TQa~-c?zv;)R@?slH|&@lLOP?!cft>Ne@ zyHjecJH$Zy$LN3f6M}&~A zcD}4$foq*FLszSxSp77F1n1~!;EE2t_erjkXtY<-DjvD2S->T`O5MBQMlJUy@Q5w8=eDo*U1?JN( zu#$Fx_;_W4X!b~^U+OzlGEB!KnwzunWN@G8&Z z`)m&cNwTruq7Ka-u9FTPdJBj%{s^Rf6ui=Sc-j%k2<$j zELv26aV2_AIcjc} zFlK%2YG7@4>eodWThbBL{|-9Ch}OV=Bp^fQ*r)OU*XUGSc6OmuaV>_~^=CLSbDy5; z!8&W}YZ4uinb!xpuL6D67lwChryfH5aj@}Ej;Kn@^JrbJg_Yr5Z#u~ZKH$#1UlON$ z06fw7L7rGrH7!r$Gxb=<_!XdaxwLM4enZ`RaMlYpWF&9@Qu8t#ytz+rto#mrU_#oz z#~mnJk~hx&ZxJuOojwcZNXTaO%zy;isTAWe<57A8yz1&=s%3dc3hvG9WCm?sp&$#}<(M8$^1;zaQJxB&s8& zdj^cZWqJCpe-G0<=P{Vg|3}AP_4R)-{#)A>xvu5A!#ZB;fWi6V!r8{* z(ud6-`aOarz<3hA+Y2l!Pz{R#2-TDDAmyr`^11F({fF_KLZON4!P&s?*kKQIl7ntj zT+c#bF4v=2<5|Ep1v<$)&5~?E_V!~5%&vHt%euy>!kIViT#r@7h4ZhiS`qX|GM_7M z*}*Av%@1|4WP$(egIAnJq0+O^wL{Z#-I5&-YiweJ3se=(RCereR26HWvi16^A1vwd z&jTr3$LmJD|wziWun(HMYeINz(kp38L~S|QBMaL)}=Dx5rq z6hg&94@Hm?0)xW&vs>~zMu7zS4XjaLn})^>aF9o-`$6I4E|;?u3*8;S9yS{b(qnK< z!UB38>_+PHTShFIG^MR0pmS@HD{rB1GCOW}Z-rd3NU7+kEs3+ zbQqK+-40vN#XLQnojZ9D9W7|MW`=V#+tg}2uu5ULAP0~9hx+={Q`{abixuV=B}Kef=+=`yeB1#qU34{uDS!@nLvfV8Q(;~`Pm z#@Y`t_BRxwXE-PljA3xv1af(BvSY%j;2_m;8-_&$R#~R@(3|P40>0!6_hE+M3(O01 zHIMHdx@H!PZPQClq3#xe`@n8a84Gug-{0+7#_rgs6~uqolWhbhFTSR`flW^+Pmq#} z<1L}?w!IB?YfP92yslu%@qor!fk$D&-v&0o{|8wd4{uHCN)nz*D1nyQ*K{931I>QS zJ7Ggd@hKlzna~KnYZzGt2;eoz-=WZsZ-9NxrSaBK_kr?+H3{XQ?uv;790^}yyl8AuTlXWh)$DV$b+plK zfL0e_tx0Ca%jv~tmkk^)GRy!T(#oL6fDd+od-n!-wTYG#qI5ae^tSPRy4}FP ziiDDcvIJ?ubHJQurbelIdEf;tFCN?(9_l{6LsM*bjkjmSlcDZdl648BdmKXSdKtQ+ zeIy!_Dvn8Yk4g22NtMK;x+UZ%R3_jK{~5E=4TrPr1`3kil3XM?<+f^VO6p2+?n?Lk zl^*&<`tAB6{YvekcX zFQS*Mx#chBuEY2IoVu>jUW#Mi!--O|yoy|BsVrAtseu=p)fc1Syt8H90?WFEmWoxE ztQb~V@r0=&Be&FX%nf{|T%AiT_31yT?UwWc|a#^e}R1fk7NEco}A3gaITP zvunI_2~jbLlGUI|HUT16(dcH4Au2K{ z5j!CPk|?yh3SOA^+dZJf?DN~-^SsaddH?B|?z)|-I(6z))j8iP%H#}(@wR+AEq_}6 z)bbY=xGfm7AW)26D{AbUpk5k z%3_1wW$NRgJ;N=FO3h+Z-=!PkNrlE(?|M3cPJ~=XiCnNlg%b{T^rtg2mYro&4#MF2vxGORGAIkg+{Ukd) zxLG><#_BZn@Ch^es+T)S<`{}8#|Xuv`*rXY93BK?%nqj(eDD63j~M0D))pm1NefT# zSu9V+1{hBsBNBL3tg};WlH_67sHd7K9!MpMP`@u)< z{BXFZdCi#0pS#m^B8QFap#ArkGb>_gS0_46paS%}TqtL=Ky-*!h52rdCgOPw!b(ypBu0E}LkN=S_@ulPhgvs8L5n(;h5og-O@3yDxs}bnAncShv;W7_B=% z6>2%d=(75qa54T1cFWvNjG>lE9PP;c5P5UgykqcdXuM;bk!)P} z3KMmZR~_UduOJ-Gm&fjSlCgB;orI`EXhYdVmyJ4vZN!yl72336df*{IS|Eb7xPgwp zXW4|Cxvh4Q_)hy}9|}UD-Q}7Cqw`TB9VynrRSOXZ<11LgzU=v%9MQb&?!QDB{PP6; z%v@o77wP7EP5b%3K2vV&7t)id@m;>))lOhRM}pX>?Sd`kyYqBQ5Jv~k9SSN0}EwsZb_ zxmQA9abJne>;vh;1frcB-?lr4j{HtUc426TeDp$M5M>CO-FsymCjOe+meu?lWnFeZeL4S?FXM7_}uJFb#}BYM_fr7 z=c1S)F(4oLEkXu;-nGT8AKb-e(vbn;A>Jy6IYC5lnKc=(Ys;{o-a%q0cPL=^pf(?Ncq|uIN92u zPT@JPt*zh(oQvndW&;}ScW5hYL{oK6ZGu_03anGO%11wAx?45RGKi$N8ZVu0Dd-_T#O4fNh?Ox!mjW)lHUlmdV*U1 zj}ghOzUo^PToVHWxO>{tS;t!5hi6RW9n=@B1w1i#e0ogIEE;|bpsvkpzYy8Z6Ybg; zA0a0WkQ@0uO?*!V=J)OpU)c-vayfw@`+JdNo?ERFi7UG%%DkY_Zh!^g8Y+&fwC|J1tJ`b8n0Q(+oIVB|A0B`Or{U}{9j!1hHWMQlL&V0io#o2hI-G?@ z?BA@6u7wJSa-`Nxj1&!#JHuR9L*(~wDx>`r59qr(tpT`-s|1B zUwJFEa(YIHXxq8Vyj(P<5xSz zF6HZky=5uigv3aYz{=DziKm%K>GY&k)TC=x>$Lp*X?t#JcibGCb8|vMa=I|;7)F}R z#7BhZj&q}qv!jk;SDSsVk{Sgc+ID!GD8|l%gAw&yl{jgdFzP7cRM?%|uemqcu1QCw z^BSdN&a09?3bz_aUZ=F_UfNVIj=1YyloWD}^cd%-0cCkyY;0cYU*2540ZlxDx-1I2Ny_>MV^ahFmf7n(rypRI=8LH%(~myjK-ny zZHO;^IS=l3N!NJC+$A;ZVKPwsQuYzE>lAY(>4b5KEo!)abYC;Wv4@l8&y%a1DKK>1 zC>lc>?O9~4E=ow9kXsFCpWIoH(coD3@@2RGen{D_mKky3-{m>6FH`C&8nga0E24414aL>OaNtEet zJP;F=pC4SrqXp>+T0bLUO$A+>W*yoAuBRaze#tJD~YN@!4ge z{EI0Uzg;dYag6pard{q# zlIo~6Ibv9jm_&7)+Ww6+`I2*&y`Z2INj8$>2`*{8-)BnUuw6*>Wc(+Oea!0PU`ESY`5&T);o>vUpi5PIcFMQwEPTSKYc9!ylF_Jg2-6Xv-#8Iu=2-Z;DU8AYG!3A6x zwn~DDd?Hot1QZ_OiByrO*Jfb?Yup|vD?+kPFe=rROjpd@Kf4=T#Sw?yafske-fNL? z1RzHIG6-^#dy$}z)PCTpE%FqJMhJ+oYnCY-ag^-q2B-oys*`@l2EazUgb82(ogx`t z$lb;y&EGlNL-bP#e$G1CLPJP;lJ(!qs1DM^(WV*=y4DI0aJVNWEQBnv)RAtDrBG)0 z;d3Qpzk@l}+ZqtT1$@gJDh1-Gdy%bCL#Yk|n1>Cx*aY3eqC1{+5 z&|k)!-l?FQH%8(!L>`PBwBuFUF)Bu`gQ?XachF!}H*!C*4|M5IKZ^kuBu<#n-D+$4 zW(PVXm$ffz>0TGvxNnq7ebT;c`Ca^P*Qy-p(W#%Z{EL-u?&{_J_txF{dfe!aA9t=E zAqIO<{(I?Q4bIR%%+aQL=2z)x=n*Zd!XJ00j;V?t)~QtM6?IF<8D&#o%~8L^x3NAP zlYa9Z3B>fCE9ucWC6mMc{P`NJ1MRnb7f~S_b?;l{?N$igq}b^9Bv~hU+V4!me0&n~ z@hmrq4BUwCb^y>JOL z;%RbR{gmS3q9sM)(Ew(xU&7a!Yvhmv+UnZQZQ@fn1w?XR0Tek~bx~ z0rr5YMN^{d?4UhNTkeK7(k^i0g1xjqx$^#Dg|5xR^IL824JYv;{}ueh>c|cc+cn#J zn+efBtk<(D-e$LbefYN^xpWEmecy_aWlr)-`?8VEPN+d;Joz*#&^e`{p?--PhsFcx zy6@V)4m&fLF5tP5Wg7Wq<+G?~hX(W`G5J#86xgSt77Y!T8tdVMl@}h3Geqpyhb>zU zvJWt?gmJ+d2ms#y0H3ZAg1s7_7X1$ZV2$jRr03bZDe8Q<&Y}WMEwo6jpTH#R>?SOqvR{HDn&HF@nI%b z6O!TJW{P*q>$&xTA8n|i0z)zNQ7*FeZ;jWp!(Gk|U;qBt%0;_oTGF+n6`kppH@63N zzFE1*vTeId=eC$e;i=)Ap~j&_%R02M=p1FJ!G>N+50?1NZo>S!1Y;;~IErY{vkRa(XJp%YVR8;A$5CL=NpBKEP42!htgt( z7xvIWkn#ozz4Y129yYj`bvHjJ76noInpi-oSeU~sPsH%-QLjJP$Ri!7{?B{W*Emx zt{Kwv4f&ZVKY=oWFB|3OCi%IUoDaH9?=LKhu^;%5y zQK2a;s#rsjW2;&8EE98%Hhj9##f$^Sdim0NF@(`g$~U|kQ7VP&!2w(u#NQ5Y8zDi_9)v$za1%JZ$c89brD zM(DO#NmE6+E#G2ZUpyR09YV@xA;k*v)tVNO#x=CtHm z3~_NJCyeB9RIhMMfXUBthELg%^&5vbHF{MX1!SocR>vnZh|->_Rg7seV;aE*j3vid zOH@F?#xj@>@a>lKyBQi-dX*a+SJ~s(dEk<_v%!-Yw|1<@NaZ{rE>x;eIFoz^$01k6 z@o^nJWCYYton4oYc`ri1vtnTv=bj%Dx5i@MU2mY(XyhH@tHFfyiGW>a;a zYwI4byIK{`jRP`GjpazolJ0T}1G=1%ya3$lxW>8pjb7E|wsLCGaFl=YB(Z!7}o@-v} z6|nqnY`mA{B+aMM81q44zLva_ot6Ic3*t(6|18eW>(H>p6|cc$g?q)ka@k$MPa{kY zi;41G`om-2h<=`ch7vsuv3>-Gn%2_?1ks1>%}Xf5u?Y0MLE0WQM^PZr{q20qBMmhR zpOTugoT`f-tdo0`Im)Y{+`5+{#|7*lDo@&KG}UZc4U@i!@zWHRFs3ll<3QDGtvJpb zDF$zngv>w1^lUC9%(s<2>viU{<)nvX=v~*tmYBtmP&y=(LMMiVik@={JE_rH@ylD> zxKa58zp<|_a!65}DAw15r`*xzXcOnh3KOiY-*ScGeE29hgWl2tY0NEhM zkP9pdB<37K9Ja)k!D*vTmH;m|CUWx|)jRrod(fgt^c4S$A@_rRMTA49M^O~nB@5dK zRh_%VH)`Iz*R+A-1hT7T31@w|?LHAH3h)h~#`t75}k(*@?RjUMx&)$Y~RiaP0zg1hMY zxmLiSr)Nbxl_mOl`|d4U>wEo&>exf>Eq)6$^S-pzI}Kaq6Z4Vp+j)Lea8}*gdd=26 zD%~9Ml)2KcPSfgYaoX*6h%{%1uP+>rJ#F8H;F_&(Q>kVqW-}FJ4ldtTB)w*FFo+nLlg;|3i>)>6@CDFot80itcY)i>Qsat(HfMTisjD ztzI{es*t|Ew{Y$3?jNd*r2D+Xw)Mpm7M`_j*GQfhLf|If8sEmQpM{j{n~8dnG}kp!l|Ay@DK4tRER1d#i@uAV*^l*!t@B9jt^U%hbw|*q(8$WEmL(Wq`Q=`@ z<6yHTYXYRlVCq~=zoPdl=?=B_C2Hb}RVPW`3X6uSo0|{dmc-9{UlP-Rz;Y5W<5K_G z>a%PAVsBYea++vA;nTc?^r(HsuE2XO(O%xlL$$9tUoo zR#1n{to|BTq9i@F@4K)4k|<~*GS?N;*uBD%3@d!CN!l>S|1H?TN>uFcQmPXaifRM< z+{6dpUy{H7UZJ>T;GetlnX4l;=`q!+L>BA!EICn($k%fBp*Yq*VO91o3^Z1=plwS$Hk|bzl1re^u6gWfz^# zy4#l>_L!=_j+z)e)}AK{c+@1HHb1D!?cw)Hu6!KKJpTS=S9qGD)pHY} z{11i={^Hz;=G~~EeI;KJyXIS`n&E%L8M5kL;1Y4TwQsvG{BI)mLY3rI>**5Zt_;QF zQvWkiuj7vyM@>p9YJ;?2idP$!?NM*AsyDPXE~N9gS@9Q$^B0Nosc8w9^v})O=(}{> zwsqWSrgn6hQ|Pb^x0TsGfN>9#8dRqDqM&Xmqq9NOWqdC?cACrg8xR@ zFueR4_w;7oe>Wud zmY#3O&rJFGru^I}KR3zG&APX(A&>jE&aiMPS-=xc3Oz*g&fEeS%K~l2?e%JirJOsU z6>0+&^bUsn}KHd1FTNZsYh!0Q+vM( z{Jr+0Cy-uB9CCw84i^kF`AOl}_v2UJ%Jo*ThM5eK*I1eK9ze)ZNRGv6>J1UeuROsa z`Nk+7$>9hZdV^06m*a%Xac+r#oC8^sf~XSKOk$jGXidN2tbZgu8RyI7=sb|He-6tfM?HT007zSSk6^r9X|0$2C>yHrbh{e$GDNNY;?`P=4ESilB_n< zqbb8*9gWn^NO5AV+J+an{nMqx{0XK0QZCs7BJ96xEsVd6(%JydYT{?5a+Bk@G6DNfUlP2@d zKS0%QlU;cP<9D=kJ61wCe8WhqOEch|uGqW96iv~i83iwE}PjRB3IN^1VF z8-0Q3R}pV;pPhWGb1rZEPW!WgGJc1Z!3KZyfH5dV9?DN(TNtdxf(rt|WQCgz9@7M~ zC-)Wx-CS;k8gCj?>Fis+Z?+E`5N1Wt^Ivnu3@*e2{#najF!IhF+S!u?|LkSoTts8w zP^C|`EbJl~tAFB#V`>^g<_$o#4d;_X_~cMf4u%HBl1xvL z9$y$D#x)z83p-)2)Qt`JBCqZu9V%7SMLBmO%EqeFF6@Q@F&fH>xm<_5%C6JSU5K(V zv-dj8!1sibF*DV6QtH=42L_E zA&hD8@?E;+QwOdkyli;?&0Vd0`jd=*7VW>8RAS3-)oDo(i-zgT*3<*SXLffv6Oem{ zdEzogM~M5Gnab#yfD+=LxSTuQ-l5t4v}l;U%>FlvvY?f)1mf5mt+#B$--J=!02KWJ zHg3PMi=nNK+ov*GqaT&F%ABvb7cFbKsD2Lnd|(o=6t*`^x5|dAVZ@ICj}MY8=xOng z0ZqYnGSBr0$>Gr*{h)0ox?g6>9+^>ZnC+1w!mdi|25I3A-ldYm)j#(uXviLXg0Ff| zk6g+PYf&VPuJAyNWVo zm6nrZEQK-Ul8R7OqOEksH%lP~PN6&Elon_5M$<6*sSjo5PGcyyyRm#S%R6bC{lxT6 zD&P(()nMs!ar|3&|6dpWiRmY)(9zoI;~%7_<@DP6-#FrnDRv%NNRIX@F~dLy+>u_3 ztoV|K4MKeywiNxpu6hn%r39^3lqP>mgOQ!Sq9@$kYP&Uix`;5lHO=1ZS^d}A2?|9T zOSwyQGN3c=Q87)TGn0pnftYefqG?Z~%C&Q~v$iUKDiffQh|f*83hIRFLb zTWnkY>M4aGps3KbqRJMnRIqrjv8L5jy7O**+MlNiZnw36djy$?2#_d)`?TCpx9{}1 z^qDy1Zc<`aqF3FLN-|AD;LA`70t0uB)(B_?UWNM}B;Jy+0VfHj(1R1Ch%!l3vr1x{ z78Ml;1Wp5rfN`7M%C4~^yrh_LP}Xu_jEoD+2HatIRq0sJM=F6lSauf2!7^2txO&6T ziDK{#I=GVx{^@oRc5SrHkJ0G2;d$B(zomz7)uuj%*j(^Ql+b0b2N1K=4O|8eYwob1 zyV074ovJ_@9b_`eCFeaJ-HNdUa#1PJYKhwwcmG99nS`hg^8132GaY;bIfE22Y!VjS zxy@1~sNgRgQ3``_Xpr8S`*#VON2;dGDb1mLS|@ZlF^te&_oGZVL{lfsR_NeR?E*ij zcg?fQ!nL7(Jk-_DP|I}Et!j$4cQTf7s`X~A#NRHy<#cFhwZ-C6_;^gs!udO^mASq4 z$|c3K|KJDnynKbRXRa-PtkVgZ8zz4e4irz3j^iIRIYWwZh77sq{B&e$N zNBgs@ZZT*_|7nmSY1k(Wq`-FmCX}3J>6*H5AXN;?|ue-p+n+Ll1eh&a73d5CvBOl%zalH(6s4`!Jfj&Pg++gu^kRK{l{64*^2ifDZRG=(4@tF(h z1Cb3D=xF$iEGb?krIgfw9y$C5!n=xW_Q*chzR~IcoZEP+->_@5zHztbZm^T8+FbA^ zFJ~<5!A5HZ7a}!4S8H`+{ctYrWNw**cjZzms6eSvs!?7K3PVXCNoTJ>|H_5+6b6Z5 zcR^i4QL!CrC*mM$DULi#$Ye|G-DNkoMz(mO(`pOs?tPGp>Pf&?0-v8mK3$D@q*R=w zdiF#IN%Ii$L6B6F7FQ`dNyfIgAbVuSujx_i2K&b$Kz~tUvx-kKB73Pr>DAVScBEY&To-WaLB(kQ>NxsV5*~;A>B*7VFZ(eM1 zp3aoK^Z-Y5S;JWs>_sQN^@3=ese=#6zi!_J&`|F)0K)NY)lT$y=ra|3qj&DD${>8E z# zD{JE~Q{KKS1sSlzfu5T0= z!x6g=^nggIl>1E3QiQAOCuLt`v*()W>I^zv_tkJNCR2dsf%hZWiMI zh?q?m&3yc8E8lW@sMBL;KQjQ(=8&va!JW+F8a3<9M-hiN&YWt!@W?gl5#R{6U%J@! zBS73P{R2pJ!epOLk`MLahmRbV5iDhAoGHZvGEw{Of64I><+j9>9h=24pN`eNS@W*t z3u~MaQOff^&ms^!0|dmFMqmA?HNjH3j>dUl+vyF zmV7GB84+c+$}DHxVq$6zuu6bduk%|K;rA-Al&u7FGK*=@1YB|YS;hOk&P>{TPDxH= zPiC=aH36?Vom29DuL*vC#P`9k`_?(>{j$jkxG96vkKDN{`B=~^+Q$v`uG#|7^2-+bAy{Zp- zXKK(|y57sY)n+?nYx~ls`^siMy2E;OhwbQ&rlUKwzAvKI+UW{uFNq1b2BFCXU*Ll; z+R77|^b2&r^$@bDD3MOTsNMSX&4%aC?;;i#!#=`#*;eu`(bVQ&zHj{p!vs@?keU@! z)RZF;QaF_|VgEqJkuzmT`!dq=4f&ZVKi`y}8|CLF`MH@6zWAA|cEQuf>Xp%#?Ii-S zxX4;wgfc2l*ebfEVm=(knew^Rf|#O;`^DtT#pF?@d@6OT{M;r#x69AB<>#N}=U?P! zzHCqe-V$*rCZP^xw(`Rl!Yd;~O9OM;y;iS~gkarM?7tCz(T5@ayiV#Q`L_VACgmYZ zcZWoSbcY{p90Krlh@_)dDIj~ndz1rT4jW)_JddflHCtKxXUT8rNBaYUaI_49Vrt;l zkvmO+yuhH+M%tj*1Z0G7W770<$j%|_9J04}P4D$BYmOuS(8!h)%H^?TF1H{0EC$`M zOyBZXEbpbEg9ONF>z^PA9eK%I-#gbbe;)3@bOFk*M8+>7$}t9FTjux9#nMS0u#O7C z@IlJ!(#1>vkmWFjZ1YpSYnq3*Jfl7h^EZ-+ehCXbO4+Mz4&UVVlqX}Hxmy(xpQ$x9 z@#;?DqFdwmT8&bi94dyb13XFmo7$I#MZ|CJ5pc=l;tM#dhHvr=EPU1vP6-ux*q=1h zEiUT|acA05z(g2ljg2Xykb~cwF^^J#>tIkA|K^str)j^GxJ`**F0l9B5ZW?CMv|50YKq&ZSG8dg9(k{?x7hxkf+kI2&DDO zLZ@>o(({3^c4rfOWJ&#*6C|)KsaJ+zQ*360^};+m1<5Pz#)_UXtX~!kCFa6CY3j+W zsi!0n%**QZ|tOOR+4WI=btC1 z-6}t~$xqn1BDc5Y=bz>0U*xAlzMcP;z&#A1`9f%ckde=26h!CtlPU+d>-gQPEc-pO*{NzwRR33I~wTDzBk&XE$J_Ezf+-m;SxGOU=Zt}P*zCZ5t z1LJP({c*Pz@+-)a^j2RL6%>WvqTEf2odw zhenX=sECN)#937kM2{S`E#3otc{Llqu?hIAQP2}N@qQb%IWEA5Ef9!Dx~DBZWGyZ) zes}$0S0QM%kOuybDX)+;=ap2@YBp#Mn?|!iud-=7*r2s++Bo=q!agI;ITirJtIY})&5&>L*pE;cBWP20@|y~(D1zy@t((>`Q_ zHnC||Dy_hwS)X}SnX6Zn;DE_*H8c)^_-uGn_cTf2aOH!t_(6hTL;!+tc4(Ff%9aVD zWP);Jg5Ht|`jbphu1wGtnIMZyP@YWCR+*q}GC|vAg5H)1`twkNXy{<67r9hv?Mlfy z1MJWof|`!c*iCA$dtfdCe_Xb9OZ@Q|Wt_=63`G6}1BhmKSu&3h{^n$yJ`VjVg-KoO zP*sZ#;Hs5CN$=>kbH>k zr}VDri~Bd}GghNSxj1>j1)bS3k0DFs2R&whKn1YMTo zrbB9y)_rCGg7SVD5g8ZQU#jUbyH%uz_D4VqV1R(_Wo;4YB%o}lkc^2bLf{sR1HA%t z{9*`5mARHQtMOshltrcXnLGF{C9zXTb^Bipr{z&GIDRlX>Q?oxsasY55`#$h=oly$C>lMK`yTf1WM|lfR84~V%8~+N+*?NDvnwdd zW%KsRLs&lrJfU#-QWR=v*A|?3F!2hl>s*-UU^pMI)*abJ=!&fsMUZQr5Wf*mP2=>} z;2v6Zrdky(Ves}k31J@#YcAk^!jxd1cRKk2tbOT_EKHdpDs3kzhF)YsKW0M@Q=u2S zYZA>^$AV8XE@~S>ZZ<5l{?mr+>6R7U75-h!`uB&irqyifUaX}Dbvn~(S*P1YnO0M& zyXEHx^7BLaX_cQP@{^IDd)Uy6+B+dP&pzA5R3Q8JkE;20h@YeXyyfS=6|J3 z1yrg{ex8({ocuf`KfjQlr{!lY9eP3AISdB348NiU4%15o)7}KrzHQ~a$77ZKfC0>J z)l}4IjAQ2F#D1N68mXeJcJp(##joW6SZe-FTwa`@ehjx5&wE|xm4r)vb>uMf4>=XT z*DZcg_wrI*?3$4=_Fcb>BY$fQuK*Kqf;SS zy7tJT)m$C}j8F&wF6d0eqG_!Dx+DOO1JUiaT?joaWL&Iu0x;cmG2>#c zT{<(qs<@|&KTHTrTo<2~pnY~m$yK7@JAw+$VvP|~_v>O0gsh02F%>WFmSVb`DVtIh zpO?)UtF$3AsL<6Bp}TRRW8RYPC=Kq+@hfP@9BAEAd!e;0rlx|avC)U5Cqx3%OTzq2myQ+sJt1CA|0G#}HqmqZQfiBYD zX|uaOBc%P8q~HFtG6i3jebFBmbLQP2asm54KjzFkUq$0kPWp0j{?%ANuhJuwAFL8! zS$&|=J1~2CxLI%W)vu@3fyC5PcY_S2B{5N!f(2LSA7N9>G38|?F_yf7=cWbXATc}e zYQ>+di_2}n<<)vU-@m@td!61Kqu;(IV%THa3#vCzKylh z6!V`v^UgsgNEbWF=fKDV*kF&~`n6FWmLsUdd?#|)mQP1W(JW+XMe!-SvW%So}SdPb)lwPG?F~>wLD8Rn>Qrt`u@3p+7 z?CKe8<$q}}ol=RqTDMzqlVosBxm?%xHIBNz9x=)1ppT=f(O-Z^DSehDg$W#~UD(Hl zrkA=LFWwH2afKoxNLM$kJIdM>72zNMzRV``2G|6BFR_WA+;nF~jRK!+zYsgg z`S`moXdY&g&y!;bM^ommwYziC$7M@SGJ(G04CmDaGRW!4HsZ+l0Kwc$VU+H}C_N~R z(g=*watU6feo9q*S$6J7I}^GZkZ_^9i~OQTqxmIFk>yjee;}505WAJH#^o5jmnZ3e zx8G+8seIgTfzuYX{Wz3I#RL0@733=xziQC`k2>$J1U@Z809`9>FF|5mR?x+CTA&950Hu;sqqtE@d^uZ801$Vy*{o6<&%N*j_@9WI;i zm{Pah_p`QEYyI#lHHgP?FZNeq% zVwi?>rTkRdmlUk}tkKtp3yFkhxb3t`OO8OEk}u~b@9>|9B|j6rOBj3z+(!lOM{@Ua z09=G=D65mTFh{}-^bGCV30-Q@Sidf!?8@WUr~F8)-~AL-G=V9a$QJ3iqHp-3D?(9Q zdXd@u77WMQ;5uY`>s7e&TyuKF;B;){!a7y!vE#6>cTsgh#>+Oauruy!mNr{H?it3;p!?( z)&Lsh)f!w=EJ2S0ugc*9RdvuZrDF*j_#QJkiZ1bgwZ>XHwiy1Ar$8qBub4GnRN#BU z{!W!QBc@$Q3GwO(Z;MP|W!Z zqGO8WBbDJpPkv9_>u(wNYLWGJQQ_k-MFK>*F!{Z@kXI#7_KrDijW#Z0L`V3>d;Dq} zr*0=*dc(IbqMm`%HF~@u5|8pvJwmX;+T6%r`$zm*)qq$r3(w z{vRULU81_l8l};GIEvB6vFe{@cXyX-_El(@=<9V$&VNh@AvFcp2ri^X@K6`;#NEg9 z(3s!p9vK97ko>Y!&0OkRTxt%tI)Yc9?p>0-iU7MbUDmZs=29Y9b(h5WKn;1`TTplL z)|VNpx$O|#+#^KK+2WUH@Sh8R|5s^PRRf>&{aa8o122B+E@sED9U zcp5jw(<#w5ogz9|5{B9;9;Oq^do>}-?pBSiHL?3I8anMNkcV`=iG3Pv zhN^4Ju#6GQWf(mU^gCL9Ws%hAwZKPathUOHmCL|TM zAh36YD?n)PA8h`Ybg@%`yIN zlCLG^b>H%xzTUc3R$ZPo&L!dR{p*ZbZ@9!JWjRuPU0e&k>KLW#1L}2$2X=EmuHWsV z?y)OUM&WjhIOh~~oOANNPw@?Rts!2jHAUU=`;=ur>@UH$ALMUx+NXP;x%Khe_$K_< zv>E+Z8K*5ZzB0%7+JBq2$uOaKm^Ncvz^`bVkfQw+ZF0Q^X@l%0<3Aw8J>9X)qO^nv zW7bq-mSD`%MOEOQ&lON-QgqiUR^YzR)Z5qUJ$Qt)R;<9qEGYowgT2-Y*c)$M5z7Xw z^(|kyUc>H9+vG+ESQq#`uF2nO!-b^P5is7Fa+D}?l9X)H6?u;%c@<^4R*j{QdHul= zxSXO7H?+)viDA}(HN$2WNq2?-{w>PFs4Se-ZY#HGF9BcCLaQw7UIi}8D5A``E{T>- z{IbfK8RfVef=arFObzZGbu0%bg~VKw|t?VA+NCr``ih$27 z>Bgj*nN(XD$)wMtQYmTaiMX4Tfy6HVjW^w&SfPJ8>JfMSJiS+Dgycq%N##k-6o^AQ zM_BE^Zi^QsgkZ9Cx3lk3=^o=iLIuLfh4!a(N6%B;lufw|!!svmp`*ry9gRpG_VfX8>6=*T~PCI#za8MH6VOLzW6GB1fG!2_L~v~8jUi11sE`Lc*Ne(3nOS%E1&2?M{eUIx3@%A!1K;fUs3W} zMbT@%7VYRrCgEo~;U@;)3fjqW+J%utH&{cxdkvdd&qdOFqBk&)mShlX7Z69zX z#91|K#!ufAs8y6fEViH=@Gzir#6;bC^9atE18<=hMr#+0=2iccmLzYF#+Bs?Q6DRm zgxq{aSvwlkc^^wr*5ZaXgSUhkL)F~@T8t3+4rO(r61^3(9XM+~_;c(TB^Pz04d`5n zBc<1;2VRdo?Tqhm)D#l6_rHS zs=--BoQ|B4hBz75B>;+{km_09N(A_IZ*jQ93$XjNC2|+qHAtxkMkblTP$j zn-tZT0sko&0E6;TSL1uLW}h)BYqJ#vm4sl>QL0vv*j{`sr{CvB{}>@@8RtK*@`hme zsG;WDJF1Y4SBI&-y5n~0ju)G>lrtP+48UyKX?b+dU6&nqHJNw28guMEVp4tmY1(jz zH5_D!ouBl%?CJBSS1zIqheSgg6bmsWd3-l-@D~2z#GmVH;={4hhpAO02Nt`;HTL1M zbS|=pN%Tg$%>@Szl(MJSWk;_!wQ`YYI3yq=>530z1R-?NStY@lD0sO}Xf879Ou2K& zMm6ve&pWFmTopyZ^nY7D-hW=<4F+vow5Ly1;-dPb&+Sy77oD^e^izg|BC)gM(VRY) z8-1G0mhvKqh(k&~sh)hg==5%-}1lulbF(whK*7-+g<} zv*mPcm%U>_^W#IlM1OC8C<(AlG2ocQLv-RndGyprcVq7v-!}FZ-QXi>DzP2|QA`|x zf#`cp0C!yPuilkiNpJ?8sA>i0Y;C-8*XP^2W4NSctp7ZV)Ks*qqS~^jS5*R5=yluC z>qR9kmHYOfKen=g%5l%sl zu0MG* zy#C3S)2u$G>U61hp`O*pTCLyZ=UdPoPN83e;Yp4j>A zU6-#0n}L#>fs&d*0V&BP#PSKx{<=Z)_5C0hP|6f1&jvVNREAIcJet=Ca;10=LvA+W{-m(_+-f;7k zoVG8qyWxc?!POGp^kEK9Y$ZJ;IAz&E}YeSQ+iEB z#RaqZyH9#O^G@^kN5egrZ|`~YD;I$=Sg?WQX9PANN%hCDpL7NIoSXrt_h$9D)$hJ+ z5e6kwPQS~Ies5vrB4o)SgH||=Nqi(H6J_}eH3uA=WA_$UEv0=OvWO$Aa8I5$ z(u%=PxtDKw$!&WvO?2Z*&)hzHV;X52QEMmvlHGa(m~)I$YtzU+8cX zwG9&==x|~rEkG70dXr~)RVE*~6*FRd1~G2snNNRD8@xk$cTQi1*?!!{GsVi<5OkY& zwyR3~vZGrJH`}oz)E6mW3T+ks*3s7HBSaQK9RL#KSp_5U2d=%_dFr;yC%3(sq(!vE zLv6A@l*BReG$}!`8@vHeG;7vki%r`*YL*MFj|Ecair6hh%IK|1gp$G94UgdKERSOg zl+h6iF#$U(Kh*unA-1i6gIEa>)&3>49UZG%`IMRqIKc*3XU*UPK7;JOV?16CB?7Wp znzAK%fj~&@vjNigp)y+x7+Lv8Mzxl5e)$vo$USzS9QznCd6@u@yeIeoYgf%zcT}hD zxb1)ds+BqFke2*-!3s4t*WY_g#S!^fQch*W`yH*n0wTwQN*2lS*YcEaU z^s!uHzjo2@wJmGhTeRn1OA1n|uR78C<&9%%U6n~=lxiQPP~WfhSc4Y(g+7z?kUm4{ zW4C-xicwq8Bx1s|xm9)r+6g}6%Q~N96Jm2eg~C7QmvixEY2`R)|Hj)zH-t!C^E_B|adSg^E3A zKUsggO8Ow@H;OihtN}Cp$XJ69lrh$zeYVf*+dljsozpiCEKZ)@@~IR(XbCu9pD5|q ztN{R{Iw;fz23`I;K6K(((V$zr%qKR{*KF~j636BFb>H>r3l|e7 zAV6n=%00fjAIdqD>&&1jflIWbpgQk1JMEtM@%EtJUpB zxRaiNYEoVP-q?&;vkrtP)srQ)dNMW-bCV#BqtnsW+WJiNXzst9`1<~3twM*s+53U| zRLkixnfpDEv$fPi`dZS%il=B0X~PJLpk=Y?3EW$0jz;?>LS${CBDac$`uDD9VZ8;Y z)JZwo$uDSwUcknm43$b&LO~bg#Xwihd+7LDyRYtg*4MHoJ!SHH zFzeNJENq@Jw6RV8tjRE>v2h{K3g}90ZQteedt$VjjGQT8NQRYLEtx~I6HI};Y0{7k z)xa73RiT2(pEntX#Ntdw))X+LSjrSAm?jM=SdESQ4pZ~kA&Kf1R?ZlbE(=WKwELnzPPVXrh<#tvzuhuS=P z8}hkN8wc7NuUbqUV~6CyoAjK?Z%B12(=027h!X%X z{OESgdv69xV>AJ<5;|N8!Kv1=#P+ZH#-5TS=@>eB8RZ|)dxJK7wAH@Dt_s=kt=%oh z?v?GP5-~wZs@Fk|*jf4LS9X_Ec1`(*TkW6p`OwMreYNah;8%BCPTlcle?2?*>N~u< zyQRT#LmC{keuXw@8g4gt`7ML0%yrSwyGd;9V^(IyyG^D})qj-cZieA)9-7~O+tyKs0V@9J@nT=!A zE%$(JHUPyRxt$@lH;z?bxF=$l;%BHW(dX|K>Mh8Cs@G=+R(8qDME`)g8x%UN@zNd9Q;~C5_3d4^8+UO@fYcKXRk!X@S!!$0LFFH! z578AsFqVWqR3+?boO0|o$Ue8%P*j=dI{%}(<|3Tg2 z^(IaqG^DlZ|Daot?$H~ig$30Q$ZqxXcGR0AXjZir^*+@*_LCv?ZkFransX0cRo~uo zyK&E}$4$j2F9icQRKUVVPu+9*rw0EU)1l~aIXROnan`y6<9ex5@UTXCmj{?dVIIeJY0z~UkyR!E3yKj3t~(FfKS zNsELbYY};U!RqylUYallS-AEI`$IhWpIQm_dH>BB{8!`V|4gW)C^P!0w0_DEF@c&; z25FyYU^SNX@M;W4R8WQY?Q#agaMnk`F}Y6t(mE+(Z^*)k>2G0g9e8}alc=f}v1Ukw z;*MoQ6E@xF>~A{K-cP8~8T*=n}cnSsKv1Gzhx z?Qr2spxDM`skmvs!}1W4mX3RyrwT_o8I>*e-l01SmsuVWmsuQy`L1WpplI!P_xruy z_xt{VnYGqD>p9-feP7po-;W`X`Mr;92>fdJQ+UspepEnt8J~Ef9Em^6&3Fg$mlp(a z=5oAI`<)Ak+pz3h zefK>o_K#XG)$xlE{E)7%|=v^&J{ zY?fd&DQmErtU;_m0x3N^2PXgteT%GkoMMLQj|5PlEKi*(gfaSTeHb%8$98S&! z$nzI(xCX*JK*rW@T&ZVW#D|II*d)TT{E=j*_D$h6Z!?`{hi0wAyhdPC-=Pr?x#Uq| z0k7}%mo;ld!?$?kdT#&>dra&TFpGN!VSwd(bJzFk3VZd}dx=p2VAyFcZ8W13MMGoR zo@He_mLcE7XAe58y9Db_??}iyUv3f zitHl16Ic>(Pz=)bp5U`RAtHcK_E9c!s=!`SFtnq680bo0N@B0bnzsS*IoJ$=HDB-5 zHTUY5|3!hogZP|AnZ3Na?Ru~8g=54VJx0vYV|Sy7YbHC`Op?_6=?4jrbF4*Z;BW60 z$7F+EFz7I_7*)mA)e&^ZmM)=p-bW;UTiLoq-qOagSCK@Pvs~>kch1IQzF-wGBg|`^ z27N!Q3I3vPe&@fT)dXUp$aWRq*o`cDviU8nNh~(9RAGEh+75#sqlCpJ!|KG>N6A;k z!eq$T>Ex^O@IA6&uv4>!GoZ(OkM<0d4Z%(WQ`n=s-V=1RXUO`Va11PDCTG=QTFO>E z9^OC!5PeH{eaWFU5YgKI|In5y5Al>OL@PC{(&L}1L(vFNDpG6);K}= z+_q39@Iybr1ifXUwq6dpkSJM);fC8nZEb^XJDl_WUa?R+kVo&r1wAu&5{IRQDiMu*2Q9@R4Nu+6jK9}oM4H#2Pj|Sx7Ze$?lwdTl()y^r zI-{$_d=g2+0~@Ul%^HV!tzgjeP*X^rMg`HC1T288-&VrMHR22zjJ4+Nthu#9rN%8X zflz4&yPW1V57Tr=>a|`KksuCD3B*a=m0ryJYcy5p8i*Q6hMkgCCt}b3w}XWVS(=OI z0>C2ZFi38aF`yjhZ7@%g(iLDZ%rK2$aAXsX%eza9gaGY2AD(!34aj5Fvu z#+~ib?d{Spzo=~VK~hem!?5#s_1-Su9mmL-O>`YPD265kfTF&CP9Naj)jZ*UMz3!3_1!!BPR>O=lpdUh6Y3l zwYS%QORr8+2rEn`*chm6b0_NiB`6KhRu^v7*J;>EKXR)4Xs2)avEmorQI{O+*xPw5 zLXH4`RTW(v0<8x2!WP&I$Ao(q%ycoURi@B~O)&|kiQWjvC~EDkno&HV-&5yvTjt$1 z5so#K?0@C9fp82i=65n$$B-D{uAih{z`S(t9d${rEWdB)Xg=k~Y-f+cfohkz=mB+W zfZr6Ax#&-!9$-gds$1PB41pp?zc7cth0a7@m7zPVfbI}bw*!Zg7wyK6I>6V$*KR;- zOJRFMVaHg4-j8VCR7ejxfi$6-)i@jY7ILo*BD?J_HQm8k1GAq|r*2bpwD`&)$mFMa z-LZB0L6&$QnP2DC4V(sGHibM7W+c7;XBg=Be+q_w@_}jZhRi%KhP7P~MRtHQFzu^w zvm3-tvLg&C5I^gOW2=w#!?BZ&MegmX0e+`G+Vr5PK2|Z5V9Z#%1dqmYx)YCX5Y+FQ za3X-===QJyPR(nyy5?Ao)BGC2tno9ETmcq?VSxEh8TD=gfH1RQLT-{4iy6ge7`!Cg<2L9 z{_2MS!C!$s5Od9sB9OO7N=Vjl(GWv_Eq-=hkrJIwYYg#|YlMi2b{L`r%?)1jv!eIv zJbbd|5_7LXVB74KiGrn#XRj)I=vB@T&RK`bh8Vz_lID_Rz9Jf;orVq&Ezg}Ua4vla zmJ2i<37!y!7`JxMHC$w(Oi*qn`EA^!u6rDqc?>h;C30cF8HqR4s59<%MA6wz~n6g?;G{$JB`2tWF-@xQ9)2%1Z%qpXo7&E+jUL4`fR*Ly;5 zYdgkYYCAyK`xKrVqUPuR3eVCAj)=MEsVsW-iHqQ~9|cHnoc zlkEpd)gqGUPH3POa6NP26#~{@^CE!A{4;lA7qtzB{ey1{rdsW5$n9o``DyxMj0Dg% zhvr7)l%$u7}+>B;~)q%PE@dS?JVP|#cu%$HK{agi^GFOjShEbS&liQnneMLhoW*}!6-Q0^UK90BE3*V3C z-XZII!wHq(DHgL1b51tY%GPMCg^F(^Oi!YR*TIZZ6t{Yai_%;fvlIGSRP^)nR_3l# zDwBYGvXUV|G~i(11jS`%3~NYGTz1B08WI$jop_5Op=<+)g>jrAL2=m`A3c`1>?CGd z?;|cd&*#pvSnnq;JBvB%1H@%##y^hHnMK zQIHE07eIO2nH0M`RS$Da8>8^F_qrIr1z?XxF9K7P_2z*pc2nSOfS{JU3k9o9Jq;fW zq5_aD9?%lRIH<9IWf2OW0%_qU$A~}6JL)6EYb60gC2KApzwML*uNBTP(rGw)MSZIH zXa}{W!+)>G52IGrkoD*^L|yODISgUfW@wr_^w0&mI*z)0_bT2wPQ$TN#q>--TqU)# zVR&b)XfT|tRcs&WbAtIlxJv-$e~9Ud3^>JH36qcaGGFL(CY}+1Y)>2zu$pqn&{eE&+O{?B4{$sy-63n0UOpK2yG)+9-o3-}R|F&xs%%6*6<+y(M zX{{J%bjBI_)f||AM_kLWew}nzpDUREt-5ijTf>=_xQ1c<$`ImME{*`-9^J3DxIw)e;jB2Alf{X>`g5^x`gwPLnJ{0?EkxoTFgk7digEh~D1OT*8h*0*ZfII2O zTIXHhWo?mB@m(WwKr*z7hNBlxZSMUS7uRJ4>mkV{iY$Qr9If6?eH`(U*4hdKZ6Es}vc&%XOF9pd8w^i+;ca~TwAxG z=NHYct3r5qyu^;}*X+7X41i!)@Z$u^tzm-B26jvb5Fl_k{Rb%ZNn4ZCl8912_a0c` zbSN{A5jAT?^BN~W!GN00$ltR5hCl52^WQl&Zws1@g*O5K0k?iz*nDFU+%dVR+@m*i zTW;tJZv?6CgLV?+Fqa-Mql+EzN71~US*f;{QOw7K02q)nKh~YIA6RBTvdn4S<*@E7 zCm;pg1*-}6I=ok4qSOBhulVZl3OTtR78}09n?a%umc9>2M6vRJWL_S?8v=>nPjmoO z^Xx$?L~S?>dfA}E`v9L^@Af_0t!oAumX|I7*b3DG_G>)@^oGEGC%#N1u%Cf)T7jzs z9yq4wO+8k&jThSf=YqOUIrB5_!RiL4x`2c8?P=<4u^9qlu28I z(vljs(tgZM8drAfwjUVhG-yP-*S>VMnEW#txX-UMe+;1gq3#4yPQ!au#xLPI{^0Ry zr|7?7vp)g9mjgvPrKl`8GmM@r*=;{m3~_rA(|+(Hrv2(isf!|1v9A=tl77ekNS;Q7 zdjbGd6yF~}&4VXtq5`-abnTg;fq2^D7EgJEox=oJ89-qUoOS6WAQ>+G!B1Mot#+O5 z_HBkgX&ymcR)V*1`F1uyzb+qF)I{*|Q53>n@Lt*_qrWm@Y%hi-ik8&gxXCJsp zABNPysUVx#bpt5L7|E%hmnpmAC%tlphPX;wvqU!1X$-nHkU9fczsYHxBN`nJ;~s%} zZ_}#1J-%Cd^s7Cjo3-)e=Suw2|GsY9KKOrDH^NVCT16a$24Q}3R3i|6OlP>1cM^Uo z{P*xz!)EFxss0l~1u^!D5J`sO!tRLuT>@Tc6K`JLl75soS?Y2S=HDXLCC z$i#COHCTae)EKNG))~?&ZRqlS7yJLKWF-;@A%&f~SiRwt&$~OlL0%wj!YM*eITd;e z-6MjYx=HA%vp0jA;l!=bQ|AfRSq)=?V25CWq-W=xQRpdAaZxB9*WBfMv`hbG00pUh z5pZXa^lam)>K#pRdh{(BhjoUIys7c<0AZD1#{HqOe^JikBk}AjB>^qy zh@T!&7x{Ui00gt7T2ink4uke9X#7>vcr{KtI;{h} zapD^tKEN*(EA($_{Hf6(oCULx>=YZ8%zAf}TKiwB*yVNqrE0pMXkF*B6|L(*jN6?7 zEju5qe{Xv1YuZ4_Y|ah+H_VeTKA)?LPP(sjWi|NI$FXVh2x*x|hyRht8uYoj6plB{ zOeLa)z`m(5s;)aCS{B@ook;t<>d1Z#2UkYwG~6VP7kj)Uvf&*9_#8{1i!6cI*PDC& z!P8yyp``3NlELE$0WXPO-@U#1>NmUEh?himqGx+0n_VdR*ci80s%Ew-IYM=Ia{5+X1un4RDM<08G zm9NCCz{BrW15Vx1fR^hL8bAUUVBZt3*B<|)Aeyu1fTY0&$&;8IY&q+D^j$sh47`X# zc;xKHllA*wI8eW7??-C>Njid$c(H0Q?0ne!%e_sZ(@ilGOcPloK>ttGs|wpuU;JQ6 zeaGXS_2*x`P)~Bnw1l0kZ+Nh=9vO&L9bvfsIIbfGy*R9-KJ}vO7Nv13MCa=`3{u@O zSL}+ST35Ko(;AKoAP-mcB4?o$%4DO~)!S9!Fhqd3k*L%CS(|LQTe(>f$UB7y!8j6O zmOaOz3?k^!j&X2H2B}lnt*^dBjGOGn<|)$#f@s#ev@UIN;+r z?^wZvpe0|o`UGjrEm;7&xn<9(dhQq>~m-) zGFdhSH@qlNr#bDSqqiKIv$G^qcSEXZ!U+}4H>tfh{nx`wDSM7=5(HBvul;up&15OxodK6SPL`eI7dP-wh1y_kVd@ z?(XJl{r{J4zNq(fbC2I|>t@)SiQor|0$e0!5LP7|sbEePd|n8!(if2<4P#Hd2`jDU zn?k2%HCU<|k43p!yN%eXxx|6_S(mE3US{>381pM|ix9O>d*X6-L3OCjxS~9mi=EAfR*vpumo`}4= zr&al{zp$TxQ}iZF<&Y)rIFaeM;zSw{u<-;k`+z)QlV3-C2;xU<|KyGT^)#*&~p+B8wr{5mHW z?(a4z=!CK;BpXuQe?%2u89OnaGY~yU;j$pPB=bUgpk!VIcR0!Nm>qi1WM~_|t_PWO zI89FYLMPFLBBZ=PDQ~cp*GP}L721pKkT(-$2;0P@iOl{OE;jIuhXyvhKo9#V{YALC zYDbVwmCdBTAaqo55+56=5NF!QRYGiF_$$Kk3vjm7sO8u|?zC6G_z^jel44=Ldjd$( z%N=y}|C`svaNv3$6l2t7blpjFFNgBMATY+8Vk`U`w@fg=@M)$ z=#yitmMp|?$d)rd=a;e& zT4>b^90}-Mw52!rRz$C8=&mxO|4&sD4}mUfZaKaCGHc( zsU0`@*kAf-W46TZ5@UBd=#5pAnh9B=Uk*R*EpQIbY3xJ`iPq-8aJyyXFBZXh{sMX_ z8nMsreOL4J?bv5%is%MU?DKDW2>jAy1)EHAF*6pLLdKA&m0d081IbH9{O6aDe3if9 zv6jG-wGunxLalb1D|{I8pyiQ}BVzgF5%0h^KJk{}7Ut#^^GLW6VFdeMQv#02HOcNJ zDbGo2EFF%IkYgD>?;d3a_Tv>PI)o<%k$?Q+fO$u9za&;*UIZH(fsvDA zBc#}fh=?FIZ%FjY_}GXtK8Vi?$&8I?|1l`4QqBvt#74A!A0*|4aj_9&5`yCM!Y6ow z{PT!el&}Xu{&}7t|2)MkI`Y()%n&W6S@~F|B^8GsT zE9xN6>dUd7#&%+~mHl4Rx8Eat8XGWXQ{R67o1QxLX92y6^b&NbgXXVy1vPht?ClB_ zl=aYZQ;sEZ-K$SuzvZ+F_ovuhj@X?Xy|H5wB-S2(su1o^r{Kkh2>655JAm{ninQiw z#a)v`vff#-TVeSz4bB*n#h@u}(v*4xXTMhGrEnX>Y9n#^F-qD2Y}~gQPA7uRyLj|l z@p>hO2?-()W-i6-l4Eu{{Wor!2yOKm#24Hv-y{ZFPGeUa{pf|-hUJa5n+|@aCh_@N z8l9XIV`vFSz;^5i1Z+x0sIWbkm;p9=Qu9iup4u%7@b>F#e7gcn|bw1pEv+f%g`CYXsG>p)6EkBVPV(bXi zaRI4g$5k-K$Ykl$9!H-!dB`0cRkT&x$DO)JkLbK?H+1GU$M5*F9-s!#d~>Mb*6xfsM7=>AiAZpa?trN&$?Xc931^r4n7*G%VHC zL!ZYw%?sl40<|}L;EI(?Xp_aga6=G!QJ?>LQo#uLzdENn`2V~h6fZ7|5__KRrYTXpe-bp&?SA|QYN^YkDHk`RQ9 zBUg22A>fvP_BLHdV!?qz+PA%=P^KX_AVt~_=~@rz9OeCv}$FOgc~q<95mABY4Ngn2OT z6l^-)xQn;xIciNs3vYa%5DvEYIpYUNJkz!c}f)bEv(3L=xcmF--?)Hx$ynl*wEP){jvnk^l{B#_6NC9{U} zKY}CZg3H(()J3G;t{g}?sf}=O6pcE#Hy%9DFuuB6!BG&O+UPLutOPj#569yQzE1lQ zux9Kn@=AK&|*)Bggw}DH06KXF^xS2#0( zo;$AdW*)ojFPO78nOz_v2$=oGlo3vFR!BIRc%sSPKsTBJaw7_(4DT&>SObf^A>KrQ zyr2ER>>A)^+weLMekf^j`@7-KlW7p3y0%m!8T$E=6KWh0 z0fEx9>F_pXuBds#`@{#%`aWm)fcTMHKadU7-Hzn@f9!)y&YLgHMomsyotiaH^IC^N zU-e_(_JnOPL{%pdas~t<9a^;2waZV|l*n*1u5{52U=Fp-E(LQ}x~mju9l}Bye+1Pa zA`aw)3lJdkmi=Gk%b1r{0Lh3W7jadVz?Xec(56S8JvaX0G<*@Biz7Mn2wR3RDj8P= zq`nkLeHw*Cz{qDnI+H|`l>4JUv!7FAP2COEZ}uaY{HqEk-w&%llc(7*UqSJSSF(cE z%Osj>jewCuG?y!Aiz}GKx<8X88Vyy~ok&en{pAeJZ9V-N;+D*5-bVO{3@*1z2Y=t| zUHVg}I>sHZR(9eb@tHB)Up*e@)st-OZG@q`8^$88e)kwIFpJV9Eyq6CgRl*1HH--tu=r^LC*t z07xo_*cs#vgZHb#m2YwBkP!x;Dsharx}&uq0~{K@#b95zjQMDaQ&a3T^SpJJ3}KK? z4`m*Gi1sU;$!Yk4cM6$#P%ifyNPx$sL=2;ib^2-w<}_ zfPvQ(f8F@YhZWENl1+xN@^XVy!`t_qvzISp(kDm+JRJ=D6nTFRTzA@ifgL}&89laFHQp$v|F4D7Vzrlv{uo`DGO zF1$&iuw<4vtYUkTEVGEv7_I)*5DunFg|Gmm{{9?3i)6WB#mJUL=UAd2Pg28Y6)Q(^ zTD|mZ!8r~?1CW3n=Eo~BemAEZfuKqGwW7BtiI01w<$+1?Y z3Lg&1LJyJLK{)40nl&eQDNkMjGT{&ggRyBPG*vM9`Uv?75yc_z1HMitU$4+*(BBM$ zF^i!j%LbTX*inK(a>xdTx87lfxyysF5Usbp3=n0-!OZ}By!CwrnZ}IPR zb6EY|J4s45VB7Bhw@|D-{^q{hy!mO(`slKZ4g&3g~H{DCp z+6a*$V0|I92hQAqS_XivTa75{?UjgQiT3MWcQ8(BSMNImothHJDeYH?c@833^E7Kv zx&i$)@f+~Fa21n7Y3ku_^1#B?ihm1ny{JrO#_@&CIBomxaX!DF}XB0_YE+I!34m8&nQ z#ZeyRwMDe+mZ930KknurVyO1z7{l(a&~c)tcBL?ZxAX-A;#7F0Y9!MP@v}SHFLDS9 zByZ3mZm4)1fhA!*cPYRa$&iONM?ZS8n(WZEn_k$Z7_7y6OKM;IAQ1UBW|kj*)f5(O z8Wm=G&>ML;QqT6bgu5zDCyc=K$1A{WyT6rpVX2 zcB3ZhPn#w>)lH=pBv1zPpTyTln%6463HNpHxuu^du{Mxw%Ks!YVrhWuXL|kv-=_y6 zO6D~ZO;Z``j;0v`bt0G9F-iHJhlAYKdbA8s;_y&t13qR7V& zAy?faD$W?=bKVEhVkp~7<+N*XPcryAH48VbKdXeDqI=P1&QMu08(rUNl{5=0zTu5^ ziV<7K8S51zwqB-gls@Y;9t&u4+M+NaKz;&|pNC!HoWn~r90pKc=?kY5z*h?<*T1KY zeNFL`Co;k9bnp?Lfcx9maA@eKq7V->ry-crEbMqe(kv>x8Fc+-uqThAp}WJ(A$pid z3^_t|3W{@H>i7o^CYQBVsH4-$-Z zBnZk@#~bU30cfk|*ksO<((!_9NktDz=EW^mH~O#~Io89G*PBh2Eh*<;kSwX9W}#?a z++cM8ooKQzN9u3fC&PY%dFmNCz0jQ*ONo10D6x;N@9{0{8F*G1Ca?y)C4&RjVVOk+ z>T}7kMF}t2A{w?T;U!z0n%vR_vY|4-)j1pUTZ!?Gd6VU-mDCR1$eg1k=Ma#E8c_C0Vb-5N)q-hJ!P;BVq0DX0`Z1=$$rl=4 zXe`vGkgb`xD=(~zQMQUtk$wqr;|{||P)*6{}RY}%_5`+INKfEtOS~J zhHi;{RAw(J#5g=Rj=Fso0Bi!K(&U0$;92y7xw%&d=aa79Te}66?P?`(yq|8W&@jJ) zNBNMs0wCk%5<&8i!U}j`k&7^nA&4{)HBX4-}jpSz}H!afA zl5B7wag4Pbbwk23GDa1;bZ1?9&KOpGb#Jc%VJmDFXFNt$A6Alf62a*Z9u2-6DuRm1 zO+k+qr;r|<|Jkh`O^pXRBHCgA5V&KmY_T3HM2(59binAlFT~-3C*~@>@SOpevyySt z*-l@Hx&(JIH0NyRAjud@+{KKe;V32<<2c*BliSbsIgHVtzwt3Co;M!jZBZPWWs62f zFfK0+LqZ_9IvGPk@*CDea4>&_=L(cJJR7}d!jXAj=ALnn3~Nl_(S^nY$(TSG726mv zD#irDsMyA48WRYkvPZVXTZ{>WQL&9fhZ9D{HolKhv5^?8gd<>7Y)TB)^PKGgj(&0O zmrtD`j0*h<7?tVce=DOxQYZV}!KdtT>*;$q>Y~D@oUH86s3cz`-y!*Tz=bn=o|kC+ z)@eLiRk_C(dfA4<(L`690=cYHRYW7f(6#i~$PYeAGLJa2LxD;B>l?CAIE6 zZ7T$lr>%+U_BVw+XBu^1&V%10p;pD3oUjj-0&tKWDIpTOM~s`hC=Nyb;)(7OTb8@I z3;bl~)26U{az<4V?Gov=Ku=60b?|T(q%KNPgu4iJ-voC-e)pa!EKEl3u5W)LH;@tx zb%e6Y#egp%+yyeid1^qo3p9+}1$RNJ`7cx0U?uO@by6!i27r8OBi5r*^}0IcacwOw zWQ81RTt~-A>8m1JJE49|daz+#>JPmHx-UxZRc+$S!DND$Aar!U zgYl4B+^Zs#fi@1m9Z>Wox%3t0k3u2TMfKk19loYa* zvLFgrT|}EMY7f!8lP{*;kIr%9{E;KQ&@o79)38npiblctnJ3iHspHwUB+E2b^x9|e z=G1R73G`@h-cG%^BSc{5nkEiRViz!f^)m%6GZ`N?jn`(@M$CkMjH53gNXmopA404o z6932OwokYZ|J#vkCk6job=xn@!T%H3HM8-*Mz_835BR?uu?GK@3Qo*(kCZ{~kuu0V zQiff(eMd?vatPsb0m>)Oj6wP2nRb*v2mf19em2g(AkUEJ$uniBQ)DXUl_Rn(KXNX~ zv;BaNYP?c@zQ~4{ChPGHB}lA~9p^r^MMxH(csA5Dj$Fr^@>!p$#rlGmBJwRhJR8P0 z_AnRPaBH`2dsRM;(L!>e9r<rIucq&9sedL-1TTYgNLnyjX-S!u zX=Jdd!_3R~@J2TLuxSG8W)>Ffs7!Xj^Lpw)pioOVOR=_>IZaEoJFFoM3gGLB-+O7JnYkb`B7X#v{QLd_Pg{T!`0x zit7(3^TPqUfP5~4+F==t^Xc)KloRiM-=1))G1F~#?#L&mEO|CVw|$-i_s8hAUmHqI z5TTB=VoJ%WHSYVnVf$DH;{iJ$kzqKsA=nN5bC!FGoGvF8$0R!ZFUszZSBW-=a&&Ic z%Hag5Md9&Ay?u^8V_ZbMP0t&RrU}fE2+BQ7f>A%Yed-~Ss!FiwMPsD+89MUp*bx*m zf3*{(K;P=}BD2$`hvMc5AhHbYTX(!AjC@Q~<=ee1m1<0iOuI^%6-zlRXLc?L{W?F= z6ck_@?~7lTk#3om#LhDXVI1`Cz8BbOIOvsBf!vyJ3Svy-2jdnR1HT^B59fb1ML5aL z$8Y_PRF0kIshnk6JbN|MGIO5+uf6Jd?WU;GW2W)`D9Ei9S!UwB6_2^g-VJk`ojJL^ z@5Q(`zwe&%Ufk<@FYY~FG2UHW<+U^WUOV$)^%LrN$fzwf7UNu;pqvoE*Yz+b{Vm1? z%!_^|<~fsThEUg&b&JcBwzPPxm^)>6tdm`adS$~-NPB%(C=VKqJT z#rIBR!hdQG?ZkSz8Gsec%<(q`FE>SIV1;F!_Qx;qW~XfgKH$|38;cJpORyQ-h4D5c zKA;Ai&C|qqn+aD?2iZ0fA6hYPwy2^Zq%mVKHu?{frLM^sDX{`?Bh{i*0GcIMQn%cf4NnTqpqu$amH$C4Cm&VJ-AGmEkm9awz#37GLlix0liXhk*^#hasW0xgCVMG$orc6EWPwIMjkhc7GWuzME0(g~|jZlZy5i*=c-+o_&0B7IOnep_jzJkfLP%+_)*oO;Pw zl;ufl!w(z@rz&;S9z7*ut?n9?Z=7qoXPD`Mu&G5}WeE{(QP&xqZ(I=Y1M`TlY2@>! z2hzfF`j&-vc*CAZYMqIy97)mXFYX*=VdqwSZ@NEx>L0ucevWYWhGZLIVHX7alljco zWO~JP|07{@`lg?1ci%hg=Oa4rb2qW(<%pAHQI3HS_=EO4*Y5Kkg7@ToMW8-a_P*bA z&M6|>j{N~oJ05XZS;)xtIWr!zm@M=HvaX0AhO$G}6b2NtQwOPShlmQq|1z>?s2!M}VPwO=^bjq6 z_(0ld@s}_b1Mv<07;hPY4@&VY2Vf~`5Wb=m!4i!RN-;4*+uiMR+-jcrxnp;9eyTJvye)0(hqItl>sNo@5xji)qk9U zEto=>FCnxQseoaC@a#8-u{!s~MVBr^@pz-MFy~jyUI$^TxR)qv^Uk?T^f>g2VDWOW z^S^{{9_Ej--FvP@kNH~q7gWu&&PT)p+prE?7v(9Bvy2_u4&m}s4DmI+)oK*E8=6d@ z(i9PSA_4zE>WoHH2H+ux2l7H}BJ)fkL0@8r>TArc*@Qt-ni6wIQ|47z*I`rXYYLH1 zcdWzyZGn98|1!{1bR&<3fKx_Glx{&g=2e_s7k#T4(HIc{V-+(1kD%@jG7e<%DH9qK z8JBB_gd#(yte*>Lo!fp&rGt4$VBaMB*O(sg`hXN2ywn4c`}-?1!r)}vlyy0%Z)B$7 z111BuU3=fAi-Il5hw++5GGj86KO~(V+c3j#9d! zuhN`SX_5rkHUgzhAQEZ!*6P>Wb{XBl@mOt^z%i9%`!(E-J z9-Dm{@m8Z~gTnI{8Hv2il4KIApD zeI=%xBJC#dWPa?yN>zACo}D&TIlvo*Xxm*_Xr6uDq9@Od#UgNDJZY=?8J@%T7Mv3K{YMe`5mtr45cj>O=g>9XBz`io7+%YkGQUrNoX z!ws@=c6L%Cm+7=%YE9!+4h4P+wiKl z!?qu=d?h(cXP_g7CM9uk9Vs3Iqy-d~69~bue!Epqy!!=&> zX+U|_g&TtAbk?aGssC^xA%gjQc2x&_pPiqMcj6s51yNaZ;U)01a?qG0PEOUzhz zRKejY__i_gL5BtIOZSJb0JC<0q*=XliVSC$^KT3fhaZ7y2h(7tyXyT1iBv)9JK?W; zG(K}_u^AO-e5oU&C^6>E<4!)dAUy8G2^%xP+dbGP2X_n(|I5#D!-@yzAQQsM9)(qGpE zsxa%+wbWYDU&(J~zui&yz0zOS_q3-y{Y8fh=q$IBs3nnS6UjhEh-_lsGe3+T!m){y z9;&W-_XA)4coT2AMB1?$z{Dl@P{wa9ofuDYRw(V+v@^t^DKH@kMwhDsLt9V^<_+>E znf~}W90ae>yNKS8lgtI%N;|YaBX8F6@v`L-IVIXXc5(6c!{}o4HAb+;S%ALgVhhH^ z7m%)QAYF}qfTIcqF}%D!dIW}%R5JwbAd?wjCwk@ zmL6nr7OhjMO7Q`9*n3xW2CVAdV&96e>@hfcccQMF zFMBI-%nr`ps6T$pey}W{$zH851AX40JO0wazgBMzs17)^d%wjdi(uPhMxq(28pAIx5xLb@j|3?_bepMdmuAmsYURDu zx;TorjN>fhw>A3B`Y+AmRhsAHDV)iCW-OIBhKklWn~{}sC>^#opvxB z?ywG*n|&o~1d@C;CNq7klpZgokCW2JTNZ>{77Vp47-m^8JTrZ2W_qHO zo+PE4rSxRW0;6R?q-BB0vS6f?o{^b8OG?i~S_dh8wv_&ul)fY>{prN#G#9>gEaf03 z99xDR+&dL8RW`?GZ>B@J?EkVDf^tW~olVYm!e?2^PLht!#q1NaIVU|-JUTV|#?_>3 zjyP!`Up(!)J!eX>iZ^g<21<>!ZSi07D(`ZFg8 zPq)=!42&Ic0@j-?Fr$FVSQnJBm&*7%m2rcT(h@T6$KMH-w22wHLGfu1%4w4_5~z%u zkz(3pN7|H(mdK1xy!o_;xU{Jme@4!bg8Z~ZOIlKVnpsXu7SmE3X{qAY$M%fV@M+Ud z{hfQdimO!R`%jDaPqFx?%Kpg(F9Gb&WNDLK>>A38GAe|ER4dtCdEBRW@&89yS-iYjJU3-jNt$^1aI zd|B>W39FpbHuBRpNKXzcdsN^4Jy$bMAOB=%>zifqb{F)PvSR(jxxo-0&e#z*~Z*oiGR<}t@!Z&YBdt~)X z{E~a~myDrD=BG9OywAS|&yz>%yi_$C+#j7wJ7&DL*=AW9y}5{6I&<^O`Ae5>o|d%q zPiZCG(mktZBrR>O!%=?ZjJUZHt>uNX%_)}TlN`mH=Bh2pyg>2LmYL;K5jEk640KpI zOY)m97Wg_1MKyJEeo9wsZ@TDb-8*6Kw%otv){2xZe``7b2C$0xOy9Of->E9CO2W<1huwR1tkYx%Zd|AU#6GuNYvUP7h6ken3fQ(@kgd%P6Ry-u{>F3dD3Bd^6$b3FNZxN@^wE;%IaO- z=h8K!4l<)AWpzEU%iEHCzk^CR$7@C%XVNESEl=3x9l6VEL)xU=f8?Ia1^JmEB`1qi zg6ZKIG8JRG_XSJJ8ajbX<}DMw^fnfMAqTC zZR@no2`%<{@QIMPX-%-T5;4wGYLMY0)#x~j;E1;|Uoae|2?KG* zG~E}U;bWOKA!6MF9=oVy>^r^%C5c&cp*OOe_v-Qy%n&~=a?7T%ZyZpkB0q5CmV)vc z{N)#`-@rUrt|}f;@(&n8(919#_91KEiz?Feod-~-F=Q~`8=kd1j2P4EphKP1TCsMjR6Cc5`oC=}znUI;Q;;m-Z_iZt>k z$#S1a@fAyDl)VtN7yo_25WK-O&l`oCmeBjRG2H=lY@=5c^m>u1Tyax%+EDSCL{+NV z3^~ILGS$M_dx-E!ZgD18rV=O~9oiz;d+iW2%0&ldf9X;#{(_8A9Ws1%XcYhMSG(8j z&M3BTF1AcBkf?uIroYY!Wv%VYx^Ap?IUfC5q)vr>3>@OacLrl3u~muAWII{G$Ghy& z>!E}w*Br_Jy6f_iq7fKRJlK#3pF!5y)KxPIk4uqTTK?90x+d%4>-3;br73hw9fSV+ z7e}447uRI%|CokxhQ8Cg=$KR;d{knPHy+>NsIokjR=)d_?|$Sy&U?juE&1+E?o-Nl zHTmvE?!y@w_j`Nsy{DHBO}z>3dU;(}FTK2|6Ms@W@IAEdCvyJ=`TnDFU+$&Tif}A| zf@g+0g^J^uLds|H-fxY0fXXuXb8KUh_ggD|M&GHD4R09LMObOR7Vo#{hxa5M$-foJ$?*@Q#)2y`sGbnPtNU;~UvG*96MmTVJ|*zr%ZLJllxjc;HaX z?(W@ilHBa#9xaIX{(^h-^)XYIr6tuQ7dVnn$ljkjj(U-y7_N4td=c;cH`O>p#S0Gn zKV--W3zfW^PJj?kX+oZ8q7=y9O@PQTA5xlx)Zt=qmN@4TNAT|)a~_Qko*O?WLk^xN z&zU88{}uB`O4*v9vQ6~fC#Gz7cz@_fc{kpBe|$=n9Goi8$&!MnNppTD22U5~%yk6M zaLk#9zQD`lQ~oM@zpZi^35ss}#wiQ-0Vt zU{UIBE#oZ1QoJ<_~O7uBUNa6W%0+TK$`=xBNvJXh%fNDt-Ap3P^^ z6WAbnRBZU(E^0@l!)G_AUTyJdl703HK3^1eds(|R*SozrpJt2C`$xOATe<@ayMtt( zzdLr6=J3l-pWQVF*S`}`bOiE_v0mdxvH<`Z3Q1-(k^!x}Hn&#B zHR5!Kqlifw%nR;w4e`VG*1zMQx)&JFN-|y#dVM)Zlekn98wRx~uZx~CYn+DGI)&$s zJA1TzWV_Ynb=IXJ!aTd3GdN51`LtP}7xJ|A1()|;7rfD?LK#H5#db&WgW(xEXhwvPSTh#`{0wEuG%*1L$ zgFMn9ozMG7+akBOap4!0m{R~4(*^5e#d&mCL4lF8rgp689Fgm^Bn`AA4PveiZiLrR z=PVG<#j_kq12>HbD=wKu^5sMY;=WUvVv~BWXz7ovJ^p)pwbouA906zT3AXmq7sj4U zBs`^*uiv@m?;o*R$9|lmR;dR|EOhJ0> zXZ{_t&O15vKzOwE(0dhUO9U?>%lKXw(|OEdqb2nq+?H7yPT7S$et7-$9zAqiPKgVi zTRH(cu1fXt*d7|ntJS5my7atyAg3O5-nstg!G%8uopq6eC5jUP;O%t{xBeV#{h6`; zd{4f0j*Mfd(6W*rCfuW}hXB!t^?)-UN|%<-NbN?kst)IM9JFprZ`Ex_dO&C74~<@% zybwTJ?p2IDZ9UAUcBBVXH7w2_;U&gurC6U`>VVS$ZK&(sp1{35!J;kwT%gyN&uT2T zlzgjGVuLOiooq01m9Ql_j7gYLWF{Gt`i4S|Y!CM>fCZHepc?Xs7uE582N6qp)?c(} zIrUnL-HRDAK=AwG+9YacjKlAXu}Lr=UCh(LPQNcIlPQ8nF9??WzF29-p%y*Nl%UT1 zwQAa*4vV+{@x?8Roa(i&`9JK>RCwDH6YZ_k69dlP7*eRu$GB>)-=M;BDwf6jeIomPk~VJK4LV?)YVcImrONiUnzJ`_^r|QSN`<{^ zfm6v-#+k*Co3wY`Mc2uE&aY`-)FY^B#cI?Od-i(+P)Ab1@Ij~`sok3cu1%&oE!x4V zc)u@>Ora_YIXqd+6#L<4L=txS;iqJqzvSDPul)>X9iX_s$bMhIbC|i;55I~(+RLo> z$Ir-k`1(~oMD4K9T8Cc~O~p>yH%hy5Dg_r#)yhOFzs2?9&ZwQs3cf3ozHv#zUMFo= zg(WjtD*2w*uiwz^vw4T*jCzTtGA%~pw}y87?3$3D`hlw?pPZ?_Bfn^;YflPwAit>E zbtIK)%rB~PotZ{m$S>ONx;7mRK}77>8Po&|92!@qQ6-kTuU(ZhQ6V@P?MbH&Sn66_ zM;@jcEjX(VbwVu2SZpLdfHOokkVvQ`pb`#hkw7he$7gS+*OpEVpS^}-M{wDtGG(&> znV@Eh)Fi7*ip}^h9CtA>_bJ8nGDC8dD{vsm#j_Qg1Zoz!zxg5Mmrx39%9S3b>nV=PB=-?X z;bKD34Vel=WKpj4FcWcqHn~4r`Tb+~M(z(;tX%0~mOsf;Q$_V^fm*;(W(&2jS(yYP zWi9OVwsr;z)D)WGC>zod!F!k6(d{Uv@?RSC#8c=;+vIlA1^dIuzPPlVr)oH(2?}3X z`EKOsx>(Lfuf!&2O+GJ4))b8WejX#gmyCQWZ;ZyXXC_kQfoYO;`hMH_W!M1QumPUM z256nZQ|O;GI*tx2?ZO9S8a$XGQ)xt{xjGA?X_JMTBvTg5c5A24_09pjHBDl13ifQs z>_s4S>@ND=>)l$Mw*`Mf1m1DkNyWB~Wlt?TZ(G#HT_=Z8>$vRM7WEp&6vRj(U`v)bkAwqTm&xZ2Z zH8L9pAAL4lvQ8D*;i7e}lO5{Jo+_}zgr^HY%u#8jGo9+y%%qzVwLI&aZkc*D>-FwU zHoAD@{@u>er|C!de^9O1A(ozYupy4@0=z_TM-s3x~@-)<)h}067NZGR1e#5EXWL|z)P$NdvzGMBCpD67gVBZ}V zvLDOOo~Atpe^_+krC^ylBcZcg2AERE5pOmTNi?!EdFqIJW?))?l8T;)QO|xP^?lf$ zHs<(4ctgNx=HaR6B4s{3gkItsZ!*zSX#Xug>FaLx3R|M81!l>omQWSv?;BnD%8_|{ z@6ss@Qr1P>oC17)GDhow^1z5I!RH*yAg7Kv6zcmxx-7DzLrt174w_Mw&y_N1zD`A zPp$u|+?yLgeKln80g`m-ao7HJki!r$kdrG0Re3=itg;7d+#3?Rh9pb z5BJ^~eqD7Cydr}-caRbM6=EftCd?oyYQYF3_G6g=EKSR-?8n+RTwMgkb{J{}(;BX+ zNLnx$tEL5G;g7U%wjXM_i_=o-mW$J_DJt`Qo_l8yt=;$T_wo7Tv+u{JM=~?#o_o&g z_j#Syd7X2_7)mUR&gj9MRz{<{MMi@lkytC^uq=jpKD!ShK|*27vO>*st){|QOW{ym z;V_^vuQ8!EFM2;gWB0zY?1el*BYNL|ga&^r8poS~Ji6bq#8CDy79tQ}NKBB-i>k{?J4CKuR1{ zSW(;y&J(ITdxWT>FQcCkbBfzWqI|)ZL!K0K9#JLrxEYVgxW3$=XTwwo zAt7w$5g7OS>XGjd=~WEBWHE*Noc`M?x1{_AyT7 z^5Dlv}*B?bGJ*R`X3-CR!3~cZY4`}nQ1505u(To)8IXJ4W?RNs=tR)yLIf!?vNk5 zL%-<`!&Y_7(d?L`y;m`*LPORe-bcm-VwjiVFS*SSODZs(8J2ivLOrfVSrrMm3GLB}hvMf`Xz z_Ni;b8<2iTp*Yk_k-LkftBJ``gYLpySK;B^AF<_sm^28`F1Jc^y!Xf)Z%)N%GRM0t zRy)gF(mqLY3-0BQ&WfWi{B(Dus9ZjHQ9q|L*C~-PgTz+cRGHfl=Az17hH%W^EAOB^ ziLD(SMR|Y1)vs-N&oPHw8e9o7;;?I(VZd$?2d{{tPOKKU?V;MX_!f$nof_X2=Q2Zo zk8bk`=Xd+5wwHXRNS_7-ZipN%JX+zB1hF{vf~XrP77CEO&T)v_9ns(Qk_&%l&v4`K zlBaYIg-rng^5{gbZgcpBa32ybp6VI+RL>w!(d^QTSf5ue@A5L-v{QmISCE9M^a)?* zWL!=-&|WC0&iPo1oi9#5Li%g<(sCNX&hSm)4ZG90wF-yrY235yE-djJw&vY^iUdM; zQkLmQiZ}O2+u2D>7Xr;947M?0C&h*zql+1ZUAOskSn`3O^%MS@>`*i=f!{&`B3KQ9 zyBmHQXB8ai9(Vweq{k3Rnj}tg#`B2SINfyeEZvq(Jp>lS+$@-s_j_alReGCZCtZmN zQtWl6WHH@!t?Ek9#e11jm0~U~c3C(ZuA%0%CKuJSvPMka`3Np~j8mL}EDuUm?5kb= zw$hR?=aF#VlarYJVaBT=KZGCXQP0Iey$jjp+wg29cggo?5c~3^h?zVa$uf@3Ra3(^ z_khD&5=~8~tezb-AI$ThG;fWt%bv#`!E?Q(!ozNU&W4^nS zS>Z(wuIXRkHP^Owyvb?8+)CV_76mu#bf`y(Yn7r%?%3<0Ui9A29?usvH{fWkBk$QC z8!8MMCp<94Fz7b-19!V0m}YojYVsgm@&l>5L2>R`t91{giL*+*Nt`5~l6bKPyGLv-EkwC!s?4KYkKpUP7lWrl)o--yAEBFfP*@ zu{ly0v2xy>j%T$<8@J|am*#4@fB1G&&e0Sed1q_bAP#3O4552Xxpp%?h1dF2Q|;}CwTo-(zYb8X^Pn~@%_HHyJ_6D2d!;f zOtT3s=-@Fym^m!K|G;PVeT=1c>mo}sXSHxIU7c`s0T!o|Et?C9`1u(Yi#UI-NvSX} ziozd5=KiQQ{unLgj>=;bQM2Mqref6CFf5C|N!H_F_!?HFRm@xAkveE_L>NTIpp+>=Wcob1%ZB? z{oU#h^mcmNj!=_g+G$)5xsc$-bx}CtpL}PjzE9ZMxL6*0xL|7xh=VcT zu$NhiqZx4vWoN#zY^K=3`XN)D%s2YcG_gv{(vJ!0pDas%4|$y!)0+jVRI6~gu5dVt z55cn2SP41pPTx7SOP9V=mwrr_jyrT*Sl5)U>ugSxaJHwv$K|V>K=>}QFYD6GTz1b! zCHn-siG5o?s2~~J-ku84-|@8Em%tn&QPPmha*vmUJM8H0T(F4l>d{@jNV=1-oJ>Hv zC7V`+~$Tno6?WD(?3zQ``qcrOzEGr9rKa9Hpo|Ks9mmi z2=%<_$Cjb2&Bxx2x4r3~;1(+OKK7|(>4&Pt$IcMak9knO-)BlcMl#htDcvjQT5h3` z`UqgzUn>hBAtMI}@Ju!~eh6I!#Xx32Is&%k=%y=ijMte;-G%9SL}uzh)&5ov*7zBU+jBMeB$^VGB%nZR(B9Q zFO8UjJqP};cWBa+#feEetHJP6pe!Ca{r<;#!-qizgH`_7JYoQ8z3)GR0q0RcVM!Uu zRT{*q4C0hbgXDUu;d+`3p?0RmZV0w-?%E&-3Bv(~K6+xEII4aF?vPl8XyeB6)@;V9 zi{42g8~i=(o&&|hgSbp)g&XabS$0zUgW%g$9FYx!l*JCx*{Oam$FxQh!!4vliq+3g zbLpbtn>6er4QPV6y;1|1Ko1X+ASAvL>ppgsn-l7hYhrt1A-g3yh&vLhd*?bj!|U*r zT?QN-7ws)%JGme(hUtCeH&;{D0QQ@-(j#zkLm=b(hMkc}Sz8U#r+AdO3X7e`B|xX{POekhHn zQAgnzr3LH~T`nc6>;_dppdg5!0*8M^s6-O=DyTGEF@_if7cI+jm`T=s_y+5>eF5@()?Yd}0 za%v6$o=(8CMkT?lXw4xkMIqVN19Ye$Zi7murGlKQZ3uOb!L9c`?!|t+eQ?d8mD!9y zBmpC8`GL+J1-B+rZcoCm6fx>MNc;`{4d!Z;+Ps^-f6?eN3;IzvY9S_EOsGV26cj7S zfj8uetS#hEF$Q`_DvB^mrPTKQ;lzbHL8n3+lIU?^ob>oc{mD{& zJdf`t)v=Xx6El2e`dKl0;9e>7N@l`)0%o42RG zNQG>pV@56*EDHcKVQ`R;Uj}dp92P!^c47^d3Tber>3=-|Ewek&_LpNqYd?IIOJqe|H1R|VSyb-qP;jIAOZ;`B z*|%Jnu{nOiWg#wu+5??_*o+Be(4mOVvx-vikkI=x1y|n%iMIhKfIUW9m@ffc1isJVf(5sU)fS_|MT}TLlCa(ziPZwxjrKg(oVR zW#PEUI&=)i#&0`1|EvIuVG-V-GVBn8;*TK9f04u}z*^ZEFkoFHnGNrwhfu6O>#RU2`D*W5vcy0#PqhwtVIn1}E&tYm)u=K=D7=55cWOxNKRaYHQy2_27o-{G$2N>=&vdP&64^z1N#2}_* z8obQ%XaCl(WFFc00bonvq9`iwCnwyAVI~xu{$?vNuMJ?Kr#-)lYI8^3pEDn|7#td_#wSI$1YZ%Hggn&Tkt~s$t zax^?qw;v;!^eDoZAjvak&knZJ32}ZE!rV5D7~pCJH#wNlN090V#*iEG->>r>#O7XY zu2}#wZ+R62R!ZcADU)CprS~N00{uv0VItM-3T^`<8wJ9TwT)yTctJ%PfQ+EVQb|lY zYf#TW)GHbv#0p6?IXys@A3zur);rd_bkQz20KZpYBcfC&Snh?5C8#c7huh$ zkS%^0wnrACvq2|N=bP*7N!0Pmbzr=pPZfk_60CU72`izC7U15j0pz zx%^gI6a&OXG*Qj`11Dg9S?Z71*u&_rj87PkL){Y(Tn;*m(jSp%fl@_XP&IySzQWev z*P)=@_;KJWyN5g?ey5@K_n8J$6!9*X!ucLzh_bRFnn&*WL)Mt-kGvadM?CW2*JM3h zF!URf_{gM@f`QfMIZW{**pXS<1}TnqZ(TKCMqkL#P-*FOCBa5eq1z9#n3*A-`p#=5Oy#L{{#29sWmwN-9h z2#vk#4_q4ipzCIhg}z$#>Kl4?LtlTXndgUgwVEYdr;xCO_Jgz?lJ!(5vSvJUQ#-fn ztFyL8yEUy#h_E{lF~$+E@DjH}d;cdp^?wiEvYnFgZtVQG@!s5{-6r9UE8_nv@wW8g z_pW#UUA!9$8Eu_}H(4P7zsn;fj{o=YTee>^znfqExA87wwA&@TxBU{{CUNR~#Qklo ziru5Hnkp!5>!YPurMQ`b%BI2}StU(1uwJNtda6_TL?*&WSYry?cg;s+Lce(18u=q zK%AYWupmjo>?&czWR31P*b*(b3mM9aaHod-cN?3HX~3 z)yrd(ac|p?{z3OVwfKg2)x^8Xx1ep-xsOHV>(jE79d!yfvO{@y3NXygqQ8nLRk zTFcV76H2KOe;pBZGM{jw&TFKOzoW1Hbu7jPld;iFcXKbsc<4*q>l!3Mlex`Is;v+$ z?DEoo;_gFGXG?;DJ0j0VLiWzpixIIS1i)*3-FU}^t%XOT1{OiFkJYF0VcuZyF zkapc@_gFZ>GjW)IhfDJu37a{AdUphnkU;n|iF_1m$y{BkE6|68L)W;=Y=C=IX}lDG zwK*7DBM$X#5{*ui@f{a^2xn)m804l8k@MMpi1N^X=3b8WqS(iMimO@B4Dt~NqE`p7 z&ZIK#Q#4PGWk;c1X;wn1auwo{AiG12<>Jy@Mc%9)(eOKo?;?FjJaUcO@aF)?ROuZE zFW4FwTPx!-HaR5-F#j?(x#^#{v5_*Yh)=1efdozueT92{U~gdtDa1+sfGqDK&LrUA^Br6?kcTMfS)5ngyyj+d5kGdFJ2_qOAyvD|i-}ofb+UdjLHQe@gkv=RQ zxt>@5ed#n`E5Mv0fjMj2dy>4$F!pUVW0g;F@iC^m+dDwvHNIW?x}+y^J(Hi70qpq4 zm{Fs2ltO2GTcWYa=*)Q6uUBAa=^ua>u@hpR72$fSR)9J~o~Spu=T#!*;Odn+>S2uz z(ScMLyCqEO_%wY~C>y%Mla#m;b|Gys1G_4Y2GzB2oOGX$io@3=oK}(iISxvc4ns=1 zJFV~6>d9&!#~07t7ehty7$Q^8Gad~kDkYchlH=?c86V>rEJEf=C?y`Ea@$l^j1r{%aVS; zlKzn;C&!YLOKh!zyDRB%Q21+HXtG>AqYTx>^cL|Ks&ntfqTvLcT(hnEUo?D6S9awZ zZja8%G+<-VTfAFp9vl1~#J(55-Uop4pynrWUZw#$bf3@7X7< zU+%;v(qBMm%l&9iC+jebzZ3;&PJDt$0~;ewUx!>H?(kR`ci9N3UQyW7KXo$Sad%C? z2tM=*Zxcu8#);0ZQ5j~zC)7xXIEzsj@ci-r-O2H2OCmm*>!=-@^AEfXT9g56R zVjC8v%MJyByPRsfj2zCRQri5i<4-f};`Wm^_fUm9XSOS6jz_tUdw-T3e7c0X+a;a5 zg-4d@>nzh>_JaO@9wC7KW!ya7;UI_tIDn0uX+2mgkZ4PG)BZC3r}c1Q2~wS2A(LAb z(~lAnm^2O|fB@!uBW`AF{1l}9OEG`ByNu_2_yQ4BEyq64U+k+hrH7k;o75M?$rTWi zHsrOU?Hj+J#69xQ5IX{vk?qk{a?$~qR{RoTObPxN6WJe(c7W2RRf`?h@$L3$?pMn7%K^ygJHKE~`N z*N8dO-zMFk8{gY~=?2oh3*A4M(%XGTgMuAKZ0kkFoBn?LpQ_yHAIKpzE4ojhN?(<` zCw*kx3tMGLf8Ub+fhxs!I7rs$(r0`k^lq}G9%Cq#fHaktOQ+(w%+1mzJ|_Tq>joeh zk_uv_o;~{I6sm2u|L7?Y4&Mnz7nd_0$8Wl>*u29P-keNN&J8Ip9qoswFaK4GePk#1 z7Bg8*@bk7Vh#hTvYb9h57Cm4UsM4nt+~MJ8RE#Gl=lHYa6dzF8b~KG!97_y_7l8h5 zWG}^3j}eO9^gbeg<)d($MEX$(#^}!5C@yofBm;frPc_5mr&C6lZ|NSJQ=@R^WI=-$ zOpZgAoj(s@W;p4R;7bOk8jRIVZ?}o{z)Lv#;}&D#o6ZTLOwn_SJSRjr-kDsT~48WTSK@WCPp8Kf~S# zF9DF0lM1!ZkoY$Nb@m%_T_QiF8BlT1PeXC%VF{bmhzn@OHQt@Jh=q%`<}u?&M#|bBwiIZi(=9%V^l24nJRIUCM~_ z5g_g&GV^I$p`^zWX%&qs#tAIIsl(g$shn!2cyn_9nvC!?dvq|bR>C)NX~fp z)u-ehEa^uxa(#-Di2=S{N#lM6*9Arcd-L~TpUMeBgi7$pKfG;|X_yz@bKCc6+}r(04~+#(tBL^^TsgV&0+Frm8ScFF>KvTccK{550q zj#%m=mcjFJ67rp7Mj+ow%*hmTW_fe6+&TBUpa)Z8`=}Zt;e3mZbq<8RIOOLAk(K5g zvUHJ?R9wEJg!zu|7`Y{1YAsm2GQ|14o=n6>VKP zR`~?5oSf1qlD~}S&fFXAR@`XU4bpy_LzcgCa-I0zl4F$*1I)>7Q}zIdhMFk-lqb)u zz)`889p`RP%k7u}v1<4(s=*!wrD*tY#8N2(O#C#-QDf`6V1pRghbS7lq9g)mS|xh9 zb7r}6vg|qcdUNiJr?Hl^oAAEzHw=5ZFR3%$^c_dpwSYAut^}M>_{dmB-*P>WOD2jl z>qQ~#HI~J2!R=N-fIt}J=Zr>vjx%$qJ8Y>(q_`hc5K-yDrCD>FnI(a0mqy=F@!pLe z(>3ooGndG}+24^?D9ETY^9doWaP>5frCgbUE3*P+WV~}_mf-qi%!9%jTG@KNVlN?>I9m{BS0L#VaL(m2D56P&L@P+(EI`$v&mCz~OB%KDyP203mS`)z0M;G;` zH8m1&Nl3X=OP8k$rgn32- z;6Z_=J}m75z%rPas`Ua+=od)7no2ouhLeq9sq7^*Sz|Ts$Vc{#&WQh&I-|CiKCF?ZEZimNp-PFiV?i*7%_G<8dvM<10v#fI;svF5vDG7(#amsYytqJQj(hP}cK z8Br79HDqB_e|Lfe6sdPMQrz z4;3vRsmZePdAZ)jyJ>+|dg7v2`l4~pJ+1~pQrA?eo9R+FcB7yBml9`GT(JX3DJ&Mi zG0;T}>4G>_1s|!)o+5prlYNr*A|j#^0qO=VQc&Zf_ki$y;F&GMvqPS5(#2vAx9GZr zz9OrI>1~P&yC@a*Z9X9TH`QBnL8^C?tazm)kF#ODQcZFbAuUL-;O8+O@pf?w!_}zj zSGtUd`6yjRmCG3HGOAt15H}=YRALcmccmx|~fiT~>HEh6=ddYxf{&AIV^n(Qp;4J#XyWhaDuB&h`|dCOo+Y zcT4w|`700axPjq?3!eUpj#rqDXP6Eowi`p28I|A*>+NVpTp z7hgpPK>RFcrlTyMA$WDi1Cwt!a&==(&yE$lV zRd@7{-7y&P%RiE}3~F#`I@LB$n!7Y+_u&VDZpw8xgkN?G69-9t$i?{#gq)=$87Fm! zT+4Yni3=*O2mqo_GKY}>3H$=NjzoZKE^V0JE5K5}9S0bZ4wcoor9KFtLX!!cNF#(Y zV_#F!W+|61?7SqC1Q1#B7f=$<;uct4op1I9sNi2hg{Q-WX+W6q8cy3H}Y|{8;wW?R8BULY!U)KJ{D~)NLbWZ z!JsV&^MR`*g#;HJMcn~WB(1zlwT+NkQ7HQA95-K%^WK6xzyaUgp|vBJKUo9tMaTzv5XsKd>6?Dl{ie^HXF^qRE zH?e4lJ@SU>e<&0=bm(jQL1H0#zwD&Sma(H#T?}l0g*=8$EK>jcMS!v)&Pk~^eg$}p zJu*e%E{?|Q6)kOKe5#PBOj`Gs&-Ry(A|&*ejq#UdN@P_OV7ypH9+B}aQ_fiityyKV zc>Cn!zPW$Mg0e>vqZ^?0gnveBOD$#JTFoVdNzM^sbs^!sqll9VC2_!Chh3X_{AGV& zBm6M8kA(%y7_X?JZ#`7%C=iA7(!BJY%A7gCP3M0Yn`)4b_@52fZ_z6$!?hFG9vN)%Hr3rP9K(>JET zQ6B4$;llTm?qe$bqfd;y1H%CX=2CMGcSY5Tyk}&w!g>&SxxI%wBJ*Fa-<&8ZPh0u4`MTgoNsidQ zRn}d7z+qAW%*I7z%sKuL5m2C#+S<9}s5B%h3bH=8rlrkK$GfSi1w!yf$XJ51OBd0V z9-*~;ma5%VWMXOE=6@%B9uCmwz(@ZveG*?uOWZ)()xxwm{CTC0hDvUh60r#={oO?AS9ns7cW(Rva}{Et5x@ySZc0UA_>bK1aD7~! zY@QSfqUhO0sa9tG414g#ONjwn;2^eOGi<>{AMA}ovNwx}z2S>P!&nqb39kKeFS|EFjO!w{h1A3ypxXb5AF z{q+B%A<1vtQO-jhm8L9e_#G`+@`ukA>^IayxntX4*$4RF;jk8ULwfSy~ zaf3*wk_3Y8fi60A<54%AN)8U_@1aw_y%(XD)UCILme>#?ZX*X^*y(gTCJGDL+7f0v zjsfw|4|t3--1LKP<4hMl&t=SX()mu~tm40SBQib^o_}ZkRWH4PjV9|i_l4W(Gpx>* zfD?>?%N<-|Xe{e87PyRN8TRHxX2p4x%f}85Kgq2_4CqT*d&rRII<2SAWWjf@yIowW9WM{}!a? znKM>&tBQQBD3DVCXU<*G-S#V=#h7X`>Qy@d-x)lUcOGHhn5IDedA<^q$pNXEl*&lT z=KAc$d+hYn+(L~ksbnTFli)lXZQz-cF538(i!LI$avC>X;pMdrcX55Z*Qjp8xPm%m1=rfog>jtu$24YD|rcU$B1(4GSk~eve7r4G7 z09Tx68EL0+4q6ZQ{2-CwinKQFg-BOqf@^MnXJn$2z!m=|=!?lX-DJ$@)LhGpX>kL@ ziZAz(oV>P2A^7*S)e-r>ha5%e$JGs7uMZ_t_;Fe?g@0+7Ju<;Qx4#gXD3CTgPxQ9A zg}at_YOe=vuEWVQ87YcV3q)eesjGP}?7{iQ+?=7R2hps_SmcaMaL(;7Mkb1L2ascR zNuRigM*378!KXViq5XK8dv1SMWTFdoUPYNVGNJ2Yns;u0Ph?`pnKaMb0j0n5^#Wrp zNdr8pwFLf~+b0KMnvChv)=dxn5chWYGNW;san3U1=w*hA(m_55g!Hyw#Z~Y66k=q8 zqc%;P+ut6UXsb-Kqpx>-y~LCt$HT$j8tiKB(~OK=>7&SLG@6WaGTMQYGeATM z(g7J}l*zeAl1glY{H(?@u*o>uWTuii$T)HtzR$nW$46)$}QmRhlBnCO+$dP54aU*L+UgC4*y5M@9=HhuB9BF^r71 zILL86wsZl9J{xfYd+}Vc`2OW@2fO0$*DTP-`q&Flx&mx-OS!Z>tNG3dFYfidE%ed? z>QaW%(ALep5+*pxtSbdJagA`Q%>L+0;ys(tf{f#K&I3VyC05;~U|;=hOw^aRP);e7|R$)ipBZ{83l& zz1Zjt{c)6a{U~&MPx-_rUc%mV&~OuV9bx38mh_fyBHUXOL~&`oc*=b);&2e!BbSA_ zu#fcod*_dyum3V8LpSQBW?h$Fm$o4JJj)29tjUS3UC*TH62-}7)@L1@;rhIwb*w^} zy4*T=Ua%%TE2}aqi!sf}vLuSj4yrX}kL+@0T$awXF(tO5a7;+@D64frVOhld36slG zLbyD}^yUcLENfP}wIC~M`Kw_`ct1TWX?&U{y+D_?+#a8#Ws$} zKHHK$CyP&8mVR$?`h8kHO*=jf3yN@TQ zKjCjT0qxFKnH&XD!}nNREogYdtefGr{p)rsEa~f{c3)0T|DD_}T1`o@I0{DINtJH) zNljW@jsk1c{PgA3VM$g-NN)%<3VHrTGVHLV@06N-J30Lwx!F=1*iOzYXES0arrklu zV(+&gu5oW3=6o|G#fuABCS`jL%<~>dy)yn>TK(p|O{e~NlHU^~nuDwptR~~1?L|`r zdcA;i$?0mW*N#dt8DEjZqRWb=;GurVBz@wY>@u8BwDLQrt7i)9Dw?7zn&PJa>@J#; zcl92UqCV_e>Chm7KI5f3R==^IHN=kd6ip#A-AqHKwa{2QrBVkqJE_wCL3(?L=(==i zGSxN(N#E5Zusph-i>}tsj&S4eLmCfV?fIlTZ(P69af-U^&am#XZ1z|Ab@{u!#%eZZ zH}9gWPK-aB7XR?ML)q-G{2lrG@{i_!o&SCQHP7rdPFl|nZP;JsoV`}0r-{U&nqo2n zE4Wy9ndS~K%~jiJ{n3-`a5h0O-sv??Y$Lm}aUOq+XuQ*IoLHCbbYRy+zSo%Hq33(Z z;GE|+&T!H9yNolP#%d=$ZOggqBCjmY?5@j>e-wW@75I~1Z(0<-(RzdkrHg4MA@WA6pUOvY-r@y|$W zk9}TZOSMom#Yu`$DA76R+zISLelXm$WQb|WU8W@u znU=g{T2gCTa=^5tGoGdEvQ3$5I!|7!sK+eeWj48M+)5mpfKuZWCw=#p;n&B6pc}Dh zO2yvMd)aa}xgl|7+e#mye9F}?HlWkk3Rlq-3nxciH*Eyu zEy!1vEhKDS{Q<)!Cy}{R zYz3R#K4zurZ#|HdXn{!GG{}!PY)#kuE4Tb~t>RR#*r~pSGehu=A~Y#JLS*J+LX(aj zz=v};wTIFwrm%wQ>mF7Ydkol@o(!D#hr6vp?ZtNrx|s6ZWxCksi(NX-8>cR3!e`J+av9+Rlxs`F?Ge&jY2l`y; z>`-q#_m6g5#9FLwK~7L{1g^T(DjHDbHB=?9M5C%yVW3nYvH{n_7DqYMTgBo*Q@f^i z*-)njbvy7m40WaFob-IK4USQ9w3VDGgmzKk4ODEwXDlkV;Qm@<)MAH}n)oK>SD4rV z2IZ_V;bL4&czWswE7K;>@t;#;LdD$Z6G|a2_Hv<+JLK$Bo?K1ItIWbXPK@<_I?Xkr z%Q@mSxrHbmLpFZdG($ z(c&@>`V8(L0bOT@VZj@86_hjGgK$|yls+Y-3$M5T-JPr1A4JY_92Dbu2gh9V?e&7! ztZ>xZ9JRc7WEy(ws*i|oIlKKC9GK@G@!iRYLlG@4QRF;5{aq9e%(IW!fqMh7bILhZ z8@w=BzVfYT2S|oRua9x!wbnaUyW#}Fdx@4Dx;NtIhwh3ZiP&A_v{%=rFvaY|@skO&V790w}%yEeiyXo1QE8fD%-2R7;FQVCj?10ugXm4Q> zP7d~r(Vh#c3-X!=;rKzqn8kQArM8N3N5%jk`=XU)al)cCXD77&9s)pCuUWU{GH$V3 zR9-d#R9z4qAw&+b+CIeOK~aX==Cs1%LEcD>Cvu2FP83}{xNfDmIJ&yZzIaI4W?^y6 zY$J8$OSS|S1%RCEVUI~a&tLVC}^**ZgCTKlx z`{Wyw9wj^^hcecls3nIo)|S=EOp>-L2~OGDlfR`95!4 zvZpn=!{@j>;K~j$F1hmejJH+WRqv<^+kUhz6jx**5u~xKu{^Y{(N53WK4EPwcO_dt zB*z{%L2mDBA#Q@)*fo@ONPT>dvM$nruvm?*rHb~&5$IW}DJ+gesZ`azcpyssb)&?{ zXhUR7Wj-xL@}|*4ypdW>SytB58efYq!j`LTDGS22@g~dGnHAo}u@~>4*_mhOdY-@_ zJByun<}o__bbI+qMRY3L&uxxU%&*N4nh|6=P-HSk8lIT#dE(xR$wJ(n6=l04S6r)I z&t#~uq15Gg^T+|0d0@tNg`4LzM{#bUnL9XH=|P(KCq0+x%ePJK3jP~8^U|sNZcl4< zE75`0vR0YAE50J9SROA8Qk*!>zWm*~3Dw7;U(jmHX+d{dF!%HF{p_31HbBj!GcP^5 z)8~$#I38Xz@rPsF_8Vtj+I8R6oGCj4X)Ql<`HX%V4gJEgY+U0)`ruv@Q~?s<8WWI* zAKFi<-I6?j1SN~;hOf2mC$yg1v{qcF^#l_z?EL|-8a+^ETR z%MKEID~micm-h05u7u#a3L?Zf#?xi_&>nYZ-pM#w0*U;!{9OLdpud3pk;}S>=naPG zdCY1z4Z@84R=Jba8^GEIcpi@V2 z=Ro0YWrOU6qjAuhc6w`2pIe)t0EYp3V;U}j1==r0kjvm|_ z?sbF+4jdOh+G}aB^MhH<&QQl&Rbt_ojpgn^L9V#5Fy`37aCC>q!FU}(-onuyOM?)X zWRFX<7mli!A;yi(TZG)B{mSA=ie>y@&9nO^;w0xHVUR*oCgdV!5H0e9fz=~5>WY|c zuY|ke#ZlGN<+zuzhEP2jL&vg#M$~YTg}&a{ymf+}%XGd~Dk%))WHxI5Wt+P_te?T>j5Y$oob$gG7llbmtq z;&CJtKNAw8pBn6;Gs7=%zfr>ivC;O(SZjTfSeTqt@31er9VW`^OY#;@D1EMn*t1w7 z!~IzH%uJdbes#T{=JZdKqbjQydt#a0tPps`>i(4LXi)Qm-+Vcl%J|CnALTrdZGia;U&TEd>bOD-@7Ep}#tV+K{m)%1eZPn3 zC!V8XQjNo&csn`wwCrUm;Dh;B;n+5lj{u>MT7p`=HdwZ-<-cr$Rof9q`*#g?+oqn5 zla3SpPJRz=NF#x`SY2A(^UDp$X1oR#KVZexrR#``irg8U<9q4+OwsZE{vehu^OOg5 z-hOsYnA7on=k3&rE44LDBGXvSI4!q}mI?NvM0?RFd(rLoqC4d97Kv}oj_F+YEtty= z1q;}}dUX@smOIZ5)cCxXi6{HJ5?37#+7nS1Q5HmYfGk{vO5hLrw&=zgbYmZ)a7y&X zH?3OPb+zG>$Ui3U*qvLPh^h)9GDxJd*wt1W1ODNdz@^WrZ40zZ7if1ZvQycx_qZMy z1qET%frwS$W(Te=n(5({R1a52@MuD!pQYDw1~-^eVZX0~o( zmYGK^T^hyRHK_4*CaWx}qb#T)U7b2ZTk-~@8>lVVss&$bzZCaGU^I=7qxMsk z4n{P`JFHJ*%MGg7($#p<8BYoCD4e_=Z#Yt)MhW+on(fcxByu(!xk@-IgB`$z+N`%{ zN#k-$fox>RC-Kh}Pj3|vFP|6TLbQKHjK2I1jZARe7+6LwdZ4Hq=ZsWjZBTPx4ZeR3 zrHWUi)iUJm+3f{e^Dv8ldMgohD@tadIB%m*@zU15zm{QM(1oY>p)e0y++V*FGmgi65cLUy^g+@qkzu8J4Cb9^ct3;ooWtG->@H&Xz zFr%ui9$^O7jQekP(~Wo17Ypd)n;HI1MmPw49~i!xD;r=x*uy0b_&Ld>z5IZwA``vk zy++XT1Ky6`Kzy0hF=SIWHt)F~?7Go;Lwi{HtZi(9Ri_rJLN`&iH>w2l@ay4rbF}Sxm9>($ z*2LM(x~`gt_0h@_1C5mhdsT?t%-f#it;jIaX<}!n?z?c`Nxk z#=^&&%!9M`SJ_HtAf zV74o_GWA;=j$O6|YD~#3{4h-^8Yo!Tw1f@xr8FDpg2h@FuN964;bF_#UNDpZ1C4li zZAl%YdEHv7MmHU=HF@}9HZ#x8)O^y?%6A-V!rvnYT3U9cV*g;7wskABsJNhDSBo@8 zsHXeCXb9J8oEzCq_sWUtE+!x+s-Ku&kh8j;-uF~bGdJE_tPH%DaRHa!|4hC%^zhr6 zhO62qPtzsa7<*Ny-8|fyu3nlBK86THZkVOsDj;Gv_p{0}w4U&k;OYa3hC^-)=8+~o zK5Z)lNomQAD6sGg&tze3(Hvu4UbW|fdx$dJ9NpT!(&HxI(;B-T?^ptG%(-`;BH zhlzZQRZ!a?Vf@gVC+lm#)1CbwT(Dr^>LMLv3O3AM#gbOcoL|Dta^o0*9Xqup+ZjlQ zy=s8n90lpH9p~%Jwn_$b6x;49fgj}NW9)paRp85OPvK6@U8&e|x#BnC*N`3B=^y&~0w|BC(AbP~;<&)`S;=Y1=13E-)l`FP*7Z$gXEZM^ zeUfi~uF1_0#TU(Q(c}vgl9G01twT`+%;dZ${ibRe zAE8M}8qZrNHB~>US&hz@mNz{KLi3SJUsPL<^QUS+!=&Rx4U>89)aQgE&uZJ-cUhlR zFFmb&&a7F9m!QTScN410^cD$&^S4UlLz zHt}`Ln%}zkNbNYa?F@hZC}h#vvCFUgI;~Bo)?U!E<>)wL_jNeJS&RKTSg^n9dU!ww zbh4OUG|*jF{d(C~7YY4++Ja9Yq&l~xkxo8dvx#Wqdl7q6Fg601_Ub0DITmiVr)!8h!X&UN)g3*GES&ON72djo@tB8oG?HPX zeQ{O6C2iN*h}FZC1nEm;P)Qt5h84e74V9!IxHW}N9N*&8mh5B_#={D@`1tVv>|D#y zh@@%i_Jk@gKeT17)vv4*h_ZH^;cb6yvQAL9tceiJv1@z;eV?|Ygx4l(37v;Y<5-;5 z%>&h;nstD;ea+2AUPm5+0_6E7LfZ`>!7z|O9^KY9wfsj!X#4Sc))=PY*T6Cqqq+9Q zs--{mV(K5u2^oGOyiaU|Rqn(6-q9S)hqPrq4gu;13%M`|A_Nh@pbh~5>oJlq3UEb7 zDA7&EZa5O)JOr&_v=(E&U>+dLnmm>}tJsF)y!CWk*Sd(+8ov<+h2^n4DOpBX$H!ts zhiKPb95oi4T~xoe9tJVBKEg3UTi0lV^QH4^?o`%schycB3RG*L9h+egF<>h&cngP# zwEg0sZsG?feL~EhhaaAmou*k>VCFS1+a7_H(U~yDK&i`{sxKmtfUj$ary^^5dDEFX z22KkA>o~72sO7URXqT|I3u+iS*^a=-Ikphn-BGUvNP(d}#%bnGn$ezYeb@CeKOCc; z+pNN4jPobVCB&EDH19Vw@|r4nxKG;D#L^h;Ph4bYO2c}`{w6%$yKfe5RNs|~!!63R zjawNE#Qhqi0iO+5?Y*YRy2i-7ztY%66h9#5eV8vPKGA_&nV&cw%3rdB0rR2uS(})e zG^jl|Z+o-~oQGI|`LdfQaeVJhLI6Vm_R3NKCKu?nWU$3(qsL%NhGGn`*7`UR<8Xb% zw!k=C-I&Y|ht|Wxl8iG*oV2D1g0Xj}%y@_fcn{8FIL45+lii>LPLK^qf^5JE|924n zA4)qr{%72mY)!ouy+E~5sUbTJtkx`SIa>wp%es0&F!UVYebQt#cn)qa>7O-0 zt0~Wh#f4z4Ys#8%6XPXEFR7RBj}w>934NBV_|Kd=3}sG!mH%dP8+K7%%tFE)F zhf22Y+W%zhPK*bqVd%16g3JsM%u&xrWba^L@xbz>#l+$rc>wmIuft9}|MdZn-Dfh# zLh*^cS3&4`IPH4$N!*rz*!g{yTDV0RBm*(U_)WjD|a%IIR|5> z_Uo7gJsq}__Vcq3840_Iy2CvlD!VT)WAF`<^$=hXf3jW+w?*RjP)%{i3Bu{Dg-tEl zX=t;xjv)e2-g1PDGhnZ6ZPSu|_zIUw(s?pFIZ9?H0p}>|=+F7x(#!89WbAgrDfnf6 zv$UJnfVc1*oO~2`t9d=Z_l`|X4F{Wu27~cnIC#&_Jo4Vn3f_nBY`{PprgD&+qt>8Qkh2Ay9N3A1XQ4|5VpSeqc2ZQq)y5Z3( zk&i9ASif^anQ$nCIM}kwolC|p*-N+Pslx#5B!ViRTUNm9t1UTbxmEb5Pm1&{APCj-jyO((7PCgut zIl4qw4R=@Vr(rG|4Rk{jF=Z#sKQm-xZi*oT8~rft6nGx~8K#}EA`cN0vc3uCnM_*E zG41obaYB?z9#TtPV3>JK)h)HRW#~bLRDKG%sA+tO}SM-jolKxMSVTrQy+}UgyfR~#R%$mc*;JRSv z2PIt8oFfjLr>U}z(Lw#H)E)5Fb!QL(8qd$tweDml-vMDn&<8}+)@XHnP)Cj0HbHxK zyi6JG_f;LApqRjO#z1^{J3qt)J0QgrZUN{5F%kg>KdRTk&;GfCA9J&VKMNO5O7r`h zT>R1xxSEv-V4@DVi7)ui=K)TBAmll#lFTfvzf(8hC|h$3ropfhmBePmcK;-)?Qr7#`Ltgo zDpY4EH?P~-ul+dR{+_j=fob@ps%4DUafa`@5b<4%W z1QvmAdgheo1`un_TaH@3p$-xr1J4-WF()YLGim1k>73xmRRu;#S5>&1k9V1ewKVcA zrz6~;2LeiejX3pHyOps%L1qZw#om}6{Nm&Qky7|ZbxeDJ8lVFqf@HZ`HbiV7-am*S z@BeQ6TezI?X23v%W>B0UG{{8togKZ2y!XZNL5H@uTMW z;726_NCU^so}uKcBlri2g4aBb(eAHG41(e!e9=-9VK)yfKVw6ZwmAl)$%Zn>hHPCS z9NSua6pS(ZN$08vEg_4}A{BE7(GdTG{a2tSYgOi8Lum)2w ziSv@{P<=eXEc*_clalLD)<~QO)_QkU*%`>D;h1Qu# zP=JTGiDl!eaDbQ9NG2e}B$Sb;4zvlX1hZnPx`+YQJZ!A0t4s|^fDCj=@j1Lt=HPNn zfcS_~VAs!Yc?PbOeMGeGS24HR-={qN|CM*Xu}ze59Phf? zVXWA);X=>hU8~}Vf4ZR?nwWG838HU0-hmR=5Y3jr;&>r%%OZ2tL}i^a%`}u(xsmTHox&Fzt*AlbUsjaWlpkeIaT9Kfimf-Crh&FKyDS-SxS)QH$KW2t zJEf4&TN2UaoKt#Ug;B#DQockHHdMm@(VS7X-|X=2D8U!ZN^LX-jr-{ewWHcRhK{{~ zh83blBxn(T5H`Tfy#1+|FPx1Q1DKmD>jg*X<%_mx3E!VTP`ryiHfIF8nk3-K-X5zv zRdF{7cwzvZ~t3=xzK<<^OWrLcik)5uV75Y1DPACKabTPs5#PJeeD=_fz2A5gw8mZ z$#4!jBl&Dv$GKql{7v#tz`)|~psd^j9n8k-l7Ym_DGChnPWn>?X77u!js;nt8Sabw z9bJEc51tBb z;<$IF`#kuZ_}t8>>DFwiQ$V5Nd;pVmu@f?P&e*^%W@Zg5*Ouu{jfuLb=i;@Q3w~AD zkDBDsFf5{^2&Y5(btToAu>X*DVJr#Xm zEp9+zr<;Hori@J(p8ThMgxw{ljF=N0Sf7VJN;qH`?O~hK@%GikEcN23{#+CHmqI9CHmAoin4>)`h&tGKy5tk9_ z_Iam8slvb{#4~X}$BLKX;a2DXZ~}hLA0;yWh1F$zTf`qOKnnw7&-k<}l(#-(J^mIk zo%%Lb=7#0<&B<{#Gmru=7b4AVT2k9benTM}F5#zW{P{g5@;$E=G4v`a^1bE6z?C?N zVPG|4NC+`d=p@;GMY2`>cY^~leKh}#s%v%tT||DNgR}~&*MR|Ni1q|@5N&2e;Mrcq z5<_gQ#j|kz4|hNc!&Oj1gmC*BP>6;^;0F{?kRXReoKVwsyPV)>(c9dSMVv6gp{zl3 zBKvS!` zsFcvtzW&EpP*al3$VS_-Dw}&!{m3S!l)frXZvbS4564|QG#ZUR}SeTSj5ZqX@5L}45eQ)Mz zL@O!?c5E}z5=EhIT(}qCVlqUWNvG`~vnW_MrBE8J#)44u{LV|BZG-66#T_`@d(Zvu zIp6u-xpy;;?WxlMx;CoL_Pk-?;pPAmXMB`OWu&HZh}CSwTQ*9x{T}i388ury#q|N& zLGj7CmW6~f164i&%bD@it`gLm4dg#Y!Og>LUqgR;83UIr7#xi{5O0)_t=otdui}sg z^=y=X+~>UhHFBtVFvvmh5H2!0wy$y> zjBVASl7)`CQRw1Op@+kX3Cuc2p`4?(ssX#-;sJ6fKWI3fIe~O#h}>;tx-Uqc;OoYb zq8(`_`^V>DRSvL5!JG;)Uy^IGjv$C|4|2iHkcaTOi^HWBQt=yjQEGE$e8t+cTYT{9 z4n8l-dhRML_dHBeu7>kZJaf^8vGSSJfa-VKmdmi-1HN}Uz9~J?_<{bXJ;fdwWMB35=8cW!OUCWG7X%#F zcU@pFer~L{=Z%}alCeRp`hHvhE-oX0ztwc}HDi5=-%Rp|{~l+=8q?Ubl z`^@l;J(DpXiE?h|84(QqMaCbOd9?5Du}yNGTrFVKt@)`Mxe+rNVOG-^UCm+4&3nm3 z52+AKpF8Je-S_>}q96Pz`0_QV%8;F`^G$G1dD+Vz9+em!Y>hn+ldQkW`)V=9L}LIW z=lmex*@@_FaED-C2FAEQDrf%*%Xnk7eS(p5f|FWgo-bfun|(Q#gGH`J_gL8TaF5yM z@Cc^5C&TwBS@SnnqdR!-ytnlpq!BB15!A5xZTpNNcShc@LCMj$VhE>9yI7nNKfg=Z zckHdoN4#TEPslyww*F}av;tZIt$a0^f32y8r$S)9k4 lxP!Ox2TrRP-cftus%cczEUM};jN>c3tHxPeOxu5J@D~#Pn;HNB literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/HAINAN_mc.bin b/packages/linux/firmware/radeon/HAINAN_mc.bin new file mode 100644 index 0000000000000000000000000000000000000000..a7b80c3d7424429279e4ce08b65aa158d0a947a8 GIT binary patch literal 31452 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 LTH$-{|C;_2Z{jPDD=Q2tZTnSeh)u(G z?lcXUhE_B+As@6rv`S2+-PBE}f41ETC+)U42_tL66m4iKQ?wz}2v9YY#CzUr-{7Fa zr2UyD8R>A&x#yhsectE&ILC>bmO2Tb-vWkBAf7kxw`YEfegWmNF&NR)FuE+1##>Ca zbuYq+HapZ|LtnK~Low)tGY-j^-{wi53M1GTMM=A<-io(C$yw1UI?`NEn@+!+{fZeF z_`M&fu%O5LO*FV`@0Vg;ycdD1)HOogjx5UIo@pDnCzRV`TnCJ}X;W`jcWNGVs*bIm zZ3%RnmHBm>o%vO&0er%;C$77fKzNB zhGU5c0$hHnWegs{!}G@f5YL_*o*z0s?Xv@aBg=>jf$H&C+U--D*@iFm#8mFme9Y5F7 z&+`N~_bz#?zt<7-#O~Dz!iNQzvd}=Dk@n2HaC|=Z&jmP*#OSM_X&Fz;E zPX65vxjB@oMWEBpWQ2q8NxbYIhLQY}8MtaflN%==C6-*iMxV)YcE+0e$dzG1RiykV zrz{U^hKIIRNG>`4$YLP0jc2y!w&NX?|g2l~S(fJse(`%_HqLf?Pw?mJ)vbXsWjt`MP z)+~{q_^egp)II8UzYZ;HI9}`>$NMpVk-tmEP3zn)p4xF2*TqT1H+?6s-U8EcZu;p!%=$oFhMT+u+3i zT*pp(rY+95D?L4uFVlALeC06eWKC*u8*_l`b-`+W<38b}&4R%`O#53c*8OlXlHrrH z#^esEy$Jund3faP)}3OrrHZ0Z115sOv#3r45lY{HFMS@fuZE%6E9QB0SIqHg?O>xG z>td|YNA+FQ9T`PTd@6dJJE{~VqJuS2Q%@0N>22aDX8(Ix7kwp^+gFLQzG{>t_E{yY z{Xt^(^mBjufSlo7MT{JKWGsHI9KwR8O4^I5rER7Ws2);d)x(HYkD%Gxpl(jre_+;e z%fWMxXY-o66W9rVvI-^iXJq)G@H7=jJsmM!Ze@M@Vdm*#av*!Y>g*{d?m1n^WZZpj z{>3-(?%8B3iOn4o2)F*m3Q3H5m^;_#1J*TT$fhsY_)U3ecib>lYA)|0-k;k#7_0lt z(8G6>)U@rlh~sT5wBrcnu0g1EnOTuMY6f;+#D+aFY)HOi`I1ZFV+|Q^w=y5?xXXRV z%uwPbGq8(q3UVGvA7wmTcHRy%@Y9~CYeWAHJ(&*c``egP@nJh8c!QOwtEtAvohETN z11n#EN*skR@fFk8DSiTD4k#1f1X<^TjVNAx3yN#2gE5r0!^wNr9zE`Jsy*bFS%2{@C)(eixqE6HwhID!OU2 z*w9z5C;R5;`+RHo1Wz~Ak6b%Muh=5GEf`y5z1>#F**_t;WZuPfnV+#HU!i=J+5p{c zWhNOuQbV6;Hy_yXXRwCOrr*lh=CI}C=le%|7@R;|)z4AaddK!vew^)tFK7G2Ny|v| z+r}9irO9oq^$gL>;yTb^}{ER)hJU<^@ z49@=0^nQ=CpL50m@6+u2+l}X%N<2$!^HP+xoYW@26Gdxa7h>OXNgG+&by(1C zqw6&FjF{OubE#eCf|Yp^6zuj>8St%BWydyT;`dBnVw>eleAk*Ezhg=5Dspt5pNTtP zSB|G*a^rP*5*{t;$-gt*-yF}xpew>K=r_X?MzM!?Da}5SWSuWL?8I4XmzkN0-h!Vw zu6vuDyXmytv%RZ;=v~a3^=P&^Mf86;)9f%xw>2wmw~}9j;s-QU3HBiE^C#Ep<&hzsm&|u}9L8NQ)a&60`0&XOnj4 zgm{nQ3jYcW6c{KlP+*|IK!Je*0|f>O3=|kBFi>Eiz(9e40s~nFwEh{q>Zd4DPhpl? zk7Bh2KD8ZweH#JHMg^8&4wj(`D-gvREW#x$R);WG{Q(PgGwSt0EKv#6sY!&5jie360yr`bU0p-O(6~@=q)A*(`aa4T~-%`79OuvVO{t!uh6RnibzhV8qwSNO$ CRm(a6 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/HAINAN_rlc.bin b/packages/linux/firmware/radeon/HAINAN_rlc.bin new file mode 100644 index 0000000000000000000000000000000000000000..df07678f6e7ff22126aa8fdf35a0959f3d1a539b GIT binary patch literal 8192 zcmeHJ-)|h%6+Sb&YtN3?yW@DBm~^w=+G~4E>~_|OlD1Jb5f25_A3=(#lwzDnRwG`( z5`Dgeq#rT>IRq&}a*z(0 zqQ2T?Qf03HNyPK$`Z?;KeMaigXF`2o_IE0IO3P z_}@(iBn#jLyX@6M`NA_E`{%dKLgT*xqXl{=D!8`re~6}D5wp# zw5gGTbziRuQo#Mwup3oDmoRo=d>Ot3-_AY01^CiYX0CmNsQxU zIIqd%g7oXsDk(fyTp?va($})DkT$f9+84oNfe7FE`65xQelCb_vO-jU0r4VNqbi&8 z&~tnA)jhZ>a1&Vf@gAI2j*a7jFwgstvkIR#nYX3J{~gZ#qD?<#U*rwDQkH2!bI%K1 zritc$Z0qJx`gQj$GI-y?ey_}x5^H}$p|+_v%!6|{10MFx6OoxB1$xdr5{x4l**=Jz z(((wnc!TJ`>tqbS((W%JKkyK&N1Uo>P;7yGA6SOOdd5TEUC28T;*0>F{d2HWVAm*9 z#UA=U@y~xn{JV8HgBXGwz)?42A`TV*GaT14;*z7K{M*QVH|Ei;3{?6QUB5Bmf;96|FM#S@sDXl`RRkzNv&NgryM=##B zc8F+M`a3V!fqrmTXCH7kDzl}YjRjz3OZzt_g0Xj_2cuCswAMv5h<;rrtj(4VY-~2L zhp&=fGRVJko-vVc+UusgOcghQe;mD#=J~-a_PJgrry}(FgJJvzz7x)Qh+*&q^|?Ky zvp=6fY;)fweGT#SoFKzJX6M}>iRA1vBJUj_b#_rC*>_P=>h5ivbCN9dZ^A23j`u&f zwAk+D=pOXnzgXu!3)ghdzC}3GtgH1G@x7e2zJ~mIMkx-wIAT8o43&LbeBLK=H>K)c zlNn%s?y53~cj$HM+rL8E;1>0DZBb(GS3-ww41P*|JzIO`r|iHV_?Hk5pKtd;?x~{B znLAuD6VUH&>dL3k4?|Z2ZZ$Hok3I=~e+K`LaSSd<+&|2V=G(eb7}Gh>#IA8qPFnB|klTlJ}v zt@`v-tN!?OtNz5}t@=|>G<7M>^4X_ab@yyj_kFW0+}pZFqIQlRlUmHj*>8cH3CJX5 zifbC`Q&O|u=KENttTn#JoGSunpZY-kemcc|%pdNsM6pUr620KOCzWiOd&0lPcG+9p zTtg$6IfwzhK#2vLQpGEzR0SoRc@cNd3q5&)l*AS(dV!QIYQXp4Me;u%T%x|cIIco@ zcU~p~Je-IBf%n@0uj5XcU}nk27W%$-1I>)@a~x(b`R;;9 zy1x*H`=W?D%ObNN{Ljo@pLo7!iL^bo^s?~(&V7g;Q!#3d^>)yM!0&UaGEoFJ-X}4R zZ`lqx(uy}^ntNaB9(oLY?gu$*rKEQO_u$i za5a%eO(*M(S_XB5tqOToYLs;iV#B=@*nR@sM-X=g zF{@5i=$L<%dnt%dUm>$xd=HpP?OoIYR_NCoG5d`i*rzhEggw$;?+kq^1Iyk`?1#$0 zMenm<{H6ELU|jLO49~uN8RxIM!ryfE^LLdUCoTC+b&|gg+e;(0;wJA&_lFIRWn;}t z&Vj}mIdY}{N#467wf>o4?_RKVJ|nqCjDh#5jl71BV8p$d*2-i%uSx^wQ5*1o!{_Mi z??n>-uMbtopHpnkzs)&l^BeIr_RA*TcS*($Yt)W6-XzZV$55vU_hCvq*GR|qPs<$H z?iHc#;=6xhw$$smCp-9_9KxLu;`cfSgSX@9fMW}`a`2wmao!U8q9k7TSJYiAJrMLz zyxl_YE%94V{ZQWy#y|5~S4drEF+Oc~vW{Bj5#MR&0;TwF;&YH|i90vAgRuT4Kfrx>Kfrx>Kfrx>Kfrx>Kfrx>Kfrx>Kfrx>Kfrx?I4E!4z0f6`b literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/HAINAN_smc.bin b/packages/linux/firmware/radeon/HAINAN_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..6bf5b369c82629dcd15d4d6d74013c742cb96c00 GIT binary patch literal 59004 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 Kpu)iaGw=)9-${M| literal 3072 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 d?zW6@`KTDz{;c^?1syRO(3!0)r{{{wT@s{sH2 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/KABINI_ce.bin b/packages/linux/firmware/radeon/KABINI_ce.bin new file mode 100644 index 0000000000000000000000000000000000000000..7d40fbf14c1b9f597d60151a9c1b149eb8303bd1 GIT binary patch literal 8576 zcmeHHU1%It6#nkcWH-CrW;e?wZnkMMY1cIUQPWx!ZE0rPf>02)QmW!hEdirG_C;ZL zGqFW0RcWEgwi_!|TM%i%(kD@Iq?6F%?iyo|eTdo@A)v%o6RA)$es_|ou|D}I+<}jK z?wxbbJ?A?=brW56XulKl#2oP(@hfqYxIz3v%;rr?90f2vM0^2!Cx|TIB$22C!ihpp zO^Dl7Kx?m{{iKbcUP0=J4Ol=Iv4&V{H$vD^6TH(>xz@XfXPM=wn$Vp_=&>)>A){&qCz( z!N_MVA@$qNVMn0_>9)7gH@*qMU=KvwN8;A74SmGM%K8DU;JrO{1K}EluM9MmO$52$ zT0M*S*9JmdLl(s65_STnjH_;9MOApQJ?Uf+jU0fWZz=jF4;N*w#4#?$;aP$LdDCG%++md%~TN6XYjquz2t{=kXXzWX8hbNuJ}=|d#7O(-a(pn z=RNt1l|F4k8+*_5Z~ofSI`%GeW1^wq6vWthK;};7jdk&d{}$^awD{KDbs@qs=31L) zLzg!88!+U)WV;Q^>%#Yeb=^`+-_h4SeeOqX_hr8>WKYuXh~y)egYgDLUw*<)`#tA; z3&>s@VO`YOU(V{@%R2jxJs04L!t-XB|1{P_K=wd>7kf2>WSR9{@7LzWU({}vE!X8b z8~gyGc21kE_G>@YGuj+E3jc7JeR>uNzPn5MQpUpM_#thUxpJjn^4#~8@duslXd1Qg ziZ@r-+j7r(D0+LK)sG{eH3k1Que%LFeimd*6E;%pkv1oeu6)iG6&q>VyhpyX>}(bN zXus>MgEOh~j_pNThScHty|mFSW%>VV935Aa=q$8YO{Xoyn1hY-tgzQg6yCIBr)~F7 z>Tk?lXV12paz5#WgH~eF!a8YV0*kAhne=~KjzDG#?l2be)svc>?GeX7Qu^wAqj__^+GS^#&ZDX0oi{eer9MKb z8qtblqDU$pQ21{g`~`g9F1-K% literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/KABINI_me.bin b/packages/linux/firmware/radeon/KABINI_me.bin new file mode 100644 index 0000000000000000000000000000000000000000..d1da0756910bcfea9e521a02b0ce25cf4dd7de96 GIT binary patch literal 8576 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 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/KABINI_mec.bin b/packages/linux/firmware/radeon/KABINI_mec.bin new file mode 100644 index 0000000000000000000000000000000000000000..719e457b27e611198317bec3be33fcd092aba770 GIT binary patch literal 16768 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 vP58314f~Zk98fmntIF@=LFINFQV!r@@-tAL9 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 Y&`zONn?;>=32E&kJf!^t_1cyH0qTwc0{{R3 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/LICENSE.radeon_rlc b/packages/linux/firmware/radeon/LICENSE.radeon similarity index 97% rename from packages/linux/firmware/radeon/LICENSE.radeon_rlc rename to packages/linux/firmware/radeon/LICENSE.radeon index 4ece3404c9..0d1894f8a8 100644 --- a/packages/linux/firmware/radeon/LICENSE.radeon_rlc +++ b/packages/linux/firmware/radeon/LICENSE.radeon @@ -1,4 +1,4 @@ -Copyright (C) 2009, 2010 Advanced Micro Devices, Inc. All rights reserved. +Copyright (C) 2009-2013 Advanced Micro Devices, Inc. All rights reserved. REDISTRIBUTION: Permission is hereby granted, free of any license fees, to any person obtaining a copy of this microcode (the "Software"), to diff --git a/packages/linux/firmware/radeon/OLAND_ce.bin b/packages/linux/firmware/radeon/OLAND_ce.bin new file mode 100644 index 0000000000000000000000000000000000000000..497e13213f663fd9d46b409c04e4f8c21afcaa05 GIT binary patch literal 8576 zcmeHMO=w(I6#nkKnbyQ~{xXwJo=N&9PTK?&8Z1aLi}SeTSj5ZqX@5L}45eQ)Mz zL@O!?c5E}z5=EhIT(}qCVlqUWNvG`~vnW_MrBE8J#)44u{LV|BZG-66#T_`@d(Zvu zIp6u-xpy;;?WxlMx;CoL_Pk-?;pPAmXMB`OWu&HZh}CSwTQ*9x{T}i388ury#q|N& zLGj7CmW6~f164i&%bD@it`gLm4dg#Y!Og>LUqgR;83UIr7#xi{5O0)_t=otdui}sg z^=y=X+~>UhHFBtVFvvmh5H2!0wy$y> zjBVASl7)`CQRw1Op@+kX3Cuc2p`4?(ssX#-;sJ6fKWI3fIe~O#h}>;tx-Uqc;OoYb zq8(`_`^V>DRSvL5!JG;)Uy^IGjv$C|4|2iHkcaTOi^HWBQt=yjQEGE$e8t+cTYT{9 z4n8l-dhRML_dHBeu7>kZJaf^8vGSSJfa-VKmdmi-1HN}Uz9~J?_<{bXJ;fdwWMB35=8cW!OUCWG7X%#F zcU@pFer~L{=Z%}alCeRp`hHvhE-oX0ztwc}HDi5=-%Rp|{~l+=8q?Ubl z`^@l;J(DpXiE?h|84(QqMaCbOd9?5Du}yNGTrFVKt@)`Mxe+rNVOG-^UCm+4&3nm3 z52+AKpF8Je-S_>}q96Pz`0_QV%8;F`^G$G1dD+Vz9+em!Y>hn+ldQkW`)V=9L}LIW z=lmex*@@_FaED-C2FAEQDrf%*%Xnk7eS(p5f|FWgo-bfun|(Q#gGH`J_gL8TaF5yM z@Cc^5C&TwBS@SnnqdR!-ytnlpq!BB15!A5xZTpNNcShc@LCMj$VhE>9yI7nNKfg=Z zckHdoN4#TEPslyww*F}av;tZIt$a0^f32y8r$S)9k4 lxP!Ox2TrRP-cftus%cczEUM};jN>c3tHxPeOxu5J@D~#Pn;HNB literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/OLAND_mc.bin b/packages/linux/firmware/radeon/OLAND_mc.bin new file mode 100644 index 0000000000000000000000000000000000000000..a7b80c3d7424429279e4ce08b65aa158d0a947a8 GIT binary patch literal 31452 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 LTH$-{|C;_2Z{GaFkFQ0~i z-v@w73;Onei3WG={W8o=^dWeKx<;tmkwrP&Gi3w!g!6lhYk-k3ZR*YGPS1r-*Rj>J zErxEhvcGP#v%g9=AV7Upw9k`{!+Tj|vhlk=(umZ8n}eIf7Z4w`ff0VsSZo{*ay)20 zu&4F}0__%z5eo|ho7h)?-N7XsB$_QY;@U`D8%;$FXK0gy*FOrCUP^o`*jBNvfu_uw zb{o~{vK-D1n>fqh6&@X&WyHA_srq*ZH&+iJewn%j=OBB*EcRSBb9e;1;C$77fKzNB zhNHg=>jf$H&C+U--D*@iFm#8mH-J9Y5F7 z&vOMg_bz^{zt<7-_^q73iA``n>~Dz!iNQzvd~!0+@n6!_@Gb1f#baWlrP?gx#ye@zGCvX}i@=|!fyCiz!b z+X~khPc^bGbtAA9MzS2iomGgCb4?z#U~%(SbUsGr)LJ@*80FUXZ`Wh4?3Mr`i6QdG znkDj+pS4Pzx<}oveBov5R<4zsVe-iI#loqzO{RLkmU&-|IeE_GQa_S=Y)@j;4(=GD z{CrKlys78)f!_1?Gy43$GMjo{6TcVM#RO$d$tb9ag7rV1<^I?Z)Ie{~S@JWd4Nm;e zaqP6G+v0rd?dg$xnX-fDtAe-+C6t5KTVYn8J0 zhltrT!2Oy1a)x&mF>>sYvG}!W2=kk&XfGz0w3$Y*dPt2`4<;0^>*vr$TaMu!gwPm{s)(^1pqR@S#2VxBG{2eRj@&K@6e&+0-p>+W;& zFR_Vt&n8<*Y;GS%r1dveSYp&u3*S}xfOX9nvgr#pelt9@J7JhAJ%@J@@6VPF#_C=( z{O}zmHEr8X;&|H%Z$C`AYY=W-YF4I>n895auwi!`8&dCB{?roqSwn8OTiK7c-{roe zW;pqh8QjS?1v!sqjxZiBId6w)_-RkfwPE18p2$S>{TAj_V%QD~-cS|lYO3*Zr%BAK zffX-6C6BYQWxQ$M!+Gv9@0<~UThiOO!; zEH?C4=!yPW`aa(pe!>VQ3t6vwx1d);qSp>f>A=dO6o8Pgq8B zz&1|XC`+}l)-#9`r>rt^UY2;p^b3~8U$QQU9j1Cg^b5{HJ6+qvE(^wYrsu`Pp*B-( zadJX(V;rkv1E}zf85i9*5_7ULmm9_<$}Y$a;}L>;yCR6l{Ior>tS}#4 z49@=W)P9e%pL50m@6+7-+l}X%Dm+VUbJJC*T)ziKrnB>A>bM*K?bMyq;58BKLkI3#cvsouj z_@7&Mhs_6dn(y7%$k+5IP7UXG*2@&*=^y>C=ubNA?1YP3_VJxukzNfCdN!vBR5``C*jeep29oR{mt=A9J(?BgMO3x?(^_2rP;?*tn;OZoH%RkGP9Ghn+Pz+ zbzhTnH=UAuwr?d6yNek!zO7$vt%LtKm53gmKf`vGt%vOmwhL@;%3AAOtKzgZevtFG zIA-k{-=80sbz9^6^5b%jzmy+WaJ<{y&+!hy#`$r+#~%5{6CU_ZDQOCzg#NE!y!jZ9 zmH9Yc%NX!HeE!p7PB@dd3Ev}8sbBPg9)3P&XYzS7%-n1m-o@Ou$CuNG)9xw3Am{ns zncu`*j*TMA-1abL>oc|5;mY+9z~1^eu@(H6lSRP z@To2Et8EDATL@w%DzO-|uoSbg95JlHLR`cmbr5sZAFx2LM!i0O#VUz9HGzn+3=QfG zmZ+0x#6GN0?P#K$m8uu3*ss=?@EP?Dti=adqpo3{K8y|OO_;`6G#h`zMqPqUI)LYN z1fSPSuv5Q-7uA#4ue>;*BKW#`8sAhVj;Jri3Y;A0nl1pq29ZH?04+_HP#P B%S-?O literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/OLAND_rlc.bin b/packages/linux/firmware/radeon/OLAND_rlc.bin new file mode 100644 index 0000000000000000000000000000000000000000..9e575acc39d892485bdfe729e28fddfd5f1426db GIT binary patch literal 8192 zcmeHJU2GKB75-*+*Pb1(cgOY`46-*4Uc(S@x=YkR0$Y#8LqSRdNRU>j#74EMq?HI& zUJ%`}FStJ&#RwX$7n>5bmGVHPG)kg8(4U7(J5Dy$?%Gsw;K8k`DC$dzszm8e6!7%B zvo^+2qQ3QMS30_L=G?h^?{~iMoa-6bl9_})Ew%4+)Ht5z7@C%PkAU_HpB+9&c5y69 z?Uqr1lmC^pIv3G232YcUD^g>xizq+6xp@-)xaOE#?ofWCW7hWKxPTs)sRB56Uw%Ez z3jpfA{;hmcnE7==&Hp4Hmu77OM^)V31vURPM~z$AV8@gnvMRs;*Q+x2J(*Q!rCC6JQkd2K^>4P8H$CG$2W+iuI_Xt`{5i*Thn!UBVOYUg%*(I~>33udTIFs2 zKTkvdUGE%_p7;G=PIqR$`XXc9ncD210e3;_?sb`%lKL-QT?UwV+Ym1a{X4|*irPyh zgd?i+2H@nLg$>(>RybfwUu2I2=m+&24PK7N4DHHl2g(LV5c(OrV}cjBH=^E?CHMWGK>Cjjp8 zDf)?`@O|!G?Wsq`1;)<{Q^tYu1CD9$!G(_7u(sWX&zud&?rdcC1EBpDx;Eb;)@f+6 zH^}uwRiHiCXBTk{Aud~ezw!s9Xvd`yf#N{rJcgv%+iMpRk#L3c0zZ?n3#r7a?>KhB zPObHK*sK1?h+WvTW7R)-(k>j_v+4_B7mglW>kl7Y>yHkv^`9PH>z{aft^e$aRbNWG zaO&B$zI$rb_kFt{+`GO3QJKJ#(g^t#fy^>5jwx;^yp(O3ho80J&%k%@a$`8OK?$ndEpB#FEv8MbRYhu(~5c|5&oi;VW+MQ0~UF9oP2BJIPBR#Nnn+u%n>;wkWil#76P+2IqHh zzFz@!#Z}Kjh#2{Ddp7kZd058*6JJzsxPG8>w~7tw6@!ny?f#ZJQE`h&77y)ern z<7!B`7i84#X6+)jkqt;#eFVT+^mz}hSxX+Nn zleO5P|G=t`Z`0pKUsrKH+r;#v`ds{*^FQQz<5JbZ$-Zf6p}E>h3{)MQ?3?jEBqo!6 zm%M)l<4?U$g7LC?8>e1C3txj*;i@D*fgXL4sN*K!k8E%$@!Q0|A-Yq=lQwA_!a z0z%Gr{x#0D`LTMO{taNWj*aixcnZH<-Z|aGquNR zC$z_m3c~D%Vb;$u`Ju7){-Z+MWJgBYE=i%~1FS|UEf5psd` zao9cNB*>9w=HVdg;Stvman|Ew)#d)I_PtUE0{vT`qyGzm{>{(opZr>*fBwh5t(EkG z%9;DM`u-IEX#><}HC=z+sd9eFx$_3ys@IK&rsPsPG0mvHs`eIUy-!TfkwioKY*vvR+n`nKs9$K2#O>2?tIlK?( zvU}4rJWHHB+%$Gpn)FXD`+Z}t1pL&<{g}d$^CRTF&ihfQay{@9T&q>-sL}z8mZWv5 zTx4Si7p4EH*P2!Qdz2U{+(XmsA;i$4weg+8SJlCXXYdNJ literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/OLAND_smc.bin b/packages/linux/firmware/radeon/OLAND_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..44c07f9c5daace6344067f1f00cd6148e5d13362 GIT binary patch literal 59316 zcmdSC4|JT>dFTJkA4y|d#$ynm5D~v42^e_<5y^nZAT}dgBo1-1A~nevo2+EZiCdhM zZ0XtA)?G%nNK9~2x1kMZOSU8bNoh-3+Q@k1np6ftO%1HKNjctyHU^y9CZsqC1Sd9r zf1mGt-;qbMOwx3JzjJ;%N9X->?|bikp8Nd2&%G1>m<4~4h*{*BL5nUTeA_1p0N3! z(lD!Is~P{HbA2!Pi!Bzp{sI3~@e+$(f9uD}0WOY=7GvOK^(*P#Hj5WL8ctdKW#4~` ze*OdfSvJal%=Q136P8IVc)%~M7_#_^4VGB3(Hd6_TXMzS*0kbt*1Y2L*0N%gc`NR* z_7z{S^osvs#T9>S>oY^9Z|?k?QbO(P{*L=o2|GahkC$m5xO7jwc!qW}w40&b4DDuU zH$%G_+Re~zhITVwwL3Gkol)Bl*d4;bVq+;XR!UlKky(1N^%dt>WbBY<=^M>*!~2RmpG{bKO|y-* zCk&XqbgwN-X3WM)B}?~M{8vA1^GdfTtvp2e5U_6q_95%!+Ql{NEwadsWs8+E3G-Sl zGT39b(zEw!JU6VeXfCzyfzh6%+Oidy#OOiK?3w}phu}Wa*JCqpD_i|;OW2+dF-FE- zXtlmWX7N2AO4vd;c=?bm`<(%6qRp0IKA#y(uZmbUZjnqXk>9g{v9%_w*Rz@Ffrw>V z6Wx0lYlS{naIfd>9xzs)`Nm6`NBsofcW0yicj?z#!M&cIsYAU5u7AXK~@J7~_7mH8Rdvq=*ssCTu)d>?u1?V*C%XV z{Rx}ee4ZB7|_1D=RraQwc=_m}4V)9~jBaP~U1-UzJ+wC%=!tR=tLV$7Xi zYy^kV89(b@WV4I2N|DN{W?RwbZC}uu9(MTY5&f$DV_v$A`+m`XVhi|)bWz5?Xs55- zmavs={^@{sUKcJC3vW+s=~!jn1g#BNUtcSDUuAt`rDpJY%;Vdo=~dt&pp~V92|8O^ zLuX5&jYeprN(+r4EgS@{X5eaqhm-JdBRuS2^sY32&0kpkZR0lkS4XTKyvNs!Se$DE zxIVyrg8Ky5nY!|B|5&-Gd8p6Mu{y4CuJv4_TpNnB;PZar;Hd}lDYM=yZ4Yg)nWpVW z!nQvVw!M-z{t8^hPS~a24sf%-ShxxpGY$6(F9AKh@L+EB{sMG(9Nbv8VDXWG0yu10 z#~jTW<9-G8$Ho(;v7E5WUs!ni{_&nw_Q}N&`y_HBNxft*G6vdBoG|aT6PAi;j!xKR z-#uY%AK@Eh^+h+Iu!|YX#jCQhnXh)Qw%H3(-u43Xng*@~?djoQjL=8QVi{^~n&P^@8V`0UJJHSNwtC0**Q1_`ADP7H4e71%t*TIKai0u|o+v z>HEurHjqOp>po%W-_AssLuCF5i+v?1J2IMXb>ovRX-7_`ixGH@@gm<0J&@)a2hSfr zVKeUH|8q5MrWfA+)C07;ChYHqo&mGt1>fHQO{v2~tS35T+ zto03K$4|lWpM&3-;Cm#*|6O7G4m-bcIdj`X zJN!Et6yAg5yxs?GKlMP@mEZ=RgBP2S(@ErXBXYXRm+6o%UxhE5;L9X@*$7`cp3I~g zO5h85=5*R}_`V<7_cea$34?yUtIWUVG5^$^J&r&7x_c}d@W-S3MyVqj9rqZ+#J9d* zj5WINk?AH{g$}Zl%j1*Ep{;&&MIH6tHMw5>boCmj*EG2v`j4?x`wQEfLA{xi>&=|5 z-Ynsv`@_}@AN$}VT5R;C<7epGg}3{@^mG~hKk`trDiix@d$xH0q<{KxWaC7=k%t%y zx?cKObA*oWmyGI?d|?ilrzG>#$UIf&sHs+uLZ35f^Djaj8=q1Zr|eH^%cjiX2N?6( zNpsk0No*F$+l!e)CwF;va#wA0FS$F9tK@En-T}{A^|h|ulc@rkMG~}!GhUpOB%NEre9rR_w@ELh8$zcTMFAC zg-s!TGUhAN!T(Lv8!TJpP?sTVk~`-wvC4SbcFxLK-}ljh-?GT)i#Z$J3QUKJ&L-}A zk@q`zKbp4DKTTWqeBk_xe%t*Y*E)M)teg}LrlG-hXwZWOTaXpa*mO-9#+_l@8OEJq z+}L+j+3_7_yddEGGxX&-~Ynqf_WeC{Y|fS z0Vg<*nBDMc;Qs?lR=hia1*hQ4zHk2-Sbx=$W8*~|8!z$CxZ#^euJr6Odj(#2W%{$D*X`ii1J^C!x*1$If$Jo=ZUonf40r?IogrZ)uL{Ls108k>4- z9y*~#{LzH%z7M;UHr_?u`ml{lxt~ehgll6vZTB~;t>_CS&uDw5>g^liUj5SkrorZk zKAHw?UgwUmA9SYci*ncBYKvF<9L1kgyYwBW9Zz%og4b-D{w`r-=Hd4N?*?n+`}pWU z!j-A7rSNm-kb}F9tEaInZFBFqZx-EsUe6Wo)%H4Yx-Wt}A858pf57{p-YsKydx0K& z>Hs>rQ~iYVw~zVD!7o|(r3-%PgkRF|OFR7H!7nZFOEdh^1ivI#{2{#am0-T{ujiz{ zZ0Y=0Y(cikm>v9&61vkXyoQajSkhcHKMj0 zexuo5i%hfyevxz0(W|g2I&D)rWlQKUHa}uEztNgLnzE+RRKYq9TSBtrsn0SeUQ+t^ zs~y{|rQ!vAH~RaY-Gl7j%^Xtphnh>x-A?NBTw4C3^DPn`Tdn1zi!8QjY0|;<1+I^L z9hbkoHeB&y#CFWH!XT6P>X z-VThObP9FnYQA$vo+@`E`_qTb8~vcO>zhVDfQ^JbaZeBPhCkBXW-~{JJS!}=M1gu? zKR>WCiEMJ>cdeya8z|3O#F*H~KgBD%SHjhojhE}X8K97lS}&7%RZgy#@Qiz3?cswi#O4gfFvsaY=mn=zmycb-T-fKF+Nk-#oeq`-eK6(BGQvz7Ksw zABiOmAF*L`reNypqu_ftJX7uS{fjKxTk>Dp4X$&kXY!J_g^YQMcNDsaA%iP;r3+r^ zM4qORr|rm74|&>xJZ(mvHX%=w$kRsTX_bbmvBkZ>20^p&H=!q*Y58fvQ&PRMe)HTbLOlK zt}(=J!y&U4-b+r+;Tq#QlXn->_Dt{`m%c`C#&|bFeI!!W$$foze<$}b-BZWeLfMS< z-Pmsp3%|}dM{wTSU3)Gr)iq$}jr9Xl>1}1!**LC8HjU?`FS?N*E(V+504^63kKAa< z^!J>P70qw6q-^Fwk9DnI4Q|)krCkqF{x2w@Keu%HA?r*(fowap7Mk>Z(V$}c%kH%X zcrUW@UW-xQzHGC_y1r%S0o!bJzh#H5i+I{+!MV3{82S7)-o?z`*nq#ZI$@(DX)8Qt zorP~fPv@4!XTc@e)$7^2inTP<%Df`)h%wxkXFe#ui0d51si2?e%|kZ3(vKb)ApW-5 z*;=C$^q1n@?H12t=Y@4;NBtzE!)|OI>rA<}?|++d{&MmJS#sUZXS(Na1vj&aJzbf& zPkxqS#q+m82OqYX{3p6T4GomRdl?x3uY=QT$I5B$yP)ybzp9qizE?fUUYtLI+-;(t z`<@vjE|r`=Y!7AUnm2zZHr(gzVeyN;pZ~iyy7O!O_QpdG+x#zE<&h^Iwy{GwoBt&n z-1!a9cK%)$%a@jX<8wuOWBV3+ih@9MbStY^T{;k&pdp+{#QBd;%#?~IIfbOp^Np|zh*(As;9wmipY z^A}m?{0~~o{2ogaW@z5`!7h9Ku^hHu+V=fP&R82<$r@q*{Et}k{QqbzYIp2VQn1`t zD?_jQ4YTrl-C9*$F@hfke1e_1_%F=GFXjseYfI}MFGEXCuB4^=y3^3DWTx;6PGjCs zNxa#R9-$sKW^U14J~)Z6z7s2N@J#i2_Tkk=>RmH96v)=zlGSrBc{-1)1*%)=&Rr~KsPnR4r_DVJPVd7`HL&YJQ&RqlMUltmf`te(1aYw9Ll zUHa8HneRA0V5E^a9rYS=PXhO28WV9TUAl36&`H2}LC@Xs7M`2X9SQK++_5pVI>;>va7vDt%G zuldP6`S<1A4(6`x*@BJu$iwJ6>~QpmjRK=|3i{ElL*BW;t{WTbw=A)g-aLB8@r~KY zhJa_U8L>zNou#!pWW~t^Ly`E^pSI6sFY}Y43Gvz}`c>_fuB0Dq!#g+Hb`$9T=2lmtd4(1k`Ulh2714Fhaa*yDf4PSBph44O+T@<-jZGfMd;do{+o~o@_^*1K1!B)I}(a#;>c;3r+ zc210EaWEd{hV{3GrcO6Mr!|LrwC-+;Y=)Z~#zvp@8XMzHob*rrrpB!Cy7}v|#Tp~` z9(HE0#wed3U$;Fs%zO`-d>Ph{_OGW-Q$Qd1LeN3r&pf+cb{u8R`c|;vBhA52PNN^< z%h$o1tF0qFYzg{L0?+<)&}!`*yf=h-5il43FTk8T2h7bAFpI`lSxZRcAy1zcUc&Xu z5axQ;!sFvH!CZ`u$AlC7J!t+oF}_$bT%($iTOG5j!Kv24u@mdk1Lz@m0D0O7ZMK8g ziD$+4dDjgOL>Nz0v`lRO^?**^x@#IbnZQ-1BXOeYS7y?Q7o>~wtK*lBMTk9hcvdOl zKbDH@QHmTaZFb|BOU(q#B=}=(HYi(B zd}FMc2+zpq$YJkv3iZd-zycD{L*g@h5bGz=vPI$@b=S^Qs zkz2A<@h;#$VwQUnn|hNq7XHrCUu=ag8EfMZatdAAxWTQBqu<@PhE7R0Znk><8~Kmt zRwDyfQHIQ2coVjCufr$tEYGfg6#J*wBH-51O4p!8I~Lhs;e~(b6)E_UwoiBn9^_anSQ_Nd|1^V_t1l_pUKizGSm87x>ozueYIcRSNqj{ zwco7kx0Shy%=2Y?meJ+NfTXu*p1+TKjUyL*{lG5fL-JGhB((3wMr^4k7kT|)wT+b} z!-l(cV=W1Q-m_WxO$BVI2g!kXsm14dlW(C?-Y%aGtv4rZ0$ zhZs8g`Qza2;XYzsz>jRZ;GbBlds_33o)W!W2rfeZNVG^k0CEOf!Qrtte-8YGc!7SC zE4UY)syGVf7`UQQXFq47@xYG$IkpXLxI7Qwcy|cVvAUB>c)3f{(UjiIL-rJNv9yhm5I@__^Wz#oUh5PPT)~`S^A-!IRfbJa8xe z$PKr%esz06YZra_VT%##>BCnd53`{u)7H>j#vVr=&44bNz10yPJMp|S>nx%PY}iI@ zNBpsQ7lTjnR<~sHkGAN2JYe>SE$twr&4Y1qAmn(QiCx7cobS>W}D4U2e^8Rmm zH*-225X?C`23b_BD@EjA3QDy|sJTX5%MrUqPK+^gAIpp-u80Tk@>GWZIM)=bx(JyE!?{cPm=;O?p`U z!@u>x+6KA^8)*S$PKTrWi{xq+>-@Wbab7ku;|IVrTlp@MyOM|Cq$FHqQt9EvQL8T_ zvnp3Ck-eRScM}?WZkV_O_9XJ%%B-y^<Y%bZ|x9gkG2@##A2Ex4=i;GCpSIa#xR> z@Sxvf!oO>x-v%oc>)-N~=jX;>7e#K7gOs43Bh1m0>Qi*7wH(HSoB#&qC>&39ENg>4 z%b(~S??UmR=cStQ>!7)y{>3=Z)kg!}3|N_JKHJ@71AtnXxOpM)Pg=@sli z*|8onGYW1lmAxIxh!)0np72RoT;Hf3@5rqZZJdO*Bd$F?SLsB3%7zqN;Wv5i8v^<{ zQ$LrAyKhw=o<55IJ#Fr3F7lH-RhvY)VaVvO4NSPS`td4EuNzd2lKJ?Pp@y0S_&JSD5>siTHbo{*>jUA2cgUp*L`vMz^xUB3aa_Sq9 z!9(~EJvJk~7df-l`8-;?yszt17FWKP^6lZh@mk+L7k%7h3rG%&&WXpKmVPZP4s^ED zGXwrxxk#x!^udDtB#bu~Ev4PJDJTC+%tf8^11V!pOTc?t^PP*(2mYIAbyo_Vy~vz@ z0F67Hw6e#4E7UhnE!FmgKu=kH@Zd z)<&nmqV+Q3WXi>7f5DL_l#9$Bgg@+HJmpUGlxJTL;3bD9Y8O=fQQoDU&ZBK_z}|;_ zKEoS$pY%k6d->1rgMZ0w3w&f`-}yCt9iorlscl1TyYJgA5wz#OF}01pUjKMskN;W? z{+p_L>g=|Du`vbw=it|v3TL+iO#ikqUHEgxR9AziD0m5D5EElqFlh|&5HGDEUWWWP z`ZoBl*WloyY5R-V9B-A)Lsut&aZc@Afa^NuNPW+p0)KNr$IvHqGU>Z^;vBRGf6nP^ z^?%H@uCLwyVa+%$o^~8=UVoXnc;_3F@bGV-4`j!bwE=VaP&KfMcS8H@$P?oCTm(LX zFQ@W{kAk9r>@(H&-0^Wjy*u0r{ zThp%2q%C}wSjJ4&sO#vj$^W0%-ACQqg1W^SmR#6D`K++~f>Zu=zd`wmpnO+*+A8HP zEBqPHBg8RZqV2i=)8ECqQQ=zN0Ymou*Zk|Q=9@nc>J%IB$lSsW!PvIl zNzC|z2WdBN+kQiB91PmXgyo;)+Z82S_>-h<`>eh{Xj}g=&6pkz+PU8By5~Fx=hpA2 zt%rHe+tzQZE$W~*s`I_|$+T@fzht>bO1AZXCG5H=^{;r?%C|7r;I#4)=o`G|76t8< zm#IDaUzE4;v^vMYi%s=7mSx2vrP=(5HNx@z0kjs|nS!x-;D+qRauxK{L(wr!tcE+%jTF8<+R%Pg>_t@|Ff zt$+8hEq?`CdXev*6zof^@F;lPiv8o2_`k!Je?Kh$QPRpwfcI}GA7Q@9QxrV4_^PF| zTDT|CR@k5DsM>aUC$O|y-B8v6z5EF}`G&kL-%lBIwW|%- zzCjs0RsN{voU#2`Ft%;KDI75WU(+|DqscUsTS2>bQs-05&7afH^?3)=w%<5tBkx&a z+wk9W*Yn+Hp)F`{AxX&v=w|CbJ{-`^KKlEZXIsA`95P;D%3Yfe@c8YAZR8*B0H1vK z81=4YzM+?`{|o$vd{|yWf6)5EsAr;?@&|Gb&$*X^Hp;&u+;&;+G11CoI?-BJw!uGL zg>_fk5;sqoG;*ijKRH1o4M!baz>|%)&LkHIc`|YYm_G?^q^;@JS-gwzt^pXBd-0@T z72P@fBWJ2S=WzZw&l7S6`|sDl^#C|QemFX)kuinagREKt&?CpNg&f0XatxcuF-(%P-Izfhhqh>UDA%2>8~Wors=77s$L)RWsY^Ff z$h6}BFS7TMqmjg(cX@o&nM0qm1HUJ+q}m30)RSGi;4&9O_`KGai0wwXM##zhK4bOI zVb@PuD-ZmXUudi|8SB=`W5u^SGtRju>>V#_tx>+sSP43NGON-*v3m{_Uq&ev4;@+eHnl4HewL}BG{^Z zrZ!lE#;5jx!N1`sGF$zEw;P@yr(%Ycv5iiYM<$OgxBASu-B`kJay!tm;rJQv?7~w) zTdE`Y^jsldOzmeQj8*NTN2=dIS8wZQd&BG>sf*aY?Z8@ZBbJdIJ0u#_`d3l%vM68gy5zI#7k+*J_|1E*fjEuUg%iDb z!*4zRe6@4+2z-n^dc$MJIT6p^C%-nmBp%rA@zccK{o^{Hz{PVT?5s9Y~*wO$lJV)yuZ)NpK7+Tc4YVBJ{w!Zo`p^QR%~Wn zhrXB7_j3APPTynYaRavJPx?Q(2R&U}cGU#jGvI09p8E`NM+EnK&U0%IZ+Ct~OE^d8 z@S`PPm>1T{J@~VCsa?YwMS?v}wvW9!o1l-T#q390ZOzI-Zz501TWtQyHk(B*#6M?R z>)HR};CJh{3sUuI@SycFr|%Bo3DX|?7FZ)}vpHJ(gpclI{KVet)BDgr#LPG^L3@IU zH<9b4xS86iY2&{bI`+Bv;h};(~BBSpU{ow;jf0*b` zvDI_=O|@|s?e`*oNNaP$;se?U^N50VP5e#vU%7o-=dmt!9g!<{S^IHlhfh));^o(YU^lx=q~oX!s|WA zPI4Ukh+zu`uP5N)Y8~mSeXYa}@r%7d*7b%ac--}K(*N;)t8H5`C*n=*`6tK&%;&Hr zme}A1v)8Y{S7KjexhHL>HnILc;^K0#u6=VYmpmKZJanw5NvBah}@?nN7&s;`1 zvmsBtJoT1xUeBHTh^bN5E8KG?L9g0cuz?&Y#z5cBC**mVo+%sNZODl6eq_N#r-`$- z6T{DS07D0RE?GZq0;Z83XqGd8hD9G*Q&qq8wduO#{&s9Voe{M8krev^M+&y=>o#k5 zNjQ3TeGmJCcIV->a>91^yFGiqg$)rQ$89!kbS`|BzV;Hs%COG~THakQsO^TIv?c8g z^pIko*j|c@&DcF&IJ4H@YWKMISzBd%tN7*}H*T|c^nKB0g*4wMn&-QaU!eC^`@-%+ z!MLbD>z3^{drI9fC&kshcPy+6?CRsASCf}mtq%-N_VE5X`1qIIGkCvbX3!?Iz<7(; z-;(q2NfcaPyqGmM@h7_FE#yfQU-qPImSCNdE9-~URSdh)t+~Mu!8tGWZhcm3)LPHd z8lNk_+{ubqwXWXRjv<7rDU{^_&(pt?L5q<=>_e5jS%#g-I>p_!JUSt_&>85*_4&4{ zOa!0Euk3(1ea||Z+sg{>j=t^ptUqLtBf#hP=3Tzp3+Jv+A1No#zCB$X$u#|#F>^i%aks=2HI-b4L?oNg>))3ZK1zP{D1vo)Ychk5VLAVG#UbgglD z>ka7b2ECWB(#3c5^+(XUa{c~v%D96*-WK+Y{&#hpz#jd-1p5QkHqQb38GO1N6=aCu zcet2V{zR6>h*2KMEqZo+*J7K+z6G0t?=x`y;&gKJ z&%u?OL-8beZ_%~vc>w;z;9~SYdn%;&Rr9_o<~bzHR;)E&~p)l>C0f^f<%ao|ITLQ(yrGY}&^^rCSvf*y$sYJrIHBL!YlCZ? zXRT2;(AR8-AK|LU@rur;BInj`ThGXF zY)L0O1DopkXCf%7!MdE#mXOMepH@SZ?)cowszizE`<&Ta3J<7d)3Ia(*!~4sDvt?{PXNsxyI( zJKajX#uq%!2x!IjUS#hQJWc2x<)Ud#aVfY1|8JXX73}|hdRY(i$T)=Kd%)d3olkM) zfL*k2uVBg9(nA*8*AU$6z4~2xxy86Y4|wV(-tD#j%6-z6zi3g)elu8G;~WU=U-$kB zYvjJ#MxE|E7g>|WPyKlHS+>v%jAN{X|D|&?Msywq{q8;c%naVuoSBg~>i(P0%%F{$ zGc#yoyZyg-W`?7W;LHrBT=Y_dr)I&~n`ZB5kDXtG%hpErgw^1~)!W1zb?QtI=s;(2 zKnsqxp@sP9kZ?#2`{D_l)qxw&wTV0p?vwQG;p08MjC|-zphN6S-^e$+MD*z47X)@m z!?MQD*+u8z;WIMQ$^NI8p|>NF571NgO7iP8w(eCHk&kHji=nR=(LB$Frl?n#D%S%U zN?XVhbXaxY%4B)x`g>-uV|B#kgDUSNx5)L+9^fP2>4io+Rz>jJF2shu;4eFdu#Zttgr=RNe-upBuhn#T8Qk)OzSk}FqF2X`hF=|Wz}uRkt(0iNVMH{Tyj zt$l}N#oLs-oQA6Gqy2vkaz^V`h^@oABTmlVmlKo{4`Zcq1Mv!}2LxiaPpbaqN;GZGVg)8$rT zFS?u&^-qj!?sn>g?K+sk@dWUM{Y}B+Bt8mqrGaY|aFMqmIMsFuxa1!&M$RI&2e2;( z3wLXL7G(?%@NT>IoN>RMu_jape7>c6!lU>}=M}2%l(++Nh8dg-m9~e=&Yrd6D90C^s%E`mE9>{c-L{@T{^kbd<=lCs%x0#ZmVjWI>1%cP8p~ z{LSh-PcI9eKVAe6_$Lweq7J6F16Ra9sXZy>A+MV2c!&6Ta5eBTR|V><98m7>xoIlk zRh7Hg=G@wOsvVQ+LF;Gc2wGDvzHBOT^d1=NSKJ)h{Fa4#A@<(^?Zm~Kor-7RJ1Y)ITY38T7_)LD@DW`eRxNMKPuV>w@21W1 zT)s*R%DeByrl0b?_*dU9QXdZgOKq<5X?Q<3q|LaI*Zn*27BDwXn>N2;Vh-8kqw$EQ#1qPA&h0qXRBVW_2ZZ%3@RK`I#-8f41!-?P zvHD1*+>gy%P%e+(jsK2Li&pU6mqT+M{6E^(W!XXTX?l3{M$YIUM(U+v8hd?*=M8`nltyiDutlMXmeG4X%YKeLy2sdyJz}wuE3jvXbyry9T)`Qzl~qe@ z`3y74>qG~fu@R%3{NGdaMtaaYpJ~RHiXB?Pcq^@a6ZsVRt*mhnuVCD#G}b^Dd)t@C z0(uI|*?T)f^fnt=GHYrbWIKC@lg1tg(aD3A-hOC#mguXi3WIV$a!&?u_$Q5V zAblX-Sr=!nIU0Y84cjGlRMEX>xiSAaftDR#ID`GpJ-AF91jmbkO6;f?>U zaZh)ibzn~(^TbckQlIqk%2xlhlRw-uC)1uotv)8?>clzmM_y3>;2@0G2D$FV*n8ib zTiw-=jm&(bb}koykLsA+8PIOsXpSG8mt1$8x{aDgFLm64Gm~fjNZ;$s-|E~3XDxb` zL1xkZt12fRad@JfJtw)-;S9Q)fb&sm9GWWQ4i>7Vn~#hfeU_WAmi<++3(`+FkCfQJi2J_L+ZyvnX-j^! zWZam^UOjS{eZjzb+Lum{Tq_TGCK*%36|u4j-W9*;S^T9sjK7n5ZjVltcc+wde#*>$ z6^_nPj;%QJwYMqHQLcGD*Z19&|L|?fmr(Bb{T%(1H$C(9>AwF(>>%+F-@i(1?4bP2 z?kjD!@;IDc*?g>}m^kGxK=+7-Boj1;r`j^?TbF;*F^FE>sPFMbpefEBu*#>|3xmGV z_d4IEXM@GcYnyF3_mvNa^0^IJ-)i`|b5~dE6xm5p-N#j1SNpj-7%TeQ$ztWSE$6wa zJG6gOu!OXE+~tAdLn&`vei`vqSH>0E4Rh#!o{feq3C{dJ9?F5Z=*yi|;HBm`IiNL; zEN6dm_IfA%q=PfSlM6Lh-SgpT))~Vw9TdMTOfXl>&jRr-b6Skeox7lebKH*{Ijl1k zncqW_PnEJK*%gz{;F@rHGm6a8+&Ec?PT2^|L&Oi}gGbu#iNYtyjLJ<(bTGLZFLJJs zbk7L&^#5{DCmZ=&we+V74dhtgZo3Dh6+urv9_?I|3l-(F}({nCc( z7h0?O7qnHL)GuwQ?xcSCe(HC!lSBD+1@O%ljaO~o^!tIQ&i`%(Ji#*`QaNXE$0o{q z!S$2)(1A|9*_97l-9-5!#{9h;XXiNBv3dPBp%-r?l6QMC@jbj^W8@}sJbtVkYI2qv z$Lb%n%HayS@gQ-!L##QoxALYVFDRE88`l}B5g@1W1M z8v{QJ+?}s;;mhRNiZ2Tzv=N+x^TU89*fZE#l}qGQv{4>O+8*jEe<>Rw7KD!1nQ6OA zcaU#QoMJzFlaTSUJx=;R`oZtquJ4g$>`CroFZPzfaigKh~LI zJjZwUyK|GaN&ZW&7SGrFH~roDweB3_GkeMc8^y_4=u2`ya`uFsSLk@$`h)RvKEZh< z&NYKBkfoe&(N1ncJJ$&IQXJaP2lb#S;B<0)yWsk+lQEK4%BBVw)`P!nc-x9OR!=(#=*OpBTokOYbGlBHaalAP0hH zaI-uW$XU_D+99`=cT{o=`P1a~8Ull2BTmk+4ljR5{?YDIb2YZ~px#NwpsQAfv7QHk zeI+q~`o%G;lTQGTHSg;o{>|7bZAE05JJ;&nYBz{$pLzw^b8&TkYIPm@!qeJI-;i5_ ziEtj%soi;G3Gs#9$N=J3vD^-9vF*sna898ax1S5#hBhm7Ou5ck5+2l#^tkjUeUY;S zEiOu|o35{g&!TS$v+wT5pE_XVg&a97x>NqgB)Yo_Ij}lnig_zlXFG6IZtv7~THw$$9R5yzKm}L)Zfzds$l8%hJqVmL~SH zB-zW-$X*tAZmpxEt3$u{X5i}qALL3d{Q8l@(iK^LTSGZb%YmD^ZeA9?cC4l9+Z2=R zBT4#xCWDQ{>B|eBC7EcQa&RoJe5jNDsdb#)Z9Oj%3*mja58cRf|>`$vh2%7idy? z8{P2`GT?#^VC#7ao0om$71m`1YlYl-(Ye!ItC;g@oi6I2@6W0;pz+&;-eLYc;%qJC ztT&Uh-bBuNlAQHMa@MQ4AYM2}lh&!G+B?qn!sby-Tyw!1`a9@HXLzja;Qx$$a}w1dk3Bvi!xqotoZ;K8nK`Nt=g7@Xh_`dCzbi-E(TvuOS(NvC%%&GVSakKck^@P^%cX`m|l!7tOHl*B*iOMaON!U zo47U?Zsh%q@GNb>Q+d(ZA&dOS>i5!H%(s5WsF55v&L5+X6yNZk{J137IQ3Vau;|yh zF31k}$`ff!4Y;)$*7{@Xg0_N~x#H}-UgT!tMiJGKET_(DzD@J(-%76YeN<(N{Ze)x zWvTEvLTvI>&>pdF#xU69`l(}{v_^89zCG#x^v6LRWE62|)=jJDdOtv0SBL$P(-O_` zOpZi!4cG9TwPTzE?r3XHVKGohjuAb9@gJ9v)LcNmA?Kc)Ny zbe-}PV>+AoU#GTl(*Kta(snh^ZsJ?s-^BYm`K_FP*R8lle!%Hz@}ba6t1QyU{$bg; zqEU^zi}_0rF#&Ccwzo59=Q39Di^_R_{G|Wt_ca!-r?|F+`0CbtSL>bhU%8U9?{U4G ztJ{ab{ma}x>U`_)Y<;iCt$W0CT;Y@Ulm5|vgjd>`%Sbc-`yx(XpUyJpeESbUUz}mb z88S6<(@xpnhqzg$eNa3<8Nj}OnP3NI-y5(PGGuR1@6mnA$#mn1NFKeCUe@NG+uXhu z@PHnQ7r0XA8`HGq;*7oQ5uVcCp9aqp?ad+AE~<7Ku{UX}9OyvCwW>-3jD^@FW#Re} z-?qx{cl7)RT_0jz2HbeuS(DWJ-Jp+W@{Zo159lcgk2dq)MEU0@%A=0fbpFBy`3lO3 z3i(y|yfmoCJIx)m&b#wN9evh$b0_^bE~Na9DeY+7A^lCX^Onv-;Qf21)Qtx+!v52g zeow-i;W>eCXbc}G4}Lb+Tj=u@uD`E_zQ^&?#0chY}zAJ-eWzQFbRU_AR}FKXQ3Jh*4!Hh{&^$#Z4u zxOd2mICVRNZ{2&x*Q{Ngrff51mmwcslReCR8}@7iS1%mj^W0w=-fIk(;A_n1+RXJT zt`~)4@-!xm;iUhsG2T~yhtA`^x+dA8G4Wg-x1OuttW`apg;#Qku;H;=(Ro$fHYslb z87*1fEPsmisA1(xurBiuW4|38p*W|rC#I}%yWBUyiJg55JeIt($6XtcvA@D|if4E2 z&D-^iBggxX^Im(Zb$-hQJQsNGr0nW{hs$ctaSh*d~u9s{h4puBA?1lLR-x`JX>X-hjLg+of+} z2*eC#4ALKPY7X@KC;E*<_9qpwjg(h%h2%4PdE9T|W^*oI@llmQR~|MUXTO$e*VfOI zjatn&p^nZTWFLNMB1cDYSLRRt5d2tj@qYFK6g!54F$izn_~GDgJ-;j3uG}lPp40=~ z*Rh_9-K+VllpXBnS~GVv0R8>a1K z>YOfnC-w&C$?jhdewqbGg1tA=>+;1%S=;3Od7ZtH%LR*ThjW>8tDisKTOz-O_z*aG zkalC6u=APEndEjw!3lALKo>IZ-&J0VgK;u#PtajtYwTZ-P2uKFdw`IEQE)y>;|u3` zoab1+M>*?1`iANX7TW(W;=3vG($P;yw*}FJVq1CO%C`Cbl8xr_JOUdV+QlapU1nG7 zcYm=bdbtN)@e5}to?3!TLHC{DT{PsONj^qxKdz5f+R39Eh>vtH)o*1e2C=`ib0~<# zfYa(e3dg4_dmJt98EnP&%i9d%DW#qF26^?NE{^LgN5-H%s!{l4x_sX0#8Jjyx65J~85}{t4`$)Faooz`ztgEB=uVnD#92v&UnBv)` z{%K+Z4P3FK@wo%L=o;mu@mxLk=T5b8^N{gdZ2eWa|&Gf%*Tca!}UMuIjLk`x50p3(moEcweu1kgg2&0q}m3~*3!;DXpKp_M0Ou-zEPu>&%!@v6W&jZh1|6tyWjs*?1T8Q zX-!D$n3W;LJR02omFaSQgpUfbB59`RtL8{KD>{$zn)^jBr+=oL9O}Ll z&d++;)I9$;+K50SZ!1s2whMwW#P^-~Mc_DYe#pad`RcUyYZcF9zt*{QlcNncujmcp zfz$6%LC1ZDvX4)z-$MQ1#^QXT{cH2ARY_jyci2Sx;>~5uJ+u^84jpav{ye$jwc$_P z2;KKvxNf_DEw;DlF*QN=DR^U*@8{d;ZwT2So1Wi6rOqX)vu~r;VS?{^%XWd@O_dvG z_&L~P$ny-@WXus~+!Y*M@lN?x7n4ura>%%Es?oj9wx1XiV@$9oQojoZzcdoZN6x*n z;v72ij2uPpiPkl@&;a`HnL%X9dh~O#h`!0~c;P|jbctlj@&V=@TxToD|Ka@w^{xDf zzcKI~v-^N~9Q*kF*y8WjZ)~7%<2vJ$INQ-~&g|*t9N3+!3dVhM=W2d)Qul3kAK7i=Jcw_xM}+@Y=?y2N1KojdaniN@^V&V>zkI99qg-pR zLYFRnK4$PmnHVK}h`q!+?$uumnu_apj%NK{#~M4T-zZ(a#*Ro4T@yNZo@*0qqkS7M9D?{a65R>%e9cjVpgsgR4ck2sxM>(g2^ zIYVm;dznx6H)mtZmK0vnc_!Fpt;qhAWFs-o)$##uIb0-vLos&ZWPLhYyO?;(C&so^ zc?QZ6ES?v2X9kti+#|(xUP6T!Xz`tK&d8xp)w%Rd|N2LHe?9jXbB@iMyk`S@@gmLw zdXD!CxW6!I*YTS{7X68q3`)N zQFxqxzRR?AJ)Mgl7$@es^sIW1TO)NFmq&=_@?V_kpIms8?<;T0`KFr;`Ik1@N|rf~ zHNzN$58CP#j(E;H{E*+NXW>M+5Do;pU@lLAwPuXT!U(YOueHle>xJXl$c5uNvkp8o zm09;mLt5wx=dx@0i?qc*XTLwZtMv|>k9=~!GaP+y-!yZYWvtm-Bf*(8yIPBu ziya)#q}q$%BNyT$cWV#j{IeICGen5LUd7n=S~p|sc4He6&fnW77%Syc6%TpZ&R54n zd^ykA9H+Ca5fN8Ejt};_JA-&Hv>JiWc-H)u+mW;PdRG1-*Uen-^2e9&cFmK9k%d{sYCnbwH z{~ekBtIekToyr=nzs7aIt-B>^*R}ZewP3vqT3;obfj+61jV9X*FIyjHn)Hb;WPeDm z*SAI1 zF&DwUfvvVaEE~k8aldORd=T4@vW^sIuGiy#M0>H7c=p0)ax?YJ-iM%Ex%51Pqu|-) zvgd~L)n||LIQ`&vGY3On^?g2kpPcf(6uvJ_ejl;meenD5YNr@+xOQzWNJZ9Gb3=o1 zaBhyqg^vh{vJ>CfD-&-^oQkhL$+6mc)5$OLCznZvO+y#%3`_RN9;j_Ya)a3F zAZr>f-$UyWL4HDFaFR@6&qX%&ny+$v0oD@yAEPV!JmAAmcRA8I?v*25OSc(VEs#CW zuDAB!d>Lrbh&j6RT)6j_wksCl@jFJGw-AY#w*j9M`K#Z2@7m6p{@X3l6#VXcvwV>z z_8xR?4Sr*nGa=%|_-S8zNTj!l(TKD0v_>1`x74#AsJ;olL#An*_4r!8Fa69p5-!He zSv&D;?DQ1)`HuHRynu*bT_ zcZ1&4IDjb;%vHU7@qeksdu=|t!_lm_{9sR=a1?!895E;OIraZT-zhgu`DMb@G(N+0 z@vdp|%`Ca6wGif;X@4B?Zeqn_CCPGpD}Dn-eMr{RcbHEWp9TJP29Nf`&*3VceRd{_ zj1At!^iJPEW13&LrmeAqi_PKnuQToSmWgRCsNr~#^QkmJH&#+y0qVnU);j)CcMnI z37%Vku~EK_qe<#1|1qT7M#??vd0gAMwgcCVRrsyVBI^gx+n&{hxQPYv4*xd;{Z3vm z`iS*}WR^Zp5Dw(G7zaCsCgB=AVdU<_9u~fs-?L(B(9uEs!Zi6d?d02d_$n>r+ccAJ z(?q^alCxtQIXkxI_s^%xH`M%ZshR&RF8?-&$p-U3)_=d1-!qj4Vqbs;tvI*g_-_1q z7s~@j!hv;?e{vZ(jDyo;%*mzQrn&Ha`v|_rP?7xrYwg2dA_fN?>348%;9Q{H$eCh9 zbUz|1?a{hQdISa3G_5genqb~YD;|S+8@!`L;`rvm| z9UNQsMGA^-#ax`?cH8pQU%E5Ah(9Ywa>fv2@!(;8OOE~*SqvHC=^bs(VgK~;GxFEH z#|A#-lAYcVztK<3z3Z+UqNnCpvPo`1bOJ%6T5=?yuUw;XZA_ofxj<_ z7p~dNxqsxr2gQL=suJuXJ{#;@#vdXzNqqq_~V4dKLg#T$!lsSugSwNZXvI!nY^YZ@|u#I z#o5SNoYh!KI@F01v6^77&Z&8VE6A7qX&v)>A$wg8Nyclu+OHGD-}t>!;&AMFIdrD} ziJwwG3GU`itv`*tJ!>tFeWKOhvG{PX2eqHr%l>hABn_{pdwc8y#Lj0ej@YNjr8?R( zgxp9uSz1rdROGgPCvz1?s=xYPWB_L?>GyJqu~YLx8tT-TrCUcGZ#jm4mTW*Ep{k(i&%+9IvP)U=4Ay4gO2N-8p@tOXlKjWBJ;z8^rL*X=B|5 zo{ZCXeOi0eQ>J{B2TuAwBi^j_>5_{PKAd;Hr}mk<-;1pJmWr3u>hfZQ`YC5W%6IM4 zn!V(eV6U~&0(+j^k|DQ-B%f_gaszwPV}41zL_hJajXEpl)$30BFD(q_+JB3-qsWF% zJx|Q}6h?1>Py61)9kH8f3YVWy$0Rf<>O0UfNgj*H%#mgx(RHp z1pCPnN5M_Rt;Hz6pXc-ld&6lRX^LDpyiz{@KbnVcF+R}IWM(@<7)_YwWTeTP7 z6eB`Tp`($H#6Q6IPg`p7Shb@9IWV!0+XGLEOaEPM-P$_(joM<}U4D^u-C{$@okgJE zdUofT9bxQG?jO`Sk<7W;Ql8>b;jubC_slx8#_Gno7rP&rMOV;xv*fvOP&03Fw?8Ar zdtlNW2jdBTp9eZCNe3wg-g_BmT)K60Wb&ft9uST!Wfv=#VdZ5O(>khtw@>kLwd3j% zn`d2qz37rL6?vBna*s6+4yQSM0`{Z1@g+llAO|hW-iT|QZmpebwM}I6Y0-5+KZ&Bo zmtIA^$mF$p)t@{M&y^L60dHD!``^sD=Hk`bxuE_z&(ak<;JxZ|f3`S>y#j{h*5lZreur!AV_`ln6rV^IDYsj5%Q|iCZzqyNSPJ*y(@!gH z^t+tRN0|r4VtI{4bZv|5BKV6lGZRJG=K39+z&;Oft~nFlB|EFx4QTC|<954UqMTsjM2X(K%h$oSKKA#r3$7W8 z97PxW<=7$52oPM-U$y}7MJ=X{LJaS5Q z26Fao&*+5~&eDN`$H9hd87q14N+V+mVAJ_kf-S!&ay0$LDjx-~X^bIk;a&!3JG`E4 zBiRx#`nai#2uBti$U%Mze4%UF48Psp!h=%oU;by@|EP;FVH{HC0 z-}WkgwcfBC9CUCFo&0P0(#yGj8{KvmuAQD^tqi&^H8Y3a70?nil}nWLJAQ6GQ}dym zoxvC3fA|49yI=9&9kxXCav$S#`w#en;^Ok?!4E$Q*Ue{IwG>UFJ{RVcAlPAhELYCb5Ht;#UCftc%lzXJUUB3a} zl_vPE*FqY3?tT|jb>$@|BSOBM7tHB%_i>h;)6J}T$5xh{Jo}X?^6V_U2Ky8Ey|At3 zev7LZo8xpR_FGRT!`f@3Z4d0PpM1KT^;wHSAV0AbGW~g zjnutgIXCFssLogix9=`I1nmfqoZ0T~w}E^19aTQyS@q0s?4@Y6-VLkud*ht%j@;9` zTrcvU?~(UM%H$?h7JJMoH2DPWJ|??Ax@AF%Gr&7}PC>Vv8SdiwHNO$JGJ{RcxJMX2 zISC7;1B=l)E+!(`5!lPX1&>`l0xzMj^+1k#RgWp&1?(wqIHD}`* z`jm~#p5afh*WeTSt@++n*#5$E#Gez`@jtnMap9*y@gzl{`~Pu ze}QW#v5)m;*tZ0XmAq`9z`lYuKL#E+FWKezHC(fr zJfZ>Lzj@HnW6aB#i`#gdaec!8upzHQIU6UQJxpKsFpiI@-<2P7ytFywv+bfU{hzSN zkMS1|O^m-fc7AUvs5@!w4>9hTV7q#Qef-@~>sJnsaxEHLt)J&*obmZF?sfK>gXI^Q zn?NpVe)o@i$YlDM$M}~q@5}JN=g1EBh#}~VwBA;9oaleG=>LuX3LQ0px8ssMwe%0{ ze~9hLd)A&kosmQQYl3gyxSj9hH*yBsSggof~_|6Vfh&?PlvUP|BYeADWA6iyCNKje)~l-KfxgI8zr2fXn{H|2@y9(H{To(ju{_-U5u zV^ICoeL9>^9sc$)@hx&>0$R7~lYAJytlWi^r^9u8!^JH9{+}Z8F$XL>hg>!W@mYsEs?R)=*u`CJ4@`1M>i{`qw-%?(% zSEbI|>-MZDCLDuL&Qq@1AabUX$M+fcWNTcMA3<;F{VI|Uhqwn$?WOI_`#)oT&%?Hl zs{X{c!FLIK(uwb6GirY|-^KNvej7sbr18kc&vGt2-|$}NDIn|5({CMli}F?u&&XcRd!1R)O}sFO zS>P9A$9bzuE+(*?vW_;&Is2D#^e<;$A#g`aD-OH>Av>*d(>TLyY zthGl8hUrW2agtXZJuO`SxZFDq?o!7kqnY$GJVQxj&qnyF8c8Ge5_4~~JPZ!>FG~UtU ze5^_5rODTjjiq&P`Jr9t=3FY#-o?5cxxbCryN$f72y``9i_ze z3nysF`4=b5rai-*_s>l63nqhMc>~e%VMU0~74OOz`eU*pP9>iVpTq)H}Rz zv+LiT6FV);&aOS$s6DaxJ9DaIm97>3bE}Ugc{fjS2>#=4zvpU8u;2647L)B|kps+| z=5sp#UUQ|q>`K3zhwrKVJsD3vh-hJ6A7>;UGJD4s10UfTW(Q*CY=IkA8D~))P0H6T zeAwcJrDj_^&Uj^9x0Ng=8Njzu?U6o^3cjJf_Ej)$r{kk)3tNyeI9qz!IIwKRJ@i4W z^|X8up67}7X?xBVQ=FIeK;fTu)W71FXZ5!z?2kI|fQtczIGOMPgbQeKdw>Jros5HN z`;rWO+rG}gR$b?)=7dh|_j6NWIgpuxvlZojB@_W?_@$}36&gK2#9`O7oWIzeLZ$WO{udyX}Ge%-4^DEvR!E?WR zzP#eCwbl&D%pH-m2j3m1uSsmTU|pgQ6@b z6%|xchd3nukpRBb72v||RUz?ZF%Y>stIlv-f)pwVWv5ux8Q!eSOwBGI3z!7~is?--GTZSU-pYD*)OhOzu05HxSajs@b~uh$U{Gk zt?{?tnraq(Z%4<#O40G`t2gWO`&m0psF(9Q*n34k-p}5GU3~PaW=)$uI~}yiD)#Su z_V4<#e^<%=T?PAh9{YFY?BC_&t5W%(!Ed3aV%NM6_*QzF^;*95LLBKYxAIVIjt70> zNAyYWqEihzRijfCI{E0-7o956sRErm_Q1>eeri^?)XnHN0p0454?Y>{Kx(;c)Vh_f zl{+$GCs&C-hPlkG^X2=q=Lh%3OZg_M{+|5F$-|^~_8n5l;p3a#fp2Qiu^Jt#(9uW7 zzUWwqjuq(Wu}4|X_X2ae2H!_f`cqcP9ZjqF&DnX36T_r7P;&v!O7!GGiK zIvo!qny&RT*#E`0*yFyd?t5$YI-bu+(N5J@>v(@!$ACK3WAoePX&Kpz>B&>fb7?R7 zJOpK^*IIwGvJ>tT*gPM0cqa_L!yeqbKc{U=>#?>Woih=)JjhR2X;OZouD?uvK;om> z17FWOH>PkOLO7ZWZ+(Dvg`KkP(D_X3x?XD>^mb?YP1Wo9d48EZzqtdrCul{d$uCK4 z6zl5i*Vf6DB@!hZ(Xh&=`h@b;w+?OAG4u!OU+u4;`HUK>&4|_|?5%tr%<(xqznD*J3cW*K z$n}RJK0UJj+q$JruFps>^_S))-`1edK*uorM$QLYw+HFJ-gsA<{v)6MPpy8okIeeq zd0+2kbAE^3iV~lHum6+0C^^Uz_`P4=56}$ldSQ-d*6+@?)AalIO8kCzmS5oaXr5mt z$4`!)p5NtT^?PXl3p<9@({JYO@olxAzSBtS3Hnp7wI9i+H>hqwdTo&YbcsFxzQmqO z^7izD{1XD(a2?j^q1xuM^|}Rq^0T~t(9haa-pu(Rv}bePo_zDTs2zpjl6Ew-#GXAm z+mXDS=als_E$<{h|`Pk5jvAdgzDqbLF+}Lhnkodyt+DC-ZjC@*AGDdtK1? zBHM3*@=DLw^0K}EVeFpPx?Zp0`}G@Y#r>DmmDv5l!0wF_AH}{x%E;pv>?$Yrg5CXh3fZCEgVVvmsS z;GDg}@Svby>7@H_8=SPfeR+#);P*hcBqiJn6Ink$I~U6OO}4MA;W@!@elviv4BdMV zcu40rtS2={*#~^j`mlZ*nEr9Rf3$7X?-+xEzVWF3)-~G)m-LO)uN%6$$I$Un<<$58 z=zQqmKZe4%|;gbZkJDc|pCa4eUk#FRN7V+kM{8L3!p(@4u`q&Zus<iy@?E2t+gYCB?_`WT&y?rU>)W*@s$*Xk~HP16o)84II2H;`w$x(7WC z9z9ROLv8rou6VFs)lcWuS@$?Am6z{c<=JL-|E#lx%P?LN3_;5@7490-SxVD;NI{v=^M5~-Ful6^nuh{ z?LP=NYMnpCZ~W#xEJ0kyHLL*)%+2eL9lAcvyII5hQ|_1OR=qDf(5(0Rj}`VagcmC9 zJJQEK(SGJm)-JUFroNu^JGZ=st3#aRHqHmL=VWDgPKEJ57N@!yq(KW<1~OnRpiDKx zCkxlkU^E|0*}+wkmZ#)LvOzjzryQW8a^@Tc2hJP~&~BIt;NS2>0ifGB5{w1o!Hr$> zXsqu#{%mAAowAK8^R`Z$PT5@E#&zfijag$ritD|ceJ}yAnmQX_G#PLNT{+LeW^?+M z=skik`ExW&&rQ&7!iG)IYnltqcCd?UN(^49&VW|%I(S#Qk8TTeTcFzl zY^@$|gmR4=3kJiSzMFtimNk&=k0QygI;#SvwM3vcSFar@i<7Lr& z0g5S2esgKFcsViZU#4k z31B=(fw5o=!1iq;Knx;WlmiP45NI6% zpMt~SAUFW_fxTci*ahAL?}8m*8|a`c>FuPqlip5xJL&DDx0Bwk>92#$pdGY=b>J1S z7W^2z05V_&SPqtfC&1&N1uOt*Fc&m~*`OZG1a;y>B2f+#9%Us*>?BA0EDw8*4{d9e zQZ5xv(mBsbIIiPKPw}1JPA@0s#2xGK!K9{3i~WGowF|ZMIP& z|M)}cHStboZ9|INh?zX%^aGIx|60WRNaX5YLAp$2MM|85l@f8>2X+-R({kCe#qp;e zQXT=HQ!i4Sb6ODWF9Y~JWR(n(i{%ojmccTF=Ywlxm|QBuWrSQNm&+AwCytWQa;1!s ztK>`aWyXoG$kj4V>ZL&%WtPmACYdAOl4kj~q-DN5BoE61c|;zSh0-F6WU)NvJmNg+ zEOZt*iyfXhE;zzYxFCkhVEpWRRk#B+;Z&~w&zkDuK^fXzC_bBNoq;eeS|7xfweAQbI#15Nlwd-U zez`8Ov`%T*2OLf&ICcJert>nmBCqAb3+gWyt4q@Rl!Qxz6-21(^vn@VKSpzrkO5!f ziTt7?r?5trwu_>SrGXR?DcN#q%2{xGD)QCEsi@tUioX3($}G7cRrdAkQn6l*so1|} zQt_vMp0eLKl1f}SG?mzOTgqLzFqN#`;FIph8W;KG@#7<3^~vYQfB%6`Uf*u4@X7Bd zzH_Zl8Q=X%y-zvcJ+{)PtXH=CLyz)a?3&L!Xn3(7Rd~?x;%2A^EiXRfIuCkY{LN_| zG(CGsg9lyDwzPQA_Ux~p_n_}3CT{TH;U(5=_u%8Xva$4JSs6|$5$GvKi*V_7PEizl1`ME`IYybH+i|jVx zd|;8^CN6KV=wK6fAF=3R6H8kxy4b|)=Ueo#iNnuZbh7TCAr`%?J7t4KH|sunjYU7} zZrE zw7~`@HfpEA4kmV!Z?J`l-FvUW9wzqPwFaA**fWO=b}_M+uQb@k#NL``u#buT>Zb-9 znb@ZZgPly=yUAcH6R%!ou$PIab{cGE; zgRPBSd&ppKW8WBUu(`4SG1p*sV?Wtqu)Rt2um<~^#Kkumd|(n+FE#kVB>v_X249%O zH~Sg{lefk<38BW;5*|!HQnGpJNzQ!F;A4|~aQlCNzy$?XSC za%XRo{BV>>emvDAkABCLyDLrk7hdz|1w%NTBO#)kO^7niu@G_2HbjE63pBkjkLJ~U zIpp%|S|A^%gkE|lwJ*QN5FEL^C^ z$*xtu6QNMQGrc|)Tbya0liBTT(obgNvq?XhPtGR&M85oE#3xJV1LAD2*GUdrsN(*E zTkWoJ2fNR?L)?|_Q1>l&nA_oA>OSudcQft?ca{6F`$Kn)JDxh{Vqxw_-KEzoU&{|6S(j#Q7T zv?Ct(f?f;j!Gw8kM|i$QdU5_!AIigrNq&LL=A=3y=j=jvK3kNG6>@Ws-SNDU7qglp z5$Q9Zn0G{4T7#4?2b$@1!iEF-)Eo#UCT_%)lo(vYRV*>`KnJpT+NMSgHv|hzxK)_|&_Nu_ zf#lv;j@~jV0O|djGY0iaij4U-3w<4)7I<6%;?fwH?>{Mhu{+gOe^2UxXYi zi#$sB+~~t?O^h_ZF*&<2F$&GQLIT-HFS#N%^2v-QjM5)mq5A7EU1`4Vp<#Duu%@t! zIR?T^ftCseXt>}2-uh=_&(_#`BXw2xlyqS$O}c#nA=VH(8sayzj+!_^XWhQ65NwEL zF4jTl%wuMaXJFj*>KvgZXP73Pp)7f&vKPi{2OS8nE^KJRYdRA<%+|!t0weQgdm?UjCU%+K zi6L`+Vz=3o*e+cJwR$XZygZ+nsF1{o$_t4PEAxqyRg(BfnFLYFf!{2`v(p;6Y<>r^ zbPov5Q6N$oVl!a0_fZf63TwYqNqiHJM^w+B-^(L)_?-m46H6P??Bg0ROCLEC!nXGles!}lDjtt zR_c4^VqWZKnWIQ9qykz4KgsR8h~56U4$?&~w3iUcF|Nl^d_s@jX|)g4w3LPxo_azH zZ#>ns=I46cL$qF^OH!|FEi@gcIa@x<+&I^sf)LJ;zl<*EnbE+GAv>luXyLL90l6a9 z<(M)Lx3yNO|FMg7ZsE;`EF;szr3F?C7^huZ zLANZU*+`}s>J{=VIM8zA9=6dE_#dCQH7`2&tu)*^I3ygZ?uFNxzwQV+=)q?TTJ0#H zvlz}vK37Zi_rrX6p4F^(c=$9aM?w$3jrlD|PwUQ3tZ8~mSJLNnDK(>eX7q>O&`YwP zs}gXE?a{59;hEVk3KuvGb}&yI8m=W*~v zGRGOR8%g5sdAgY#Ik55*HyCpOG2F1ej6XFU%g)ij&KyS=uN+f;_xuZkMM9eZ delta 1988 zcmZ`)U2GIp6h8B_+u7-MI$O5O+Aejs*|uw;WVaZp)tC{C5v_p;B#2cjTJ*sXObp>+ ze=hW;O`6zx+u9OH2qDG?OsJX^wGUUbWPR8zkiZ*>#F*$qCA{E+AsN3rJC#!PVRH9; z-#Ons-<>menZulH*`S{6B&qX4e+;WKFO+*&HN-JSWax2HYK$yAeV{cyYz+=7gXu{! z<^=`Cb98y@19HVPt}AxBE>a|C``q!39KUXzXi+Y%j8SLtv@k`Y^EgT_@>K|9W2d`B%B7{?jmk~Gm@lv@5 zbv+{CWz2_z86Cal_zPxt ziF6UoZN7G^p3`%k+?-AB0zHb$9?*+b-b`H!4#{#h>yU~G9ueX6t@0-70CvRZ8+<+> zxuQa5O{?=5IZJAFMKMn1IOX|`#*d~uxAWDe5q{E~9GMdo?p-BiMNk&A94IF#Ax8wp zvfe=?Xa{EWFB!{Olo)C@6@MUnYT4_xbC~5scI7GzwQeIFoNTrN4OQmy%i;FGp9NKz z{AA$CZMYT;NLhHTJMrw8!5B-Qz;7V#T^A4Yq}FDtzf6)If$jT?clIgVXy^#4U)6Tg z2>&&h=4XRLe4lzCUVfZLLbs_QlO+2Ly3a((!Tc`rnWoNu_kJesQel>bTIb0qOf$Q1 zj_LUYW-T!HZtDTEVO+&(Wa8u&W}Ofp4kY<`V}uVIy}PvU%8hieU@)sXMsMO^58_bY zmfmou{f4J1j9juBA}TF2Grvuk(nEPS?oKHlKt z??F%EJw9&u_-N@Bm;#aViI7hmExqL7?LKZw953ocZ2W%uJT*thNiSW%1$K$q#kz*g zlSX%pf__O@mcWZF+ru+W{igQT%5Hi`;O^%vm?+^ayWk-sI>vF1dZ>Gn-26?^D5ALY zFsK-aWBE461n)>b_66?5M{|Iy$0B&8#ltdh!qfS8p2WR8+s~7Fss9k1SQCuPL_TC6 zdrCc(Z(}CuBB*Yd$?Zf>A8a)w$w|P<(G|oV|gQe%847dJcbyhwF2yhn}e7(x_303a>gL a3G%F+nqKHJ80qbJ5?`kxKU+K-`SNe4zdAht diff --git a/packages/linux/firmware/radeon/PITCAIRN_smc.bin b/packages/linux/firmware/radeon/PITCAIRN_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..c918c880af603b54cdb57f782763f75a340f4361 GIT binary patch literal 59892 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

q z(ONz^2H#T5d8HTmlHjbEb2hd2ZkNa0X|~q`CrNv)(=J|LfO-I>;#223X53pWXftZ7m4< zBhM(B<(|Bi=p9_cv-DnBD?I^T=P2ebn*<#nU*`F5QKvDS%Oe__U=ZAo?ciSaOt?03 zXiE9>$0?7{?@a3a%hWbb`#(BD+vVKHiFbMaw>+w2yY)73le|9FJ5AD#A3 z)N=h{K)WY?h2M_{_Hgk11h3QChVd*{_@w!?e_XuM3@#(}{2xT`@cV2Aob&GA1${l` zzBf>Tn`X-XCWOsq?M>tUKrr`1n>Bal?6c;ge58Fry}h;F{SNMr2lprMUf$&Ho7`R_ z;D8>A_i&}H?@iN|Tf6FF-}aRD{&-4zbI5;;s-4=qTwBFJ2QsczWg1{C#Ea=CT+?GL zjf%xMdj4JPL+59OdQsyEa}%E_IC_IVpr<4}TF-wScaAb>o4Iu>Ulr-_!7B zcoyUv|CRSXecFHHVXn7w{W8~2a^1-FmVl1lc!u8}=h^dImvQam`Vp>Q;L1KJ>9U{A z;`hy5J+4dOALYMwa{V~h51jVjL~htkTz`Y>jlp;hvCi#q6ym|%3%0>rB8L1rIz}D$ z44H8m@3sZ+y629sd5+yM;}0mi3iV@O`-}!w-_*-LmH~xplSkE=b z^|EkGeIX8+(?5Tg=jCq@_VK&CPApqj_$-fG_iik_^8?l6UbrQ{3p+lSs9d+5luLq) z7H!mP{g5@nA?2{JR`v*EzY86q*mHw$I3@4EIR0X3r(u_i*1v*@FLo%yRw|`+KI!tSe9ZuiQ-A4O~CP_1#nYkRMu> zi~9b+RJjEIN?*pn>;j5n};%^B?uwr-tax_1Oy z@g?xZ=RdLsSk;gtUAU)-YuwHP*95+K4gJfXRm@&;0Dbnx-%}nb6~K9L#&`UQqO&)H zJm3J|*^03o3&+wi70)3(x_ouD5#E>dZrJ8TZUc13nLFq5_RHVTM26uT&+0{%bfP~V znrNe$_Mpu?>k1wCS=sGJ_DHsIChy*n#&&DpicaM_23+G^>upwIJ$q~Rq0f1TIu8Pm zYRNTy4=SDVA2jkH+lOrqdZvBjRR~dBWVbkShUrDFQ7p4A1vQf)9 zK-AIslAMiDn8=$_EFApFAA%nXZViV08Kst?U<`s=2fnysQG8Q&t@7dAIclBAabW23 zclcc@y18E{kHOIZ^!Gc^%mru__@>As5q_$nBj?{9+QXhJcUEAaE5H?VmA&KiR+ZCb z@4?>S%-}1JXC{x_6s(oAi zpMG3*H5c0d4e{L+dFkjUq}#wQjbmG-u%Vhb_-nnn+?&A0hIWamh%Pg$_04DOi7tLK zU-1j)RGwLiOhNaJ^DG+j&?FzDvLDw+BkknS4a7(~mg##aE>5_2=U@EsjrD zb~;+zGth|bm$Mnf-S+N$z~yE|LR}o!d6|qs`-b(sfa&~+>BjVk_#BWmN8LF0RSeP!9?`qusn^?3_EQ$VkW_Kx;>rnN^s=e)*<&Ss}v zxHzr)x2&}q@c(V)1+ArB)gd69N>8dS`q z#_cJZF8@mKC=o9Lmf8pK&yL>$xmnU&#ox*!(wU#vJt%rP`*Y<Ic{r}vBJKT3$@ADlcOl*6Xv5)EwlDRMPp8AM@i;%* z|MYZalg6SLH}KD~ekggRZ|#Zp#hc5)J+u^8UL$RFy^~z=n(!xXM)vnvxR!qCVQg>F zW2%y8Gpl?**Gzwd$OhT;eCw7v?^d0I>lM2S-s>vbC3-ehZk*$1xA!v6{S4V;;HX>r zN_53D^t^xhZ}q$1!g1X>-OE}9{5LTs#+YEAs=oaOztpm}f}A_yFAR9cY;%^6%3vS& zV2gL^J1XegxXw`}&UUqx|W~-Gx;y7!h`r0dqnVWl-_VMI?x^X7N=d?@6_&T|D_jQZtEI530=Av`l!JdMdIi1A@ah%fp!N=bR z&zydY6Wg4$-z^_2TyXCaFi?Eg+1~B&kM`l{{ZOAx&=CFZuk1I_&GZ-a|GmzBtG&0; z(J*^*&bsgMRPOBp&;J1LxV>HcJ}TN*-z(v(U~ku1>947F-Xs5!wQtS=S(=~ym;NHY z(Uz~xu_pkzdo8wj{7bC0l3zo9W`0(|*+$s|CyD)04vi^4fIO}pJ^R2Xd(JblAL>^`SJ#o%1qD=J?Z~E??8~J@X=L@|VzH=F8H2r}33weHNlDIn0ujhB& z3%<^SDsdK5{u0mJw}jYOU3x!jq2wmITv+xJ7qP*5_FKHf8fhkW>oM{Y;=7u#IXjsP z|BNS>scL^ZAKl9t=2h!;uGy}ua<<}rTUz{l(2m;B`@Eazd4hl5Yi(+OIvYK*xAlJJ zJ+jvvC{tEizep^-oHry{Q0u%1L!uy== zOTa_0)BH7W&9^vZo)hDH0zP?>|6%6Ff98r;{mk4qIZxoyy_v|Rdv%^*@xu-tb=0eq zE|Y!R+US)s5wEl>l`EImQ(j*lec%d(Mu1G`drD}D}KJz;5R zFx|T!c=FG=X@y;>0ywz3o3b`n=Ow<^wuSldpNTc+cQtLYmX}z=F~;#R;6|K!0#5s_ zoj%)pU!*<$IpcrFuEx7FwW^`oc(USE?T)3hMbKTKX-0zjB&piteIJ2 zQa$!7htHFh&oj|vGw0WI_x#YnBQS^GB(t)yH}4VOBePw+U%a1*$B$$qZ{~NU@O2gg zJMqWOX)8X?|DW;y=iqfau-@UW5#-2n&XZZL+#kU&u+dJ|wl>9&1p0x^TuW%D`J8+~ zuK!2Y*xdIGu#KHgY;BIL3HmviaC;}3B5U)`hCv^0v3rBES02GOa^FDJ+*u=tvK|#j z9^8u`6Yaw0;@%7I$-C7(`&xo>?UUdhIThTyeG1v3T>0LkJWfA4JKNdsVZB`VJUQig zA$(q#{5)d8^SEf(wUduHdUn4TrXuc~S>Y{cpEHp(E_|Kfo`lli-V5&Cz6r|9^Kj>8 zb6=i^7uGM&BNz4`&I39O+9{Nu2lEJ@8}S) zp_>0|T6-T`f;IJo;uV=#WR25NUFPgx(I&az?t2oPKeM)yuERDb?UfH=geQ~1`oZ$0 zmGyZ>yztgzlb)^98qQvDTD9Kkc=kPKqU}#lsEt~SJjc1ein|Ir@QFO-ScQc&XTbS~U{Z8nI z$@Mw{9WZGuxj+|8de)VVtn2Q8k0dk1>rRfu5~l*$!uKsYgJ+CqX(pO@eM&#eveBbc z;ngjfRatL3Sw(K_a-O5t=ywuboUD~i!T#qXm2Jp|B}O~I+K9^?(Yi*ELz5T??b|@6 zu%9Lqd(~GtJ_TzM{%hzAzQ5wmwQ}EI$?_YWv8 z&-&UQB;AsaMx33f9P%JnrkXuZ)phV4GEI5<)%a}EXIhW0cClj4QHp0`XQ#}c_jsPi zo0w=DU8(syS;RP2Q2vf>yYcy7nrI_x1=+Fxmhnx<^~P%XcKXKDn;HjmN(8v7mQVjr zm2j`zYv5os>n%UnFDV#B-xfyT1b?ae5A>dL4wW}3SWV-5OcytsCXdjPdm4M(S!il| zPZM!-mkTFZj!xoxHR?mMp7JnPEj|nQbKa8atb;jR6$hBz8b!ti&tiI}cc3xh*R74K zePFRMy#9G>bG5a`w5C*ZD$m(t!kz2^7h6K^mIjosL>>LpcP4sfj_d^Xq@4=(lU0`a zZv|!0D>wuu#J?uyum+gja;_b09@h>r<*+X8*JBGdO4bY@pfdqNfWIxjW{9UaBLOp~|MOx})1-cAE~JN4x4)RDK7T=6^PK72FC#R&SH zE{|0B-&BGBO)j@Oi0uaWAMJb4*{qXkAa*}AX!*G{r<4!sVuHX(Ft9fASgrzwabTK^ zIk~jkgbUxdk8{51V4l4mYwTlRCzb~t>6^(napu!*^f*hwnkI4oJ_84ft^9t(o{J}65xk>sC_YvxumDYe1d&g zXXa^M+J|-8AJ_hxOWDUXCK<2s2H%HJ9FK3?63=5l(^y6Qm#LowcJrpzpGMxEx2DG) z;PQ7)J{IgR?jweCSUi%3*VA2{_90^MvzA2cv#0%^{A%YQawFwrX*Ic5k=y&6%vC(9 zdcgz80M5`TfOo^Al_ptE|}jEFXbL&RMPf6F)rrFQdg^ zY~{7m>jt$}8Yffltv9EE%kTx^616qi$k%&x{&_jp#C+HCY-Qy$%@v(dqj~;Tzxyry zLM;8QCpFg)CT;Lv`t8nO6kURgw_Ov^UhH5kfZRCNZ{SJAva8cNe;{Sb_k8HI|8wjd zVrOBjaYxSinMT~aih9uLxpNXKb$LEQY%)c8%-NXTig!z1Y3`LaT42wUqcZ5$qU5v9 zNv>m$WXvy!m*^+nzFy}5z4F9q|HVHIaP7ZE+figgo9-uYK6$+{h_$+y-=S^7b^0ZI zj_QJoQDqOHzc_CIy$0QU$;X$x1l#ah&{;SHmm38zz<9yYZe60`XYYOh134IsbomKZTV?S_co6Z0Q=W2_+CX7#d zA{?K)Cr?vjb>rNJ?a!P=SI~I9-&2|my9XTvur*NjiDpLF=z1! z*lXy{mFPZIwt=exFIY2 z{~MeO7bh!mLH!G!ldSmw_p;CZtNA(XK^O~c1;n)JP_dCU>G0~hHkVjWA{zij$$Y<(EdS;M`)G3Nm%_x%voST7MT=p4_{u|5au zB6JQuE>$d7vPe1N!Y%8)mEYMU7qJkYu|PkKw9)5sKOfgv!F^6+5nbD2yA1x~Jk&&9 zw)rT2Phg)1Fc;1QcgfE3*&<=C#eBYZ_n>ryZ0~%emfZTI$JFkkjnB7hjxB#m0@=FA z@qpHjwA)?wZsiseC(?Pr%KO2#{_!Ve7hE?OIgYOT_UM@B@|Z;v`qqzRplDzDfI;ph zdnH**b3D0@XZ=>_r5~+#f{OyS=e+?uPXzfm?{NMyv~Zpd)O_6BkS(JH4_>KdOu^iA zHksy@TO2u_{#u!jg1Kpo;oL3{=Im^T*E5YAu-j>Kz}K7(e2rjy2gW6rM5}u}$GcHz zH33XwTy>^PoU8OpHCOhXJ6I(`y%VmXK7U-WQ@x%DgYvKCOZW2oZFJjtuy%Tm zH8<$KP!A5hYoH})Dw`Hp->K%d?F8Imrj<$DTFT zt+}{(I9FhEsq7%h4eZWt(YfQHM!Q`3_wF89%9$tgdcSH0e68mJ*H#TQif%jm26m5= zC(2hsmfZ6;^K*JluoJ)J!?i@$Z@_nj3BK#HkVcLkbum>}UT`uZH!VzY zzIz+@Dd?8-;N@=z-y7(YES$Zv6`PuI4>Nvp8?@gNnL5YCL?k=H@2TB`eHL9X3@@R} zTn@zrY%qBL;cYq3+1k#RgWp&1?1`e&HRr<``jm~#e(=w*&*d}TwdAp_!uA)OBmSJg zj{lix0zb_n=$BI!WBQD8xZt⧀rn1Fbo~5WasZc>j%`@ZOyAd#w@n=OUlb(Z_lR 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 literal 4096 zcmeHK-EUk+75~ld+Pn7NxCnz!bIzIbHRo%_vSL8Qjkr@Mj<#FVM$0fAlDI`nQoDrSyvGP8%LcCrcCC>fk`?%V? zfh%zVTh&GsEJXOY<1HYbv*rT_2dIPz#^)k@k+!!k?!&-K7Sn>8F*ceBn$_3_a~9){ zpZm1)d+LUT86@A3qfg;6(y!D0DcU!*SqW>@Yf+}Z(mP1K`vq(N7Tp7>?m_C<_P+P( zcV~&QypZ~F8ksN8W>IWS;lX)pN|Gmh@MHspav6Er+0$ZViqF6-RXRKQ26C$j`gxWN z&z=+iVuXIiGaIL8^7e>3KRixfn+vw{6Up#gj2&hiybn;U$_3`v0wLo*R5QQizSB?n zA5*^}?NTPF2Tb!Be>30a%Vp2 zbeUS}=Pww?toZn4c-F(IPZ`E!cN&w-r)uWf-n!YU)@_k~xIB{r{%F&>mZtg};EeNFVl`Y3HG)_? zqgYXmo`%^kJ*-7nGpCU~cvk~s?Azv&#ci^^dILDnU>#dLDZKet&W=&`W{gc&({-Df zuVnhQXOYdZ7FSkd)?*DN+I>`X@;7CJ>oCvsx$+e9>1q}u^P5z5LTgWNxqiAUMqjxG zTm4=XtY5>`RtXO>_V0;zZ4{TE8;MME4ecsq0QrFu%py8F+Hbu`9%iDDz|67VM4MqR z=4vp^@3iom{_w}MJDh$}0*JypUTm>q^3PEGH3VEIwbH-mwNLpcw0b$>o5CsIuYMrk z3&K5}_|JuNeY%%U-et*%Mw=JbUXcuL@8ac=UYzlrV7?0M+1Bd2=wJT|-sZRYnd8W< zS5TyGH<#AGi9?)6(|2y zN4?wPOXXCj6T*ESynXulJJE?dyYhjwKZ{1)oO7Lf(|tzH#cr9gbG^$rw&yMKq8Hge zjDNfTedN_6qWQC>=SpiT>;35CJQ!n+I5W)ODLYJ9I)>>h3anqspOzlggjU{_8?133 zzb}*n$MdA}OrPBRqKxSO&S4aqsP$RSH1b&HvrT2r4p-%c`^(yA?s7}E+f&S6EPIUI z-Z^`-!&=-DPTfyXHk0gkum>^N_RNl9oO7kG{fcV7??{SgQvC50&!+g- zQamSI{?ufUKk7cIwFjRTZc|(LvEJ4#0>2-H*%u@q6+1huiQ+_p((DgxAid(z-nj@_ z>BxuJ=jHq=KAveve4L3T#bw@hZi?UYaK=8axJBW(^WW>0Ty@k2JntvOqcg=JD))!T zw1JA37wtfpz1d4s-X-7M#>niH-Vohfco`oT)r_wX_R}!=Z=Xk})9W8=TyuDtKAhFO ziNf-T^eAspc;~UGU=Tgf0psK1qO&s2-)26uJX3-2cgjP#5BF7F+$d3&i|qgs)SbZ}}`-JJrj_T)DoD!tkJrU2&%~TZ@Xx2lQbV-}#KG?|fO@i;(Mcqq!h?Eu$!GTD*=P`kZ=Q~N#^=uYeFnK(d>rH(Cs<=G$nVs@ WK1XBE(8RN%d*5XH|G)p;2>c7cbHoM! diff --git a/packages/linux/firmware/radeon/REDWOOD_rlc.bin b/packages/linux/firmware/radeon/REDWOOD_rlc.bin index 1358c7a1838618edb262cb4dbfdd13808e476f47..674e580d3c4d4fc86ec0a9bf9a8743de92fd23c4 100644 GIT binary patch literal 3072 zcmeHG&r4KM6#nkaOJ~L(jA{0$DMwTgSJUq?doZoqxD4I42;8-DnRuPik}`_&C%F!{ zLc~NtZwTRvZ$>f@g*F8SL5rjoLgni_&#@$0^asp?$2s?$bIw#1bEO|=hje-NvWMKHi$_vd?xkp@KV~%Uv3DK$ihA1tZ!!0*Z8r`g(l%(@D|IC1 zn_DG#XEn0P1k|MKf0tewNDUR3OQVlmona32`{}2oE;vUpLasNZo)|H${q+MFk>DME z&kNS9NR0;Giaogizob#SzaNuArj73^kRkRb!i~gQQsGw;(%hc)w;1|=^!^3y`D5gDh35@@DokI%sO+2*%i*}q<1(NnThy$-mh z&pnL|-__N$!ux>S(d4FV7u}R96zBJJEc>T^wk5~7D>wxM_hfNTpCo=@SC%g8iTnls z0BxXA+CZPuBfu|xU4K*bF8YvqnZ^4{5+g4Uf?d@3yTn=*_Yfbxud5IKuO{l8H+9Yh zYORMbU>cmXIpTDi6V64`>hzcn=bW{GRB6P?dIcv}RL*GevNKjJIJZj5xg8%z*qVTC zrg3R1<9C@gbPjbuMXy3x9y;f+r(yFD=|gd3hGH(vIxIH<%X~nS`H1#XO!by-sNRSN zi@UI5pJ7GcK~Wz&f~go&*Swgz&be1Kz|95RscF3%{2vFnQ_S0vuRIk7DhyN@s4!4r Kpu)iaGw=)9-${M| literal 3072 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 RKaczpi literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/RV710_smc.bin b/packages/linux/firmware/radeon/RV710_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..5679b82101d981a0b4f2409443ead1f9b6019d0b GIT binary patch literal 16160 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 GO8)`dlX-jq literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/RV710_uvd.bin b/packages/linux/firmware/radeon/RV710_uvd.bin new file mode 100644 index 0000000000000000000000000000000000000000..93a931c5cb7ac2e5dc6ebf3ebc406a346ea7866e GIT binary patch literal 116120 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⪙HnH^du%|9UK&6-`G0ywAFvJ#zRq^ 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

%rkesfcq7fITjPt7F8ky&W zZrqvgWWqrNNIO547*ZCL7+H#f@*=+*cTs+q$V)Pp$E=W2o?l@bm<9yWwOcI%#|a

g10Izuj2C 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 W`}5ZOT7Ta9b^Jbp-*4gf%l`=%$~+7J literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/RV740_smc.bin b/packages/linux/firmware/radeon/RV740_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..8f416d981b39ad24db5a2dfefb72cc8e933fc642 GIT binary patch literal 16840 zcmeHO3y@q@nLg*;^P<76^PI`im8f?+0*$&d^N0t*R5CIZDqNK8c3Eipv* zRqGaHqQu$-GxlzQZka`}2%u7y1}!aD>$1r*X({Y!aixgjOb-m%+i~ofNeIrcI*5?{|{hybo&9S z%sUucaS-Kdr)}ognf2LI{6FMR7X!xj)@O`QuC2Ljjqx4hr16%y)ZAd+Vcy%EZr)>l z*?czoy;vd!7GNyEKL4!=EA(WZRf{}hN#iLdzRCggPDzb&lyv+6O{cxE0~AEC~jm<0~>H_8jBG%xf7t%1;E+LF?V& zq;9R=+vzl1{#d9GD)PL(aKm1fY7&LexGu6g#Z&ys=QK8{FYi9SD_u3Fi*bEP_aiyR zlX{L#w|didKMt5z!@iF5#$b+V$-vI;ueggm7D7Wxfp71ApbXAxd42I-mJaV@G_`TN zx$ELH80}1mqh>XME`?CtC@+LYIQF>WEao!1zjmCb_0Hs~EXSV32p2^;Ma}K#i<*f6 zyHYut%iCSS=qN-w?$ej0s_)b5(zRoJ;sj5{vRX2VGbL~AOl}#|m!6DvF%$UMU1aw% z(|FlDt~H+9ebW4Cv?*Z){%Y6ip8@+Une$IT-6h^#Jd6@msq1&0YL`U3~j)a2~h}8|@JJqu&?KM!|cuzasZ@ zWuEQqSl^c8U%^S*@l$5VMCWdA=ZfG8?OhCXjexXW%m^RcbnxFpU7NFAo1eErH~a}UHe>gR1);cFQ%z^=nupE1m`9841bNpb?3 zr@%T2T1O!OE^8kE`$1?)+ia|C$`3Bx$HG5g2WEA8ER;XJt#kLVmg8&~SPyt*kA7~4 zfUg6U{T*@!8`dzCX7I}X4szNgMp>6NyQ@%jR-dbUt5A7XhXcM2RG!s=6t25Oh4OU| z!Zcq8lxNQn@O40Wb_YoW< zNM1*d-EXb=He_l{CvyP7>#Vz<-Q1|}k3JfFZgZ8$^p3E5FvE2uCf;5!sa2iWAANFc z^N-M0*#a>2pRR;j@vEJNz|4kSPD5~J!>62v(2R!KUs}!S+5es1=8WF)ugC^N3agaW z-1Ia!ak?uRg=|mg4a3@mo+Lc|S(fjQ9`|SCw@WRbPDCYJ(gt^eBo$Xl}TJrrn{Qufl= zkctM1X40f$1jVR4bPhT}9Snzb%jJ~;tadv~dv)|ZSgSRBPTiZN2M zQ1uVTUrJ;ij=fYRjWrqWY8dWAjHLqoEUjCYt?>G}fCjHPo3VKz=y2eQb#nQgM#wXnw4)~zv zvr?Pj+~%{DUPz@?0LKhoo?~~p9MeJiqfDm3mK=+e+qkbS$Ew%2b?zpEf52)f(%;q$ zDU_$t$#qo7+mQ~QviCV{0XmU0)w5EmF<^=H>>(|eXF==gQxd9?I|V=(03u)rJjm1Q zykfI(i(2|}D(*lBJ-soxy%6fOwV?bN;_w}k8!%y~aAAUgTa(Q*y4{eho!#xm7m{G) z(_5sef;|IPe9oMQB6U2GDTGR4ux5~0v!QMjO6sCMV2%uQesC2X%Z6~|2dlF{Vtz20 z)n!e}-#Ec$3i4os9GOk{N6i?MA8aaVBTTdlb@7;qZpQoL@RVYC&A<+NM|od7Scqlb zzcqt{1DwMdEpaPx00dMny8)M79MWnVPbiP3i&b^8@_ckI8t`*+ znC6(gU_25_h5I6P55>uslh%fIGQth)hUT?gmYEZ~IetGF1}vf}7U9;_FA~9v#1X02 zJSxC9R?O%bOk&46KNz02YRvJ2Xlelpsx#}n85A9%DU@r;4#2g97gzRAotg9OfavIp ztZ(Zxi1j~>seml-yU)jWncka?lcPH4Y#iqOe6taPLDkGb9rp~8pPr^u==i(74X*fS zu(}jMjjeBUH>hDswK1!@;A>T5CoxvF5(b1113;Elvqg@`g z)7je_70V560AhGI;faVWBTdBU`%_*L`Q=x4fmCLwJ)_ z4#Wh`Sd_fsPUi(5#C;t|A*mt!kucBbrtsur=ImH`Wk2{g4!9*-y#cDAk}G5&CvPWg zXrJ`Brzo;KZ^IAjeia}4e5TS4!}kfOww}s1j}iRzS3=nRrJ0RB87b>0sDQk!@7S@U zhZMOeYS`2`ZUL}tuxZ%MzxXU}-ma|&o1CwI-VW6>V}jo_#kX1Odl36b2r@+}Gd~zY zK}(lpJ+1FfYINeza)ujc?Q+ID-Ie5)uuzVLh`#GfSP|_GqB=Te7$ZynBD!?~1$6f% zuS)NERRvaXm92DdGY2PnR?ZVv!F6}hKN1r5(Gjs%Jyk!!KQhJdQX-p8Sc?}>_$(Pj zanWh&x)))o{YzfS>*qT1;WHgm`ts6(^=%{7z_k+EGZ19#Y?F{}i_x~wp@Tr@ybbre zZWys20h?U>CsA5Km3pc?EK0bSh!XB4)}l|!9Z3p>V6=3&=#I+iM;y<$%LMhYb$6$x zQ(bhr5W-$@>rP&Wb?qfMD)8nwOF@unFUZpKs$3x;?4TF|$L%e$34J-t8BPEzM?!HF zAsEOD*(D!SQ`HGjfvhcF0 zCbc~KWi5JwoC!35KVGY8KHe82G#oK;(_dybNBZKuN21MCrVgcWP#VYgZ&mmaN1_=q z7!i+~8SCnC<&wdvdtJ|nUuoj&TuR#`Msv7fOWi|}rfZ~|jd`9 zy9{7jV!hjA))YMrK}^wXxgCyRjX_O3&NJfmFqR96uLtFFeKG95If4Dx!-T8dQwjUJ zu$AYS?YM8Y?_ypD7a%0Lw&HbQ;a3sybyLRN+L*teUN5Wk59B&TGc^bYyOGSZjk~@8z zshIbq2`&uvYkdL5o{ek&9$|IHq*lBjj%>)2{v+uutsvg3C(eVE83(6(rd$!D=r?Ib zh=Zpb(Z8TMTC=Ru7FDXW1;Sn=h8Fl#8Z?@x&?>bVDb_`v`$|tH>Y^Fi#~nqRfCpEb zG_A$=X7Nr@XrX+=lItPI)~N#`yU04V41KQ zgoR{<1k%VP2kWA5IvGp$=`Fy)5^D%r&lxYOrAVBQt|`o zf&^9gXkH*kwsDA>%lCM6ReI)(!rXkq}$y-uTf89-86-xSKhV#8wb| z-j-W>BTA%_a!a?N1P5iY@-7mNH<}7r7a!P_e${Pn__#E=O&@mKcdGW}t+_g9)*Eum zyjhpM&8$v)!(uh-%vG~NMEh}+OMlqfIzuOr<6-mk$Ds~NH;indK;_V$#*{*pc?}7F zvWbNM)1+*q3OeuufVJ$m!qB@Q17?>xJ z#KjOy9I#eZk@-cd(%>QQ9b4eKMGx0QoNz2xRe=@|N~tC5iXVZ5l9W9>J)RA?2hN6} zukHe)d3p_1n6+7m$Ofz{mY|L7L4FX%4Y7H8B#%w-+sVZ4=r;;*yP6j@z-fWE)EGmT zNq#%M$?_f66}RRh8$kNZ!85R5Qm1aPE`2jUNcRtG)z9Ub$N5usc$|OLVKb93Bvq?q zvzBaR!#dLWbJ-U8E+PZDteT9cdiF?+A?qN5=iuYKLB~Uo_iP4h>nU9CfsP)YoPpIe zFsd>O8ZmO?+#^XeAQ!Q$;o`Hk)w=k{)~4@TE7R(1S<`I-E0?ca6MW4SzXVt6)>e5W z=h9ZG-maGxS>K<2H?dy|k0DKj?=0cFryovnOgv(waAg3#Q`AjC8n%<;2w2ngGY#UU zZxW)JyCv|%7=Ii|6e|d3;*Tpvp2xP9wSlyNcnt>8toC~> zarb%0mC38dna((cH!vAxp%fYTqa`agtiwiA^>UloZ!K+9J}=hDCo4XFzD;6Or%kgH z-#NSl>pYW}9L0>d#tcs|Z|_4oM321E7sIe^XJlX|ECVyNrJK(3k;Wk6790EX_Kh|Y zLlD6+;aMbc&q|RmF~NuW;}iUJf2?!^uDe@Y>NPKE2o>VEpCqj2!@E-I(x>ge`0l*z zQvY2tVlf}}O&Sg2zpF#ucN+FIgD>dD({$VX*q;X>7sLzT@A)SNzx`ii2TvMjQ7_=Q ziZG(*BV)soW=TdQC6&n-02w7u;8D7Bx1=fY5nU=IgBau`i6SKdi6MGfx38~9h(~hE zH;G%m(GMjWr#nDQX;(b7kX)yiN&bzz{gNo*O-hvLQOdr4Ijhdw zBQ}HC&lk_ZyG6oF@eQn09L@eWeT>k%l*|IF(5lc2u47F>zOkeF2_p?}7CV+Z#~WJ! z#UcV!{1(J2g&h#5Aglp&i{}ToNxg;aC7#3sF(z|kQt%N{(2LciV>~|rb@Vq<7$^gi zsbKd%>`MR28zimPdA*PB$EC&{bu_NZswk@$De;c>g<6T=KBIXQ$L`7s7@|Kjs97QV zL@~%d&I^j+8FgOSk0{yKQ)|y7`zgsX>4deKxstE%zvK-m`4Y`E3r7SibroirSO2S7 zmXqDta01@EqL8)meT9(CQ^8UYbNbkj7N}rDQ?X%K*rpgli2F~94PD-O8^VBb9KwX= zBFuS+&|KpvVAEWS;??(WA|C&e7vxA1XqdP*hgEV|~m=UEi);v0c zR%CpjGJ?W}@u4i8KP8pnNv!f>{%9}e7ZHcsG8Ji+@>b6C(*+N` z*gsUJU|sOg)&8L}IiMP(n=?b8!Vi2q3|3|i{891^D0}3>(iGqcdkk=aV^aPxvzbO@ zg2B(dDl!zyN16p*X6Af@SML<6tBg-l*qlQCPejG3SVlZyic=94GAl)UN8n-wkW553 zCEQSuRQGV?rD*11<0Uh5IQ~i^b2#=&m6P9FVG~^&<}4(KseK*p}h=6KLk3;*mV*(DP_eqwp#by zs;H&w-NkCL*sj%xJ#Agijv?oJa2s)*npUN|INa8y*QsP&^xdYiSGLr%1LXw)l^nmd z3?&~~oimI4VvN`KX+^!H!2^IJJg%>FuTmGOeD6BsooG;}VVTzvqbr_Du)~chaLmIA zcCZDzb@rhg54}rY>G>n{CJ9{Ti*IIQzFej9ULE8h-^{@}UIwi;@9IZzr*oyX2UTd_ z+ikwjEJjAmLr9fdxdvYi2&5P8Z>vQPH$X;u@gXG3Edn4Lz`H5lmFTTD8PA4L3#%HS z2pPjUA~nU&>YcDEZQw|n62)~@YStA1QkRkmlo+xB1@h(BRZ&ykzP9qs^x$OAw0gIx zgqKqVE8z#H-2T2?bfkFW-Lov*lQ_feqxjI6@Uz$FL*R%E+jl&s~ZbhKWF zAL)6q-WW9nj*KxN62`!iAqAeWfOrEvhPHhRK8a?votfY_Oz|!BqKtbSG&#Jm3H`me z*XlR+8 zdgt)~!dGo!KdPR2@q$t1cu(@!9-1W1=0}wwQH3avL~n2dj!T)b@1@Mx8&ziPXcxG( zy-VLN_X_rej+GfCK$z$zBpyGpPH!wd}+g-zTx@SW2;yJ`OJt1}3TJ@362d)Hg;}IW+l6#Q7fbU^Z zN)(1q;l_^!&1uk*A!xbjp2>&qZoCjStLlJTTLk! zCc=~#mfHhpT&|+FM~84hI1$Z7NA*B-)XKg1BaP%S+V7EGqQ3viyTKhYtcX;QD{BzH zx$U;wdXABV;_^q?R4~$;WL1|*LONh79-*J*N76OB5KbwMXRF8vlY^AF+phzz~*^K_F#XT~kC_ zn@(T{&+;eJYxDM%aC(rQM-T7h^??NC3_aW`fFe6M&Yzs%3#NEA92M6>gXq&EGZU-E z_=uc_V~N*pg1@urQz(rceL_Nm6GxvG!^XtXuZiK%*yaI94irZwl^sL`FG{LM zJYk4a_-^A9A#n<6EyMBN(O3be6sO?ORwKJTeQVyn7Y{!X_sfyKZ)8LUkf-)Jo85Zr zt>RP^*ukys>9`n5P=XdRk78m7*Q&hzca8^(y;Ejmb@FDw-eyiZ-udRdSItSjv7=8G!zFy%Vb~y2M*6ja<|1q2Cx3ELJ+9( zTBqh-WpVH5LacHx_K7tXx@!pVKyj(Z1y#>O1=dwC!ZOJSL(4?59;`B=i_*=L{0&js zKFQBi5EZ7Q!Dl+?Yo#Rp6kaId_7;Gn&C-dsr<^a6ug#d5)LD@sJ`kBsq;+P}rpj3} zQ{x^elDYo2%yqX3_$nUE%mfr@{EAzy$=q^{kx6kw6*E`F-;`<5K_N@ literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/RV770_smc.bin b/packages/linux/firmware/radeon/RV770_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..50955ca528d1af53ba58aa1fdbfbb2ffb1d5afc5 GIT binary patch literal 16656 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 K#?Ot4qWmw`DQXh{ literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/SUMO_rlc.bin b/packages/linux/firmware/radeon/SUMO_rlc.bin index a77627319c17164a3f11aa981362c4dc7df977b7..61b509fdf1f88a049d2ecf619c03e397d4201b2b 100644 GIT binary patch literal 3072 zcmd5;U1%It6h3!$vYFj%>(-`msarEKEr!s-wzhSvF0M3~sBNuSTJWhz1z#*a)CVCU zw{5D6razSYr$QAUstBbImVkm&eVLHi#2@fUrAXC+f(Tjc!} zQ__kv`^gWw+s#nF@@BRf88Yn2F8CzTcgahVAAGcZh-;qHcGf>`Y--5|qQ<;%fx0Q5 zANc*}ro{0I@7!p2Yzd&V-EktCiD)*W%@NH-G;gSvX}cIK!`~k6DdQ+4D3&Et+kL?;2Qk~ zAMXvc)fk`iQ>Cr`veH9CUicYx`726Ae^qIlzozuC-&T6WUsu{;c~Q5|mgi&heTvAK`E?+ss3x?872jk5NDSBQT%__>yy)Zt>pYw`#_ zGc`R?4qGV`^LHVWIlqs5t|Ka-oPu{q4YZ5#>>N}-j(PI4i+sTNO7CUnfV{$afc(%RC&|k>#zS0# zjvlTNC)r=zVi~oe<9KYHPJi70kgtJ;Q)Wr|7_D<@>UknZxWgo^@F;-FS zEU72MQ^RLdC$LjSwCt&~QS!j^&WidN7>^h4ARaJ`(b5VOOxtksznB5N|X40*D{=*$53 zy&5jz{_qms5P_Az+Vj-K{^@@S3VD4gNdm)om)Ir?HtpsdH~}t$H80nCn}tql=1clg zgiHT;)70>3`lgit4k6OFaRYw(1h$+0I4p}>xd)$Gh`om1IPR8?;(o{X5OTiu?vad* z*!#%!rSBn0)~}=HUgEq$h4|KF%J5nE3~=o{dpX`K7UoZ5zL|62-trnJeQr5Ci{65_ zOKA)97jz@>Fy_zuc<<=N^Pm>`X(Qf#jKiOlfu5W~e^6Dt5ixFx#!Zw}!&G&`h0lq1 z%zI+vJ;+<&_+5y{k~dT>mJ89l!@SSfqoaIUIEDOKhT2Qj^2SYjn{&C9hs0?=l*{p6 zy*Ioh-v(oP;TUrsHkux$MLy)4F7^*%Vvp#BuW3JQi{oO0&(tGrHE%*kT5(@CYZc_B m1^wXOQ3*pFyM^yj?=G`X0}D4H_f^!pKjm87yLsmS^8F1CaQU_X literal 3072 zcmeHJ&ud&&6#nj;>CBsE+D?C%4(-&u5X2BFOrhc^ih~By3W{22HsV5DNH;CmjgZo( z1{t-jMUpm6x~MC=5fPyVDtL=7UdS7x_z!eZ7w%dtB1-%GzWd%wUqVsPtpks9@A>ha zbI&>V+zC2pj4T2xA-2WvHk6w%{Sce`p;zMGBQ-HFz_rg$w8pQ_ugb4NIifnct?LNK z0)(v_24k-qoC7N0Z@!DN=rl}QGz4A|CFW**QN#0sQS)uk0kzg@+M&Fwyi`y zcFl#T(4U#H$)CasfkP***$T0K*}90K3{%+hK`djJ9|z=T)+RqOSEXEEJlYS5$F&jF zIhY$GUp#}0S2>lhf{#A+y?7tb?R#KMP?rgc4;o<8|84$@oS1}_=@7vKF5#` z=}3S3B6cv2$=t@}n06}{F{m6b-9+2J`uL$m_<`>=Y&%Jo&+wk#>Q-jEsKpUbmaV^*hA{glSlc-Cs<}_uMyF(p3VVEu z?3Ny2FC2gl(a89<;F9(4zkm`-!owi@8o^6U{JY$_p`9ihRa-O#6Sty%&3ZoN+`P=<9KdeB!>ReU6*W z>Nf(Pan^^gL_d;l+<_A{R4xFoiO=5GjPp3BUe$iS3wL+eJI|<|#QaRP<{TY=u?O|$ zVeNSbUM|>c_P?M#XRbc>-|%U@4e2{Dd?tvWPO|kC#SpW3*4cW{>%lKdL)I zy01^)xqd5xVShJBJ<@9C^ABg=@M;?xoXvc1`JN19>j7a2gSkm`W`1r)>I~Ko;NH1N z^E16u_w>{GBK?rFCgxntXHQlKha(? z_9wST{4!$BoDtv8Xg#BijItk`yqVFKqw3k1=hFY1JSRPY^CzDRoaOSd%JaRd>aF>s zxuf~=Z}+VqU^x4K6^`&@>s6LNVBge--;Pf^`mSQLqbSRde70`GEOfES?LSWaFZ0ea zHBm*oHe diff --git a/packages/linux/firmware/radeon/SUMO_uvd.bin b/packages/linux/firmware/radeon/SUMO_uvd.bin new file mode 100644 index 0000000000000000000000000000000000000000..4964c8a25172c45c82c1e6ed814a2ae7a017414d GIT binary patch literal 205080 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

5zZ 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 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/TAHITI_rlc.bin b/packages/linux/firmware/radeon/TAHITI_rlc.bin index d9266920f21ba4085d5e0aeda603156fd7cb0dbd..cdb74371604c56a643bb8a0ad3acc782db4f222d 100644 GIT binary patch delta 2111 zcmZuyZERCj7=F*~-FAD|b+@A%O|7MjwG`OoZU`G6)oW&S>If4?qB!EzA&Dp<1`P@Q zI5LEhEXq7x*-#QRm;j<-;Rht{$C;MU#I{=q$RCW+pfPbI8cig+?fRbf77$5#a(dtI z^PJ~>4>hO}NGq^d9|UQH+xFs4MmX7lyKRKSGZbv~tjoD$<>{!Gs$3l~>ZU;nO@YbX zK+x&5YXp?|QK35o_v+Yh&Ieq=!Xqr=`waCk0I(T{S0dY)rz+$nTe;F4;2Jn`b^xvb zP#~u$z_Tn}KFE?)o^#zw7h#4RO2AyW4FGdKkGsg-6m}H89XSe`h|K*1Lf;;BQ#D#g zRXl_(>f|cQjgs8ejrFFAx_F)w?mu+f2X)##x;uWGy73ryIp+Iei%6Q{aBAr^kUR%H zWxyxt0Qgb>$Fl&s&|{IJScg@#C|)FNIzoxbj@!Hv%&~Eshn=nPCZIJY@d8NcWgwx| zPuxi%@jk*U_6>#_UI)kL&49LS229lVa9?xT#hU;%)8GkBcj%_ynljr%&aMA;>;Ge-R_pHiC@0 zuSK>Lm=hwCaKy`SW^HJv>rY)0m)Zhabd1}FxirP~W+G$_9|6Jdo9;76ref8E2Snwh zD+T0Gu3r#AZo$|~_F_;caB0(-v;zWJ z3eYk@zQnXU#ThZr3+V;WYrhT^;Q(ky7XbMy>;?nNJd^gpieYYU#rkz|H~|pru4-8& zy_Ro>m$(Or5aAhrz?wTnBV_FWiE$)vBUjU|=K7#!n$g45nWS^?u^W~3nQc!$mDeRWw)kH@@{;4Hbg&YCgfC!Ew!to-4atFI0 z2idmr-by`Sn;ZkUv>Ji(RCj84%h#4<8?L5v0I~Iko$aoCXsOhUg>Q~w&TKzy&Dmfx z#(7a7iHzGL{EMjCcC$cPC^0v6H|5bKn547EtVwY#Gzez&3a=E?45u4jhQy*?qckzD z)ty9w{@2D3HifCTMc5Ul$9?Pya^_k-f+MA9C>-x+SPJM7cI+2>mzG|P)HC4e62(}X z+RZ$bz3e$H;K?B$)AJ!XYQO>Pm&b<<*pGC3lU=FMJ8*0`k+dS@_r(SxZ)Z&oFJnD9x&;415@eq*@<=`;`gc;NFEiWL@$ zWgK;J0xEK`yuDM&}rgg=!?NSsKi2#^#r#9_Ew1UYNs6DU4gh*_Y(z_S-m~ zQ0rUfNZ4aSY?#_>@v)2zQ7v|i%F$8k9Hp~=*W#mtmo4G0ggs!!h6T~JMmAoyN0V_# zhzrNnggrbtq_4rGL$7=NQcuGmX!u5#^G9Hpcn9F4@G8b_QjQX`9~18pryc zlP8+BseTJL2QKX$XP*NPECq;QUVyy_yUw>Arweh`ZQSW5eb#orM)@P)k96|ZaH~Qi z{N+%#>|PUQFS`*XYClhGMo>%QGO3+aaz#5akt0Ib%~_&AWy~u#GD&pvU6e=b#4 zrn-iWZRGud!ZU2`zpUsrK zCpYBeC?k&w)R><74Ba;)+`ptPkEHY=rm1v|aIwtQ$^{~<%h#c3$8HJ&lijW%ha$P# zINuYEt_x-KE75?Qe~v05q)8H=t}_v(?BF8Q-1h_avoMWgE++u*OR&3PE8av@%40Wv z_p#q5DVPPMT&c1_#)o5BP5H92pN74(u~?1|XaoF`Hk5Miq2cIv6v^kvn1{f8f-D4n z!H?)|ihGOOdRlRR<>&Pje>9fi8`?0>MGH#c1|Nu~RD6Q|!1FEtIh945A#!zY}$M6_vs-?ck1W`NNnXF zN0Mpk@u7$h9V;%{I__l`|1pv*&`uwY`tXb8$2_>j_iNIR`5m09rWG={$~u!2_Q9A0 zh3XNWf+uRhDan)DIF&ozcea?eHB`5f zRaC>Rk=>xmS+B~x#3txYY)Z7$OG2syLg|d9aiI=yv;IVRQ(C;3u(e{+){yAcqAqHZ zJb!!$?ayvvrDef<88ytf1CwfMSZXVVztCZ+LXK+J60U9qcYX9pE6NYmwewH#E3zq= Q$Fu9o)A5gVJ{6_ZU6uP diff --git a/packages/linux/firmware/radeon/TAHITI_smc.bin b/packages/linux/firmware/radeon/TAHITI_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..a6ef51e71a79c7ea2fadab8addaa92a99c04618a GIT binary patch literal 62552 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 D5~#Na literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/TAHITI_uvd.bin b/packages/linux/firmware/radeon/TAHITI_uvd.bin new file mode 100644 index 0000000000000000000000000000000000000000..a2dc9183e416b54f9e14604080589efc3159eb9f GIT binary patch literal 219672 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%0A8i;!aasegK38zx?73RuNWzeI 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 UZ~vuZ|9|%1&tjRx*-Xs813iN&q5uE@ literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/TURKS_smc.bin b/packages/linux/firmware/radeon/TURKS_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..d644ab63f8e560c267044d5727279aceebcfd5fc GIT binary patch literal 24668 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 literal 0 HcmV?d00001 diff --git a/packages/linux/firmware/radeon/VERDE_rlc.bin b/packages/linux/firmware/radeon/VERDE_rlc.bin index 6ad5d5b05df41a2b2a0a22da1d55fa49321b36e3..beb17b0a0cd6bed9b0c1f48d358d6b2f06f0f822 100644 GIT binary patch delta 215 zcmZp0XmC(C!oi?!(8Itq;{XE#kY=25fb|5BW(M&a7}&3FR4|dRKf!5hc7oT|e9D0z zh9?AVEl!BqTAq-#wK}0_Ykfl1)|6!hgTc8*+om%IZJWVCnhmiunI6Z)N&nQJaLVI z<$w$W%ZWz}A}5|PsGQ?s)b%-+$LPaxhJl5ngMo$X4Fe139R|jk2mb#!%f*;*hKn%; OXrX%p0|N&G5C8z)wMRk# delta 215 zcmZp0XmC(C!oi?!(8Itq;{f|*Ak8@A0P6`L%?#vUXkcLA*r;G4U*EvMeiewXF$@gQ HCCOR<7xoZk diff --git a/packages/linux/firmware/radeon/VERDE_smc.bin b/packages/linux/firmware/radeon/VERDE_smc.bin new file mode 100644 index 0000000000000000000000000000000000000000..78a154e96ce85673432bc471dc2babeb1ad37914 GIT binary patch literal 60388 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 H^ez7jNe(@Y literal 0 HcmV?d00001 diff --git a/projects/Generic_OSS/linux/linux.i386.conf b/projects/Generic_OSS/linux/linux.i386.conf index 86d355806c..d672501f7f 100644 --- a/projects/Generic_OSS/linux/linux.i386.conf +++ b/projects/Generic_OSS/linux/linux.i386.conf @@ -853,7 +853,7 @@ CONFIG_STANDALONE=y # CONFIG_PREVENT_FIRMWARE_BUILD is not set CONFIG_FW_LOADER=y CONFIG_FIRMWARE_IN_KERNEL=y -CONFIG_EXTRA_FIRMWARE="bnx2/bnx2-mips-06-6.2.1.fw bnx2/bnx2-mips-09-6.2.1a.fw bnx2/bnx2-rv2p-06-6.0.15.fw bnx2/bnx2-rv2p-09-6.0.17.fw bnx2/bnx2-rv2p-09ax-6.0.17.fw tigon/tg3.bin tigon/tg3_tso5.bin tigon/tg3_tso.bin rtl_nic/rtl8105e-1.fw rtl_nic/rtl8106e-1.fw rtl_nic/rtl8168d-1.fw rtl_nic/rtl8168d-2.fw rtl_nic/rtl8168e-1.fw rtl_nic/rtl8168e-2.fw rtl_nic/rtl8168e-3.fw rtl_nic/rtl8168f-1.fw rtl_nic/rtl8168f-2.fw rtl_nic/rtl8168g-1.fw rtl_nic/rtl8402-1.fw rtl_nic/rtl8411-1.fw radeon/ARUBA_me.bin radeon/ARUBA_pfp.bin radeon/ARUBA_rlc.bin radeon/BARTS_mc.bin radeon/BARTS_me.bin radeon/BARTS_pfp.bin radeon/BTC_rlc.bin radeon/CAICOS_mc.bin radeon/CAICOS_me.bin radeon/CAICOS_pfp.bin radeon/CAYMAN_mc.bin radeon/CAYMAN_me.bin radeon/CAYMAN_pfp.bin radeon/CAYMAN_rlc.bin radeon/CEDAR_me.bin radeon/CEDAR_pfp.bin radeon/CEDAR_rlc.bin radeon/CYPRESS_me.bin radeon/CYPRESS_pfp.bin radeon/CYPRESS_rlc.bin radeon/JUNIPER_me.bin radeon/JUNIPER_pfp.bin radeon/JUNIPER_rlc.bin radeon/PALM_me.bin radeon/PALM_pfp.bin radeon/PITCAIRN_ce.bin radeon/PITCAIRN_mc.bin radeon/PITCAIRN_me.bin radeon/PITCAIRN_pfp.bin radeon/PITCAIRN_rlc.bin radeon/R100_cp.bin radeon/R200_cp.bin radeon/R300_cp.bin radeon/R420_cp.bin radeon/R520_cp.bin radeon/R600_me.bin radeon/R600_pfp.bin radeon/R600_rlc.bin radeon/R700_rlc.bin radeon/REDWOOD_me.bin radeon/REDWOOD_pfp.bin radeon/REDWOOD_rlc.bin radeon/RS600_cp.bin radeon/RS690_cp.bin radeon/RS780_me.bin radeon/RS780_pfp.bin radeon/RV610_me.bin radeon/RV610_pfp.bin radeon/RV620_me.bin radeon/RV620_pfp.bin radeon/RV630_me.bin radeon/RV630_pfp.bin radeon/RV635_me.bin radeon/RV635_pfp.bin radeon/RV670_me.bin radeon/RV670_pfp.bin radeon/RV710_me.bin radeon/RV710_pfp.bin radeon/RV730_me.bin radeon/RV730_pfp.bin radeon/RV770_me.bin radeon/RV770_pfp.bin radeon/SUMO2_me.bin radeon/SUMO2_pfp.bin radeon/SUMO_me.bin radeon/SUMO_pfp.bin radeon/SUMO_rlc.bin radeon/TAHITI_ce.bin radeon/TAHITI_mc.bin radeon/TAHITI_me.bin radeon/TAHITI_pfp.bin radeon/TAHITI_rlc.bin radeon/TURKS_mc.bin radeon/TURKS_me.bin radeon/TURKS_pfp.bin radeon/VERDE_ce.bin radeon/VERDE_mc.bin radeon/VERDE_me.bin radeon/VERDE_pfp.bin radeon/VERDE_rlc.bin" +CONFIG_EXTRA_FIRMWARE="bnx2/bnx2-mips-06-6.2.1.fw bnx2/bnx2-mips-09-6.2.1a.fw bnx2/bnx2-rv2p-06-6.0.15.fw bnx2/bnx2-rv2p-09-6.0.17.fw bnx2/bnx2-rv2p-09ax-6.0.17.fw tigon/tg3.bin tigon/tg3_tso5.bin tigon/tg3_tso.bin rtl_nic/rtl8105e-1.fw rtl_nic/rtl8106e-1.fw rtl_nic/rtl8168d-1.fw rtl_nic/rtl8168d-2.fw rtl_nic/rtl8168e-1.fw rtl_nic/rtl8168e-2.fw rtl_nic/rtl8168e-3.fw rtl_nic/rtl8168f-1.fw rtl_nic/rtl8168f-2.fw rtl_nic/rtl8168g-1.fw rtl_nic/rtl8402-1.fw rtl_nic/rtl8411-1.fw radeon/ARUBA_me.bin radeon/ARUBA_pfp.bin radeon/ARUBA_rlc.bin radeon/BARTS_mc.bin radeon/BARTS_me.bin radeon/BARTS_pfp.bin radeon/BARTS_smc.bin radeon/BONAIRE_ce.bin radeon/BONAIRE_mc.bin radeon/BONAIRE_me.bin radeon/BONAIRE_mec.bin radeon/BONAIRE_pfp.bin radeon/BONAIRE_rlc.bin radeon/BONAIRE_sdma.bin radeon/BONAIRE_uvd.bin radeon/BTC_rlc.bin radeon/CAICOS_mc.bin radeon/CAICOS_me.bin radeon/CAICOS_pfp.bin radeon/CAICOS_smc.bin radeon/CAYMAN_mc.bin radeon/CAYMAN_me.bin radeon/CAYMAN_pfp.bin radeon/CAYMAN_rlc.bin radeon/CAYMAN_smc.bin radeon/CEDAR_me.bin radeon/CEDAR_pfp.bin radeon/CEDAR_rlc.bin radeon/CEDAR_smc.bin radeon/CYPRESS_me.bin radeon/CYPRESS_pfp.bin radeon/CYPRESS_rlc.bin radeon/CYPRESS_smc.bin radeon/CYPRESS_uvd.bin radeon/HAINAN_ce.bin radeon/HAINAN_mc.bin radeon/HAINAN_me.bin radeon/HAINAN_pfp.bin radeon/HAINAN_rlc.bin radeon/HAINAN_smc.bin radeon/JUNIPER_me.bin radeon/JUNIPER_pfp.bin radeon/JUNIPER_rlc.bin radeon/JUNIPER_smc.bin radeon/KABINI_ce.bin radeon/KABINI_me.bin radeon/KABINI_mec.bin radeon/KABINI_pfp.bin radeon/KABINI_rlc.bin radeon/KABINI_sdma.bin radeon/LICENSE.radeon radeon/OLAND_ce.bin radeon/OLAND_mc.bin radeon/OLAND_me.bin radeon/OLAND_pfp.bin radeon/OLAND_rlc.bin radeon/OLAND_smc.bin radeon/PALM_me.bin radeon/PALM_pfp.bin radeon/PITCAIRN_ce.bin radeon/PITCAIRN_mc.bin radeon/PITCAIRN_me.bin radeon/PITCAIRN_pfp.bin radeon/PITCAIRN_rlc.bin radeon/PITCAIRN_smc.bin radeon/R100_cp.bin radeon/R200_cp.bin radeon/R300_cp.bin radeon/R420_cp.bin radeon/R520_cp.bin radeon/R600_me.bin radeon/R600_pfp.bin radeon/R600_rlc.bin radeon/R700_rlc.bin radeon/REDWOOD_me.bin radeon/REDWOOD_pfp.bin radeon/REDWOOD_rlc.bin radeon/REDWOOD_smc.bin radeon/RS600_cp.bin radeon/RS690_cp.bin radeon/RS780_me.bin radeon/RS780_pfp.bin radeon/RV610_me.bin radeon/RV610_pfp.bin radeon/RV620_me.bin radeon/RV620_pfp.bin radeon/RV630_me.bin radeon/RV630_pfp.bin radeon/RV635_me.bin radeon/RV635_pfp.bin radeon/RV670_me.bin radeon/RV670_pfp.bin radeon/RV710_me.bin radeon/RV710_pfp.bin radeon/RV710_smc.bin radeon/RV710_uvd.bin radeon/RV730_me.bin radeon/RV730_pfp.bin radeon/RV730_smc.bin radeon/RV740_smc.bin radeon/RV770_me.bin radeon/RV770_pfp.bin radeon/RV770_smc.bin radeon/SUMO2_me.bin radeon/SUMO2_pfp.bin radeon/SUMO_me.bin radeon/SUMO_pfp.bin radeon/SUMO_rlc.bin radeon/SUMO_uvd.bin radeon/TAHITI_ce.bin radeon/TAHITI_mc.bin radeon/TAHITI_me.bin radeon/TAHITI_pfp.bin radeon/TAHITI_rlc.bin radeon/TAHITI_smc.bin radeon/TAHITI_uvd.bin radeon/TURKS_mc.bin radeon/TURKS_me.bin radeon/TURKS_pfp.bin radeon/TURKS_smc.bin radeon/VERDE_ce.bin radeon/VERDE_mc.bin radeon/VERDE_me.bin radeon/VERDE_pfp.bin radeon/VERDE_rlc.bin radeon/VERDE_smc.bin" CONFIG_EXTRA_FIRMWARE_DIR="firmware" CONFIG_FW_LOADER_USER_HELPER=y # CONFIG_DEBUG_DRIVER is not set From d89b6afad508518fa19cbf92bf392d46f26a8c6c Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 27 Jul 2013 02:03:38 +0200 Subject: [PATCH 008/103] busybox: save longer lofiles and rotate much more in debug mode Signed-off-by: Stephan Raue --- packages/sysutils/busybox/init.d/05_syslogd | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/sysutils/busybox/init.d/05_syslogd b/packages/sysutils/busybox/init.d/05_syslogd index d7f7989dcb..2c7b6974a6 100644 --- a/packages/sysutils/busybox/init.d/05_syslogd +++ b/packages/sysutils/busybox/init.d/05_syslogd @@ -42,6 +42,11 @@ SYSLOGD_OPTIONS="$SYSLOGD_OPTIONS -f /storage/.config/syslog.conf" fi + if [ "$DEBUG" = yes ]; then + SYSLOGD_OPTIONS="$SYSLOGD_OPTIONS -b 99 -s 1024" + fi + + rm /var/run/syslogd.pid &>/dev/null syslogd $SYSLOGD_OPTIONS From c34729d77f8fd26ff68b257a216f0dd78d805daf Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 27 Jul 2013 02:04:32 +0200 Subject: [PATCH 009/103] projects/Generic_OSS: use fullsize splash with KMS support Signed-off-by: Stephan Raue --- projects/Generic_OSS/initramfs/initramfs.conf | 2 ++ projects/Generic_OSS/splash/splash.png | Bin 0 -> 123563 bytes 2 files changed, 2 insertions(+) create mode 100644 projects/Generic_OSS/initramfs/initramfs.conf create mode 100644 projects/Generic_OSS/splash/splash.png diff --git a/projects/Generic_OSS/initramfs/initramfs.conf b/projects/Generic_OSS/initramfs/initramfs.conf new file mode 100644 index 0000000000..caeb01670e --- /dev/null +++ b/projects/Generic_OSS/initramfs/initramfs.conf @@ -0,0 +1,2 @@ +# Dont switch framebuffer, we have KMS support here + SWITCH_FRAMEBUFFER=no \ No newline at end of file diff --git a/projects/Generic_OSS/splash/splash.png b/projects/Generic_OSS/splash/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..316c0d70878410c66773345126696b9aeb8cb0bb GIT binary patch literal 123563 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%0Au*^FH?Ak-r=JlP^ox>8(m*0tNMS%Ot3}|WE30I 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

ybAd|=#fUl^WS zP!}cnezaq$wb`j70thhUxcuo|0G3H^sO4#p+gxjv?yR9la77C8UJ>F|tc4R!>STQZ z?H_FNY3~pCn~W@@U>t64OXPL-Sbn0Q99n}JYkT|EomB}pH@9DfQvtUzAh|TZ>2qvI zX8ltbN2QMlWNbzzgmy!MLM|Eb4l$P=%fd}!jm}?wbp)d=RCBs>YmNSw4qN;$T0Hqb z0%q4aWToP5Mw+0%ZeBSh(h8Y6;=l0EEWZ;7%UJ^o&KnR3OiAYpADV6>a)~t*@?{o)y2r zmxY!o>K*UI6hd@N&sJ1qJV(&i*Vo)_Hb(z7GKJk`bIAPV{{Fvb0x+VFba{vFt$80o zPmPsTvE{%|E|MIs;>-@IzCH-CFduG$Y{3IZ-KaY@ZF`>~tO1BZ4tnMyu-od4yP!MU zY~Rfxjm35w-t95|T6@?Fi_r{dF{i1OjYC06^;49P_y?RU z^-8==Oh-eJfr*K2qqCzuQ_%Cpf-{y?tX&C4@{(u5SCIS+RZ1<*4!>VVMl%7dW)K#M zd*ho-*efhNj+bR+8Kng*YMJ!lug3LzSixqr1oX!WJyeOsEb^zk`z3*TKjj$KW@Dn$ zHN8<6GgWVe�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 G_ Date: Sat, 27 Jul 2013 01:29:56 -0400 Subject: [PATCH 010/103] -- Add support for SMK-Link PS3 remote. It is a universal remote with PS3 remote also using a different ID so I added the ID to hid. --- .../linux-058.06-hid_sony-add_SMK_link.patch | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 packages/linux/patches/3.10.2/linux-058.06-hid_sony-add_SMK_link.patch diff --git a/packages/linux/patches/3.10.2/linux-058.06-hid_sony-add_SMK_link.patch b/packages/linux/patches/3.10.2/linux-058.06-hid_sony-add_SMK_link.patch new file mode 100644 index 0000000000..4324cd10bf --- /dev/null +++ b/packages/linux/patches/3.10.2/linux-058.06-hid_sony-add_SMK_link.patch @@ -0,0 +1,37 @@ +diff -ur a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +--- a/drivers/hid/hid-ids.h 2013-07-24 18:30:33.000000000 -0400 ++++ b/drivers/hid/hid-ids.h 2013-07-24 20:06:17.033735838 -0400 +@@ -734,6 +734,7 @@ + #define USB_VENDOR_ID_SKYCABLE 0x1223 + #define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07 + ++#define USB_VENDOR_ID_SMK 0x0609 + #define USB_VENDOR_ID_SONY 0x054c + #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b + #define USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE 0x0374 +diff -ur a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c +--- a/drivers/hid/hid-sony.c 2013-07-24 18:30:33.000000000 -0400 ++++ b/drivers/hid/hid-sony.c 2013-07-24 20:08:42.493731771 -0400 +@@ -728,8 +728,12 @@ + /* Logitech Harmony Adapter for PS3 */ + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3), + .driver_data = PS3REMOTE }, ++ /* SMK-Link Universal Remote Control VP3700 */ ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SONY_PS3_BDREMOTE), ++ .driver_data = PS3REMOTE }, + { } + }; ++ + MODULE_DEVICE_TABLE(hid, sony_devices); + + static struct hid_driver sony_driver = { +--- a/drivers/hid/hid-core.c 2013-07-25 20:21:53.000000000 -0400 ++++ b/drivers/hid/hid-core.c 2013-07-25 22:08:04.043117324 -0400 +@@ -1686,6 +1686,7 @@ + { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SONY_PS3_BDREMOTE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) }, From 7469776cd75253023f42147e2d8d5134e287afa3 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 27 Jul 2013 20:21:03 +0200 Subject: [PATCH 011/103] xbmc: convert to new package format Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc/build | 336 ----------------- packages/mediacenter/xbmc/install | 119 ------ packages/mediacenter/xbmc/meta | 205 ----------- packages/mediacenter/xbmc/package.mk | 532 +++++++++++++++++++++++++++ 4 files changed, 532 insertions(+), 660 deletions(-) delete mode 100755 packages/mediacenter/xbmc/build delete mode 100755 packages/mediacenter/xbmc/install delete mode 100644 packages/mediacenter/xbmc/meta create mode 100644 packages/mediacenter/xbmc/package.mk diff --git a/packages/mediacenter/xbmc/build b/packages/mediacenter/xbmc/build deleted file mode 100755 index 8a284b739f..0000000000 --- a/packages/mediacenter/xbmc/build +++ /dev/null @@ -1,336 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -if [ "$DISPLAYSERVER" = "xorg-server" ]; then - XBMC_XORG="--enable-x11 --enable-xrandr" -else - XBMC_XORG="--disable-x11 --disable-xrandr" -fi - -if [ "$OPENGL" = "Mesa" ]; then - XBMC_OPENGL="--enable-gl" -else - XBMC_OPENGL="--disable-gl" -fi - -if [ "$OPENGLES_SUPPORT" = yes ]; then - XBMC_OPENGLES="--enable-gles" -else - XBMC_OPENGLES="--disable-gles" -fi - -if [ "$SDL_SUPPORT" = yes ]; then - XBMC_SDL="--enable-sdl" -else - XBMC_SDL="--disable-sdl" -fi - -if [ "$XBMC_SCR_RSXS" = yes ]; then - XBMC_RSXS="--enable-rsxs" - # fix build of RSXS Screensaver support if not using libiconv - export jm_cv_func_gettimeofday_clobber=no -else - XBMC_RSXS="--disable-rsxs" -fi - -if [ "$XBMC_VIS_PROJECTM" = yes ]; then - XBMC_PROJECTM="--enable-projectm" -else - XBMC_PROJECTM="--disable-projectm" -fi - -if [ "$XBMC_VIS_GOOM" = yes ]; then - XBMC_GOOM="--enable-goom" -else - XBMC_GOOM="--disable-goom" -fi - -if [ "$ALSA_SUPPORT" = yes ]; then - XBMC_ALSA="--enable-alsa" -else - XBMC_ALSA="--disable-alsa" -fi - -if [ "$PULSEAUDIO_SUPPORT" = yes ]; then - XBMC_PULSEAUDIO="--enable-pulse" -else - XBMC_PULSEAUDIO="--disable-pulse" -fi - -if [ "$CEC_SUPPORT" = yes ]; then - XBMC_CEC="--enable-libcec" -else - XBMC_CEC="--disable-libcec" -fi - -if [ "$JOYSTICK_SUPPORT" = yes ]; then - XBMC_JOYSTICK="--enable-joystick" -else - XBMC_JOYSTICK="--disable-joystick" -fi - -if [ "$NONFREE_SUPPORT" = yes ]; then - XBMC_NONFREE="--enable-non-free" -else - XBMC_NONFREE="--disable-non-free" -fi - -if [ "$AIRPLAY_SUPPORT" = yes ]; then - XBMC_AIRPLAY="--enable-airplay" -else - XBMC_AIRPLAY="--disable-airplay" -fi - -if [ "$AIRTUNES_SUPPORT" = yes ]; then - XBMC_AIRTUNES="--enable-airtunes" -else - XBMC_AIRTUNES="--disable-airtunes" -fi - -if [ "$DVDCSS_SUPPORT" = yes ]; then - XBMC_DVDCSS="--enable-dvdcss" -else - XBMC_DVDCSS="--disable-dvdcss" -fi - -if [ "$ENCODER_LAME" = yes ]; then - XBMC_LAMEENC="--enable-libmp3lame" -else - XBMC_LAMEENC="--disable-libmp3lame" -fi - -if [ "$ENCODER_VORBIS" = yes ]; then - XBMC_VORBISENC="--enable-libvorbisenc" -else - XBMC_VORBISENC="--disable-libvorbisenc" -fi - -if [ "$BLURAY_SUPPORT" = yes ]; then - XBMC_BLURAY="--enable-libbluray" -else - XBMC_BLURAY="--disable-libbluray" -fi - -if [ "$AVAHI_DAEMON" = yes ]; then - XBMC_AVAHI="--enable-avahi" -else - XBMC_AVAHI="--disable-avahi" -fi - -if [ "$UPNP_SUPPORT" = yes ]; then - XBMC_UPNP="--enable-upnp" -else - XBMC_UPNP="--disable-upnp" -fi - -if [ "$MYSQL_SUPPORT" = yes ]; then - XBMC_MYSQL="--enable-mysql" -else - XBMC_MYSQL="--disable-mysql" - -fi -if [ "$SSHLIB_SUPPORT" = yes ]; then - XBMC_SSH="--enable-ssh" -else - XBMC_SSH="--disable-ssh" -fi - -if [ "$OPTICAL_DRIVE_SUPPORT" = yes ]; then - XBMC_OPTICAL="--enable-optical-drive" -else - XBMC_OPTICAL="--disable-optical-drive" -fi - -if [ "$NFS_SUPPORT" = yes ]; then - XBMC_NFS="--enable-nfs" -else - XBMC_NFS="--disable-nfs" -fi - -if [ "$AFP_SUPPORT" = yes ]; then - XBMC_AFP="--enable-afpclient" -else - XBMC_AFP="--disable-afpclient" -fi - -if [ "$SAMBA_SUPPORT" = yes ]; then - XBMC_SAMBA="--enable-samba" - export LIBS="$LIBS -ltalloc -ltdb -lwbclient" -else - XBMC_SAMBA="--disable-samba" -fi - -if [ "$WEBSERVER" = yes ]; then - XBMC_WEBSERVER="--enable-webserver" -else - XBMC_WEBSERVER="--disable-webserver" -fi - -if [ "$XBMCPLAYER_DRIVER" = bcm2835-driver ]; then - XBMC_OPENMAX="--enable-openmax" - XBMC_PLAYER="--enable-player=omxplayer" - XBMC_CODEC="--with-platform=raspberry-pi" - BCM2835_INCLUDES="-I$SYSROOT_PREFIX/usr/include/interface/vcos/pthreads/ \ - -I$SYSROOT_PREFIX/usr/include/interface/vmcs_host/linux" - CFLAGS="$CFLAGS $BCM2835_INCLUDES" - CXXFLAGS="$CXXFLAGS $BCM2835_INCLUDES" -elif [ "$XBMCPLAYER_DRIVER" = "marvell-libgfx" ]; then - XBMC_OPENMAX="--disable-openmax" - XBMC_PLAYER="--with-platform=marvell-dove" - XBMC_CODEC="" -elif [ "$XBMCPLAYER_DRIVER" = "libamlplayer-m1" -o "$XBMCPLAYER_DRIVER" = "libamlplayer-m3" ]; then - XBMC_OPENMAX="--disable-openmax" - XBMC_PLAYER="--enable-player=amlplayer" - XBMC_CODEC="--enable-codec=amcodec" - AMLPLAYER_INCLUDES="-I$SYSROOT_PREFIX/usr/include/amlplayer" - CFLAGS="$CFLAGS $AMLPLAYER_INCLUDES" - CXXFLAGS="$CXXFLAGS $AMLPLAYER_INCLUDES" -else - XBMC_OPENMAX="--disable-openmax" -fi - -if [ "$VDPAU" = yes ]; then - XBMC_VDPAU="--enable-vdpau" -else - XBMC_VDPAU="--disable-vdpau" -fi - -if [ "$VAAPI" = yes ]; then - XBMC_VAAPI="--enable-vaapi" -else - XBMC_VAAPI="--disable-vaapi" -fi - -if [ "$XVBA" = yes ]; then - XBMC_XVBA="--enable-xvba" -else - XBMC_XVBA="--disable-xvba" -fi - -if [ "$CRYSTALHD" = yes ]; then - XBMC_CRYSTALHD="--enable-crystalhd" -else - XBMC_CRYSTALHD="--disable-crystalhd" -fi - -# xbmc fails to build with LTO optimization if build without GOLD support - [ ! "$GOLD_SUPPORT" = "yes" ] && strip_lto - -# Todo: XBMC segfaults on exit when building with LTO support - strip_lto - -# dont build parallel -# MAKEFLAGS=-j1 - - export PYTHON_VERSION="2.7" - export PYTHON_CPPFLAGS="-I$SYSROOT_PREFIX/usr/include/python$PYTHON_VERSION" - export PYTHON_LDFLAGS="-L$SYSROOT_PREFIX/usr/lib/python$PYTHON_VERSION -lpython$PYTHON_VERSION" - export PYTHON_SITE_PKG="$SYSROOT_PREFIX/usr/lib/python$PYTHON_VERSION/site-packages" - export ac_python_version="$PYTHON_VERSION" - -# setup skin dir from default skin - SKIN_DIR="skin.`tolower $SKIN_DEFAULT`" - -cd $PKG_BUILD - -# adding fake Makefile for stripped skin - mkdir -p addons/skin.confluence/media - touch addons/skin.confluence/media/Makefile.in - -# autoreconf - BOOTSTRAP_STANDALONE=1 make -f bootstrap.mk - -export gl_cv_func_gettimeofday_clobber=no -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --with-arch=$TARGET_ARCH \ - --with-cpu=$TARGET_CPU \ - --prefix=/usr \ - --exec-prefix=/usr \ - --sysconfdir=/etc \ - --datadir=/usr/share \ - --disable-debug \ - --disable-optimizations \ - $XBMC_OPENGL \ - $XBMC_OPENGLES \ - $XBMC_SDL \ - $XBMC_OPENMAX \ - $XBMC_VDPAU \ - $XBMC_VAAPI \ - $XBMC_CRYSTALHD \ - $XBMC_XVBA \ - --disable-vdadecoder \ - --disable-vtbdecoder \ - --disable-tegra \ - --disable-profiling \ - $XBMC_JOYSTICK \ - $XBMC_CEC \ - --enable-udev \ - --disable-libusb \ - $XBMC_GOOM \ - $XBMC_RSXS \ - $XBMC_PROJECTM \ - $XBMC_XORG \ - --disable-ccache \ - $XBMC_ALSA \ - $XBMC_PULSEAUDIO \ - --enable-rtmp \ - $XBMC_SAMBA \ - $XBMC_NFS \ - $XBMC_AFP \ - $XBMC_VORBISENC \ - --enable-ffmpeg-libvorbis \ - $XBMC_LAMEENC \ - $XBMC_DVDCSS \ - --disable-mid \ - --disable-hal \ - $XBMC_AVAHI \ - $XBMC_UPNP \ - $XBMC_MYSQL \ - $XBMC_SSH \ - $XBMC_AIRPLAY \ - $XBMC_AIRTUNES \ - $XBMC_NONFREE \ - --disable-asap-codec \ - $XBMC_WEBSERVER \ - $XBMC_OPTICAL \ - $XBMC_BLURAY \ - --enable-texturepacker --with-texturepacker-root="$ROOT/$TOOLCHAIN" \ - --disable-external-libraries \ - --enable-external-ffmpeg \ - $XBMC_CODEC \ - $XBMC_PLAYER \ - -# setup default skin inside the sources - sed -i -e "s|skin.confluence|$SKIN_DIR|g" xbmc/settings/Settings.h - -make externals -make xbmc.bin - -if [ "$DISPLAYSERVER" = "xorg-server" ]; then - make xbmc-xrandr -fi - -make -C tools/TexturePacker -cp -PR tools/TexturePacker/TexturePacker $ROOT/$TOOLCHAIN/bin diff --git a/packages/mediacenter/xbmc/install b/packages/mediacenter/xbmc/install deleted file mode 100755 index 399c6acdf2..0000000000 --- a/packages/mediacenter/xbmc/install +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -PYTHON_LIBDIR="`ls -d $INSTALL/usr/lib/python*`" - -mkdir -p $INSTALL/usr/bin - cp $PKG_DIR/scripts/cputemp $INSTALL/usr/bin - cp $PKG_DIR/scripts/gputemp $INSTALL/usr/bin - cp $PKG_BUILD/tools/EventClients/Clients/XBMC\ Send/xbmc-send.py $INSTALL/usr/bin/xbmc-send - cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin - -mkdir -p $INSTALL/usr/lib/xbmc - cp $PKG_BUILD/xbmc.bin $INSTALL/usr/lib/xbmc - if [ "$DISPLAYSERVER" = "xorg-server" ]; then - cp $PKG_BUILD/xbmc-xrandr $INSTALL/usr/lib/xbmc - fi - -cd $PKG_BUILD - find system addons \ - -regextype posix-extended -type f \ - -not -iregex ".*svn.*|.*win32(dx)?\.vis|.*osx\.vis" \ - -iregex ".*-linux.*|.*-arm.*|.*\.vis|.*\.xbs" \ - -exec install -D "{}" $ROOT/$INSTALL/usr/lib/xbmc/"{}" ";" - - find addons language media sounds userdata system \ - -regextype posix-extended -type f \ - -not -iregex ".*-linux.*|.*-arm.*|.*\.vis|.*\.xbs|.*svn.*|.*\.orig|.*\.so|.*\.dll|.*\.pyd|.*python|.*\.zlib|.*\.conf" \ - -exec install -D -m 0644 "{}" $ROOT/$INSTALL/usr/share/xbmc/"{}" ";" -cd - - -if [ ! "$XBMC_SCR_RSXS" = yes ]; then - rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/screensaver.rsxs.* -fi - -if [ ! "$XBMC_VIS_PROJECTM" = yes ]; then - rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.projectm -fi - -rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.dxspectrum -rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.itunes -rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.milkdrop - -# overriding Splash image -mkdir -p $INSTALL/usr/share/xbmc/media -# rm -rf $INSTALL/usr/share/xbmc/media/Splash.png -# if [ -f $PROJECT_DIR/$PROJECT/splash/splash.png ]; then -# cp $PROJECT_DIR/$PROJECT/splash/splash.png $INSTALL/usr/share/xbmc/media/Splash.png -# else -# cp $PKG_DIR/splash/splash.png $INSTALL/usr/share/xbmc/media/Splash.png -# fi - -# cleanup and python addon fixes - rm -rf $INSTALL/usr/share/xbmc/addons/script.module.pysqlite - rm -rf $INSTALL/usr/share/xbmc/addons/script.module.simplejson - -mkdir -p $INSTALL/usr/share/xbmc/addons - cp -R $PKG_DIR/config/os.openelec.tv $INSTALL/usr/share/xbmc/addons - $SED "s|@OS_VERSION@|$OS_VERSION|g" -i $INSTALL/usr/share/xbmc/addons/os.openelec.tv/addon.xml - cp -R $PKG_DIR/config/repository.openelec.tv $INSTALL/usr/share/xbmc/addons - $SED "s|@ADDON_URL@|$ADDON_URL|g" -i $INSTALL/usr/share/xbmc/addons/repository.openelec.tv/addon.xml - -mkdir -p $PYTHON_LIBDIR/site-packages/xbmc - cp -R $PKG_BUILD/tools/EventClients/lib/python/* $PYTHON_LIBDIR/site-packages/xbmc - -# install powermanagement hooks - mkdir -p $INSTALL/etc/pm/sleep.d - cp $PKG_DIR/sleep.d/* $INSTALL/etc/pm/sleep.d - -# install project specific configs - mkdir -p $INSTALL/usr/share/xbmc/config - if [ -f $PROJECT_DIR/$PROJECT/xbmc/guisettings.xml ]; then - cp -R $PROJECT_DIR/$PROJECT/xbmc/guisettings.xml $INSTALL/usr/share/xbmc/config - fi - - if [ -f $PROJECT_DIR/$PROJECT/xbmc/sources.xml ]; then - cp -R $PROJECT_DIR/$PROJECT/xbmc/sources.xml $INSTALL/usr/share/xbmc/config - fi - - mkdir -p $INSTALL/usr/share/xbmc/system/ - if [ -f $PROJECT_DIR/$PROJECT/xbmc/advancedsettings.xml ]; then - cp $PROJECT_DIR/$PROJECT/xbmc/advancedsettings.xml $INSTALL/usr/share/xbmc/system/ - else - cp $PKG_DIR/config/advancedsettings.xml $INSTALL/usr/share/xbmc/system/ - fi - -if [ "$XBMC" = master ]; then - mkdir -p $INSTALL/usr/share/xbmc/system/settings - if [ -f $PROJECT_DIR/$PROJECT/xbmc/appliance.xml ]; then - cp $PROJECT_DIR/$PROJECT/xbmc/appliance.xml $INSTALL/usr/share/xbmc/system/settings - else - cp $PKG_DIR/config/appliance.xml $INSTALL/usr/share/xbmc/system/settings - fi -fi - -if [ "$XBMC_EXTRA_FONTS" = yes ]; then - mkdir -p $INSTALL/usr/share/xbmc/media/Fonts - cp $PKG_DIR/fonts/*.ttf $INSTALL/usr/share/xbmc/media/Fonts -fi diff --git a/packages/mediacenter/xbmc/meta b/packages/mediacenter/xbmc/meta deleted file mode 100644 index a0369ad6b7..0000000000 --- a/packages/mediacenter/xbmc/meta +++ /dev/null @@ -1,205 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="xbmc" -PKG_VERSION="12.2-8e4f924" -if [ "$XBMC" = "master" ]; then - PKG_VERSION="c218d5c" -elif [ "$XBMC" = "xbmc-aml" ]; then - PKG_VERSION="aml-frodo-d9119f2" -fi -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://www.xbmc.org" -PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_DEPENDS="Python zlib bzip2 systemd ffmpeg libass curl rtmpdump fontconfig freetype libmad libogg libmodplug faad2 flac libmpeg2 taglib service.openelec.settings" -PKG_BUILD_DEPENDS="toolchain boost Python zlib bzip2 systemd lzo pcre swig ffmpeg libass enca curl libssh rtmpdump fontconfig fribidi tinyxml libjpeg-turbo libpng tiff freetype jasper libmad libsamplerate libogg libcdio libmodplug faad2 flac libmpeg2 taglib yajl sqlite" -PKG_PRIORITY="optional" -PKG_SECTION="mediacenter" -PKG_SHORTDESC="xbmc: XBMC Mediacenter" -PKG_LONGDESC="XBMC Media Center (which was formerly named Xbox Media Center) is a free and open source cross-platform media player and home entertainment system software with a 10-foot user interface designed for the living-room TV. Its graphical user interface allows the user to easily manage video, photos, podcasts, and music from a computer, optical disk, local network, and the internet using a remote control." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="no" - -# needed for hosttools (Texturepacker) - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS lzo:host SDL-host SDL_image-host" - -# some python stuff needed for various addons - PKG_DEPENDS="$PKG_DEPENDS Imaging" - PKG_DEPENDS="$PKG_DEPENDS simplejson" - PKG_DEPENDS="$PKG_DEPENDS pycrypto" - -# various PVR clients - PKG_DEPENDS="$PKG_DEPENDS xbmc-pvr-addons" - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr" - -if [ "$DISPLAYSERVER" = "xorg-server" ]; then - # for libX11 support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libX11 libXext" - PKG_DEPENDS="$PKG_DEPENDS libX11 libXext" - - # for libXrandr support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libXrandr" - PKG_DEPENDS="$PKG_DEPENDS libXrandr" - - # for SDL support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS SDL SDL_image" - PKG_DEPENDS="$PKG_DEPENDS SDL SDL_image" -fi - -if [ "$OPENGL" = "Mesa" ]; then - # for OpenGL (GLX) support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS Mesa glu glew" - PKG_DEPENDS="$PKG_DEPENDS Mesa glu" -fi - -if [ "$OPENGLES_SUPPORT" = yes ]; then - # for OpenGL-ES support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS $OPENGLES" - PKG_DEPENDS="$PKG_DEPENDS $OPENGLES" -fi - -# for dbus support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS dbus" - PKG_DEPENDS="$PKG_DEPENDS dbus" - -if [ "$ALSA_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS alsa-lib" - PKG_DEPENDS="$PKG_DEPENDS alsa-lib" -fi - -if [ "$PULSEAUDIO_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS pulseaudio" - PKG_DEPENDS="$PKG_DEPENDS pulseaudio" -fi - -if [ "$CEC_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libcec" - PKG_DEPENDS="$PKG_DEPENDS libcec" -fi - -#if [ ! "$LCD_DRIVER" = "none" ]; then -# PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-lcd" -#fi - -if [ "$XBMC_SCR_RSXS" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libXt libXmu" -fi - -if [ "$FAAC_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS faac" - PKG_DEPENDS="$PKG_DEPENDS faac" -fi - -if [ "$ENCODER_LAME" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS lame" - PKG_DEPENDS="$PKG_DEPENDS lame" -fi - -if [ "$ENCODER_VORBIS" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libvorbis" - PKG_DEPENDS="$PKG_DEPENDS libvorbis" -fi - -if [ "$BLURAY_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libbluray" - PKG_DEPENDS="$PKG_DEPENDS libbluray" -fi - -if [ "$AVAHI_DAEMON" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS avahi" - PKG_DEPENDS="$PKG_DEPENDS avahi" -fi - -if [ "$MYSQL_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS mysql" - PKG_DEPENDS="$PKG_DEPENDS mysql" -fi - -if [ "$AIRPLAY_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libplist" - PKG_DEPENDS="$PKG_DEPENDS libplist" -fi - -if [ "$AIRTUNES_SUPPORT" = yes ]; then - if [ "$XBMC" = master ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libshairplay" - PKG_DEPENDS="$PKG_DEPENDS libshairplay" - else - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libshairport" - PKG_DEPENDS="$PKG_DEPENDS libshairport" - fi -fi - -if [ "$NFS_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libnfs" - PKG_DEPENDS="$PKG_DEPENDS libnfs" -fi - -if [ "$AFP_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS afpfs-ng" - PKG_DEPENDS="$PKG_DEPENDS afpfs-ng" -fi - -if [ "$SAMBA_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS samba" - PKG_DEPENDS="$PKG_DEPENDS samba" -fi - -if [ "$WEBSERVER" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libmicrohttpd" -fi - -if [ ! "$XBMCPLAYER_DRIVER" = default ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS $XBMCPLAYER_DRIVER" - PKG_DEPENDS="$PKG_DEPENDS $XBMCPLAYER_DRIVER" - - if [ "$XBMCPLAYER_DRIVER" = marvell-libvmeta ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS marvell-ipp" - PKG_DEPENDS="$PKG_DEPENDS marvell-ipp" - fi -fi - -if [ "$VDPAU" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libvdpau" - PKG_DEPENDS="$PKG_DEPENDS libvdpau" -fi - -if [ "$VAAPI" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libva" - PKG_DEPENDS="$PKG_DEPENDS libva" -fi - -if [ "$CRYSTALHD" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS crystalhd" - PKG_DEPENDS="$PKG_DEPENDS crystalhd" -fi - -get_graphicdrivers - -for drv in $GRAPHIC_DRIVERS; do - if [ "$drv" = "fglrx" -a "$XVBA" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS xf86-video-fglrx" - elif [ "$drv" = "fglrx-legacy" -a "$XVBA" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS xf86-video-fglrx-legacy" - fi -done diff --git a/packages/mediacenter/xbmc/package.mk b/packages/mediacenter/xbmc/package.mk new file mode 100644 index 0000000000..631ebb33b4 --- /dev/null +++ b/packages/mediacenter/xbmc/package.mk @@ -0,0 +1,532 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="xbmc" +PKG_VERSION="12.2-8e4f924" +if [ "$XBMC" = "master" ]; then + PKG_VERSION="c218d5c" +elif [ "$XBMC" = "xbmc-aml" ]; then + PKG_VERSION="aml-frodo-d9119f2" +fi +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://www.xbmc.org" +PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" +PKG_DEPENDS="Python zlib bzip2 systemd ffmpeg libass curl rtmpdump fontconfig freetype libmad libogg libmodplug faad2 flac libmpeg2 taglib service.openelec.settings" +PKG_BUILD_DEPENDS_TARGET="toolchain boost Python zlib bzip2 systemd lzo pcre swig ffmpeg libass enca curl libssh rtmpdump fontconfig fribidi tinyxml libjpeg-turbo libpng tiff freetype jasper libmad libsamplerate libogg libcdio libmodplug faad2 flac libmpeg2 taglib yajl sqlite" +PKG_PRIORITY="optional" +PKG_SECTION="mediacenter" +PKG_SHORTDESC="xbmc: XBMC Mediacenter" +PKG_LONGDESC="XBMC Media Center (which was formerly named Xbox Media Center) is a free and open source cross-platform media player and home entertainment system software with a 10-foot user interface designed for the living-room TV. Its graphical user interface allows the user to easily manage video, photos, podcasts, and music from a computer, optical disk, local network, and the internet using a remote control." + +PKG_IS_ADDON="no" +PKG_AUTORECONF="no" + +# for dbus support + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET dbus" + PKG_DEPENDS="$PKG_DEPENDS dbus" + +# needed for hosttools (Texturepacker) + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET lzo:host SDL-host SDL_image-host" + +# some python stuff needed for various addons + PKG_DEPENDS="$PKG_DEPENDS Imaging" + PKG_DEPENDS="$PKG_DEPENDS simplejson" + PKG_DEPENDS="$PKG_DEPENDS pycrypto" + +# various PVR clients + PKG_DEPENDS="$PKG_DEPENDS xbmc-pvr-addons" + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr" + +if [ "$DISPLAYSERVER" = "xorg-server" ]; then +# for libX11 support + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libX11 libXext" + PKG_DEPENDS="$PKG_DEPENDS libX11 libXext" +# for libXrandr support + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libXrandr" + PKG_DEPENDS="$PKG_DEPENDS libXrandr" + XBMC_XORG="--enable-x11 --enable-xrandr" +else + XBMC_XORG="--disable-x11 --disable-xrandr" +fi + +if [ "$OPENGL" = "Mesa" ]; then +# for OpenGL (GLX) support + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET Mesa glu glew" + PKG_DEPENDS="$PKG_DEPENDS Mesa glu" + XBMC_OPENGL="--enable-gl" +else + XBMC_OPENGL="--disable-gl" +fi + +if [ "$OPENGLES_SUPPORT" = yes ]; then +# for OpenGL-ES support + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET $OPENGLES" + PKG_DEPENDS="$PKG_DEPENDS $OPENGLES" + XBMC_OPENGLES="--enable-gles" +else + XBMC_OPENGLES="--disable-gles" +fi + +if [ "$SDL_SUPPORT" = yes ]; then +# for SDL support + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET SDL SDL_image" + PKG_DEPENDS="$PKG_DEPENDS SDL SDL_image" + XBMC_SDL="--enable-sdl" +else + XBMC_SDL="--disable-sdl" +fi + +if [ "$ALSA_SUPPORT" = yes ]; then +# for ALSA support + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET alsa-lib" + PKG_DEPENDS="$PKG_DEPENDS alsa-lib" + XBMC_ALSA="--enable-alsa" +else + XBMC_ALSA="--disable-alsa" +fi + +if [ "$PULSEAUDIO_SUPPORT" = yes ]; then +# for PulseAudio support + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET pulseaudio" + PKG_DEPENDS="$PKG_DEPENDS pulseaudio" + XBMC_PULSEAUDIO="--enable-pulse" +else + XBMC_PULSEAUDIO="--disable-pulse" +fi + +if [ "$CEC_SUPPORT" = yes ]; then +# for CEC support + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libcec" + PKG_DEPENDS="$PKG_DEPENDS libcec" + XBMC_CEC="--enable-libcec" +else + XBMC_CEC="--disable-libcec" +fi + +if [ "$XBMC_SCR_RSXS" = yes ]; then +# for RSXS Screensaver support + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libXt libXmu" + XBMC_RSXS="--enable-rsxs" +# fix build of RSXS Screensaver support if not using libiconv + export jm_cv_func_gettimeofday_clobber=no +else + XBMC_RSXS="--disable-rsxs" +fi + +if [ "$XBMC_VIS_PROJECTM" = yes ]; then +# for ProjectM Visualisation support + XBMC_PROJECTM="--enable-projectm" +else + XBMC_PROJECTM="--disable-projectm" +fi + +if [ "$XBMC_VIS_GOOM" = yes ]; then +# for GOOM Visualisation support + XBMC_GOOM="--enable-goom" +else + XBMC_GOOM="--disable-goom" +fi + +if [ "$JOYSTICK_SUPPORT" = yes ]; then +# for Joystick support + XBMC_JOYSTICK="--enable-joystick" +else + XBMC_JOYSTICK="--disable-joystick" +fi + +if [ "$OPTICAL_DRIVE_SUPPORT" = yes ]; then + XBMC_OPTICAL="--enable-optical-drive" +else + XBMC_OPTICAL="--disable-optical-drive" +fi + +if [ "$NONFREE_SUPPORT" = yes ]; then +# for non-free support + XBMC_NONFREE="--enable-non-free" +else + XBMC_NONFREE="--disable-non-free" +fi + +if [ "$DVDCSS_SUPPORT" = yes ]; then + XBMC_DVDCSS="--enable-dvdcss" +else + XBMC_DVDCSS="--disable-dvdcss" +fi + +if [ "$FAAC_SUPPORT" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET faac" + PKG_DEPENDS="$PKG_DEPENDS faac" +fi + +if [ "$ENCODER_LAME" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET lame" + PKG_DEPENDS="$PKG_DEPENDS lame" + XBMC_LAMEENC="--enable-libmp3lame" +else + XBMC_LAMEENC="--disable-libmp3lame" +fi + +if [ "$ENCODER_VORBIS" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libvorbis" + PKG_DEPENDS="$PKG_DEPENDS libvorbis" + XBMC_VORBISENC="--enable-libvorbisenc" +else + XBMC_VORBISENC="--disable-libvorbisenc" +fi + +if [ "$BLURAY_SUPPORT" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libbluray" + PKG_DEPENDS="$PKG_DEPENDS libbluray" + XBMC_BLURAY="--enable-libbluray" +else + XBMC_BLURAY="--disable-libbluray" +fi + +if [ "$AVAHI_DAEMON" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET avahi" + PKG_DEPENDS="$PKG_DEPENDS avahi" + XBMC_AVAHI="--enable-avahi" +else + XBMC_AVAHI="--disable-avahi" +fi + +if [ "$MYSQL_SUPPORT" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET mysql" + PKG_DEPENDS="$PKG_DEPENDS mysql" + XBMC_MYSQL="--enable-mysql" +else + XBMC_MYSQL="--disable-mysql" +fi + +if [ "$AIRPLAY_SUPPORT" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libplist" + PKG_DEPENDS="$PKG_DEPENDS libplist" + XBMC_AIRPLAY="--enable-airplay" +else + XBMC_AIRPLAY="--disable-airplay" +fi + +if [ "$AIRTUNES_SUPPORT" = yes ]; then + if [ "$XBMC" = master ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libshairplay" + PKG_DEPENDS="$PKG_DEPENDS libshairplay" + else + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libshairport" + PKG_DEPENDS="$PKG_DEPENDS libshairport" + fi + XBMC_AIRTUNES="--enable-airtunes" +else + XBMC_AIRTUNES="--disable-airtunes" +fi + +if [ "$NFS_SUPPORT" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libnfs" + PKG_DEPENDS="$PKG_DEPENDS libnfs" + XBMC_NFS="--enable-nfs" +else + XBMC_NFS="--disable-nfs" +fi + +if [ "$AFP_SUPPORT" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET afpfs-ng" + PKG_DEPENDS="$PKG_DEPENDS afpfs-ng" + XBMC_AFP="--enable-afpclient" +else + XBMC_AFP="--disable-afpclient" +fi + +if [ "$SAMBA_SUPPORT" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET samba" + PKG_DEPENDS="$PKG_DEPENDS samba" + XBMC_SAMBA="--enable-samba" + export LIBS="$LIBS -ltalloc -ltdb -lwbclient" +else + XBMC_SAMBA="--disable-samba" +fi + +if [ "$WEBSERVER" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libmicrohttpd" + XBMC_WEBSERVER="--enable-webserver" +else + XBMC_WEBSERVER="--disable-webserver" +fi + +if [ "$UPNP_SUPPORT" = yes ]; then + XBMC_UPNP="--enable-upnp" +else + XBMC_UPNP="--disable-upnp" +fi + +if [ "$SSHLIB_SUPPORT" = yes ]; then + XBMC_SSH="--enable-ssh" +else + XBMC_SSH="--disable-ssh" +fi + +if [ ! "$XBMCPLAYER_DRIVER" = default ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET $XBMCPLAYER_DRIVER" + PKG_DEPENDS="$PKG_DEPENDS $XBMCPLAYER_DRIVER" + + if [ "$XBMCPLAYER_DRIVER" = bcm2835-driver ]; then + XBMC_OPENMAX="--enable-openmax" + XBMC_PLAYER="--enable-player=omxplayer" + XBMC_CODEC="--with-platform=raspberry-pi" + BCM2835_INCLUDES="-I$SYSROOT_PREFIX/usr/include/interface/vcos/pthreads/ \ + -I$SYSROOT_PREFIX/usr/include/interface/vmcs_host/linux" + CFLAGS="$CFLAGS $BCM2835_INCLUDES" + CXXFLAGS="$CXXFLAGS $BCM2835_INCLUDES" + elif [ "$XBMCPLAYER_DRIVER" = "marvell-libgfx" ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET marvell-ipp" + PKG_DEPENDS="$PKG_DEPENDS marvell-ipp" + XBMC_OPENMAX="--disable-openmax" + XBMC_PLAYER="--with-platform=marvell-dove" + XBMC_CODEC="" + elif [ "$XBMCPLAYER_DRIVER" = "libamlplayer-m1" -o "$XBMCPLAYER_DRIVER" = "libamlplayer-m3" ]; then + XBMC_OPENMAX="--disable-openmax" + XBMC_PLAYER="--enable-player=amlplayer" + XBMC_CODEC="--enable-codec=amcodec" + AMLPLAYER_INCLUDES="-I$SYSROOT_PREFIX/usr/include/amlplayer" + CFLAGS="$CFLAGS $AMLPLAYER_INCLUDES" + CXXFLAGS="$CXXFLAGS $AMLPLAYER_INCLUDES" + else + XBMC_OPENMAX="--disable-openmax" + fi +fi + +if [ "$VDPAU" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libvdpau" + PKG_DEPENDS="$PKG_DEPENDS libvdpau" + XBMC_VDPAU="--enable-vdpau" +else + XBMC_VDPAU="--disable-vdpau" +fi + +if [ "$VAAPI" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libva" + PKG_DEPENDS="$PKG_DEPENDS libva" + XBMC_VAAPI="--enable-vaapi" +else + XBMC_VAAPI="--disable-vaapi" +fi + +if [ "$XVBA" = yes ]; then + get_graphicdrivers + for drv in $GRAPHIC_DRIVERS; do + if [ "$drv" = "fglrx" ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET xf86-video-fglrx" + elif [ "$drv" = "fglrx-legacy" ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET xf86-video-fglrx-legacy" + fi + done + XBMC_XVBA="--enable-xvba" +else + XBMC_XVBA="--disable-xvba" +fi + +if [ "$CRYSTALHD" = yes ]; then + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET crystalhd" + PKG_DEPENDS="$PKG_DEPENDS crystalhd" + XBMC_CRYSTALHD="--enable-crystalhd" +else + XBMC_CRYSTALHD="--disable-crystalhd" +fi + +export PYTHON_VERSION="2.7" +export PYTHON_CPPFLAGS="-I$SYSROOT_PREFIX/usr/include/python$PYTHON_VERSION" +export PYTHON_LDFLAGS="-L$SYSROOT_PREFIX/usr/lib/python$PYTHON_VERSION -lpython$PYTHON_VERSION" +export PYTHON_SITE_PKG="$SYSROOT_PREFIX/usr/lib/python$PYTHON_VERSION/site-packages" +export ac_python_version="$PYTHON_VERSION" + +PKG_CONFIGURE_OPTS_TARGET="gl_cv_func_gettimeofday_clobber=no \ + --with-arch=$TARGET_ARCH \ + --with-cpu=$TARGET_CPU \ + --disable-debug \ + --disable-optimizations \ + $XBMC_OPENGL \ + $XBMC_OPENGLES \ + $XBMC_SDL \ + $XBMC_OPENMAX \ + $XBMC_VDPAU \ + $XBMC_VAAPI \ + $XBMC_CRYSTALHD \ + $XBMC_XVBA \ + --disable-vdadecoder \ + --disable-vtbdecoder \ + --disable-tegra \ + --disable-profiling \ + $XBMC_JOYSTICK \ + $XBMC_CEC \ + --enable-udev \ + --disable-libusb \ + $XBMC_GOOM \ + $XBMC_RSXS \ + $XBMC_PROJECTM \ + $XBMC_XORG \ + --disable-ccache \ + $XBMC_ALSA \ + $XBMC_PULSEAUDIO \ + --enable-rtmp \ + $XBMC_SAMBA \ + $XBMC_NFS \ + $XBMC_AFP \ + $XBMC_VORBISENC \ + --enable-ffmpeg-libvorbis \ + $XBMC_LAMEENC \ + $XBMC_DVDCSS \ + --disable-mid \ + --disable-hal \ + $XBMC_AVAHI \ + $XBMC_UPNP \ + $XBMC_MYSQL \ + $XBMC_SSH \ + $XBMC_AIRPLAY \ + $XBMC_AIRTUNES \ + $XBMC_NONFREE \ + --disable-asap-codec \ + $XBMC_WEBSERVER \ + $XBMC_OPTICAL \ + $XBMC_BLURAY \ + --enable-texturepacker --with-texturepacker-root="$ROOT/$TOOLCHAIN" \ + --disable-external-libraries \ + --enable-external-ffmpeg \ + $XBMC_CODEC \ + $XBMC_PLAYER" + +pre_build_target() { +# adding fake Makefile for stripped skin + mkdir -p $PKG_BUILD/addons/skin.confluence/media + touch $PKG_BUILD/addons/skin.confluence/media/Makefile.in + +# autoreconf + BOOTSTRAP_STANDALONE=1 make -C $PKG_BUILD -f bootstrap.mk +} + +pre_configure_target() { +# xbmc fails to build in subdirs + cd $ROOT/$PKG_BUILD + rm -rf .$TARGET_NAME + +# xbmc fails to build with LTO optimization if build without GOLD support + [ ! "$GOLD_SUPPORT" = "yes" ] && strip_lto + +# Todo: XBMC segfaults on exit when building with LTO support + strip_lto + +# dont build parallel +# MAKEFLAGS=-j1 +} + +make_target() { +# setup skin dir from default skin + SKIN_DIR="skin.`tolower $SKIN_DEFAULT`" + +# setup default skin inside the sources + sed -i -e "s|skin.confluence|$SKIN_DIR|g" $ROOT/$PKG_BUILD/xbmc/settings/Settings.h + + make externals + make xbmc.bin + + if [ "$DISPLAYSERVER" = "xorg-server" ]; then + make xbmc-xrandr + fi + + make -C tools/TexturePacker + cp -PR tools/TexturePacker/TexturePacker $ROOT/$TOOLCHAIN/bin +} + +post_makeinstall_target() { + mkdir -p $INSTALL/usr/bin + cp $PKG_DIR/scripts/cputemp $INSTALL/usr/bin + cp $PKG_DIR/scripts/gputemp $INSTALL/usr/bin + cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin + cp tools/EventClients/Clients/XBMC\ Send/xbmc-send.py $INSTALL/usr/bin/xbmc-send + + rm -rf $INSTALL/usr/bin/xbmc + rm -rf $INSTALL/usr/bin/xbmc-standalone + + if [ ! "$DISPLAYSERVER" = "xorg-server" ]; then + rm -rf $INSTALL/usr/lib/xbmc/xbmc-xrandr + fi + + if [ ! "$XBMC_SCR_RSXS" = yes ]; then + rm -rf $INSTALL/usr/share/xbmc/addons/screensaver.rsxs.* + fi + + if [ ! "$XBMC_VIS_PROJECTM" = yes ]; then + rm -rf $INSTALL/usr/share/xbmc/addons/visualization.projectm + fi + + rm -rf $INSTALL/usr/share/applications + rm -rf $INSTALL/usr/share/icons + rm -rf $INSTALL/usr/share/xbmc/addons/repository.pvr-* + rm -rf $INSTALL/usr/share/xbmc/addons/script.module.pysqlite + rm -rf $INSTALL/usr/share/xbmc/addons/script.module.simplejson + rm -rf $INSTALL/usr/share/xbmc/addons/visualization.dxspectrum + rm -rf $INSTALL/usr/share/xbmc/addons/visualization.itunes + rm -rf $INSTALL/usr/share/xbmc/addons/visualization.milkdrop + rm -rf $INSTALL/usr/share/xsessions + + mkdir -p $INSTALL/usr/share/xbmc/addons + cp -R $PKG_DIR/config/os.openelec.tv $INSTALL/usr/share/xbmc/addons + $SED "s|@OS_VERSION@|$OS_VERSION|g" -i $INSTALL/usr/share/xbmc/addons/os.openelec.tv/addon.xml + cp -R $PKG_DIR/config/repository.openelec.tv $INSTALL/usr/share/xbmc/addons + $SED "s|@ADDON_URL@|$ADDON_URL|g" -i $INSTALL/usr/share/xbmc/addons/repository.openelec.tv/addon.xml + + mkdir -p $INSTALL/usr/lib/python"$PYTHON_VERSION"/site-packages/xbmc + cp -R tools/EventClients/lib/python/* $INSTALL/usr/lib/python"$PYTHON_VERSION"/site-packages/xbmc + +# install powermanagement hooks + mkdir -p $INSTALL/etc/pm/sleep.d + cp $PKG_DIR/sleep.d/* $INSTALL/etc/pm/sleep.d + +# install project specific configs + mkdir -p $INSTALL/usr/share/xbmc/config + if [ -f $PROJECT_DIR/$PROJECT/xbmc/guisettings.xml ]; then + cp -R $PROJECT_DIR/$PROJECT/xbmc/guisettings.xml $INSTALL/usr/share/xbmc/config + fi + + if [ -f $PROJECT_DIR/$PROJECT/xbmc/sources.xml ]; then + cp -R $PROJECT_DIR/$PROJECT/xbmc/sources.xml $INSTALL/usr/share/xbmc/config + fi + + mkdir -p $INSTALL/usr/share/xbmc/system/ + if [ -f $PROJECT_DIR/$PROJECT/xbmc/advancedsettings.xml ]; then + cp $PROJECT_DIR/$PROJECT/xbmc/advancedsettings.xml $INSTALL/usr/share/xbmc/system/ + else + cp $PKG_DIR/config/advancedsettings.xml $INSTALL/usr/share/xbmc/system/ + fi + + if [ "$XBMC" = master ]; then + mkdir -p $INSTALL/usr/share/xbmc/system/settings + if [ -f $PROJECT_DIR/$PROJECT/xbmc/appliance.xml ]; then + cp $PROJECT_DIR/$PROJECT/xbmc/appliance.xml $INSTALL/usr/share/xbmc/system/settings + else + cp $PKG_DIR/config/appliance.xml $INSTALL/usr/share/xbmc/system/settings + fi + fi + + if [ "$XBMC_EXTRA_FONTS" = yes ]; then + mkdir -p $INSTALL/usr/share/xbmc/media/Fonts + cp $PKG_DIR/fonts/*.ttf $INSTALL/usr/share/xbmc/media/Fonts + fi +} + From 8e76b84190c0e587b651deb95812175bbd6e1ea7 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 28 Jul 2013 03:46:48 +0200 Subject: [PATCH 012/103] xbmc: fix build Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc/package.mk | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/mediacenter/xbmc/package.mk b/packages/mediacenter/xbmc/package.mk index 631ebb33b4..85cce84d80 100644 --- a/packages/mediacenter/xbmc/package.mk +++ b/packages/mediacenter/xbmc/package.mk @@ -258,7 +258,7 @@ if [ "$SAMBA_SUPPORT" = yes ]; then PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET samba" PKG_DEPENDS="$PKG_DEPENDS samba" XBMC_SAMBA="--enable-samba" - export LIBS="$LIBS -ltalloc -ltdb -lwbclient" + XBMC_LIBS="$XBMC_LIBS -ltalloc -ltdb -lwbclient" else XBMC_SAMBA="--disable-samba" fi @@ -292,8 +292,8 @@ if [ ! "$XBMCPLAYER_DRIVER" = default ]; then XBMC_CODEC="--with-platform=raspberry-pi" BCM2835_INCLUDES="-I$SYSROOT_PREFIX/usr/include/interface/vcos/pthreads/ \ -I$SYSROOT_PREFIX/usr/include/interface/vmcs_host/linux" - CFLAGS="$CFLAGS $BCM2835_INCLUDES" - CXXFLAGS="$CXXFLAGS $BCM2835_INCLUDES" + XBMC_CFLAGS="$XBMC_CFLAGS $BCM2835_INCLUDES" + XBMC_CXXFLAGS="$XBMC_CXXFLAGS $BCM2835_INCLUDES" elif [ "$XBMCPLAYER_DRIVER" = "marvell-libgfx" ]; then PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET marvell-ipp" PKG_DEPENDS="$PKG_DEPENDS marvell-ipp" @@ -305,8 +305,9 @@ if [ ! "$XBMCPLAYER_DRIVER" = default ]; then XBMC_PLAYER="--enable-player=amlplayer" XBMC_CODEC="--enable-codec=amcodec" AMLPLAYER_INCLUDES="-I$SYSROOT_PREFIX/usr/include/amlplayer" - CFLAGS="$CFLAGS $AMLPLAYER_INCLUDES" - CXXFLAGS="$CXXFLAGS $AMLPLAYER_INCLUDES" + XBMC_CFLAGS="$XBMC_CFLAGS $AMLPLAYER_INCLUDES" + XBMC_CXXFLAGS="$XBMC_CXXFLAGS $AMLPLAYER_INCLUDES" + else XBMC_OPENMAX="--disable-openmax" fi @@ -433,6 +434,10 @@ pre_configure_target() { # dont build parallel # MAKEFLAGS=-j1 + + export CFLAGS="$CFLAGS $XBMC_CFLAGS" + export CXXFLAGS="$CXXFLAGS $XBMC_CXXFLAGS" + export LIBS="$LIBS $XBMC_LIBS" } make_target() { From 81439ad233a21416260ce73ff53efe7e375b0bcb Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 28 Jul 2013 04:42:54 +0200 Subject: [PATCH 013/103] xbmc (Gotham): update to xbmc-f68634b Signed-off-by: Stephan Raue --- .../mediacenter/xbmc-theme-Confluence/meta | 2 +- packages/mediacenter/xbmc/package.mk | 2 +- ...1-texturepacker-hostflags-and-rework.patch | 0 ...HONOPTIMIZE_with_external_Python-0.1.patch | 0 ...bmc-453-add_openelec.tv_RSS_news-0.1.patch | 0 ...add_as.xml_busy_dialog_delay_control.patch | 0 ...s-mark_our_wrapped_functions_as_used.patch | 0 .../xbmc-995.01-xvba_support-275709a.patch} | 3363 ++++++++++++----- .../xbmc-995.10-disable-alt-tab.patch | 0 .../xbmc-999.01-automake-1.13.patch | 0 10 files changed, 2514 insertions(+), 853 deletions(-) rename packages/mediacenter/xbmc/patches/{c218d5c => f68634b}/xbmc-321-texturepacker-hostflags-and-rework.patch (100%) rename packages/mediacenter/xbmc/patches/{c218d5c => f68634b}/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{c218d5c => f68634b}/xbmc-453-add_openelec.tv_RSS_news-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{c218d5c => f68634b}/xbmc-602-add_as.xml_busy_dialog_delay_control.patch (100%) rename packages/mediacenter/xbmc/patches/{c218d5c => f68634b}/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch (100%) rename packages/mediacenter/xbmc/patches/{c218d5c/xbmc-995.01-xvba_support-da1ff12.patch => f68634b/xbmc-995.01-xvba_support-275709a.patch} (89%) rename packages/mediacenter/xbmc/patches/{c218d5c => f68634b}/xbmc-995.10-disable-alt-tab.patch (100%) rename packages/mediacenter/xbmc/patches/{c218d5c => f68634b}/xbmc-999.01-automake-1.13.patch (100%) diff --git a/packages/mediacenter/xbmc-theme-Confluence/meta b/packages/mediacenter/xbmc-theme-Confluence/meta index 6541659273..83b77735c2 100644 --- a/packages/mediacenter/xbmc-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-theme-Confluence/meta @@ -21,7 +21,7 @@ PKG_NAME="xbmc-theme-Confluence" PKG_VERSION="12.2-8e4f924" if [ "$XBMC" = "master" ]; then - PKG_VERSION="c218d5c" + PKG_VERSION="f68634b" elif [ "$XBMC" = "xbmc-aml" ]; then PKG_VERSION="aml-frodo-d9119f2" fi diff --git a/packages/mediacenter/xbmc/package.mk b/packages/mediacenter/xbmc/package.mk index 85cce84d80..8eb668b0d8 100644 --- a/packages/mediacenter/xbmc/package.mk +++ b/packages/mediacenter/xbmc/package.mk @@ -21,7 +21,7 @@ PKG_NAME="xbmc" PKG_VERSION="12.2-8e4f924" if [ "$XBMC" = "master" ]; then - PKG_VERSION="c218d5c" + PKG_VERSION="f68634b" elif [ "$XBMC" = "xbmc-aml" ]; then PKG_VERSION="aml-frodo-d9119f2" fi diff --git a/packages/mediacenter/xbmc/patches/c218d5c/xbmc-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc/patches/f68634b/xbmc-321-texturepacker-hostflags-and-rework.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/c218d5c/xbmc-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc/patches/f68634b/xbmc-321-texturepacker-hostflags-and-rework.patch diff --git a/packages/mediacenter/xbmc/patches/c218d5c/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/f68634b/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/c218d5c/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc/patches/f68634b/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/c218d5c/xbmc-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/f68634b/xbmc-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/c218d5c/xbmc-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc/patches/f68634b/xbmc-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/c218d5c/xbmc-602-add_as.xml_busy_dialog_delay_control.patch b/packages/mediacenter/xbmc/patches/f68634b/xbmc-602-add_as.xml_busy_dialog_delay_control.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/c218d5c/xbmc-602-add_as.xml_busy_dialog_delay_control.patch rename to packages/mediacenter/xbmc/patches/f68634b/xbmc-602-add_as.xml_busy_dialog_delay_control.patch diff --git a/packages/mediacenter/xbmc/patches/c218d5c/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch b/packages/mediacenter/xbmc/patches/f68634b/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/c218d5c/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch rename to packages/mediacenter/xbmc/patches/f68634b/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch diff --git a/packages/mediacenter/xbmc/patches/c218d5c/xbmc-995.01-xvba_support-da1ff12.patch b/packages/mediacenter/xbmc/patches/f68634b/xbmc-995.01-xvba_support-275709a.patch similarity index 89% rename from packages/mediacenter/xbmc/patches/c218d5c/xbmc-995.01-xvba_support-da1ff12.patch rename to packages/mediacenter/xbmc/patches/f68634b/xbmc-995.01-xvba_support-275709a.patch index c6bd3082c1..c74fde3051 100644 --- a/packages/mediacenter/xbmc/patches/c218d5c/xbmc-995.01-xvba_support-da1ff12.patch +++ b/packages/mediacenter/xbmc/patches/f68634b/xbmc-995.01-xvba_support-275709a.patch @@ -1,7 +1,7 @@ -From 16898b6bd8f19f416c9f4765ee20858fb42ead11 Mon Sep 17 00:00:00 2001 +From d1437bb713c416176489385d0575281eb3f09ff2 Mon Sep 17 00:00:00 2001 From: fritsch Date: Mon, 15 Apr 2013 20:27:39 +0200 -Subject: [PATCH 001/123] AE: Start of planar format internally +Subject: [PATCH 001/136] AE: Start of planar format internally --- xbmc/cores/AudioEngine/AEAudioFormat.h | 7 +++++++ @@ -47,7 +47,7 @@ index 369811c..64be36f 100644 /* Bitstream formats */ AE_FMT_AAC, diff --git a/xbmc/cores/AudioEngine/Utils/AEUtil.cpp b/xbmc/cores/AudioEngine/Utils/AEUtil.cpp -index 6de84dc..3322226 100644 +index 2b6e0cd..3a5c78f 100644 --- a/xbmc/cores/AudioEngine/Utils/AEUtil.cpp +++ b/xbmc/cores/AudioEngine/Utils/AEUtil.cpp @@ -82,26 +82,33 @@ const unsigned int CAEUtil::DataFormatToBits(const enum AEDataFormat dataFormat) @@ -122,17 +122,17 @@ index 6de84dc..3322226 100644 1.8.1.6 -From 7be39700ca76a23e1f51315a77e4fba5dfdfbc39 Mon Sep 17 00:00:00 2001 +From 321beb78c4833da8de29c3aabd1a37f063a18202 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Fri, 31 May 2013 16:28:30 +0200 -Subject: [PATCH 002/123] AE: register callback for all audio settings +Subject: [PATCH 002/136] AE: register callback for all audio settings --- xbmc/settings/Settings.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp -index 65e685a..ee97753 100644 +index b5fd369..d8f6889 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -840,8 +840,18 @@ void CSettings::InitializeISettingCallbacks() @@ -158,10 +158,10 @@ index 65e685a..ee97753 100644 1.8.1.6 -From a2070bcc6555822f98e8bb5d846dee36c3b98028 Mon Sep 17 00:00:00 2001 +From 1e4ee28403cc9af837352672fc1a3e7bbcc2b69c Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Thu, 23 May 2013 10:05:11 +0200 -Subject: [PATCH 003/123] AESinkALSA: drop unneeded member +Subject: [PATCH 003/136] AESinkALSA: drop unneeded member --- xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp | 11 ++++++----- @@ -169,7 +169,7 @@ Subject: [PATCH 003/123] AESinkALSA: drop unneeded member 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -index 9d3cefa..32fb450 100644 +index 45028d6..decd0bd 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp @@ -131,19 +131,20 @@ void CAESinkALSA::GetAESParams(AEAudioFormat format, std::string& params) @@ -221,7 +221,7 @@ index 9d3cefa..32fb450 100644 CLog::Log(LOGERROR, "CAESinkALSA::Initialize - failed to initialize device \"%s\"", device.c_str()); snd_config_delete(config); diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h -index e2b4e4f..73615a5 100644 +index 39e3719..90578b9 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h +++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h @@ -64,7 +64,6 @@ class CAESinkALSA : public IAESink @@ -236,10 +236,10 @@ index e2b4e4f..73615a5 100644 1.8.1.6 -From 1871f8bc6bb5828299b57db0fbf131392e2ea5a1 Mon Sep 17 00:00:00 2001 +From 8982a8ef935bec12899a07745bf4d049bc066499 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 27 Apr 2013 10:47:01 +0200 -Subject: [PATCH 004/123] ffmpeg: add methods to the interface needed for +Subject: [PATCH 004/136] ffmpeg: add methods to the interface needed for resampling --- @@ -350,10 +350,64 @@ index e9613d3..320b3a7 100644 1.8.1.6 -From efe72091a8b488b8bb11063149252b6de292f66b Mon Sep 17 00:00:00 2001 +From 1e242da24efe796525a07a599dc2527742e400e2 Mon Sep 17 00:00:00 2001 +From: fritsch +Date: Thu, 25 Jul 2013 19:39:44 +0200 +Subject: [PATCH 005/136] ffmpeg: add av_opt_set_int and av_opt_set_double for + intrumenting swr + +--- + lib/DllAvUtil.h | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/lib/DllAvUtil.h b/lib/DllAvUtil.h +index bbe9be2..521263f 100644 +--- a/lib/DllAvUtil.h ++++ b/lib/DllAvUtil.h +@@ -82,6 +82,8 @@ class DllAvUtilInterface + virtual const AVCRC* av_crc_get_table(AVCRCId crc_id)=0; + virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)=0; + virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags)=0; ++ virtual int av_opt_set_double(void *obj, const char *name, double val, int search_flags)=0; ++ virtual int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)=0; + virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) = 0; + virtual void av_fifo_free(AVFifoBuffer *f) = 0; + virtual void av_fifo_reset(AVFifoBuffer *f) = 0; +@@ -119,6 +121,8 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface + virtual const AVCRC* av_crc_get_table(AVCRCId crc_id) { return ::av_crc_get_table(crc_id); } + virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length) { return ::av_crc(ctx, crc, buffer, length); } + virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags) { return ::av_opt_set(obj, name, val, search_flags); } ++ virtual int av_opt_set_double(void *obj, const char *name, double val, int search_flags) { return ::av_opt_set_double(obj, name, val, search_flags); } ++ virtual int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags) { return ::av_opt_set_int(obj, name, val, search_flags); } + virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) {return ::av_fifo_alloc(size); } + virtual void av_fifo_free(AVFifoBuffer *f) { ::av_fifo_free(f); } + virtual void av_fifo_reset(AVFifoBuffer *f) { ::av_fifo_reset(f); } +@@ -172,6 +176,8 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface + DEFINE_METHOD5(int, av_crc_init, (AVCRC *p1, int p2, int p3, uint32_t p4, int p5)); + DEFINE_METHOD4(uint32_t, av_crc, (const AVCRC *p1, uint32_t p2, const uint8_t *p3, size_t p4)); + DEFINE_METHOD4(int, av_opt_set, (void *p1, const char *p2, const char *p3, int p4)); ++ DEFINE_METHOD4(int, av_opt_set_double, (void *p1, const char *p2, double p3, int p4)) ++ DEFINE_METHOD4(int, av_opt_set_int, (void *p1, const char *p2, int64_t p3, int p4)) + DEFINE_METHOD1(AVFifoBuffer*, av_fifo_alloc, (unsigned int p1)) + DEFINE_METHOD1(void, av_fifo_free, (AVFifoBuffer *p1)) + DEFINE_METHOD1(void, av_fifo_reset, (AVFifoBuffer *p1)) +@@ -203,6 +209,8 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface + RESOLVE_METHOD(av_crc_get_table) + RESOLVE_METHOD(av_crc) + RESOLVE_METHOD(av_opt_set) ++ RESOLVE_METHOD(av_opt_set_double) ++ RESOLVE_METHOD(av_opt_set_int) + RESOLVE_METHOD(av_fifo_alloc) + RESOLVE_METHOD(av_fifo_free) + RESOLVE_METHOD(av_fifo_reset) +-- +1.8.1.6 + + +From f79f7713184ed00fb019dd00f755f1e182b2c601 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Wed, 26 Jun 2013 15:12:28 +0200 -Subject: [PATCH 005/123] AE: allow encoder to be fed with planar format +Subject: [PATCH 006/136] AE: allow encoder to be fed with planar format --- .../cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp | 66 +++++++++++++++++++++- @@ -362,7 +416,7 @@ Subject: [PATCH 005/123] AE: allow encoder to be fed with planar format 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp b/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp -index 99d9a47..36bae54 100644 +index ba89868..2f305b1 100644 --- a/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp +++ b/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp @@ -98,7 +98,7 @@ unsigned int CAEEncoderFFmpeg::BuildChannelLayout(const int64_t ffmap, CAEChanne @@ -474,7 +528,7 @@ index 99d9a47..36bae54 100644 { int size; diff --git a/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.h b/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.h -index d422ab6..2d442df 100644 +index 4ecc9f2..4fb67c4 100644 --- a/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.h +++ b/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.h @@ -36,7 +36,7 @@ class CAEEncoderFFmpeg: public IAEEncoder @@ -495,7 +549,7 @@ index d422ab6..2d442df 100644 virtual double GetDelay(unsigned int bufferSize); private: diff --git a/xbmc/cores/AudioEngine/Interfaces/AEEncoder.h b/xbmc/cores/AudioEngine/Interfaces/AEEncoder.h -index e304908..0e6f1f8 100644 +index 8c50fb1..6e4c257 100644 --- a/xbmc/cores/AudioEngine/Interfaces/AEEncoder.h +++ b/xbmc/cores/AudioEngine/Interfaces/AEEncoder.h @@ -48,9 +48,10 @@ class IAEEncoder @@ -531,10 +585,10 @@ index e304908..0e6f1f8 100644 1.8.1.6 -From 796f1dbc328099fd3527756675795b8708436468 Mon Sep 17 00:00:00 2001 +From 0ea994d9cc66de6db9e9b0bf239fb220ddabf9fb Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Wed, 26 Jun 2013 15:13:22 +0200 -Subject: [PATCH 006/123] AE: alsa - close device in blocking mode, fixes +Subject: [PATCH 007/136] AE: alsa - close device in blocking mode, fixes device busy --- @@ -542,7 +596,7 @@ Subject: [PATCH 006/123] AE: alsa - close device in blocking mode, fixes 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -index 32fb450..91cfc08 100644 +index decd0bd..06a949b 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp @@ -196,8 +196,8 @@ bool CAESinkALSA::Initialize(AEAudioFormat &format, std::string &device) @@ -572,17 +626,17 @@ index 32fb450..91cfc08 100644 1.8.1.6 -From 5cdc044bbfdf1740992d930501d48f78ea104d5d Mon Sep 17 00:00:00 2001 +From 47dc6f36326fafb8b1d7a8cbb61c83f4a5f4f19c Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Wed, 26 Jun 2013 18:48:30 +0200 -Subject: [PATCH 007/123] AE: alsa - set to prepared after drain +Subject: [PATCH 008/136] AE: alsa - set to prepared after drain --- xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -index 91cfc08..ee7b549 100644 +index 06a949b..630dd5d 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp @@ -196,8 +196,8 @@ bool CAESinkALSA::Initialize(AEAudioFormat &format, std::string &device) @@ -607,10 +661,10 @@ index 91cfc08..ee7b549 100644 1.8.1.6 -From a28f4c46f39407d1e155a6b300a38eadca67a2c6 Mon Sep 17 00:00:00 2001 +From a69c107e38624076463f2ad501cb13c3f84fe2fd Mon Sep 17 00:00:00 2001 From: fritsch Date: Fri, 5 Jul 2013 21:02:00 +0200 -Subject: [PATCH 008/123] AE: Add blocking option to AddPackets, makes Sink +Subject: [PATCH 009/136] AE: Add blocking option to AddPackets, makes Sink behaviour choosable after c2493d5bf6bc2be2fb45f563affdd214bf9862fb --- @@ -632,7 +686,7 @@ Subject: [PATCH 008/123] AE: Add blocking option to AddPackets, makes Sink 15 files changed, 24 insertions(+), 17 deletions(-) diff --git a/xbmc/cores/AudioEngine/Interfaces/AESink.h b/xbmc/cores/AudioEngine/Interfaces/AESink.h -index cb9c04b..65395bf 100644 +index d4fc3b9..520d6ef 100644 --- a/xbmc/cores/AudioEngine/Interfaces/AESink.h +++ b/xbmc/cores/AudioEngine/Interfaces/AESink.h @@ -71,7 +71,7 @@ class IAESink @@ -645,7 +699,7 @@ index cb9c04b..65395bf 100644 /* Drain the sink diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -index ee7b549..8d2e6a1 100644 +index 630dd5d..4e06031 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp @@ -497,7 +497,7 @@ double CAESinkALSA::GetCacheTotal() @@ -674,7 +728,7 @@ index ee7b549..8d2e6a1 100644 ret = snd_pcm_writei(m_pcm, (void*)data, frames); if (ret < 0) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h -index 73615a5..69c8a85 100644 +index 90578b9..e43ea5e 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h +++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h @@ -47,7 +47,7 @@ class CAESinkALSA : public IAESink @@ -687,7 +741,7 @@ index 73615a5..69c8a85 100644 virtual bool SoftSuspend(); virtual bool SoftResume(); diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp -index c37bf2d..66e4c6a 100644 +index 07a4bcc..7b9e205 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp @@ -212,7 +212,7 @@ double CAESinkAUDIOTRACK::GetCacheTotal() @@ -700,10 +754,10 @@ index c37bf2d..66e4c6a 100644 // write as many frames of audio as we can fit into our internal buffer. diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h -index d07ab8d..e923cd6 100644 +index 3d73d9fb..9600867 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h +++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h -@@ -39,7 +39,7 @@ class CAESinkAUDIOTRACK : public CThread, public IAESink +@@ -40,7 +40,7 @@ class CAESinkAUDIOTRACK : public CThread, public IAESink virtual double GetDelay (); virtual double GetCacheTime (); virtual double GetCacheTotal (); @@ -713,7 +767,7 @@ index d07ab8d..e923cd6 100644 virtual bool HasVolume (); virtual void SetVolume (float scale); diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -index e3a3695..8df9cab 100644 +index d46d551..cff916e 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp @@ -367,7 +367,7 @@ bool CAESinkDirectSound::IsCompatible(const AEAudioFormat format, const std::str @@ -733,7 +787,7 @@ index e3a3695..8df9cab 100644 \ No newline at end of file +} diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h -index 944e598..f06e929 100644 +index b0149dd..8ff098d 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h +++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h @@ -42,7 +42,7 @@ class CAESinkDirectSound : public IAESink @@ -746,7 +800,7 @@ index 944e598..f06e929 100644 virtual bool SoftResume (); static std::string GetDefaultDevice (); diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkNULL.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkNULL.cpp -index 9f980f8..28cadcc 100644 +index 254b9c9..7d26017 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkNULL.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkNULL.cpp @@ -99,7 +99,7 @@ double CAESinkNULL::GetCacheTotal() @@ -759,7 +813,7 @@ index 9f980f8..28cadcc 100644 unsigned int max_frames = (m_sinkbuffer_size - m_sinkbuffer_level) / m_sink_frameSize; if (frames > max_frames) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkNULL.h b/xbmc/cores/AudioEngine/Sinks/AESinkNULL.h -index 47bf18f..09e49f0 100644 +index ef77119..1e4a3b9 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkNULL.h +++ b/xbmc/cores/AudioEngine/Sinks/AESinkNULL.h @@ -38,7 +38,7 @@ class CAESinkNULL : public CThread, public IAESink @@ -772,7 +826,7 @@ index 47bf18f..09e49f0 100644 static void EnumerateDevices(AEDeviceList &devices, bool passthrough); diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp -index 00f57d0..97d1725 100644 +index 281088d..3a6461b 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp @@ -408,7 +408,7 @@ double CAESinkOSS::GetDelay() @@ -785,7 +839,7 @@ index 00f57d0..97d1725 100644 int size = frames * m_format.m_frameSize; if (m_fd == -1) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h -index ab1b457..18cadce 100644 +index f50f713..9e558d3 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h +++ b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h @@ -41,7 +41,7 @@ class CAESinkOSS : public IAESink @@ -798,7 +852,7 @@ index ab1b457..18cadce 100644 static void EnumerateDevicesEx(AEDeviceInfoList &list, bool force = false); private: diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.cpp -index 7c01573..1cf4843 100644 +index 2cff0ed..aeceb6b 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.cpp @@ -71,7 +71,7 @@ double CAESinkProfiler::GetDelay() @@ -811,7 +865,7 @@ index 7c01573..1cf4843 100644 int64_t ts = CurrentHostCounter(); CLog::Log(LOGDEBUG, "CAESinkProfiler::AddPackets - latency %f ms", (float)(ts - m_ts) / 1000000.0f); diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.h b/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.h -index 621e0f3..814670a 100644 +index d9423fb..a0b955b 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.h +++ b/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.h @@ -39,7 +39,7 @@ class CAESinkProfiler : public IAESink @@ -824,7 +878,7 @@ index 621e0f3..814670a 100644 static void EnumerateDevices(AEDeviceList &devices, bool passthrough); private: diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -index 472366d..6d6e477 100644 +index 9af3f2e..4cd95f0 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp @@ -423,7 +423,7 @@ double CAESinkWASAPI::GetCacheTotal() @@ -837,7 +891,7 @@ index 472366d..6d6e477 100644 if (!m_initialized) return 0; diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h -index 312866c..c88dd91 100644 +index df16682..c4a5a51 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h +++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h @@ -42,7 +42,7 @@ class CAESinkWASAPI : public IAESink @@ -853,10 +907,10 @@ index 312866c..c88dd91 100644 1.8.1.6 -From d6064a357c0423d7601c50568f78496fc7fd89ea Mon Sep 17 00:00:00 2001 +From 21396738cd866d56a717c1f0999121739ea914d6 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 6 Jul 2013 08:07:30 +0200 -Subject: [PATCH 009/123] AE: Give Sinks the possibility to be used in a +Subject: [PATCH 010/136] AE: Give Sinks the possibility to be used in a blocking way --- @@ -867,7 +921,7 @@ Subject: [PATCH 009/123] AE: Give Sinks the possibility to be used in a 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp -index 66e4c6a..bd179d5 100644 +index 7b9e205..48e488b 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp @@ -243,6 +243,11 @@ unsigned int CAESinkAUDIOTRACK::AddPackets(uint8_t *data, unsigned int frames, b @@ -883,7 +937,7 @@ index 66e4c6a..bd179d5 100644 } diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -index 8df9cab..6f4353d 100644 +index cff916e..797d7f2 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp @@ -367,7 +367,7 @@ bool CAESinkDirectSound::IsCompatible(const AEAudioFormat format, const std::str @@ -914,7 +968,7 @@ index 8df9cab..6f4353d 100644 while (len) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp -index 97d1725..ab13671 100644 +index 3a6461b..b201b7b 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp @@ -420,7 +420,7 @@ unsigned int CAESinkOSS::AddPackets(uint8_t *data, unsigned int frames, bool has @@ -927,7 +981,7 @@ index 97d1725..ab13671 100644 CLog::Log(LOGERROR, "CAESinkOSS::AddPackets - Failed to write"); diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -index 6d6e477..5aebb47 100644 +index 4cd95f0..8a3d7ce 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp @@ -488,10 +488,33 @@ unsigned int CAESinkWASAPI::AddPackets(uint8_t *data, unsigned int frames, bool @@ -971,10 +1025,10 @@ index 6d6e477..5aebb47 100644 1.8.1.6 -From feafa929a610c5de9ebdaf7f1fd1657348d48945 Mon Sep 17 00:00:00 2001 +From 8700c98e54c57d48cb50584f1097bddad3fe3a5a Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sun, 7 Jul 2013 18:22:04 +0200 -Subject: [PATCH 010/123] AE: allow to register audio callback directly into +Subject: [PATCH 011/136] AE: allow to register audio callback directly into engine --- @@ -1042,7 +1096,7 @@ index cbfa8ed..5741cd8 100644 }; diff --git a/xbmc/cores/dvdplayer/DVDPlayer.h b/xbmc/cores/dvdplayer/DVDPlayer.h -index ceb9996..6da30eb 100644 +index 237aba4d..c6b9ce3 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.h +++ b/xbmc/cores/dvdplayer/DVDPlayer.h @@ -39,6 +39,7 @@ @@ -1065,10 +1119,10 @@ index ceb9996..6da30eb 100644 virtual void SetDynamicRangeCompression(long drc) { m_dvdPlayerAudio.SetDynamicRangeCompression(drc); } virtual void GetAudioInfo(CStdString& strAudioInfo); diff --git a/xbmc/cores/paplayer/PAPlayer.cpp b/xbmc/cores/paplayer/PAPlayer.cpp -index cfde8fb..c9d56ac 100644 +index e4ba610..fe77363 100644 --- a/xbmc/cores/paplayer/PAPlayer.cpp +++ b/xbmc/cores/paplayer/PAPlayer.cpp -@@ -717,6 +717,7 @@ void PAPlayer::OnExit() +@@ -759,6 +759,7 @@ void PAPlayer::OnExit() void PAPlayer::RegisterAudioCallback(IAudioCallback* pCallback) { CSharedLock lock(m_streamsLock); @@ -1076,7 +1130,7 @@ index cfde8fb..c9d56ac 100644 m_audioCallback = pCallback; if (m_currentStream && m_currentStream->m_stream) m_currentStream->m_stream->RegisterAudioCallback(pCallback); -@@ -725,6 +726,7 @@ void PAPlayer::RegisterAudioCallback(IAudioCallback* pCallback) +@@ -767,6 +768,7 @@ void PAPlayer::RegisterAudioCallback(IAudioCallback* pCallback) void PAPlayer::UnRegisterAudioCallback() { CSharedLock lock(m_streamsLock); @@ -1088,10 +1142,10 @@ index cfde8fb..c9d56ac 100644 1.8.1.6 -From 6df9543d4e87cc038938efb44bc44c4e8eba9c45 Mon Sep 17 00:00:00 2001 +From 8ae0ba4f8e2d00c3dbf7362bfb22b6a8ee0befd7 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Mon, 1 Jul 2013 13:52:29 +0200 -Subject: [PATCH 011/123] AE: add parameter wait to drain, dvdplayer wants to +Subject: [PATCH 012/136] AE: add parameter wait to drain, dvdplayer wants to wait for the stream to be drained, papayer does not --- @@ -1198,7 +1252,7 @@ index 67fa5e2..92d5fef 100644 /** * Returns true if the is stream draining diff --git a/xbmc/cores/dvdplayer/DVDAudio.cpp b/xbmc/cores/dvdplayer/DVDAudio.cpp -index 3d77f0a..d304026 100644 +index c37d4c5..6404433 100644 --- a/xbmc/cores/dvdplayer/DVDAudio.cpp +++ b/xbmc/cores/dvdplayer/DVDAudio.cpp @@ -298,7 +298,7 @@ void CDVDAudio::Drain() @@ -1211,10 +1265,10 @@ index 3d77f0a..d304026 100644 void CDVDAudio::RegisterAudioCallback(IAudioCallback* pCallback) diff --git a/xbmc/cores/paplayer/PAPlayer.cpp b/xbmc/cores/paplayer/PAPlayer.cpp -index c9d56ac..f2e288c 100644 +index fe77363..555d51e 100644 --- a/xbmc/cores/paplayer/PAPlayer.cpp +++ b/xbmc/cores/paplayer/PAPlayer.cpp -@@ -568,7 +568,7 @@ inline void PAPlayer::ProcessStreams(double &delay, double &buffer) +@@ -610,7 +610,7 @@ inline void PAPlayer::ProcessStreams(double &delay, double &buffer) /* unregister the audio callback */ si->m_stream->UnRegisterAudioCallback(); si->m_decoder.Destroy(); @@ -1227,31 +1281,31 @@ index c9d56ac..f2e288c 100644 1.8.1.6 -From 2381ed88238ff8445cc23ac227e59e37b809e513 Mon Sep 17 00:00:00 2001 +From 2daf7828c64b2b5d1c1599660fc31d1e1a376420 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 25 Mar 2013 13:58:11 +0100 -Subject: [PATCH 012/123] ActiveAE: add new audio engine, co-author: fritsch +Subject: [PATCH 013/136] ActiveAE: add new audio engine, co-author: fritsch --- xbmc/cores/AudioEngine/AEFactory.cpp | 3 + xbmc/cores/AudioEngine/AEFactory.h | 3 +- - .../AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 2189 ++++++++++++++++++++ - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h | 332 +++ - .../Engines/ActiveAE/ActiveAEBuffer.cpp | 368 ++++ + .../AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 2270 ++++++++++++++++++++ + xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h | 334 +++ + .../Engines/ActiveAE/ActiveAEBuffer.cpp | 365 ++++ .../AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h | 110 + - .../Engines/ActiveAE/ActiveAEResample.cpp | 251 +++ + .../Engines/ActiveAE/ActiveAEResample.cpp | 250 +++ .../Engines/ActiveAE/ActiveAEResample.h | 61 + - .../AudioEngine/Engines/ActiveAE/ActiveAESink.cpp | 813 ++++++++ - .../AudioEngine/Engines/ActiveAE/ActiveAESink.h | 133 ++ - .../AudioEngine/Engines/ActiveAE/ActiveAESound.cpp | 164 ++ + .../AudioEngine/Engines/ActiveAE/ActiveAESink.cpp | 864 ++++++++ + .../AudioEngine/Engines/ActiveAE/ActiveAESink.h | 138 ++ + .../AudioEngine/Engines/ActiveAE/ActiveAESound.cpp | 161 ++ .../AudioEngine/Engines/ActiveAE/ActiveAESound.h | 73 + - .../Engines/ActiveAE/ActiveAEStream.cpp | 357 ++++ - .../AudioEngine/Engines/ActiveAE/ActiveAEStream.h | 115 + + .../Engines/ActiveAE/ActiveAEStream.cpp | 362 ++++ + .../AudioEngine/Engines/ActiveAE/ActiveAEStream.h | 117 + xbmc/cores/AudioEngine/Makefile.in | 7 + xbmc/utils/ActorProtocol.cpp | 253 +++ xbmc/utils/ActorProtocol.h | 87 + xbmc/utils/Makefile.in | 1 + - 18 files changed, 5319 insertions(+), 1 deletion(-) + 18 files changed, 5458 insertions(+), 1 deletion(-) create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp @@ -1304,10 +1358,10 @@ index 9e15f79..3059001 100644 class CAEFactory diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp new file mode 100644 -index 0000000..dc79da7 +index 0000000..2defd1d --- /dev/null +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -@@ -0,0 +1,2189 @@ +@@ -0,0 +1,2270 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org @@ -1456,6 +1510,7 @@ index 0000000..dc79da7 + m_encoder = NULL; + m_audioCallback = NULL; + m_vizInitialized = false; ++ m_sinkHasVolume = false; +} + +CActiveAE::~CActiveAE() @@ -1527,6 +1582,8 @@ index 0000000..dc79da7 + return; + case CActiveAEControlProtocol::VOLUME: + m_volume = *(float*)msg->data; ++ if (m_sinkHasVolume) ++ m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::VOLUME, &m_volume, sizeof(float)); + return; + case CActiveAEControlProtocol::MUTE: + m_muted = *(bool*)msg->data; @@ -1591,6 +1648,29 @@ index 0000000..dc79da7 + return; + + case AE_TOP_ERROR: ++ if (port == NULL) // timeout ++ { ++ switch (signal) ++ { ++ case CActiveAEControlProtocol::TIMEOUT: ++ m_extError = false; ++ LoadSettings(); ++ Configure(); ++ if (!m_extError) ++ { ++ m_state = AE_TOP_CONFIGURED_IDLE; ++ m_extTimeout = 0; ++ } ++ else ++ { ++ m_state = AE_TOP_ERROR; ++ m_extTimeout = 500; ++ } ++ return; ++ default: ++ break; ++ } ++ } + break; + + case AE_TOP_UNCONFIGURED: @@ -1612,6 +1692,7 @@ index 0000000..dc79da7 + else + { + m_state = AE_TOP_ERROR; ++ m_extTimeout = 500; + } + return; + @@ -1633,14 +1714,16 @@ index 0000000..dc79da7 + m_extTimeout = 0; + return; + } -+ if (HasWork()) ++ if (!m_sinkBuffers->m_inputSamples.empty() || !m_sinkBuffers->m_outputSamples.empty()) + { + m_extTimeout = 100; + return; + } + if (NeedReconfigureSink()) + DrainSink(); -+ Configure(); ++ ++ if (!m_extError) ++ Configure(); + if (!m_extError) + { + m_state = AE_TOP_CONFIGURED_PLAY; @@ -1649,9 +1732,9 @@ index 0000000..dc79da7 + else + { + m_state = AE_TOP_ERROR; -+ m_extTimeout = 1000; ++ m_extTimeout = 500; + } -+ m_dataPort.DeferOut(false); ++ m_extDeferData = false; + return; + default: + break; @@ -1671,12 +1754,13 @@ index 0000000..dc79da7 + m_state = AE_TOP_RECONFIGURING; + m_extTimeout = 0; + // don't accept any data until we are reconfigured -+ m_dataPort.DeferOut(true); ++ m_extDeferData = true; + return; + case CActiveAEControlProtocol::SUSPEND: + UnconfigureSink(); + m_stats.SetSuspended(true); + m_state = AE_TOP_CONFIGURED_SUSPEND; ++ m_extDeferData = true; + return; + case CActiveAEControlProtocol::DISPLAYLOST: + if (m_settings.mode == AUDIO_HDMI) @@ -1684,6 +1768,7 @@ index 0000000..dc79da7 + UnconfigureSink(); + m_stats.SetSuspended(true); + m_state = AE_TOP_CONFIGURED_SUSPEND; ++ m_extDeferData = true; + } + return; + case CActiveAEControlProtocol::PAUSESTREAM: @@ -1762,8 +1847,16 @@ index 0000000..dc79da7 + { + msg->Reply(CActiveAEDataProtocol::ACC, &stream, sizeof(CActiveAEStream*)); + Configure(); -+ m_extTimeout = 0; -+ m_state = AE_TOP_CONFIGURED_PLAY; ++ if (!m_extError) ++ { ++ m_state = AE_TOP_CONFIGURED_PLAY; ++ m_extTimeout = 0; ++ } ++ else ++ { ++ m_state = AE_TOP_ERROR; ++ m_extTimeout = 500; ++ } + } + else + msg->Reply(CActiveAEDataProtocol::ERR); @@ -1851,14 +1944,16 @@ index 0000000..dc79da7 + msg->Reply(CActiveAEControlProtocol::ACC); + if (!m_extError) + { -+ m_stats.SetSuspended(false); + m_state = AE_TOP_CONFIGURED_PLAY; + m_extTimeout = 0; + } + else + { + m_state = AE_TOP_ERROR; ++ m_extTimeout = 500; + } ++ m_stats.SetSuspended(false); ++ m_extDeferData = false; + return; + default: + break; @@ -1879,8 +1974,16 @@ index 0000000..dc79da7 + if (m_extDrainTimer.IsTimePast()) + { + Configure(); -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ m_extTimeout = 0; ++ if (!m_extError) ++ { ++ m_state = AE_TOP_CONFIGURED_PLAY; ++ m_extTimeout = 0; ++ } ++ else ++ { ++ m_state = AE_TOP_ERROR; ++ m_extTimeout = 500; ++ } + } + else + m_extTimeout = m_extDrainTimer.MillisLeft(); @@ -1939,6 +2042,7 @@ index 0000000..dc79da7 + m_extTimeout = 1000; + m_bStateMachineSelfTrigger = false; + m_extDrain = false; ++ m_extDeferData = false; + + // start sink + m_sink.Start(); @@ -1946,7 +2050,6 @@ index 0000000..dc79da7 + while (!m_bStop) + { + gotMsg = false; -+ deferData = (m_state == AE_TOP_CONFIGURED_SUSPEND); + + if (m_bStateMachineSelfTrigger) + { @@ -1966,7 +2069,13 @@ index 0000000..dc79da7 + gotMsg = true; + port = &m_controlPort; + } -+ else if (!deferData) ++ // check sink data port ++ else if (m_sink.m_dataPort.ReceiveInMessage(&msg)) ++ { ++ gotMsg = true; ++ port = &m_sink.m_dataPort; ++ } ++ else if (!m_extDeferData) + { + // check data port + if (m_dataPort.ReceiveOutMessage(&msg)) @@ -1974,12 +2083,6 @@ index 0000000..dc79da7 + gotMsg = true; + port = &m_dataPort; + } -+ // check sink data port -+ else if (m_sink.m_dataPort.ReceiveInMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_sink.m_dataPort; -+ } + // stream data ports + else + { @@ -2029,7 +2132,7 @@ index 0000000..dc79da7 + } +} + -+void CActiveAE::Configure() ++void CActiveAE::Configure(AEAudioFormat *desiredFmt) +{ + bool initSink = false; + AEAudioFormat sinkInputFormat, inputFormat; @@ -2046,22 +2149,34 @@ index 0000000..dc79da7 + inputFormat.m_frameSize = 0; + UnregisterAudioCallback(); + } ++ // force input format after unpausing slave ++ else if (desiredFmt != NULL) ++ { ++ inputFormat = *desiredFmt; ++ } ++ // keep format when having multiple streams ++ else if (m_streams.size() > 1 && m_silenceBuffers == NULL) ++ { ++ inputFormat = m_sinkRequestFormat; ++ } + else + { + inputFormat = m_streams.front()->m_format; + } + + m_sinkRequestFormat = inputFormat; -+ ApplySettingsToFormat(m_sinkRequestFormat, m_settings); ++ ApplySettingsToFormat(m_sinkRequestFormat, m_settings, true); + std::string device = AE_IS_RAW(m_sinkRequestFormat.m_dataFormat) ? m_settings.passthoughdevice : m_settings.device; + std::string driver; + CAESinkFactory::ParseDevice(device, driver); + if (!m_sink.IsCompatible(m_sinkRequestFormat, device) || m_settings.driver.compare(driver) != 0) + { -+ InitSink(); ++ if (!InitSink()) ++ return; + m_settings.driver = driver; + initSink = true; + m_stats.Reset(m_sinkFormat.m_sampleRate); ++ m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::VOLUME, &m_volume, sizeof(float)); + } + + if (m_silenceBuffers) @@ -2085,11 +2200,9 @@ index 0000000..dc79da7 + bool silence = false; + m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::SILENCEMODE, &silence, sizeof(bool)); + -+ if (m_encoder) -+ { -+ delete m_encoder; -+ m_encoder = NULL; -+ } ++ delete m_encoder; ++ m_encoder = NULL; ++ + if (m_encoderBuffers) + { + m_discardBufferPools.push_back(m_encoderBuffers); @@ -2108,14 +2221,13 @@ index 0000000..dc79da7 + m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::SILENCEMODE, &silence, sizeof(bool)); + + AEAudioFormat outputFormat; -+ if (AE_IS_RAW(inputFormat.m_dataFormat)) ++ if (m_mode == MODE_RAW) + { + outputFormat = inputFormat; + sinkInputFormat = m_sinkFormat; -+ m_mode = MODE_RAW; + } -+ // transcode -+ else if (m_settings.ac3passthrough && !m_settings.multichannellpcm) ++ // transcode everything with more than 2 channels ++ else if (m_mode == MODE_TRANSCODE) + { + outputFormat = inputFormat; + outputFormat.m_dataFormat = AE_FMT_FLOATP; @@ -2160,7 +2272,6 @@ index 0000000..dc79da7 + } + } + -+ m_mode = MODE_TRANSCODE; + sinkInputFormat = m_sinkFormat; + } + else @@ -2179,10 +2290,19 @@ index 0000000..dc79da7 + std::list::iterator it; + for(it=m_streams.begin(); it!=m_streams.end(); ++it) + { ++ // check if we support input format of stream ++ if (!AE_IS_RAW((*it)->m_format.m_dataFormat) && ++ CActiveAEResample::GetAVSampleFormat((*it)->m_format.m_dataFormat) == AV_SAMPLE_FMT_FLT && ++ (*it)->m_format.m_dataFormat != AE_FMT_FLOAT) ++ { ++ (*it)->m_convertFn = CAEConvert::ToFloat((*it)->m_format.m_dataFormat); ++ (*it)->m_format.m_dataFormat = AE_FMT_FLOAT; ++ } ++ + if (!(*it)->m_inputBuffers) + { -+ // align input buffers with period of sink -+ (*it)->m_format.m_frames = m_sinkFormat.m_frames * ((float)(*it)->m_format.m_sampleRate / m_sinkFormat.m_sampleRate); ++ // align input buffers with period of sink or encoder ++ (*it)->m_format.m_frames = m_internalFormat.m_frames * ((float)(*it)->m_format.m_sampleRate / m_internalFormat.m_sampleRate); + + // create buffer pool + (*it)->m_inputBuffers = new CActiveAEBufferPool((*it)->m_format); @@ -2376,7 +2496,7 @@ index 0000000..dc79da7 + return amp; +} + -+void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &settings) ++void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &settings, bool setmode) +{ + // raw pass through + if (m_settings.mode != AUDIO_ANALOG && AE_IS_RAW(format.m_dataFormat)) @@ -2388,15 +2508,24 @@ index 0000000..dc79da7 + { + CLog::Log(LOGERROR, "CActiveAE::ApplySettingsToFormat - input audio format is wrong"); + } ++ if (setmode) ++ m_mode = MODE_RAW; + } + // transcode -+ else if (m_settings.mode != AUDIO_ANALOG && settings.ac3passthrough && !settings.multichannellpcm && !m_streams.empty()) ++ else if (m_settings.mode != AUDIO_ANALOG && ++ settings.ac3passthrough && ++ (!settings.multichannellpcm || (m_settings.mode != AUDIO_HDMI)) && ++ !m_streams.empty() && ++ format.m_channelLayout.Count() > 2) + { + format.m_dataFormat = AE_FMT_AC3; + format.m_sampleRate = 48000; ++ if (setmode) ++ m_mode = MODE_TRANSCODE; + } + else + { ++ format.m_dataFormat = AE_FMT_FLOAT; + if ((format.m_channelLayout.Count() > 2) || settings.stereoupmix) + { + switch (settings.channels) @@ -2463,7 +2592,7 @@ index 0000000..dc79da7 + return false; +} + -+void CActiveAE::InitSink() ++bool CActiveAE::InitSink() +{ + SinkConfig config; + config.format = m_sinkRequestFormat; @@ -2482,7 +2611,7 @@ index 0000000..dc79da7 + reply->Release(); + CLog::Log(LOGERROR, "ActiveAE::%s - returned error", __FUNCTION__); + m_extError = true; -+ return; ++ return false; + } + AEAudioFormat *data; + data = (AEAudioFormat*)reply->data; @@ -2490,16 +2619,18 @@ index 0000000..dc79da7 + { + m_sinkFormat = *data; + } ++ m_sinkHasVolume = m_sink.HasVolume(); + reply->Release(); + } + else + { + CLog::Log(LOGERROR, "ActiveAE::%s - failed to init", __FUNCTION__); + m_extError = true; -+ return; ++ return false; + } + + m_inMsgEvent.Reset(); ++ return true; +} + +void CActiveAE::DrainSink() @@ -2564,7 +2695,8 @@ index 0000000..dc79da7 + { + if ((*it)->m_resampleBuffers && !(*it)->m_paused) + busy = (*it)->m_resampleBuffers->ResampleBuffers(); -+ else if ((*it)->m_resampleBuffers && !(*it)->m_resampleBuffers->m_inputSamples.empty()) ++ else if ((*it)->m_resampleBuffers && ++ ((*it)->m_resampleBuffers->m_inputSamples.size() > (*it)->m_resampleBuffers->m_allSamples.size() * 0.5)) + { + CSingleLock lock((*it)->m_streamLock); + (*it)->m_streamIsBuffering = false; @@ -2597,7 +2729,9 @@ index 0000000..dc79da7 + CSingleLock lock((*it)->m_streamLock); + if ((*it)->m_streamSlave) + { -+ ((CActiveAEStream*)(*it)->m_streamSlave)->m_paused = false;; ++ CActiveAEStream *slave = (CActiveAEStream*)((*it)->m_streamSlave); ++ slave->m_paused = false; ++ Configure(&slave->m_format); + (*it)->m_streamSlave = NULL; + } + (*it)->m_streamDrained = true; @@ -2770,12 +2904,13 @@ index 0000000..dc79da7 + { + // mix gui sounds + MixSounds(*(out->pkt)); -+ Deamplify(*(out->pkt)); ++ if (!m_sinkHasVolume) ++ Deamplify(*(out->pkt)); + + // viz + { + CSingleLock lock(m_vizLock); -+ if (m_audioCallback) ++ if (m_audioCallback && m_vizBuffers) + { + if (!m_vizInitialized) + { @@ -3499,10 +3634,10 @@ index 0000000..dc79da7 +} diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h new file mode 100644 -index 0000000..30da1ac +index 0000000..d5c5d97 --- /dev/null +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -@@ -0,0 +1,332 @@ +@@ -0,0 +1,334 @@ +#pragma once +/* + * Copyright (C) 2010-2013 Team XBMC @@ -3744,7 +3879,7 @@ index 0000000..30da1ac +protected: + void Process(); + void StateMachine(int signal, Protocol *port, Message *msg); -+ void InitSink(); ++ bool InitSink(); + void DrainSink(); + void UnconfigureSink(); + void Start(); @@ -3752,8 +3887,8 @@ index 0000000..30da1ac + void LoadSettings(); + bool NeedReconfigureBuffers(); + bool NeedReconfigureSink(); -+ void ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &settings); -+ void Configure(); ++ void ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &settings, bool setmode = false); ++ void Configure(AEAudioFormat *desiredFmt = NULL); + CActiveAEStream* CreateStream(MsgStreamNew *streamMsg); + void DiscardStream(CActiveAEStream *stream); + void SFlushStream(CActiveAEStream *stream); @@ -3780,6 +3915,7 @@ index 0000000..30da1ac + bool m_extError; + bool m_extDrain; + XbmcThreads::EndTime m_extDrainTimer; ++ bool m_extDeferData; + + enum + { @@ -3819,6 +3955,7 @@ index 0000000..30da1ac + + float m_volume; + bool m_muted; ++ bool m_sinkHasVolume; + + // viz + IAudioCallback *m_audioCallback; @@ -3837,10 +3974,10 @@ index 0000000..30da1ac +}; diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp new file mode 100644 -index 0000000..9a5f61e +index 0000000..d3ba213 --- /dev/null +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp -@@ -0,0 +1,368 @@ +@@ -0,0 +1,365 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://www.xbmc.org @@ -3890,8 +4027,7 @@ index 0000000..9a5f61e + +CSampleBuffer::~CSampleBuffer() +{ -+ if (pkt) -+ delete pkt; ++ delete pkt; +} + +CSampleBuffer* CSampleBuffer::Acquire() @@ -3990,8 +4126,7 @@ index 0000000..9a5f61e + +CActiveAEBufferPoolResample::~CActiveAEBufferPoolResample() +{ -+ if (m_resampler) -+ delete m_resampler; ++ delete m_resampler; +} + +bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap) @@ -4027,8 +4162,7 @@ index 0000000..9a5f61e + + m_outSampleRate = m_format.m_sampleRate * m_resampleRatio; + -+ if (m_resampler) -+ delete m_resampler; ++ delete m_resampler; + + m_resampler = new CActiveAEResample(); + m_resampler->Init(CActiveAEResample::GetAVChannelLayout(m_format.m_channelLayout), @@ -4327,10 +4461,10 @@ index 0000000..183c49e +} diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp new file mode 100644 -index 0000000..63df59c +index 0000000..aee3bfc --- /dev/null +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp -@@ -0,0 +1,251 @@ +@@ -0,0 +1,250 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org @@ -4444,8 +4578,8 @@ index 0000000..63df59c + +int CActiveAEResample::GetBufferedSamples() +{ -+ return m_dllAvUtil.av_rescale_rnd(m_dllSwResample.swr_get_delay(m_pContext, m_dst_rate), -+ m_src_rate, m_dst_rate, AV_ROUND_UP); ++ return m_dllAvUtil.av_rescale_rnd(m_dllSwResample.swr_get_delay(m_pContext, m_src_rate), ++ m_dst_rate, m_src_rate, AV_ROUND_UP); +} + +int CActiveAEResample::CalcDstSampleCount(int src_samples, int dst_rate, int src_rate) @@ -4529,7 +4663,6 @@ index 0000000..63df59c + else if (format == AE_FMT_FLOATP) return AV_SAMPLE_FMT_FLTP; + else if (format == AE_FMT_DOUBLEP) return AV_SAMPLE_FMT_DBLP; + -+ CLog::Log(LOGDEBUG, "CActiveAEResample::GetAVSampleFormat - format not supported"); + return AV_SAMPLE_FMT_FLT; +} + @@ -4651,10 +4784,10 @@ index 0000000..fa95a1d +} diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp new file mode 100644 -index 0000000..252f431 +index 0000000..c22bb88 --- /dev/null +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -@@ -0,0 +1,813 @@ +@@ -0,0 +1,864 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org @@ -4696,6 +4829,7 @@ index 0000000..252f431 + m_sink = NULL; + m_stats = NULL; + m_convertBuffer = NULL; ++ m_volume = 0.0; +} + +void CActiveAESink::Start() @@ -4722,11 +4856,9 @@ index 0000000..252f431 + delete m_sink; + m_sink = NULL; + } -+ if (m_sampleOfSilence.pkt) -+ { -+ delete m_sampleOfSilence.pkt; -+ m_sampleOfSilence.pkt = NULL; -+ } ++ ++ delete m_sampleOfSilence.pkt; ++ m_sampleOfSilence.pkt = NULL; + + delete m_sampleOfNoise.pkt; + m_sampleOfNoise.pkt = NULL; @@ -4745,6 +4877,13 @@ index 0000000..252f431 + return m_sink->IsCompatible(format, device); +} + ++bool CActiveAESink::HasVolume() ++{ ++ if (!m_sink) ++ return false; ++ return m_sink->HasVolume(); ++} ++ +enum SINK_STATES +{ + S_TOP = 0, // 0 @@ -4889,6 +5028,10 @@ index 0000000..252f431 + m_extTimeout = 0; + } + return; ++ case CSinkControlProtocol::VOLUME: ++ m_volume = *(float*)msg->data; ++ m_sink->SetVolume(m_volume); ++ return; + default: + break; + } @@ -4930,7 +5073,20 @@ index 0000000..252f431 + break; + + case S_TOP_CONFIGURED_SUSPEND: -+ if (port == &m_dataPort) ++ if (port == &m_controlPort) ++ { ++ switch (signal) ++ { ++ case CSinkControlProtocol::SILENCEMODE: ++ return; ++ case CSinkControlProtocol::VOLUME: ++ m_volume = *(float*)msg->data; ++ return; ++ default: ++ break; ++ } ++ } ++ else if (port == &m_dataPort) + { + switch (signal) + { @@ -5065,7 +5221,7 @@ index 0000000..252f431 + } + else if(m_extCycleCounter <= 0) + { -+ m_extCycleCounter = 30; ++ m_extCycleCounter = 20; + m_state = S_TOP_CONFIGURED_SILENCE; + } + m_extTimeout = 0; @@ -5305,6 +5461,20 @@ index 0000000..252f431 + return; + } + ++ m_sink->SetVolume(m_volume); ++ ++#ifdef WORDS_BIGENDIAN ++ if (m_sinkFormat.m_dataFormat == AE_FMT_S16BE) ++ m_sinkFormat.m_dataFormat = AE_FMT_S16NE; ++ else if (m_sinkFormat.m_dataFormat == AE_FMT_S32BE) ++ m_sinkFormat.m_dataFormat = AE_FMT_S32NE; ++#else ++ if (m_sinkFormat.m_dataFormat == AE_FMT_S16LE) ++ m_sinkFormat.m_dataFormat = AE_FMT_S16NE; ++ else if (m_sinkFormat.m_dataFormat == AE_FMT_S32LE) ++ m_sinkFormat.m_dataFormat = AE_FMT_S32NE; ++#endif ++ + CLog::Log(LOGDEBUG, "CActiveAE::OpenSink - %s Initialized:", m_sink->GetName()); + CLog::Log(LOGDEBUG, " Output Device : %s", m_deviceFriendlyName.c_str()); + CLog::Log(LOGDEBUG, " Sample Rate : %d", m_sinkFormat.m_sampleRate); @@ -5327,8 +5497,7 @@ index 0000000..252f431 + config.channel_layout = CActiveAEResample::GetAVChannelLayout(m_sinkFormat.m_channelLayout); + config.channels = m_sinkFormat.m_channelLayout.Count(); + config.sample_rate = m_sinkFormat.m_sampleRate; -+ if (m_sampleOfSilence.pkt) -+ delete m_sampleOfSilence.pkt; ++ delete m_sampleOfSilence.pkt; + m_sampleOfSilence.pkt = new CSoundPacket(config, m_sinkFormat.m_frames); + m_sampleOfSilence.pkt->nb_samples = m_sampleOfSilence.pkt->max_nb_samples; + @@ -5344,6 +5513,7 @@ index 0000000..252f431 + _aligned_free(m_convertBuffer); + m_convertBuffer = NULL; + } ++ m_convertFn = NULL; + m_convertState = CHECK_CONVERT; +} + @@ -5375,6 +5545,7 @@ index 0000000..252f431 + case SKIP_CONVERT: + break; + case NEED_CONVERT: ++ EnsureConvertBuffer(samples); + buffer = Convert(samples); + break; + case NEED_BYTESWAP: @@ -5382,6 +5553,10 @@ index 0000000..252f431 + break; + case CHECK_CONVERT: + ConvertInit(samples); ++ if (m_convertState == NEED_CONVERT) ++ buffer = Convert(samples); ++ else if (m_convertState == NEED_BYTESWAP) ++ Endian_Swap16_buf((uint16_t *)buffer, (uint16_t *)buffer, frames * samples->pkt->config.channels); + break; + default: + break; @@ -5419,8 +5594,9 @@ index 0000000..252f431 + m_convertFn = CAEConvert::FrFloat(m_sinkFormat.m_dataFormat); + if (m_convertBuffer) + _aligned_free(m_convertBuffer); -+ m_convertBuffer = (uint8_t*)_aligned_malloc(m_sinkFormat.m_frames * m_sinkFormat.m_channelLayout.Count() * m_sinkFormat.m_frameSize, 16); -+ memset(m_convertBuffer, 0, m_sinkFormat.m_frames * m_sinkFormat.m_channelLayout.Count() * m_sinkFormat.m_frameSize); ++ m_convertBufferSampleSize = samples->pkt->max_nb_samples; ++ m_convertBuffer = (uint8_t*)_aligned_malloc(samples->pkt->max_nb_samples * m_sinkFormat.m_channelLayout.Count() * m_sinkFormat.m_frameSize, 16); ++ memset(m_convertBuffer, 0, samples->pkt->max_nb_samples * m_sinkFormat.m_channelLayout.Count() * m_sinkFormat.m_frameSize); + m_convertState = NEED_CONVERT; + } + else if (AE_IS_RAW(m_requestedFormat.m_dataFormat) && CAEUtil::S16NeedsByteSwap(AE_FMT_S16NE, m_sinkFormat.m_dataFormat)) @@ -5431,6 +5607,20 @@ index 0000000..252f431 + m_convertState = SKIP_CONVERT; +} + ++void CActiveAESink::EnsureConvertBuffer(CSampleBuffer* samples) ++{ ++ if (!m_convertBuffer) ++ return; ++ ++ if (samples->pkt->max_nb_samples <= m_convertBufferSampleSize) ++ return; ++ ++ _aligned_free(m_convertBuffer); ++ m_convertBufferSampleSize = samples->pkt->max_nb_samples; ++ m_convertBuffer = (uint8_t*)_aligned_malloc(samples->pkt->max_nb_samples * m_sinkFormat.m_channelLayout.Count() * m_sinkFormat.m_frameSize, 16); ++ memset(m_convertBuffer, 0, samples->pkt->max_nb_samples * m_sinkFormat.m_channelLayout.Count() * m_sinkFormat.m_frameSize); ++} ++ +uint8_t* CActiveAESink::Convert(CSampleBuffer* samples) +{ + unsigned int nb_samples = m_convertFn((float*)samples->pkt->data[0], samples->pkt->nb_samples * samples->pkt->config.channels, m_convertBuffer); @@ -5457,23 +5647,17 @@ index 0000000..252f431 + noise[i] = (float) sqrt( -2.0f * log( R1 )) * cos( 2.0f * PI * R2 ) * 0.00001; + } + -+ if (m_sinkFormat.m_dataFormat != AE_FMT_FLOAT) -+ { -+ CAEConvert::AEConvertFrFn convertFn = CAEConvert::FrFloat(m_sinkFormat.m_dataFormat); -+ convertFn(noise, nb_floats, m_sampleOfNoise.pkt->data[0]); -+ } -+ else -+ { -+ memcpy(m_sampleOfNoise.pkt->data[0], noise, nb_floats*sizeof(float)); -+ } ++ AEDataFormat fmt = CActiveAEResample::GetAESampleFormat(m_sampleOfNoise.pkt->config.fmt); ++ CAEConvert::AEConvertFrFn convertFn = CAEConvert::FrFloat(fmt); ++ convertFn(noise, nb_floats, m_sampleOfNoise.pkt->data[0]); + delete [] noise; +} diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h new file mode 100644 -index 0000000..ae19f38 +index 0000000..559179c --- /dev/null +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h -@@ -0,0 +1,133 @@ +@@ -0,0 +1,138 @@ +#pragma once +/* + * Copyright (C) 2010-2013 Team XBMC @@ -5525,6 +5709,7 @@ index 0000000..ae19f38 + CONFIGURE, + UNCONFIGURE, + SILENCEMODE, ++ VOLUME, + TIMEOUT, + }; + enum InSignal @@ -5561,6 +5746,7 @@ index 0000000..ae19f38 + void Start(); + void Dispose(); + bool IsCompatible(const AEAudioFormat format, const std::string &device); ++ bool HasVolume(); + CSinkControlProtocol m_controlPort; + CSinkDataProtocol m_dataPort; + @@ -5574,6 +5760,7 @@ index 0000000..ae19f38 + + unsigned int OutputSamples(CSampleBuffer* samples); + void ConvertInit(CSampleBuffer* samples); ++ inline void EnsureConvertBuffer(CSampleBuffer* samples); + inline uint8_t* Convert(CSampleBuffer* samples); + + void GenerateNoise(); @@ -5590,6 +5777,7 @@ index 0000000..ae19f38 + CSampleBuffer m_sampleOfSilence; + CSampleBuffer m_sampleOfNoise; + uint8_t *m_convertBuffer; ++ int m_convertBufferSampleSize; + CAEConvert::AEConvertFrFn m_convertFn; + enum + { @@ -5604,15 +5792,16 @@ index 0000000..ae19f38 + IAESink *m_sink; + AEAudioFormat m_sinkFormat, m_requestedFormat; + CEngineStats *m_stats; ++ float m_volume; +}; + +} diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp new file mode 100644 -index 0000000..3d79761 +index 0000000..fb75ba9 --- /dev/null +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp -@@ -0,0 +1,164 @@ +@@ -0,0 +1,161 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org @@ -5660,10 +5849,8 @@ index 0000000..3d79761 + +CActiveAESound::~CActiveAESound() +{ -+ if (m_orig_sound) -+ delete m_orig_sound; -+ if (m_dst_sound) -+ delete m_dst_sound; ++ delete m_orig_sound; ++ delete m_dst_sound; + Finish(); +} + @@ -5691,8 +5878,7 @@ index 0000000..3d79761 + else + info = &m_dst_sound; + -+ if (*info) -+ delete *info; ++ delete *info; + *info = new CSoundPacket(config, nb_samples); + + (*info)->nb_samples = 0; @@ -5858,10 +6044,10 @@ index 0000000..7cdf76c +} diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp new file mode 100644 -index 0000000..e21b9d5 +index 0000000..66f62b7 --- /dev/null +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp -@@ -0,0 +1,357 @@ +@@ -0,0 +1,362 @@ +/* + * Copyright (C) 2010-2013 Team XBMC + * http://xbmc.org @@ -5915,6 +6101,7 @@ index 0000000..e21b9d5 + m_streamFreeBuffers = 0; + m_streamIsBuffering = true; + m_streamSlave = NULL; ++ m_convertFn = NULL; +} + +CActiveAEStream::~CActiveAEStream() @@ -5960,11 +6147,15 @@ index 0000000..e21b9d5 + m_currentBuffer->pkt->planes; + + int freeSamples = m_currentBuffer->pkt->max_nb_samples - m_currentBuffer->pkt->nb_samples; -+ int space = freeSamples * m_format.m_frameSize; -+ int bytes = std::min(bytesToCopy, space); -+ int samples = bytes / m_currentBuffer->pkt->bytes_per_sample / m_currentBuffer->pkt->config.channels; ++ int availableSamples = bytesToCopy / m_format.m_frameSize; ++ int space = freeSamples * m_currentBuffer->pkt->bytes_per_sample * m_currentBuffer->pkt->config.channels; ++ int samples = std::min(freeSamples, availableSamples); ++ int bytes = samples * m_format.m_frameSize; + //TODO: handle planar formats -+ memcpy(m_currentBuffer->pkt->data[0] + start, (uint8_t*)data+copied, bytes); ++ if (m_convertFn) ++ m_convertFn((uint8_t*)data+copied, samples*m_currentBuffer->pkt->config.channels, (float*)(m_currentBuffer->pkt->data[0] + start)); ++ else ++ memcpy(m_currentBuffer->pkt->data[0] + start, (uint8_t*)data+copied, bytes); + { + CSingleLock lock(*m_statsLock); + m_currentBuffer->pkt->nb_samples += samples; @@ -6221,10 +6412,10 @@ index 0000000..e21b9d5 + diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h new file mode 100644 -index 0000000..b18d0f5 +index 0000000..bddf1a3 --- /dev/null +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h -@@ -0,0 +1,115 @@ +@@ -0,0 +1,117 @@ +#pragma once +/* + * Copyright (C) 2010-2013 Team XBMC @@ -6249,6 +6440,7 @@ index 0000000..b18d0f5 +#include "AEAudioFormat.h" +#include "Interfaces/AEStream.h" +#include "Utils/AELimiter.h" ++#include "Utils/AEConvert.h" + +namespace ActiveAE +{ @@ -6316,6 +6508,7 @@ index 0000000..b18d0f5 + int m_streamFreeBuffers; + bool m_streamIsBuffering; + IAEStream *m_streamSlave; ++ CAEConvert::AEConvertToFn m_convertFn; + CCriticalSection m_streamLock; + + // only accessed by engine @@ -6726,10 +6919,10 @@ index 694a9bd..ca49be2 100644 1.8.1.6 -From 5e22d771079269b28d443a869cf9024bf7cfb9c0 Mon Sep 17 00:00:00 2001 +From dfaf102c264a11252e053ec4477d08db6cbca1f9 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 8 Jun 2013 09:39:38 +0200 -Subject: [PATCH 013/123] ActiveAE: Make Factory aware of environment, change +Subject: [PATCH 014/136] ActiveAE: Make Factory aware of environment, change global namespace --- @@ -6770,10 +6963,10 @@ index 4f9f566..5adda5f 100644 1.8.1.6 -From 89bb54f049db842565fe68698fd8aacc896be229 Mon Sep 17 00:00:00 2001 +From 1032f3155784ceb5781940e7bae5f3369cd7a831 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 11 Jul 2013 18:33:34 +0200 -Subject: [PATCH 015/123] AE: allow Windows to use ActiveAE via env +Subject: [PATCH 015/136] AE: allow Windows to use ActiveAE via env --- xbmc/cores/AudioEngine/AEFactory.cpp | 14 ++++++++++++++ @@ -6808,255 +7001,1625 @@ index 5adda5f..d5517f3 100644 1.8.1.6 -From 795bc8558b82484598f4e304a0b0681eaa0b7ec5 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Sun, 14 Jul 2013 17:28:13 +0200 -Subject: [PATCH 016/123] ActiveAE: convert BE/LE to NE if possible +From ca1eb43f810ffa679c9420d740e0474e19b474bc Mon Sep 17 00:00:00 2001 +From: unknown +Date: Tue, 16 Jul 2013 17:06:03 +0200 +Subject: [PATCH 017/136] AE: add streamsilence to gui settings for engines + which suppport drain --- - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp | 12 ++++++++++++ - 1 file changed, 12 insertions(+) + language/English/strings.po | 14 +++++++++++--- + system/settings/settings.xml | 5 +++++ + xbmc/cores/AudioEngine/AEFactory.cpp | 8 ++++++++ + xbmc/cores/AudioEngine/AEFactory.h | 1 + + xbmc/cores/AudioEngine/Interfaces/AE.h | 6 ++++++ + xbmc/settings/Settings.cpp | 4 ++++ + 6 files changed, 35 insertions(+), 3 deletions(-) -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -index 252f431..0e003bd 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -@@ -648,6 +648,18 @@ void CActiveAESink::OpenSink() - return; - } +diff --git a/language/English/strings.po b/language/English/strings.po +index 069dce0..c2c562f 100644 +--- a/language/English/strings.po ++++ b/language/English/strings.po +@@ -1762,7 +1762,10 @@ msgctxt "#420" + msgid "HDMI" + msgstr "" -+#ifdef WORDS_BIGENDIAN -+ if (m_sinkFormat.m_dataFormat == AE_FMT_S16BE) -+ m_sinkFormat.m_dataFormat = AE_FMT_S16NE; -+ else if (m_sinkFormat.m_dataFormat == AE_FMT_S32BE) -+ m_sinkFormat.m_dataFormat = AE_FMT_S32NE; -+#else -+ if (m_sinkFormat.m_dataFormat == AE_FMT_S16LE) -+ m_sinkFormat.m_dataFormat = AE_FMT_S16NE; -+ else if (m_sinkFormat.m_dataFormat == AE_FMT_S32LE) -+ m_sinkFormat.m_dataFormat = AE_FMT_S32NE; -+#endif +-#empty string with id 421 ++#: system/settings/settings.xml ++msgctxt "#421" ++msgid "Stream silence when idle" ++msgstr "" + + msgctxt "#422" + msgid "Delete album info" +@@ -12120,8 +12123,13 @@ msgctxt "#34110" + msgid "7.1" + msgstr "" + +-#empty strings from id 34111 to 34119 +-#34111-34119 reserved for future use ++#: system/settings/settings.xml ++msgctxt "#34111" ++msgid "When activated silence is output in order to keep alive receiver, otherwise sink is drained in idle state" ++msgstr "" + - CLog::Log(LOGDEBUG, "CActiveAE::OpenSink - %s Initialized:", m_sink->GetName()); - CLog::Log(LOGDEBUG, " Output Device : %s", m_deviceFriendlyName.c_str()); - CLog::Log(LOGDEBUG, " Sample Rate : %d", m_sinkFormat.m_sampleRate); --- -1.8.1.6 - - -From d3462ff7d97c254cc3f5378421e1507d4a19a29f Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Sun, 14 Jul 2013 17:48:23 +0200 -Subject: [PATCH 017/123] ActiveAE: always request float on sink if not raw - ---- - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -index dc79da7..c1ec6e5 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -@@ -1087,6 +1087,7 @@ void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &sett - } - else - { -+ format.m_dataFormat = AE_FMT_FLOAT; - if ((format.m_channelLayout.Count() > 2) || settings.stereoupmix) - { - switch (settings.channels) --- -1.8.1.6 - - -From 91ab13397e29e13fef220b3b8334f6062b73f63d Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Sun, 14 Jul 2013 18:34:47 +0200 -Subject: [PATCH 018/123] ActiveAE: set volume on sink if supported - ---- - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 8 +++++++- - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h | 1 + - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp | 14 ++++++++++++++ - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h | 3 +++ - 4 files changed, 25 insertions(+), 1 deletion(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -index c1ec6e5..a692d2b 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -@@ -146,6 +146,7 @@ bool CEngineStats::IsSuspended() - m_encoder = NULL; - m_audioCallback = NULL; - m_vizInitialized = false; -+ m_sinkHasVolume = false; ++#empty strings from id 34112 to 34119 ++#34112-34119 reserved for future use + + #: system/settings/settings.xml + msgctxt "#34120" +diff --git a/system/settings/settings.xml b/system/settings/settings.xml +index a468e97..f7d7f09 100644 +--- a/system/settings/settings.xml ++++ b/system/settings/settings.xml +@@ -2020,6 +2020,11 @@ + + + ++ ++ 2 ++ audiosupportsdrain ++ true ++ + + + +diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp +index d5517f3..5b1d2d6 100644 +--- a/xbmc/cores/AudioEngine/AEFactory.cpp ++++ b/xbmc/cores/AudioEngine/AEFactory.cpp +@@ -261,6 +261,14 @@ bool CAEFactory::SupportsRaw() + return false; } - CActiveAE::~CActiveAE() -@@ -217,6 +218,8 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) - return; - case CActiveAEControlProtocol::VOLUME: - m_volume = *(float*)msg->data; -+ if (m_sinkHasVolume) -+ m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::VOLUME, &m_volume, sizeof(float)); - return; - case CActiveAEControlProtocol::MUTE: - m_muted = *(bool*)msg->data; -@@ -752,6 +755,7 @@ void CActiveAE::Configure() - m_settings.driver = driver; - initSink = true; - m_stats.Reset(m_sinkFormat.m_sampleRate); -+ m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::VOLUME, &m_volume, sizeof(float)); - } - - if (m_silenceBuffers) -@@ -1181,6 +1185,7 @@ void CActiveAE::InitSink() - { - m_sinkFormat = *data; - } -+ m_sinkHasVolume = m_sink.HasVolume(); - reply->Release(); - } - else -@@ -1461,7 +1466,8 @@ bool CActiveAE::RunStages() - { - // mix gui sounds - MixSounds(*(out->pkt)); -- Deamplify(*(out->pkt)); -+ if (!m_sinkHasVolume) -+ Deamplify(*(out->pkt)); - - // viz - { -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -index 30da1ac..40a2870 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -@@ -314,6 +314,7 @@ class CActiveAE : public IAE, private CThread - - float m_volume; - bool m_muted; -+ bool m_sinkHasVolume; - - // viz - IAudioCallback *m_audioCallback; -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -index 0e003bd..2088cb6 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -@@ -39,6 +39,7 @@ - m_sink = NULL; - m_stats = NULL; - m_convertBuffer = NULL; -+ m_volume = 0.0; - } - - void CActiveAESink::Start() -@@ -88,6 +89,13 @@ bool CActiveAESink::IsCompatible(const AEAudioFormat format, const std::string & - return m_sink->IsCompatible(format, device); - } - -+bool CActiveAESink::HasVolume() ++bool CAEFactory::SupportsDrain() +{ -+ if (!m_sink) -+ return false; -+ return m_sink->HasVolume(); ++ if(AE) ++ return AE->SupportsDrain(); ++ ++ return false; +} + - enum SINK_STATES + void CAEFactory::SetMute(const bool enabled) { - S_TOP = 0, // 0 -@@ -232,6 +240,10 @@ void CActiveAESink::StateMachine(int signal, Protocol *port, Message *msg) - m_extTimeout = 0; - } - return; -+ case CSinkControlProtocol::VOLUME: -+ m_volume = *(float*)msg->data; -+ m_sink->SetVolume(m_volume); -+ return; - default: - break; - } -@@ -648,6 +660,8 @@ void CActiveAESink::OpenSink() - return; - } + if(AE) +diff --git a/xbmc/cores/AudioEngine/AEFactory.h b/xbmc/cores/AudioEngine/AEFactory.h +index 3059001..e427519 100644 +--- a/xbmc/cores/AudioEngine/AEFactory.h ++++ b/xbmc/cores/AudioEngine/AEFactory.h +@@ -54,6 +54,7 @@ class CAEFactory + static void VerifyOutputDevice(std::string &device, bool passthrough); + static std::string GetDefaultDevice(bool passthrough); + static bool SupportsRaw(); ++ static bool SupportsDrain(); + static void SetMute(const bool enabled); + static bool IsMuted(); + static float GetVolume(); +diff --git a/xbmc/cores/AudioEngine/Interfaces/AE.h b/xbmc/cores/AudioEngine/Interfaces/AE.h +index 5741cd8..52c4efc 100644 +--- a/xbmc/cores/AudioEngine/Interfaces/AE.h ++++ b/xbmc/cores/AudioEngine/Interfaces/AE.h +@@ -185,6 +185,12 @@ class IAE + */ + virtual bool SupportsRaw() { return false; } -+ m_sink->SetVolume(m_volume); ++ /** ++ * Returns true if the AudioEngine supports drain mode which is not streaming silence when idle ++ * @returns true if the AudioEngine is capable of drain mode ++ */ ++ virtual bool SupportsDrain() { return false; } + - #ifdef WORDS_BIGENDIAN - if (m_sinkFormat.m_dataFormat == AE_FMT_S16BE) - m_sinkFormat.m_dataFormat = AE_FMT_S16NE; -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h -index ae19f38..d36555d 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h -@@ -49,6 +49,7 @@ class CSinkControlProtocol : public Protocol - CONFIGURE, - UNCONFIGURE, - SILENCEMODE, -+ VOLUME, - TIMEOUT, - }; - enum InSignal -@@ -85,6 +86,7 @@ class CActiveAESink : private CThread - void Start(); - void Dispose(); - bool IsCompatible(const AEAudioFormat format, const std::string &device); -+ bool HasVolume(); - CSinkControlProtocol m_controlPort; - CSinkDataProtocol m_dataPort; + virtual void RegisterAudioCallback(IAudioCallback* pCallback) {} -@@ -128,6 +130,7 @@ class CActiveAESink : private CThread - IAESink *m_sink; - AEAudioFormat m_sinkFormat, m_requestedFormat; - CEngineStats *m_stats; -+ float m_volume; - }; + virtual void UnregisterAudioCallback() {} +diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp +index d8f6889..37174ac 100644 +--- a/xbmc/settings/Settings.cpp ++++ b/xbmc/settings/Settings.cpp +@@ -760,6 +760,9 @@ void CSettings::InitializeConditions() + if (g_application.IsStandAlone()) + m_settingsManager->AddCondition("isstandalone"); - } ++ if (CAEFactory::SupportsDrain()) ++ m_settingsManager->AddCondition("audiosupportsdrain"); ++ + // add more complex conditions + m_settingsManager->AddCondition("addonhassettings", AddonHasSettings); + m_settingsManager->AddCondition("checkmasterlock", CheckMasterLock); +@@ -852,6 +855,7 @@ void CSettings::InitializeISettingCallbacks() + settingSet.insert("audiooutput.multichannellpcm"); + settingSet.insert("audiooutput.audiodevice"); + settingSet.insert("audiooutput.passthroughdevice"); ++ settingSet.insert("audiooutput.streamsilence"); + settingSet.insert("lookandfeel.skin"); + settingSet.insert("lookandfeel.skinsettings"); + settingSet.insert("lookandfeel.font"); -- 1.8.1.6 -From 7b58c9ca0373097b89339304035a4a5edb05c1fe Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Sun, 14 Jul 2013 15:42:25 +0200 -Subject: [PATCH 019/123] ActiveAE: Remove special case - not needed anymore - after: 37b8fb75af29c071a47d1557fe7dfff0b0812dc4 +From 24e126184ae12557d73b044357e8d41d96e2c76f Mon Sep 17 00:00:00 2001 +From: unknown +Date: Tue, 16 Jul 2013 17:06:51 +0200 +Subject: [PATCH 018/136] ActiveAE: adjust to gui setting streamsilence --- - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp | 11 ++--------- - 1 file changed, 2 insertions(+), 9 deletions(-) + xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 13 ++++++++++++- + xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h | 1 + + xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp | 3 +-- + 3 files changed, 14 insertions(+), 3 deletions(-) +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +index 2defd1d..935f994 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +@@ -384,6 +384,11 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) + switch (signal) + { + case CActiveAEControlProtocol::RECONFIGURE: ++ if (m_streams.empty()) ++ { ++ bool silence = false; ++ m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::SILENCEMODE, &silence, sizeof(bool)); ++ } + LoadSettings(); + if (!NeedReconfigureBuffers() && !NeedReconfigureSink()) + return; +@@ -1815,7 +1820,8 @@ void CActiveAE::OnSettingsChange(const std::string& setting) + setting == "audiooutput.dtshdpassthrough" || + setting == "audiooutput.channels" || + setting == "audiooutput.multichannellpcm" || +- setting == "audiooutput.stereoupmix") ++ setting == "audiooutput.stereoupmix" || ++ setting == "audiooutput.streamsilence") + { + m_controlPort.SendOutMessage(CActiveAEControlProtocol::RECONFIGURE); + } +@@ -1826,6 +1832,11 @@ bool CActiveAE::SupportsRaw() + return true; + } + ++bool CActiveAE::SupportsDrain() ++{ ++ return true; ++} ++ + void CActiveAE::Shutdown() + { + Dispose(); +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h +index d5c5d97..9fc1b67 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h +@@ -213,6 +213,7 @@ class CActiveAE : public IAE, private CThread + virtual void EnumerateOutputDevices(AEDeviceList &devices, bool passthrough); + virtual std::string GetDefaultDevice(bool passthrough); + virtual bool SupportsRaw(); ++ virtual bool SupportsDrain(); + + virtual void RegisterAudioCallback(IAudioCallback* pCallback); + virtual void UnregisterAudioCallback(); diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -index 2088cb6..7812c02 100644 +index c22bb88..9af241d 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -@@ -826,14 +826,7 @@ void CActiveAESink::GenerateNoise() - noise[i] = (float) sqrt( -2.0f * log( R1 )) * cos( 2.0f * PI * R2 ) * 0.00001; - } +@@ -26,7 +26,6 @@ + #include "ActiveAE.h" -- if (m_sinkFormat.m_dataFormat != AE_FMT_FLOAT) -- { -- CAEConvert::AEConvertFrFn convertFn = CAEConvert::FrFloat(m_sinkFormat.m_dataFormat); -- convertFn(noise, nb_floats, m_sampleOfNoise.pkt->data[0]); -- } -- else -- { -- memcpy(m_sampleOfNoise.pkt->data[0], noise, nb_floats*sizeof(float)); -- } -+ CAEConvert::AEConvertFrFn convertFn = CAEConvert::FrFloat(m_sinkFormat.m_dataFormat); -+ convertFn(noise, nb_floats, m_sampleOfNoise.pkt->data[0]); - delete [] noise; - } + #include "settings/Settings.h" +-#include "settings/AdvancedSettings.h" + + using namespace ActiveAE; + +@@ -229,7 +228,7 @@ void CActiveAESink::StateMachine(int signal, Protocol *port, Message *msg) + { + case CSinkControlProtocol::SILENCEMODE: + m_extSilence = *(bool*)msg->data; +- if (g_advancedSettings.m_streamSilence) ++ if (CSettings::Get().GetBool("audiooutput.streamsilence")) + m_extSilence = true; + if (m_extSilence) + { -- 1.8.1.6 -From e7a30953e4fab54b252fb66f9d48720bf31abe1e Mon Sep 17 00:00:00 2001 +From d186405dca4ab5c17f5cf5e30aca8ca0c4ac9b9a Mon Sep 17 00:00:00 2001 +From: wsoltys +Date: Tue, 16 Jul 2013 21:17:38 +0200 +Subject: [PATCH 019/136] [WIN32][WASAPI]: made wasapi sink accept default as + device string. set "wasapi:default" as default gui string (could be smarter + when handled via the xml system. possible?) + +--- + xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp | 61 +++++++++++++++++---------- + xbmc/settings/Settings.cpp | 3 ++ + 2 files changed, 41 insertions(+), 23 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp +index 8a3d7ce..8995a0c 100644 +--- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp ++++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp +@@ -34,6 +34,7 @@ + #include "../Utils/AEDeviceInfo.h" + #include + #include ++#include "utils/StringUtils.h" + + #pragma comment(lib, "Avrt.lib") + +@@ -206,6 +207,7 @@ bool CAESinkWASAPI::Initialize(AEAudioFormat &format, std::string &device) + return false; + + m_device = device; ++ bool bdefault = false; + + /* Save requested format */ + /* Clear returned format */ +@@ -227,41 +229,47 @@ bool CAESinkWASAPI::Initialize(AEAudioFormat &format, std::string &device) + hr = pEnumDevices->GetCount(&uiCount); + EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of audio endpoint count failed.") + +- for (UINT i = 0; i < uiCount; i++) ++ if(StringUtils::EndsWith(device, std::string("default"))) ++ bdefault = true; ++ ++ if(!bdefault) + { +- IPropertyStore *pProperty = NULL; +- PROPVARIANT varName; ++ for (UINT i = 0; i < uiCount; i++) ++ { ++ IPropertyStore *pProperty = NULL; ++ PROPVARIANT varName; + +- hr = pEnumDevices->Item(i, &m_pDevice); +- EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of WASAPI endpoint failed.") ++ hr = pEnumDevices->Item(i, &m_pDevice); ++ EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of WASAPI endpoint failed.") + +- hr = m_pDevice->OpenPropertyStore(STGM_READ, &pProperty); +- EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of WASAPI endpoint properties failed.") ++ hr = m_pDevice->OpenPropertyStore(STGM_READ, &pProperty); ++ EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of WASAPI endpoint properties failed.") + +- hr = pProperty->GetValue(PKEY_AudioEndpoint_GUID, &varName); +- if (FAILED(hr)) +- { +- CLog::Log(LOGERROR, __FUNCTION__": Retrieval of WASAPI endpoint GUID failed."); +- SAFE_RELEASE(pProperty); +- goto failed; +- } ++ hr = pProperty->GetValue(PKEY_AudioEndpoint_GUID, &varName); ++ if (FAILED(hr)) ++ { ++ CLog::Log(LOGERROR, __FUNCTION__": Retrieval of WASAPI endpoint GUID failed."); ++ SAFE_RELEASE(pProperty); ++ goto failed; ++ } + +- std::string strDevName = localWideToUtf(varName.pwszVal); ++ std::string strDevName = localWideToUtf(varName.pwszVal); + +- if (device == strDevName) +- i = uiCount; +- else +- SAFE_RELEASE(m_pDevice); ++ if (device == strDevName) ++ i = uiCount; ++ else ++ SAFE_RELEASE(m_pDevice); + +- PropVariantClear(&varName); +- SAFE_RELEASE(pProperty); ++ PropVariantClear(&varName); ++ SAFE_RELEASE(pProperty); ++ } + } +- + SAFE_RELEASE(pEnumDevices); + + if (!m_pDevice) + { +- CLog::Log(LOGINFO, __FUNCTION__": Could not locate the device named \"%s\" in the list of WASAPI endpoint devices. Trying the default device...", device.c_str()); ++ if(!bdefault) ++ CLog::Log(LOGINFO, __FUNCTION__": Could not locate the device named \"%s\" in the list of WASAPI endpoint devices. Trying the default device...", device.c_str()); + hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_pDevice); + EXIT_ON_FAILURE(hr, __FUNCTION__": Could not retrieve the default WASAPI audio endpoint.") + +@@ -583,6 +591,13 @@ void CAESinkWASAPI::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bool fo + WAVEFORMATEXTENSIBLE wfxex = {0}; + HRESULT hr; + ++ // add default device entry ++ deviceInfo.m_deviceName = std::string("default"); ++ deviceInfo.m_displayName = std::string("default"); ++ ++ /* Store the device info */ ++ deviceInfoList.push_back(deviceInfo); ++ + hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void**)&pEnumerator); + EXIT_ON_FAILURE(hr, __FUNCTION__": Could not allocate WASAPI device enumerator. CoCreateInstance error code: %li", hr) + +diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp +index 37174ac..5df9d09 100644 +--- a/xbmc/settings/Settings.cpp ++++ b/xbmc/settings/Settings.cpp +@@ -642,6 +642,9 @@ void CSettings::InitializeDefaults() + ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(defaultAudioDeviceName); + ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(defaultAudioDeviceName); + #endif ++#elif defined(TARGET_WINDOWS) ++ ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(std::string("WASAPI:default")); ++ ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(std::string("WASAPI:default")); + #else + ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(CAEFactory::GetDefaultDevice(false)); + ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(CAEFactory::GetDefaultDevice(true)); +-- +1.8.1.6 + + +From cbedd31759624e0b4f79b1d3d07fa525f1266cf0 Mon Sep 17 00:00:00 2001 +From: wsoltys +Date: Tue, 16 Jul 2013 21:41:50 +0200 +Subject: [PATCH 020/136] [WIN32] changed: use the new settings system instead + of hardcoded values. + +--- + system/settings/win32.xml | 28 ++++++++++++++++++++++++++++ + xbmc/settings/Settings.cpp | 5 +---- + 2 files changed, 29 insertions(+), 4 deletions(-) + +diff --git a/system/settings/win32.xml b/system/settings/win32.xml +index 76bc2bf..1e0a97b 100644 +--- a/system/settings/win32.xml ++++ b/system/settings/win32.xml +@@ -39,5 +39,33 @@ + + + ++ ++ ++ ++ 2 ++ WASAPI:default ++ ++ audiodevices ++ ++ ++ ++ ++ 2 ++ WASAPI:default ++ ++ audiodevicespassthrough ++ ++ ++ ++ ++ 1 ++ 2 ++ ++ ++ ++ ++ ++ ++ + + +diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp +index 5df9d09..436c34a 100644 +--- a/xbmc/settings/Settings.cpp ++++ b/xbmc/settings/Settings.cpp +@@ -642,10 +642,7 @@ void CSettings::InitializeDefaults() + ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(defaultAudioDeviceName); + ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(defaultAudioDeviceName); + #endif +-#elif defined(TARGET_WINDOWS) +- ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(std::string("WASAPI:default")); +- ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(std::string("WASAPI:default")); +-#else ++#elif !defined(TARGET_WINDOWS) + ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(CAEFactory::GetDefaultDevice(false)); + ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(CAEFactory::GetDefaultDevice(true)); + #endif +-- +1.8.1.6 + + +From 5110d1fcdf43c9be249e6e4d8bd4c322191c86ef Mon Sep 17 00:00:00 2001 +From: unknown +Date: Thu, 18 Jul 2013 08:35:29 +0200 +Subject: [PATCH 021/136] AE: WASAPI, DirectSound - allow engine to provide + less samples than buffer size + +--- + xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp | 3 +- + xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp | 36 +++++++++++++++++++--- + xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h | 3 ++ + 3 files changed, 37 insertions(+), 5 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp +index 797d7f2..81f2c4c 100644 +--- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp ++++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp +@@ -403,7 +403,8 @@ unsigned int CAESinkDirectSound::AddPackets(uint8_t *data, unsigned int frames, + DWORD size = 0, sizeWrap = 0; + if (m_BufferOffset >= m_dwBufferLen) // Wrap-around manually + m_BufferOffset = 0; +- HRESULT res = m_pBuffer->Lock(m_BufferOffset, m_dwChunkSize, &start, &size, &startWrap, &sizeWrap, 0); ++ DWORD dwWriteBytes = std::min((int)m_dwChunkSize, (int)len); ++ HRESULT res = m_pBuffer->Lock(m_BufferOffset, dwWriteBytes, &start, &size, &startWrap, &sizeWrap, 0); + if (DS_OK != res) + { + CLog::Log(LOGERROR, __FUNCTION__ ": Unable to lock buffer at offset %u. HRESULT: 0x%08x", m_BufferOffset, res); +diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp +index 8995a0c..78db727 100644 +--- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp ++++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp +@@ -191,7 +191,9 @@ CStdStringA localWideToUtf(LPCWSTR wstr) + m_isDirty(false), + m_uiBufferLen(0), + m_avgTimeWaiting(50), +- m_sinkLatency(0.0) ++ m_sinkLatency(0.0), ++ m_pBuffer(NULL), ++ m_bufferPtr(0) + { + m_channelLayout.Reset(); + } +@@ -315,6 +317,14 @@ bool CAESinkWASAPI::Initialize(AEAudioFormat &format, std::string &device) + m_initialized = true; + m_isDirty = false; + ++ // allow feeding less samples than buffer size ++ // if the device is opened exclusive and event driven, provided samples must match buffersize ++ // ActiveAE tries to align provided samples with buffer size but cannot guarantee (e.g. transcoding) ++ // this can be avoided by dropping the event mode which has not much benefit; SoftAE polls anyway ++ delete [] m_pBuffer; ++ m_pBuffer = new uint8_t[format.m_frames * format.m_frameSize]; ++ m_bufferPtr = 0; ++ + return true; + + failed: +@@ -359,6 +369,9 @@ void CAESinkWASAPI::Deinitialize() + SAFE_RELEASE(m_pDevice); + + m_initialized = false; ++ ++ delete [] m_pBuffer; ++ m_bufferPtr = 0; + } + + bool CAESinkWASAPI::IsCompatible(const AEAudioFormat format, const std::string &device) +@@ -446,7 +459,15 @@ unsigned int CAESinkWASAPI::AddPackets(uint8_t *data, unsigned int frames, bool + LARGE_INTEGER timerFreq; + #endif + +- unsigned int NumFramesRequested = frames; ++ unsigned int NumFramesRequested = m_format.m_frames; ++ unsigned int FramesToCopy = std::min(m_format.m_frames - m_bufferPtr, frames); ++ if (m_bufferPtr != 0 || frames != m_format.m_frames) ++ { ++ memcpy(m_pBuffer+m_bufferPtr*m_format.m_frameSize, data, FramesToCopy*m_format.m_frameSize); ++ m_bufferPtr += FramesToCopy; ++ if (frames != m_format.m_frames) ++ return frames; ++ } + + if (!m_running) //first time called, pre-fill buffer then start audio client + { +@@ -547,7 +568,8 @@ unsigned int CAESinkWASAPI::AddPackets(uint8_t *data, unsigned int frames, bool + #endif + return INT_MAX; + } +- memcpy(buf, data, NumFramesRequested * m_format.m_frameSize); //fill buffer ++ memcpy(buf, m_bufferPtr == 0 ? data : m_pBuffer, NumFramesRequested * m_format.m_frameSize); //fill buffer ++ m_bufferPtr = 0; + hr = m_pRenderClient->ReleaseBuffer(NumFramesRequested, flags); //pass back to audio driver + if (FAILED(hr)) + { +@@ -557,7 +579,13 @@ unsigned int CAESinkWASAPI::AddPackets(uint8_t *data, unsigned int frames, bool + return INT_MAX; + } + +- return NumFramesRequested; ++ if (FramesToCopy != frames) ++ { ++ m_bufferPtr = frames-FramesToCopy; ++ memcpy(m_pBuffer, data+FramesToCopy*m_format.m_frameSize, m_bufferPtr*m_format.m_frameSize); ++ } ++ ++ return frames; + } + + bool CAESinkWASAPI::SoftSuspend() +diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h +index c4a5a51..37cfd68 100644 +--- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h ++++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h +@@ -78,4 +78,7 @@ class CAESinkWASAPI : public IAESink + unsigned int m_uiBufferLen; /* wasapi endpoint buffer size, in frames */ + double m_avgTimeWaiting; /* time between next buffer of data from SoftAE and driver call for data */ + double m_sinkLatency; /* time in seconds of total duration of the two WASAPI buffers */ ++ ++ uint8_t *m_pBuffer; ++ int m_bufferPtr; + }; +-- +1.8.1.6 + + +From 2c7cac05924a2de5dd338e4751c6981a0172190b Mon Sep 17 00:00:00 2001 +From: unknown +Date: Fri, 19 Jul 2013 15:08:33 +0200 +Subject: [PATCH 022/136] AE: DirectSound - implement drain method + +--- + xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp | 25 ++++++++++++++++------ + xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h | 1 + + 2 files changed, 20 insertions(+), 6 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp +index 81f2c4c..5c5e015 100644 +--- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp ++++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp +@@ -442,6 +442,23 @@ void CAESinkDirectSound::Stop() + m_pBuffer->Stop(); + } + ++void CAESinkDirectSound::Drain() ++{ ++ if (!m_initialized || m_isDirtyDS) ++ return; ++ ++ m_pBuffer->Stop(); ++ HRESULT res = m_pBuffer->SetCurrentPosition(0); ++ if (DS_OK != res) ++ { ++ CLog::Log(LOGERROR,__FUNCTION__ ": SetCurrentPosition failed. Unable to determine buffer status. HRESULT = 0x%08x", res); ++ m_isDirtyDS = true; ++ return; ++ } ++ m_BufferOffset = 0; ++ UpdateCacheStatus(); ++} ++ + double CAESinkDirectSound::GetDelay() + { + if (!m_initialized) +@@ -683,10 +700,6 @@ void CAESinkDirectSound::CheckPlayStatus() + bool CAESinkDirectSound::UpdateCacheStatus() + { + CSingleLock lock (m_runLock); +- // TODO: Check to see if we may have cycled around since last time +- unsigned int time = XbmcThreads::SystemClockMillis(); +- if (time == m_LastCacheCheck) +- return true; // Don't recalc more frequently than once/ms (that is our max resolution anyway) + + DWORD playCursor = 0, writeCursor = 0; + HRESULT res = m_pBuffer->GetCurrentPosition(&playCursor, &writeCursor); // Get the current playback and safe write positions +@@ -697,7 +710,6 @@ bool CAESinkDirectSound::UpdateCacheStatus() + return false; + } + +- m_LastCacheCheck = time; + // Check the state of the ring buffer (P->O->W == underrun) + // These are the logical situations that can occur + // O: CurrentOffset W: WriteCursor P: PlayCursor +@@ -729,7 +741,8 @@ bool CAESinkDirectSound::UpdateCacheStatus() + return false; + } + } +- else m_BufferTimeouts = 0; ++ else ++ m_BufferTimeouts = 0; + + // Calculate available space in the ring buffer + if (playCursor == m_BufferOffset && m_BufferOffset == writeCursor) // Playback is stopped and we are all at the same place +diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h +index 8ff098d..a6f2912 100644 +--- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h ++++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h +@@ -39,6 +39,7 @@ class CAESinkDirectSound : public IAESink + virtual bool IsCompatible(const AEAudioFormat format, const std::string &device); + + virtual void Stop (); ++ virtual void Drain (); + virtual double GetDelay (); + virtual double GetCacheTime (); + virtual double GetCacheTotal (); +-- +1.8.1.6 + + +From 2670e1379f99dc5952bbe073eb9379640747a49d Mon Sep 17 00:00:00 2001 +From: wsoltys +Date: Thu, 18 Jul 2013 18:13:02 +0200 +Subject: [PATCH 023/136] [WIN32][WASAPI] created a drain method. + +--- + xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp | 27 ++++++++++++++++++++++++++- + xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h | 2 ++ + 2 files changed, 28 insertions(+), 1 deletion(-) + +diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp +index 78db727..8c8bc1f 100644 +--- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp ++++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp +@@ -193,7 +193,8 @@ CStdStringA localWideToUtf(LPCWSTR wstr) + m_avgTimeWaiting(50), + m_sinkLatency(0.0), + m_pBuffer(NULL), +- m_bufferPtr(0) ++ m_bufferPtr(0), ++ m_hnsRequestedDuration(0) + { + m_channelLayout.Reset(); + } +@@ -1161,6 +1162,8 @@ bool CAESinkWASAPI::InitializeExclusive(AEAudioFormat &format) + hr = m_pAudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST, + audioSinkBufferDurationMsec, audioSinkBufferDurationMsec, &wfxex.Format, NULL); + ++ m_hnsRequestedDuration = audioSinkBufferDurationMsec; ++ + if (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) + { + /* WASAPI requires aligned buffer */ +@@ -1290,3 +1293,25 @@ const char *CAESinkWASAPI::WASAPIErrToStr(HRESULT err) + } + return NULL; + } ++ ++void CAESinkWASAPI::Drain() ++{ ++ if(!m_pAudioClient) ++ return; ++ ++ Sleep( (DWORD)(m_hnsRequestedDuration / 10000)); ++ ++ if (m_running) ++ { ++ try ++ { ++ m_pAudioClient->Stop(); //stop the audio output ++ m_pAudioClient->Reset(); //flush buffer and reset audio clock stream position ++ } ++ catch (...) ++ { ++ CLog::Log(LOGDEBUG, __FUNCTION__, "Invalidated AudioClient - Releasing"); ++ } ++ } ++ m_running = false; ++} +diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h +index 37cfd68..39d62d5 100644 +--- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h ++++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h +@@ -45,6 +45,7 @@ class CAESinkWASAPI : public IAESink + virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false); + virtual bool SoftSuspend (); + virtual bool SoftResume (); ++ virtual void Drain (); + static void EnumerateDevicesEx (AEDeviceInfoList &deviceInfoList, bool force = false); + private: + bool InitializeExclusive(AEAudioFormat &format); +@@ -81,4 +82,5 @@ class CAESinkWASAPI : public IAESink + + uint8_t *m_pBuffer; + int m_bufferPtr; ++ REFERENCE_TIME m_hnsRequestedDuration; + }; +-- +1.8.1.6 + + +From 191da169f9bb67d2ecd77a6655115772b53b357b Mon Sep 17 00:00:00 2001 +From: wsoltys +Date: Thu, 18 Jul 2013 20:35:08 +0200 +Subject: [PATCH 024/136] [WIN32][DirectSound] added fake entry default and + make sink understand it. + +--- + xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp | 50 ++++++++++++++-------- + 1 file changed, 31 insertions(+), 19 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp +index 5c5e015..da98e1f 100644 +--- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp ++++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp +@@ -35,6 +35,7 @@ + #include + #include + #include "cores/AudioEngine/Utils/AEUtil.h" ++#include "utils/StringUtils.h" + #pragma comment(lib, "Rpcrt4.lib") + + extern HWND g_hWnd; +@@ -143,10 +144,14 @@ bool CAESinkDirectSound::Initialize(AEAudioFormat &format, std::string &device) + LPGUID deviceGUID = NULL; + RPC_CSTR wszUuid = NULL; + HRESULT hr = E_FAIL; ++ std::string strDeviceGUID = device; + std::list DSDeviceList; + std::string deviceFriendlyName; + DirectSoundEnumerate(DSEnumCallback, &DSDeviceList); + ++ if(StringUtils::EndsWith(device, std::string("default"))) ++ strDeviceGUID = GetDefaultDevice(); ++ + for (std::list::iterator itt = DSDeviceList.begin(); itt != DSDeviceList.end(); ++itt) + { + if ((*itt).lpGuid) +@@ -154,23 +159,27 @@ bool CAESinkDirectSound::Initialize(AEAudioFormat &format, std::string &device) + hr = (UuidToString((*itt).lpGuid, &wszUuid)); + std::string sztmp = (char*)wszUuid; + std::string szGUID = "{" + std::string(sztmp.begin(), sztmp.end()) + "}"; +- if (strcasecmp(szGUID.c_str(), device.c_str()) == 0) ++ if (strcasecmp(szGUID.c_str(), strDeviceGUID.c_str()) == 0) + { + deviceGUID = (*itt).lpGuid; + deviceFriendlyName = (*itt).name.c_str(); + break; + } + } +- if (hr == RPC_S_OK) RpcStringFree(&wszUuid); ++ if (hr == RPC_S_OK) RpcStringFree(&wszUuid); + } + + hr = DirectSoundCreate(deviceGUID, &m_pDSound, NULL); + + if (FAILED(hr)) + { +- CLog::Log(LOGERROR, __FUNCTION__": Failed to create the DirectSound device."); +- CLog::Log(LOGERROR, __FUNCTION__": DSErr: %s", dserr2str(hr)); +- return false; ++ CLog::Log(LOGERROR, __FUNCTION__": Failed to create the DirectSound device %s with error %s, trying the default device.", deviceFriendlyName.c_str(), dserr2str(hr)); ++ hr = DirectSoundCreate(NULL, &m_pDSound, NULL); ++ if (FAILED(hr)) ++ { ++ CLog::Log(LOGERROR, __FUNCTION__": Failed to create the default DirectSound device with error %s.", dserr2str(hr)); ++ return false; ++ } + } + + HWND tmp_hWnd; +@@ -501,6 +510,8 @@ void CAESinkDirectSound::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bo + + HRESULT hr; + ++ std::string strDD = GetDefaultDevice(); ++ + /* See if we are on Windows XP */ + if (!g_sysinfo.IsWindowsVersionAtLeast(CSysInfo::WindowsVersionVista)) + { +@@ -535,6 +546,15 @@ void CAESinkDirectSound::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bo + deviceInfo.m_sampleRates.push_back((DWORD) 96000); + + deviceInfoList.push_back(deviceInfo); ++ ++ // add the default device with m_deviceName = default ++ if(strDD == deviceInfo.m_deviceName) ++ { ++ deviceInfo.m_deviceName = std::string("default"); ++ deviceInfo.m_displayName = std::string("default"); ++ deviceInfo.m_displayNameExtra = std::string(""); ++ deviceInfoList.push_back(deviceInfo); ++ } + } + + RpcStringFree(&cszGUID); +@@ -650,22 +670,14 @@ void CAESinkDirectSound::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bo + deviceInfo.m_deviceType = aeDeviceType; + + deviceInfoList.push_back(deviceInfo); +- } + +- // since AE takes the first device in deviceInfoList as default audio device we need +- // to sort it in order to use the real default device +- if(deviceInfoList.size() > 1) +- { +- std::string strDD = GetDefaultDevice(); +- for (AEDeviceInfoList::iterator itt = deviceInfoList.begin(); itt != deviceInfoList.end(); ++itt) ++ // add the default device with m_deviceName = default ++ if(strDD == strDevName) + { +- CAEDeviceInfo devInfo = *itt; +- if(devInfo.m_deviceName == strDD) +- { +- deviceInfoList.erase(itt); +- deviceInfoList.insert(deviceInfoList.begin(), devInfo); +- break; +- } ++ deviceInfo.m_deviceName = std::string("default"); ++ deviceInfo.m_displayName = std::string("default"); ++ deviceInfo.m_displayNameExtra = std::string(""); ++ deviceInfoList.push_back(deviceInfo); + } + } + +-- +1.8.1.6 + + +From ff5caa443be03aefb654f7adb81aadb1a43b9ec4 Mon Sep 17 00:00:00 2001 +From: wsoltys +Date: Tue, 23 Jul 2013 19:03:43 +0200 +Subject: [PATCH 025/136] [WIN32][WASAPI] cosmetics: fill the default device + with proper values. + +--- + xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp | 40 ++++++++++++++++++++------- + 1 file changed, 30 insertions(+), 10 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp +index 8c8bc1f..38065cd 100644 +--- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp ++++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp +@@ -614,24 +614,32 @@ void CAESinkWASAPI::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bool fo + { + IMMDeviceEnumerator* pEnumerator = NULL; + IMMDeviceCollection* pEnumDevices = NULL; ++ IMMDevice* pDefaultDevice = NULL; + CAEDeviceInfo deviceInfo; + CAEChannelInfo deviceChannels; ++ LPWSTR pwszID = NULL; ++ std::wstring wstrDDID; + + WAVEFORMATEXTENSIBLE wfxex = {0}; + HRESULT hr; + +- // add default device entry +- deviceInfo.m_deviceName = std::string("default"); +- deviceInfo.m_displayName = std::string("default"); +- +- /* Store the device info */ +- deviceInfoList.push_back(deviceInfo); +- + hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void**)&pEnumerator); + EXIT_ON_FAILURE(hr, __FUNCTION__": Could not allocate WASAPI device enumerator. CoCreateInstance error code: %li", hr) + + UINT uiCount = 0; + ++ // get the default audio endpoint ++ if(pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDefaultDevice) == S_OK) ++ { ++ if(pDefaultDevice->GetId(&pwszID) == S_OK) ++ { ++ wstrDDID = pwszID; ++ CoTaskMemFree(pwszID); ++ } ++ SAFE_RELEASE(pDefaultDevice); ++ } ++ ++ // enumerate over all audio endpoints + hr = pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pEnumDevices); + EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of audio endpoint enumeration failed.") + +@@ -903,9 +911,6 @@ void CAESinkWASAPI::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bool fo + CLog::Log(LOGDEBUG, __FUNCTION__": Failed to activate device for passthrough capability testing."); + } + +- SAFE_RELEASE(pDevice); +- SAFE_RELEASE(pProperty); +- + deviceInfo.m_deviceName = strDevName; + deviceInfo.m_displayName = strWinDevType.append(strFriendlyName); + deviceInfo.m_displayNameExtra = std::string("WASAPI: ").append(strFriendlyName); +@@ -914,6 +919,21 @@ void CAESinkWASAPI::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bool fo + + /* Store the device info */ + deviceInfoList.push_back(deviceInfo); ++ ++ if(pDevice->GetId(&pwszID) == S_OK) ++ { ++ if(wstrDDID.compare(pwszID) == 0) ++ { ++ deviceInfo.m_deviceName = std::string("default"); ++ deviceInfo.m_displayName = std::string("default"); ++ deviceInfo.m_displayNameExtra = std::string(""); ++ deviceInfoList.push_back(deviceInfo); ++ } ++ CoTaskMemFree(pwszID); ++ } ++ ++ SAFE_RELEASE(pDevice); ++ SAFE_RELEASE(pProperty); + } + return; + +-- +1.8.1.6 + + +From 46ccc94ce275c574a6eb5bc5f301b79b14fd8e14 Mon Sep 17 00:00:00 2001 +From: Rainer Hochecker +Date: Sat, 27 Jul 2013 08:44:13 +0200 +Subject: [PATCH 026/136] AE: add quality setting for engine which support it + +--- + language/English/strings.po | 35 +++++++++++++++++++++++++++++++--- + system/settings/settings.xml | 13 +++++++++++++ + xbmc/cores/AudioEngine/AEFactory.cpp | 8 ++++++++ + xbmc/cores/AudioEngine/AEFactory.h | 1 + + xbmc/cores/AudioEngine/Interfaces/AE.h | 6 ++++++ + xbmc/settings/Settings.cpp | 4 ++++ + 6 files changed, 64 insertions(+), 3 deletions(-) + +diff --git a/language/English/strings.po b/language/English/strings.po +index c2c562f..40fbb74 100644 +--- a/language/English/strings.po ++++ b/language/English/strings.po +@@ -12154,8 +12154,32 @@ msgctxt "#34123" + msgid "Never" + msgstr "" + +-#empty strings from id 34124 to 34200 +-#34124-34200 reserved for future use ++#. Resampling quality ++#: system/settings/settings.xml ++msgctxt "#34124" ++msgid "Resampling Quality" ++msgstr "" ++ ++#. Resampling quality ++#: system/settings/settings.xml ++msgctxt "#34125" ++msgid "Low" ++msgstr "" ++ ++#. Resampling quality ++#: system/settings/settings.xml ++msgctxt "#34126" ++msgid "Normal" ++msgstr "" ++ ++#. Resampling quality ++#: system/settings/settings.xml ++msgctxt "#34127" ++msgid "High" ++msgstr "" ++ ++#empty strings from id 34128 to 34200 ++#34128-34200 reserved for future use + + #: xbmc\PlayListPlayer.cpp + msgctxt "#34201" +@@ -14140,7 +14164,12 @@ msgctxt "#36420" + msgid "No info available yet." + msgstr "" + +-#empty strings from id 36421 to 36999 ++#: system/settings/settings.xml ++msgctxt "#36421" ++msgid "Resampling Quality, higher quality puts higher load on CPU" ++msgstr "" ++ ++#empty strings from id 36422 to 36999 + #end reservation + + #: xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp +diff --git a/system/settings/settings.xml b/system/settings/settings.xml +index f7d7f09..461e787 100644 +--- a/system/settings/settings.xml ++++ b/system/settings/settings.xml +@@ -1950,6 +1950,19 @@ + + + ++ ++ 2 ++ audiosupportsquality ++ 1 ++ ++ ++ ++ ++ ++ ++ ++ ++ + + 2 + true +diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp +index 5b1d2d6..250056e 100644 +--- a/xbmc/cores/AudioEngine/AEFactory.cpp ++++ b/xbmc/cores/AudioEngine/AEFactory.cpp +@@ -269,6 +269,14 @@ bool CAEFactory::SupportsDrain() + return false; + } + ++bool CAEFactory::SupportsQuality() ++{ ++ if(AE) ++ return AE->SupportsQuality(); ++ ++ return false; ++} ++ + void CAEFactory::SetMute(const bool enabled) + { + if(AE) +diff --git a/xbmc/cores/AudioEngine/AEFactory.h b/xbmc/cores/AudioEngine/AEFactory.h +index e427519..26efe9f 100644 +--- a/xbmc/cores/AudioEngine/AEFactory.h ++++ b/xbmc/cores/AudioEngine/AEFactory.h +@@ -55,6 +55,7 @@ class CAEFactory + static std::string GetDefaultDevice(bool passthrough); + static bool SupportsRaw(); + static bool SupportsDrain(); ++ static bool SupportsQuality(); + static void SetMute(const bool enabled); + static bool IsMuted(); + static float GetVolume(); +diff --git a/xbmc/cores/AudioEngine/Interfaces/AE.h b/xbmc/cores/AudioEngine/Interfaces/AE.h +index 52c4efc..69cfc5e 100644 +--- a/xbmc/cores/AudioEngine/Interfaces/AE.h ++++ b/xbmc/cores/AudioEngine/Interfaces/AE.h +@@ -191,6 +191,12 @@ class IAE + */ + virtual bool SupportsDrain() { return false; } + ++ /** ++ * Returns true if the AudioEngine supports setting resample quality ++ * @returns true if the AudioEngine is capable of changing resample quality ++ */ ++ virtual bool SupportsQuality() { return false; } ++ + virtual void RegisterAudioCallback(IAudioCallback* pCallback) {} + + virtual void UnregisterAudioCallback() {} +diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp +index 436c34a..3f7dfaf 100644 +--- a/xbmc/settings/Settings.cpp ++++ b/xbmc/settings/Settings.cpp +@@ -763,6 +763,9 @@ void CSettings::InitializeConditions() + if (CAEFactory::SupportsDrain()) + m_settingsManager->AddCondition("audiosupportsdrain"); + ++ if (CAEFactory::SupportsQuality()) ++ m_settingsManager->AddCondition("audiosupportsquality"); ++ + // add more complex conditions + m_settingsManager->AddCondition("addonhassettings", AddonHasSettings); + m_settingsManager->AddCondition("checkmasterlock", CheckMasterLock); +@@ -856,6 +859,7 @@ void CSettings::InitializeISettingCallbacks() + settingSet.insert("audiooutput.audiodevice"); + settingSet.insert("audiooutput.passthroughdevice"); + settingSet.insert("audiooutput.streamsilence"); ++ settingSet.insert("audiooutput.resamplequality"); + settingSet.insert("lookandfeel.skin"); + settingSet.insert("lookandfeel.skinsettings"); + settingSet.insert("lookandfeel.font"); +-- +1.8.1.6 + + +From 4803c2f384aab14d1548015e989e496f1b1e84c2 Mon Sep 17 00:00:00 2001 +From: fritsch +Date: Thu, 25 Jul 2013 19:40:27 +0200 +Subject: [PATCH 027/136] ActiveAE: Prepare LOW, NORMAL, HIGH quality settings + for resampler + +--- + .../AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp | 18 +++++++++++++++++- + .../AudioEngine/Engines/ActiveAE/ActiveAEResample.h | 7 ++++++- + 2 files changed, 23 insertions(+), 2 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp +index aee3bfc..3412338 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp +@@ -36,7 +36,7 @@ + m_dllSwResample.Unload(); + } + +-bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout) ++bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout, int quality) + { + if (!m_dllAvUtil.Load() || !m_dllSwResample.Load()) + return false; +@@ -58,6 +58,22 @@ bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst + m_pContext = m_dllSwResample.swr_alloc_set_opts(NULL, m_dst_chan_layout, m_dst_fmt, m_dst_rate, + m_src_chan_layout, m_src_fmt, m_src_rate, + 0, NULL); ++ if(quality == AE_SWR_HIGH_QUALITY) ++ { ++ m_dllAvUtil.av_opt_set_double(m_pContext, "cutoff", 1.0, 0); ++ m_dllAvUtil.av_opt_set_int(m_pContext,"filter_size", 256, 0); ++ } ++ else if(quality == AE_SWR_NORMAL_QUALITY) ++ { ++ // 0.97 is default cutoff so use (1.0 - 0.97) / 2.0 + 0.97 ++ m_dllAvUtil.av_opt_set_double(m_pContext, "cutoff", 0.985, 0); ++ m_dllAvUtil.av_opt_set_int(m_pContext,"filter_size", 64, 0); ++ } ++ else if(quality == AE_SWR_LOW_QUALITY) ++ { ++ m_dllAvUtil.av_opt_set_double(m_pContext, "cutoff", 0.97, 0); ++ m_dllAvUtil.av_opt_set_int(m_pContext,"filter_size", 32, 0); ++ } + + if(!m_pContext) + { +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h +index fa95a1d..baa4ef3 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h +@@ -25,6 +25,11 @@ + #include "AEAudioFormat.h" + #include "ActiveAEBuffer.h" + ++// This is for the Audiophiles ++#define AE_SWR_LOW_QUALITY 0 ++#define AE_SWR_NORMAL_QUALITY 1 ++#define AE_SWR_HIGH_QUALITY 2 ++ + namespace ActiveAE + { + +@@ -33,7 +38,7 @@ class CActiveAEResample + public: + CActiveAEResample(); + virtual ~CActiveAEResample(); +- bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout = NULL); ++ bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout = NULL, int quality = AE_SWR_NORMAL_QUALITY); + int Resample(uint8_t **dst_buffer, int dst_samples, uint8_t **src_buffer, int src_samples); + int64_t GetDelay(int64_t base); + int GetBufferedSamples(); +-- +1.8.1.6 + + +From f8639455cc640b92a08b8dd2f1927b4ed2eac743 Mon Sep 17 00:00:00 2001 +From: Rainer Hochecker +Date: Fri, 26 Jul 2013 19:43:24 +0200 +Subject: [PATCH 028/136] ActiveAE: prepare for changing resample quality by + setting + +--- + .../AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 38 ++++++++++++++++++---- + xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h | 3 ++ + .../Engines/ActiveAE/ActiveAEBuffer.cpp | 38 +++++++++------------- + .../AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h | 7 ++-- + .../Engines/ActiveAE/ActiveAEResample.h | 2 +- + 5 files changed, 55 insertions(+), 33 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +index 935f994..2388f78 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +@@ -390,6 +390,7 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) + m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::SILENCEMODE, &silence, sizeof(bool)); + } + LoadSettings(); ++ ChangeResampleQuality(); + if (!NeedReconfigureBuffers() && !NeedReconfigureSink()) + return; + m_state = AE_TOP_RECONFIGURING; +@@ -440,8 +441,11 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) + par = (MsgStreamParameter*)msg->data; + if (par->stream->m_resampleBuffers) + { +- par->stream->m_resampleBuffers->m_resampleRatio = par->parameter.double_par; +- par->stream->m_resampleBuffers->m_changeRatio = true; ++ if ((unsigned int)(par->stream->m_resampleBuffers->m_format.m_sampleRate * par->parameter.double_par) != par->stream->m_resampleBuffers->m_outSampleRate) ++ { ++ par->stream->m_resampleBuffers->m_resampleRatio = par->parameter.double_par; ++ par->stream->m_resampleBuffers->m_changeResampler = true; ++ } + } + return; + case CActiveAEControlProtocol::STREAMFADE: +@@ -956,7 +960,7 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) + } + if (!(*it)->m_resampleBuffers) + { +- (*it)->m_resampleBuffers = new CActiveAEBufferPoolResample((*it)->m_inputBuffers->m_format, outputFormat); ++ (*it)->m_resampleBuffers = new CActiveAEBufferPoolResample((*it)->m_inputBuffers->m_format, outputFormat, m_settings.resampleQuality); + (*it)->m_resampleBuffers->Create(MAX_CACHE_LEVEL*1000, false); + } + if (m_mode == MODE_TRANSCODE || m_streams.size() > 1) +@@ -976,7 +980,7 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) + AEAudioFormat vizFormat = m_internalFormat; + vizFormat.m_channelLayout = AE_CH_LAYOUT_2_0; + vizFormat.m_dataFormat = AE_FMT_FLOAT; +- m_vizBuffers = new CActiveAEBufferPoolResample(m_internalFormat, vizFormat); ++ m_vizBuffers = new CActiveAEBufferPoolResample(m_internalFormat, vizFormat, m_settings.resampleQuality); + // TODO use cache of sync + water level + m_vizBuffers->Create(2000, false); + } +@@ -991,7 +995,7 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) + } + if (!m_sinkBuffers) + { +- m_sinkBuffers = new CActiveAEBufferPoolResample(sinkInputFormat, m_sinkFormat); ++ m_sinkBuffers = new CActiveAEBufferPoolResample(sinkInputFormat, m_sinkFormat, m_settings.resampleQuality); + m_sinkBuffers->Create(MAX_WATER_LEVEL*1000, true); + } + +@@ -1137,6 +1141,17 @@ float CActiveAE::CalcStreamAmplification(CActiveAEStream *stream, CSampleBuffer + return amp; + } + ++void CActiveAE::ChangeResampleQuality() ++{ ++ std::list::iterator it; ++ for(it=m_streams.begin(); it!=m_streams.end(); ++it) ++ { ++ if ((*it)->m_resampleBuffers && (*it)->m_resampleBuffers->m_resampler && ((*it)->m_resampleBuffers->m_resampleQuality != m_settings.resampleQuality)) ++ (*it)->m_resampleBuffers->m_changeResampler = true; ++ (*it)->m_resampleBuffers->m_resampleQuality = m_settings.resampleQuality; ++ } ++} ++ + void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &settings, bool setmode) + { + // raw pass through +@@ -1756,6 +1771,8 @@ void CActiveAE::LoadSettings() + m_settings.dtshdpassthrough = CSettings::Get().GetBool("audiooutput.dtshdpassthrough"); + m_settings.aacpassthrough = CSettings::Get().GetBool("audiooutput.passthroughaac"); + m_settings.multichannellpcm = CSettings::Get().GetBool("audiooutput.multichannellpcm"); ++ ++ m_settings.resampleQuality = CSettings::Get().GetInt("audiooutput.resamplequality"); + } + + bool CActiveAE::Initialize() +@@ -1821,7 +1838,8 @@ void CActiveAE::OnSettingsChange(const std::string& setting) + setting == "audiooutput.channels" || + setting == "audiooutput.multichannellpcm" || + setting == "audiooutput.stereoupmix" || +- setting == "audiooutput.streamsilence") ++ setting == "audiooutput.streamsilence" || ++ setting == "audiooutput.resamplequality") + { + m_controlPort.SendOutMessage(CActiveAEControlProtocol::RECONFIGURE); + } +@@ -1837,6 +1855,11 @@ bool CActiveAE::SupportsDrain() + return true; + } + ++bool CActiveAE::SupportsQuality() ++{ ++ return true; ++} ++ + void CActiveAE::Shutdown() + { + Dispose(); +@@ -2124,7 +2147,8 @@ bool CActiveAE::ResampleSound(CActiveAESound *sound) + orig_config.channels, + orig_config.sample_rate, + orig_config.fmt, +- NULL); ++ NULL, ++ AE_SWR_NORMAL_QUALITY); + + dst_samples = resampler->CalcDstSampleCount(sound->GetSound(true)->nb_samples, + m_internalFormat.m_sampleRate, +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h +index 9fc1b67..8bbd175 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h +@@ -57,6 +57,7 @@ struct AudioSettings + bool dtshdpassthrough; + bool multichannellpcm; + bool stereoupmix; ++ int resampleQuality; + }; + + class CActiveAEControlProtocol : public Protocol +@@ -214,6 +215,7 @@ class CActiveAE : public IAE, private CThread + virtual std::string GetDefaultDevice(bool passthrough); + virtual bool SupportsRaw(); + virtual bool SupportsDrain(); ++ virtual bool SupportsQuality(); + + virtual void RegisterAudioCallback(IAudioCallback* pCallback); + virtual void UnregisterAudioCallback(); +@@ -257,6 +259,7 @@ class CActiveAE : public IAE, private CThread + void SStopSound(CActiveAESound *sound); + void DiscardSound(CActiveAESound *sound); + float CalcStreamAmplification(CActiveAEStream *stream, CSampleBuffer *buf); ++ void ChangeResampleQuality(); + + bool RunStages(); + bool HasWork(); +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp +index d3ba213..6a2478f 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp +@@ -129,7 +129,7 @@ bool CActiveAEBufferPool::Create(unsigned int totaltime) + + //----------------------------------------------------------------------------- + +-CActiveAEBufferPoolResample::CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat) ++CActiveAEBufferPoolResample::CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat, int quality) + : CActiveAEBufferPool(outputFormat) + { + m_inputFormat = inputFormat; +@@ -141,7 +141,8 @@ bool CActiveAEBufferPool::Create(unsigned int totaltime) + m_empty = true; + m_procSample = NULL; + m_resampleRatio = 1.0; +- m_changeRatio = false; ++ m_resampleQuality = quality; ++ m_changeResampler = false; + } + + CActiveAEBufferPoolResample::~CActiveAEBufferPoolResample() +@@ -166,7 +167,8 @@ bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap) + m_inputFormat.m_channelLayout.Count(), + m_inputFormat.m_sampleRate, + CActiveAEResample::GetAVSampleFormat(m_inputFormat.m_dataFormat), +- remap ? &m_format.m_channelLayout : NULL); ++ remap ? &m_format.m_channelLayout : NULL, ++ m_resampleQuality); + } + + // store output sampling rate, needed when ratio gets changed +@@ -175,11 +177,8 @@ bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap) + return true; + } + +-void CActiveAEBufferPoolResample::ChangeRatio() ++void CActiveAEBufferPoolResample::ChangeResampler() + { +-// CLog::Log(LOGNOTICE,"---------- sample rate changed from: %d, to: %d", +-// m_outSampleRate, (int)(m_format.m_sampleRate * m_resampleRatio)); +- + m_outSampleRate = m_format.m_sampleRate * m_resampleRatio; + + delete m_resampler; +@@ -193,9 +192,10 @@ void CActiveAEBufferPoolResample::ChangeRatio() + m_inputFormat.m_channelLayout.Count(), + m_inputFormat.m_sampleRate, + CActiveAEResample::GetAVSampleFormat(m_inputFormat.m_dataFormat), +- NULL); ++ NULL, ++ m_resampleQuality); + +- m_changeRatio = false; ++ m_changeResampler = false; + } + + bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) +@@ -203,17 +203,11 @@ bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) + bool busy = false; + CSampleBuffer *in; + +- if (m_changeRatio) +- { +- if ((unsigned int)(m_format.m_sampleRate * m_resampleRatio) == m_outSampleRate) +- m_changeRatio = false; +- } +- + if (!m_resampler) + { +- if (m_changeRatio) ++ if (m_changeResampler) + { +- ChangeRatio(); ++ ChangeResampler(); + return true; + } + while(!m_inputSamples.empty()) +@@ -241,14 +235,14 @@ bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) + + bool hasInput = !m_inputSamples.empty(); + +- if (hasInput || skipInput || m_drain || m_changeRatio) ++ if (hasInput || skipInput || m_drain || m_changeResampler) + { + if (!m_procSample) + { + m_procSample = GetFreeBuffer(); + } + +- if (hasInput && !skipInput && !m_changeRatio) ++ if (hasInput && !skipInput && !m_changeResampler) + { + in = m_inputSamples.front(); + m_inputSamples.pop_front(); +@@ -274,7 +268,7 @@ bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) + busy = true; + m_empty = (out_samples == 0); + +- if ((m_drain || m_changeRatio) && m_empty) ++ if ((m_drain || m_changeResampler) && m_empty) + { + if (m_fillPackets && m_procSample->pkt->nb_samples != 0) + { +@@ -300,8 +294,8 @@ bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) + m_outputSamples.push_back(m_procSample); + + m_procSample = NULL; +- if (m_changeRatio) +- ChangeRatio(); ++ if (m_changeResampler) ++ ChangeResampler(); + } + // some methods like encode require completely filled packets + else if (!m_fillPackets || (m_procSample->pkt->nb_samples == m_procSample->pkt->max_nb_samples)) +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h +index 183c49e..f36d2c0 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h +@@ -86,10 +86,10 @@ class CActiveAEBufferPool + class CActiveAEBufferPoolResample : public CActiveAEBufferPool + { + public: +- CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat); ++ CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat, int quality); + virtual ~CActiveAEBufferPoolResample(); + virtual bool Create(unsigned int totaltime, bool remap); +- void ChangeRatio(); ++ void ChangeResampler(); + bool ResampleBuffers(unsigned int timestamp = 0); + float GetDelay(); + void Flush(); +@@ -102,8 +102,9 @@ class CActiveAEBufferPoolResample : public CActiveAEBufferPool + bool m_fillPackets; + bool m_drain; + bool m_empty; +- bool m_changeRatio; ++ bool m_changeResampler; + double m_resampleRatio; ++ int m_resampleQuality; + unsigned int m_outSampleRate; + }; + +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h +index baa4ef3..6f13b5e 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h +@@ -38,7 +38,7 @@ class CActiveAEResample + public: + CActiveAEResample(); + virtual ~CActiveAEResample(); +- bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout = NULL, int quality = AE_SWR_NORMAL_QUALITY); ++ bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout, int quality); + int Resample(uint8_t **dst_buffer, int dst_samples, uint8_t **src_buffer, int src_samples); + int64_t GetDelay(int64_t base); + int GetBufferedSamples(); +-- +1.8.1.6 + + +From ab54a95500021158e2c17973e963a277eafb9d13 Mon Sep 17 00:00:00 2001 +From: Rainer Hochecker +Date: Sat, 27 Jul 2013 09:02:37 +0200 +Subject: [PATCH 029/136] ActiveAE: fix starvation caused by viz + +--- + .../AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 95 +++++++++++----------- + 1 file changed, 49 insertions(+), 46 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +index 2388f78..4b64235 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +@@ -1563,52 +1563,6 @@ bool CActiveAE::RunStages() + if (!m_sinkHasVolume) + Deamplify(*(out->pkt)); + +- // viz +- { +- CSingleLock lock(m_vizLock); +- if (m_audioCallback && m_vizBuffers) +- { +- if (!m_vizInitialized) +- { +- m_audioCallback->OnInitialize(2, m_vizBuffers->m_format.m_sampleRate, 32); +- m_vizInitialized = true; +- } +- +- // if viz has no free buffer, it won't return current buffer "out" +- if (!m_vizBuffers->m_freeSamples.empty()) +- { +- out->Acquire(); +- m_vizBuffers->m_inputSamples.push_back(out); +- } +- else +- CLog::Log(LOGWARNING,"ActiveAE::%s - viz ran out of free buffers", __FUNCTION__); +- unsigned int now = XbmcThreads::SystemClockMillis(); +- unsigned int timestamp = now + m_stats.GetDelay() * 1000; +- m_vizBuffers->ResampleBuffers(timestamp); +- while(!m_vizBuffers->m_outputSamples.empty()) +- { +- CSampleBuffer *buf = m_vizBuffers->m_outputSamples.front(); +- if ((now - buf->timestamp) & 0x80000000) +- break; +- else +- { +- int submitted = 0; +- int samples; +- while(submitted < buf->pkt->nb_samples) +- { +- samples = std::min(512, buf->pkt->nb_samples-submitted); +- m_audioCallback->OnAudioData((float*)(buf->pkt->data[0]+2*submitted), samples); +- submitted += samples; +- } +- buf->Return(); +- m_vizBuffers->m_outputSamples.pop_front(); +- } +- } +- } +- else if (m_vizBuffers) +- m_vizBuffers->Flush(); +- } +- + // encode + if (m_mode == MODE_TRANSCODE && m_encoder) + { +@@ -1626,6 +1580,55 @@ bool CActiveAE::RunStages() + + busy = true; + } ++ ++ // viz ++ { ++ CSingleLock lock(m_vizLock); ++ if (m_audioCallback && m_vizBuffers) ++ { ++ if (!m_vizInitialized) ++ { ++ m_audioCallback->OnInitialize(2, m_vizBuffers->m_format.m_sampleRate, 32); ++ m_vizInitialized = true; ++ } ++ ++ // if viz has no free buffer, it won't return current buffer "out" ++ if (!m_vizBuffers->m_freeSamples.empty()) ++ { ++ if (out) ++ { ++ out->Acquire(); ++ m_vizBuffers->m_inputSamples.push_back(out); ++ } ++ } ++ else ++ CLog::Log(LOGWARNING,"ActiveAE::%s - viz ran out of free buffers", __FUNCTION__); ++ unsigned int now = XbmcThreads::SystemClockMillis(); ++ unsigned int timestamp = now + m_stats.GetDelay() * 1000; ++ busy |= m_vizBuffers->ResampleBuffers(timestamp); ++ while(!m_vizBuffers->m_outputSamples.empty()) ++ { ++ CSampleBuffer *buf = m_vizBuffers->m_outputSamples.front(); ++ if ((now - buf->timestamp) & 0x80000000) ++ break; ++ else ++ { ++ int submitted = 0; ++ int samples; ++ while(submitted < buf->pkt->nb_samples) ++ { ++ samples = std::min(512, buf->pkt->nb_samples-submitted); ++ m_audioCallback->OnAudioData((float*)(buf->pkt->data[0]+2*submitted), samples); ++ submitted += samples; ++ } ++ buf->Return(); ++ m_vizBuffers->m_outputSamples.pop_front(); ++ } ++ } ++ } ++ else if (m_vizBuffers) ++ m_vizBuffers->Flush(); ++ } + } + // pass through + else +-- +1.8.1.6 + + +From a3ed37aa45ad63ef9c9b51248f820898de696167 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Thu, 30 May 2013 10:56:06 +0200 -Subject: [PATCH 020/123] renderer: use fence for determination when a buffer +Subject: [PATCH 030/136] renderer: use fence for determination when a buffer is ready for reuse --- @@ -7067,7 +8630,7 @@ Subject: [PATCH 020/123] renderer: use fence for determination when a buffer 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h -index 7e503c5..fe1f577 100644 +index a61d3cf..6acf2f3 100644 --- a/xbmc/cores/VideoRenderers/BaseRenderer.h +++ b/xbmc/cores/VideoRenderers/BaseRenderer.h @@ -92,6 +92,7 @@ class CBaseRenderer @@ -7079,7 +8642,7 @@ index 7e503c5..fe1f577 100644 virtual bool Supports(ERENDERFEATURE feature) { return false; } diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 32b8d22..95e6716 100644 +index d4ed4a1..28b254c 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp @@ -128,6 +128,7 @@ @@ -7099,7 +8662,7 @@ index 32b8d22..95e6716 100644 #ifdef HAVE_LIBVA delete &vaapi; #endif -@@ -1205,6 +1208,15 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1207,6 +1210,15 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) RenderSoftware(renderBuffer, m_currentField); VerifyGLState(); } @@ -7115,7 +8678,7 @@ index 32b8d22..95e6716 100644 } void CLinuxRendererGL::RenderSinglePass(int index, int field) -@@ -3395,6 +3407,26 @@ unsigned int CLinuxRendererGL::GetProcessorSize() +@@ -3397,6 +3409,26 @@ unsigned int CLinuxRendererGL::GetProcessorSize() return 0; } @@ -7143,7 +8706,7 @@ index 32b8d22..95e6716 100644 void CLinuxRendererGL::AddProcessor(CVDPAU* vdpau, int index) { diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h -index 96b752b..e239b92 100644 +index 93b1a69..1b8bfbe 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h @@ -141,6 +141,7 @@ class CLinuxRendererGL : public CBaseRenderer @@ -7163,7 +8726,7 @@ index 96b752b..e239b92 100644 #ifdef HAVE_LIBVDPAU CVDPAU* vdpau; diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 28201a2..595ed8b 100644 +index 1b88b36..64c5b1d 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -374,11 +374,16 @@ void CXBMCRenderManager::FrameMove() @@ -7188,10 +8751,10 @@ index 28201a2..595ed8b 100644 1.8.1.6 -From be9fc8089a3ab1a44e6d2ec3cc2cd222f20987c6 Mon Sep 17 00:00:00 2001 +From 851631f89b7cf5cc6f915e9588982c732bda1847 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:34:39 +0200 -Subject: [PATCH 021/123] videoplayer: adapt lateness detection and dropping to +Subject: [PATCH 031/136] videoplayer: adapt lateness detection and dropping to buffering --- @@ -7205,7 +8768,7 @@ Subject: [PATCH 021/123] videoplayer: adapt lateness detection and dropping to 7 files changed, 260 insertions(+), 38 deletions(-) diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 595ed8b..44124a3 100644 +index 64c5b1d..8b4476f 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -299,6 +299,8 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi @@ -7257,7 +8820,7 @@ index 595ed8b..44124a3 100644 + return true; +} diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h -index 764ba07..1d9116e 100644 +index 00fe4c3..52380c1 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.h +++ b/xbmc/cores/VideoRenderers/RenderManager.h @@ -97,10 +97,11 @@ class CXBMCRenderManager @@ -7304,7 +8867,7 @@ index 764ba07..1d9116e 100644 double m_presenterr; double m_errorbuff[ERRORBUFFSIZE]; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h -index 5704704..ee943a0 100644 +index dc4e8be..ba4a8d5 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h @@ -109,6 +109,10 @@ struct DVDVideoUserData @@ -7347,7 +8910,7 @@ index 5704704..ee943a0 100644 + virtual void SetCodecControl(int flags) {} }; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp -index 0591b1f..f789785 100644 +index 4040f38..fef2add 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -163,6 +163,7 @@ enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx @@ -7414,7 +8977,7 @@ index 0591b1f..f789785 100644 + m_codecControlFlags = flags; +} diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h -index fe6bbaa..c7ae207 100644 +index 28416e6..4279222 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h @@ -46,6 +46,7 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec @@ -7444,7 +9007,7 @@ index fe6bbaa..c7ae207 100644 + int m_codecControlFlags; }; diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 749195f..4c1e9dd 100644 +index dfcbf7e..df54439 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -322,8 +322,10 @@ void CDVDPlayerVideo::Process() @@ -7708,7 +9271,7 @@ index 749195f..4c1e9dd 100644 + m_totalGain += frametime; +} diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.h b/xbmc/cores/dvdplayer/DVDPlayerVideo.h -index 5f763c0..9be23fb 100644 +index 0aee790..c5a3c6c 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.h +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.h @@ -36,6 +36,25 @@ @@ -7765,10 +9328,10 @@ index 5f763c0..9be23fb 100644 1.8.1.6 -From 4b56e80e90f4d673cbca7fa91e740216444d6586 Mon Sep 17 00:00:00 2001 +From 830f20bd53cd8053f27dae9598718070cde562e0 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 2 Sep 2012 16:05:21 +0200 -Subject: [PATCH 022/123] video player: present correct pts to user for a/v +Subject: [PATCH 032/136] video player: present correct pts to user for a/v sync (after buffering in renderer) --- @@ -7777,7 +9340,7 @@ Subject: [PATCH 022/123] video player: present correct pts to user for a/v 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 4c1e9dd..ba99804 100644 +index df54439..25ed8f1 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -1486,6 +1486,22 @@ void CDVDPlayerVideo::ResetFrameRateCalc() @@ -7820,7 +9383,7 @@ index 4c1e9dd..ba99804 100644 && bNewFrame && m_bAllowDrop diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.h b/xbmc/cores/dvdplayer/DVDPlayerVideo.h -index 9be23fb..3c3e007 100644 +index c5a3c6c..ec30fc5 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.h +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.h @@ -100,7 +100,7 @@ class CDVDPlayerVideo : public CThread @@ -7836,10 +9399,10 @@ index 9be23fb..3c3e007 100644 1.8.1.6 -From 3be868f44191d3437f2ccf053e2c964ed5b3ffd4 Mon Sep 17 00:00:00 2001 +From 1cd72b29520878b75cef6ec2ff5aa13ec92b291a Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 16 Feb 2013 18:25:53 +0100 -Subject: [PATCH 023/123] videoplayer: some rework and documentation +Subject: [PATCH 033/136] videoplayer: some rework and documentation --- .../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h | 29 ++++++++++++++++++++-- @@ -7849,7 +9412,7 @@ Subject: [PATCH 023/123] videoplayer: some rework and documentation 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h -index ee943a0..7abbd7e 100644 +index ba4a8d5..809d432 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h @@ -131,7 +131,6 @@ struct DVDVideoUserData @@ -7899,7 +9462,7 @@ index ee943a0..7abbd7e 100644 virtual void SetCodecControl(int flags) {} }; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp -index f789785..43c133c 100644 +index fef2add..38e6e3f 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -907,6 +907,17 @@ unsigned CDVDVideoCodecFFmpeg::GetAllowedReferences() @@ -7921,7 +9484,7 @@ index f789785..43c133c 100644 { m_codecControlFlags = flags; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h -index c7ae207..81b9af9 100644 +index 4279222..8e0552f 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h @@ -64,7 +64,7 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec @@ -7934,7 +9497,7 @@ index c7ae207..81b9af9 100644 bool IsHardwareAllowed() { return !m_bSoftware; } diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index ba99804..56b32b9 100644 +index 25ed8f1..3d86d5b 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -1597,7 +1597,7 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) @@ -7950,10 +9513,10 @@ index ba99804..56b32b9 100644 1.8.1.6 -From 4dd137d05f8e2fe7f36736395a9650139b7f21cb Mon Sep 17 00:00:00 2001 +From 781fabbc7ec049f00bd4eb1a6511c39dd1c6dbfe Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 7 Apr 2012 09:19:00 +0200 -Subject: [PATCH 024/123] vdpau: redesign +Subject: [PATCH 034/136] vdpau: redesign --- language/English/strings.po | 12 +- @@ -7980,10 +9543,10 @@ Subject: [PATCH 024/123] vdpau: redesign 21 files changed, 3578 insertions(+), 1230 deletions(-) diff --git a/language/English/strings.po b/language/English/strings.po -index bb2272d..f2a0572 100644 +index 40fbb74..f646f9f 100644 --- a/language/English/strings.po +++ b/language/English/strings.po -@@ -5767,7 +5767,15 @@ msgctxt "#13435" +@@ -5770,7 +5770,15 @@ msgctxt "#13435" msgid "Enable HQ Scalers for scalings above" msgstr "" @@ -8000,7 +9563,7 @@ index bb2272d..f2a0572 100644 #: system/settings/settings.xml msgctxt "#13500" -@@ -6842,7 +6850,7 @@ msgid "Software Blend" +@@ -6845,7 +6853,7 @@ msgid "Software Blend" msgstr "" msgctxt "#16325" @@ -8010,7 +9573,7 @@ index bb2272d..f2a0572 100644 #empty strings from id 16326 to 16399 diff --git a/system/settings/settings.xml b/system/settings/settings.xml -index 6e32551..15e9a75 100644 +index 461e787..b3ab3d1 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -375,6 +375,16 @@ @@ -8054,10 +9617,10 @@ index c8c8a2e..0799a4b 100644 #if(XBMC_texture_rectangle) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 95e6716..88c7e5f 100644 +index 28b254c..e7abc7b 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -679,6 +679,18 @@ void CLinuxRendererGL::RenderUpdate(bool clear, DWORD flags, DWORD alpha) +@@ -681,6 +681,18 @@ void CLinuxRendererGL::RenderUpdate(bool clear, DWORD flags, DWORD alpha) glDisable(GL_POLYGON_STIPPLE); } @@ -8076,7 +9639,7 @@ index 95e6716..88c7e5f 100644 else Render(flags, index); -@@ -759,11 +771,6 @@ void CLinuxRendererGL::FlipPage(int source) +@@ -761,11 +773,6 @@ void CLinuxRendererGL::FlipPage(int source) m_buffers[m_iYV12RenderBuffer].flipindex = ++m_flipindex; @@ -8088,7 +9651,7 @@ index 95e6716..88c7e5f 100644 return; } -@@ -1090,6 +1097,12 @@ void CLinuxRendererGL::LoadShaders(int field) +@@ -1092,6 +1099,12 @@ void CLinuxRendererGL::LoadShaders(int field) m_textureCreate = &CLinuxRendererGL::CreateVDPAUTexture; m_textureDelete = &CLinuxRendererGL::DeleteVDPAUTexture; } @@ -8101,7 +9664,7 @@ index 95e6716..88c7e5f 100644 else if (m_format == RENDER_FMT_VAAPI) { m_textureUpload = &CLinuxRendererGL::UploadVAAPITexture; -@@ -1165,7 +1178,10 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1167,7 +1180,10 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) m_currentField = FIELD_FULL; // call texture load function @@ -8112,7 +9675,7 @@ index 95e6716..88c7e5f 100644 if (m_renderMethod & RENDER_GLSL) { -@@ -1540,17 +1556,12 @@ void CLinuxRendererGL::RenderFromFBO() +@@ -1542,17 +1558,12 @@ void CLinuxRendererGL::RenderFromFBO() void CLinuxRendererGL::RenderVDPAU(int index, int field) { #ifdef HAVE_LIBVDPAU @@ -8132,7 +9695,7 @@ index 95e6716..88c7e5f 100644 // Try some clamping or wrapping glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -@@ -1608,8 +1619,6 @@ void CLinuxRendererGL::RenderVDPAU(int index, int field) +@@ -1610,8 +1621,6 @@ void CLinuxRendererGL::RenderVDPAU(int index, int field) if (m_pVideoFilterShader) m_pVideoFilterShader->Disable(); @@ -8141,7 +9704,7 @@ index 95e6716..88c7e5f 100644 glBindTexture (m_textureTarget, 0); glDisable(m_textureTarget); #endif -@@ -2286,12 +2295,14 @@ void CLinuxRendererGL::DeleteVDPAUTexture(int index) +@@ -2288,12 +2297,14 @@ void CLinuxRendererGL::DeleteVDPAUTexture(int index) { #ifdef HAVE_LIBVDPAU YUVPLANE &plane = m_buffers[index].fields[0][0]; @@ -8156,7 +9719,7 @@ index 95e6716..88c7e5f 100644 #endif } -@@ -2324,10 +2335,147 @@ bool CLinuxRendererGL::CreateVDPAUTexture(int index) +@@ -2326,10 +2337,147 @@ bool CLinuxRendererGL::CreateVDPAUTexture(int index) void CLinuxRendererGL::UploadVDPAUTexture(int index) { #ifdef HAVE_LIBVDPAU @@ -8305,7 +9868,7 @@ index 95e6716..88c7e5f 100644 void CLinuxRendererGL::DeleteVAAPITexture(int index) { -@@ -3250,12 +3398,13 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method) +@@ -3252,12 +3400,13 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method) if(method == VS_INTERLACEMETHOD_AUTO) return true; @@ -8323,7 +9886,7 @@ index 95e6716..88c7e5f 100644 #endif return false; } -@@ -3348,14 +3497,7 @@ EINTERLACEMETHOD CLinuxRendererGL::AutoInterlaceMethod() +@@ -3350,14 +3499,7 @@ EINTERLACEMETHOD CLinuxRendererGL::AutoInterlaceMethod() return VS_INTERLACEMETHOD_NONE; if(m_renderMethod & RENDER_VDPAU) @@ -8338,7 +9901,7 @@ index 95e6716..88c7e5f 100644 if(Supports(VS_INTERLACEMETHOD_RENDER_BOB)) return VS_INTERLACEMETHOD_RENDER_BOB; -@@ -3400,6 +3542,7 @@ void CLinuxRendererGL::UnBindPbo(YUVBUFFER& buff) +@@ -3402,6 +3544,7 @@ void CLinuxRendererGL::UnBindPbo(YUVBUFFER& buff) unsigned int CLinuxRendererGL::GetProcessorSize() { if(m_format == RENDER_FMT_VDPAU @@ -8346,7 +9909,7 @@ index 95e6716..88c7e5f 100644 || m_format == RENDER_FMT_VAAPI || m_format == RENDER_FMT_CVBREF) return 1; -@@ -3428,11 +3571,12 @@ bool CLinuxRendererGL::IsProcessed(int idx) +@@ -3430,11 +3573,12 @@ bool CLinuxRendererGL::IsProcessed(int idx) } #ifdef HAVE_LIBVDPAU @@ -8362,7 +9925,7 @@ index 95e6716..88c7e5f 100644 #endif diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h -index e239b92..d72eb64 100644 +index 1b8bfbe..aac04bd 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h @@ -39,12 +39,11 @@ @@ -8425,7 +9988,7 @@ index e239b92..d72eb64 100644 diff --git a/xbmc/cores/VideoRenderers/RenderFormats.h b/xbmc/cores/VideoRenderers/RenderFormats.h -index 4e8d7e9..6ed62be 100644 +index f67a32c..9ad1671 100644 --- a/xbmc/cores/VideoRenderers/RenderFormats.h +++ b/xbmc/cores/VideoRenderers/RenderFormats.h @@ -26,6 +26,7 @@ enum ERenderFormat { @@ -8437,7 +10000,7 @@ index 4e8d7e9..6ed62be 100644 RENDER_FMT_UYVY422, RENDER_FMT_YUYV422, diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 44124a3..a59ee4d 100644 +index 8b4476f..5b08c1e 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -925,7 +925,8 @@ int CXBMCRenderManager::AddVideoPicture(DVDVideoPicture& pic) @@ -8451,7 +10014,7 @@ index 44124a3..a59ee4d 100644 #endif #ifdef HAVE_LIBOPENMAX diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h -index 1d9116e..7a3a530 100644 +index 52380c1..befd851 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.h +++ b/xbmc/cores/VideoRenderers/RenderManager.h @@ -35,7 +35,7 @@ @@ -8464,7 +10027,7 @@ index 1d9116e..7a3a530 100644 #define ERRORBUFFSIZE 30 diff --git a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp -index 5b58f61..95f4a1e 100644 +index ad1940c..48302ff 100644 --- a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp +++ b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp @@ -214,6 +214,8 @@ static void CalculateYUVMatrixGL(GLfloat res[4][4] @@ -8477,7 +10040,7 @@ index 5b58f61..95f4a1e 100644 CLog::Log(LOGERROR, "GL: BaseYUV2RGBGLSLShader - unsupported format %d", m_format); diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h -index 7abbd7e..13a2648 100644 +index 809d432..43befb4 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h @@ -34,7 +34,7 @@ @@ -8499,7 +10062,7 @@ index 7abbd7e..13a2648 100644 struct { VAAPI::CHolder* vaapi; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp -index 43c133c..ec93844 100644 +index 38e6e3f..e133d78 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -75,11 +75,11 @@ enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx @@ -8518,7 +10081,7 @@ index 43c133c..ec93844 100644 ctx->SetHardware(vdp); return *cur; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h -index 81b9af9..fd8b863 100644 +index 8e0552f..30c67ab 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h @@ -29,7 +29,6 @@ @@ -8530,7 +10093,7 @@ index 81b9af9..fd8b863 100644 class CDVDVideoCodecFFmpeg : public CDVDVideoCodec diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 4e00208..89ac10e 100644 +index 5ca0803..4844469 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -33,11 +33,16 @@ @@ -12890,7 +14453,7 @@ index 4e00208..89ac10e 100644 + #endif diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h -index 87e8797..5bee48b 100644 +index e760f28..1c21535 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h @@ -1,5 +1,3 @@ @@ -12898,7 +14461,7 @@ index 87e8797..5bee48b 100644 -#pragma once /* * Copyright (C) 2005-2013 Team XBMC - * http://www.xbmc.org + * http://xbmc.org @@ -20,9 +18,32 @@ * */ @@ -13636,7 +15199,7 @@ index 87e8797..5bee48b 100644 + +} diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 56b32b9..3c30d0b 100644 +index 3d86d5b..b0a33de 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -1009,6 +1009,7 @@ static std::string GetRenderFormatName(ERenderFormat format) @@ -13648,7 +15211,7 @@ index 56b32b9..3c30d0b 100644 case RENDER_FMT_VAAPI: return "VAAPI"; case RENDER_FMT_OMXEGL: return "OMXEGL"; diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp -index de3a418..c156b90 100644 +index 2a2a15a..f0a997e 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -161,7 +161,7 @@ void CAdvancedSettings::Initialize() @@ -13738,7 +15301,7 @@ index 8ef3359..8c4038a 100644 * * This Program is free software; you can redistribute it and/or modify diff --git a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp -index bd80082..27ed5ee 100644 +index 684b471..2bad710 100644 --- a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp @@ -104,7 +104,7 @@ void CGUIDialogVideoSettings::CreateSettings() @@ -13751,7 +15314,7 @@ index bd80082..27ed5ee 100644 entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF , 16317)); entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE , 16314)); diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index e425327..3dae22c 100644 +index a0f7bba..b6b6ec4 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -63,6 +63,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -13766,10 +15329,10 @@ index e425327..3dae22c 100644 1.8.1.6 -From 2c65b5bb8caabbe3ed88861ebda5a0392d06cd2e Mon Sep 17 00:00:00 2001 +From 72f31a6c742e0d2145f9fc85786b7c4d96759214 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 12 Dec 2012 09:52:17 +0100 -Subject: [PATCH 025/123] vdpau: make interop gl default and remove setting, +Subject: [PATCH 035/136] vdpau: make interop gl default and remove setting, rename and intvert interop yuv --- @@ -13778,10 +15341,10 @@ Subject: [PATCH 025/123] vdpau: make interop gl default and remove setting, 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/language/English/strings.po b/language/English/strings.po -index f2a0572..eace353 100644 +index f646f9f..ba414f9 100644 --- a/language/English/strings.po +++ b/language/English/strings.po -@@ -5768,14 +5768,10 @@ msgid "Enable HQ Scalers for scalings above" +@@ -5771,14 +5771,10 @@ msgid "Enable HQ Scalers for scalings above" msgstr "" msgctxt "#13436" @@ -13799,7 +15362,7 @@ index f2a0572..eace353 100644 #: system/settings/settings.xml msgctxt "#13500" diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 89ac10e..c4d1a53 100644 +index 4844469..fc95760 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -384,12 +384,15 @@ bool CDecoder::Supports(EINTERLACEMETHOD method) @@ -13874,10 +15437,10 @@ index 89ac10e..c4d1a53 100644 1.8.1.6 -From 5625fb3f23df0575518af5db59bc0ac6d0b204dc Mon Sep 17 00:00:00 2001 +From 284223523ec875a402ea85c208da19e5949cab44 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 12 Dec 2012 18:34:47 +0100 -Subject: [PATCH 026/123] vdpau: drop studio level conversion +Subject: [PATCH 036/136] vdpau: drop studio level conversion --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 4 +- @@ -13885,10 +15448,10 @@ Subject: [PATCH 026/123] vdpau: drop studio level conversion 2 files changed, 6 insertions(+), 92 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 88c7e5f..a904572 100644 +index e7abc7b..2d63413 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -3314,7 +3314,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3316,7 +3316,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) { if(feature == RENDERFEATURE_BRIGHTNESS) { @@ -13897,7 +15460,7 @@ index 88c7e5f..a904572 100644 return true; if (m_renderMethod & RENDER_VAAPI) -@@ -3327,7 +3327,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3329,7 +3329,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) if(feature == RENDERFEATURE_CONTRAST) { @@ -13907,7 +15470,7 @@ index 88c7e5f..a904572 100644 if (m_renderMethod & RENDER_VAAPI) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index c4d1a53..399da83 100644 +index fc95760..07af62a 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -58,15 +58,6 @@ @@ -14029,10 +15592,10 @@ index c4d1a53..399da83 100644 1.8.1.6 -From 335ae083e1dcc89cfaa8351b4ff3136b78c432be Mon Sep 17 00:00:00 2001 +From 16f3d1420c64bd711b95102c6364a308c1b5bd54 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 12 Dec 2012 20:28:49 +0100 -Subject: [PATCH 027/123] vdpau: observe ffmpeg tags for color space +Subject: [PATCH 037/136] vdpau: observe ffmpeg tags for color space --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 38 ++++++++++++++++++-------- @@ -14040,7 +15603,7 @@ Subject: [PATCH 027/123] vdpau: observe ffmpeg tags for color space 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 399da83..4b2b4e8 100644 +index 07af62a..7ecc2cf 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -929,6 +929,7 @@ int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame) @@ -14121,7 +15684,7 @@ index 399da83..4b2b4e8 100644 m_vdpError = false; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h -index 5bee48b..ef99383 100644 +index 1c21535..674571b 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h @@ -334,6 +334,7 @@ class CMixer : private CThread @@ -14136,17 +15699,17 @@ index 5bee48b..ef99383 100644 1.8.1.6 -From 28f7a60727380f8bef98393e8ed5162ecf4b20a0 Mon Sep 17 00:00:00 2001 +From b301b228ac26b0ea083865cca42337b9bf816175 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 27 Jan 2013 12:10:19 +0100 -Subject: [PATCH 028/123] vdpau: switch off de-interlacing on ff +Subject: [PATCH 038/136] vdpau: switch off de-interlacing on ff --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 4b2b4e8..c56dc9c 100644 +index 7ecc2cf..3cc02ee 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -2065,8 +2065,9 @@ void CMixer::InitCycle() @@ -14165,10 +15728,10 @@ index 4b2b4e8..c56dc9c 100644 1.8.1.6 -From a04827ef0ca9a5a659ed2063d7076fb5db016134 Mon Sep 17 00:00:00 2001 +From cdd164a91bd82358f2c6c0923ba9a33f59ab9c1c Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 2 Feb 2013 13:17:09 +0100 -Subject: [PATCH 029/123] vdpau: fix mp4 part2 decoding, activate by default +Subject: [PATCH 039/136] vdpau: fix mp4 part2 decoding, activate by default --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 3 +-- @@ -14176,7 +15739,7 @@ Subject: [PATCH 029/123] vdpau: fix mp4 part2 decoding, activate by default 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index c56dc9c..4ffeeb5 100644 +index 3cc02ee..d90df12 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -131,10 +131,9 @@ bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat, unsigned int @@ -14192,7 +15755,7 @@ index c56dc9c..4ffeeb5 100644 { if (!CDVDCodecUtils::IsVP3CompatibleWidth(avctx->coded_width)) diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp -index c156b90..bd08884 100644 +index f0a997e..292750d 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -165,7 +165,7 @@ void CAdvancedSettings::Initialize() @@ -14208,10 +15771,10 @@ index c156b90..bd08884 100644 1.8.1.6 -From 29f7a999fbf40b3228553a655b9b5713cd572e66 Mon Sep 17 00:00:00 2001 +From 5f076a0a19a3e5443d08a0a8d1f20c1189919848 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 2 Mar 2013 15:19:19 +0100 -Subject: [PATCH 030/123] vdpau: re-add limited range conversion +Subject: [PATCH 040/136] vdpau: re-add limited range conversion --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 4 +- @@ -14219,10 +15782,10 @@ Subject: [PATCH 030/123] vdpau: re-add limited range conversion 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index a904572..88c7e5f 100644 +index 2d63413..e7abc7b 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -3314,7 +3314,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3316,7 +3316,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) { if(feature == RENDERFEATURE_BRIGHTNESS) { @@ -14231,7 +15794,7 @@ index a904572..88c7e5f 100644 return true; if (m_renderMethod & RENDER_VAAPI) -@@ -3327,7 +3327,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3329,7 +3329,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) if(feature == RENDERFEATURE_CONTRAST) { @@ -14241,7 +15804,7 @@ index a904572..88c7e5f 100644 if (m_renderMethod & RENDER_VAAPI) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 4ffeeb5..f913a97 100644 +index d90df12..62cd72e 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -71,6 +71,9 @@ @@ -14355,10 +15918,10 @@ index 4ffeeb5..f913a97 100644 1.8.1.6 -From 1ec0508b83dde208260e6574139ea0d1e8ecfe01 Mon Sep 17 00:00:00 2001 +From f2b725fe8b735a7e6899b5a8dc5630c6498fa277 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 25 Sep 2012 12:14:15 +0200 -Subject: [PATCH 031/123] linuxrenderer: drop method RenderMultiPass +Subject: [PATCH 041/136] linuxrenderer: drop method RenderMultiPass --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 9 ++------- @@ -14366,10 +15929,10 @@ Subject: [PATCH 031/123] linuxrenderer: drop method RenderMultiPass 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 88c7e5f..3a2278d 100644 +index e7abc7b..39ba8a4 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -1195,7 +1195,8 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1197,7 +1197,8 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) break; case RQ_MULTIPASS: @@ -14379,7 +15942,7 @@ index 88c7e5f..3a2278d 100644 VerifyGLState(); break; } -@@ -1327,12 +1328,6 @@ void CLinuxRendererGL::RenderSinglePass(int index, int field) +@@ -1329,12 +1330,6 @@ void CLinuxRendererGL::RenderSinglePass(int index, int field) VerifyGLState(); } @@ -14393,7 +15956,7 @@ index 88c7e5f..3a2278d 100644 { YUVPLANES &planes = m_buffers[index].fields[field]; diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h -index d72eb64..6b9046d 100644 +index aac04bd..41a1be7 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h @@ -218,7 +218,6 @@ class CLinuxRendererGL : public CBaseRenderer @@ -14408,10 +15971,10 @@ index d72eb64..6b9046d 100644 1.8.1.6 -From 84d3b7a85900519c4ebc246db4e83cfaba4197b9 Mon Sep 17 00:00:00 2001 +From 67e034b0cec5e24c0c5e8394e27e7046e5a77f69 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 25 Sep 2012 13:20:47 +0200 -Subject: [PATCH 032/123] linuxrenderer: implement progressive weave for vdpau +Subject: [PATCH 042/136] linuxrenderer: implement progressive weave for vdpau --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 55 +++++++++++++++++++-------- @@ -14419,10 +15982,10 @@ Subject: [PATCH 032/123] linuxrenderer: implement progressive weave for vdpau 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 3a2278d..3d9f22a 100644 +index 39ba8a4..c072f5e 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -679,18 +679,6 @@ void CLinuxRendererGL::RenderUpdate(bool clear, DWORD flags, DWORD alpha) +@@ -681,18 +681,6 @@ void CLinuxRendererGL::RenderUpdate(bool clear, DWORD flags, DWORD alpha) glDisable(GL_POLYGON_STIPPLE); } @@ -14441,7 +16004,7 @@ index 3a2278d..3d9f22a 100644 else Render(flags, index); -@@ -1190,13 +1178,21 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1192,13 +1180,21 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) { case RQ_LOW: case RQ_SINGLEPASS: @@ -14466,7 +16029,7 @@ index 3a2278d..3d9f22a 100644 VerifyGLState(); break; } -@@ -1328,7 +1324,7 @@ void CLinuxRendererGL::RenderSinglePass(int index, int field) +@@ -1330,7 +1326,7 @@ void CLinuxRendererGL::RenderSinglePass(int index, int field) VerifyGLState(); } @@ -14475,7 +16038,7 @@ index 3a2278d..3d9f22a 100644 { YUVPLANES &planes = m_buffers[index].fields[field]; -@@ -1430,6 +1426,8 @@ void CLinuxRendererGL::RenderToFBO(int index, int field) +@@ -1432,6 +1428,8 @@ void CLinuxRendererGL::RenderToFBO(int index, int field) } m_fbo.width *= planes[0].pixpertex_x; m_fbo.height *= planes[0].pixpertex_y; @@ -14484,7 +16047,7 @@ index 3a2278d..3d9f22a 100644 // 1st Pass to video frame size glBegin(GL_QUADS); -@@ -1548,6 +1546,31 @@ void CLinuxRendererGL::RenderFromFBO() +@@ -1550,6 +1548,31 @@ void CLinuxRendererGL::RenderFromFBO() VerifyGLState(); } @@ -14517,7 +16080,7 @@ index 3a2278d..3d9f22a 100644 { #ifdef HAVE_LIBVDPAU diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h -index 6b9046d..4494eca 100644 +index 41a1be7..274f980 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h @@ -218,12 +218,12 @@ class CLinuxRendererGL : public CBaseRenderer @@ -14539,17 +16102,17 @@ index 6b9046d..4494eca 100644 1.8.1.6 -From ec7254bd6dabe50dfaa382840b585004c1c8c883 Mon Sep 17 00:00:00 2001 +From 561523ebacefe1e8f29b6f701501cc4212daf134 Mon Sep 17 00:00:00 2001 From: fritsch Date: Thu, 28 Mar 2013 10:38:37 +0100 -Subject: [PATCH 033/123] VDPAU: silence compiler warnings +Subject: [PATCH 043/136] VDPAU: silence compiler warnings --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index f913a97..e9ec3d2 100644 +index 62cd72e..a0ccd9f 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -252,7 +252,7 @@ long CDecoder::Release() @@ -14638,10 +16201,10 @@ index f913a97..e9ec3d2 100644 1.8.1.6 -From 3bc3adc2abf37a0edeb829c89559b71d314c40ca Mon Sep 17 00:00:00 2001 +From b65e8eb5fd1a5ba8fc4371c73f3f5ddb9b1f4f06 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 25 Feb 2013 08:47:10 +0100 -Subject: [PATCH 034/123] vdpau: release more resources on pre-cleanup +Subject: [PATCH 044/136] vdpau: release more resources on pre-cleanup --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 72 +++++++++++++++++++++++--- @@ -14649,7 +16212,7 @@ Subject: [PATCH 034/123] vdpau: release more resources on pre-cleanup 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index e9ec3d2..9850cf0 100644 +index a0ccd9f..89ffc6e 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -1170,6 +1170,11 @@ void CMixer::Dispose() @@ -14756,7 +16319,7 @@ index e9ec3d2..9850cf0 100644 { for (unsigned int i = 0; i < m_bufferPool.outputSurfaces.size(); ++i) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h -index ef99383..39047b5 100644 +index 674571b..c0835cf 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h @@ -286,6 +286,7 @@ class CMixer : private CThread @@ -14779,10 +16342,10 @@ index ef99383..39047b5 100644 1.8.1.6 -From d35ccb80581844bbca3333347f00e6fcb93a71d0 Mon Sep 17 00:00:00 2001 +From 190abb1d038374350c9b3ec41de6d78632a58d49 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 6 Mar 2013 07:35:10 +0100 -Subject: [PATCH 035/123] vdpau: set deinterlacing method to auto, if default +Subject: [PATCH 045/136] vdpau: set deinterlacing method to auto, if default method not supported --- @@ -14790,7 +16353,7 @@ Subject: [PATCH 035/123] vdpau: set deinterlacing method to auto, if default 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 9850cf0..0a6a1dc 100644 +index 89ffc6e..b23f530 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -2195,13 +2195,15 @@ void CMixer::InitCycle() @@ -14814,10 +16377,10 @@ index 9850cf0..0a6a1dc 100644 1.8.1.6 -From c3e2ffae7ea03c7f97534d5232c7d85fa15e89fc Mon Sep 17 00:00:00 2001 +From d0f6095e6298ed46e4ccc991d2491fada8d1a0fd Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 21 Apr 2013 09:19:34 +0200 -Subject: [PATCH 036/123] vdpau: fix deadlock if decoder is closed while +Subject: [PATCH 046/136] vdpau: fix deadlock if decoder is closed while refresh rate changes --- @@ -14825,7 +16388,7 @@ Subject: [PATCH 036/123] vdpau: fix deadlock if decoder is closed while 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 0a6a1dc..4b4b3c3 100644 +index b23f530..2fdcf37 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -183,6 +183,8 @@ void CDecoder::Close() @@ -14855,17 +16418,17 @@ index 0a6a1dc..4b4b3c3 100644 1.8.1.6 -From a8be3fdeb938bbaafb2ed203f3603df659fbeab2 Mon Sep 17 00:00:00 2001 +From 2fc0e791999aa60262088b97e67d11fc339be17f Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sat, 1 Jun 2013 11:21:19 +0200 -Subject: [PATCH 037/123] renderer: bump buffers to 5 +Subject: [PATCH 047/136] renderer: bump buffers to 5 --- xbmc/cores/VideoRenderers/BaseRenderer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h -index fe1f577..527ecf1 100644 +index 6acf2f3..f44024c 100644 --- a/xbmc/cores/VideoRenderers/BaseRenderer.h +++ b/xbmc/cores/VideoRenderers/BaseRenderer.h @@ -29,7 +29,7 @@ @@ -14881,10 +16444,10 @@ index fe1f577..527ecf1 100644 1.8.1.6 -From b0470afab151c7b6f40ef522a34971915eaf6a01 Mon Sep 17 00:00:00 2001 +From 4d6c7fbefdfedad5e67a37e8f1f33714a9cc10dd Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:41:31 +0200 -Subject: [PATCH 038/123] videoplayer: update frametime, it might change due to +Subject: [PATCH 048/136] videoplayer: update frametime, it might change due to fps detection --- @@ -14892,7 +16455,7 @@ Subject: [PATCH 038/123] videoplayer: update frametime, it might change due to 1 file changed, 2 insertions(+) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 3c30d0b..347e888 100644 +index b0a33de..d45d8ae 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -707,6 +707,8 @@ void CDVDPlayerVideo::Process() @@ -14908,10 +16471,10 @@ index 3c30d0b..347e888 100644 1.8.1.6 -From 3b2c4035e621d28160dc432159b61df047c6b879 Mon Sep 17 00:00:00 2001 +From e4359bc5349ccecd4b7d7511c513eadcde12bc87 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:43:06 +0200 -Subject: [PATCH 039/123] videoplayer: give streams with invalid fps a chance +Subject: [PATCH 049/136] videoplayer: give streams with invalid fps a chance for fps detection --- @@ -14919,7 +16482,7 @@ Subject: [PATCH 039/123] videoplayer: give streams with invalid fps a chance 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 347e888..1a17145 100644 +index d45d8ae..9dc5cd6 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -1529,7 +1529,7 @@ void CDVDPlayerVideo::CalcFrameRate() @@ -14935,10 +16498,10 @@ index 347e888..1a17145 100644 1.8.1.6 -From 122cde177d428fc91114be2fb57318a6aa69ba5b Mon Sep 17 00:00:00 2001 +From 4843169664c024b7361a1191c72fdca6d17f88de Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:49:05 +0200 -Subject: [PATCH 040/123] dvdplayer: allow rewinding at end of stream, do a +Subject: [PATCH 050/136] dvdplayer: allow rewinding at end of stream, do a seek after rewind --- @@ -14946,7 +16509,7 @@ Subject: [PATCH 040/123] dvdplayer: allow rewinding at end of stream, do a 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index 974ebd1..b56423b 100644 +index 1246b9f..994e7b4 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp @@ -1555,7 +1555,7 @@ void CDVDPlayer::HandlePlaySpeed() @@ -14975,10 +16538,10 @@ index 974ebd1..b56423b 100644 1.8.1.6 -From a308b831bd2e6e7a74589987a4ea805e3f10b2ae Mon Sep 17 00:00:00 2001 +From 79f7fcd5ba7b5f8ed2bc9b0df83b8d88b2173324 Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 15:22:05 +0200 -Subject: [PATCH 041/123] X11: ditch SDL for video and window events +Subject: [PATCH 051/136] X11: ditch SDL for video and window events --- xbmc/Application.cpp | 2 +- @@ -14994,10 +16557,10 @@ Subject: [PATCH 041/123] X11: ditch SDL for video and window events create mode 100644 xbmc/windowing/WinEventsX11.h diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp -index 3937ce8..a5603a2 100644 +index ae82308..eb81f6e 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp -@@ -833,7 +833,7 @@ bool CApplication::CreateGUI() +@@ -844,7 +844,7 @@ bool CApplication::CreateGUI() uint32_t sdlFlags = 0; @@ -15007,7 +16570,7 @@ index 3937ce8..a5603a2 100644 #endif diff --git a/xbmc/system.h b/xbmc/system.h -index 7ccda52..bb6b72e 100644 +index 1f4e15f..075e44a 100644 --- a/xbmc/system.h +++ b/xbmc/system.h @@ -171,16 +171,21 @@ @@ -15045,7 +16608,7 @@ index f109bec..f981642 100644 LIB=windowing.a diff --git a/xbmc/windowing/WinEvents.h b/xbmc/windowing/WinEvents.h -index 5feb800..49adcdf 100644 +index 9e09b54..87bf855 100644 --- a/xbmc/windowing/WinEvents.h +++ b/xbmc/windowing/WinEvents.h @@ -56,6 +56,10 @@ class CWinEventsBase @@ -15894,7 +17457,7 @@ index 0000000..e9b7553 + bool m_structureChanged; +}; diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index e28b712..68e482e 100644 +index 31f5304..265e05e 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -22,7 +22,6 @@ @@ -16422,7 +17985,7 @@ index e28b712..68e482e 100644 + #endif diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 3dae22c..25faaef 100644 +index b6b6ec4..448a1bb 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -52,6 +52,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -16462,10 +18025,10 @@ index 3dae22c..25faaef 100644 1.8.1.6 -From 9f772616412e5bc3a72e2d56ed5ae6ccc7264693 Mon Sep 17 00:00:00 2001 +From 218b76e5a0d3701e853a7837a37f781879bbe194 Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 15:24:22 +0200 -Subject: [PATCH 042/123] X11: Add xbmc icon +Subject: [PATCH 052/136] X11: Add xbmc icon --- xbmc/windowing/X11/WinSystemX11.cpp | 126 +++++++++++++++++++++++++++++++++++- @@ -16473,7 +18036,7 @@ Subject: [PATCH 042/123] X11: Add xbmc icon 2 files changed, 127 insertions(+), 1 deletion(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 68e482e..9ee8d18 100644 +index 265e05e..f3ff34d 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -136,6 +136,9 @@ bool CWinSystemX11::DestroyWindow() @@ -16631,7 +18194,7 @@ index 68e482e..9ee8d18 100644 + #endif diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 25faaef..c1e6cf1 100644 +index 448a1bb..e618268 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -77,6 +77,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -16654,10 +18217,10 @@ index 25faaef..c1e6cf1 100644 1.8.1.6 -From c3a5e18e21191c785d31fecd9013f25bdada062d Mon Sep 17 00:00:00 2001 +From 26831a9a36a7bcc6b4fd8f96ab2520006a3956de Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 20 May 2012 14:11:26 +0200 -Subject: [PATCH 043/123] X11: add SDL joystick until we have a better solution +Subject: [PATCH 053/136] X11: add SDL joystick until we have a better solution --- xbmc/windowing/WinEventsX11.cpp | 26 ++++++++++++++++++++++++++ @@ -16711,10 +18274,10 @@ index 5a8bbb8..5bc1de0 100644 1.8.1.6 -From cedafa3581d7893778c46473b32c90cde9306e9f Mon Sep 17 00:00:00 2001 +From 3423c3a34e42f14feeb11b5b6ad118ae202317e5 Mon Sep 17 00:00:00 2001 From: Joakim Plate Date: Thu, 5 Jul 2012 12:35:55 +0200 -Subject: [PATCH 044/123] X11: factor out code handling device reset +Subject: [PATCH 054/136] X11: factor out code handling device reset notification --- @@ -16723,7 +18286,7 @@ Subject: [PATCH 044/123] X11: factor out code handling device reset 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 9ee8d18..fd51dc0 100644 +index f3ff34d..c5938af 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -532,14 +532,7 @@ void CWinSystemX11::CheckDisplayEvents() @@ -16763,7 +18326,7 @@ index 9ee8d18..fd51dc0 100644 { CLog::Log(LOGDEBUG, "%s - notify display change event", __FUNCTION__); diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index c1e6cf1..041ea55 100644 +index e618268..c4d4b76 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -66,6 +66,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -16778,10 +18341,10 @@ index c1e6cf1..041ea55 100644 1.8.1.6 -From a6d829d266bc04a52e8340aa2e2ea79e2e258070 Mon Sep 17 00:00:00 2001 +From 8c27a2f1921746ada6d896d3b2aaff684f7592ba Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 15:02:00 +0200 -Subject: [PATCH 045/123] X11: move xrandr events to WinEventsX11 +Subject: [PATCH 055/136] X11: move xrandr events to WinEventsX11 --- xbmc/windowing/WinEventsX11.cpp | 42 +++++++++++++++++++++++++++++++++++++ @@ -16896,7 +18459,7 @@ index e9b7553..6100933 100644 + bool m_xrrEventPending; }; diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index fd51dc0..d495443 100644 +index c5938af..9f74dd5 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -509,7 +509,7 @@ bool CWinSystemX11::Show(bool raise) @@ -16925,10 +18488,10 @@ index fd51dc0..d495443 100644 1.8.1.6 -From b8c92d9d5a2c7cbf6315d9a04be99d6501de7fe9 Mon Sep 17 00:00:00 2001 +From 698851ff884e21eaa8bb8507f0a409a65c02541e Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 12 Apr 2012 15:43:56 +0200 -Subject: [PATCH 046/123] xrandr: remove method RestoreState +Subject: [PATCH 056/136] xrandr: remove method RestoreState --- xbmc/windowing/X11/WinSystemX11.cpp | 13 +++++++++++-- @@ -16937,7 +18500,7 @@ Subject: [PATCH 046/123] xrandr: remove method RestoreState 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index d495443..d7afc3f 100644 +index 9f74dd5..05a1d60 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -79,9 +79,18 @@ bool CWinSystemX11::InitWindowSystem() @@ -16962,7 +18525,7 @@ index d495443..d7afc3f 100644 if (m_dpy) diff --git a/xbmc/windowing/X11/XRandR.cpp b/xbmc/windowing/X11/XRandR.cpp -index 30c1909..b4c95f8 100644 +index bd22dbf..df2b5fb 100644 --- a/xbmc/windowing/X11/XRandR.cpp +++ b/xbmc/windowing/X11/XRandR.cpp @@ -139,25 +139,6 @@ void CXRandR::SaveState() @@ -16992,7 +18555,7 @@ index 30c1909..b4c95f8 100644 { if ((output.name == m_currentOutput && mode.id == m_currentMode) || (output.name == "" && mode.id == "")) diff --git a/xbmc/windowing/X11/XRandR.h b/xbmc/windowing/X11/XRandR.h -index e3450fe..cf22fbf 100644 +index 0aec487..00b49dc 100644 --- a/xbmc/windowing/X11/XRandR.h +++ b/xbmc/windowing/X11/XRandR.h @@ -99,7 +99,6 @@ class CXRandR @@ -17007,10 +18570,10 @@ index e3450fe..cf22fbf 100644 1.8.1.6 -From 3715129c3cbfcf14b49f28e1721b4d869a370de3 Mon Sep 17 00:00:00 2001 +From 25150228eac582bf7c58a1ab8ff23c19b26bed94 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 20 May 2012 13:17:10 +0200 -Subject: [PATCH 047/123] xrandr: observe orientation +Subject: [PATCH 057/136] xrandr: observe orientation --- xbmc/windowing/X11/WinSystemX11.cpp | 89 ++++++++++++++++++++++++++++++------- @@ -17020,7 +18583,7 @@ Subject: [PATCH 047/123] xrandr: observe orientation 4 files changed, 82 insertions(+), 17 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index d7afc3f..6b320f2 100644 +index 05a1d60..c5ccbc4 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -84,11 +84,11 @@ bool CWinSystemX11::DestroyWindowSystem() @@ -17173,7 +18736,7 @@ index d7afc3f..6b320f2 100644 { int value; diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 041ea55..0d4436b 100644 +index c4d4b76..0727bb9 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -73,12 +73,14 @@ class CWinSystemX11 : public CWinSystemBase @@ -17192,7 +18755,7 @@ index 041ea55..0d4436b 100644 bool m_minimized; bool m_bIgnoreNextFocusMessage; diff --git a/xbmc/windowing/X11/XRandR.cpp b/xbmc/windowing/X11/XRandR.cpp -index b4c95f8..e2576b2 100644 +index df2b5fb..29715c7 100644 --- a/xbmc/windowing/X11/XRandR.cpp +++ b/xbmc/windowing/X11/XRandR.cpp @@ -98,6 +98,13 @@ bool CXRandR::Query(bool force) @@ -17210,7 +18773,7 @@ index b4c95f8..e2576b2 100644 if (!xoutput.isConnected) continue; diff --git a/xbmc/windowing/X11/XRandR.h b/xbmc/windowing/X11/XRandR.h -index cf22fbf..71ffab4 100644 +index 00b49dc..508604d 100644 --- a/xbmc/windowing/X11/XRandR.h +++ b/xbmc/windowing/X11/XRandR.h @@ -86,6 +86,7 @@ class XOutput @@ -17225,10 +18788,10 @@ index cf22fbf..71ffab4 100644 1.8.1.6 -From 74087bc15aafee00399f86ce4387e07bcdc852b6 Mon Sep 17 00:00:00 2001 +From daca99e7b7078a1ad99d06a97317d7d4f7576c05 Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 11:54:15 +0200 -Subject: [PATCH 048/123] xrandr: allow getting info for multiple screen's +Subject: [PATCH 058/136] xrandr: allow getting info for multiple screen's Refactored by: Joakim Plate --- @@ -17237,7 +18800,7 @@ Refactored by: Joakim Plate 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/xbmc/windowing/X11/XRandR.cpp b/xbmc/windowing/X11/XRandR.cpp -index e2576b2..97b1e32 100644 +index 29715c7..9e181f2 100644 --- a/xbmc/windowing/X11/XRandR.cpp +++ b/xbmc/windowing/X11/XRandR.cpp @@ -39,6 +39,7 @@ @@ -17359,7 +18922,7 @@ index e2576b2..97b1e32 100644 #endif // HAS_XRANDR diff --git a/xbmc/windowing/X11/XRandR.h b/xbmc/windowing/X11/XRandR.h -index 71ffab4..26c2653 100644 +index 508604d..d37838a 100644 --- a/xbmc/windowing/X11/XRandR.h +++ b/xbmc/windowing/X11/XRandR.h @@ -79,6 +79,7 @@ class XOutput @@ -17403,10 +18966,10 @@ index 71ffab4..26c2653 100644 1.8.1.6 -From 962e8baf6d19fb165988939a07e350b55e7b379e Mon Sep 17 00:00:00 2001 +From 2ec9d0a9b0c843ac8b4f4de2482f29ce89441479 Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 11:44:00 +0200 -Subject: [PATCH 049/123] X11: fix multi-head setups +Subject: [PATCH 059/136] X11: fix multi-head setups --- language/English/strings.po | 4 +- @@ -17421,7 +18984,7 @@ Subject: [PATCH 049/123] X11: fix multi-head setups 9 files changed, 229 insertions(+), 116 deletions(-) diff --git a/language/English/strings.po b/language/English/strings.po -index eace353..10568ca 100644 +index ba414f9..940dded 100644 --- a/language/English/strings.po +++ b/language/English/strings.po @@ -999,7 +999,9 @@ msgctxt "#245" @@ -17436,7 +18999,7 @@ index eace353..10568ca 100644 msgctxt "#247" msgid "Scripts" diff --git a/system/settings/settings.xml b/system/settings/settings.xml -index 15e9a75..9c63476 100644 +index b3ab3d1..60135a1 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -1841,6 +1841,15 @@ @@ -17472,7 +19035,7 @@ index 15e9a75..9c63476 100644 diff --git a/xbmc/rendering/gl/RenderSystemGL.h b/xbmc/rendering/gl/RenderSystemGL.h -index 5c7a288..f3fd4fb 100644 +index 662134d..292761a 100644 --- a/xbmc/rendering/gl/RenderSystemGL.h +++ b/xbmc/rendering/gl/RenderSystemGL.h @@ -44,6 +44,7 @@ class CRenderSystemGL : public CRenderSystemBase @@ -17484,7 +19047,7 @@ index 5c7a288..f3fd4fb 100644 virtual void SetViewPort(CRect& viewPort); virtual void GetViewPort(CRect& viewPort); diff --git a/xbmc/settings/DisplaySettings.cpp b/xbmc/settings/DisplaySettings.cpp -index 49b50f4..203c0f1 100644 +index 032e752..cf5deba 100644 --- a/xbmc/settings/DisplaySettings.cpp +++ b/xbmc/settings/DisplaySettings.cpp @@ -198,13 +198,19 @@ bool CDisplaySettings::OnSettingChanging(const CSetting *setting) @@ -17570,7 +19133,7 @@ index 49b50f4..203c0f1 100644 + } +} diff --git a/xbmc/settings/DisplaySettings.h b/xbmc/settings/DisplaySettings.h -index 056fc07..fe91a74 100644 +index 4540a34..618a644 100644 --- a/xbmc/settings/DisplaySettings.h +++ b/xbmc/settings/DisplaySettings.h @@ -78,6 +78,7 @@ class CDisplaySettings : public ISettingCallback, public ISubSettings, @@ -17590,7 +19153,7 @@ index 056fc07..fe91a74 100644 protected: CDisplaySettings(); diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp -index ee97753..63cdf0e 100644 +index 3f7dfaf..42a1363 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -374,6 +374,7 @@ void CSettings::Uninitialize() @@ -17619,7 +19182,7 @@ index ee97753..63cdf0e 100644 #ifdef HAS_GLES m_settingsManager->AddCondition("has_gles"); #endif -@@ -837,6 +842,7 @@ void CSettings::InitializeISettingCallbacks() +@@ -843,6 +848,7 @@ void CSettings::InitializeISettingCallbacks() settingSet.insert("videoscreen.screen"); settingSet.insert("videoscreen.resolution"); settingSet.insert("videoscreen.screenmode"); @@ -17649,7 +19212,7 @@ index d9dc911..c58067b 100644 break; } diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 6b320f2..41e7d6e 100644 +index c5ccbc4..d9654b9 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -34,7 +34,8 @@ @@ -18138,7 +19701,7 @@ index 6b320f2..41e7d6e 100644 return true; } diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 0d4436b..0336b3b 100644 +index 0727bb9..b1eb278 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -65,15 +65,16 @@ class CWinSystemX11 : public CWinSystemBase @@ -18175,10 +19738,10 @@ index 0d4436b..0336b3b 100644 1.8.1.6 -From 1b9d4812607e358873e2a8868edf53b41c67cd15 Mon Sep 17 00:00:00 2001 +From d425584dff1c7740e6a4608cb199703fb0fb5bcf Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 11:36:32 +0200 -Subject: [PATCH 050/123] X11: remove all DefaultScreen and RootWindow macros +Subject: [PATCH 060/136] X11: remove all DefaultScreen and RootWindow macros --- xbmc/windowing/X11/WinSystemX11.cpp | 6 +++--- @@ -18187,7 +19750,7 @@ Subject: [PATCH 050/123] X11: remove all DefaultScreen and RootWindow macros 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 41e7d6e..fd07a80 100644 +index d9654b9..e2580a4 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -269,7 +269,7 @@ void CWinSystemX11::UpdateResolutions() @@ -18218,7 +19781,7 @@ index 41e7d6e..fd07a80 100644 m_minimized = true; return true; diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 0336b3b..393399f 100644 +index b1eb278..b9154ab 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -47,6 +47,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -18230,7 +19793,7 @@ index 0336b3b..393399f 100644 virtual void ResetOSScreensaver(); virtual bool EnableFrameLimiter(); diff --git a/xbmc/windowing/X11/WinSystemX11GL.cpp b/xbmc/windowing/X11/WinSystemX11GL.cpp -index 1bea366..cc39720 100644 +index 095012f..60a6878 100644 --- a/xbmc/windowing/X11/WinSystemX11GL.cpp +++ b/xbmc/windowing/X11/WinSystemX11GL.cpp @@ -203,7 +203,7 @@ bool CWinSystemX11GL::CreateNewWindow(const CStdString& name, bool fullScreen, R @@ -18246,10 +19809,10 @@ index 1bea366..cc39720 100644 1.8.1.6 -From 25cb8d56c21407abe41750eb4ac03a6a72cc005d Mon Sep 17 00:00:00 2001 +From 2a854ad8f557b07417803aadf1bef203805ec25b Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 11:45:22 +0200 -Subject: [PATCH 051/123] X11: remove all DefaultScreen and RootWindow macros +Subject: [PATCH 061/136] X11: remove all DefaultScreen and RootWindow macros (VideoRefClock) Note this is on a separate display connection. @@ -18258,7 +19821,7 @@ Note this is on a separate display connection. 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp -index ca239cf..687e3ff 100644 +index 5bf3656..0b9e7b3 100644 --- a/xbmc/video/VideoReferenceClock.cpp +++ b/xbmc/video/VideoReferenceClock.cpp @@ -270,7 +270,7 @@ bool CVideoReferenceClock::SetupGLX() @@ -18321,10 +19884,10 @@ index ca239cf..687e3ff 100644 1.8.1.6 -From dde7b8a4d232d927c23b3d101687df45dba94886 Mon Sep 17 00:00:00 2001 +From 6e45c9935e11576ed87be25bfcddeb20de52965f Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 20 Jun 2012 17:37:11 +0200 -Subject: [PATCH 052/123] X11: recreate gl context after output has changed +Subject: [PATCH 062/136] X11: recreate gl context after output has changed --- xbmc/windowing/X11/WinSystemX11.cpp | 24 ++++++++++++++---------- @@ -18333,7 +19896,7 @@ Subject: [PATCH 052/123] X11: recreate gl context after output has changed 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index fd07a80..8f56cec 100644 +index e2580a4..dce0433 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -170,7 +170,6 @@ bool CWinSystemX11::ResizeWindow(int newWidth, int newHeight, int newLeft, int n @@ -18422,7 +19985,7 @@ index fd07a80..8f56cec 100644 } diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 393399f..2227320 100644 +index b9154ab..05aa60e 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -93,6 +93,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -18434,7 +19997,7 @@ index 393399f..2227320 100644 private: bool IsSuitableVisual(XVisualInfo *vInfo); diff --git a/xbmc/windowing/X11/WinSystemX11GL.cpp b/xbmc/windowing/X11/WinSystemX11GL.cpp -index cc39720..dda7b14 100644 +index 60a6878..d6ba80a 100644 --- a/xbmc/windowing/X11/WinSystemX11GL.cpp +++ b/xbmc/windowing/X11/WinSystemX11GL.cpp @@ -23,6 +23,7 @@ @@ -18475,10 +20038,10 @@ index cc39720..dda7b14 100644 1.8.1.6 -From 04b267d0ada69b62e07d05dd840fde3ff2e8d72c Mon Sep 17 00:00:00 2001 +From ea23b4d9befee933789c1fa1b5075a1a3a823bbe Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 12:06:25 +0200 -Subject: [PATCH 053/123] X11: hook video reference clock in windowing +Subject: [PATCH 063/136] X11: hook video reference clock in windowing --- xbmc/video/VideoReferenceClock.cpp | 71 +++++++++++++++++++++++++++----------- @@ -18486,7 +20049,7 @@ Subject: [PATCH 053/123] X11: hook video reference clock in windowing 2 files changed, 63 insertions(+), 21 deletions(-) diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp -index 687e3ff..4287e8f 100644 +index 0b9e7b3..3bd8133 100644 --- a/xbmc/video/VideoReferenceClock.cpp +++ b/xbmc/video/VideoReferenceClock.cpp @@ -135,12 +135,23 @@ @@ -18632,7 +20195,7 @@ index 687e3ff..4287e8f 100644 //the refreshrate can be wrong on nvidia drivers, so read it from nvidia-settings when it's available diff --git a/xbmc/video/VideoReferenceClock.h b/xbmc/video/VideoReferenceClock.h -index 1791570..bcabc9f 100644 +index dd65a1b..afd71fc 100644 --- a/xbmc/video/VideoReferenceClock.h +++ b/xbmc/video/VideoReferenceClock.h @@ -30,6 +30,7 @@ @@ -18683,10 +20246,10 @@ index 1791570..bcabc9f 100644 1.8.1.6 -From ec444ec34ecb704349dc4e82417a8014e4252e3c Mon Sep 17 00:00:00 2001 +From 329948c02c86f251c1cb62c02dee4b9e0138d0b2 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 21 Jun 2012 17:26:51 +0200 -Subject: [PATCH 054/123] X11: fix video calibrations +Subject: [PATCH 064/136] X11: fix video calibrations --- xbmc/windowing/WinSystem.h | 1 + @@ -18695,7 +20258,7 @@ Subject: [PATCH 054/123] X11: fix video calibrations 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/xbmc/windowing/WinSystem.h b/xbmc/windowing/WinSystem.h -index f1a9d6f..7a812b2 100644 +index 3500a8d..0e309f9 100644 --- a/xbmc/windowing/WinSystem.h +++ b/xbmc/windowing/WinSystem.h @@ -103,6 +103,7 @@ class CWinSystemBase @@ -18707,7 +20270,7 @@ index f1a9d6f..7a812b2 100644 // text input interface virtual void EnableTextInput(bool bEnable) {} diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 8f56cec..0ead0e8 100644 +index dce0433..e7f4f61 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -318,7 +318,7 @@ void CWinSystemX11::UpdateResolutions() @@ -18763,7 +20326,7 @@ index 8f56cec..0ead0e8 100644 void CWinSystemX11::GetConnectedOutputs(std::vector *outputs) diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 2227320..630c0e2 100644 +index 05aa60e..95672d1 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -61,6 +61,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -18778,10 +20341,10 @@ index 2227320..630c0e2 100644 1.8.1.6 -From d29b764e4396e21d57260832012ec8d05ca0f3f8 Mon Sep 17 00:00:00 2001 +From e29ff8d63cd564e8a04456ed46a66f9791768f60 Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 12:00:26 +0200 -Subject: [PATCH 055/123] X11: deactivate screen saver on startup +Subject: [PATCH 065/136] X11: deactivate screen saver on startup --- xbmc/windowing/X11/WinSystemX11.cpp | 29 +++++++++++++++++++++++++++++ @@ -18789,7 +20352,7 @@ Subject: [PATCH 055/123] X11: deactivate screen saver on startup 2 files changed, 30 insertions(+) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 0ead0e8..c643177 100644 +index e7f4f61..14a4307 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -519,6 +519,33 @@ void CWinSystemX11::ResetOSScreensaver() @@ -18836,7 +20399,7 @@ index 0ead0e8..c643177 100644 { GLX_RGBA, diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 630c0e2..f78f613 100644 +index 95672d1..51ac314 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -51,6 +51,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -18851,17 +20414,17 @@ index 630c0e2..f78f613 100644 1.8.1.6 -From 8fc2d01d984fa1dcba0b6a135d085f70e02516f8 Mon Sep 17 00:00:00 2001 +From 921bc0eb36b61dd20cbc0c73f64b1d57de7e2d76 Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 12:10:09 +0200 -Subject: [PATCH 056/123] X11: change method of going full-screen +Subject: [PATCH 066/136] X11: change method of going full-screen --- xbmc/windowing/X11/WinSystemX11.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index c643177..e1e1096 100644 +index 14a4307..66b91fd 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -36,6 +36,7 @@ @@ -18898,10 +20461,10 @@ index c643177..e1e1096 100644 1.8.1.6 -From c0ef76639af991ea31bd9188c431692f3a3c526d Mon Sep 17 00:00:00 2001 +From ae3d417b4be9fa2d650305d77ca5809226d01922 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 28 Jun 2012 19:12:39 +0200 -Subject: [PATCH 057/123] X11: reset key repeat and key modifier on focus lost +Subject: [PATCH 067/136] X11: reset key repeat and key modifier on focus lost and gain --- @@ -18933,10 +20496,10 @@ index c58067b..c9f8a20 100644 1.8.1.6 -From c7a3b7a4ce52000bbdb260e9f2142297bb531617 Mon Sep 17 00:00:00 2001 +From 0803e7aa355c5e8a5ec2985b8c052d7731259a70 Mon Sep 17 00:00:00 2001 From: Joakim Plate Date: Thu, 5 Jul 2012 14:18:46 +0200 -Subject: [PATCH 058/123] X11: replace custom utf8 to unicode with charset +Subject: [PATCH 068/136] X11: replace custom utf8 to unicode with charset convertor (squash to x11 events) --- @@ -19153,10 +20716,10 @@ index 6100933..72955ad 100644 1.8.1.6 -From b99781ba1c13380f8c98414fd2b0e7735da27046 Mon Sep 17 00:00:00 2001 +From e5ed6062126c8af426a27e85aaacf2f9f40fe246 Mon Sep 17 00:00:00 2001 From: Joakim Plate Date: Thu, 5 Jul 2012 14:23:54 +0200 -Subject: [PATCH 059/123] X11: fixed invalid usage of sizeof() (squash into x11 +Subject: [PATCH 069/136] X11: fixed invalid usage of sizeof() (squash into x11 changes) --- @@ -19220,17 +20783,17 @@ index 72955ad..102a076 100644 1.8.1.6 -From b279aabe373a8a7e2bfc65e2a7f5c9f539b2d86e Mon Sep 17 00:00:00 2001 +From 3cea9e4151c7aab9d885a52553b920a829fbf618 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 9 Jun 2012 18:23:53 +0200 -Subject: [PATCH 060/123] add missing keys to xbmc keytable +Subject: [PATCH 070/136] add missing keys to xbmc keytable --- xbmc/input/XBMC_keytable.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xbmc/input/XBMC_keytable.cpp b/xbmc/input/XBMC_keytable.cpp -index f18e9b1..066cd77 100644 +index b430f55..246164b 100644 --- a/xbmc/input/XBMC_keytable.cpp +++ b/xbmc/input/XBMC_keytable.cpp @@ -179,6 +179,8 @@ @@ -19246,17 +20809,17 @@ index f18e9b1..066cd77 100644 1.8.1.6 -From 156e9d1e3b67b4444366009b19b47410fd4ee60a Mon Sep 17 00:00:00 2001 +From 69be70d8245123c599ff08b2fd34077dedfd4fc4 Mon Sep 17 00:00:00 2001 From: xbmc Date: Fri, 16 Mar 2012 15:57:51 +0100 -Subject: [PATCH 061/123] videorefclock: temp deactivate of nv settings +Subject: [PATCH 071/136] videorefclock: temp deactivate of nv settings --- xbmc/video/VideoReferenceClock.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp -index 4287e8f..21f59b8 100644 +index 3bd8133..59f924c 100644 --- a/xbmc/video/VideoReferenceClock.cpp +++ b/xbmc/video/VideoReferenceClock.cpp @@ -135,7 +135,7 @@ @@ -19272,17 +20835,17 @@ index 4287e8f..21f59b8 100644 1.8.1.6 -From 0a143d6a5ea9581125f476c892ab9deb93730d4b Mon Sep 17 00:00:00 2001 +From 9df52bfe9977127883d9402fdc38801370c45d32 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 20 Aug 2012 09:09:09 +0200 -Subject: [PATCH 062/123] videorefclock: ask graphics context for refresh rate +Subject: [PATCH 072/136] videorefclock: ask graphics context for refresh rate --- xbmc/video/VideoReferenceClock.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp -index 21f59b8..0156b2c 100644 +index 59f924c..2f8bc69 100644 --- a/xbmc/video/VideoReferenceClock.cpp +++ b/xbmc/video/VideoReferenceClock.cpp @@ -30,6 +30,7 @@ @@ -19306,10 +20869,10 @@ index 21f59b8..0156b2c 100644 1.8.1.6 -From 224633df916fd15c03b9042ce8ac4d23912ce4cc Mon Sep 17 00:00:00 2001 +From d98805eb590a6288109e4a57195d72170f0ce8c0 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 9 Jul 2012 14:00:18 +0200 -Subject: [PATCH 063/123] X11: fix icon texture after +Subject: [PATCH 073/136] X11: fix icon texture after cc5ed3c2474084ebc0373a3046410e6f766e03f4 --- @@ -19317,7 +20880,7 @@ Subject: [PATCH 063/123] X11: fix icon texture after 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index e1e1096..ace57ff 100644 +index 66b91fd..b00eddc 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -872,22 +872,24 @@ bool CWinSystemX11::SetWindow(int width, int height, bool fullscreen, const CStd @@ -19417,10 +20980,10 @@ index e1e1096..ace57ff 100644 1.8.1.6 -From e5eac0a49cf2bf417683ea22d185424473b846b8 Mon Sep 17 00:00:00 2001 +From 6cac4892fb21d6e57c746d7a1e283a52d79af39f Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 10 Jul 2012 11:14:12 +0200 -Subject: [PATCH 064/123] X11: check for window manager +Subject: [PATCH 074/136] X11: check for window manager --- xbmc/windowing/X11/WinSystemX11.cpp | 74 ++++++++++++++++++++++++++++++++++++- @@ -19428,7 +20991,7 @@ Subject: [PATCH 064/123] X11: check for window manager 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index ace57ff..188864b 100644 +index b00eddc..05279ad 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -814,8 +814,10 @@ bool CWinSystemX11::SetWindow(int width, int height, bool fullscreen, const CStd @@ -19526,7 +21089,7 @@ index ace57ff..188864b 100644 + #endif diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index f78f613..f479c27 100644 +index 51ac314..ce3c289 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -101,6 +101,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -19541,17 +21104,17 @@ index f78f613..f479c27 100644 1.8.1.6 -From 1e0e335c33da59271313f587d14bec4fcda1db15 Mon Sep 17 00:00:00 2001 +From 098d70d4fad6852652aa95a2609255b278aa1e3c Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 12 Jul 2012 11:11:47 +0200 -Subject: [PATCH 065/123] X11: dont set window on xrandr if no mode available +Subject: [PATCH 075/136] X11: dont set window on xrandr if no mode available --- xbmc/windowing/X11/WinSystemX11.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 188864b..076ed82 100644 +index 05279ad..9697cbb 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -663,16 +663,17 @@ void CWinSystemX11::NotifyXRREvent() @@ -19581,17 +21144,17 @@ index 188864b..076ed82 100644 1.8.1.6 -From 8a637a5c920ad2491e1f45c36ada25fd675fe8e3 Mon Sep 17 00:00:00 2001 +From e1389a1e33971decac7a919457b8dd67252e4535 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 26 Jul 2012 09:34:28 +0200 -Subject: [PATCH 066/123] X11: fix crash after a resolution change on startup +Subject: [PATCH 076/136] X11: fix crash after a resolution change on startup --- xbmc/windowing/X11/WinSystemX11.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 076ed82..ee339d9 100644 +index 9697cbb..868071c 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -221,7 +221,8 @@ bool CWinSystemX11::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool bl @@ -19608,17 +21171,17 @@ index 076ed82..ee339d9 100644 1.8.1.6 -From 6fdb9269d58e784b1ffe846707732faadf505974 Mon Sep 17 00:00:00 2001 +From d49dd6375898d0775205b0954fd9ed9ebc0e3ec8 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 15 Sep 2012 18:27:29 +0200 -Subject: [PATCH 067/123] X11: lock graphics context in NotifyXRREvent +Subject: [PATCH 077/136] X11: lock graphics context in NotifyXRREvent --- xbmc/windowing/X11/WinSystemX11.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index ee339d9..d2dcccd 100644 +index 868071c..9ff947c 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -664,6 +664,8 @@ void CWinSystemX11::NotifyXRREvent() @@ -19634,10 +21197,10 @@ index ee339d9..d2dcccd 100644 1.8.1.6 -From cf823969dd79b155ccf6e797312ec447da8c80a9 Mon Sep 17 00:00:00 2001 +From 4f3fad4a542e166e557a34c27ae333478f9ff613 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sat, 8 Oct 2011 16:45:13 +0200 -Subject: [PATCH 068/123] ffmpeg: add xvba hwaccel +Subject: [PATCH 078/136] ffmpeg: add xvba hwaccel --- lib/ffmpeg/configure | 11 ++ @@ -20486,16 +22049,16 @@ index 1c00ac4..6437e29 100644 1.8.1.6 -From 93c92af6eceb08981a57ddd5b082118cffeb81ba Mon Sep 17 00:00:00 2001 +From db45b1127b0b81ff013e4f03b8938b3076fef306 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 12 Apr 2012 12:09:31 +0200 -Subject: [PATCH 069/123] xvba: add decoder +Subject: [PATCH 079/136] xvba: add decoder --- configure.in | 47 + language/English/strings.po | 12 +- system/settings/settings.xml | 5 + - xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 216 +- + xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 218 +- xbmc/cores/VideoRenderers/LinuxRendererGL.h | 15 +- xbmc/cores/VideoRenderers/RenderFormats.h | 1 + xbmc/cores/VideoRenderers/RenderManager.cpp | 4 + @@ -20507,7 +22070,7 @@ Subject: [PATCH 069/123] xvba: add decoder xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 1 + xbmc/settings/VideoSettings.h | 2 + xbmc/video/dialogs/GUIDialogVideoSettings.cpp | 1 + - 15 files changed, 3070 insertions(+), 7 deletions(-) + 15 files changed, 3071 insertions(+), 8 deletions(-) create mode 100644 xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp create mode 100644 xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h @@ -20605,10 +22168,10 @@ index bd2934d..94f6455 100644 --enable-pthreads \ --enable-runtime-cpudetect \ diff --git a/language/English/strings.po b/language/English/strings.po -index 10568ca..d603702 100644 +index 940dded..1fdf542 100644 --- a/language/English/strings.po +++ b/language/English/strings.po -@@ -5773,7 +5773,11 @@ msgctxt "#13436" +@@ -5776,7 +5776,11 @@ msgctxt "#13436" msgid "Prefer VDPAU Video Mixer" msgstr "" @@ -20621,7 +22184,7 @@ index 10568ca..d603702 100644 #: system/settings/settings.xml msgctxt "#13500" -@@ -6851,7 +6855,11 @@ msgctxt "#16325" +@@ -6854,7 +6858,11 @@ msgctxt "#16325" msgid "VDPAU - Bob" msgstr "" @@ -20635,7 +22198,7 @@ index 10568ca..d603702 100644 msgctxt "#16400" msgid "Post-processing" diff --git a/system/settings/settings.xml b/system/settings/settings.xml -index 9c63476..a863dae 100644 +index 60135a1..4655d59 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -410,6 +410,11 @@ @@ -20651,7 +22214,7 @@ index 9c63476..a863dae 100644 HAS_GL 4 diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 3d9f22a..c663423 100644 +index c072f5e..73a8cc8 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp @@ -65,6 +65,9 @@ @@ -20674,7 +22237,14 @@ index 3d9f22a..c663423 100644 } CLinuxRendererGL::YUVBUFFER::~YUVBUFFER() -@@ -604,6 +610,9 @@ void CLinuxRendererGL::ReleaseBuffer(int idx) +@@ -600,12 +606,15 @@ void CLinuxRendererGL::Flush() + + void CLinuxRendererGL::ReleaseBuffer(int idx) + { +-#if defined(HAVE_LIBVDPAU) || defined(HAVE_LIBVA) || defined(TARGET_DARWIN) ++#if defined(HAVE_LIBVDPAU) || defined(HAVE_LIBVA) || defined(TARGET_DARWIN) || defined(HAVE_LIBXVBA) + YUVBUFFER &buf = m_buffers[idx]; + #endif #ifdef HAVE_LIBVDPAU SAFE_RELEASE(buf.vdpau); #endif @@ -20684,7 +22254,7 @@ index 3d9f22a..c663423 100644 #ifdef HAVE_LIBVA buf.vaapi.surface.reset(); #endif -@@ -869,7 +878,7 @@ void CLinuxRendererGL::UpdateVideoFilter() +@@ -871,7 +880,7 @@ void CLinuxRendererGL::UpdateVideoFilter() case VS_SCALINGMETHOD_LINEAR: SetTextureFilter(m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR); m_renderQuality = RQ_SINGLEPASS; @@ -20693,7 +22263,7 @@ index 3d9f22a..c663423 100644 { m_pVideoFilterShader = new StretchFilterShader(); if (!m_pVideoFilterShader->CompileAndLink()) -@@ -955,6 +964,11 @@ void CLinuxRendererGL::LoadShaders(int field) +@@ -957,6 +966,11 @@ void CLinuxRendererGL::LoadShaders(int field) CLog::Log(LOGNOTICE, "GL: Using CVBREF render method"); m_renderMethod = RENDER_CVREF; } @@ -20705,7 +22275,7 @@ index 3d9f22a..c663423 100644 else { int requestedMethod = CSettings::Get().GetInt("videoplayer.rendermethod"); -@@ -1103,6 +1117,12 @@ void CLinuxRendererGL::LoadShaders(int field) +@@ -1105,6 +1119,12 @@ void CLinuxRendererGL::LoadShaders(int field) m_textureCreate = &CLinuxRendererGL::CreateCVRefTexture; m_textureDelete = &CLinuxRendererGL::DeleteCVRefTexture; } @@ -20718,7 +22288,7 @@ index 3d9f22a..c663423 100644 else { // setup default YV12 texture handlers -@@ -1215,6 +1235,13 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1217,6 +1237,13 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) RenderVAAPI(renderBuffer, m_currentField); } #endif @@ -20732,7 +22302,7 @@ index 3d9f22a..c663423 100644 else { // RENDER_CVREF uses the same render as the default case -@@ -1731,6 +1758,77 @@ void CLinuxRendererGL::RenderVAAPI(int index, int field) +@@ -1733,6 +1760,77 @@ void CLinuxRendererGL::RenderVAAPI(int index, int field) #endif } @@ -20810,7 +22380,7 @@ index 3d9f22a..c663423 100644 void CLinuxRendererGL::RenderSoftware(int index, int field) { // used for textues uploaded from rgba or CVPixelBuffers. -@@ -2764,6 +2862,88 @@ bool CLinuxRendererGL::CreateCVRefTexture(int index) +@@ -2766,6 +2864,88 @@ bool CLinuxRendererGL::CreateCVRefTexture(int index) return true; } @@ -20899,7 +22469,7 @@ index 3d9f22a..c663423 100644 void CLinuxRendererGL::UploadYUV422PackedTexture(int source) { YUVBUFFER& buf = m_buffers[source]; -@@ -3338,6 +3518,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3340,6 +3520,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) if (m_renderMethod & RENDER_VAAPI) return false; @@ -20909,7 +22479,7 @@ index 3d9f22a..c663423 100644 return (m_renderMethod & RENDER_GLSL) || (m_renderMethod & RENDER_ARB) || ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE); -@@ -3351,6 +3534,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3353,6 +3536,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) if (m_renderMethod & RENDER_VAAPI) return false; @@ -20919,7 +22489,7 @@ index 3d9f22a..c663423 100644 return (m_renderMethod & RENDER_GLSL) || (m_renderMethod & RENDER_ARB) || ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE); -@@ -3374,7 +3560,8 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3376,7 +3562,8 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) if (feature == RENDERFEATURE_NONLINSTRETCH) { if (((m_renderMethod & RENDER_GLSL) && !(m_renderMethod & RENDER_POT)) || @@ -20929,7 +22499,7 @@ index 3d9f22a..c663423 100644 return true; } -@@ -3446,6 +3633,16 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method) +@@ -3448,6 +3635,16 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method) return false; } @@ -20946,7 +22516,7 @@ index 3d9f22a..c663423 100644 #ifdef TARGET_DARWIN // YADIF too slow for HD but we have no methods to fall back // to something that works so just turn it off. -@@ -3495,7 +3692,7 @@ bool CLinuxRendererGL::Supports(ESCALINGMETHOD method) +@@ -3497,7 +3694,7 @@ bool CLinuxRendererGL::Supports(ESCALINGMETHOD method) return false; if ((glewIsSupported("GL_EXT_framebuffer_object") && (m_renderMethod & RENDER_GLSL)) || @@ -20955,7 +22525,7 @@ index 3d9f22a..c663423 100644 { // spline36 and lanczos3 are only allowed through advancedsettings.xml if(method != VS_SCALINGMETHOD_SPLINE36 -@@ -3562,7 +3759,8 @@ unsigned int CLinuxRendererGL::GetProcessorSize() +@@ -3564,7 +3761,8 @@ unsigned int CLinuxRendererGL::GetProcessorSize() if(m_format == RENDER_FMT_VDPAU || m_format == RENDER_FMT_VDPAU_420 || m_format == RENDER_FMT_VAAPI @@ -20965,7 +22535,7 @@ index 3d9f22a..c663423 100644 return 1; else return 0; -@@ -3618,4 +3816,14 @@ void CLinuxRendererGL::AddProcessor(struct __CVBuffer *cvBufferRef, int index) +@@ -3620,4 +3818,14 @@ void CLinuxRendererGL::AddProcessor(struct __CVBuffer *cvBufferRef, int index) } #endif @@ -20981,7 +22551,7 @@ index 3d9f22a..c663423 100644 + #endif diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h -index 4494eca..161c43f 100644 +index 274f980..958a06c 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h @@ -44,6 +44,8 @@ @@ -21042,7 +22612,7 @@ index 4494eca..161c43f 100644 typedef YUVBUFFER YUVBUFFERS[NUM_BUFFERS]; diff --git a/xbmc/cores/VideoRenderers/RenderFormats.h b/xbmc/cores/VideoRenderers/RenderFormats.h -index 6ed62be..70ae9bf 100644 +index 9ad1671..cfa4726 100644 --- a/xbmc/cores/VideoRenderers/RenderFormats.h +++ b/xbmc/cores/VideoRenderers/RenderFormats.h @@ -35,6 +35,7 @@ enum ERenderFormat { @@ -21054,7 +22624,7 @@ index 6ed62be..70ae9bf 100644 #endif diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index a59ee4d..f94760c 100644 +index 5b08c1e..7e12a46 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -941,6 +941,10 @@ int CXBMCRenderManager::AddVideoPicture(DVDVideoPicture& pic) @@ -21069,7 +22639,7 @@ index a59ee4d..f94760c 100644 return index; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h -index 13a2648..347f09b 100644 +index 43befb4..46369c7 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h @@ -35,6 +35,7 @@ @@ -21091,7 +22661,7 @@ index 13a2648..347f09b 100644 struct { COpenMax *openMax; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp -index ec93844..9d4a6b4 100644 +index e133d78..6dabb25 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -60,6 +60,9 @@ @@ -23901,7 +25471,7 @@ index 0000000..3bd0cea + +} diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 1a17145..41e64a5 100644 +index 9dc5cd6..b18cc79 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -1017,6 +1017,7 @@ static std::string GetRenderFormatName(ERenderFormat format) @@ -23913,7 +25483,7 @@ index 1a17145..41e64a5 100644 } return "UNKNOWN"; diff --git a/xbmc/settings/VideoSettings.h b/xbmc/settings/VideoSettings.h -index b7c4116..a370bd8 100644 +index 0de785d..f3fed5d 100644 --- a/xbmc/settings/VideoSettings.h +++ b/xbmc/settings/VideoSettings.h @@ -63,6 +63,8 @@ enum EINTERLACEMETHOD @@ -23926,7 +25496,7 @@ index b7c4116..a370bd8 100644 }; diff --git a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp -index 27ed5ee..007ad74 100644 +index 2bad710..2146e9b 100644 --- a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp @@ -111,6 +111,7 @@ void CGUIDialogVideoSettings::CreateSettings() @@ -23941,10 +25511,10 @@ index 27ed5ee..007ad74 100644 1.8.1.6 -From a1d6b330e8316cb52b0b9f97c3be92269760a878 Mon Sep 17 00:00:00 2001 +From a0188b0aa26af315b65cad2f4ca5ba979298330f Mon Sep 17 00:00:00 2001 From: fritsch Date: Sun, 4 Nov 2012 16:24:10 +0100 -Subject: [PATCH 070/123] xvba: add string for available decoders - we are +Subject: [PATCH 080/136] xvba: add string for available decoders - we are important so make sure we are there --- @@ -23952,7 +25522,7 @@ Subject: [PATCH 070/123] xvba: add string for available decoders - we are 1 file changed, 5 insertions(+) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp -index 1477264..37a5994 100644 +index 022c613..a9ce269 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp @@ -177,6 +177,11 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, unsigne @@ -23971,17 +25541,17 @@ index 1477264..37a5994 100644 1.8.1.6 -From 033dbfbc37f33a1670357c39e6f82dd36e457ab0 Mon Sep 17 00:00:00 2001 +From f7f273c95dc1e31e8f141a73e102494b61d61a18 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 16 Jun 2012 12:46:30 +0200 -Subject: [PATCH 071/123] xvba: do not use vaapi if xvba is present +Subject: [PATCH 081/136] xvba: do not use vaapi if xvba is present --- xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp -index 2343b11..f102cba 100644 +index 7951ee7..ff0b550 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp @@ -261,6 +261,15 @@ void CDecoder::Close() @@ -24004,10 +25574,10 @@ index 2343b11..f102cba 100644 1.8.1.6 -From 4115edbecd5b2dd346f1ea727191737a5d7cfe74 Mon Sep 17 00:00:00 2001 +From b101c41a7a96fdadafea70fa4c063c934f18bf04 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 23 Aug 2012 19:39:49 +0200 -Subject: [PATCH 072/123] ffmpeg: add av_find_default_stream_index to interface +Subject: [PATCH 082/136] ffmpeg: add av_find_default_stream_index to interface --- lib/DllAvFormat.h | 4 ++++ @@ -24053,10 +25623,10 @@ index ee41fa8..56605cb 100644 1.8.1.6 -From 8ffb30c17bd7e2547d8f9822ea3c7ba79ddd5d85 Mon Sep 17 00:00:00 2001 +From b303da3d1b9f8d8be5fe562ecdbbcaabc182ba5e Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 13 Apr 2013 11:30:39 +0200 -Subject: [PATCH 073/123] XVBA: revisit draw functions +Subject: [PATCH 083/136] XVBA: revisit draw functions --- lib/ffmpeg/libavcodec/xvba_h264.c | 2 +- @@ -24093,10 +25663,10 @@ index bf3d9c2..ff35a28 100644 1.8.1.6 -From 79d420cd213211980405eaec3985973c5747ec20 Mon Sep 17 00:00:00 2001 +From ec2cddc3964a33d9a129b07a303d774cb4c222b8 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 13 Apr 2013 12:06:02 +0200 -Subject: [PATCH 074/123] (ffmpeg): Make XVBA codec available +Subject: [PATCH 084/136] (ffmpeg): Make XVBA codec available --- lib/ffmpeg/libavcodec/vc1dec.c | 3 +++ @@ -24120,10 +25690,10 @@ index 2130c74..4d611f9 100644 1.8.1.6 -From ac4379b9aae918e85751a5dfcf9be58387696da8 Mon Sep 17 00:00:00 2001 +From 7ed99cc1226802f84c6de6388945a833b0e0040d Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 13 Apr 2013 16:38:50 +0200 -Subject: [PATCH 075/123] ffmpeg: XVBA-VC1 use v->second_field instead of +Subject: [PATCH 085/136] ffmpeg: XVBA-VC1 use v->second_field instead of !s->first_field to make VC1 interlaced working --- @@ -24147,10 +25717,10 @@ index ff35a28..04e7983 100644 1.8.1.6 -From 7f1f427783474710997c79fc53a087c1bf23537d Mon Sep 17 00:00:00 2001 +From 36e745498803b6eb8ac6e7d6b1aa3e5b9e9342b3 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 27 Apr 2013 17:36:15 +0200 -Subject: [PATCH 076/123] XVBA: Only set second_field when we are interlaced +Subject: [PATCH 086/136] XVBA: Only set second_field when we are interlaced and an interlaced field --- @@ -24174,10 +25744,10 @@ index 04e7983..eb90c12 100644 1.8.1.6 -From b58048413f9b77a3cb6495607743ee5cb6e8b452 Mon Sep 17 00:00:00 2001 +From 1a5b0d7e28e410df41d97659fc327c39308001e1 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 27 Apr 2013 22:08:50 +0200 -Subject: [PATCH 077/123] xvba: translate picture_structure to a value xvba +Subject: [PATCH 087/136] xvba: translate picture_structure to a value xvba understands --- @@ -24260,10 +25830,10 @@ index eb90c12..c98dba5 100644 1.8.1.6 -From 50a161f1bc214ad3383ec0c089bc4c92d8e2df4b Mon Sep 17 00:00:00 2001 +From 4cc7e515c75eb853055cc74367751829fc425b96 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 30 Apr 2013 21:18:55 +0200 -Subject: [PATCH 078/123] ffmpeg xvba: fix vc1 field interlace +Subject: [PATCH 088/136] ffmpeg xvba: fix vc1 field interlace --- lib/ffmpeg/libavcodec/xvba.c | 4 ++-- @@ -24315,10 +25885,10 @@ index c98dba5..e7a85a7 100644 1.8.1.6 -From 53256575a97d81b9fcedd1438c34323dc0b27824 Mon Sep 17 00:00:00 2001 +From f058a132f053d6bb86452d249a74cd6f05c80fad Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 30 Apr 2013 21:19:07 +0200 -Subject: [PATCH 079/123] xvba: fix vc1 field interlace +Subject: [PATCH 089/136] xvba: fix vc1 field interlace --- xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp | 3 +++ @@ -24342,10 +25912,10 @@ index 43a331f..568632f 100644 1.8.1.6 -From 66f7bfd6bdf9f765fc2a6eecfb58d69883e7a059 Mon Sep 17 00:00:00 2001 +From ea6a0186f1321a74ff34ce0e72df4ad7939b7981 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 30 Apr 2013 21:40:55 +0200 -Subject: [PATCH 080/123] xvba: vc1 - honor psf +Subject: [PATCH 090/136] xvba: vc1 - honor psf --- xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp | 3 +++ @@ -24376,17 +25946,17 @@ index 568632f..1db9363 100644 1.8.1.6 -From 5b328a69f54b582ba3987cb218233bbe587e91f9 Mon Sep 17 00:00:00 2001 +From 4c749cca39425daa10533aa8a5cc7498fa236766 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 4 May 2013 10:31:32 +0200 -Subject: [PATCH 081/123] xvba: squash me, settings +Subject: [PATCH 091/136] xvba: squash me, settings --- xbmc/settings/Settings.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp -index 63cdf0e..02eef76 100644 +index 42a1363..861bd1a 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -747,6 +747,9 @@ void CSettings::InitializeConditions() @@ -24403,10 +25973,10 @@ index 63cdf0e..02eef76 100644 1.8.1.6 -From 0aaeb0a6313953818000e7203d527dfee8906f83 Mon Sep 17 00:00:00 2001 +From abf5055b780fca08a495f76b1258c2eea3fe84d2 Mon Sep 17 00:00:00 2001 From: fritsch Date: Fri, 24 May 2013 12:02:02 +0200 -Subject: [PATCH 082/123] XVBA: Limit video to 2048x1152 as this is the max all +Subject: [PATCH 092/136] XVBA: Limit video to 2048x1152 as this is the max all blocks can handle --- @@ -24436,10 +26006,10 @@ index 1db9363..54d7aea 100644 1.8.1.6 -From f4f97fb0313df385610d2d3d2164cbb2f4390773 Mon Sep 17 00:00:00 2001 +From ba8f531d904709116d23f135fd512c6fb7eb666c Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 20 Aug 2012 16:06:39 +0200 -Subject: [PATCH 083/123] dvdplayer: observe pts counter overflow +Subject: [PATCH 093/136] dvdplayer: observe pts counter overflow --- .../cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 198 ++++++++++++++++++++- @@ -24447,7 +26017,7 @@ Subject: [PATCH 083/123] dvdplayer: observe pts counter overflow 2 files changed, 201 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -index 18c1c4b..0e25041 100644 +index 9c395da..356b965 100644 --- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp @@ -18,7 +18,6 @@ @@ -24702,7 +26272,7 @@ index 18c1c4b..0e25041 100644 { CSingleLock lock(m_critSection); diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h -index b78094e..17d2f7a 100644 +index aef5ab1..35abbdf 100644 --- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h +++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h @@ -100,6 +100,7 @@ class CDVDDemuxFFmpeg : public CDVDDemux @@ -24726,10 +26296,10 @@ index b78094e..17d2f7a 100644 1.8.1.6 -From 1936aa6817db5c98cd21a2ab7a9656f183ac9509 Mon Sep 17 00:00:00 2001 +From 9eba76f46ea93a2d60b8277296a93eb04a431c7c Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 2 Oct 2012 13:02:10 +0200 -Subject: [PATCH 084/123] dvdplayer: avoid short screen flicker caused by +Subject: [PATCH 094/136] dvdplayer: avoid short screen flicker caused by unnecessary reconfigure of renderer --- @@ -24737,7 +26307,7 @@ Subject: [PATCH 084/123] dvdplayer: avoid short screen flicker caused by 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 41e64a5..74b4391 100644 +index b18cc79..adee04a 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -1095,7 +1095,7 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) @@ -24762,10 +26332,10 @@ index 41e64a5..74b4391 100644 1.8.1.6 -From 869811cf0359978019c5edc2277610d9a58a47e1 Mon Sep 17 00:00:00 2001 +From 129c2699510723ffa813b04d098377018854a40c Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 11 Oct 2012 12:05:50 +0200 -Subject: [PATCH 085/123] vdpau: advanced settings for auto deinterlacing +Subject: [PATCH 095/136] vdpau: advanced settings for auto deinterlacing --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 8 ++++---- @@ -24774,7 +26344,7 @@ Subject: [PATCH 085/123] vdpau: advanced settings for auto deinterlacing 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 4b4b3c3..fc4c030 100644 +index 2fdcf37..2805613 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -1800,10 +1800,10 @@ EINTERLACEMETHOD CMixer::GetDeinterlacingMethod(bool log /* = false */) @@ -24793,7 +26363,7 @@ index 4b4b3c3..fc4c030 100644 if (deint != -1) { diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp -index bd08884..a7a7233 100644 +index 292750d..f0cb9dd 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -169,6 +169,8 @@ void CAdvancedSettings::Initialize() @@ -24831,10 +26401,10 @@ index 3a52878..3e6901b 100644 1.8.1.6 -From ad793502d0586581120666555f6b6d231c1b249d Mon Sep 17 00:00:00 2001 +From ffa4c08a6d26b68604c4980728a91569097f530d Mon Sep 17 00:00:00 2001 From: xbmc Date: Fri, 2 Nov 2012 13:20:03 +0100 -Subject: [PATCH 086/123] player: fix rewind +Subject: [PATCH 096/136] player: fix rewind --- xbmc/cores/dvdplayer/DVDMessage.h | 5 ++++- @@ -24845,7 +26415,7 @@ Subject: [PATCH 086/123] player: fix rewind 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDMessage.h b/xbmc/cores/dvdplayer/DVDMessage.h -index 3f65ced..ad434d2 100644 +index 2ea8b8f..e8274f9 100644 --- a/xbmc/cores/dvdplayer/DVDMessage.h +++ b/xbmc/cores/dvdplayer/DVDMessage.h @@ -220,7 +220,7 @@ class CDVDMsgPlayerSetState : public CDVDMsg @@ -24882,7 +26452,7 @@ index 3f65ced..ad434d2 100644 class CDVDMsgPlayerSeekChapter : public CDVDMsg diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index b56423b..cdc4b95 100644 +index 994e7b4..c8a4585 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp @@ -1556,11 +1556,13 @@ void CDVDPlayer::HandlePlaySpeed() @@ -24987,7 +26557,7 @@ index b56423b..cdc4b95 100644 UpdatePlayState(0); diff --git a/xbmc/cores/dvdplayer/DVDPlayer.h b/xbmc/cores/dvdplayer/DVDPlayer.h -index 6da30eb..69b659b 100644 +index c6b9ce3..c49b9e7 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.h +++ b/xbmc/cores/dvdplayer/DVDPlayer.h @@ -304,7 +304,7 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer @@ -25012,7 +26582,7 @@ index 6da30eb..69b659b 100644 int m_errorCount; diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 74b4391..11e0b26 100644 +index adee04a..e28c57d 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -1500,7 +1500,7 @@ double CDVDPlayerVideo::GetCurrentPts() @@ -25034,7 +26604,7 @@ index 74b4391..11e0b26 100644 if (!m_pVideoCodec->GetCodecStats(iDecoderPts, iSkippedDeint, interlaced)) iDecoderPts = pts; diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.h b/xbmc/cores/dvdplayer/DVDPlayerVideo.h -index 3c3e007..6ae3860 100644 +index ec30fc5..be22aef 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.h +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.h @@ -50,6 +50,7 @@ class CDroppingStats @@ -25049,17 +26619,17 @@ index 3c3e007..6ae3860 100644 1.8.1.6 -From 13a147ecc9caadc5933691d90af691b4878303f1 Mon Sep 17 00:00:00 2001 +From e1373b7a234d42c675a4394afcfdca25e85ff28b Mon Sep 17 00:00:00 2001 From: xbmc Date: Fri, 23 Nov 2012 17:41:12 +0100 -Subject: [PATCH 087/123] xrandr: fix query for multiple screens +Subject: [PATCH 097/136] xrandr: fix query for multiple screens --- xbmc/windowing/X11/XRandR.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/xbmc/windowing/X11/XRandR.cpp b/xbmc/windowing/X11/XRandR.cpp -index 97b1e32..a3d3543 100644 +index 9e181f2..ce0a02b 100644 --- a/xbmc/windowing/X11/XRandR.cpp +++ b/xbmc/windowing/X11/XRandR.cpp @@ -57,12 +57,14 @@ bool CXRandR::Query(bool force) @@ -25093,10 +26663,10 @@ index 97b1e32..a3d3543 100644 1.8.1.6 -From 0925b7658bf2ed75cea29963c2a535e7829e5b1a Mon Sep 17 00:00:00 2001 +From a8e1b0e463c796066fcd66309b974ed7d699bb25 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 2 Dec 2012 15:46:55 +0100 -Subject: [PATCH 088/123] X11: add debug log to print out refresh after xrr +Subject: [PATCH 098/136] X11: add debug log to print out refresh after xrr event --- @@ -25104,7 +26674,7 @@ Subject: [PATCH 088/123] X11: add debug log to print out refresh after xrr 1 file changed, 6 insertions(+) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index d2dcccd..7403785 100644 +index 9ff947c..a3394e6 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -683,6 +683,12 @@ void CWinSystemX11::NotifyXRREvent() @@ -25124,10 +26694,10 @@ index d2dcccd..7403785 100644 1.8.1.6 -From 9f1759a1b344dbc1b038ce14336381de5dc9dbc1 Mon Sep 17 00:00:00 2001 +From b02869e45241811e11468721a45ddd574a8f00cc Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 11 Dec 2012 11:08:13 +0100 -Subject: [PATCH 089/123] X11: dont call XCloseDisplay on shutdown, it crashes +Subject: [PATCH 099/136] X11: dont call XCloseDisplay on shutdown, it crashes when powered doen by cec on ATI --- @@ -25135,7 +26705,7 @@ Subject: [PATCH 089/123] X11: dont call XCloseDisplay on shutdown, it crashes 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 7403785..0e39867 100644 +index a3394e6..b941c14 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -110,7 +110,8 @@ bool CWinSystemX11::DestroyWindowSystem() @@ -25152,17 +26722,17 @@ index 7403785..0e39867 100644 1.8.1.6 -From 6e7a31afeb0107b9636ffb0790ce348ef50cad5e Mon Sep 17 00:00:00 2001 +From f4d209618fabd698c22843bfd5ae5503c8ec4c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Coutant?= Date: Wed, 12 Dec 2012 19:49:47 +0100 -Subject: [PATCH 090/123] x11: support for multiple x screens +Subject: [PATCH 100/136] x11: support for multiple x screens --- xbmc/windowing/X11/XRandR.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/windowing/X11/XRandR.cpp b/xbmc/windowing/X11/XRandR.cpp -index a3d3543..8846bc6 100644 +index ce0a02b..aa27d2b 100644 --- a/xbmc/windowing/X11/XRandR.cpp +++ b/xbmc/windowing/X11/XRandR.cpp @@ -92,7 +92,7 @@ bool CXRandR::Query(bool force, int screennum) @@ -25178,10 +26748,10 @@ index a3d3543..8846bc6 100644 1.8.1.6 -From 7876a7ae280e920cf6978e4afa48f4ebdedc3910 Mon Sep 17 00:00:00 2001 +From 52ec48f34857ee51438bec6726713d76a1b9a220 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 24 Dec 2012 16:02:42 +0100 -Subject: [PATCH 091/123] pvr: increase changes counter of stream on stream +Subject: [PATCH 101/136] pvr: increase changes counter of stream on stream change, cosmetics after dd307930d39d92f145a01a16600cd00e01ec39be --- @@ -25189,7 +26759,7 @@ Subject: [PATCH 091/123] pvr: increase changes counter of stream on stream 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxPVRClient.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxPVRClient.cpp -index 305ba07..3ad9792 100644 +index 7e35581..7adfa27 100644 --- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxPVRClient.cpp +++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxPVRClient.cpp @@ -339,9 +339,7 @@ void CDVDDemuxPVRClient::RequestStreams() @@ -25209,16 +26779,16 @@ index 305ba07..3ad9792 100644 st->m_parser_split = true; + st->changes++; } - else if (props.stream[i].iCodecType == AVMEDIA_TYPE_VIDEO) + else if (props.stream[i].iCodecType == XBMC_CODEC_TYPE_VIDEO) { -- 1.8.1.6 -From 7bef6de9b9afa5d67b467fa06612e2eafef9b81e Mon Sep 17 00:00:00 2001 +From 899be2ee7821494b1288d628726a55c7358f1de1 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 17 Jan 2013 16:03:22 +0100 -Subject: [PATCH 092/123] X11: add keymapping for XF86XK_Sleep +Subject: [PATCH 102/136] X11: add keymapping for XF86XK_Sleep --- xbmc/windowing/WinEventsX11.cpp | 1 + @@ -25240,17 +26810,17 @@ index 4a5aab4..da5d412 100644 1.8.1.6 -From 8511f31601ff6970648ed51204cc55102dafbf1c Mon Sep 17 00:00:00 2001 +From bb11996a98324a9aa649dd5c4bc5dde7a56b4646 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 21 Jan 2013 09:00:19 +0100 -Subject: [PATCH 093/123] X11: remove toggle full screen after resume +Subject: [PATCH 103/136] X11: remove toggle full screen after resume --- xbmc/powermanagement/PowerManager.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/xbmc/powermanagement/PowerManager.cpp b/xbmc/powermanagement/PowerManager.cpp -index f2a063f..f1e3c4f 100644 +index fa2a21d..c47219c 100644 --- a/xbmc/powermanagement/PowerManager.cpp +++ b/xbmc/powermanagement/PowerManager.cpp @@ -260,11 +260,6 @@ void CPowerManager::OnWake() @@ -25269,17 +26839,17 @@ index f2a063f..f1e3c4f 100644 1.8.1.6 -From a0368631b8ed581ae1fa54bd7b51a3cc4323e8c5 Mon Sep 17 00:00:00 2001 +From da18dc246c24c1f5e41193fccd9fbdd998e4b862 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 23 Jan 2013 17:03:02 +0100 -Subject: [PATCH 094/123] xrandr: set screen on mode change command +Subject: [PATCH 104/136] xrandr: set screen on mode change command --- xbmc/windowing/X11/XRandR.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/windowing/X11/XRandR.cpp b/xbmc/windowing/X11/XRandR.cpp -index 8846bc6..e6d6240 100644 +index aa27d2b..67bf6ca 100644 --- a/xbmc/windowing/X11/XRandR.cpp +++ b/xbmc/windowing/X11/XRandR.cpp @@ -246,7 +246,7 @@ bool CXRandR::SetMode(XOutput output, XMode mode) @@ -25295,10 +26865,10 @@ index 8846bc6..e6d6240 100644 1.8.1.6 -From 9071be89472ecbcc05ffa4bb967883a0b53e3a07 Mon Sep 17 00:00:00 2001 +From 85c1875c1ed563e78620ee21e96e90a1ea390ef5 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 23 Jan 2013 17:03:39 +0100 -Subject: [PATCH 095/123] X11: recreate glx context when output changes +Subject: [PATCH 105/136] X11: recreate glx context when output changes --- xbmc/windowing/X11/WinSystemX11.cpp | 6 +++--- @@ -25306,7 +26876,7 @@ Subject: [PATCH 095/123] X11: recreate glx context when output changes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 0e39867..d865cd7 100644 +index b941c14..c84e793 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -407,11 +407,11 @@ bool CWinSystemX11::IsSuitableVisual(XVisualInfo *vInfo) @@ -25333,7 +26903,7 @@ index 0e39867..d865cd7 100644 g_graphicsContext.Clear(0); g_graphicsContext.Flip(dr); diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index f479c27..7345c06 100644 +index ce3c289..311e4cc 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -74,7 +74,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -25349,56 +26919,51 @@ index f479c27..7345c06 100644 1.8.1.6 -From 76daa1b4fa31511125dc2d3532fc510fcd6a1697 Mon Sep 17 00:00:00 2001 +From 8ff7803668859d0b56739338c9cfea0a50b28fad Mon Sep 17 00:00:00 2001 From: xbmc Date: Fri, 14 Dec 2012 14:19:15 +0100 -Subject: [PATCH 096/123] pvr: do not show selection dialog for a single menu +Subject: [PATCH 106/136] pvr: do not show selection dialog for a single menu hook --- - xbmc/pvr/addons/PVRClients.cpp | 19 +++++++++++-------- - 1 file changed, 11 insertions(+), 8 deletions(-) + xbmc/pvr/addons/PVRClients.cpp | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/xbmc/pvr/addons/PVRClients.cpp b/xbmc/pvr/addons/PVRClients.cpp -index 2b43bcb..d07f23d 100644 +index c84bd4d..a39584b 100644 --- a/xbmc/pvr/addons/PVRClients.cpp +++ b/xbmc/pvr/addons/PVRClients.cpp -@@ -728,16 +728,19 @@ void CPVRClients::ProcessMenuHooks(int iClientID, PVR_MENUHOOK_CAT cat, const CF - if (GetConnectedClient(iClientID, client) && client->HaveMenuHooks(cat)) +@@ -729,6 +729,7 @@ void CPVRClients::ProcessMenuHooks(int iClientID, PVR_MENUHOOK_CAT cat, const CF { hooks = client->GetMenuHooks(); -- std::vector hookIDs; + std::vector hookIDs; + int selection = 0; -- CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); -- pDialog->Reset(); -- pDialog->SetHeading(19196); -- for (unsigned int i = 0; i < hooks->size(); i++) -- pDialog->Add(client->GetString(hooks->at(i).iLocalizedStringId)); + CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); + pDialog->Reset(); +@@ -739,9 +740,11 @@ void CPVRClients::ProcessMenuHooks(int iClientID, PVR_MENUHOOK_CAT cat, const CF + pDialog->Add(client->GetString(hooks->at(i).iLocalizedStringId)); + hookIDs.push_back(i); + } - pDialog->DoModal(); -+ if (hooks->size() > 1) +- +- int selection = pDialog->GetSelectedLabel(); ++ if (hookIDs.size() > 1) + { -+ CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); -+ pDialog->Reset(); -+ pDialog->SetHeading(19196); -+ for (unsigned int i = 0; i < hooks->size(); i++) -+ pDialog->Add(client->GetString(hooks->at(i).iLocalizedStringId)); + pDialog->DoModal(); + selection = pDialog->GetSelectedLabel(); + } - -- int selection = pDialog->GetSelectedLabel(); if (selection >= 0) - client->CallMenuHook(hooks->at(selection), item); + client->CallMenuHook(hooks->at(hookIDs.at(selection)), item); } -- 1.8.1.6 -From 79107721f0b07baa19fcc25931de6fc5d6c0fecf Mon Sep 17 00:00:00 2001 +From d96801eb4eb8fe38f8217890de6b0728b9c00d67 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 3 Feb 2013 08:17:16 +0100 -Subject: [PATCH 097/123] X11: use default screen parameters if no output +Subject: [PATCH 107/136] X11: use default screen parameters if no output connected --- @@ -25406,7 +26971,7 @@ Subject: [PATCH 097/123] X11: use default screen parameters if no output 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index d865cd7..97975dd 100644 +index c84e793..5215f4d 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -205,25 +205,27 @@ bool CWinSystemX11::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool bl @@ -25502,10 +27067,10 @@ index d865cd7..97975dd 100644 1.8.1.6 -From a8e44a830153163fd330b0ceb4dcb5b9554c5a73 Mon Sep 17 00:00:00 2001 +From 3b55e3a3239d6d78abe5a5bb515e9e0791269d11 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 23 Mar 2013 15:13:32 +0100 -Subject: [PATCH 098/123] X11: create parent window +Subject: [PATCH 108/136] X11: create parent window --- xbmc/windowing/X11/WinSystemX11.cpp | 69 +++++++++++++++++++++++-------------- @@ -25513,7 +27078,7 @@ Subject: [PATCH 098/123] X11: create parent window 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 97975dd..0a3efff 100644 +index 5215f4d..e49fa98 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -53,6 +53,7 @@ @@ -25755,7 +27320,7 @@ index 97975dd..0a3efff 100644 CDirtyRegionList dr; diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 7345c06..770ae84 100644 +index 311e4cc..49365a8 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -79,7 +79,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -25771,10 +27336,10 @@ index 7345c06..770ae84 100644 1.8.1.6 -From 106ab1d2c77591f37d915727cf0f3ab8c876b523 Mon Sep 17 00:00:00 2001 +From 5886b4f4c1f33dc17d0f0bd6737ffb445443261c Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 24 Mar 2013 12:30:12 +0100 -Subject: [PATCH 099/123] X11: use system key repeat rate instead of hardcoded +Subject: [PATCH 109/136] X11: use system key repeat rate instead of hardcoded one, taken from 58fd64b194e38b73b5f3132744bab35e994e7441 --- @@ -25976,10 +27541,10 @@ index 102a076..5b1f3fa 100644 1.8.1.6 -From a647eace0d91644e7216187dcb4608df7d2bfa69 Mon Sep 17 00:00:00 2001 +From 93f2e693d0f4079e0fc5be4db844683166bb97c6 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 24 Mar 2013 16:04:48 +0100 -Subject: [PATCH 100/123] linux: use CLOCK_MONOTONIC_RAW as this is not subject +Subject: [PATCH 110/136] linux: use CLOCK_MONOTONIC_RAW as this is not subject to NTP --- @@ -25988,7 +27553,7 @@ Subject: [PATCH 100/123] linux: use CLOCK_MONOTONIC_RAW as this is not subject 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xbmc/threads/SystemClock.cpp b/xbmc/threads/SystemClock.cpp -index 5a1c3ea..6dea6bf 100644 +index 5bb749c..2f995d0 100644 --- a/xbmc/threads/SystemClock.cpp +++ b/xbmc/threads/SystemClock.cpp @@ -42,7 +42,7 @@ @@ -26001,7 +27566,7 @@ index 5a1c3ea..6dea6bf 100644 #endif if (!start_time_set) diff --git a/xbmc/utils/TimeUtils.cpp b/xbmc/utils/TimeUtils.cpp -index 8304ef6..ba27257 100644 +index c06b8c5..4390d2e 100644 --- a/xbmc/utils/TimeUtils.cpp +++ b/xbmc/utils/TimeUtils.cpp @@ -43,7 +43,7 @@ int64_t CurrentHostCounter(void) @@ -26017,17 +27582,17 @@ index 8304ef6..ba27257 100644 1.8.1.6 -From 2cef9ccf704ba1e9144a318044e4cd622a2a4fde Mon Sep 17 00:00:00 2001 +From d302ad05afaf2abe50cc17b0ad76bcd20b30250d Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 28 Mar 2013 15:18:53 +0100 -Subject: [PATCH 101/123] OMXPlayer: some caching fixes for pvr +Subject: [PATCH 111/136] OMXPlayer: some caching fixes for pvr --- xbmc/cores/omxplayer/OMXPlayer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/omxplayer/OMXPlayer.cpp b/xbmc/cores/omxplayer/OMXPlayer.cpp -index f20c399..c096f32 100644 +index b3d4314..12f6087 100644 --- a/xbmc/cores/omxplayer/OMXPlayer.cpp +++ b/xbmc/cores/omxplayer/OMXPlayer.cpp @@ -2459,7 +2459,8 @@ void COMXPlayer::HandleMessages() @@ -26044,20 +27609,20 @@ index f20c399..c096f32 100644 1.8.1.6 -From 4ed5d6875bd066d4d1ab8518facd02ecb166829c Mon Sep 17 00:00:00 2001 +From d7b3c8730b73b45e21f8e2c6af5ae13fc1a2408f Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 28 Mar 2013 20:50:59 +0100 -Subject: [PATCH 102/123] fix incorrect display of fps when dr kicks in +Subject: [PATCH 112/136] fix incorrect display of fps when dr kicks in --- xbmc/Application.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp -index a5603a2..ce0a147 100644 +index eb81f6e..93a790c 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp -@@ -2142,10 +2142,11 @@ void CApplication::Render() +@@ -2153,10 +2153,11 @@ void CApplication::Render() if (frameTime < singleFrameTime) Sleep(singleFrameTime - frameTime); } @@ -26074,17 +27639,17 @@ index a5603a2..ce0a147 100644 1.8.1.6 -From 9d33e9711b3ff21d18832c2db087e6d5cd04f3c4 Mon Sep 17 00:00:00 2001 +From 9e585b158ee04aa95ed4cfe3f7d51bb3d38cd627 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 8 Apr 2013 11:18:31 +0200 -Subject: [PATCH 103/123] squash to dropping control +Subject: [PATCH 113/136] squash to dropping control --- xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 11e0b26..3f915ce 100644 +index e28c57d..3c3309b 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -39,6 +39,7 @@ @@ -26099,10 +27664,10 @@ index 11e0b26..3f915ce 100644 1.8.1.6 -From 9fa7033fc9da50c54ad133e7ea016eaab89967c9 Mon Sep 17 00:00:00 2001 +From 22a6a2ad21e3bbfac94102794f9141634d6f759b Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 11 Apr 2013 12:33:46 +0200 -Subject: [PATCH 104/123] pvr: try SwtichChannel when selecting a channel via +Subject: [PATCH 114/136] pvr: try SwtichChannel when selecting a channel via EPG --- @@ -26110,7 +27675,7 @@ Subject: [PATCH 104/123] pvr: try SwtichChannel when selecting a channel via 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/xbmc/pvr/windows/GUIWindowPVRGuide.cpp b/xbmc/pvr/windows/GUIWindowPVRGuide.cpp -index 6b999e4..256a295 100644 +index 8616980..198b074 100644 --- a/xbmc/pvr/windows/GUIWindowPVRGuide.cpp +++ b/xbmc/pvr/windows/GUIWindowPVRGuide.cpp @@ -427,15 +427,16 @@ bool CGUIWindowPVRGuide::PlayEpgItem(CFileItem *item) @@ -26137,10 +27702,10 @@ index 6b999e4..256a295 100644 1.8.1.6 -From b807258fddaca8f65a6552633ada3e75412271d4 Mon Sep 17 00:00:00 2001 +From 572ed7a6fe6427533c92ea6637dc800759c7bf6f Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 13 Apr 2013 08:32:06 +0200 -Subject: [PATCH 105/123] X11: fix mouse coverage +Subject: [PATCH 115/136] X11: fix mouse coverage --- xbmc/windowing/X11/WinSystemX11.cpp | 11 ++++++++--- @@ -26148,7 +27713,7 @@ Subject: [PATCH 105/123] X11: fix mouse coverage 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 0a3efff..bf95bc7 100644 +index e49fa98..186a28e 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -581,10 +581,10 @@ void CWinSystemX11::NotifyAppFocusChange(bool bGaining) @@ -26191,7 +27756,7 @@ index 0a3efff..bf95bc7 100644 CDirtyRegionList dr; RefreshGlxContext(!m_currentOutput.Equals(output)); diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 770ae84..084f546 100644 +index 49365a8..924af1d 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -88,6 +88,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -26206,10 +27771,10 @@ index 770ae84..084f546 100644 1.8.1.6 -From 59d09d7e25cc8654a1d89d4e1f55596c8ad3cd16 Mon Sep 17 00:00:00 2001 +From f397661d5f0dbc97d6d133a4326deeca7db44e11 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Wed, 8 May 2013 13:14:58 +0200 -Subject: [PATCH 106/123] X11: fix incorrectly used screen num in desktop +Subject: [PATCH 116/136] X11: fix incorrectly used screen num in desktop resolution --- @@ -26217,7 +27782,7 @@ Subject: [PATCH 106/123] X11: fix incorrectly used screen num in desktop 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index bf95bc7..0221036 100644 +index 186a28e..66955b8 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -266,9 +266,9 @@ void CWinSystemX11::UpdateResolutions() @@ -26244,10 +27809,10 @@ index bf95bc7..0221036 100644 1.8.1.6 -From f2fecf3c39f9939bd4504f1148a8d93b9e67eabe Mon Sep 17 00:00:00 2001 +From 758cbebfba5fb5dcddca399a7fcd1c49382015f8 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Thu, 9 May 2013 12:07:09 +0200 -Subject: [PATCH 107/123] X11: do not overwrite user selected monitor with +Subject: [PATCH 117/136] X11: do not overwrite user selected monitor with fallback --- @@ -26256,7 +27821,7 @@ Subject: [PATCH 107/123] X11: do not overwrite user selected monitor with 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 0221036..e768c44 100644 +index 66955b8..2ce64af 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -170,7 +170,7 @@ bool CWinSystemX11::ResizeWindow(int newWidth, int newHeight, int newLeft, int n @@ -26357,7 +27922,7 @@ index 0221036..e768c44 100644 if (out) CLog::Log(LOGDEBUG, "%s - current output: %s, mode: %s, refresh: %.3f", __FUNCTION__ diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 084f546..30f5fa0 100644 +index 924af1d..2fb9e0f 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -94,6 +94,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -26372,10 +27937,10 @@ index 084f546..30f5fa0 100644 1.8.1.6 -From 80fa9e33ccd53aa00bae4c6750cb91483eab4a70 Mon Sep 17 00:00:00 2001 +From 21f9058201f4968525f53dc6d05e486ad0fb8f14 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sun, 12 May 2013 10:50:30 +0200 -Subject: [PATCH 108/123] xrandr: add turn on/off to wrapper +Subject: [PATCH 118/136] xrandr: add turn on/off to wrapper --- xbmc/windowing/X11/XRandR.cpp | 78 +++++++++++++++++++++++++++++++++++++++---- @@ -26383,7 +27948,7 @@ Subject: [PATCH 108/123] xrandr: add turn on/off to wrapper 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/xbmc/windowing/X11/XRandR.cpp b/xbmc/windowing/X11/XRandR.cpp -index e6d6240..b76c4f6 100644 +index 67bf6ca..4e480bf 100644 --- a/xbmc/windowing/X11/XRandR.cpp +++ b/xbmc/windowing/X11/XRandR.cpp @@ -28,6 +28,7 @@ @@ -26514,7 +28079,7 @@ index e6d6240..b76c4f6 100644 Query(); diff --git a/xbmc/windowing/X11/XRandR.h b/xbmc/windowing/X11/XRandR.h -index 26c2653..2741879 100644 +index d37838a..059062f 100644 --- a/xbmc/windowing/X11/XRandR.h +++ b/xbmc/windowing/X11/XRandR.h @@ -94,8 +94,8 @@ class CXRandR @@ -26541,10 +28106,10 @@ index 26c2653..2741879 100644 1.8.1.6 -From 658f7678d3c10cebffeafd04979a6f66929f0a43 Mon Sep 17 00:00:00 2001 +From cbec1e01b383d19b0f830d252fe8913f0c9f55ea Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sun, 19 May 2013 12:55:35 +0200 -Subject: [PATCH 109/123] xrandr: add GetPreferredMode to wrapper +Subject: [PATCH 119/136] xrandr: add GetPreferredMode to wrapper --- xbmc/windowing/X11/XRandR.cpp | 23 +++++++++++++++++++++++ @@ -26552,7 +28117,7 @@ Subject: [PATCH 109/123] xrandr: add GetPreferredMode to wrapper 2 files changed, 24 insertions(+) diff --git a/xbmc/windowing/X11/XRandR.cpp b/xbmc/windowing/X11/XRandR.cpp -index b76c4f6..380a194 100644 +index 4e480bf..4809821 100644 --- a/xbmc/windowing/X11/XRandR.cpp +++ b/xbmc/windowing/X11/XRandR.cpp @@ -347,6 +347,29 @@ XMode CXRandR::GetCurrentMode(CStdString outputName) @@ -26586,7 +28151,7 @@ index b76c4f6..380a194 100644 { Query(); diff --git a/xbmc/windowing/X11/XRandR.h b/xbmc/windowing/X11/XRandR.h -index 2741879..24ad1d0 100644 +index 059062f..ab7cc63 100644 --- a/xbmc/windowing/X11/XRandR.h +++ b/xbmc/windowing/X11/XRandR.h @@ -98,6 +98,7 @@ class CXRandR @@ -26601,10 +28166,10 @@ index 2741879..24ad1d0 100644 1.8.1.6 -From c2d9632a75a8f659f58bd0ad1367242639840b07 Mon Sep 17 00:00:00 2001 +From 5d21236a1a099b7daa68b956ab39161bbe22151f Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sat, 11 May 2013 17:12:12 +0200 -Subject: [PATCH 110/123] X11: multi-head improvement - poll for desired output +Subject: [PATCH 120/136] X11: multi-head improvement - poll for desired output if we do not get an xrr event --- @@ -26619,10 +28184,10 @@ Subject: [PATCH 110/123] X11: multi-head improvement - poll for desired output 8 files changed, 105 insertions(+), 12 deletions(-) diff --git a/language/English/strings.po b/language/English/strings.po -index d603702..79a3996 100644 +index 1fdf542..38d0b08 100644 --- a/language/English/strings.po +++ b/language/English/strings.po -@@ -6232,7 +6232,7 @@ msgctxt "#14071" +@@ -6235,7 +6235,7 @@ msgctxt "#14071" msgid "Allow file renaming and deletion" msgstr "" @@ -26631,7 +28196,7 @@ index d603702..79a3996 100644 msgctxt "#14074" msgid "Set timezone" -@@ -6364,7 +6364,12 @@ msgctxt "#14100" +@@ -6367,7 +6367,12 @@ msgctxt "#14100" msgid "Stop ripping CD" msgstr "" @@ -26646,7 +28211,7 @@ index d603702..79a3996 100644 #: xbmc/dialogs/GUIDialogFavourites.cpp msgctxt "#15015" diff --git a/system/settings/settings.xml b/system/settings/settings.xml -index a863dae..1102691 100644 +index 4655d59..1875ad4 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -1855,6 +1855,11 @@ @@ -26670,7 +28235,7 @@ index a863dae..1102691 100644 false diff --git a/xbmc/settings/DisplaySettings.cpp b/xbmc/settings/DisplaySettings.cpp -index 203c0f1..dfc1ab8 100644 +index cf5deba..0cbcdd1 100644 --- a/xbmc/settings/DisplaySettings.cpp +++ b/xbmc/settings/DisplaySettings.cpp @@ -244,6 +244,10 @@ bool CDisplaySettings::OnSettingChanging(const CSetting *setting) @@ -26720,7 +28285,7 @@ index 5b1f3fa..d4a4b47 100644 bool m_xrrEventPending; }; diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index e768c44..6b1ed87 100644 +index 2ce64af..7e4b637 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -250,18 +250,62 @@ void CWinSystemX11::UpdateResolutions() @@ -26849,7 +28414,7 @@ index e768c44..6b1ed87 100644 found = true; break; diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h -index 30f5fa0..9c7ecdd 100644 +index 2fb9e0f..ec01bf7 100644 --- a/xbmc/windowing/X11/WinSystemX11.h +++ b/xbmc/windowing/X11/WinSystemX11.h @@ -68,7 +68,7 @@ class CWinSystemX11 : public CWinSystemBase @@ -26862,7 +28427,7 @@ index 30f5fa0..9c7ecdd 100644 bool IsCurrentOutput(CStdString output); void NotifyMouseCoverage(bool covered); diff --git a/xbmc/windowing/X11/XRandR.cpp b/xbmc/windowing/X11/XRandR.cpp -index 380a194..650a6ef 100644 +index 4809821..1ad26b2 100644 --- a/xbmc/windowing/X11/XRandR.cpp +++ b/xbmc/windowing/X11/XRandR.cpp @@ -149,10 +149,14 @@ bool CXRandR::Query(bool force, int screennum, bool ignoreoff) @@ -26885,10 +28450,10 @@ index 380a194..650a6ef 100644 1.8.1.6 -From e3f99b95970e08f6e36867152534378b3e064e1d Mon Sep 17 00:00:00 2001 +From 71cc7a9d64c06d3fe0f3a13f6e14a1b2175a35f6 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Wed, 15 May 2013 09:14:34 +0200 -Subject: [PATCH 111/123] X11: ignore mouse move event form other windows +Subject: [PATCH 121/136] X11: ignore mouse move event form other windows --- xbmc/windowing/WinEventsX11.cpp | 4 +++- @@ -26920,17 +28485,17 @@ index 879d8f2..2ec9b6f 100644 1.8.1.6 -From b3ec49babe443c5c1e0156e86992dcc39ac29dec Mon Sep 17 00:00:00 2001 +From 0072bf85d4c6a8046cbc0bbf27a80033906f2bfe Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sun, 2 Jun 2013 14:53:45 +0200 -Subject: [PATCH 112/123] vdpau: fix segfault caused by uninitialized member +Subject: [PATCH 122/136] vdpau: fix segfault caused by uninitialized member --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index fc4c030..9bafdd7 100644 +index 2805613..cdfceb7 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -90,6 +90,7 @@ @@ -26945,17 +28510,17 @@ index fc4c030..9bafdd7 100644 1.8.1.6 -From 4ffa47f4352b8ddc59242615c86115781e5412ea Mon Sep 17 00:00:00 2001 +From 9ab5f948068b49d38cc721f1e1107ac4f23f3a5b Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Tue, 11 Jun 2013 16:13:45 +0200 -Subject: [PATCH 113/123] vdpau: sync video mixer +Subject: [PATCH 123/136] vdpau: sync video mixer --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 9bafdd7..55ef4dc 100644 +index cdfceb7..75ac6f0 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -2350,6 +2350,21 @@ void CMixer::ProcessPicture() @@ -26984,10 +28549,10 @@ index 9bafdd7..55ef4dc 100644 1.8.1.6 -From 890c33ae9afbca2659b1244aa7c039279f454ea1 Mon Sep 17 00:00:00 2001 +From c32f6f0f83cf5e85526e24753b9af7d4baf2b08b Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Tue, 11 Jun 2013 16:20:29 +0200 -Subject: [PATCH 114/123] renderer: allow some lateness within vblank interval +Subject: [PATCH 124/136] renderer: allow some lateness within vblank interval --- xbmc/cores/VideoRenderers/RenderManager.cpp | 12 ++++++++++-- @@ -26995,7 +28560,7 @@ Subject: [PATCH 114/123] renderer: allow some lateness within vblank interval 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index f94760c..83a824a 100644 +index 7e12a46..9347766 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -398,6 +398,8 @@ void CXBMCRenderManager::FrameFinish() @@ -27032,7 +28597,7 @@ index f94760c..83a824a 100644 ++curr; ++prev; diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h -index 7a3a530..480e4dc 100644 +index befd851..27283ec 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.h +++ b/xbmc/cores/VideoRenderers/RenderManager.h @@ -251,6 +251,7 @@ class CXBMCRenderManager @@ -27047,10 +28612,10 @@ index 7a3a530..480e4dc 100644 1.8.1.6 -From 28912445572715df8588111eba8848d283f12233 Mon Sep 17 00:00:00 2001 +From 6a67efb103960272e96ef716cbeff0d2880db689 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Fri, 14 Jun 2013 09:23:22 +0200 -Subject: [PATCH 115/123] vdpau: calculate timestamp of second field when doing +Subject: [PATCH 125/136] vdpau: calculate timestamp of second field when doing deinterlacing --- @@ -27058,7 +28623,7 @@ Subject: [PATCH 115/123] vdpau: calculate timestamp of second field when doing 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 55ef4dc..27d63f5 100644 +index 75ac6f0..67b6cf2 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -2314,7 +2314,9 @@ void CMixer::ProcessPicture() @@ -27076,17 +28641,17 @@ index 55ef4dc..27d63f5 100644 1.8.1.6 -From 2eb311f322f2b671218447472a89ca1125707801 Mon Sep 17 00:00:00 2001 +From a42f4fb77882658c70d9e53a0c2510395d005572 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Fri, 14 Jun 2013 10:46:58 +0200 -Subject: [PATCH 116/123] vdpau: comment debug log: long decoding time +Subject: [PATCH 126/136] vdpau: comment debug log: long decoding time --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 27d63f5..593f96c 100644 +index 67b6cf2..55430a6 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -874,7 +874,7 @@ void CDecoder::FFDrawSlice(struct AVCodecContext *s, @@ -27115,10 +28680,10 @@ index 27d63f5..593f96c 100644 1.8.1.6 -From 686e6da18cec2138c1543fa402296eb92c7daadc Mon Sep 17 00:00:00 2001 +From 0f900c89fd4136858fcb45365004dd236499fcf5 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 16 Jun 2013 13:22:58 +0200 -Subject: [PATCH 117/123] X11: another fix for mouse coverage +Subject: [PATCH 127/136] X11: another fix for mouse coverage --- xbmc/windowing/WinEventsX11.cpp | 6 ++++-- @@ -27151,20 +28716,20 @@ index 2ec9b6f..4ed978c 100644 1.8.1.6 -From 1814ed1f05d82067956c1eaec459f7eeace006c9 Mon Sep 17 00:00:00 2001 +From 15b76d91f51cb399b9574fe2758255214c7fba66 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 16 Jun 2013 13:23:19 +0200 -Subject: [PATCH 118/123] renderer: delete fence on uninit +Subject: [PATCH 128/136] renderer: delete fence on uninit --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index c663423..858d39d 100644 +index 73a8cc8..6b28601 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -1164,7 +1164,12 @@ void CLinuxRendererGL::UnInit() +@@ -1166,7 +1166,12 @@ void CLinuxRendererGL::UnInit() // YV12 textures for (int i = 0; i < NUM_BUFFERS; ++i) @@ -27181,20 +28746,20 @@ index c663423..858d39d 100644 1.8.1.6 -From 90727fe2c507dccd7dfc308a094a492a301ef763 Mon Sep 17 00:00:00 2001 +From 168265eeba10a227cee2c310d8812f67ced95a25 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sun, 16 Jun 2013 14:28:01 +0200 -Subject: [PATCH 119/123] renderer: limit fence to vdpau +Subject: [PATCH 129/136] renderer: limit fence to vdpau --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 858d39d..bb198f3 100644 +index 6b28601..1594d45 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -1254,14 +1254,17 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1256,14 +1256,17 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) VerifyGLState(); } @@ -27222,10 +28787,10 @@ index 858d39d..bb198f3 100644 1.8.1.6 -From 6d8df3121b0e0b4f8e70ef454b04dd36783fbbf7 Mon Sep 17 00:00:00 2001 +From 804b001ee6c35f10dbb8076816250e8fccaf04f4 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Thu, 4 Jul 2013 16:38:26 +0200 -Subject: [PATCH 120/123] XVBA: replace CODEC_IS with AV_CODEC_ID +Subject: [PATCH 130/136] XVBA: replace CODEC_IS with AV_CODEC_ID --- xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp | 14 +++++++------- @@ -27300,17 +28865,17 @@ index 54d7aea..5845dbf 100644 1.8.1.6 -From aca51d06f3589e934dbb49d44b45a81a08e29d52 Mon Sep 17 00:00:00 2001 +From 4de4eabbb2532bb841618980625ce1973e858377 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Fri, 5 Jul 2013 12:14:00 +0200 -Subject: [PATCH 121/123] X11: set windows class name +Subject: [PATCH 131/136] X11: set windows class name --- xbmc/windowing/X11/WinSystemX11.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp -index 6b1ed87..30eff67 100644 +index 7e4b637..44e40a3 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -980,8 +980,10 @@ bool CWinSystemX11::SetWindow(int width, int height, bool fullscreen, const CStd @@ -27345,17 +28910,17 @@ index 6b1ed87..30eff67 100644 1.8.1.6 -From 18f918782577c79e8cb1cef6ad0650c2668baa92 Mon Sep 17 00:00:00 2001 +From d5461fcb39aea90cd9deb3ccac1dd25a0d6fd865 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sat, 13 Jul 2013 20:00:45 +0200 -Subject: [PATCH 122/123] VDPAU: revert sync mixer, does a busy wait +Subject: [PATCH 132/136] VDPAU: revert sync mixer, does a busy wait --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 31 +++++++++++++------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 593f96c..f630bcb 100644 +index 55430a6..aac0646 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -1139,7 +1139,7 @@ void CVdpauRenderPicture::ReturnUnused() @@ -27414,10 +28979,10 @@ index 593f96c..f630bcb 100644 1.8.1.6 -From da1ff12885a9aec8e6cc1eb7a060e9a3f6dcc2e4 Mon Sep 17 00:00:00 2001 +From b6d69ffe7399e8f75927b32ae8b5c421247b2bf7 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sun, 14 Jul 2013 14:21:52 +0200 -Subject: [PATCH 123/123] ActiveAE: Make ActiveAE default Audio Engine to get +Subject: [PATCH 133/136] ActiveAE: Make ActiveAE default Audio Engine to get it tested via ppa --- @@ -27425,7 +28990,7 @@ Subject: [PATCH 123/123] ActiveAE: Make ActiveAE default Audio Engine to get 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp -index d5517f3..07b4095 100644 +index 250056e..9c2ccb6 100644 --- a/xbmc/cores/AudioEngine/AEFactory.cpp +++ b/xbmc/cores/AudioEngine/AEFactory.cpp @@ -97,7 +97,7 @@ bool CAEFactory::LoadEngine() @@ -27440,3 +29005,99 @@ index d5517f3..07b4095 100644 -- 1.8.1.6 + +From 81ab9de24651da35b3dc3f1d4e1b292c7ac5877b Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Sun, 21 Jul 2013 13:03:45 +0200 +Subject: [PATCH 134/136] ffmpeg: xvba - add missing pix formats for xvba + +--- + lib/ffmpeg/libavcodec/h263dec.c | 3 +++ + lib/ffmpeg/libavcodec/h264.c | 3 +++ + 2 files changed, 6 insertions(+) + +diff --git a/lib/ffmpeg/libavcodec/h263dec.c b/lib/ffmpeg/libavcodec/h263dec.c +index e231b08..6fcd2a0 100644 +--- a/lib/ffmpeg/libavcodec/h263dec.c ++++ b/lib/ffmpeg/libavcodec/h263dec.c +@@ -769,6 +769,9 @@ int ff_h263_decode_frame(AVCodecContext *avctx, + #if CONFIG_VDPAU + AV_PIX_FMT_VDPAU, + #endif ++#if CONFIG_XVBA ++ AV_PIX_FMT_XVBA_VLD, ++#endif + AV_PIX_FMT_YUV420P, + AV_PIX_FMT_NONE + }; +diff --git a/lib/ffmpeg/libavcodec/h264.c b/lib/ffmpeg/libavcodec/h264.c +index 299039f..2f628ab 100644 +--- a/lib/ffmpeg/libavcodec/h264.c ++++ b/lib/ffmpeg/libavcodec/h264.c +@@ -101,6 +101,9 @@ + #if CONFIG_H264_VDPAU_HWACCEL + AV_PIX_FMT_VDPAU, + #endif ++#if CONFIG_H264_XVBA_HWACCEL ++ AV_PIX_FMT_XVBA_VLD, ++#endif + AV_PIX_FMT_YUVJ420P, + AV_PIX_FMT_NONE + }; +-- +1.8.1.6 + + +From fe7dcabef8bb02c29494206818bb20491767cbc0 Mon Sep 17 00:00:00 2001 +From: spiff +Date: Tue, 16 Jul 2013 14:34:04 +0200 +Subject: [PATCH 135/136] fixed: typo + +--- + language/English/strings.po | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/language/English/strings.po b/language/English/strings.po +index 38d0b08..484c564 100644 +--- a/language/English/strings.po ++++ b/language/English/strings.po +@@ -6369,7 +6369,7 @@ msgstr "" + + #: xbmc/settings/settings.xml + msgctxt "#14101" +-msgid "Swtich off other Monitor" ++msgid "Switch off other Monitor" + msgstr "" + + #empty strings from id 14102 to 15014 +-- +1.8.1.6 + + +From 275709a2b99e437d2940bc2b3126b96700e03d39 Mon Sep 17 00:00:00 2001 +From: Rainer Hochecker +Date: Thu, 25 Jul 2013 17:18:13 +0200 +Subject: [PATCH 136/136] ActiveAE: slightly reduce buffer size + +--- + xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +index 4b64235..7835e81 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +@@ -30,8 +30,8 @@ + #include "settings/AdvancedSettings.h" + #include "windowing/WindowingFactory.h" + +-#define MAX_CACHE_LEVEL 0.5 // total cache time of stream in seconds +-#define MAX_WATER_LEVEL 0.25 // buffered time after stream stages in seconds ++#define MAX_CACHE_LEVEL 0.4 // total cache time of stream in seconds ++#define MAX_WATER_LEVEL 0.2 // buffered time after stream stages in seconds + + void CEngineStats::Reset(unsigned int sampleRate) + { +-- +1.8.1.6 + diff --git a/packages/mediacenter/xbmc/patches/c218d5c/xbmc-995.10-disable-alt-tab.patch b/packages/mediacenter/xbmc/patches/f68634b/xbmc-995.10-disable-alt-tab.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/c218d5c/xbmc-995.10-disable-alt-tab.patch rename to packages/mediacenter/xbmc/patches/f68634b/xbmc-995.10-disable-alt-tab.patch diff --git a/packages/mediacenter/xbmc/patches/c218d5c/xbmc-999.01-automake-1.13.patch b/packages/mediacenter/xbmc/patches/f68634b/xbmc-999.01-automake-1.13.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/c218d5c/xbmc-999.01-automake-1.13.patch rename to packages/mediacenter/xbmc/patches/f68634b/xbmc-999.01-automake-1.13.patch From 076f558bdb8a74963ddf9e5d824aea5731a2443a Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 28 Jul 2013 04:47:39 +0200 Subject: [PATCH 014/103] scripts/build: cosmetics Signed-off-by: Stephan Raue --- scripts/build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build b/scripts/build index 31fb5e4d84..6a6bc83526 100755 --- a/scripts/build +++ b/scripts/build @@ -183,7 +183,7 @@ if [ ! -f $STAMP ]; then cd $PKG_BUILD - if [ "$TARGET" = "target" ]; then + if [ "$TARGET" = "target" ]; then if [ -f "$PKG_CONFIGURE_SCRIPT" -o -f "$PKG_CMAKE_SCRIPT" ]; then mkdir -p .$TARGET_NAME cd .$TARGET_NAME From 9869c043f5e34092af9655a78ba24adfd0025b49 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 28 Jul 2013 05:47:47 +0200 Subject: [PATCH 015/103] bluez: convert to new package format Signed-off-by: Stephan Raue --- packages/network/bluez/build | 63 ---------------------- packages/network/bluez/install | 66 ----------------------- packages/network/bluez/meta | 41 -------------- packages/network/bluez/package.mk | 89 +++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 170 deletions(-) delete mode 100755 packages/network/bluez/build delete mode 100755 packages/network/bluez/install delete mode 100644 packages/network/bluez/meta create mode 100644 packages/network/bluez/package.mk diff --git a/packages/network/bluez/build b/packages/network/bluez/build deleted file mode 100755 index e91eec2ab7..0000000000 --- a/packages/network/bluez/build +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options - -if [ "$DEBUG" = "yes" ]; then - DEBUG_CONFIG="--enable-debug" -else - DEBUG_CONFIG="--disable-debug" -fi - -if [ "$DEVTOOLS" = "yes" ]; then - DEVTOOLS_CONFIG="--enable-monitor --enable-test --enable-tools" -else - DEVTOOLS_CONFIG="--disable-monitor --disable-test --enable-tools" -fi - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --libexecdir=/usr/lib \ - --localstatedir=/var \ - --disable-dependency-tracking \ - --disable-silent-rules \ - --disable-shared \ - --enable-static \ - --enable-library \ - --enable-usb \ - --disable-udev \ - --disable-cups \ - --disable-obex \ - --enable-client \ - --disable-systemd \ - --enable-datafiles \ - --disable-experimental \ - --with-gnu-ld \ - $DEBUG_CONFIG \ - $DEVTOOLS_CONFIG \ - storagedir=/storage/.cache/bluetooth - -make -$MAKEINSTALL diff --git a/packages/network/bluez/install b/packages/network/bluez/install deleted file mode 100755 index a274eda245..0000000000 --- a/packages/network/bluez/install +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options - -mkdir -p $INSTALL/etc/dbus-1/system.d - cp $PKG_BUILD/src/bluetooth.conf $INSTALL/etc/dbus-1/system.d - -mkdir -p $INSTALL/usr/lib/bluetooth - cp $PKG_BUILD/src/bluetoothd $INSTALL/usr/lib/bluetooth - cp $PKG_BUILD/obexd/src/obexd $INSTALL/usr/lib/bluetooth - -# client - mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/client/bluetoothctl $INSTALL/usr/bin - -# tools -# mkdir -p $INSTALL/lib/udev -# cp $PKG_BUILD/tools/hid2hci $INSTALL/lib/udev - -# mkdir -p $INSTALL/lib/udev/rules.d -# cp $PKG_BUILD/tools/97-hid2hci.rules $INSTALL/lib/udev/rules.d - -if [ "$DEVTOOLS" = "yes" ]; then -# tools - mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/tools/bccmd $INSTALL/usr/bin - cp $PKG_BUILD/tools/ciptool $INSTALL/usr/bin - cp $PKG_BUILD/tools/hciattach $INSTALL/usr/bin - cp $PKG_BUILD/tools/hciconfig $INSTALL/usr/bin - cp $PKG_BUILD/tools/hcidump $INSTALL/usr/bin - cp $PKG_BUILD/tools/hcitool $INSTALL/usr/bin - cp $PKG_BUILD/tools/l2ping $INSTALL/usr/bin - cp $PKG_BUILD/tools/l2test $INSTALL/usr/bin - cp $PKG_BUILD/tools/rctest $INSTALL/usr/bin - cp $PKG_BUILD/tools/rfcomm $INSTALL/usr/bin - cp $PKG_BUILD/tools/sdptool $INSTALL/usr/bin - -# monitor - mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/monitor/btmon $INSTALL/usr/bin - -# test - mkdir -p $INSTALL/usr/lib/bluez/test - cp -P $PKG_BUILD/test/* $INSTALL/usr/lib/bluez/test - chmod +x $INSTALL/usr/lib/bluez/test/* -fi diff --git a/packages/network/bluez/meta b/packages/network/bluez/meta deleted file mode 100644 index 8ae04883a2..0000000000 --- a/packages/network/bluez/meta +++ /dev/null @@ -1,41 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="bluez" -PKG_VERSION="5.7" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://www.bluez.org/" -PKG_URL="http://www.kernel.org/pub/linux/bluetooth/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_DEPENDS="libusb-compat dbus glib" -PKG_BUILD_DEPENDS="toolchain libusb-compat dbus glib readline" -PKG_PRIORITY="optional" -PKG_SECTION="network" -PKG_SHORTDESC="bluez: Bluetooth Tools and System Daemons for Linux." -PKG_LONGDESC="Bluetooth Tools and System Daemons for Linux." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="yes" - -if [ "$ALSA_SUPPORT" = yes ]; then - PKG_DEPENDS="$PKG_DEPENDS alsa-lib" - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS alsa-lib" -fi diff --git a/packages/network/bluez/package.mk b/packages/network/bluez/package.mk new file mode 100644 index 0000000000..308e3ce147 --- /dev/null +++ b/packages/network/bluez/package.mk @@ -0,0 +1,89 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="bluez" +PKG_VERSION="5.7" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://www.bluez.org/" +PKG_URL="http://www.kernel.org/pub/linux/bluetooth/$PKG_NAME-$PKG_VERSION.tar.xz" +PKG_DEPENDS="libusb-compat dbus glib" +PKG_BUILD_DEPENDS_TARGET="toolchain libusb-compat dbus glib readline" +PKG_PRIORITY="optional" +PKG_SECTION="network" +PKG_SHORTDESC="bluez: Bluetooth Tools and System Daemons for Linux." +PKG_LONGDESC="Bluetooth Tools and System Daemons for Linux." + +PKG_IS_ADDON="no" +PKG_AUTORECONF="yes" + +if [ "$DEBUG" = "yes" ]; then + BLUEZ_CONFIG="--enable-debug" +else + BLUEZ_CONFIG="--disable-debug" +fi + +if [ "$DEVTOOLS" = "yes" ]; then + BLUEZ_CONFIG="$BLUEZ_CONFIG --enable-monitor --enable-test --enable-tools" +else + BLUEZ_CONFIG="$BLUEZ_CONFIG --disable-monitor --disable-test --enable-tools" +fi + +PKG_CONFIGURE_OPTS_TARGET="--disable-dependency-tracking \ + --disable-silent-rules \ + --disable-shared \ + --enable-static \ + --enable-library \ + --enable-usb \ + --disable-udev \ + --disable-cups \ + --disable-obex \ + --enable-client \ + --disable-systemd \ + --enable-datafiles \ + --disable-experimental \ + --with-gnu-ld \ + $BLUEZ_CONFIG \ + storagedir=/storage/.cache/bluetooth" + +pre_configure_target() { +# bluez fails to build in subdirs + cd $ROOT/$PKG_BUILD + rm -rf .$TARGET_NAME +} + +post_makeinstall_target() { + if [ ! "$DEVTOOLS" = "yes" ]; then + rm -rf $INSTALL/usr/bin/bccmd + rm -rf $INSTALL/usr/bin/ciptool + rm -rf $INSTALL/usr/bin/hciattach + rm -rf $INSTALL/usr/bin/hciconfig + rm -rf $INSTALL/usr/bin/hcidump + rm -rf $INSTALL/usr/bin/hcitool + rm -rf $INSTALL/usr/bin/l2ping + rm -rf $INSTALL/usr/bin/l2test + rm -rf $INSTALL/usr/bin/rctest + rm -rf $INSTALL/usr/bin/rfcomm + rm -rf $INSTALL/usr/bin/sdptool + rm -rf $INSTALL/usr/bin/btmon + rm -rf $INSTALL/usr/lib/bluez/test + fi +} From 6479c3134f1982d4ebdbffca994b0b6a9e62e039 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 28 Jul 2013 05:59:24 +0200 Subject: [PATCH 016/103] bluez: simplyfing package script Signed-off-by: Stephan Raue --- packages/network/bluez/package.mk | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/packages/network/bluez/package.mk b/packages/network/bluez/package.mk index 308e3ce147..44b6aae99b 100644 --- a/packages/network/bluez/package.mk +++ b/packages/network/bluez/package.mk @@ -44,7 +44,7 @@ fi if [ "$DEVTOOLS" = "yes" ]; then BLUEZ_CONFIG="$BLUEZ_CONFIG --enable-monitor --enable-test --enable-tools" else - BLUEZ_CONFIG="$BLUEZ_CONFIG --disable-monitor --disable-test --enable-tools" + BLUEZ_CONFIG="$BLUEZ_CONFIG --disable-monitor --disable-test --disable-tools" fi PKG_CONFIGURE_OPTS_TARGET="--disable-dependency-tracking \ @@ -70,20 +70,3 @@ pre_configure_target() { rm -rf .$TARGET_NAME } -post_makeinstall_target() { - if [ ! "$DEVTOOLS" = "yes" ]; then - rm -rf $INSTALL/usr/bin/bccmd - rm -rf $INSTALL/usr/bin/ciptool - rm -rf $INSTALL/usr/bin/hciattach - rm -rf $INSTALL/usr/bin/hciconfig - rm -rf $INSTALL/usr/bin/hcidump - rm -rf $INSTALL/usr/bin/hcitool - rm -rf $INSTALL/usr/bin/l2ping - rm -rf $INSTALL/usr/bin/l2test - rm -rf $INSTALL/usr/bin/rctest - rm -rf $INSTALL/usr/bin/rfcomm - rm -rf $INSTALL/usr/bin/sdptool - rm -rf $INSTALL/usr/bin/btmon - rm -rf $INSTALL/usr/lib/bluez/test - fi -} From fae1ba5321cf0a4a3b26307e85ce51c1d6a54ba2 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Sun, 28 Jul 2013 09:28:39 +0300 Subject: [PATCH 017/103] linux: update hid_sony-add_SMK_link patch --- .../linux-058.06-hid_sony-add_SMK_link.patch | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/packages/linux/patches/3.10.2/linux-058.06-hid_sony-add_SMK_link.patch b/packages/linux/patches/3.10.2/linux-058.06-hid_sony-add_SMK_link.patch index 4324cd10bf..bc92ecf487 100644 --- a/packages/linux/patches/3.10.2/linux-058.06-hid_sony-add_SMK_link.patch +++ b/packages/linux/patches/3.10.2/linux-058.06-hid_sony-add_SMK_link.patch @@ -1,6 +1,25 @@ -diff -ur a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h ---- a/drivers/hid/hid-ids.h 2013-07-24 18:30:33.000000000 -0400 -+++ b/drivers/hid/hid-ids.h 2013-07-24 20:06:17.033735838 -0400 +commit 5a601d61d36236a667cc7d170b300d18dd6240c6 +Author: Juan J. Sierralta +Date: Sun Jul 28 09:26:04 2013 +0300 + + Add support for SMK-Link PS3 remote + +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index 396d24d..9eb7129 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -1686,6 +1686,7 @@ static const struct hid_device_id hid_have_special_driver[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SONY_PS3_BDREMOTE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) }, +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index dd0511e..2801df1 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h @@ -734,6 +734,7 @@ #define USB_VENDOR_ID_SKYCABLE 0x1223 #define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07 @@ -9,10 +28,11 @@ diff -ur a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h #define USB_VENDOR_ID_SONY 0x054c #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b #define USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE 0x0374 -diff -ur a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c ---- a/drivers/hid/hid-sony.c 2013-07-24 18:30:33.000000000 -0400 -+++ b/drivers/hid/hid-sony.c 2013-07-24 20:08:42.493731771 -0400 -@@ -728,8 +728,12 @@ +diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c +index 8f425e2..614f057 100644 +--- a/drivers/hid/hid-sony.c ++++ b/drivers/hid/hid-sony.c +@@ -728,8 +728,12 @@ static const struct hid_device_id sony_devices[] = { /* Logitech Harmony Adapter for PS3 */ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3), .driver_data = PS3REMOTE }, @@ -25,13 +45,3 @@ diff -ur a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c MODULE_DEVICE_TABLE(hid, sony_devices); static struct hid_driver sony_driver = { ---- a/drivers/hid/hid-core.c 2013-07-25 20:21:53.000000000 -0400 -+++ b/drivers/hid/hid-core.c 2013-07-25 22:08:04.043117324 -0400 -@@ -1686,6 +1686,7 @@ - { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, -+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SONY_PS3_BDREMOTE) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) }, From 7a4b53003cd8a501dc42ac8e64807feb7c6d470b Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 28 Jul 2013 21:40:59 +0200 Subject: [PATCH 018/103] syslinux: simplyfing build script Signed-off-by: Stephan Raue --- packages/tools/syslinux/build | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/tools/syslinux/build b/packages/tools/syslinux/build index ae3e2b3c53..5001807864 100755 --- a/packages/tools/syslinux/build +++ b/packages/tools/syslinux/build @@ -26,17 +26,13 @@ $SCRIPTS/build toolchain LDFLAGS=`echo $LDFLAGS | sed -e "s|-Wl,--as-needed||"` -CFLAGS="$CFLAGS -I`ls -d $ROOT/$BUILD/$1*`/libinstaller" -CFLAGS="$CFLAGS -I`ls -d $ROOT/$BUILD/$1*`/libfat" - -SUBDIRS="codepage core libinstaller mtools" -[ "$TARGET_ARCH" = "i386" ] && SUBDIRS="$SUBDIRS mbr" +CFLAGS="$CFLAGS -I../libinstaller -I../libfat" cd $PKG_BUILD make CC=$CC \ AR=$AR \ - RANLIB=$RANLIB \ + RANLIB="$RANLIB" \ LDFLAGS="$LDFLAGS" \ CFLAGS="$CFLAGS -fomit-frame-pointer -D_FILE_OFFSET_BITS=64" \ - BSUBDIRS="$SUBDIRS" + installer From 58f6397e10a9abf10f4aa60ef03b6d4b4e365c13 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 28 Jul 2013 21:41:45 +0200 Subject: [PATCH 019/103] systemd: symlink udevadm to /sbin for compatibility Signed-off-by: Stephan Raue --- packages/sysutils/systemd/install | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/sysutils/systemd/install b/packages/sysutils/systemd/install index 3d11752b74..8f4bd7c577 100755 --- a/packages/sysutils/systemd/install +++ b/packages/sysutils/systemd/install @@ -36,6 +36,9 @@ add_group video 39 mkdir -p $INSTALL/usr/bin cp $PKG_BUILD/udevadm $INSTALL/usr/bin +mkdir -p $INSTALL/sbin + ln -sf /usr/bin/udevadm $INSTALL/sbin/udevadm + mkdir -p $INSTALL/lib cp -PR $PKG_BUILD/.libs/libsystemd-daemon.so* $INSTALL/lib cp -PR $PKG_BUILD/.libs/libudev.so* $INSTALL/lib From 90a71ce3ce63b3a4ebb426fe33151d5c537fc74e Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 28 Jul 2013 21:44:30 +0200 Subject: [PATCH 020/103] bluez: enable udev support Signed-off-by: Stephan Raue --- packages/network/bluez/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/network/bluez/package.mk b/packages/network/bluez/package.mk index 44b6aae99b..0944c26507 100644 --- a/packages/network/bluez/package.mk +++ b/packages/network/bluez/package.mk @@ -53,7 +53,7 @@ PKG_CONFIGURE_OPTS_TARGET="--disable-dependency-tracking \ --enable-static \ --enable-library \ --enable-usb \ - --disable-udev \ + --enable-udev \ --disable-cups \ --disable-obex \ --enable-client \ From 54f8dce478e19746464ab81b3266f37a9abf7aa4 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 07:34:39 +0200 Subject: [PATCH 021/103] dosfstools: update to dosfstools-3.0.22 Signed-off-by: Stephan Raue --- .../initramfs/sysutils/dosfstools-initramfs/install | 5 ++--- packages/sysutils/dosfstools/install | 12 +++++------- packages/sysutils/dosfstools/meta | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/initramfs/sysutils/dosfstools-initramfs/install b/packages/initramfs/sysutils/dosfstools-initramfs/install index a6f700fede..49945afc4b 100755 --- a/packages/initramfs/sysutils/dosfstools-initramfs/install +++ b/packages/initramfs/sysutils/dosfstools-initramfs/install @@ -25,6 +25,5 @@ DOSFSTOOLS_DIR="$BUILD/dosfstools-*" mkdir -p $INSTALL/sbin - cp $DOSFSTOOLS_DIR/dosfsck $INSTALL/sbin - ln -sf dosfsck $INSTALL/sbin/fsck.vfat - ln -sf dosfsck $INSTALL/sbin/fsck.msdos + cp $DOSFSTOOLS_DIR/mkfs.fat $INSTALL/sbin + ln -sf mkfs.fat $INSTALL/sbin/fsck.vfat diff --git a/packages/sysutils/dosfstools/install b/packages/sysutils/dosfstools/install index e1e9fe26d0..eef2fbe816 100755 --- a/packages/sysutils/dosfstools/install +++ b/packages/sysutils/dosfstools/install @@ -23,10 +23,8 @@ . config/options $1 mkdir -p $INSTALL/usr/sbin - cp $PKG_BUILD/mkdosfs $INSTALL/usr/sbin - ln -sf mkdosfs $INSTALL/usr/sbin/mkfs.vfat - ln -sf mkdosfs $INSTALL/usr/sbin/mkfs.msdos - cp $PKG_BUILD/dosfsck $INSTALL/usr/sbin - ln -sf dosfsck $INSTALL/usr/sbin/fsck.vfat - ln -sf dosfsck $INSTALL/usr/sbin/fsck.msdos - cp $PKG_BUILD/dosfslabel $INSTALL/usr/sbin + cp $PKG_BUILD/mkfs.fat $INSTALL/usr/sbin + ln -sf mkfs.fat $INSTALL/usr/sbin/mkfs.fat + cp $PKG_BUILD/fsck.fat $INSTALL/usr/sbin + ln -sf fsck.fat $INSTALL/usr/sbin/fsck.fat + cp $PKG_BUILD/fatlabel $INSTALL/usr/sbin diff --git a/packages/sysutils/dosfstools/meta b/packages/sysutils/dosfstools/meta index ae73100562..48771dfdd3 100644 --- a/packages/sysutils/dosfstools/meta +++ b/packages/sysutils/dosfstools/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="dosfstools" -PKG_VERSION="3.0.16" +PKG_VERSION="3.0.22" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" From ca292d5d141e9a1fe671315d173078feda47ec7c Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 07:47:35 +0200 Subject: [PATCH 022/103] dosfstools: convert to new package format Signed-off-by: Stephan Raue --- .../sysutils/dosfstools-initramfs/install | 3 +- packages/sysutils/dosfstools/build | 27 ----------------- packages/sysutils/dosfstools/install | 30 ------------------- .../sysutils/dosfstools/{meta => package.mk} | 8 +++-- 4 files changed, 7 insertions(+), 61 deletions(-) delete mode 100755 packages/sysutils/dosfstools/build delete mode 100755 packages/sysutils/dosfstools/install rename packages/sysutils/dosfstools/{meta => package.mk} (93%) diff --git a/packages/initramfs/sysutils/dosfstools-initramfs/install b/packages/initramfs/sysutils/dosfstools-initramfs/install index 49945afc4b..229737ae14 100755 --- a/packages/initramfs/sysutils/dosfstools-initramfs/install +++ b/packages/initramfs/sysutils/dosfstools-initramfs/install @@ -25,5 +25,4 @@ DOSFSTOOLS_DIR="$BUILD/dosfstools-*" mkdir -p $INSTALL/sbin - cp $DOSFSTOOLS_DIR/mkfs.fat $INSTALL/sbin - ln -sf mkfs.fat $INSTALL/sbin/fsck.vfat + cp -PR $DOSFSTOOLS_DIR/.install_pkg/usr/sbin/fsck.* $INSTALL/sbin diff --git a/packages/sysutils/dosfstools/build b/packages/sysutils/dosfstools/build deleted file mode 100755 index d71b2bbf26..0000000000 --- a/packages/sysutils/dosfstools/build +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD - -make diff --git a/packages/sysutils/dosfstools/install b/packages/sysutils/dosfstools/install deleted file mode 100755 index eef2fbe816..0000000000 --- a/packages/sysutils/dosfstools/install +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/sbin - cp $PKG_BUILD/mkfs.fat $INSTALL/usr/sbin - ln -sf mkfs.fat $INSTALL/usr/sbin/mkfs.fat - cp $PKG_BUILD/fsck.fat $INSTALL/usr/sbin - ln -sf fsck.fat $INSTALL/usr/sbin/fsck.fat - cp $PKG_BUILD/fatlabel $INSTALL/usr/sbin diff --git a/packages/sysutils/dosfstools/meta b/packages/sysutils/dosfstools/package.mk similarity index 93% rename from packages/sysutils/dosfstools/meta rename to packages/sysutils/dosfstools/package.mk index 48771dfdd3..869fedf439 100644 --- a/packages/sysutils/dosfstools/meta +++ b/packages/sysutils/dosfstools/package.mk @@ -26,11 +26,15 @@ PKG_LICENSE="GPL" PKG_SITE="http://daniel-baumann.ch/software/dosfstools/" PKG_URL="http://daniel-baumann.ch/files/software/dosfstools/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain" +PKG_BUILD_DEPENDS_TARGET="toolchain" PKG_PRIORITY="optional" PKG_SECTION="tools" PKG_SHORTDESC="dosfstools: utilities for making and checking MS-DOS FAT filesystems." PKG_LONGDESC="dosfstools contains utilities for making and checking MS-DOS FAT filesystems." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="no" + +PKG_MAKE_OPTS_TARGET="PREFIX=/usr" +PKG_MAKEINSTALL_OPTS_TARGET="PREFIX=/usr" + From 954418773f1c8a969273dff12c789b163dfc2039 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 07:49:38 +0200 Subject: [PATCH 023/103] fuse: update to fuse-2.9.3 Signed-off-by: Stephan Raue --- packages/sysutils/fuse/meta | 2 +- ...2-001-Fix-udev-rules-Fedora-specific.patch | 20 ------------------- .../patches/fuse-2.9.2-automake-1.13.patch | 12 ----------- 3 files changed, 1 insertion(+), 33 deletions(-) delete mode 100644 packages/sysutils/fuse/patches/fuse-2.9.2-001-Fix-udev-rules-Fedora-specific.patch delete mode 100644 packages/sysutils/fuse/patches/fuse-2.9.2-automake-1.13.patch diff --git a/packages/sysutils/fuse/meta b/packages/sysutils/fuse/meta index 97262b8660..0a8b6e0b36 100644 --- a/packages/sysutils/fuse/meta +++ b/packages/sysutils/fuse/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="fuse" -PKG_VERSION="2.9.2" +PKG_VERSION="2.9.3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/sysutils/fuse/patches/fuse-2.9.2-001-Fix-udev-rules-Fedora-specific.patch b/packages/sysutils/fuse/patches/fuse-2.9.2-001-Fix-udev-rules-Fedora-specific.patch deleted file mode 100644 index d4bb54481c..0000000000 --- a/packages/sysutils/fuse/patches/fuse-2.9.2-001-Fix-udev-rules-Fedora-specific.patch +++ /dev/null @@ -1,20 +0,0 @@ -From ba47031f3557b81e732d41593c95e7b984b54b78 Mon Sep 17 00:00:00 2001 -From: Peter Lemenkov -Date: Mon, 9 Aug 2010 12:09:00 +0400 -Subject: [PATCH 1/3] Fix udev rules (Fedora-specific) - -Signed-off-by: Peter Lemenkov ---- - util/udev.rules | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/util/udev.rules b/util/udev.rules -index 9585111..bb8033f 100644 ---- a/util/udev.rules -+++ b/util/udev.rules -@@ -1 +1 @@ --KERNEL=="fuse", MODE="0666" -+KERNEL=="fuse", MODE="0666",OWNER="root",GROUP="root" --- -1.7.3.1 - diff --git a/packages/sysutils/fuse/patches/fuse-2.9.2-automake-1.13.patch b/packages/sysutils/fuse/patches/fuse-2.9.2-automake-1.13.patch deleted file mode 100644 index 80f3527a17..0000000000 --- a/packages/sysutils/fuse/patches/fuse-2.9.2-automake-1.13.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur fuse-2.9.2/configure.in fuse-2.9.2.patch/configure.in ---- fuse-2.9.2/configure.in 2012-10-01 17:58:00.000000000 +0200 -+++ fuse-2.9.2.patch/configure.in 2013-01-12 16:56:37.469681997 +0100 -@@ -4,7 +4,7 @@ - AC_CANONICAL_TARGET - AM_INIT_AUTOMAKE - m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES(yes)]) --AM_CONFIG_HEADER(include/config.h) -+AC_CONFIG_HEADERS(include/config.h) - - AC_PROG_LIBTOOL - AC_PROG_CC From 8ab9cf533035f86df4002340522cb21f22545012 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 08:31:02 +0200 Subject: [PATCH 024/103] fuse: convert to new package format Signed-off-by: Stephan Raue --- packages/sysutils/fuse/meta | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 packages/sysutils/fuse/meta diff --git a/packages/sysutils/fuse/meta b/packages/sysutils/fuse/meta deleted file mode 100644 index 0a8b6e0b36..0000000000 --- a/packages/sysutils/fuse/meta +++ /dev/null @@ -1,36 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="fuse" -PKG_VERSION="2.9.3" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://sourceforge.net/projects/fuse/" -PKG_URL="$SOURCEFORGE_SRC/fuse/fuse-2.X/$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.gz" -PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain" -PKG_PRIORITY="optional" -PKG_SECTION="system" -PKG_SHORTDESC="fuse: A simple user-space filesystem interface for Linux" -PKG_LONGDESC="FUSE provides a simple interface for userspace programs to export a virtual filesystem to the Linux kernel. FUSE also aims to provide a secure method for non privileged users to create and mount their own filesystem implementations." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="yes" From 8220ce99bd37aa314ac669aaf621c424a65cfc58 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 08:31:15 +0200 Subject: [PATCH 025/103] fuse: convert to new package format Signed-off-by: Stephan Raue --- packages/sysutils/fuse/config/fuse.conf | 2 - packages/sysutils/fuse/install | 40 ------------------ packages/sysutils/fuse/{build => package.mk} | 44 ++++++++++++-------- packages/sysutils/fuse/rules.d/99-fuse.rules | 1 + 4 files changed, 27 insertions(+), 60 deletions(-) delete mode 100644 packages/sysutils/fuse/config/fuse.conf delete mode 100755 packages/sysutils/fuse/install rename packages/sysutils/fuse/{build => package.mk} (50%) mode change 100755 => 100644 create mode 100644 packages/sysutils/fuse/rules.d/99-fuse.rules diff --git a/packages/sysutils/fuse/config/fuse.conf b/packages/sysutils/fuse/config/fuse.conf deleted file mode 100644 index cd4c6bdaf3..0000000000 --- a/packages/sysutils/fuse/config/fuse.conf +++ /dev/null @@ -1,2 +0,0 @@ -# mount_max = 1000 -# user_allow_other diff --git a/packages/sysutils/fuse/install b/packages/sysutils/fuse/install deleted file mode 100755 index 6686442ffe..0000000000 --- a/packages/sysutils/fuse/install +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/etc - cp $PKG_DIR/config/fuse.conf $INSTALL/etc - -mkdir -p $INSTALL/lib/udev/rules.d - cp $PKG_BUILD/util/udev.rules $INSTALL/lib/udev/rules.d/99-fuse.rules - -mkdir -p $INSTALL/sbin - cp $PKG_BUILD/util/mount.fuse $INSTALL/sbin - -mkdir -p $INSTALL/bin - cp $PKG_BUILD/util/fusermount $INSTALL/bin - cp $PKG_BUILD/util/ulockmgr_server $INSTALL/bin - -mkdir -p $INSTALL/lib - cp -P $PKG_BUILD/lib/.libs/*.so* $INSTALL/lib - diff --git a/packages/sysutils/fuse/build b/packages/sysutils/fuse/package.mk old mode 100755 new mode 100644 similarity index 50% rename from packages/sysutils/fuse/build rename to packages/sysutils/fuse/package.mk index fce5a85a99..c1640f5e89 --- a/packages/sysutils/fuse/build +++ b/packages/sysutils/fuse/package.mk @@ -1,5 +1,3 @@ -#!/bin/sh - ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) @@ -20,21 +18,31 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -. config/options $1 +PKG_NAME="fuse" +PKG_VERSION="2.9.3" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://sourceforge.net/projects/fuse/" +PKG_URL="$SOURCEFORGE_SRC/fuse/fuse-2.X/$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.gz" +PKG_DEPENDS="" +PKG_BUILD_DEPENDS_TARGET="toolchain" +PKG_PRIORITY="optional" +PKG_SECTION="system" +PKG_SHORTDESC="fuse: A simple user-space filesystem interface for Linux" +PKG_LONGDESC="FUSE provides a simple interface for userspace programs to export a virtual filesystem to the Linux kernel. FUSE also aims to provide a secure method for non privileged users to create and mount their own filesystem implementations." -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --enable-shared \ - --disable-static \ - --with-libiconv-prefix="$SYSROOT_PREFIX/usr" \ - --enable-lib \ - --enable-util \ - --disable-example \ - --enable-mtab \ - --disable-rpath \ - --with-gnu-ld \ +PKG_IS_ADDON="no" +PKG_AUTORECONF="yes" -make -$MAKEINSTALL +PKG_CONFIGURE_OPTS_TARGET="--enable-lib \ + --enable-util \ + --disable-example \ + --enable-mtab \ + --disable-rpath \ + --with-gnu-ld" + +post_makeinstall_target() { + rm -rf $INSTALL/etc/init.d + rm -rf $INSTALL/etc/udev +} diff --git a/packages/sysutils/fuse/rules.d/99-fuse.rules b/packages/sysutils/fuse/rules.d/99-fuse.rules new file mode 100644 index 0000000000..bb8033fee4 --- /dev/null +++ b/packages/sysutils/fuse/rules.d/99-fuse.rules @@ -0,0 +1 @@ +KERNEL=="fuse", MODE="0666",OWNER="root",GROUP="root" From 029413a3b9e9f88cd987aae52170148660c0cd7a Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 08:32:20 +0200 Subject: [PATCH 026/103] systemd: update to systemd-206 Signed-off-by: Stephan Raue --- packages/sysutils/systemd/build | 1 - packages/sysutils/systemd/install | 10 ---------- packages/sysutils/systemd/meta | 2 +- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/sysutils/systemd/build b/packages/sysutils/systemd/build index 0bd1e200b7..6b10fff1e6 100755 --- a/packages/sysutils/systemd/build +++ b/packages/sysutils/systemd/build @@ -70,7 +70,6 @@ ac_cv_func_malloc_0_nonnull=yes \ --disable-localed \ --disable-coredump \ --enable-gudev \ - --enable-keymap \ --disable-manpages \ --enable-split-usr \ --with-firmware-path="/storage/.config/firmware:/lib/firmware" \ diff --git a/packages/sysutils/systemd/install b/packages/sysutils/systemd/install index 8f4bd7c577..4db2da48fd 100755 --- a/packages/sysutils/systemd/install +++ b/packages/sysutils/systemd/install @@ -57,20 +57,10 @@ mkdir -p $INSTALL/lib/systemd done cp $PKG_BUILD/mtd_probe $INSTALL/lib/udev - cp $PKG_BUILD/keymap $INSTALL/lib/udev - cp $PKG_BUILD/src/udev/keymap/findkeyboards $INSTALL/lib/udev - cp $PKG_BUILD/src/udev/keymap/keyboard-force-release.sh $INSTALL/lib/udev -mkdir -p $INSTALL/lib/udev/keymaps - cp $PKG_BUILD/keymaps/* $INSTALL/lib/udev/keymaps -mkdir -p $INSTALL/lib/udev/keymaps/force-release - cp $PKG_BUILD/keymaps-force-release/* $INSTALL/lib/udev/keymaps/force-release - mkdir -p $INSTALL/lib/udev/rules.d cp $PKG_BUILD/rules/*.rules $INSTALL/lib/udev/rules.d rm -rf $INSTALL/lib/udev/rules.d/80-net-name-slot.rules rm -rf $INSTALL/lib/udev/rules.d/99-systemd.rules - cp $PKG_BUILD/src/udev/keymap/*.rules $INSTALL/lib/udev/rules.d - mkdir -p $INSTALL/lib/udev/hwdb.d cp $PKG_BUILD/hwdb/*.hwdb $INSTALL/lib/udev/hwdb.d diff --git a/packages/sysutils/systemd/meta b/packages/sysutils/systemd/meta index 0f9aa2682d..2e28f46677 100644 --- a/packages/sysutils/systemd/meta +++ b/packages/sysutils/systemd/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="systemd" -PKG_VERSION="205" +PKG_VERSION="206" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" From 42b24c0e8bddabaefa0211c177d66bf878f27eab Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 08:34:20 +0200 Subject: [PATCH 027/103] bison: update to bison-3.0 Signed-off-by: Stephan Raue --- packages/toolchain/devel/bison/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/toolchain/devel/bison/meta b/packages/toolchain/devel/bison/meta index 26bb34ca9d..b2c3a7dc3b 100644 --- a/packages/toolchain/devel/bison/meta +++ b/packages/toolchain/devel/bison/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="bison" -PKG_VERSION="2.7.1" +PKG_VERSION="3.0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" From 9c8cc2cab7fc349d970c0031fbad6209c250ffa2 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 08:40:48 +0200 Subject: [PATCH 028/103] bison: convert to new package format Signed-off-by: Stephan Raue --- packages/toolchain/devel/binutils/meta | 2 +- packages/toolchain/devel/bison/build | 40 ------------------- .../devel/bison/{meta => package.mk} | 13 +++++- packages/toolchain/meta | 4 +- 4 files changed, 14 insertions(+), 45 deletions(-) delete mode 100755 packages/toolchain/devel/bison/build rename packages/toolchain/devel/bison/{meta => package.mk} (84%) diff --git a/packages/toolchain/devel/binutils/meta b/packages/toolchain/devel/binutils/meta index 2f1f838038..3e13dac55c 100644 --- a/packages/toolchain/devel/binutils/meta +++ b/packages/toolchain/devel/binutils/meta @@ -29,7 +29,7 @@ PKG_SITE="http://www.gnu.org/software/binutils/binutils.html" PKG_URL="http://ftp.gnu.org/gnu/binutils/$PKG_NAME-$PKG_VERSION.tar.gz" #PKG_URL="ftp://ftp.kernel.org/pub/linux/devel/binutils/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="ccache bison flex linux-headers gmp-host mpfr cloog ppl" +PKG_BUILD_DEPENDS="ccache bison:host flex linux-headers gmp-host mpfr cloog ppl" PKG_PRIORITY="optional" PKG_SECTION="toolchain/devel" PKG_SHORTDESC="binutils: A GNU collection of binary utilities" diff --git a/packages/toolchain/devel/bison/build b/packages/toolchain/devel/bison/build deleted file mode 100755 index 6f775210a9..0000000000 --- a/packages/toolchain/devel/bison/build +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -setup_toolchain host - -cd $PKG_BUILD -./configure --host=$HOST_NAME \ - --build=$HOST_NAME \ - --prefix=$ROOT/$TOOLCHAIN \ - --disable-rpath \ - --with-gnu-ld - -# The configure system causes Bison to be built without support for -# internationalization of error messages if a bison program is not already in -# $PATH. The following addition will correct this: - echo '#define YYENABLE_NLS 1' >> lib/config.h - -make -make install diff --git a/packages/toolchain/devel/bison/meta b/packages/toolchain/devel/bison/package.mk similarity index 84% rename from packages/toolchain/devel/bison/meta rename to packages/toolchain/devel/bison/package.mk index b2c3a7dc3b..dd4073a5d7 100644 --- a/packages/toolchain/devel/bison/meta +++ b/packages/toolchain/devel/bison/package.mk @@ -26,11 +26,20 @@ PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/bison/" PKG_URL="http://ftp.gnu.org/gnu/bison/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="ccache" +PKG_BUILD_DEPENDS_HOST="ccache" PKG_PRIORITY="optional" PKG_SECTION="toolchain/devel" PKG_SHORTDESC="bison: The GNU general-purpose parser generator" PKG_LONGDESC="Bison is a general-purpose parser generator that converts a grammar description for an LALR(1) context-free grammar into a C program to parse that grammar. Once you are proficient with Bison, you may use it to develop a wide range of language parsers, from those used in simple desk calculators to complex programming languages. Bison is upward compatible with Yacc: all properly-written Yacc grammars ought to work with Bison with no change. Anyone familiar with Yacc should be able to use Bison with little trouble. You need to be fluent in C programming in order to use Bison or to understand this manual." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="no" + +PKG_CONFIGURE_OPTS_HOST="--disable-rpath --with-gnu-ld" + +post_configure_host() { +# The configure system causes Bison to be built without support for +# internationalization of error messages if a bison program is not already in +# $PATH. The following addition will correct this: + echo '#define YYENABLE_NLS 1' >> lib/config.h +} diff --git a/packages/toolchain/meta b/packages/toolchain/meta index 9a85dbce6b..084caf44d7 100644 --- a/packages/toolchain/meta +++ b/packages/toolchain/meta @@ -26,8 +26,8 @@ PKG_LICENSE="GPL" PKG_SITE="http://www.openelec.tv" PKG_URL="" PKG_DEPENDS="" -#PKG_BUILD_DEPENDS="make xz sed pkg-config autotools gcc-final bison flex cmake jam scons yasm nasm" -PKG_BUILD_DEPENDS="make xz sed pkg-config autotools gcc-final bison flex cmake scons yasm nasm" +#PKG_BUILD_DEPENDS="make xz sed pkg-config autotools gcc-final bison:host flex cmake jam scons yasm nasm" +PKG_BUILD_DEPENDS="make xz sed pkg-config autotools gcc-final bison:host flex cmake scons yasm nasm" PKG_PRIORITY="optional" PKG_SECTION="toolchain/devel" PKG_SHORTDESC="toolchain: OpenELEC.tv' toolchain" From 3e4c88970d73ec443946b1297358f512572fdf49 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 08:53:16 +0200 Subject: [PATCH 029/103] videoproto: update to videoproto-2.3.2 Signed-off-by: Stephan Raue --- packages/x11/proto/videoproto/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/x11/proto/videoproto/package.mk b/packages/x11/proto/videoproto/package.mk index 2f1d55e124..c3874b3564 100644 --- a/packages/x11/proto/videoproto/package.mk +++ b/packages/x11/proto/videoproto/package.mk @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="videoproto" -PKG_VERSION="2.3.1" +PKG_VERSION="2.3.2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="OSS" From dfad23e65cb6a704bb050882e9eb404bd4b901b7 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 08:54:18 +0200 Subject: [PATCH 030/103] xkeyboard-config: update to xkeyboard-config-2.9 Signed-off-by: Stephan Raue --- packages/x11/data/xkeyboard-config/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/x11/data/xkeyboard-config/meta b/packages/x11/data/xkeyboard-config/meta index 89f4c37dbd..d115af77d1 100644 --- a/packages/x11/data/xkeyboard-config/meta +++ b/packages/x11/data/xkeyboard-config/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xkeyboard-config" -PKG_VERSION="2.8" +PKG_VERSION="2.9" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="OSS" From 8c03f336d7cb9d913e5d4ed27e98e279fc97edfc Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 09:04:56 +0200 Subject: [PATCH 031/103] xkeyboard-config: convert to new package format Signed-off-by: Stephan Raue --- packages/x11/data/xkeyboard-config/build | 45 ------------------- packages/x11/data/xkeyboard-config/install | 26 ----------- .../xkeyboard-config/{meta => package.mk} | 21 ++++++++- 3 files changed, 19 insertions(+), 73 deletions(-) delete mode 100755 packages/x11/data/xkeyboard-config/build delete mode 100755 packages/x11/data/xkeyboard-config/install rename packages/x11/data/xkeyboard-config/{meta => package.mk} (71%) diff --git a/packages/x11/data/xkeyboard-config/build b/packages/x11/data/xkeyboard-config/build deleted file mode 100755 index de68801b9d..0000000000 --- a/packages/x11/data/xkeyboard-config/build +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD - -# broken autoreconf - intltoolize --force - -XKBCOMP="/usr/bin/xkbcomp" \ -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --without-xsltproc \ - --enable-compat-rules \ - --enable-runtime-deps \ - --enable-nls \ - --disable-rpath \ - --with-xkb-base=$XORG_PATH_XKB \ - --with-xkb-rules-symlink=xorg \ - --with-gnu-ld \ - -make -make DESTDIR=`pwd`/.install install diff --git a/packages/x11/data/xkeyboard-config/install b/packages/x11/data/xkeyboard-config/install deleted file mode 100755 index 70fe5acbdd..0000000000 --- a/packages/x11/data/xkeyboard-config/install +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/$XORG_PATH_XKB - cp -R $PKG_BUILD/.install/$XORG_PATH_XKB/* $INSTALL/$XORG_PATH_XKB diff --git a/packages/x11/data/xkeyboard-config/meta b/packages/x11/data/xkeyboard-config/package.mk similarity index 71% rename from packages/x11/data/xkeyboard-config/meta rename to packages/x11/data/xkeyboard-config/package.mk index d115af77d1..022369d002 100644 --- a/packages/x11/data/xkeyboard-config/meta +++ b/packages/x11/data/xkeyboard-config/package.mk @@ -26,11 +26,28 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://www.x.org/releases/individual/data/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain util-macros xkbcomp" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros xkbcomp" PKG_PRIORITY="optional" PKG_SECTION="x11/data" PKG_SHORTDESC="xkeyboard-config: X keyboard extension data files" PKG_LONGDESC="X keyboard extension data files." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="XKBCOMP=/usr/bin/xkbcomp \ + --without-xsltproc \ + --enable-compat-rules \ + --enable-runtime-deps \ + --enable-nls \ + --disable-rpath \ + --with-xkb-base=$XORG_PATH_XKB \ + --with-xkb-rules-symlink=xorg \ + --with-gnu-ld" + +pre_build_target() { +# broken autoreconf + ( cd $PKG_BUILD + intltoolize --force + ) +} From 94fdf3de04dc1388dd084ae36723e9285025d5f7 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 09:05:37 +0200 Subject: [PATCH 032/103] scripts/build: globally remove /usr/share/pkgconfig from .install_pkg dir Signed-off-by: Stephan Raue --- scripts/build | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/build b/scripts/build index 6a6bc83526..d8d8a07789 100755 --- a/scripts/build +++ b/scripts/build @@ -257,6 +257,7 @@ if [ ! -f $STAMP ]; then rm -rf $INSTALL/usr/share/info rm -rf $INSTALL/usr/share/locale rm -rf $INSTALL/usr/share/man + rm -rf $INSTALL/usr/share/pkgconfig find $INSTALL/lib -name "*.la" -exec rm -rf "{}" ";" 2>/dev/null || true find $INSTALL/usr/lib -name "*.la" -exec rm -rf "{}" ";" 2>/dev/null || true find $INSTALL/lib -name "*.a" -exec rm -rf "{}" ";" 2>/dev/null || true From 93bf400437859d1e5062d7b5108635d9166cda5f Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 29 Jul 2013 13:36:21 +0200 Subject: [PATCH 033/103] bluez: depends on systemd Signed-off-by: Stephan Raue --- packages/network/bluez/package.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/network/bluez/package.mk b/packages/network/bluez/package.mk index 0944c26507..4f8f0d0430 100644 --- a/packages/network/bluez/package.mk +++ b/packages/network/bluez/package.mk @@ -25,8 +25,8 @@ PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.bluez.org/" PKG_URL="http://www.kernel.org/pub/linux/bluetooth/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_DEPENDS="libusb-compat dbus glib" -PKG_BUILD_DEPENDS_TARGET="toolchain libusb-compat dbus glib readline" +PKG_DEPENDS="libusb-compat dbus glib systemd" +PKG_BUILD_DEPENDS_TARGET="toolchain libusb-compat dbus glib readline systemd" PKG_PRIORITY="optional" PKG_SECTION="network" PKG_SHORTDESC="bluez: Bluetooth Tools and System Daemons for Linux." From 893471b1c8504b9f762161ba4147b297d801ae1e Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 08:16:47 +0200 Subject: [PATCH 034/103] linux: update to linux-3.10.4 Signed-off-by: Stephan Raue --- packages/linux/meta | 2 +- .../patches/{3.10.2 => 3.10.4}/linux-003-no_dev_console.patch | 0 .../{3.10.2 => 3.10.4}/linux-010-perf_crosscompiling.patch | 0 .../{3.10.2 => 3.10.4}/linux-052-XBOX_remote_support.patch | 0 .../{3.10.2 => 3.10.4}/linux-053-spinelplus-remote-0.2.patch | 0 ...ton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch | 0 .../linux-055-add_Formosa_eHome_Infrared_Receiver.patch | 0 .../linux-056-add_Adaptec_eHome_Infrared_Receiver.patch | 0 ...57-Removed-MCE-customer-code-restriction-in-rc6-decode.patch | 0 .../linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch | 0 .../linux-058.01-HID-Sony-upstream_patches.patch | 0 .../linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch | 0 .../{3.10.2 => 3.10.4}/linux-058.06-hid_sony-add_SMK_link.patch | 0 .../linux-059-remove_some_xpad_pids-0.2.patch | 0 .../{3.10.2 => 3.10.4}/linux-060-add_AUGUST_DVB-T205.patch | 0 .../linux-203-stb0899_enable_low_symbol_rate.patch | 0 .../linux/patches/{3.10.2 => 3.10.4}/linux-210-dvbsky.patch | 0 .../linux-212-mantis_stb0899_faster_lock.patch | 0 .../patches/{3.10.2 => 3.10.4}/linux-221-ngene-octopus.patch | 0 .../{3.10.2 => 3.10.4}/linux-222-stb0899_signal_quality.patch | 0 .../linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch | 0 .../patches/{3.10.2 => 3.10.4}/linux-700-jmicron_1_0_8_5.patch | 0 .../{3.10.2 => 3.10.4}/linux-701-linksys_aes2500_brcmfmac.patch | 0 .../linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch | 0 .../{3.10.2 => 3.10.4}/linux-703-macmini2012-ethernet.patch | 0 .../patches/{3.10.2 => 3.10.4}/linux-900-hide_tsc_error.patch | 0 .../linux-950-saa716x_PCIe_interface_chipset.patch | 0 ...990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch | 0 .../{3.10.2 => 3.10.4}/linux-995-CX24120-13Z_frontend.patch | 0 .../linux-997-disable-rc6-on-sandybridge-gt1.patch | 0 ...rm-i915-correctly-restore-fences-with-objects-attached.patch | 0 31 files changed, 1 insertion(+), 1 deletion(-) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-003-no_dev_console.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-010-perf_crosscompiling.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-052-XBOX_remote_support.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-053-spinelplus-remote-0.2.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-055-add_Formosa_eHome_Infrared_Receiver.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-056-add_Adaptec_eHome_Infrared_Receiver.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-057-Removed-MCE-customer-code-restriction-in-rc6-decode.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-058.01-HID-Sony-upstream_patches.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-058.06-hid_sony-add_SMK_link.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-059-remove_some_xpad_pids-0.2.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-060-add_AUGUST_DVB-T205.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-203-stb0899_enable_low_symbol_rate.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-210-dvbsky.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-212-mantis_stb0899_faster_lock.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-221-ngene-octopus.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-222-stb0899_signal_quality.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-700-jmicron_1_0_8_5.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-701-linksys_aes2500_brcmfmac.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-703-macmini2012-ethernet.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-900-hide_tsc_error.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-950-saa716x_PCIe_interface_chipset.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-995-CX24120-13Z_frontend.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-997-disable-rc6-on-sandybridge-gt1.patch (100%) rename packages/linux/patches/{3.10.2 => 3.10.4}/linux-999.02-drm-i915-correctly-restore-fences-with-objects-attached.patch (100%) diff --git a/packages/linux/meta b/packages/linux/meta index a0cd50163f..94b60a266d 100644 --- a/packages/linux/meta +++ b/packages/linux/meta @@ -34,7 +34,7 @@ case "$LINUX" in PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.bz2" ;; *) - PKG_VERSION="3.10.2" + PKG_VERSION="3.10.4" PKG_URL="http://www.kernel.org/pub/linux/kernel/v3.x/$PKG_NAME-$PKG_VERSION.tar.xz" ;; esac diff --git a/packages/linux/patches/3.10.2/linux-003-no_dev_console.patch b/packages/linux/patches/3.10.4/linux-003-no_dev_console.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-003-no_dev_console.patch rename to packages/linux/patches/3.10.4/linux-003-no_dev_console.patch diff --git a/packages/linux/patches/3.10.2/linux-010-perf_crosscompiling.patch b/packages/linux/patches/3.10.4/linux-010-perf_crosscompiling.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-010-perf_crosscompiling.patch rename to packages/linux/patches/3.10.4/linux-010-perf_crosscompiling.patch diff --git a/packages/linux/patches/3.10.2/linux-052-XBOX_remote_support.patch b/packages/linux/patches/3.10.4/linux-052-XBOX_remote_support.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-052-XBOX_remote_support.patch rename to packages/linux/patches/3.10.4/linux-052-XBOX_remote_support.patch diff --git a/packages/linux/patches/3.10.2/linux-053-spinelplus-remote-0.2.patch b/packages/linux/patches/3.10.4/linux-053-spinelplus-remote-0.2.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-053-spinelplus-remote-0.2.patch rename to packages/linux/patches/3.10.4/linux-053-spinelplus-remote-0.2.patch diff --git a/packages/linux/patches/3.10.2/linux-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch b/packages/linux/patches/3.10.4/linux-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch rename to packages/linux/patches/3.10.4/linux-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch diff --git a/packages/linux/patches/3.10.2/linux-055-add_Formosa_eHome_Infrared_Receiver.patch b/packages/linux/patches/3.10.4/linux-055-add_Formosa_eHome_Infrared_Receiver.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-055-add_Formosa_eHome_Infrared_Receiver.patch rename to packages/linux/patches/3.10.4/linux-055-add_Formosa_eHome_Infrared_Receiver.patch diff --git a/packages/linux/patches/3.10.2/linux-056-add_Adaptec_eHome_Infrared_Receiver.patch b/packages/linux/patches/3.10.4/linux-056-add_Adaptec_eHome_Infrared_Receiver.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-056-add_Adaptec_eHome_Infrared_Receiver.patch rename to packages/linux/patches/3.10.4/linux-056-add_Adaptec_eHome_Infrared_Receiver.patch diff --git a/packages/linux/patches/3.10.2/linux-057-Removed-MCE-customer-code-restriction-in-rc6-decode.patch b/packages/linux/patches/3.10.4/linux-057-Removed-MCE-customer-code-restriction-in-rc6-decode.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-057-Removed-MCE-customer-code-restriction-in-rc6-decode.patch rename to packages/linux/patches/3.10.4/linux-057-Removed-MCE-customer-code-restriction-in-rc6-decode.patch diff --git a/packages/linux/patches/3.10.2/linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch b/packages/linux/patches/3.10.4/linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch rename to packages/linux/patches/3.10.4/linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch diff --git a/packages/linux/patches/3.10.2/linux-058.01-HID-Sony-upstream_patches.patch b/packages/linux/patches/3.10.4/linux-058.01-HID-Sony-upstream_patches.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-058.01-HID-Sony-upstream_patches.patch rename to packages/linux/patches/3.10.4/linux-058.01-HID-Sony-upstream_patches.patch diff --git a/packages/linux/patches/3.10.2/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch b/packages/linux/patches/3.10.4/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch rename to packages/linux/patches/3.10.4/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch diff --git a/packages/linux/patches/3.10.2/linux-058.06-hid_sony-add_SMK_link.patch b/packages/linux/patches/3.10.4/linux-058.06-hid_sony-add_SMK_link.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-058.06-hid_sony-add_SMK_link.patch rename to packages/linux/patches/3.10.4/linux-058.06-hid_sony-add_SMK_link.patch diff --git a/packages/linux/patches/3.10.2/linux-059-remove_some_xpad_pids-0.2.patch b/packages/linux/patches/3.10.4/linux-059-remove_some_xpad_pids-0.2.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-059-remove_some_xpad_pids-0.2.patch rename to packages/linux/patches/3.10.4/linux-059-remove_some_xpad_pids-0.2.patch diff --git a/packages/linux/patches/3.10.2/linux-060-add_AUGUST_DVB-T205.patch b/packages/linux/patches/3.10.4/linux-060-add_AUGUST_DVB-T205.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-060-add_AUGUST_DVB-T205.patch rename to packages/linux/patches/3.10.4/linux-060-add_AUGUST_DVB-T205.patch diff --git a/packages/linux/patches/3.10.2/linux-203-stb0899_enable_low_symbol_rate.patch b/packages/linux/patches/3.10.4/linux-203-stb0899_enable_low_symbol_rate.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-203-stb0899_enable_low_symbol_rate.patch rename to packages/linux/patches/3.10.4/linux-203-stb0899_enable_low_symbol_rate.patch diff --git a/packages/linux/patches/3.10.2/linux-210-dvbsky.patch b/packages/linux/patches/3.10.4/linux-210-dvbsky.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-210-dvbsky.patch rename to packages/linux/patches/3.10.4/linux-210-dvbsky.patch diff --git a/packages/linux/patches/3.10.2/linux-212-mantis_stb0899_faster_lock.patch b/packages/linux/patches/3.10.4/linux-212-mantis_stb0899_faster_lock.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-212-mantis_stb0899_faster_lock.patch rename to packages/linux/patches/3.10.4/linux-212-mantis_stb0899_faster_lock.patch diff --git a/packages/linux/patches/3.10.2/linux-221-ngene-octopus.patch b/packages/linux/patches/3.10.4/linux-221-ngene-octopus.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-221-ngene-octopus.patch rename to packages/linux/patches/3.10.4/linux-221-ngene-octopus.patch diff --git a/packages/linux/patches/3.10.2/linux-222-stb0899_signal_quality.patch b/packages/linux/patches/3.10.4/linux-222-stb0899_signal_quality.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-222-stb0899_signal_quality.patch rename to packages/linux/patches/3.10.4/linux-222-stb0899_signal_quality.patch diff --git a/packages/linux/patches/3.10.2/linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch b/packages/linux/patches/3.10.4/linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch rename to packages/linux/patches/3.10.4/linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch diff --git a/packages/linux/patches/3.10.2/linux-700-jmicron_1_0_8_5.patch b/packages/linux/patches/3.10.4/linux-700-jmicron_1_0_8_5.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-700-jmicron_1_0_8_5.patch rename to packages/linux/patches/3.10.4/linux-700-jmicron_1_0_8_5.patch diff --git a/packages/linux/patches/3.10.2/linux-701-linksys_aes2500_brcmfmac.patch b/packages/linux/patches/3.10.4/linux-701-linksys_aes2500_brcmfmac.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-701-linksys_aes2500_brcmfmac.patch rename to packages/linux/patches/3.10.4/linux-701-linksys_aes2500_brcmfmac.patch diff --git a/packages/linux/patches/3.10.2/linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch b/packages/linux/patches/3.10.4/linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch rename to packages/linux/patches/3.10.4/linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch diff --git a/packages/linux/patches/3.10.2/linux-703-macmini2012-ethernet.patch b/packages/linux/patches/3.10.4/linux-703-macmini2012-ethernet.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-703-macmini2012-ethernet.patch rename to packages/linux/patches/3.10.4/linux-703-macmini2012-ethernet.patch diff --git a/packages/linux/patches/3.10.2/linux-900-hide_tsc_error.patch b/packages/linux/patches/3.10.4/linux-900-hide_tsc_error.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-900-hide_tsc_error.patch rename to packages/linux/patches/3.10.4/linux-900-hide_tsc_error.patch diff --git a/packages/linux/patches/3.10.2/linux-950-saa716x_PCIe_interface_chipset.patch b/packages/linux/patches/3.10.4/linux-950-saa716x_PCIe_interface_chipset.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-950-saa716x_PCIe_interface_chipset.patch rename to packages/linux/patches/3.10.4/linux-950-saa716x_PCIe_interface_chipset.patch diff --git a/packages/linux/patches/3.10.2/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch b/packages/linux/patches/3.10.4/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch rename to packages/linux/patches/3.10.4/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch diff --git a/packages/linux/patches/3.10.2/linux-995-CX24120-13Z_frontend.patch b/packages/linux/patches/3.10.4/linux-995-CX24120-13Z_frontend.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-995-CX24120-13Z_frontend.patch rename to packages/linux/patches/3.10.4/linux-995-CX24120-13Z_frontend.patch diff --git a/packages/linux/patches/3.10.2/linux-997-disable-rc6-on-sandybridge-gt1.patch b/packages/linux/patches/3.10.4/linux-997-disable-rc6-on-sandybridge-gt1.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-997-disable-rc6-on-sandybridge-gt1.patch rename to packages/linux/patches/3.10.4/linux-997-disable-rc6-on-sandybridge-gt1.patch diff --git a/packages/linux/patches/3.10.2/linux-999.02-drm-i915-correctly-restore-fences-with-objects-attached.patch b/packages/linux/patches/3.10.4/linux-999.02-drm-i915-correctly-restore-fences-with-objects-attached.patch similarity index 100% rename from packages/linux/patches/3.10.2/linux-999.02-drm-i915-correctly-restore-fences-with-objects-attached.patch rename to packages/linux/patches/3.10.4/linux-999.02-drm-i915-correctly-restore-fences-with-objects-attached.patch From 9790da6390bbd92faaedf0a44c4c0fe24fa11a15 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 08:18:34 +0200 Subject: [PATCH 035/103] linux: add patch to fix resume issue after suspend with kernel 3.10.3 and later Signed-off-by: Stephan Raue --- ...e4af3be0235d4cf41ea9fd774205a32e58a2.patch | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 packages/linux/patches/3.10.4/linux-998.01-cpufreq-revert-9d3ce4af3be0235d4cf41ea9fd774205a32e58a2.patch diff --git a/packages/linux/patches/3.10.4/linux-998.01-cpufreq-revert-9d3ce4af3be0235d4cf41ea9fd774205a32e58a2.patch b/packages/linux/patches/3.10.4/linux-998.01-cpufreq-revert-9d3ce4af3be0235d4cf41ea9fd774205a32e58a2.patch new file mode 100644 index 0000000000..7ba44dc839 --- /dev/null +++ b/packages/linux/patches/3.10.4/linux-998.01-cpufreq-revert-9d3ce4af3be0235d4cf41ea9fd774205a32e58a2.patch @@ -0,0 +1,84 @@ +This reverts +https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/patch/?id=9d3ce4af3be0235d4cf41ea9fd774205a32e58a2 + +From 9d3ce4af3be0235d4cf41ea9fd774205a32e58a2 Mon Sep 17 00:00:00 2001 +From: Srivatsa S. Bhat +Date: Thu, 11 Jul 2013 22:15:37 +0000 +Subject: cpufreq: Revert commit a66b2e to fix suspend/resume regression + +commit aae760ed21cd690fe8a6db9f3a177ad55d7e12ab upstream. + +commit a66b2e (cpufreq: Preserve sysfs files across suspend/resume) +has unfortunately caused several things in the cpufreq subsystem to +break subtly after a suspend/resume cycle. + +The intention of that patch was to retain the file permissions of the +cpufreq related sysfs files across suspend/resume. To achieve that, +the commit completely removed the calls to cpufreq_add_dev() and +__cpufreq_remove_dev() during suspend/resume transitions. But the +problem is that those functions do 2 kinds of things: + 1. Low-level initialization/tear-down that are critical to the + correct functioning of cpufreq-core. + 2. Kobject and sysfs related initialization/teardown. + +Ideally we should have reorganized the code to cleanly separate these +two responsibilities, and skipped only the sysfs related parts during +suspend/resume. Since we skipped the entire callbacks instead (which +also included some CPU and cpufreq-specific critical components), +cpufreq subsystem started behaving erratically after suspend/resume. + +So revert the commit to fix the regression. We'll revisit and address +the original goal of that commit separately, since it involves quite a +bit of careful code reorganization and appears to be non-trivial. + +(While reverting the commit, note that another commit f51e1eb + (cpufreq: Fix cpufreq regression after suspend/resume) already + reverted part of the original set of changes. So revert only the + remaining ones). + +Signed-off-by: Srivatsa S. Bhat +Acked-by: Viresh Kumar +Tested-by: Paul Bolle +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman + +--- +diff -Naur linux-3.10.4/drivers/cpufreq/cpufreq.c linux-3.10.4.patch/drivers/cpufreq/cpufreq.c +--- linux-3.10.4/drivers/cpufreq/cpufreq.c 2013-07-29 01:30:49.000000000 +0200 ++++ linux-3.10.4.patch/drivers/cpufreq/cpufreq.c 2013-07-30 08:08:08.016815021 +0200 +@@ -1837,15 +1837,13 @@ + if (dev) { + switch (action) { + case CPU_ONLINE: +- case CPU_ONLINE_FROZEN: + cpufreq_add_dev(dev, NULL); + break; + case CPU_DOWN_PREPARE: +- case CPU_DOWN_PREPARE_FROZEN: ++ case CPU_UP_CANCELED_FROZEN: + __cpufreq_remove_dev(dev, NULL); + break; + case CPU_DOWN_FAILED: +- case CPU_DOWN_FAILED_FROZEN: + cpufreq_add_dev(dev, NULL); + break; + } +diff -Naur linux-3.10.4/drivers/cpufreq/cpufreq_stats.c linux-3.10.4.patch/drivers/cpufreq/cpufreq_stats.c +--- linux-3.10.4/drivers/cpufreq/cpufreq_stats.c 2013-07-29 01:30:49.000000000 +0200 ++++ linux-3.10.4.patch/drivers/cpufreq/cpufreq_stats.c 2013-07-30 08:08:08.016815021 +0200 +@@ -353,11 +353,13 @@ + cpufreq_update_policy(cpu); + break; + case CPU_DOWN_PREPARE: +- case CPU_DOWN_PREPARE_FROZEN: + cpufreq_stats_free_sysfs(cpu); + break; + case CPU_DEAD: +- case CPU_DEAD_FROZEN: ++ cpufreq_stats_free_table(cpu); ++ break; ++ case CPU_UP_CANCELED_FROZEN: ++ cpufreq_stats_free_sysfs(cpu); + cpufreq_stats_free_table(cpu); + break; + } From 6c2ea61b4b7d4914ddbb0e87214bcaf7de170711 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 08:21:00 +0200 Subject: [PATCH 036/103] xf86-video-intel: update to xf86-video-intel-2.21.13 Signed-off-by: Stephan Raue --- packages/x11/driver/xf86-video-intel/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/x11/driver/xf86-video-intel/meta b/packages/x11/driver/xf86-video-intel/meta index 3623548a7a..57f7b447b8 100644 --- a/packages/x11/driver/xf86-video-intel/meta +++ b/packages/x11/driver/xf86-video-intel/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xf86-video-intel" -PKG_VERSION="2.21.12" +PKG_VERSION="2.21.13" PKG_REV="1" PKG_ARCH="i386 x86_64" PKG_LICENSE="OSS" From e0b1815a256111c2b036990e12f8b27fff97806a Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 08:29:02 +0200 Subject: [PATCH 037/103] xf86-video-intel: convert to new package format Signed-off-by: Stephan Raue --- packages/x11/driver/xf86-video-intel/build | 52 ------------------- packages/x11/driver/xf86-video-intel/install | 26 ---------- .../xf86-video-intel/{meta => package.mk} | 22 +++++++- 3 files changed, 20 insertions(+), 80 deletions(-) delete mode 100755 packages/x11/driver/xf86-video-intel/build delete mode 100755 packages/x11/driver/xf86-video-intel/install rename packages/x11/driver/xf86-video-intel/{meta => package.mk} (68%) diff --git a/packages/x11/driver/xf86-video-intel/build b/packages/x11/driver/xf86-video-intel/build deleted file mode 100755 index 7cb119e38b..0000000000 --- a/packages/x11/driver/xf86-video-intel/build +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -# TODO: xf86-video-intel-2.21.5 dont link with LTO enabled - strip_lto - -xorg_drv_configure_prepend - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --enable-shared \ - --disable-static \ - --enable-udev \ - --enable-dri \ - --enable-kms-only \ - --disable-xvmc \ - --disable-ums-only \ - --enable-sna \ - --enable-uxa \ - --disable-glamor \ - --disable-xaa \ - --disable-dga \ - --disable-async-swap \ - --with-xorg-module-dir=$XORG_PATH_MODULES - -make - -$MAKEINSTALL diff --git a/packages/x11/driver/xf86-video-intel/install b/packages/x11/driver/xf86-video-intel/install deleted file mode 100755 index 50bf8bf146..0000000000 --- a/packages/x11/driver/xf86-video-intel/install +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/$XORG_PATH_MODULES/drivers - cp -P $PKG_BUILD/src/.libs/intel_drv.so $INSTALL/$XORG_PATH_MODULES/drivers diff --git a/packages/x11/driver/xf86-video-intel/meta b/packages/x11/driver/xf86-video-intel/package.mk similarity index 68% rename from packages/x11/driver/xf86-video-intel/meta rename to packages/x11/driver/xf86-video-intel/package.mk index 57f7b447b8..78230fc6b7 100644 --- a/packages/x11/driver/xf86-video-intel/meta +++ b/packages/x11/driver/xf86-video-intel/package.mk @@ -26,11 +26,29 @@ PKG_LICENSE="OSS" PKG_SITE="http://intellinuxgraphics.org/" PKG_URL="http://xorg.freedesktop.org/archive/individual/driver/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="systemd intel-gpu-tools" -PKG_BUILD_DEPENDS="toolchain util-macros fontsproto systemd xorg-server" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros fontsproto systemd xorg-server" PKG_PRIORITY="optional" PKG_SECTION="x11/driver" PKG_SHORTDESC="xf86-video-intel: The Xorg driver for Intel video chips" PKG_LONGDESC="The Xorg driver for Intel i810, i815, 830M, 845G, 852GM, 855GM, 865G, 915G, 915GM and 965G video chips." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--enable-udev \ + --enable-dri \ + --enable-kms-only \ + --disable-xvmc \ + --disable-ums-only \ + --enable-sna \ + --enable-uxa \ + --disable-glamor \ + --disable-xaa \ + --disable-dga \ + --disable-async-swap \ + --with-xorg-module-dir=$XORG_PATH_MODULES" + +pre_configure_target() { +# TODO: xf86-video-intel-2.21.5 dont link with LTO enabled + strip_lto +} From 403340729f6a1d2737bf5c0cc35cb636f97c2e76 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 08:34:11 +0200 Subject: [PATCH 038/103] libXfont: update to libXfont-1.4.6 Signed-off-by: Stephan Raue --- packages/x11/lib/libXfont/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/x11/lib/libXfont/meta b/packages/x11/lib/libXfont/meta index 0cccac5a56..be3793dea3 100644 --- a/packages/x11/lib/libXfont/meta +++ b/packages/x11/lib/libXfont/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="libXfont" -PKG_VERSION="1.4.5" +PKG_VERSION="1.4.6" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="OSS" From 9737df67058aa028cfd7017b2ddf94a4fc7d44ae Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 08:38:10 +0200 Subject: [PATCH 039/103] libXfont: convert to new package format Signed-off-by: Stephan Raue --- packages/x11/lib/libXfont/build | 44 ------------------- packages/x11/lib/libXfont/install | 26 ----------- .../x11/lib/libXfont/{meta => package.mk} | 15 ++++++- 3 files changed, 13 insertions(+), 72 deletions(-) delete mode 100755 packages/x11/lib/libXfont/build delete mode 100755 packages/x11/lib/libXfont/install rename packages/x11/lib/libXfont/{meta => package.mk} (73%) diff --git a/packages/x11/lib/libXfont/build b/packages/x11/lib/libXfont/build deleted file mode 100755 index a33ca70e63..0000000000 --- a/packages/x11/lib/libXfont/build +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --disable-static \ - --enable-shared \ - --disable-ipv6 \ - --enable-freetype \ - --enable-builtins \ - --disable-pcfformat \ - --disable-bdfformat \ - --disable-snfformat \ - --enable-fc \ - --with-gnu-ld \ - --without-xmlto - -make -$MAKEINSTALL diff --git a/packages/x11/lib/libXfont/install b/packages/x11/lib/libXfont/install deleted file mode 100755 index e14383416f..0000000000 --- a/packages/x11/lib/libXfont/install +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/lib - cp -P $PKG_BUILD/src/.libs/libXfont.so* $INSTALL/usr/lib diff --git a/packages/x11/lib/libXfont/meta b/packages/x11/lib/libXfont/package.mk similarity index 73% rename from packages/x11/lib/libXfont/meta rename to packages/x11/lib/libXfont/package.mk index be3793dea3..07f2324988 100644 --- a/packages/x11/lib/libXfont/meta +++ b/packages/x11/lib/libXfont/package.mk @@ -26,11 +26,22 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/lib/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="freetype" -PKG_BUILD_DEPENDS="toolchain util-macros fontcacheproto fontsproto xtrans freetype libfontenc" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros fontcacheproto fontsproto xtrans freetype libfontenc" PKG_PRIORITY="optional" PKG_SECTION="x11/lib" PKG_SHORTDESC="libxfont: X font Library" PKG_LONGDESC="X font Library" -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--disable-ipv6 \ + --enable-freetype \ + --enable-builtins \ + --disable-pcfformat \ + --disable-bdfformat \ + --disable-snfformat \ + --enable-fc \ + --with-gnu-ld \ + --without-xmlto" + From 11f2e0c65ddc3ece56aae29a73f15d90ee3efc14 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 08:39:03 +0200 Subject: [PATCH 040/103] makedepend: update to makedepend-1.0.5 Signed-off-by: Stephan Raue --- packages/x11/util/makedepend/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/x11/util/makedepend/meta b/packages/x11/util/makedepend/meta index 05bc34c1c0..af29ea0b3e 100644 --- a/packages/x11/util/makedepend/meta +++ b/packages/x11/util/makedepend/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="makedepend" -PKG_VERSION="1.0.4" +PKG_VERSION="1.0.5" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="OSS" From e421767ed5efe2f838dde55b7c4b2db6d9a162d8 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 08:42:43 +0200 Subject: [PATCH 041/103] makedepend: convert to new package format Signed-off-by: Stephan Raue --- packages/graphics/Mesa/package.mk | 2 +- packages/x11/util/makedepend/build | 34 ------------------- .../x11/util/makedepend/{meta => package.mk} | 4 +-- 3 files changed, 3 insertions(+), 37 deletions(-) delete mode 100755 packages/x11/util/makedepend/build rename packages/x11/util/makedepend/{meta => package.mk} (96%) diff --git a/packages/graphics/Mesa/package.mk b/packages/graphics/Mesa/package.mk index 472c8a1d98..3c8b85efed 100644 --- a/packages/graphics/Mesa/package.mk +++ b/packages/graphics/Mesa/package.mk @@ -26,7 +26,7 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.mesa3d.org/" PKG_URL="ftp://freedesktop.org/pub/mesa/$PKG_VERSION/MesaLib-$PKG_VERSION.tar.bz2" PKG_DEPENDS="libXdamage libdrm expat libXext libXfixes libX11" -PKG_BUILD_DEPENDS_TARGET="toolchain Python-host makedepend libxml2-host expat glproto dri2proto libdrm libXext libXdamage libXfixes libXxf86vm libxcb libX11" +PKG_BUILD_DEPENDS_TARGET="toolchain Python-host makedepend:host libxml2-host expat glproto dri2proto libdrm libXext libXdamage libXfixes libXxf86vm libxcb libX11" PKG_PRIORITY="optional" PKG_SECTION="graphics" PKG_SHORTDESC="mesa: 3-D graphics library with OpenGL API" diff --git a/packages/x11/util/makedepend/build b/packages/x11/util/makedepend/build deleted file mode 100755 index 06589e1f77..0000000000 --- a/packages/x11/util/makedepend/build +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -setup_toolchain host - -cd $PKG_BUILD - -./configure --host=$HOST_NAME \ - --build=$HOST_NAME \ - --prefix=$ROOT/$TOOLCHAIN \ - -make -make install diff --git a/packages/x11/util/makedepend/meta b/packages/x11/util/makedepend/package.mk similarity index 96% rename from packages/x11/util/makedepend/meta rename to packages/x11/util/makedepend/package.mk index af29ea0b3e..fd9a684e70 100644 --- a/packages/x11/util/makedepend/meta +++ b/packages/x11/util/makedepend/package.mk @@ -26,11 +26,11 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/util/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain xproto:host" +PKG_BUILD_DEPENDS_HOST="toolchain xproto:host" PKG_PRIORITY="optional" PKG_SECTION="x11/util" PKG_SHORTDESC="makedepend: Creates dependencies in makefiles" PKG_LONGDESC="Creates dependencies in makefiles, a left-over of the historic imake build system." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="no" From 45b52c5bd23815b1839b0b43b95d68b8925700f2 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 09:04:51 +0200 Subject: [PATCH 042/103] samba: enable back avahi support, this partly reverts https://github.com/OpenELEC/OpenELEC.tv/commit/d314594b, this should fix #2339 Signed-off-by: Stephan Raue --- packages/network/avahi/install | 9 +-------- packages/network/samba/build | 8 +++++++- packages/network/samba/meta | 5 +++++ projects/ATV/avahi/samba.service | 14 -------------- 4 files changed, 13 insertions(+), 23 deletions(-) delete mode 100644 projects/ATV/avahi/samba.service diff --git a/packages/network/avahi/install b/packages/network/avahi/install index ec2ca0432b..f6567ffe80 100755 --- a/packages/network/avahi/install +++ b/packages/network/avahi/install @@ -40,14 +40,7 @@ mkdir -p $INSTALL/etc/avahi mkdir -p $INSTALL/etc/avahi/services # cp $PKG_BUILD/avahi-daemon/ssh.service $INSTALL/etc/avahi/services - - if [ $SAMBA_SERVER = "yes" ]; then - if [ -f $PROJECT_DIR/$PROJECT/avahi/samba.service ]; then - cp $PROJECT_DIR/$PROJECT/avahi/samba.service $INSTALL/etc/avahi/services - else - cp $PKG_DIR/config/samba.service $INSTALL/etc/avahi/services - fi - fi +# cp $PKG_DIR/config/samba.service $INSTALL/etc/avahi/services if [ $SFTP_SERVER = "yes" ]; then cp $PKG_BUILD/avahi-daemon/sftp-ssh.service $INSTALL/etc/avahi/services diff --git a/packages/network/samba/build b/packages/network/samba/build index c909fb180b..b9a89077ec 100755 --- a/packages/network/samba/build +++ b/packages/network/samba/build @@ -22,6 +22,12 @@ . config/options $1 +if [ "$AVAHI_DAEMON" = yes ]; then + SMB_AVAHI="--enable-avahi" +else + SMB_AVAHI="--disable-avahi" +fi + CFLAGS="$CFLAGS -fPIC -DPIC" cd $PKG_BUILD/source3 @@ -73,7 +79,7 @@ samba_cv_have_setresuid=yes \ --disable-relro \ --disable-fam \ --disable-dnssd \ - --disable-avahi \ + $SMB_AVAHI \ --disable-pthreadpool \ --enable-gnutls \ --disable-netapi \ diff --git a/packages/network/samba/meta b/packages/network/samba/meta index 43abf77b17..01187673f8 100644 --- a/packages/network/samba/meta +++ b/packages/network/samba/meta @@ -34,3 +34,8 @@ PKG_LONGDESC="Samba is a SMB server that runs on Unix and other operating system PKG_IS_ADDON="no" PKG_AUTORECONF="no" + +if [ "$AVAHI_DAEMON" = yes ]; then + PKG_DEPENDS="$PKG_DEPENDS avahi" + PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS avahi" +fi diff --git a/projects/ATV/avahi/samba.service b/projects/ATV/avahi/samba.service deleted file mode 100644 index 0cccf71f1c..0000000000 --- a/projects/ATV/avahi/samba.service +++ /dev/null @@ -1,14 +0,0 @@ - - - - %h - - _smb._tcp - 445 - - - _device-info._tcp - 0 - model=AppleTV1,1 - - From a714fda0054085f8172d1989156f6e3cb39a5605 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 09:06:42 +0200 Subject: [PATCH 043/103] bluez: add and install obexd dbus service file Signed-off-by: Stephan Raue --- packages/network/bluez/config/org.bluez.obex.service | 5 +++++ packages/network/bluez/package.mk | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 packages/network/bluez/config/org.bluez.obex.service diff --git a/packages/network/bluez/config/org.bluez.obex.service b/packages/network/bluez/config/org.bluez.obex.service new file mode 100644 index 0000000000..8c3a8a0517 --- /dev/null +++ b/packages/network/bluez/config/org.bluez.obex.service @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=org.bluez.obex +Exec=/usr/lib/bluetooth/obexd +User=root + diff --git a/packages/network/bluez/package.mk b/packages/network/bluez/package.mk index 4f8f0d0430..ee94378618 100644 --- a/packages/network/bluez/package.mk +++ b/packages/network/bluez/package.mk @@ -70,3 +70,7 @@ pre_configure_target() { rm -rf .$TARGET_NAME } +post_makeinstall_target() { + mkdir -p $INSTALL/usr/share/dbus-1/services + cp $PKG_DIR/config/org.bluez.obex.service $INSTALL/usr/share/dbus-1/services +} From 8db2e655ae6fce03260ade590b9e42fc90143c58 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 13:59:39 +0200 Subject: [PATCH 044/103] xbmc: update to xbmc-12.2-e40d13d Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc-theme-Confluence/meta | 2 +- packages/mediacenter/xbmc/package.mk | 2 +- .../todo/xbmc-990.27-PR2232.patch.bk | 0 ...-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk | 0 .../xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk | 0 .../xbmc-321-texturepacker-hostflags-and-rework.patch | 0 ...bmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch | 0 .../xbmc-452-change_lcd_content-0.1.patch | 0 .../xbmc-453-add_openelec.tv_RSS_news-0.1.patch | 0 .../xbmc-990.00-remove-windowed-display-mode.patch | 0 .../xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch | 0 .../xbmc-995.11-enable-vpp-deinterlacing.patch | 0 .../xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch | 0 .../xbmc-995.13-vpp-fix-skipping.patch | 0 14 files changed, 2 insertions(+), 2 deletions(-) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/todo/xbmc-990.27-PR2232.patch.bk (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/todo/xbmc-995.03-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/todo/xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/xbmc-321-texturepacker-hostflags-and-rework.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/xbmc-452-change_lcd_content-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/xbmc-453-add_openelec.tv_RSS_news-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/xbmc-990.00-remove-windowed-display-mode.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/xbmc-995.11-enable-vpp-deinterlacing.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch (100%) rename packages/mediacenter/xbmc/patches/{12.2-8e4f924 => 12.2-e40d13d}/xbmc-995.13-vpp-fix-skipping.patch (100%) diff --git a/packages/mediacenter/xbmc-theme-Confluence/meta b/packages/mediacenter/xbmc-theme-Confluence/meta index 83b77735c2..21be4b1a06 100644 --- a/packages/mediacenter/xbmc-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-theme-Confluence/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xbmc-theme-Confluence" -PKG_VERSION="12.2-8e4f924" +PKG_VERSION="12.2-e40d13d" if [ "$XBMC" = "master" ]; then PKG_VERSION="f68634b" elif [ "$XBMC" = "xbmc-aml" ]; then diff --git a/packages/mediacenter/xbmc/package.mk b/packages/mediacenter/xbmc/package.mk index 8eb668b0d8..3c1b50713f 100644 --- a/packages/mediacenter/xbmc/package.mk +++ b/packages/mediacenter/xbmc/package.mk @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xbmc" -PKG_VERSION="12.2-8e4f924" +PKG_VERSION="12.2-e40d13d" if [ "$XBMC" = "master" ]; then PKG_VERSION="f68634b" elif [ "$XBMC" = "xbmc-aml" ]; then diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-990.27-PR2232.patch.bk b/packages/mediacenter/xbmc/patches/12.2-e40d13d/todo/xbmc-990.27-PR2232.patch.bk similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-990.27-PR2232.patch.bk rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/todo/xbmc-990.27-PR2232.patch.bk diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-995.03-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk b/packages/mediacenter/xbmc/patches/12.2-e40d13d/todo/xbmc-995.03-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-995.03-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/todo/xbmc-995.03-OMXPlayer-Audio-fix_incorrect_usage_of_flag_talled.patch.bk diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk b/packages/mediacenter/xbmc/patches/12.2-e40d13d/todo/xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/todo/xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/todo/xbmc-995.04-OMXPlayer-some_caching_fixes_for_pvr.patch.bk diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-321-texturepacker-hostflags-and-rework.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-321-texturepacker-hostflags-and-rework.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-452-change_lcd_content-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-452-change_lcd_content-0.1.patch rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-452-change_lcd_content-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-990.00-remove-windowed-display-mode.patch b/packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-990.00-remove-windowed-display-mode.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-990.00-remove-windowed-display-mode.patch rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-990.00-remove-windowed-display-mode.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch b/packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-990.24-smbnfsdeinit-and-wait-for-nic-on-wakeup.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.11-enable-vpp-deinterlacing.patch b/packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-995.11-enable-vpp-deinterlacing.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.11-enable-vpp-deinterlacing.patch rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-995.11-enable-vpp-deinterlacing.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch b/packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-995.12-enable-vpp-fix-audio-out-of-sync.patch diff --git a/packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.13-vpp-fix-skipping.patch b/packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-995.13-vpp-fix-skipping.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/12.2-8e4f924/xbmc-995.13-vpp-fix-skipping.patch rename to packages/mediacenter/xbmc/patches/12.2-e40d13d/xbmc-995.13-vpp-fix-skipping.patch From 45233d48cbb0739ca7150fa087562d3dd000adde Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 14:01:14 +0200 Subject: [PATCH 045/103] avahi: switch back to build shared librarys to fix build with samba-avahi support Signed-off-by: Stephan Raue --- packages/network/avahi/build | 4 ++-- packages/network/avahi/install | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/network/avahi/build b/packages/network/avahi/build index 8cf3b6d60c..0a7088b86b 100755 --- a/packages/network/avahi/build +++ b/packages/network/avahi/build @@ -31,8 +31,8 @@ ac_cv_func_chroot=no \ --prefix=/usr \ --sysconfdir=/etc \ --localstatedir=/var \ - --enable-static \ - --disable-shared \ + --disable-static \ + --enable-shared \ --with-distro=none \ --disable-glib \ --disable-gobject \ diff --git a/packages/network/avahi/install b/packages/network/avahi/install index f6567ffe80..d3a64d9461 100755 --- a/packages/network/avahi/install +++ b/packages/network/avahi/install @@ -50,20 +50,26 @@ mkdir -p $INSTALL/etc/dbus-1/system.d cp $PKG_BUILD/avahi-daemon/avahi-dbus.conf $INSTALL/etc/dbus-1/system.d mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/avahi-utils/avahi-browse $INSTALL/usr/bin + cp $PKG_BUILD/avahi-utils/.libs/avahi-browse $INSTALL/usr/bin ln -sf avahi-browse $INSTALL/usr/bin/avahi-browse-domains - cp $PKG_BUILD/avahi-utils/avahi-publish $INSTALL/usr/bin + cp $PKG_BUILD/avahi-utils/.libs/avahi-publish $INSTALL/usr/bin ln -sf avahi-publish $INSTALL/usr/bin/avahi-publish-address ln -sf avahi-publish $INSTALL/usr/bin/avahi-publish-service - cp $PKG_BUILD/avahi-utils/avahi-resolve $INSTALL/usr/bin + cp $PKG_BUILD/avahi-utils/.libs/avahi-resolve $INSTALL/usr/bin ln -sf avahi-resolve $INSTALL/usr/bin/avahi-resolve-address ln -sf avahi-resolve $INSTALL/usr/bin/avahi-resolve-host-name - cp $PKG_BUILD/avahi-utils/avahi-set-host-name $INSTALL/usr/bin + cp $PKG_BUILD/avahi-utils/.libs/avahi-set-host-name $INSTALL/usr/bin mkdir -p $INSTALL/usr/sbin cp $PKG_BUILD/avahi-autoipd/avahi-autoipd $INSTALL/usr/sbin - cp $PKG_BUILD/avahi-daemon/avahi-daemon $INSTALL/usr/sbin - cp $PKG_BUILD/avahi-dnsconfd/avahi-dnsconfd $INSTALL/usr/sbin + cp $PKG_BUILD/avahi-daemon/.libs/avahi-daemon $INSTALL/usr/sbin + cp $PKG_BUILD/avahi-dnsconfd/.libs/avahi-dnsconfd $INSTALL/usr/sbin + +mkdir -p $INSTALL/usr/lib + cp -P $PKG_BUILD/avahi-common/.libs/*.so*[.0-9] $INSTALL/usr/lib/ + cp -P $PKG_BUILD/avahi-core/.libs/*.so*[.0-9] $INSTALL/usr/lib/ + cp -P $PKG_BUILD/avahi-client/.libs/*.so*[.0-9] $INSTALL/usr/lib/ + cp -P $PKG_BUILD/avahi-compat-libdns_sd/.libs/*.so*[.0-9] $INSTALL/usr/lib/ mkdir -p $PYTHON_LIB_DIR/site-packages/avahi cp -P $PKG_BUILD/avahi-python/avahi/*.py $PYTHON_LIB_DIR/site-packages/avahi From 861a71ca8b7372135610da01777c2d15c5b9ec18 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 14:01:32 +0200 Subject: [PATCH 046/103] samba: depends on avahi Signed-off-by: Stephan Raue --- packages/network/samba/meta | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/network/samba/meta b/packages/network/samba/meta index 01187673f8..e7afd3ed92 100644 --- a/packages/network/samba/meta +++ b/packages/network/samba/meta @@ -25,8 +25,8 @@ PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.samba.org" PKG_URL="http://samba.org/samba/ftp/stable/$PKG_NAME-$PKG_VERSION.tar.gz" -PKG_DEPENDS="zlib connman" -PKG_BUILD_DEPENDS="toolchain zlib attr" +PKG_DEPENDS="zlib connman avahi" +PKG_BUILD_DEPENDS="toolchain zlib attr avahi" PKG_PRIORITY="optional" PKG_SECTION="network" PKG_SHORTDESC="samba: The free SMB / CIFS fileserver and client" From d8cb676009a3c123a8445fc750c37dc094f678f7 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 21:37:31 +0200 Subject: [PATCH 047/103] scripts/install: new buildsystem: add support for pre_install() and post_install() hooks via package.mk Signed-off-by: Stephan Raue --- scripts/install | 58 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/scripts/install b/scripts/install index 87947163bc..df3a9c6747 100755 --- a/scripts/install +++ b/scripts/install @@ -56,22 +56,52 @@ for p in $PKG_DEPENDS $PKG_DEPENDS_TARGET; do $SCRIPTS/install $p done -if [ -d "$BUILD/${PKG_NAME}-${PKG_VERSION}" ]; then - PKG_BUILD="$BUILD/${PKG_NAME}-${PKG_VERSION}" -elif [ -d "$BUILD/${PKG_NAME}_${PKG_VERSION}" ]; then - PKG_BUILD="$BUILD/${PKG_NAME}_${PKG_VERSION}" -elif [ -d "$BUILD/${PKG_NAME}.${PKG_VERSION}" ]; then - PKG_BUILD="$BUILD/${PKG_NAME}.${PKG_VERSION}" -elif [ -d "$BUILD/${PKG_NAME}${PKG_VERSION}" ]; then - PKG_BUILD="$BUILD/${PKG_NAME}${PKG_VERSION}" -elif [ -d "$BUILD/${PKG_NAME}" ]; then - PKG_BUILD="$BUILD/${PKG_NAME}" -fi +if [ -f $PKG_DIR/package.mk ]; then + # unset functions + unset -f pre_install + unset -f post_install -if [ -d $PKG_BUILD/.install_pkg ]; then - mkdir -p $INSTALL - cp -PR $PKG_BUILD/.install_pkg/* $INSTALL + # include buildfile + . $PKG_DIR/package.mk + + # set PKG_BUILD variable + if [ -z "$PKG_BUILD" ]; then + if [ -d "$BUILD/${PKG_NAME}-${PKG_VERSION}" ]; then + PKG_BUILD="$BUILD/${PKG_NAME}-${PKG_VERSION}" + elif [ -d "$BUILD/${PKG_NAME}_${PKG_VERSION}" ]; then + PKG_BUILD="$BUILD/${PKG_NAME}_${PKG_VERSION}" + elif [ -d "$BUILD/${PKG_NAME}.${PKG_VERSION}" ]; then + PKG_BUILD="$BUILD/${PKG_NAME}.${PKG_VERSION}" + elif [ -d "$BUILD/${PKG_NAME}${PKG_VERSION}" ]; then + PKG_BUILD="$BUILD/${PKG_NAME}${PKG_VERSION}" + elif [ -d "$BUILD/${PKG_NAME}" ]; then + PKG_BUILD="$BUILD/${PKG_NAME}" + fi + fi + + # install + if [ "$(type -t pre_install)" = "function" ]; then + pre_install + fi + if [ -d $PKG_BUILD/.install_pkg ]; then + mkdir -p $INSTALL + cp -PR $PKG_BUILD/.install_pkg/* $INSTALL + fi + if [ "$(type -t post_install)" = "function" ]; then + post_install + fi elif [ -f $PKG_DIR/install ]; then + if [ -d "$BUILD/${PKG_NAME}-${PKG_VERSION}" ]; then + PKG_BUILD="$BUILD/${PKG_NAME}-${PKG_VERSION}" + elif [ -d "$BUILD/${PKG_NAME}_${PKG_VERSION}" ]; then + PKG_BUILD="$BUILD/${PKG_NAME}_${PKG_VERSION}" + elif [ -d "$BUILD/${PKG_NAME}.${PKG_VERSION}" ]; then + PKG_BUILD="$BUILD/${PKG_NAME}.${PKG_VERSION}" + elif [ -d "$BUILD/${PKG_NAME}${PKG_VERSION}" ]; then + PKG_BUILD="$BUILD/${PKG_NAME}${PKG_VERSION}" + elif [ -d "$BUILD/${PKG_NAME}" ]; then + PKG_BUILD="$BUILD/${PKG_NAME}" + fi $PKG_DIR/install $@ >&$VERBOSE_OUT fi From 2fb89e8a609d27eec5f234b1d060a0014e32209d Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 21:46:45 +0200 Subject: [PATCH 048/103] avahi: convert to new package format Signed-off-by: Stephan Raue --- packages/network/avahi/build | 78 ---------------------- packages/network/avahi/install | 83 ------------------------ packages/network/avahi/meta | 36 ----------- packages/network/avahi/package.mk | 104 ++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 197 deletions(-) delete mode 100755 packages/network/avahi/build delete mode 100755 packages/network/avahi/install delete mode 100644 packages/network/avahi/meta create mode 100644 packages/network/avahi/package.mk diff --git a/packages/network/avahi/build b/packages/network/avahi/build deleted file mode 100755 index 0a7088b86b..0000000000 --- a/packages/network/avahi/build +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -py_cv_mod_gtk_=yes \ -py_cv_mod_dbus_=yes \ -ac_cv_func_chroot=no \ -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --disable-static \ - --enable-shared \ - --with-distro=none \ - --disable-glib \ - --disable-gobject \ - --disable-qt3 \ - --disable-qt4 \ - --disable-gtk \ - --disable-gtk3 \ - --enable-dbus \ - --disable-dbm \ - --disable-gdbm \ - --enable-libdaemon \ - --enable-python \ - --disable-pygtk \ - --enable-python-dbus \ - --disable-mono \ - --disable-monodoc \ - --enable-autoipd \ - --disable-doxygen-doc \ - --disable-doxygen-dot \ - --disable-doxygen-man \ - --disable-doxygen-rtf \ - --disable-doxygen-xml \ - --disable-doxygen-chm \ - --disable-doxygen-chi \ - --disable-doxygen-html \ - --disable-doxygen-ps \ - --disable-doxygen-pdf \ - --disable-core-docs \ - --disable-manpages \ - --disable-xmltoman \ - --disable-tests \ - --enable-compat-libdns_sd \ - --disable-compat-howl \ - --with-xml=expat \ - --with-avahi-user=avahi \ - --with-avahi-group=avahi \ - --with-autoipd-user=avahiautoipd \ - --with-autoipd-group=avahiautoipd \ - --disable-nls - -make V=1 - -$MAKEINSTALL diff --git a/packages/network/avahi/install b/packages/network/avahi/install deleted file mode 100755 index d3a64d9461..0000000000 --- a/packages/network/avahi/install +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -PYTHON_LIB_DIR=`ls -d $INSTALL/usr/lib/python*` - -add_user avahi x 495 495 "avahi-daemon" "/var/run/avahi-daemon" "/bin/sh" -add_group avahi 495 - -add_user avahiautoipd x 496 496 "avahi-autoipd" "/var/lib/avahi-autoipd" "/bin/sh" -add_group avahiautoipd 496 - -mkdir -p $INSTALL/etc/avahi - cp $PKG_BUILD/avahi-daemon/avahi-daemon.conf $INSTALL/etc/avahi - # for some reason avai can fail to start see: http://forums.gentoo.org/viewtopic-p-7322172.html#7322172 - sed -e "s,^.*disallow-other-stacks=.*$,disallow-other-stacks=yes,g" -i $INSTALL/etc/avahi/avahi-daemon.conf - # disable wide-area - sed -e "s,^.*enable-wide-area=.*$,enable-wide-area=no,g" -i $INSTALL/etc/avahi/avahi-daemon.conf - cp $PKG_BUILD/avahi-daemon/hosts $INSTALL/etc/avahi - -mkdir -p $INSTALL/etc/avahi/services -# cp $PKG_BUILD/avahi-daemon/ssh.service $INSTALL/etc/avahi/services -# cp $PKG_DIR/config/samba.service $INSTALL/etc/avahi/services - - if [ $SFTP_SERVER = "yes" ]; then - cp $PKG_BUILD/avahi-daemon/sftp-ssh.service $INSTALL/etc/avahi/services - fi - -mkdir -p $INSTALL/etc/dbus-1/system.d - cp $PKG_BUILD/avahi-daemon/avahi-dbus.conf $INSTALL/etc/dbus-1/system.d - -mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/avahi-utils/.libs/avahi-browse $INSTALL/usr/bin - ln -sf avahi-browse $INSTALL/usr/bin/avahi-browse-domains - cp $PKG_BUILD/avahi-utils/.libs/avahi-publish $INSTALL/usr/bin - ln -sf avahi-publish $INSTALL/usr/bin/avahi-publish-address - ln -sf avahi-publish $INSTALL/usr/bin/avahi-publish-service - cp $PKG_BUILD/avahi-utils/.libs/avahi-resolve $INSTALL/usr/bin - ln -sf avahi-resolve $INSTALL/usr/bin/avahi-resolve-address - ln -sf avahi-resolve $INSTALL/usr/bin/avahi-resolve-host-name - cp $PKG_BUILD/avahi-utils/.libs/avahi-set-host-name $INSTALL/usr/bin - -mkdir -p $INSTALL/usr/sbin - cp $PKG_BUILD/avahi-autoipd/avahi-autoipd $INSTALL/usr/sbin - cp $PKG_BUILD/avahi-daemon/.libs/avahi-daemon $INSTALL/usr/sbin - cp $PKG_BUILD/avahi-dnsconfd/.libs/avahi-dnsconfd $INSTALL/usr/sbin - -mkdir -p $INSTALL/usr/lib - cp -P $PKG_BUILD/avahi-common/.libs/*.so*[.0-9] $INSTALL/usr/lib/ - cp -P $PKG_BUILD/avahi-core/.libs/*.so*[.0-9] $INSTALL/usr/lib/ - cp -P $PKG_BUILD/avahi-client/.libs/*.so*[.0-9] $INSTALL/usr/lib/ - cp -P $PKG_BUILD/avahi-compat-libdns_sd/.libs/*.so*[.0-9] $INSTALL/usr/lib/ - -mkdir -p $PYTHON_LIB_DIR/site-packages/avahi - cp -P $PKG_BUILD/avahi-python/avahi/*.py $PYTHON_LIB_DIR/site-packages/avahi - -mkdir -p $INSTALL/usr/share/avahi - cp $PKG_BUILD/service-type-database/service-types $INSTALL/usr/share/avahi - cp $PKG_BUILD/avahi-daemon/avahi-service.dtd $INSTALL/usr/share/avahi - -mkdir -p $INSTALL/usr/share/dbus-1/interfaces - cp $PKG_BUILD/avahi-daemon/org.freedesktop.Avahi.*.xml $INSTALL/usr/share/dbus-1/interfaces - diff --git a/packages/network/avahi/meta b/packages/network/avahi/meta deleted file mode 100644 index 69ccc412cf..0000000000 --- a/packages/network/avahi/meta +++ /dev/null @@ -1,36 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="avahi" -PKG_VERSION="0.6.31" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://avahi.org/" -PKG_URL="http://www.avahi.org/download/$PKG_NAME-$PKG_VERSION.tar.gz" -PKG_DEPENDS="Python expat dbus connman dbus-python" -PKG_BUILD_DEPENDS="toolchain Python expat libdaemon dbus dbus-python" -PKG_PRIORITY="optional" -PKG_SECTION="network" -PKG_SHORTDESC="avahi: A Zeroconf mDNS/DNS-SD responder" -PKG_LONGDESC="Avahi is a framework for Multicast DNS Service Discovery (mDNS/DNS-SD a.k.a. Zeroconf) on Linux. It allows programs to publish and discover services running on a local network with no specific configuration. For example, you can plug into a network and instantly find printers to print to, files to look at, and people to talk to." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="yes" diff --git a/packages/network/avahi/package.mk b/packages/network/avahi/package.mk new file mode 100644 index 0000000000..c7e04fb006 --- /dev/null +++ b/packages/network/avahi/package.mk @@ -0,0 +1,104 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="avahi" +PKG_VERSION="0.6.31" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://avahi.org/" +PKG_URL="http://www.avahi.org/download/$PKG_NAME-$PKG_VERSION.tar.gz" +PKG_DEPENDS="Python expat dbus connman dbus-python" +PKG_BUILD_DEPENDS_TARGET="toolchain Python expat libdaemon dbus dbus-python" +PKG_PRIORITY="optional" +PKG_SECTION="network" +PKG_SHORTDESC="avahi: A Zeroconf mDNS/DNS-SD responder" +PKG_LONGDESC="Avahi is a framework for Multicast DNS Service Discovery (mDNS/DNS-SD a.k.a. Zeroconf) on Linux. It allows programs to publish and discover services running on a local network with no specific configuration. For example, you can plug into a network and instantly find printers to print to, files to look at, and people to talk to." + +PKG_IS_ADDON="no" +PKG_AUTORECONF="yes" + +MAKEFLAGS="-j1" + +PKG_CONFIGURE_OPTS_TARGET="py_cv_mod_gtk_=yes \ + py_cv_mod_dbus_=yes \ + ac_cv_func_chroot=no \ + --with-distro=none \ + --disable-glib \ + --disable-gobject \ + --disable-qt3 \ + --disable-qt4 \ + --disable-gtk \ + --disable-gtk3 \ + --enable-dbus \ + --disable-dbm \ + --disable-gdbm \ + --enable-libdaemon \ + --enable-python \ + --disable-pygtk \ + --enable-python-dbus \ + --disable-mono \ + --disable-monodoc \ + --enable-autoipd \ + --disable-doxygen-doc \ + --disable-doxygen-dot \ + --disable-doxygen-man \ + --disable-doxygen-rtf \ + --disable-doxygen-xml \ + --disable-doxygen-chm \ + --disable-doxygen-chi \ + --disable-doxygen-html \ + --disable-doxygen-ps \ + --disable-doxygen-pdf \ + --disable-core-docs \ + --disable-manpages \ + --disable-xmltoman \ + --disable-tests \ + --enable-compat-libdns_sd \ + --disable-compat-howl \ + --with-xml=expat \ + --with-avahi-user=avahi \ + --with-avahi-group=avahi \ + --with-autoipd-user=avahiautoipd \ + --with-autoipd-group=avahiautoipd \ + --disable-nls" + +post_makeinstall_target() { +# for some reason avai can fail to start see: http://forums.gentoo.org/viewtopic-p-7322172.html#7322172 + sed -e "s,^.*disallow-other-stacks=.*$,disallow-other-stacks=yes,g" -i $INSTALL/etc/avahi/avahi-daemon.conf +# disable wide-area + sed -e "s,^.*enable-wide-area=.*$,enable-wide-area=no,g" -i $INSTALL/etc/avahi/avahi-daemon.conf + + rm -rf $INSTALL/etc/avahi/avahi-autoipd.action + rm -rf $INSTALL/etc/avahi/avahi-dnsconfd.action + rm -rf $INSTALL/etc/avahi/services/ssh.service + if [ ! $SFTP_SERVER = "yes" ]; then + rm -rf $INSTALL/etc/avahi/services/sftp-ssh.service + fi + rm -rf $INSTALL/lib/systemd +} + +post_install() { + add_user avahi x 495 495 "avahi-daemon" "/var/run/avahi-daemon" "/bin/sh" + add_group avahi 495 + + add_user avahiautoipd x 496 496 "avahi-autoipd" "/var/lib/avahi-autoipd" "/bin/sh" + add_group avahiautoipd 496 +} From 399457df8d4805c114d735f3e013034c3256f96f Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 30 Jul 2013 22:23:24 +0200 Subject: [PATCH 049/103] mysql: update to mysql-5.1.70 Signed-off-by: Stephan Raue --- packages/databases/mysql/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/databases/mysql/package.mk b/packages/databases/mysql/package.mk index 083d661455..438b857974 100644 --- a/packages/databases/mysql/package.mk +++ b/packages/databases/mysql/package.mk @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="mysql" -PKG_VERSION="5.1.68" +PKG_VERSION="5.1.70" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="LGPL" From 85c77b5252c91a30102a1d53a86b8b9a9f7eb423 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 31 Jul 2013 23:02:31 +0200 Subject: [PATCH 050/103] mysql: update to mysql-5.6.13, add initial and optional support for mysql server - dont use it, it will be changed later\! Signed-off-by: Stephan Raue --- packages/databases/mysql/package.mk | 173 +++++++++++------- .../patches/mysql-010_crosscompiling.patch | 128 ------------- packages/databases/mysql/scripts/54_mysql | 43 +++++ 3 files changed, 150 insertions(+), 194 deletions(-) delete mode 100644 packages/databases/mysql/patches/mysql-010_crosscompiling.patch create mode 100644 packages/databases/mysql/scripts/54_mysql diff --git a/packages/databases/mysql/package.mk b/packages/databases/mysql/package.mk index 438b857974..a3090fc0f5 100644 --- a/packages/databases/mysql/package.mk +++ b/packages/databases/mysql/package.mk @@ -19,14 +19,14 @@ ################################################################################ PKG_NAME="mysql" -PKG_VERSION="5.1.70" +PKG_VERSION="5.6.13" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="LGPL" PKG_SITE="http://www.mysql.com" -PKG_URL="http://ftp.gwdg.de/pub/misc/$PKG_NAME/Downloads/MySQL-5.1/$PKG_NAME-$PKG_VERSION.tar.gz" +PKG_URL="http://cdn.mysql.com/Downloads/MySQL-5.6/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS="zlib ncurses" -PKG_BUILD_DEPENDS_HOST="toolchain zlib:host" +PKG_BUILD_DEPENDS_HOST="toolchain zlib:host ncurses" PKG_BUILD_DEPENDS_TARGET="toolchain zlib ncurses mysql:host" PKG_PRIORITY="optional" PKG_SECTION="database" @@ -34,83 +34,124 @@ PKG_SHORTDESC="mysql: A database server" PKG_LONGDESC="MySQL is a SQL (Structured Query Language) database server. SQL is the most popular database language in the world. MySQL is a client server implementation that consists of a server daemon mysqld and many different client programs/libraries." PKG_IS_ADDON="no" -PKG_AUTORECONF="yes" +PKG_AUTORECONF="no" -TARGET_CFLAGS="$TARGET_CFLAGS -fPIC -DPIC" +# export MAKEFLAGS=-j1 -PKG_CONFIGURE_OPTS_HOST="--with-zlib-dir=$ROOT/$TOOLCHAIN" +pre_configure_host() { + sed -i "/ADD_SUBDIRECTORY(sql\/share)/d" ../CMakeLists.txt + sed -i "s/ADD_SUBDIRECTORY(libmysql)/&\\nADD_SUBDIRECTORY(sql\/share)/" ../CMakeLists.txt + sed -i "s@data/test@\${INSTALL_MYSQLSHAREDIR}@g" ../sql/CMakeLists.txt + sed -i "s@data/mysql@\${INSTALL_MYSQLTESTDIR}@g" ../sql/CMakeLists.txt +} -PKG_CONFIGURE_OPTS_TARGET="ac_cv_c_stack_direction=-1 \ - ac_cv_sys_restartable_syscalls=yes \ - --localstatedir=/storage/.mysql \ - --with-unix-socket-path=/var/tmp/mysql.socket \ - --with-tcp-port=3306 \ - --enable-static \ - --disable-shared \ - --with-low-memory \ - --enable-largefile \ - --with-big-tables \ - --with-mysqld-user=mysqld \ - --with-extra-charsets=all \ - --with-pthread \ - --with-named-thread-libs=-lpthread \ - --enable-thread-safe-client \ - --enable-assembler \ - --enable-local-infile \ - --without-debug \ - --without-docs \ - --without-man \ - --with-readline \ - --without-libwrap \ - --without-pstack \ - --without-server \ - --without-embedded-server \ - --without-libedit \ - --with-query-cache \ - --without-plugin-partition \ - --without-plugin-daemon_example \ - --without-plugin-ftexample \ - --without-plugin-archive \ - --without-plugin-blackhole \ - --without-plugin-example \ - --without-plugin-federated \ - --without-plugin-ibmdb2i \ - --without-plugin-innobase \ - --without-plugin-innodb_plugin \ - --without-plugin-ndbcluster" +# package specific configure options +configure_host() { + cmake -DCMAKE_INSTALL_PREFIX=$TOOLCHAIN \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITHOUT_SERVER=OFF \ + -DWITH_EMBEDDED_SERVER=OFF \ + -DWITH_EXAMPLE_STORAGE_ENGINE=OFF \ + -DWITH_FEDERATED_STORAGE_ENGINE=OFF \ + -DWITH_INNOBASE_STORAGE_ENGINE=OFF \ + -DWITH_PARTITION_STORAGE_ENGINE=OFF \ + -DWITH_PERFSCHEMA_STORAGE_ENGINE=OFF \ + -DWITH_EXTRA_CHARSETS=none \ + -DWITH_EDITLINE=bundled \ + -DWITH_LIBEVENT=bundled \ + -DWITH_SSL=bundled \ + -DWITH_UNIT_TESTS=OFF \ + -DWITH_ZLIB=bundled \ + .. +} make_host() { - make -C include my_config.h - make -C mysys libmysys.a - make -C strings libmystrings.a - make -C dbug factorial - make -C vio libvio.a - make -C dbug libdbug.a - make -C regex libregex.a - make -C sql gen_lex_hash - make -C scripts comp_sql - make -C extra comp_err + make comp_err + make gen_lex_hash + make comp_sql } makeinstall_host() { - cp -PR dbug/factorial $ROOT/$TOOLCHAIN/bin/mysql-factorial - cp -PR sql/gen_lex_hash $ROOT/$TOOLCHAIN/bin/mysql-gen_lex_hash - cp -PR scripts/comp_sql $ROOT/$TOOLCHAIN/bin/mysql-comp_sql - cp -PR extra/comp_err $ROOT/$TOOLCHAIN/bin/mysql-comp_err + mkdir -p $ROOT/$TOOLCHAIN/bin + cp -PR extra/comp_err $ROOT/$TOOLCHAIN/bin + cp -PR sql/gen_lex_hash $ROOT/$TOOLCHAIN/bin + cp -PR scripts/comp_sql $ROOT/$TOOLCHAIN/bin +} + +configure_target() { +# strip_lto + cmake -DCMAKE_TOOLCHAIN_FILE=$CMAKE_CONF \ + -DCMAKE_BUILD_TYPE=Release \ + -DFEATURE_SET=classic \ + -DDISABLE_SHARED=ON \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DINSTALL_DOCDIR=share/doc/mysql \ + -DINSTALL_DOCREADMEDIR=share/doc/mysql \ + -DINSTALL_INCLUDEDIR=include/mysql \ + -DINSTALL_INFODIR=share/info \ + -DINSTALL_MANDIR=share/man \ + -DINSTALL_MYSQLDATADIR=/storage/.mysql \ + -DINSTALL_MYSQLSHAREDIR=share/mysql \ + -DINSTALL_MYSQLTESTDIR=share/mysql/test \ + -DINSTALL_PLUGINDIR=lib/mysql/plugin \ + -DINSTALL_SBINDIR=sbin \ + -DINSTALL_SCRIPTDIR=bin \ + -DINSTALL_SQLBENCHDIR=share/mysql/bench \ + -DINSTALL_SUPPORTFILESDIR=share/mysql/support \ + -DMYSQL_DATADIR=/storage/.mysql \ + -DMYSQL_UNIX_ADDR=/run/mysqld/mysqld.sock \ + -DSYSCONFDIR=/etc/mysql \ + -DWITHOUT_SERVER=OFF \ + -DWITH_EMBEDDED_SERVER=OFF \ + -DWITH_EXAMPLE_STORAGE_ENGINE=OFF \ + -DWITH_FEDERATED_STORAGE_ENGINE=OFF \ + -DWITH_INNOBASE_STORAGE_ENGINE=OFF \ + -DWITH_PARTITION_STORAGE_ENGINE=OFF \ + -DWITH_PERFSCHEMA_STORAGE_ENGINE=OFF \ + -DWITH_EXTRA_CHARSETS=all \ + -DENABLE_DTRACE=OFF \ + -DWITH_EDITLINE=bundled \ + -DWITH_LIBEVENT=bundled \ + -DWITH_SSL=system \ + -DWITH_UNIT_TESTS=OFF \ + -DWITH_ZLIB=system \ + -DSTACK_DIRECTION=1 \ + .. +} + +pre_make_target() { +# copy host binaries back - should be fixed + cp -PR ../.$HOST_NAME/scripts/comp_sql ../scripts/comp_sql } post_makeinstall_target() { sed -i "s|pkgincludedir=.*|pkgincludedir=\'$SYSROOT_PREFIX/usr/include/mysql\'|" scripts/mysql_config sed -i "s|pkglibdir=.*|pkglibdir=\'$SYSROOT_PREFIX/usr/lib/mysql\'|" scripts/mysql_config - cp scripts/mysql_config $SYSROOT_PREFIX/usr/bin - ln -sf $SYSROOT_PREFIX/usr/bin/mysql_config $ROOT/$TOOLCHAIN/bin/mysql_config - for i in `ls -d $SYSROOT_PREFIX/usr/lib/mysql/*.a`; do - ln -v -sf $i $SYSROOT_PREFIX/usr/lib - done + mkdir -p $ROOT/$TOOLCHAIN/bin + cp -PR scripts/mysql_config $ROOT/$TOOLCHAIN/bin rm -rf $INSTALL/usr/bin - rm -rf $INSTALL/usr/mysql-test - rm -rf $INSTALL/usr/share/mysql - rm -rf $INSTALL/usr/sql-bench + rm -rf $INSTALL/usr/sbin + rm -rf $INSTALL/usr/lib/mysql/plugin + rm -rf $INSTALL/usr/share/mysql/bench + rm -rf $INSTALL/usr/share/mysql/support + rm -rf $INSTALL/usr/share/mysql/test + + if [ "$MYSQL_SERVER" = "yes" ]; then + mkdir -p $INSTALL/usr/bin + cp -P extra/resolveip $INSTALL/usr/bin + cp -P extra/my_print_defaults $INSTALL/usr/bin + cp -P client/mysql $INSTALL/usr/bin + cp -P client/mysqladmin $INSTALL/usr/bin + cp -P scripts/mysql_install_db $INSTALL/usr/bin + + mkdir -p $INSTALL/usr/sbin + cp -P sql/mysqld $INSTALL/usr/sbin + + mkdir -p $INSTALL/etc/init.d + cp $PKG_DIR/scripts/* $INSTALL/etc/init.d + else + rm -rf $INSTALL/usr/share/mysql + fi } diff --git a/packages/databases/mysql/patches/mysql-010_crosscompiling.patch b/packages/databases/mysql/patches/mysql-010_crosscompiling.patch deleted file mode 100644 index b6c3e068a1..0000000000 --- a/packages/databases/mysql/patches/mysql-010_crosscompiling.patch +++ /dev/null @@ -1,128 +0,0 @@ -diff -Naur mysql-5.1.38/dbug/Makefile.am mysql-5.1.38.patch/dbug/Makefile.am ---- mysql-5.1.38/dbug/Makefile.am 2009-08-21 14:09:22.000000000 +0200 -+++ mysql-5.1.38.patch/dbug/Makefile.am 2009-09-10 02:57:59.000000000 +0200 -@@ -44,19 +44,19 @@ - -groff -mm user.r > $@ - - output1.r: factorial -- ./factorial 1 2 3 4 5 | cat > $@ -+ mysql-factorial 1 2 3 4 5 | cat > $@ - - output2.r: factorial -- ./factorial -\#t:o 2 3 | cat >$@ -+ mysql-factorial -\#t:o 2 3 | cat >$@ - - output3.r: factorial -- ./factorial -\#d:t:o 3 | cat >$@ -+ mysql-factorial -\#d:t:o 3 | cat >$@ - - output4.r: factorial -- ./factorial -\#d,result:o 4 | cat >$@ -+ mysql-factorial -\#d,result:o 4 | cat >$@ - - output5.r: factorial -- ./factorial -\#d:f,factorial:F:L:o 3 | cat >$@ -+ mysql-factorial -\#d:f,factorial:F:L:o 3 | cat >$@ - .c.r: - @RM@ -f $@ - @SED@ -e 's!\\!\\\\!g' $< > $@ -diff -Naur mysql-5.1.38/dbug/Makefile.in mysql-5.1.38.patch/dbug/Makefile.in ---- mysql-5.1.38/dbug/Makefile.in 2009-08-21 14:17:15.000000000 +0200 -+++ mysql-5.1.38.patch/dbug/Makefile.in 2009-09-10 02:58:14.000000000 +0200 -@@ -746,19 +746,19 @@ - -groff -mm user.r > $@ - - output1.r: factorial -- ./factorial 1 2 3 4 5 | cat > $@ -+ mysql-factorial 1 2 3 4 5 | cat > $@ - - output2.r: factorial -- ./factorial -\#t:o 2 3 | cat >$@ -+ mysql-factorial -\#t:o 2 3 | cat >$@ - - output3.r: factorial -- ./factorial -\#d:t:o 3 | cat >$@ -+ mysql-factorial -\#d:t:o 3 | cat >$@ - - output4.r: factorial -- ./factorial -\#d,result:o 4 | cat >$@ -+ mysql-factorial -\#d,result:o 4 | cat >$@ - - output5.r: factorial -- ./factorial -\#d:f,factorial:F:L:o 3 | cat >$@ -+ mysql-factorial -\#d:f,factorial:F:L:o 3 | cat >$@ - .c.r: - @RM@ -f $@ - @SED@ -e 's!\\!\\\\!g' $< > $@ -diff -Naur mysql-5.1.38/extra/Makefile.am mysql-5.1.38.patch/extra/Makefile.am ---- mysql-5.1.38/extra/Makefile.am 2009-08-21 14:09:23.000000000 +0200 -+++ mysql-5.1.38.patch/extra/Makefile.am 2009-09-10 02:53:50.000000000 +0200 -@@ -32,7 +32,7 @@ - $(top_builddir)/include/mysqld_error.h: comp_err.c \ - $(top_srcdir)/sql/share/errmsg.txt - $(MAKE) $(AM_MAKEFLAGS) comp_err$(EXEEXT) -- $(top_builddir)/extra/comp_err$(EXEEXT) \ -+ mysql-comp_err$(EXEEXT) \ - --charset=$(top_srcdir)/sql/share/charsets \ - --out-dir=$(top_builddir)/sql/share/ \ - --header_file=$(top_builddir)/include/mysqld_error.h \ -diff -Naur mysql-5.1.38/extra/Makefile.in mysql-5.1.38.patch/extra/Makefile.in ---- mysql-5.1.38/extra/Makefile.in 2009-08-21 14:17:16.000000000 +0200 -+++ mysql-5.1.38.patch/extra/Makefile.in 2009-09-10 02:53:16.000000000 +0200 -@@ -936,7 +936,7 @@ - $(top_builddir)/include/mysqld_error.h: comp_err.c \ - $(top_srcdir)/sql/share/errmsg.txt - $(MAKE) $(AM_MAKEFLAGS) comp_err$(EXEEXT) -- $(top_builddir)/extra/comp_err$(EXEEXT) \ -+ mysql-comp_err$(EXEEXT) \ - --charset=$(top_srcdir)/sql/share/charsets \ - --out-dir=$(top_builddir)/sql/share/ \ - --header_file=$(top_builddir)/include/mysqld_error.h \ -diff -Naur mysql-5.1.38/scripts/Makefile.am mysql-5.1.38.patch/scripts/Makefile.am ---- mysql-5.1.38/scripts/Makefile.am 2009-08-21 14:11:26.000000000 +0200 -+++ mysql-5.1.38.patch/scripts/Makefile.am 2009-09-10 02:57:01.000000000 +0200 -@@ -121,7 +121,7 @@ - mysql_fix_privilege_tables_sql.c: comp_sql.c mysql_fix_privilege_tables.sql - $(MAKE) $(AM_MAKEFLAGS) comp_sql$(EXEEXT) - sleep 2 -- $(top_builddir)/scripts/comp_sql$(EXEEXT) \ -+ mysql-comp_sql$(EXEEXT) \ - mysql_fix_privilege_tables \ - $(top_srcdir)/scripts/mysql_fix_privilege_tables.sql $@ - -diff -Naur mysql-5.1.38/scripts/Makefile.in mysql-5.1.38.patch/scripts/Makefile.in ---- mysql-5.1.38/scripts/Makefile.in 2009-08-21 14:17:23.000000000 +0200 -+++ mysql-5.1.38.patch/scripts/Makefile.in 2009-09-10 02:57:11.000000000 +0200 -@@ -802,7 +802,7 @@ - mysql_fix_privilege_tables_sql.c: comp_sql.c mysql_fix_privilege_tables.sql - $(MAKE) $(AM_MAKEFLAGS) comp_sql$(EXEEXT) - sleep 2 -- $(top_builddir)/scripts/comp_sql$(EXEEXT) \ -+ mysql-comp_sql$(EXEEXT) \ - mysql_fix_privilege_tables \ - $(top_srcdir)/scripts/mysql_fix_privilege_tables.sql $@ - -diff -Naur mysql-5.1.38/sql/Makefile.am mysql-5.1.38.patch/sql/Makefile.am ---- mysql-5.1.38/sql/Makefile.am 2009-08-21 14:12:24.000000000 +0200 -+++ mysql-5.1.38.patch/sql/Makefile.am 2009-09-10 02:55:09.000000000 +0200 -@@ -174,7 +174,7 @@ - # this avoid the rebuild of the built files in a source dist - lex_hash.h: gen_lex_hash.cc lex.h - $(MAKE) $(AM_MAKEFLAGS) gen_lex_hash$(EXEEXT) -- ./gen_lex_hash$(EXEEXT) > $@-t -+ mysql-gen_lex_hash$(EXEEXT) > $@-t - $(MV) $@-t $@ - - # For testing of udf_example.so -diff -Naur mysql-5.1.38/sql/Makefile.in mysql-5.1.38.patch/sql/Makefile.in ---- mysql-5.1.38/sql/Makefile.in 2009-08-21 14:17:25.000000000 +0200 -+++ mysql-5.1.38.patch/sql/Makefile.in 2009-09-10 02:55:22.000000000 +0200 -@@ -1302,7 +1302,7 @@ - # this avoid the rebuild of the built files in a source dist - lex_hash.h: gen_lex_hash.cc lex.h - $(MAKE) $(AM_MAKEFLAGS) gen_lex_hash$(EXEEXT) -- ./gen_lex_hash$(EXEEXT) > $@-t -+ mysql-gen_lex_hash$(EXEEXT) > $@-t - $(MV) $@-t $@ - - # We might have some stuff not built in this build, but that we want to install diff --git a/packages/databases/mysql/scripts/54_mysql b/packages/databases/mysql/scripts/54_mysql new file mode 100644 index 0000000000..214c92ff6a --- /dev/null +++ b/packages/databases/mysql/scripts/54_mysql @@ -0,0 +1,43 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +# start MySql Server +# +# runlevels: openelec, textmode + +( + + progress "Starting MySql server" + + if [ ! -f /storage/.mysql/data ] + then + mkdir -p /storage/.mysql + mkdir -p /storage/.mysql/data + + mysql_install_db --user=root --datadir=/storage/.mysql/data > /dev/null 2>&1 + (mysqld --user=root --datadir=/storage/.mysql/data > /dev/null 2>&1)& + mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'openelec' WITH GRANT OPTION;" > /dev/null 2>&1 + mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'openelec' WITH GRANT OPTION;" > /dev/null 2>&1 + killall mysqld + fi + + mysqld --user=root --datadir=/storage/.mysql/data > /dev/null 2>&1 +)& + From ff1e176cc7e2eb45e6071a44248d0811cd03e1d8 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 31 Jul 2013 23:04:37 +0200 Subject: [PATCH 051/103] ncurses: install headers to $SYSROOT_PREFIX Signed-off-by: Stephan Raue --- packages/devel/ncurses/build | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/devel/ncurses/build b/packages/devel/ncurses/build index 033b60b2f8..0521eb0534 100755 --- a/packages/devel/ncurses/build +++ b/packages/devel/ncurses/build @@ -37,6 +37,7 @@ make -C progs tic cp progs/tic $ROOT/$TOOLCHAIN/bin cp lib/*.so* $ROOT/$TOOLCHAIN/lib +make -C include install cd "$CWD" From a8e12d52fd49cf5aaa2320c0fd2a2b01c355551a Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 00:26:45 +0200 Subject: [PATCH 052/103] Revert "samba: depends on avahi" This reverts commit 861a71ca8b7372135610da01777c2d15c5b9ec18. --- packages/network/samba/meta | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/network/samba/meta b/packages/network/samba/meta index e7afd3ed92..01187673f8 100644 --- a/packages/network/samba/meta +++ b/packages/network/samba/meta @@ -25,8 +25,8 @@ PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.samba.org" PKG_URL="http://samba.org/samba/ftp/stable/$PKG_NAME-$PKG_VERSION.tar.gz" -PKG_DEPENDS="zlib connman avahi" -PKG_BUILD_DEPENDS="toolchain zlib attr avahi" +PKG_DEPENDS="zlib connman" +PKG_BUILD_DEPENDS="toolchain zlib attr" PKG_PRIORITY="optional" PKG_SECTION="network" PKG_SHORTDESC="samba: The free SMB / CIFS fileserver and client" From 8a13ef7efd3153317489ea2bdbadb261e2febe80 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 02:46:22 +0200 Subject: [PATCH 053/103] samba: update to samba-3.6.16 Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc/package.mk | 2 +- packages/network/samba/build | 2 ++ .../samba/patches/samba-110-multicall.patch | 25 +++++++++++-------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/packages/mediacenter/xbmc/package.mk b/packages/mediacenter/xbmc/package.mk index 3c1b50713f..eae61d8fa0 100644 --- a/packages/mediacenter/xbmc/package.mk +++ b/packages/mediacenter/xbmc/package.mk @@ -258,7 +258,7 @@ if [ "$SAMBA_SUPPORT" = yes ]; then PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET samba" PKG_DEPENDS="$PKG_DEPENDS samba" XBMC_SAMBA="--enable-samba" - XBMC_LIBS="$XBMC_LIBS -ltalloc -ltdb -lwbclient" + XBMC_LIBS="$XBMC_LIBS -ltalloc -ltdb -ltevent -lwbclient" else XBMC_SAMBA="--disable-samba" fi diff --git a/packages/network/samba/build b/packages/network/samba/build index b9a89077ec..18257a9381 100755 --- a/packages/network/samba/build +++ b/packages/network/samba/build @@ -116,6 +116,7 @@ samba_cv_have_setresuid=yes \ --without-acl-support \ --without-aio-support \ --with-sendfile-support \ + --without-libtevent \ --without-wbclient \ --without-winbind \ --with-included-popt \ @@ -126,6 +127,7 @@ samba_cv_have_setresuid=yes \ make bin/libtalloc.a make bin/libwbclient.a make bin/libtdb.a +make bin/libtevent.a make bin/libsmbclient.a if [ "$SAMBA_SERVER" = "yes" ]; then diff --git a/packages/network/samba/patches/samba-110-multicall.patch b/packages/network/samba/patches/samba-110-multicall.patch index e667f06a69..e4681a2e85 100644 --- a/packages/network/samba/patches/samba-110-multicall.patch +++ b/packages/network/samba/patches/samba-110-multicall.patch @@ -1,6 +1,7 @@ ---- a/source3/Makefile.in -+++ b/source3/Makefile.in -@@ -73,20 +73,20 @@ LDAP_LIBS=@LDAP_LIBS@ +diff -Naur samba-3.6.16/source3/Makefile.in samba-3.6.16.patch/source3/Makefile.in +--- samba-3.6.16/source3/Makefile.in 2013-06-19 09:35:24.000000000 +0200 ++++ samba-3.6.16.patch/source3/Makefile.in 2013-08-01 01:53:43.264428180 +0200 +@@ -73,22 +73,22 @@ NSCD_LIBS=@NSCD_LIBS@ UUID_LIBS=@UUID_LIBS@ LIBWBCLIENT=@LIBWBCLIENT_STATIC@ @LIBWBCLIENT_SHARED@ @@ -14,6 +15,9 @@ LIBTALLOC=@LIBTALLOC_STATIC@ @LIBTALLOC_SHARED@ -LIBTALLOC_LIBS=@LIBTALLOC_LIBS@ +LIBTALLOC_LIBS=@LIBTALLOC_STATIC@ + LIBTEVENT=@LIBTEVENT_STATIC@ @LIBTEVENT_SHARED@ +-LIBTEVENT_LIBS=@LIBTEVENT_LIBS@ ++LIBTEVENT_LIBS=@LIBTEVENT_STATIC@ LIBREPLACE_LIBS=@LIBREPLACE_LIBS@ LIBTDB=@LIBTDB_STATIC@ @LIBTDB_SHARED@ -LIBTDB_LIBS=@LIBTDB_LIBS@ @@ -25,7 +29,7 @@ LIBSMBCLIENT_LIBS=@LIBSMBCLIENT_LIBS@ LIBSMBSHAREMODES_LIBS=@LIBSMBSHAREMODES_LIBS@ -@@ -214,7 +214,7 @@ PATH_FLAGS = -DSMB_PASSWD_FILE=\"$(SMB_P +@@ -216,7 +216,7 @@ # Note that all executable programs now provide for an optional executable suffix. @@ -34,7 +38,7 @@ BIN_PROGS1 = bin/smbclient@EXEEXT@ bin/net@EXEEXT@ bin/smbspool@EXEEXT@ \ bin/testparm@EXEEXT@ bin/smbstatus@EXEEXT@ bin/smbget@EXEEXT@ \ -@@ -1774,6 +1774,42 @@ bin/.dummy: +@@ -1777,6 +1777,42 @@ dir=bin $(MAKEDIR); fi @: >> $@ || : > $@ # what a fancy emoticon! @@ -66,19 +70,20 @@ + +MULTICALL_O = $(sort $(SMBD_MULTI_O) $(NMBD_MULTI_O) $(SMBPASSWD_MULTI_O) $(MULTI_O)) + -+bin/samba_multicall@EXEEXT@: $(BINARY_PREREQS) $(MULTICALL_O) $(LIBTALLOC) $(LIBTDB) $(LIBWBCLIENT) @BUILD_POPT@ ++bin/samba_multicall@EXEEXT@: $(BINARY_PREREQS) $(MULTICALL_O) $(LIBTALLOC) $(LIBTEVENT) $(LIBTDB) $(LIBWBCLIENT) @BUILD_POPT@ + @echo Linking $@ + @$(CC) -o $@ $(MULTICALL_O) $(LDFLAGS) $(LDAP_LIBS) @SMBD_FAM_LIBS@ \ + $(KRB5LIBS) $(DYNEXP) $(PRINT_LIBS) $(AUTH_LIBS) \ + $(ACL_LIBS) $(PASSDB_LIBS) $(LIBS) $(DNSSD_LIBS) $(AVAHI_LIBS) \ -+ $(POPT_LIBS) @SMBD_LIBS@ $(LIBTALLOC_LIBS) $(LIBTDB_LIBS) \ ++ $(POPT_LIBS) @SMBD_LIBS@ $(LIBTALLOC_LIBS) $(LIBTEVENT_LIBS) $(LIBTDB_LIBS) \ + $(LIBWBCLIENT_LIBS) $(ZLIB_LIBS) + - bin/smbd@EXEEXT@: $(BINARY_PREREQS) $(SMBD_OBJ) $(LIBTALLOC) $(LIBTDB) $(LIBWBCLIENT) @BUILD_POPT@ + bin/smbd@EXEEXT@: $(BINARY_PREREQS) $(SMBD_OBJ) $(LIBTALLOC) $(LIBTEVENT) $(LIBTDB) $(LIBWBCLIENT) @BUILD_POPT@ @echo Linking $@ @$(CC) -o $@ $(SMBD_OBJ) $(LDFLAGS) $(LDAP_LIBS) @SMBD_FAM_LIBS@ \ ---- /dev/null -+++ b/source3/multi.c +diff -Naur samba-3.6.16/source3/multi.c samba-3.6.16.patch/source3/multi.c +--- samba-3.6.16/source3/multi.c 1970-01-01 01:00:00.000000000 +0100 ++++ samba-3.6.16.patch/source3/multi.c 2013-08-01 01:24:51.794393962 +0200 @@ -0,0 +1,35 @@ +#include +#include From 38dedf388e8aac7149a22dd16f8ac2aba7d442ab Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 04:05:41 +0200 Subject: [PATCH 054/103] samba: convert to new package format Signed-off-by: Stephan Raue --- packages/network/samba/build | 144 -------------- packages/network/samba/install | 46 ----- packages/network/samba/meta | 41 ---- packages/network/samba/package.mk | 188 ++++++++++++++++++ .../samba/{init.d => scripts}/52_samba | 0 5 files changed, 188 insertions(+), 231 deletions(-) delete mode 100755 packages/network/samba/build delete mode 100755 packages/network/samba/install delete mode 100644 packages/network/samba/meta create mode 100644 packages/network/samba/package.mk rename packages/network/samba/{init.d => scripts}/52_samba (100%) diff --git a/packages/network/samba/build b/packages/network/samba/build deleted file mode 100755 index 18257a9381..0000000000 --- a/packages/network/samba/build +++ /dev/null @@ -1,144 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -if [ "$AVAHI_DAEMON" = yes ]; then - SMB_AVAHI="--enable-avahi" -else - SMB_AVAHI="--disable-avahi" -fi - -CFLAGS="$CFLAGS -fPIC -DPIC" - -cd $PKG_BUILD/source3 - -sh autogen.sh - -ac_cv_file__proc_sys_kernel_core_pattern=yes \ -libreplace_cv_HAVE_C99_VSNPRINTF=yes \ -libreplace_cv_HAVE_GETADDRINFO=yes \ -libreplace_cv_HAVE_IFACE_IFCONF=yes \ -LINUX_LFS_SUPPORT=yes \ -samba_cv_CC_NEGATIVE_ENUM_VALUES=yes \ -samba_cv_HAVE_GETTIMEOFDAY_TZ=yes \ -samba_cv_HAVE_IFACE_IFCONF=yes \ -samba_cv_HAVE_KERNEL_OPLOCKS_LINUX=yes \ -samba_cv_HAVE_SECURE_MKSTEMP=yes \ -samba_cv_HAVE_WRFILE_KEYTAB=no \ -samba_cv_USE_SETREUID=yes \ -samba_cv_USE_SETRESUID=yes \ -samba_cv_have_setreuid=yes \ -samba_cv_have_setresuid=yes \ -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --localstatedir=/var \ - --sysconfdir=/etc \ - --with-configdir=/etc/samba \ - --with-privatedir=/var/run \ - --with-codepagedir=/etc/samba \ - --with-lockdir=/var/lock \ - --with-logfilebase=/var/log \ - --with-nmbdsocketdir=/var/nmbd \ - --with-piddir=/var/run \ - --enable-shared \ - --disable-static \ - --disable-shared-libs \ - --disable-debug \ - --with-libiconv="$SYSROOT_PREFIX/usr" \ - --disable-krb5developer \ - --disable-picky-developer \ - --enable-largefile \ - --with-pthreads \ - --disable-socket-wrapper \ - --disable-nss-wrapper \ - --disable-swat \ - --disable-cups \ - --disable-iprint \ - --disable-pie \ - --disable-relro \ - --disable-fam \ - --disable-dnssd \ - $SMB_AVAHI \ - --disable-pthreadpool \ - --enable-gnutls \ - --disable-netapi \ - --disable-dmalloc \ - --with-fhs \ - --without-libtalloc \ - --disable-external-libtalloc \ - --without-libtdb \ - --disable-external-libtdb \ - --without-libnetapi \ - --with-libsmbclient \ - --without-libsmbsharemodes \ - --without-libaddns \ - --without-afs \ - --without-fake-kaserver \ - --without-vfs-afsacl \ - --without-dce-dfs \ - --without-ldap \ - --without-ads \ - --without-dnsupdate \ - --without-automount \ - --without-cifsmount \ - --without-cifsumount \ - --without-cifsupcall \ - --without-krb5 \ - --without-pam \ - --without-pam_smbpass \ - --without-nisplus-home \ - --with-syslog \ - --without-quotas \ - --without-sys-quotas \ - --without-utmp \ - --without-cluster-support \ - --without-acl-support \ - --without-aio-support \ - --with-sendfile-support \ - --without-libtevent \ - --without-wbclient \ - --without-winbind \ - --with-included-popt \ - --with-included-iniparser \ - --without-sqlite3 \ - --without-setproctitle \ - -make bin/libtalloc.a -make bin/libwbclient.a -make bin/libtdb.a -make bin/libtevent.a -make bin/libsmbclient.a - -if [ "$SAMBA_SERVER" = "yes" ]; then - make bin/samba_multicall -fi - -mkdir -p $SYSROOT_PREFIX/usr/lib - cp -P bin/*.a $SYSROOT_PREFIX/usr/lib - -mkdir -p $SYSROOT_PREFIX/usr/include - cp include/libsmbclient.h $SYSROOT_PREFIX/usr/include - -mkdir -p $SYSROOT_PREFIX/usr/lib/pkgconfig - cp pkgconfig/smbclient.pc $SYSROOT_PREFIX/usr/lib/pkgconfig diff --git a/packages/network/samba/install b/packages/network/samba/install deleted file mode 100755 index ca9d740cf9..0000000000 --- a/packages/network/samba/install +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -if [ "$SAMBA_SERVER" = "yes" ]; then - mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/source3/bin/samba_multicall $INSTALL/usr/bin - ln -sf samba_multicall $INSTALL/usr/bin/smbd - ln -sf samba_multicall $INSTALL/usr/bin/nmbd - ln -sf samba_multicall $INSTALL/usr/bin/smbpasswd - - mkdir -p $INSTALL/etc/samba - cp $PKG_BUILD/codepages/lowcase.dat $INSTALL/etc/samba - cp $PKG_BUILD/codepages/upcase.dat $INSTALL/etc/samba - cp $PKG_BUILD/codepages/valid.dat $INSTALL/etc/samba - - if [ -f $PROJECT_DIR/$PROJECT/config/smb.conf ]; then - mkdir -p $INSTALL/etc/samba - cp $PROJECT_DIR/$PROJECT/config/smb.conf $INSTALL/etc/samba - else - mkdir -p $INSTALL/etc/samba - cp $PKG_DIR/config/smb.conf $INSTALL/etc/samba - mkdir -p $INSTALL/usr/config - cp $PKG_DIR/config/smb.conf $INSTALL/usr/config/samba.conf.sample - fi -fi diff --git a/packages/network/samba/meta b/packages/network/samba/meta deleted file mode 100644 index 01187673f8..0000000000 --- a/packages/network/samba/meta +++ /dev/null @@ -1,41 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="samba" -PKG_VERSION="3.6.15" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://www.samba.org" -PKG_URL="http://samba.org/samba/ftp/stable/$PKG_NAME-$PKG_VERSION.tar.gz" -PKG_DEPENDS="zlib connman" -PKG_BUILD_DEPENDS="toolchain zlib attr" -PKG_PRIORITY="optional" -PKG_SECTION="network" -PKG_SHORTDESC="samba: The free SMB / CIFS fileserver and client" -PKG_LONGDESC="Samba is a SMB server that runs on Unix and other operating systems. It allows these operating systems (currently Unix, Netware, OS/2 and AmigaDOS) to act as a file and print server for SMB and CIFS clients. There are many Lan-Manager compatible clients such as LanManager for DOS, Windows for Workgroups, Windows NT, Windows 95, Linux smbfs, OS/2, Pathworks and more." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="no" - -if [ "$AVAHI_DAEMON" = yes ]; then - PKG_DEPENDS="$PKG_DEPENDS avahi" - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS avahi" -fi diff --git a/packages/network/samba/package.mk b/packages/network/samba/package.mk new file mode 100644 index 0000000000..95d22882da --- /dev/null +++ b/packages/network/samba/package.mk @@ -0,0 +1,188 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="samba" +PKG_VERSION="3.6.16" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://www.samba.org" +PKG_URL="http://samba.org/samba/ftp/stable/$PKG_NAME-$PKG_VERSION.tar.gz" +PKG_DEPENDS="zlib connman" +PKG_BUILD_DEPENDS_TARGET="toolchain zlib attr" +PKG_PRIORITY="optional" +PKG_SECTION="network" +PKG_SHORTDESC="samba: The free SMB / CIFS fileserver and client" +PKG_LONGDESC="Samba is a SMB server that runs on Unix and other operating systems. It allows these operating systems (currently Unix, Netware, OS/2 and AmigaDOS) to act as a file and print server for SMB and CIFS clients. There are many Lan-Manager compatible clients such as LanManager for DOS, Windows for Workgroups, Windows NT, Windows 95, Linux smbfs, OS/2, Pathworks and more." + +PKG_IS_ADDON="no" +PKG_AUTORECONF="no" + +if [ "$AVAHI_DAEMON" = yes ]; then + PKG_DEPENDS="$PKG_DEPENDS avahi" + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET avahi" + SMB_AVAHI="--enable-avahi" +else + SMB_AVAHI="--disable-avahi" +fi + +PKG_CONFIGURE_SCRIPT="source3/configure" +PKG_CONFIGURE_OPTS_TARGET="ac_cv_file__proc_sys_kernel_core_pattern=yes \ + libreplace_cv_HAVE_C99_VSNPRINTF=yes \ + libreplace_cv_HAVE_GETADDRINFO=yes \ + libreplace_cv_HAVE_IFACE_IFCONF=yes \ + LINUX_LFS_SUPPORT=yes \ + samba_cv_CC_NEGATIVE_ENUM_VALUES=yes \ + samba_cv_HAVE_GETTIMEOFDAY_TZ=yes \ + samba_cv_HAVE_IFACE_IFCONF=yes \ + samba_cv_HAVE_KERNEL_OPLOCKS_LINUX=yes \ + samba_cv_HAVE_SECURE_MKSTEMP=yes \ + samba_cv_HAVE_WRFILE_KEYTAB=no \ + samba_cv_USE_SETREUID=yes \ + samba_cv_USE_SETRESUID=yes \ + samba_cv_have_setreuid=yes \ + samba_cv_have_setresuid=yes \ + --with-configdir=/etc/samba \ + --with-privatedir=/var/run \ + --with-codepagedir=/etc/samba \ + --with-lockdir=/var/lock \ + --with-logfilebase=/var/log \ + --with-nmbdsocketdir=/var/nmbd \ + --with-piddir=/var/run \ + --disable-shared-libs \ + --disable-debug \ + --with-libiconv="$SYSROOT_PREFIX/usr" \ + --disable-krb5developer \ + --disable-picky-developer \ + --enable-largefile \ + --with-pthreads \ + --disable-socket-wrapper \ + --disable-nss-wrapper \ + --disable-swat \ + --disable-cups \ + --disable-iprint \ + --disable-pie \ + --disable-relro \ + --disable-fam \ + --disable-dnssd \ + $SMB_AVAHI \ + --disable-pthreadpool \ + --enable-gnutls \ + --disable-netapi \ + --disable-dmalloc \ + --with-fhs \ + --without-libtalloc \ + --disable-external-libtalloc \ + --without-libtdb \ + --disable-external-libtdb \ + --without-libnetapi \ + --with-libsmbclient \ + --without-libsmbsharemodes \ + --without-libaddns \ + --without-afs \ + --without-fake-kaserver \ + --without-vfs-afsacl \ + --without-dce-dfs \ + --without-ldap \ + --without-ads \ + --without-dnsupdate \ + --without-automount \ + --without-cifsmount \ + --without-cifsumount \ + --without-cifsupcall \ + --without-krb5 \ + --without-pam \ + --without-pam_smbpass \ + --without-nisplus-home \ + --with-syslog \ + --without-quotas \ + --without-sys-quotas \ + --without-utmp \ + --without-cluster-support \ + --without-acl-support \ + --without-aio-support \ + --with-sendfile-support \ + --without-libtevent \ + --without-wbclient \ + --without-winbind \ + --with-included-popt \ + --with-included-iniparser \ + --without-sqlite3 \ + --without-setproctitle" + +pre_configure_target() { + ( cd ../source3 + sh autogen.sh + ) + + CFLAGS="$CFLAGS -fPIC -DPIC" +} + +make_target() { + make bin/libtalloc.a + make bin/libwbclient.a + make bin/libtdb.a + make bin/libtevent.a + make bin/libsmbclient.a + + if [ "$SAMBA_SERVER" = "yes" ]; then + make bin/samba_multicall + fi +} + +post_make_target() { + mkdir -p $SYSROOT_PREFIX/usr/lib + cp -P bin/*.a $SYSROOT_PREFIX/usr/lib + + mkdir -p $SYSROOT_PREFIX/usr/include + cp ../source3/include/libsmbclient.h $SYSROOT_PREFIX/usr/include + + mkdir -p $SYSROOT_PREFIX/usr/lib/pkgconfig + cp pkgconfig/smbclient.pc $SYSROOT_PREFIX/usr/lib/pkgconfig +} + +makeinstall_target() { + if [ "$SAMBA_SERVER" = "yes" ]; then + mkdir -p $INSTALL/usr/bin + cp bin/samba_multicall $INSTALL/usr/bin + ln -sf samba_multicall $INSTALL/usr/bin/smbd + ln -sf samba_multicall $INSTALL/usr/bin/nmbd + ln -sf samba_multicall $INSTALL/usr/bin/smbpasswd + + mkdir -p $INSTALL/etc/samba + cp ../codepages/lowcase.dat $INSTALL/etc/samba + cp ../codepages/upcase.dat $INSTALL/etc/samba + cp ../codepages/valid.dat $INSTALL/etc/samba + + mkdir -p $INSTALL/etc/init.d + cp $PKG_DIR/scripts/52_samba $INSTALL/etc/init.d + + if [ -f $PROJECT_DIR/$PROJECT/config/smb.conf ]; then + mkdir -p $INSTALL/etc/samba + cp $PROJECT_DIR/$PROJECT/config/smb.conf $INSTALL/etc/samba + else + mkdir -p $INSTALL/etc/samba + cp $PKG_DIR/config/smb.conf $INSTALL/etc/samba + mkdir -p $INSTALL/usr/config + cp $PKG_DIR/config/smb.conf $INSTALL/usr/config/samba.conf.sample + fi + fi +} + diff --git a/packages/network/samba/init.d/52_samba b/packages/network/samba/scripts/52_samba similarity index 100% rename from packages/network/samba/init.d/52_samba rename to packages/network/samba/scripts/52_samba From d9c7489275d7d43cc543042acb22cd064949af1f Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 12:53:33 +0200 Subject: [PATCH 055/103] setxkbmap: convert to new package format Signed-off-by: Stephan Raue --- packages/x11/app/setxkbmap/build | 31 ------------------- packages/x11/app/setxkbmap/install | 29 ----------------- .../x11/app/setxkbmap/{meta => package.mk} | 9 ++++-- 3 files changed, 7 insertions(+), 62 deletions(-) delete mode 100755 packages/x11/app/setxkbmap/build delete mode 100755 packages/x11/app/setxkbmap/install rename packages/x11/app/setxkbmap/{meta => package.mk} (90%) diff --git a/packages/x11/app/setxkbmap/build b/packages/x11/app/setxkbmap/build deleted file mode 100755 index 269461ec26..0000000000 --- a/packages/x11/app/setxkbmap/build +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - -make diff --git a/packages/x11/app/setxkbmap/install b/packages/x11/app/setxkbmap/install deleted file mode 100755 index 16941ff820..0000000000 --- a/packages/x11/app/setxkbmap/install +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/$1 $INSTALL/usr/bin - -mkdir -p $INSTALL/lib/udev - cp $PKG_DIR/scripts/xkb-setup $INSTALL/lib/udev diff --git a/packages/x11/app/setxkbmap/meta b/packages/x11/app/setxkbmap/package.mk similarity index 90% rename from packages/x11/app/setxkbmap/meta rename to packages/x11/app/setxkbmap/package.mk index fd3e84a9ab..b4756225fd 100644 --- a/packages/x11/app/setxkbmap/meta +++ b/packages/x11/app/setxkbmap/package.mk @@ -26,11 +26,16 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/app/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="libX11" -PKG_BUILD_DEPENDS="toolchain libX11" +PKG_BUILD_DEPENDS_TARGET="toolchain libX11" PKG_PRIORITY="optional" PKG_SECTION="x11/app" PKG_SHORTDESC="setxkbmap: Sets the keyboard using the X Keyboard Extension" PKG_LONGDESC="Setxkbmap sets the keyboard using the X Keyboard Extension." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +post_makeinstall_target() { + mkdir -p $INSTALL/lib/udev + cp $PKG_DIR/scripts/xkb-setup $INSTALL/lib/udev +} From d86149954cfff46d8b99068f191b04cd2c2f269e Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 12:58:44 +0200 Subject: [PATCH 056/103] xkbcomp: convert to new package format Signed-off-by: Stephan Raue --- packages/x11/app/xkbcomp/build | 33 ------------------- packages/x11/app/xkbcomp/install | 27 --------------- packages/x11/app/xkbcomp/{meta => package.mk} | 7 ++-- 3 files changed, 5 insertions(+), 62 deletions(-) delete mode 100755 packages/x11/app/xkbcomp/build delete mode 100755 packages/x11/app/xkbcomp/install rename packages/x11/app/xkbcomp/{meta => package.mk} (92%) diff --git a/packages/x11/app/xkbcomp/build b/packages/x11/app/xkbcomp/build deleted file mode 100755 index a6bde88fc4..0000000000 --- a/packages/x11/app/xkbcomp/build +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD - -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --with-xkb-config-root=$XORG_PATH_XKB \ - -make diff --git a/packages/x11/app/xkbcomp/install b/packages/x11/app/xkbcomp/install deleted file mode 100755 index 6a5aaf3171..0000000000 --- a/packages/x11/app/xkbcomp/install +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/$1 $INSTALL/usr/bin - diff --git a/packages/x11/app/xkbcomp/meta b/packages/x11/app/xkbcomp/package.mk similarity index 92% rename from packages/x11/app/xkbcomp/meta rename to packages/x11/app/xkbcomp/package.mk index 3f4efdc2fe..7d32d6eee7 100644 --- a/packages/x11/app/xkbcomp/meta +++ b/packages/x11/app/xkbcomp/package.mk @@ -26,11 +26,14 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/app/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="libX11" -PKG_BUILD_DEPENDS="toolchain util-macros libX11" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros libX11" PKG_PRIORITY="optional" PKG_SECTION="x11/app" PKG_SHORTDESC="xkbcomp: Compiles XKB keyboard description" PKG_LONGDESC="The xkbcomp keymap compiler converts a description of an XKB keymap into one of several output formats." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--with-xkb-config-root=$XORG_PATH_XKB" + From 400378c4c615bcc7e5beb8316b1cbcd172920cf7 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 14:02:00 +0200 Subject: [PATCH 057/103] encodings: change to new package format Signed-off-by: Stephan Raue --- packages/x11/font/encodings/build | 35 ------------------- packages/x11/font/encodings/install | 33 ----------------- .../x11/font/encodings/{meta => package.mk} | 8 +++-- 3 files changed, 6 insertions(+), 70 deletions(-) delete mode 100755 packages/x11/font/encodings/build delete mode 100755 packages/x11/font/encodings/install rename packages/x11/font/encodings/{meta => package.mk} (85%) diff --git a/packages/x11/font/encodings/build b/packages/x11/font/encodings/build deleted file mode 100755 index 770f4a7f0d..0000000000 --- a/packages/x11/font/encodings/build +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --enable-gzip-small-encodings \ - --enable-gzip-large-encodings \ - --with-fontrootdir=/usr/share/fonts - -make diff --git a/packages/x11/font/encodings/install b/packages/x11/font/encodings/install deleted file mode 100755 index 5d6f18ce2d..0000000000 --- a/packages/x11/font/encodings/install +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -FONTDIR="$INSTALL/usr/share/fonts" - -mkdir -p $FONTDIR/encodings - cp $PKG_BUILD/*.enc.gz $FONTDIR/encodings - cp $PKG_BUILD/encodings.dir $FONTDIR/encodings - -mkdir -p $FONTDIR/encodings/large - cp $PKG_BUILD/large/*.enc.gz $FONTDIR/encodings/large - cp $PKG_BUILD/large/encodings.dir $FONTDIR/encodings/large diff --git a/packages/x11/font/encodings/meta b/packages/x11/font/encodings/package.mk similarity index 85% rename from packages/x11/font/encodings/meta rename to packages/x11/font/encodings/package.mk index d0c5628737..b7e8968a03 100644 --- a/packages/x11/font/encodings/meta +++ b/packages/x11/font/encodings/package.mk @@ -26,11 +26,15 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/font/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain util-macros font-util-host" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros font-util-host" PKG_PRIORITY="optional" PKG_SECTION="x11/font" PKG_SHORTDESC="encodings: X font encodings" PKG_LONGDESC="X font encoding meta files." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--enable-gzip-small-encodings \ + --enable-gzip-large-encodings \ + --with-fontrootdir=/usr/share/fonts" From 67e157ee3cb6c4405a28419494465025f6b81549 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 14:02:15 +0200 Subject: [PATCH 058/103] font-bitstream-type1: change to new package format Signed-off-by: Stephan Raue --- packages/x11/font/font-bitstream-type1/build | 33 ------------------- .../x11/font/font-bitstream-type1/install | 32 ------------------ .../font-bitstream-type1/{meta => package.mk} | 6 ++-- 3 files changed, 4 insertions(+), 67 deletions(-) delete mode 100755 packages/x11/font/font-bitstream-type1/build delete mode 100755 packages/x11/font/font-bitstream-type1/install rename packages/x11/font/font-bitstream-type1/{meta => package.mk} (92%) diff --git a/packages/x11/font/font-bitstream-type1/build b/packages/x11/font/font-bitstream-type1/build deleted file mode 100755 index d0dafa63bf..0000000000 --- a/packages/x11/font/font-bitstream-type1/build +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --with-fontrootdir=/usr/share/fonts - -make diff --git a/packages/x11/font/font-bitstream-type1/install b/packages/x11/font/font-bitstream-type1/install deleted file mode 100755 index 8b65c62422..0000000000 --- a/packages/x11/font/font-bitstream-type1/install +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -FONTDIR="$INSTALL/usr/share/fonts/Type1" - -mkdir -p $FONTDIR - cp $PKG_BUILD/*.afm $FONTDIR - cp $PKG_BUILD/*.pfb $FONTDIR - -mkfontdir $FONTDIR -mkfontscale $FONTDIR diff --git a/packages/x11/font/font-bitstream-type1/meta b/packages/x11/font/font-bitstream-type1/package.mk similarity index 92% rename from packages/x11/font/font-bitstream-type1/meta rename to packages/x11/font/font-bitstream-type1/package.mk index 0be842e8bf..62b975e8ef 100644 --- a/packages/x11/font/font-bitstream-type1/meta +++ b/packages/x11/font/font-bitstream-type1/package.mk @@ -26,11 +26,13 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/font/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain util-macros" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros" PKG_PRIORITY="optional" PKG_SECTION="x11/font" PKG_SHORTDESC="font-bitstream-type1: Bitstream font family" PKG_LONGDESC="Bitstream font family." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts" From 770957697b3b39b428d068182e8d6ff581583750 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 14:02:31 +0200 Subject: [PATCH 059/103] font-cursor-misc: change to new package format Signed-off-by: Stephan Raue --- packages/x11/font/font-cursor-misc/build | 33 ------------------- packages/x11/font/font-cursor-misc/install | 30 ----------------- .../font-cursor-misc/{meta => package.mk} | 6 ++-- 3 files changed, 4 insertions(+), 65 deletions(-) delete mode 100755 packages/x11/font/font-cursor-misc/build delete mode 100755 packages/x11/font/font-cursor-misc/install rename packages/x11/font/font-cursor-misc/{meta => package.mk} (91%) diff --git a/packages/x11/font/font-cursor-misc/build b/packages/x11/font/font-cursor-misc/build deleted file mode 100755 index d0dafa63bf..0000000000 --- a/packages/x11/font/font-cursor-misc/build +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --with-fontrootdir=/usr/share/fonts - -make diff --git a/packages/x11/font/font-cursor-misc/install b/packages/x11/font/font-cursor-misc/install deleted file mode 100755 index 5ac5161722..0000000000 --- a/packages/x11/font/font-cursor-misc/install +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -FONTDIR="$INSTALL/usr/share/fonts/misc" - -mkdir -p $FONTDIR - cp $PKG_BUILD/*.pcf.gz $FONTDIR - -mkfontdir $FONTDIR diff --git a/packages/x11/font/font-cursor-misc/meta b/packages/x11/font/font-cursor-misc/package.mk similarity index 91% rename from packages/x11/font/font-cursor-misc/meta rename to packages/x11/font/font-cursor-misc/package.mk index 0b9e84fcb6..b17506d055 100644 --- a/packages/x11/font/font-cursor-misc/meta +++ b/packages/x11/font/font-cursor-misc/package.mk @@ -26,11 +26,13 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/font/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="font-util-host" -PKG_BUILD_DEPENDS="toolchain util-macros font-util-host" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros font-util-host" PKG_PRIORITY="optional" PKG_SECTION="x11/font" PKG_SHORTDESC="font-cursor-misc: X11 cursor fonts" PKG_LONGDESC="X11 cursor fonts." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts" From 2f8d91382f51519d77d7c419458cb19192f05ca1 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 14:02:47 +0200 Subject: [PATCH 060/103] font-misc-misc: change to new package format Signed-off-by: Stephan Raue --- packages/x11/font/font-misc-misc/build | 52 ------------------- .../font/font-misc-misc/config/fonts.alias | 1 - packages/x11/font/font-misc-misc/install | 30 ----------- .../font/font-misc-misc/{meta => package.mk} | 33 +++++++++++- 4 files changed, 31 insertions(+), 85 deletions(-) delete mode 100755 packages/x11/font/font-misc-misc/build delete mode 100644 packages/x11/font/font-misc-misc/config/fonts.alias delete mode 100755 packages/x11/font/font-misc-misc/install rename packages/x11/font/font-misc-misc/{meta => package.mk} (53%) diff --git a/packages/x11/font/font-misc-misc/build b/packages/x11/font/font-misc-misc/build deleted file mode 100755 index 85e3b3c071..0000000000 --- a/packages/x11/font/font-misc-misc/build +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --with-fontrootdir=/usr/share/fonts \ - --disable-silent-rules \ - --enable-iso8859-1 \ - --enable-iso8859-2 \ - --disable-iso8859-3 \ - --disable-iso8859-4 \ - --enable-iso8859-5 \ - --disable-iso8859-6 \ - --enable-iso8859-7 \ - --enable-iso8859-8 \ - --enable-iso8859-9 \ - --disable-iso8859-10 \ - --disable-iso8859-11 \ - --disable-iso8859-12 \ - --disable-iso8859-13 \ - --enable-iso8859-14 \ - --enable-iso8859-15 \ - --disable-iso8859-16 \ - --disable-koi8-r \ - --disable-jisx0201 \ - -make UTIL_DIR="$SYSROOT_PREFIX/usr/share/fonts/util/" diff --git a/packages/x11/font/font-misc-misc/config/fonts.alias b/packages/x11/font/font-misc-misc/config/fonts.alias deleted file mode 100644 index fd8becb875..0000000000 --- a/packages/x11/font/font-misc-misc/config/fonts.alias +++ /dev/null @@ -1 +0,0 @@ -fixed -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso8859-1 diff --git a/packages/x11/font/font-misc-misc/install b/packages/x11/font/font-misc-misc/install deleted file mode 100755 index 1a9a38a7f4..0000000000 --- a/packages/x11/font/font-misc-misc/install +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -FONTDIR="$INSTALL/usr/share/fonts/misc" - -mkdir -p $FONTDIR - cp $PKG_BUILD/6x13-ISO8859-1.pcf.gz $FONTDIR - -mkfontdir $FONTDIR diff --git a/packages/x11/font/font-misc-misc/meta b/packages/x11/font/font-misc-misc/package.mk similarity index 53% rename from packages/x11/font/font-misc-misc/meta rename to packages/x11/font/font-misc-misc/package.mk index 7d07e28f1c..e7672d112b 100644 --- a/packages/x11/font/font-misc-misc/meta +++ b/packages/x11/font/font-misc-misc/package.mk @@ -26,11 +26,40 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/font/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="font-util font-cursor-misc" -PKG_BUILD_DEPENDS="toolchain util-macros font-util font-cursor-misc" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros font-util font-cursor-misc" PKG_PRIORITY="optional" PKG_SECTION="x11/font" PKG_SHORTDESC="font-misc-misc: A misc. public domain font" PKG_LONGDESC="A misc. public domain font." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts \ + --disable-silent-rules \ + --enable-iso8859-1 \ + --enable-iso8859-2 \ + --disable-iso8859-3 \ + --disable-iso8859-4 \ + --enable-iso8859-5 \ + --disable-iso8859-6 \ + --enable-iso8859-7 \ + --enable-iso8859-8 \ + --enable-iso8859-9 \ + --disable-iso8859-10 \ + --disable-iso8859-11 \ + --disable-iso8859-12 \ + --disable-iso8859-13 \ + --enable-iso8859-14 \ + --enable-iso8859-15 \ + --disable-iso8859-16 \ + --disable-koi8-r \ + --disable-jisx0201" + +PKG_MAKE_OPTS_TARGET="UTIL_DIR=$SYSROOT_PREFIX/usr/share/fonts/util/" + +makeinstall_target() { + mkdir -p $INSTALL/usr/share/fonts/misc + cp 6x13-ISO8859-1.pcf.gz $INSTALL/usr/share/fonts/misc + mkfontdir $INSTALL/usr/share/fonts/misc +} From 0e45138d9c2a281d5595d5c8bdebdcc2dcb27763 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 14:06:55 +0200 Subject: [PATCH 061/103] font-util: change to new package format Signed-off-by: Stephan Raue --- packages/x11/font/encodings/package.mk | 2 +- packages/x11/font/font-cursor-misc/package.mk | 4 +- packages/x11/font/font-util-host/build | 38 ------------------- packages/x11/font/font-util-host/meta | 36 ------------------ packages/x11/font/font-util/build | 34 ----------------- packages/x11/font/font-util/install | 26 ------------- .../x11/font/font-util/{meta => package.mk} | 11 +++++- 7 files changed, 12 insertions(+), 139 deletions(-) delete mode 100755 packages/x11/font/font-util-host/build delete mode 100644 packages/x11/font/font-util-host/meta delete mode 100755 packages/x11/font/font-util/build delete mode 100755 packages/x11/font/font-util/install rename packages/x11/font/font-util/{meta => package.mk} (86%) diff --git a/packages/x11/font/encodings/package.mk b/packages/x11/font/encodings/package.mk index b7e8968a03..0daf8931dd 100644 --- a/packages/x11/font/encodings/package.mk +++ b/packages/x11/font/encodings/package.mk @@ -26,7 +26,7 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/font/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="" -PKG_BUILD_DEPENDS_TARGET="toolchain util-macros font-util-host" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros font-util:host" PKG_PRIORITY="optional" PKG_SECTION="x11/font" PKG_SHORTDESC="encodings: X font encodings" diff --git a/packages/x11/font/font-cursor-misc/package.mk b/packages/x11/font/font-cursor-misc/package.mk index b17506d055..add3d47499 100644 --- a/packages/x11/font/font-cursor-misc/package.mk +++ b/packages/x11/font/font-cursor-misc/package.mk @@ -25,8 +25,8 @@ PKG_ARCH="any" PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/font/$PKG_NAME-$PKG_VERSION.tar.bz2" -PKG_DEPENDS="font-util-host" -PKG_BUILD_DEPENDS_TARGET="toolchain util-macros font-util-host" +PKG_DEPENDS="" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros font-util:host" PKG_PRIORITY="optional" PKG_SECTION="x11/font" PKG_SHORTDESC="font-cursor-misc: X11 cursor fonts" diff --git a/packages/x11/font/font-util-host/build b/packages/x11/font/font-util-host/build deleted file mode 100755 index cc5d8b058d..0000000000 --- a/packages/x11/font/font-util-host/build +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -$SCRIPTS/unpack font-util - -FONT_UTIL_DIR=`ls -d $BUILD/font-util-[0-9]*` - -setup_toolchain host - -cd $FONT_UTIL_DIR -mkdir -p .objdir-host && cd .objdir-host -../configure --host=$HOST_NAME \ - --build=$HOST_NAME \ - --prefix=$ROOT/$TOOLCHAIN - -make -make install diff --git a/packages/x11/font/font-util-host/meta b/packages/x11/font/font-util-host/meta deleted file mode 100644 index dfda44170f..0000000000 --- a/packages/x11/font/font-util-host/meta +++ /dev/null @@ -1,36 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="font-util-host" -PKG_VERSION="" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="OSS" -PKG_SITE="http://www.X.org" -PKG_URL="" -PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain util-macros" -PKG_PRIORITY="optional" -PKG_SECTION="x11/font" -PKG_SHORTDESC="font-util: X.org font utilities" -PKG_LONGDESC="X.org font utilities." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="no" diff --git a/packages/x11/font/font-util/build b/packages/x11/font/font-util/build deleted file mode 100755 index 76393a3816..0000000000 --- a/packages/x11/font/font-util/build +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -mkdir -p .objdir-target && cd .objdir-target - -../configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --with-mapdir=/usr/share/fonts/util - -make -$MAKEINSTALL diff --git a/packages/x11/font/font-util/install b/packages/x11/font/font-util/install deleted file mode 100755 index 06fdba6ace..0000000000 --- a/packages/x11/font/font-util/install +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/share/fonts/util - cp $PKG_BUILD/map-* $INSTALL/usr/share/fonts/util diff --git a/packages/x11/font/font-util/meta b/packages/x11/font/font-util/package.mk similarity index 86% rename from packages/x11/font/font-util/meta rename to packages/x11/font/font-util/package.mk index 8f2a7d8667..7137ef6cdf 100644 --- a/packages/x11/font/font-util/meta +++ b/packages/x11/font/font-util/package.mk @@ -26,11 +26,18 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/archive/individual/font/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain util-macros" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros" +PKG_BUILD_DEPENDS_HOST="toolchain util-macros" PKG_PRIORITY="optional" PKG_SECTION="x11/font" PKG_SHORTDESC="font-util: X.org font utilities" PKG_LONGDESC="X.org font utilities." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--with-mapdir=/usr/share/fonts/util" + +post_makeinstall_target() { + rm -rf $INSTALL/usr/bin +} From 32263d4230b85d9aea03de807ef560bf6304cbae Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 14:38:20 +0200 Subject: [PATCH 062/103] font-xfree86-type1: change to new package format Signed-off-by: Stephan Raue --- packages/x11/font/font-xfree86-type1/build | 33 ------------------- packages/x11/font/font-xfree86-type1/install | 31 ----------------- .../font-xfree86-type1/{meta => package.mk} | 11 +++++-- 3 files changed, 9 insertions(+), 66 deletions(-) delete mode 100755 packages/x11/font/font-xfree86-type1/build delete mode 100755 packages/x11/font/font-xfree86-type1/install rename packages/x11/font/font-xfree86-type1/{meta => package.mk} (86%) diff --git a/packages/x11/font/font-xfree86-type1/build b/packages/x11/font/font-xfree86-type1/build deleted file mode 100755 index 49061ad3ca..0000000000 --- a/packages/x11/font/font-xfree86-type1/build +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --with-fontrootdir=/usr/share/fonts - -make \ No newline at end of file diff --git a/packages/x11/font/font-xfree86-type1/install b/packages/x11/font/font-xfree86-type1/install deleted file mode 100755 index a4ddededa1..0000000000 --- a/packages/x11/font/font-xfree86-type1/install +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -FONTDIR="$INSTALL/usr/share/fonts/Type1" - -mkdir -p $FONTDIR - cp $PKG_BUILD/cursor.pfa $FONTDIR - -mkfontdir $FONTDIR -mkfontscale $FONTDIR diff --git a/packages/x11/font/font-xfree86-type1/meta b/packages/x11/font/font-xfree86-type1/package.mk similarity index 86% rename from packages/x11/font/font-xfree86-type1/meta rename to packages/x11/font/font-xfree86-type1/package.mk index d1ca38e8b8..81cf66191b 100644 --- a/packages/x11/font/font-xfree86-type1/meta +++ b/packages/x11/font/font-xfree86-type1/package.mk @@ -26,11 +26,18 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.X.org" PKG_URL="http://xorg.freedesktop.org/releases/individual/font/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain util-macros" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros" PKG_PRIORITY="optional" PKG_SECTION="x11/font" PKG_SHORTDESC="font-xfree86-type1: A Xfree86 Inc. Type1 font" PKG_LONGDESC="A Xfree86 Inc. Type1 font." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts" + +post_install() { + mkfontdir $INSTALL/usr/share/fonts/Type1 + mkfontscale $INSTALL/usr/share/fonts/Type1 +} From 7192eb76d8f737ade8176d7a2f5cf4dcb3b58d28 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 14:38:31 +0200 Subject: [PATCH 063/103] liberation-fonts-ttf: change to new package format Signed-off-by: Stephan Raue --- .../x11/font/liberation-fonts-ttf/install | 31 ------------------- .../liberation-fonts-ttf/{meta => package.mk} | 18 +++++++++-- 2 files changed, 16 insertions(+), 33 deletions(-) delete mode 100755 packages/x11/font/liberation-fonts-ttf/install rename packages/x11/font/liberation-fonts-ttf/{meta => package.mk} (82%) diff --git a/packages/x11/font/liberation-fonts-ttf/install b/packages/x11/font/liberation-fonts-ttf/install deleted file mode 100755 index e0a737419d..0000000000 --- a/packages/x11/font/liberation-fonts-ttf/install +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -FONTDIR="$INSTALL/usr/share/fonts/liberation" - -mkdir -p $FONTDIR - cp $PKG_BUILD/*.ttf $FONTDIR - -mkfontdir $FONTDIR -mkfontscale $FONTDIR diff --git a/packages/x11/font/liberation-fonts-ttf/meta b/packages/x11/font/liberation-fonts-ttf/package.mk similarity index 82% rename from packages/x11/font/liberation-fonts-ttf/meta rename to packages/x11/font/liberation-fonts-ttf/package.mk index 56831a571d..13d4e04823 100644 --- a/packages/x11/font/liberation-fonts-ttf/meta +++ b/packages/x11/font/liberation-fonts-ttf/package.mk @@ -26,11 +26,25 @@ PKG_LICENSE="OFL1_1" PKG_SITE="https://www.redhat.com/promo/fonts/" PKG_URL="https://fedorahosted.org/releases/l/i/liberation-fonts/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain util-macros" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros" PKG_PRIORITY="optional" PKG_SECTION="x11/fonts" PKG_SHORTDESC="liberation-fonts: High quality "open-sourced" vector fonts" PKG_LONGDESC="This packages included the high-quality and open-sourced TrueType vector fonts released by RedHat." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="no" + +make_target() { + : # nothing to make +} + +makeinstall_target() { + mkdir -p $INSTALL/usr/share/fonts/liberation + cp *.ttf $INSTALL/usr/share/fonts/liberation +} + +post_install() { + mkfontdir $INSTALL/usr/share/fonts/liberation + mkfontscale $INSTALL/usr/share/fonts/liberation +} From eea6864d087a6fb32dd040d50a54d6f6b88765a6 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 14:39:22 +0200 Subject: [PATCH 064/103] font-bitstream-type1: create fonts.dir and fonts.scale on install Signed-off-by: Stephan Raue --- packages/x11/font/font-bitstream-type1/package.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/x11/font/font-bitstream-type1/package.mk b/packages/x11/font/font-bitstream-type1/package.mk index 62b975e8ef..d08ea4b92b 100644 --- a/packages/x11/font/font-bitstream-type1/package.mk +++ b/packages/x11/font/font-bitstream-type1/package.mk @@ -36,3 +36,8 @@ PKG_IS_ADDON="no" PKG_AUTORECONF="yes" PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts" + +post_install() { + mkfontdir $INSTALL/usr/share/fonts/Type1 + mkfontscale $INSTALL/usr/share/fonts/Type1 +} From e6c44cdff9d74fba6b509844c4544446c691f632 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 14:39:37 +0200 Subject: [PATCH 065/103] font-cursor-misc: create fonts.dir and fonts.scale on install Signed-off-by: Stephan Raue --- packages/x11/font/font-cursor-misc/package.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/x11/font/font-cursor-misc/package.mk b/packages/x11/font/font-cursor-misc/package.mk index add3d47499..7f11391b08 100644 --- a/packages/x11/font/font-cursor-misc/package.mk +++ b/packages/x11/font/font-cursor-misc/package.mk @@ -36,3 +36,8 @@ PKG_IS_ADDON="no" PKG_AUTORECONF="yes" PKG_CONFIGURE_OPTS_TARGET="--with-fontrootdir=/usr/share/fonts" + +post_install() { + mkfontdir $INSTALL/usr/share/fonts/misc + mkfontscale $INSTALL/usr/share/fonts/misc +} From 1c1e57c6b898acbbf947b4138759396da06aeba9 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 14:39:48 +0200 Subject: [PATCH 066/103] font-misc-misc: create fonts.dir and fonts.scale on install Signed-off-by: Stephan Raue --- packages/x11/font/font-misc-misc/package.mk | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/x11/font/font-misc-misc/package.mk b/packages/x11/font/font-misc-misc/package.mk index e7672d112b..d4c01c9e2b 100644 --- a/packages/x11/font/font-misc-misc/package.mk +++ b/packages/x11/font/font-misc-misc/package.mk @@ -61,5 +61,9 @@ PKG_MAKE_OPTS_TARGET="UTIL_DIR=$SYSROOT_PREFIX/usr/share/fonts/util/" makeinstall_target() { mkdir -p $INSTALL/usr/share/fonts/misc cp 6x13-ISO8859-1.pcf.gz $INSTALL/usr/share/fonts/misc - mkfontdir $INSTALL/usr/share/fonts/misc +} + +post_install() { + mkfontdir $INSTALL/usr/share/fonts/misc + mkfontscale $INSTALL/usr/share/fonts/misc } From 79bc3a38592150be1111a634512dcb5abf7718fe Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 15:54:55 +0200 Subject: [PATCH 067/103] util-linux: update to util-linux-2.23.2 Signed-off-by: Stephan Raue --- packages/sysutils/util-linux/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sysutils/util-linux/meta b/packages/sysutils/util-linux/meta index f65b7287f0..f136dc5085 100644 --- a/packages/sysutils/util-linux/meta +++ b/packages/sysutils/util-linux/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="util-linux" -PKG_VERSION="2.23.1" +PKG_VERSION="2.23.2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" From e4cde4775a51e70c11bcb39a2215438e49a2dc35 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 16:20:16 +0200 Subject: [PATCH 068/103] util-linux: convert to new package format Signed-off-by: Stephan Raue --- .../diskdev_cmds/udev.d/62-fsck-hfsplus.rules | 2 +- packages/sysutils/util-linux/build | 101 --------------- packages/sysutils/util-linux/install | 48 ------- packages/sysutils/util-linux/meta | 35 ----- packages/sysutils/util-linux/package.mk | 122 ++++++++++++++++++ 5 files changed, 123 insertions(+), 185 deletions(-) delete mode 100755 packages/sysutils/util-linux/build delete mode 100755 packages/sysutils/util-linux/install delete mode 100644 packages/sysutils/util-linux/meta create mode 100644 packages/sysutils/util-linux/package.mk diff --git a/packages/sysutils/diskdev_cmds/udev.d/62-fsck-hfsplus.rules b/packages/sysutils/diskdev_cmds/udev.d/62-fsck-hfsplus.rules index e6bd5147d1..3aa2170d88 100644 --- a/packages/sysutils/diskdev_cmds/udev.d/62-fsck-hfsplus.rules +++ b/packages/sysutils/diskdev_cmds/udev.d/62-fsck-hfsplus.rules @@ -21,7 +21,7 @@ SUBSYSTEM!="block", GOTO="end" ACTION!="add", GOTO="end" -ACTION=="add", IMPORT{program}="/usr/bin/blkid -o udev -p %N" +ACTION=="add", IMPORT{program}="/usr/sbin/blkid -o udev -p %N" ACTION=="add", ENV{ID_FS_TYPE}=="hfsplus", ENV{mount_options}="rw,nosuid,nodev,uhelper=udisks", RUN+="/bin/fsck.hfsplus -r -y /dev/%k" # exit diff --git a/packages/sysutils/util-linux/build b/packages/sysutils/util-linux/build deleted file mode 100755 index 526e5b44b5..0000000000 --- a/packages/sysutils/util-linux/build +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --bindir=/usr/bin \ - --sbindir=/usr/bin \ - --disable-silent-rules \ - --enable-shared \ - --disable-static \ - --disable-gtk-doc \ - --disable-nls \ - --disable-rpath \ - --enable-tls \ - --enable-libuuid \ - --enable-libblkid \ - --enable-libmount \ - --disable-deprecated-mount \ - --disable-mount \ - --enable-fsck \ - --disable-partx \ - --enable-uuidd \ - --disable-mountpoint \ - --disable-fallocate \ - --disable-unshare \ - --disable-arch \ - --disable-ddate \ - --disable-eject \ - --disable-agetty \ - --disable-cramfs \ - --disable-switch-root \ - --disable-pivot-root \ - --disable-elvtune \ - --disable-kill \ - --disable-last \ - --disable-utmpdump \ - --disable-line \ - --disable-mesg \ - --disable-raw \ - --disable-rename \ - --disable-reset \ - --disable-vipw \ - --disable-newgrp \ - --disable-chfn-chsh \ - --enable-chsh-only-listed \ - --disable-login \ - --disable-login-chown-vcs \ - --disable-login-stat-mail \ - --disable-sulogin \ - --disable-su \ - --disable-runuser \ - --disable-ul \ - --disable-more \ - --disable-pg \ - --disable-setterm \ - --disable-schedutils \ - --disable-wall \ - --disable-write \ - --disable-chkdupexe \ - --disable-socket-activation \ - --disable-pg-bell \ - --disable-require-password \ - --disable-use-tty-group \ - --disable-makeinstall-chown \ - --disable-makeinstall-setuid \ - --with-gnu-ld \ - --without-selinux \ - --without-audit \ - --without-udev \ - --without-ncurses \ - --without-slang \ - --without-utempter \ - --without-systemdsystemunitdir - -make - -$MAKEINSTALL - diff --git a/packages/sysutils/util-linux/install b/packages/sysutils/util-linux/install deleted file mode 100755 index 7167fa7607..0000000000 --- a/packages/sysutils/util-linux/install +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/fstrim $INSTALL/usr/bin - cp $PKG_BUILD/.libs/blkid $INSTALL/usr/bin - cp $PKG_BUILD/.libs/fsck $INSTALL/usr/bin - -mkdir -p $INSTALL/usr/lib - cp -PR $PKG_BUILD/.libs/libblkid.so* $INSTALL/usr/lib - rm -rf $INSTALL/usr/lib/libblkid.so*T - cp -PR $PKG_BUILD/.libs/libmount.so* $INSTALL/usr/lib - rm -rf $INSTALL/usr/lib/libmount.so*T - cp -PR $PKG_BUILD/.libs/libuuid.so* $INSTALL/usr/lib - rm -rf $INSTALL/usr/lib/libuuid.so*T - -if [ "$SWAP_SUPPORT" = "yes" ]; then - mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/.libs/swapon $INSTALL/usr/bin - cp $PKG_BUILD/.libs/swapoff $INSTALL/usr/bin - - mkdir -p $INSTALL/etc/init.d - cp $PKG_DIR/scripts/32_swapfile $INSTALL/etc/init.d - - mkdir -p $INSTALL/etc - cat $PKG_DIR/config/swap.conf | sed -e "s,@SWAPFILESIZE@,$SWAPFILESIZE,g" > $INSTALL/etc/swap.conf -fi diff --git a/packages/sysutils/util-linux/meta b/packages/sysutils/util-linux/meta deleted file mode 100644 index f136dc5085..0000000000 --- a/packages/sysutils/util-linux/meta +++ /dev/null @@ -1,35 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="util-linux" -PKG_VERSION="2.23.2" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_URL="http://www.kernel.org/pub/linux/utils/util-linux/v2.23/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain" -PKG_PRIORITY="optional" -PKG_SECTION="system" -PKG_SHORTDESC="util-linux: Miscellaneous system utilities for Linux" -PKG_LONGDESC="The util-linux package contains a large variety of low-level system utilities that are necessary for a Linux system to function. Among many features, Util-linux contains the fdisk configuration tool and the login program." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="yes" diff --git a/packages/sysutils/util-linux/package.mk b/packages/sysutils/util-linux/package.mk new file mode 100644 index 0000000000..dc2c2cce47 --- /dev/null +++ b/packages/sysutils/util-linux/package.mk @@ -0,0 +1,122 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="util-linux" +PKG_VERSION="2.23.2" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_URL="http://www.kernel.org/pub/linux/utils/util-linux/v2.23/$PKG_NAME-$PKG_VERSION.tar.xz" +PKG_DEPENDS="" +PKG_BUILD_DEPENDS_TARGET="toolchain" +PKG_PRIORITY="optional" +PKG_SECTION="system" +PKG_SHORTDESC="util-linux: Miscellaneous system utilities for Linux" +PKG_LONGDESC="The util-linux package contains a large variety of low-level system utilities that are necessary for a Linux system to function. Among many features, Util-linux contains the fdisk configuration tool and the login program." + +PKG_IS_ADDON="no" +PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--disable-gtk-doc \ + --disable-nls \ + --disable-rpath \ + --enable-tls \ + --enable-libuuid \ + --enable-libblkid \ + --enable-libmount \ + --disable-deprecated-mount \ + --disable-mount \ + --enable-fsck \ + --disable-partx \ + --enable-uuidd \ + --disable-mountpoint \ + --disable-fallocate \ + --disable-unshare \ + --disable-arch \ + --disable-ddate \ + --disable-eject \ + --disable-agetty \ + --disable-cramfs \ + --disable-switch-root \ + --disable-pivot-root \ + --disable-elvtune \ + --disable-kill \ + --disable-last \ + --disable-utmpdump \ + --disable-line \ + --disable-mesg \ + --disable-raw \ + --disable-rename \ + --disable-reset \ + --disable-vipw \ + --disable-newgrp \ + --disable-chfn-chsh \ + --enable-chsh-only-listed \ + --disable-login \ + --disable-login-chown-vcs \ + --disable-login-stat-mail \ + --disable-sulogin \ + --disable-su \ + --disable-runuser \ + --disable-ul \ + --disable-more \ + --disable-pg \ + --disable-setterm \ + --disable-schedutils \ + --disable-wall \ + --disable-write \ + --disable-chkdupexe \ + --disable-socket-activation \ + --disable-pg-bell \ + --disable-require-password \ + --disable-use-tty-group \ + --disable-makeinstall-chown \ + --disable-makeinstall-setuid \ + --with-gnu-ld \ + --without-selinux \ + --without-audit \ + --without-udev \ + --without-ncurses \ + --without-slang \ + --without-utempter \ + --without-systemdsystemunitdir" + +post_makeinstall_target() { + rm -rf $INSTALL/usr/bin + rm -rf $INSTALL/usr/sbin + rm -rf $INSTALL/usr/share + + mkdir -p $INSTALL/usr/sbin + cp fstrim $INSTALL/usr/sbin + cp .libs/blkid $INSTALL/usr/sbin + cp .libs/fsck $INSTALL/usr/sbin + + if [ "$SWAP_SUPPORT" = "yes" ]; then + mkdir -p $INSTALL/usr/sbin + cp .libs/swapon $INSTALL/usr/sbin + cp .libs/swapoff $INSTALL/usr/sbin + + mkdir -p $INSTALL/etc/init.d + cp $PKG_DIR/scripts/32_swapfile $INSTALL/etc/init.d + + mkdir -p $INSTALL/etc + cat $PKG_DIR/config/swap.conf | sed -e "s,@SWAPFILESIZE@,$SWAPFILESIZE,g" > $INSTALL/etc/swap.conf + fi +} From 178b417a675e65f73fad3e3f6f6a9aa0f58a116d Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 1 Aug 2013 20:08:43 +0200 Subject: [PATCH 069/103] mysql: some mysql-server fixes and rework Signed-off-by: Stephan Raue --- packages/databases/mysql/package.mk | 37 ++++++++++++----------- packages/databases/mysql/scripts/54_mysql | 28 +++++++++-------- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/packages/databases/mysql/package.mk b/packages/databases/mysql/package.mk index a3090fc0f5..36351cd2f4 100644 --- a/packages/databases/mysql/package.mk +++ b/packages/databases/mysql/package.mk @@ -26,8 +26,8 @@ PKG_LICENSE="LGPL" PKG_SITE="http://www.mysql.com" PKG_URL="http://cdn.mysql.com/Downloads/MySQL-5.6/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS="zlib ncurses" -PKG_BUILD_DEPENDS_HOST="toolchain zlib:host ncurses" -PKG_BUILD_DEPENDS_TARGET="toolchain zlib ncurses mysql:host" +PKG_BUILD_DEPENDS_HOST="toolchain ncurses" +PKG_BUILD_DEPENDS_TARGET="toolchain ncurses mysql:host" PKG_PRIORITY="optional" PKG_SECTION="database" PKG_SHORTDESC="mysql: A database server" @@ -36,8 +36,6 @@ PKG_LONGDESC="MySQL is a SQL (Structured Query Language) database server. SQL is PKG_IS_ADDON="no" PKG_AUTORECONF="no" -# export MAKEFLAGS=-j1 - pre_configure_host() { sed -i "/ADD_SUBDIRECTORY(sql\/share)/d" ../CMakeLists.txt sed -i "s/ADD_SUBDIRECTORY(libmysql)/&\\nADD_SUBDIRECTORY(sql\/share)/" ../CMakeLists.txt @@ -51,11 +49,6 @@ configure_host() { -DCMAKE_BUILD_TYPE=Release \ -DWITHOUT_SERVER=OFF \ -DWITH_EMBEDDED_SERVER=OFF \ - -DWITH_EXAMPLE_STORAGE_ENGINE=OFF \ - -DWITH_FEDERATED_STORAGE_ENGINE=OFF \ - -DWITH_INNOBASE_STORAGE_ENGINE=OFF \ - -DWITH_PARTITION_STORAGE_ENGINE=OFF \ - -DWITH_PERFSCHEMA_STORAGE_ENGINE=OFF \ -DWITH_EXTRA_CHARSETS=none \ -DWITH_EDITLINE=bundled \ -DWITH_LIBEVENT=bundled \ @@ -69,6 +62,7 @@ make_host() { make comp_err make gen_lex_hash make comp_sql + make gen_pfs_lex_token } makeinstall_host() { @@ -76,13 +70,13 @@ makeinstall_host() { cp -PR extra/comp_err $ROOT/$TOOLCHAIN/bin cp -PR sql/gen_lex_hash $ROOT/$TOOLCHAIN/bin cp -PR scripts/comp_sql $ROOT/$TOOLCHAIN/bin + cp -PR storage/perfschema/gen_pfs_lex_token $ROOT/$TOOLCHAIN/bin } configure_target() { -# strip_lto cmake -DCMAKE_TOOLCHAIN_FILE=$CMAKE_CONF \ -DCMAKE_BUILD_TYPE=Release \ - -DFEATURE_SET=classic \ + -DFEATURE_SET=community \ -DDISABLE_SHARED=ON \ -DCMAKE_INSTALL_PREFIX=/usr \ -DINSTALL_DOCDIR=share/doc/mysql \ @@ -103,18 +97,15 @@ configure_target() { -DSYSCONFDIR=/etc/mysql \ -DWITHOUT_SERVER=OFF \ -DWITH_EMBEDDED_SERVER=OFF \ - -DWITH_EXAMPLE_STORAGE_ENGINE=OFF \ - -DWITH_FEDERATED_STORAGE_ENGINE=OFF \ - -DWITH_INNOBASE_STORAGE_ENGINE=OFF \ -DWITH_PARTITION_STORAGE_ENGINE=OFF \ - -DWITH_PERFSCHEMA_STORAGE_ENGINE=OFF \ + -DWITH_PERFSCHEMA_STORAGE_ENGINE=ON \ -DWITH_EXTRA_CHARSETS=all \ -DENABLE_DTRACE=OFF \ -DWITH_EDITLINE=bundled \ -DWITH_LIBEVENT=bundled \ - -DWITH_SSL=system \ + -DWITH_SSL=bundled \ -DWITH_UNIT_TESTS=OFF \ - -DWITH_ZLIB=system \ + -DWITH_ZLIB=bundled \ -DSTACK_DIRECTION=1 \ .. } @@ -144,7 +135,17 @@ post_makeinstall_target() { cp -P extra/my_print_defaults $INSTALL/usr/bin cp -P client/mysql $INSTALL/usr/bin cp -P client/mysqladmin $INSTALL/usr/bin - cp -P scripts/mysql_install_db $INSTALL/usr/bin + cp -P ../scripts/mysql_install_db.sh $INSTALL/usr/bin/mysql_install_db + chmod +x $INSTALL/usr/bin/mysql_install_db + sed -e 's,@localstatedir@,/storage/.mysql,g' \ + -e 's,@bindir@,/usr/bin,g' \ + -e 's,@prefix@,/usr,g' \ + -e 's,@libexecdir@,/usr/sbin,g' \ + -e 's,@pkgdatadir@,/usr/share/mysql,g' \ + -e 's,@scriptdir@,/usr/bin,g' \ + -e 's,^.basedir=.*,basedir="/usr",g' \ + -e 's,@HOSTNAME@,cat /proc/sys/kernel/hostname,g' \ + -i $INSTALL/usr/bin/mysql_install_db mkdir -p $INSTALL/usr/sbin cp -P sql/mysqld $INSTALL/usr/sbin diff --git a/packages/databases/mysql/scripts/54_mysql b/packages/databases/mysql/scripts/54_mysql index 214c92ff6a..697337669d 100644 --- a/packages/databases/mysql/scripts/54_mysql +++ b/packages/databases/mysql/scripts/54_mysql @@ -22,22 +22,24 @@ # # runlevels: openelec, textmode +MYSQL_DATADIR="$CONFIG_CACHE/mysql" + ( - progress "Starting MySql server" + mkdir -p /run/mysqld - if [ ! -f /storage/.mysql/data ] - then - mkdir -p /storage/.mysql - mkdir -p /storage/.mysql/data + if [ ! -d "$MYSQL_DATADIR" ]; then + progress "Creating MySql Database" + mkdir -p "$MYSQL_DATADIR" + mysql_install_db --user=root --datadir="$MYSQL_DATADIR" > /dev/null 2>&1 + mysqld --user=root --datadir="$MYSQL_DATADIR" > /dev/null 2>&1 & + usleep 3000000 + mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'openelec' WITH GRANT OPTION;" > /dev/null 2>&1 + mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'openelec' WITH GRANT OPTION;" > /dev/null 2>&1 - mysql_install_db --user=root --datadir=/storage/.mysql/data > /dev/null 2>&1 - (mysqld --user=root --datadir=/storage/.mysql/data > /dev/null 2>&1)& - mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'openelec' WITH GRANT OPTION;" > /dev/null 2>&1 - mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'openelec' WITH GRANT OPTION;" > /dev/null 2>&1 - killall mysqld - fi + killall mysqld + usleep 2000000 + fi - mysqld --user=root --datadir=/storage/.mysql/data > /dev/null 2>&1 + mysqld --user=root --datadir="$MYSQL_DATADIR" > /dev/null 2>&1 )& - From a29491a968404486ce13b2741ef8b2d77417e12a Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Fri, 2 Aug 2013 18:22:19 +0200 Subject: [PATCH 070/103] service.openelec.settings: add upstream patches Signed-off-by: Stephan Raue --- .../service.openelec.settings-fixes-0.1.patch | 2431 +++++++++++++++++ .../service.openelec.settings/unpack | 7 + 2 files changed, 2438 insertions(+) create mode 100644 packages/mediacenter/service.openelec.settings/patches.upstream/service.openelec.settings-fixes-0.1.patch diff --git a/packages/mediacenter/service.openelec.settings/patches.upstream/service.openelec.settings-fixes-0.1.patch b/packages/mediacenter/service.openelec.settings/patches.upstream/service.openelec.settings-fixes-0.1.patch new file mode 100644 index 0000000000..bc4039aaaa --- /dev/null +++ b/packages/mediacenter/service.openelec.settings/patches.upstream/service.openelec.settings-fixes-0.1.patch @@ -0,0 +1,2431 @@ +From 2a119229b70a1826c52482a00cc2dff38571e6f7 Mon Sep 17 00:00:00 2001 +From: lfiebach +Date: Sun, 28 Jul 2013 15:38:33 +0200 +Subject: [PATCH 1/3] Fix Update Notification + +--- + resources/lib/modules/system.py | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/resources/lib/modules/system.py b/resources/lib/modules/system.py +index de474d4..35ebfdf 100755 +--- a/resources/lib/modules/system.py ++++ b/resources/lib/modules/system.py +@@ -354,7 +354,12 @@ def load_values(self): + if not value is None: + self.config['update']['settings']['AutoUpdate']['value' + ] = value +- ++ ++ value = self.oe.read_setting('system', 'UpdateNotify') ++ if not value is None: ++ self.config['update']['settings']['UpdateNotify' ++ ]['value'] = value ++ + # AutoUpdate = manual by environment var. + if 'UPDATE_SUPPORT' in os.environ: + if os.environ['UPDATE_SUPPORT'] == 'false': +@@ -366,11 +371,6 @@ def load_values(self): + + self.config['update']['settings']['CheckUpdate']['not_supported' + ] = [self.arch] +- +- value = self.oe.read_setting('system', 'UpdateNotify') +- if not value is None: +- self.config['update']['settings']['UpdateNotify' +- ]['value'] = value + + # AutoUpdate File and URL + value = self.oe.read_setting('system', 'update_file') +-- +1.8.1.6 + + +From cc33f3c6a4e9f81b3a6eba9b8b20de5eb742c90a Mon Sep 17 00:00:00 2001 +From: lfiebach +Date: Mon, 29 Jul 2013 21:26:22 +0200 +Subject: [PATCH 2/3] redesign menu build + +--- + addon.xml | 2 +- + changelog.txt | 4 + + oe.py | 4 +- + resources/lib/modules/about.py | 1 + + resources/lib/modules/bluetooth.py | 7 +- + resources/lib/modules/connman.py | 554 +++++++--------------------- + resources/lib/modules/services.py | 128 ++----- + resources/lib/modules/system.py | 299 +++++++-------- + resources/lib/oeWindows.py | 109 +++++- + resources/skins/Default/720p/mainWindow.xml | 8 +- + 10 files changed, 410 insertions(+), 706 deletions(-) + mode change 100644 => 100755 addon.xml + +diff --git a/addon.xml b/addon.xml +old mode 100644 +new mode 100755 +index f395217..c130660 +--- a/addon.xml ++++ b/addon.xml +@@ -1,7 +1,7 @@ + + + + +diff --git a/changelog.txt b/changelog.txt +index c125464..a83a37d 100755 +--- a/changelog.txt ++++ b/changelog.txt +@@ -1,3 +1,7 @@ ++2013-07-29 v0.1.31 ++ (change) menu loader redesign ++ (fix) kill update thread on exit ++ + 2013-07-23 v0.1.30 + (change) use subprocess.Popen to start LCDd + (fix) stop LCDd on driver change +diff --git a/oe.py b/oe.py +index f2b5b2c..2e9f993 100755 +--- a/oe.py ++++ b/oe.py +@@ -114,8 +114,8 @@ def _(code): + return __addon__.getLocalizedString(code) + + def dbg_log(source, text, level=4): +- if os.environ.get('DEBUG', 'no') == 'no': +- return ++ #if os.environ.get('DEBUG', 'no') == 'no': ++ # return + + xbmc.log('## OpenELEC Addon ## ' + source + ' ## ' + text, level) + xbmc.log(traceback.format_exc()) +diff --git a/resources/lib/modules/about.py b/resources/lib/modules/about.py +index fdfee8a..76020b6 100755 +--- a/resources/lib/modules/about.py ++++ b/resources/lib/modules/about.py +@@ -39,6 +39,7 @@ def __init__(self, oeMain): + + oeMain.dbg_log('about::__init__', 'enter_function', 0) + ++ self.enabled = True + self.oe = oeMain + self.controls = {} + +diff --git a/resources/lib/modules/bluetooth.py b/resources/lib/modules/bluetooth.py +index 74c008a..f74416e 100755 +--- a/resources/lib/modules/bluetooth.py ++++ b/resources/lib/modules/bluetooth.py +@@ -46,6 +46,7 @@ class bluetooth: + 'listTyp': 'btlist', + 'InfoText': 704, + }} ++ + bt_daemon = '/usr/lib/bluetooth/bluetoothd' + bluez_init = '/etc/init.d/54_bluez' + +@@ -54,7 +55,8 @@ def __init__(self, oeMain): + try: + + oeMain.dbg_log('bluetooth::__init__', 'enter_function', 0) +- ++ ++ self.enabled = True + self.discovery_time = 30 # Seconds + self.listItems = {} + self.oe = oeMain +@@ -64,6 +66,9 @@ def __init__(self, oeMain): + self.active = False + self.dbusBluezAdapter = None + ++ if not os.path.exists(self.bt_daemon): ++ self.enabled = False ++ + self.oe.dbg_log('bluetooth::__init__', 'exit_function', 0) + except Exception, e: + +diff --git a/resources/lib/modules/connman.py b/resources/lib/modules/connman.py +index b7517e5..63541b3 100755 +--- a/resources/lib/modules/connman.py ++++ b/resources/lib/modules/connman.py +@@ -58,6 +58,7 @@ def __init__(self, mount_id, oeMain): + 'value': '', + 'type': 'multivalue', + 'values': ['cifs', 'nfs'], ++ 'action': 'set_value' + }, + 'mountpoint': { + 'order': 2, +@@ -66,6 +67,7 @@ def __init__(self, mount_id, oeMain): + 'type': 'text', + 'parent': {'entry': 'type', 'value': ['cifs', + 'nfs']}, ++ 'action': 'set_value' + }, + 'server': { + 'order': 3, +@@ -74,6 +76,7 @@ def __init__(self, mount_id, oeMain): + 'type': 'text', + 'parent': {'entry': 'type', 'value': ['cifs', + 'nfs']}, ++ 'action': 'set_value' + }, + 'share': { + 'order': 4, +@@ -82,6 +85,7 @@ def __init__(self, mount_id, oeMain): + 'type': 'text', + 'parent': {'entry': 'type', 'value': ['cifs', + 'nfs']}, ++ 'action': 'set_value' + }, + 'user': { + 'order': 5, +@@ -90,6 +94,7 @@ def __init__(self, mount_id, oeMain): + 'type': 'text', + 'parent': {'entry': 'type', 'value': ['cifs', + 'nfs']}, ++ 'action': 'set_value' + }, + 'pass': { + 'order': 6, +@@ -98,6 +103,7 @@ def __init__(self, mount_id, oeMain): + 'type': 'text', + 'parent': {'entry': 'type', 'value': ['cifs', + 'nfs']}, ++ 'action': 'set_value' + }, + 'options': { + 'order': 7, +@@ -106,6 +112,7 @@ def __init__(self, mount_id, oeMain): + 'type': 'text', + 'parent': {'entry': 'type', 'value': ['cifs', + 'nfs']}, ++ 'action': 'set_value' + }, + }, + }} +@@ -170,45 +177,9 @@ def menu_loader(self, menuItem): + if self.mount_id != 'new_mount': + self.winOeMount.showButton(2, 32141, 'networkMount', + 'delete_mount') +- category = 'mount' +- for entry in sorted(self.struct[category]['settings'], +- key=lambda x: \ +- self.struct[category]['settings' +- ][x]['order']): +- +- dictProperties = { +- 'value': self.struct[category]['settings' +- ][entry]['value'], +- 'typ': self.struct[category]['settings' +- ][entry]['type'], +- 'entry': entry, +- 'category': category, +- 'action': 'set_value', +- } +- +- if 'values' in self.struct[category]['settings'][entry]: +- dictProperties['values'] = \ +- ','.join(self.struct[category]['settings' +- ][entry]['values']) +- +- if not 'parent' in self.struct[category]['settings' +- ][entry]: +- +- self.winOeMount.addConfigItem(self.oe._(self.struct[category]['settings' +- ][entry]['name']), dictProperties, +- self.oe.listObject['list']) +- else: +- +- if self.struct[category]['settings' +- ][self.struct[category]['settings' +- ][entry]['parent']['entry']]['value'] \ +- in self.struct[category]['settings' +- ][entry]['parent']['value']: +- +- self.winOeMount.addConfigItem(self.oe._(self.struct[category]['settings' +- ][entry]['name']), dictProperties, +- self.oe.listObject['list']) + ++ self.winOeMount.build_menu(self.struct) ++ + self.oe.dbg_log('networkMount::menu_loader', 'exit_function' + , 0) + except Exception, e: +@@ -359,6 +330,8 @@ def delete_mount(self): + xbmc.executebuiltin('Notification(Umount Error, ' + + umount + ')') + else: ++ del self.oe.dictModules['connman'].struct['mounts' ++ ]['settings'][self.mount_id] + self.oe.remove_node(self.mount_id) + + self.oe.dbg_log('save_mount::delete_mount', 'exit_function' +@@ -398,6 +371,7 @@ def __init__(self, servicePath, oeMain): + 'value': '', + 'type': 'bool', + 'dbus': 'Boolean', ++ 'action': 'set_value' + }}, + }, + 'IPv4': { +@@ -412,6 +386,7 @@ def __init__(self, servicePath, oeMain): + 'type': 'multivalue', + 'dbus': 'String', + 'values': ['dhcp', 'manual', 'off'], ++ 'action': 'set_value' + }, + 'Address': { + 'order': 2, +@@ -421,6 +396,7 @@ def __init__(self, servicePath, oeMain): + 'dbus': 'String', + 'parent': {'entry': 'Method', + 'value': ['manual']}, ++ 'action': 'set_value' + }, + 'Netmask': { + 'order': 3, +@@ -430,6 +406,7 @@ def __init__(self, servicePath, oeMain): + 'dbus': 'String', + 'parent': {'entry': 'Method', + 'value': ['manual']}, ++ 'action': 'set_value' + }, + 'Gateway': { + 'order': 4, +@@ -439,6 +416,7 @@ def __init__(self, servicePath, oeMain): + 'dbus': 'String', + 'parent': {'entry': 'Method', + 'value': ['manual']}, ++ 'action': 'set_value' + }, + }, + }, +@@ -455,6 +433,7 @@ def __init__(self, servicePath, oeMain): + 'dbus': 'String', + 'values': ['auto', 'manual', '6to4', 'off' + ], ++ 'action': 'set_value' + }, + 'Address': { + 'order': 2, +@@ -464,6 +443,7 @@ def __init__(self, servicePath, oeMain): + 'dbus': 'String', + 'parent': {'entry': 'Method', + 'value': ['manual']}, ++ 'action': 'set_value' + }, + 'PrefixLength': { + 'order': 4, +@@ -473,6 +453,7 @@ def __init__(self, servicePath, oeMain): + 'dbus': 'Byte', + 'parent': {'entry': 'Method', + 'value': ['manual']}, ++ 'action': 'set_value' + }, + 'Gateway': { + 'order': 3, +@@ -482,6 +463,7 @@ def __init__(self, servicePath, oeMain): + 'dbus': 'String', + 'parent': {'entry': 'Method', + 'value': ['manual']}, ++ 'action': 'set_value' + }, + 'Privacy': { + 'order': 5, +@@ -493,6 +475,7 @@ def __init__(self, servicePath, oeMain): + 'value': ['manual']}, + 'values': ['disabled', 'enabled', 'prefered' + ], ++ 'action': 'set_value' + }, + }, + }, +@@ -506,18 +489,21 @@ def __init__(self, servicePath, oeMain): + 'value': '', + 'type': 'ip', + 'dbus': 'String', ++ 'action': 'set_value' + }, '1': { + 'order': 2, + 'name': 32121, + 'value': '', + 'type': 'ip', + 'dbus': 'String', ++ 'action': 'set_value' + }, '2': { + 'order': 3, + 'name': 32122, + 'value': '', + 'type': 'ip', + 'dbus': 'String', ++ 'action': 'set_value' + }}, + }, + 'Timeservers': { +@@ -530,18 +516,21 @@ def __init__(self, servicePath, oeMain): + 'value': '', + 'type': 'text', + 'dbus': 'String', ++ 'action': 'set_value' + }, '1': { + 'order': 2, + 'name': 32125, + 'value': '', + 'type': 'text', + 'dbus': 'String', ++ 'action': 'set_value' + }, '2': { + 'order': 3, + 'name': 32126, + 'value': '', + 'type': 'text', + 'dbus': 'String', ++ 'action': 'set_value' + }}, + }, + 'Domains': { +@@ -554,18 +543,21 @@ def __init__(self, servicePath, oeMain): + 'value': '', + 'type': 'text', + 'dbus': 'String', ++ 'action': 'set_value' + }, '1': { + 'order': 2, + 'name': 32129, + 'value': '', + 'type': 'text', + 'dbus': 'String', ++ 'action': 'set_value' + }, '2': { + 'order': 3, + 'name': 32130, + 'value': '', + 'type': 'text', + 'dbus': 'String', ++ 'action': 'set_value' + }}, + }, + } +@@ -646,16 +638,6 @@ def __init__(self, servicePath, oeMain): + for strEntry in sorted(self.struct, key=lambda x: \ + self.struct[x]['order']): + +- if strEntry == 'Provider': +- if 'Type' in self.service_properties: +- if not self.service_properties['Type'] == 'vpn': +- break +- +- if strEntry != 'Provider': +- if 'Type' in self.service_properties: +- if self.service_properties['Type'] == 'vpn': +- continue +- + dictProperties = { + 'modul': 'connmanNetworkConfig', + 'listTyp': self.oe.listObject['list'], +@@ -738,45 +720,9 @@ def menu_loader(self, menuItem): + self.oe.listObject['list'], + ) + +- category = menuItem.getProperty('category') +- for entry in sorted(self.struct[category]['settings'], +- key=lambda x: \ +- self.struct[category]['settings' +- ][x]['order']): +- +- dictProperties = { +- 'value': self.struct[category]['settings' +- ][entry]['value'], +- 'typ': self.struct[category]['settings' +- ][entry]['type'], +- 'entry': entry, +- 'category': category, +- 'action': 'set_value', +- } +- +- if 'values' in self.struct[category]['settings'][entry]: +- dictProperties['values'] = \ +- ','.join(self.struct[category]['settings' +- ][entry]['values']) +- +- if not 'parent' in self.struct[category]['settings' +- ][entry]: +- +- self.winOeCon.addConfigItem(self.oe._(self.struct[category]['settings' +- ][entry]['name']), dictProperties, +- menuItem.getProperty('listTyp')) +- else: +- +- if self.struct[category]['settings' +- ][self.struct[category]['settings' +- ][entry]['parent']['entry']]['value'] \ +- in self.struct[category]['settings' +- ][entry]['parent']['value']: +- +- self.winOeCon.addConfigItem(self.oe._(self.struct[category]['settings' +- ][entry]['name']), dictProperties, +- menuItem.getProperty('listTyp')) +- ++ self.winOeCon.build_menu(self.struct, ++ fltr=[menuItem.getProperty('category')]) ++ + self.oe.dbg_log('connmanService::menu_loader', + 'exit_function', 0) + except Exception, e: +@@ -1012,7 +958,7 @@ def __init__(self, vpn, oeMain): + 'openvpn']}, + }, + 'Domain': { +- 'order': 27, ++ 'order': 7, + 'name': 32134, + 'value': 'vpn', + 'action': 'set_value', +@@ -1037,8 +983,19 @@ def __init__(self, vpn, oeMain): + 'type': 'text', + 'parent': {'entry': 'Type', 'value': ['pptp']}, + }, ++ ++ 'advanced': { ++ 'order': 8, ++ 'name': 'Show Advanced', ++ 'value': '0', ++ 'action': 'set_value', ++ 'type': 'bool', ++ 'parent': {'entry': 'Type', 'value': ['pptp','openvpn']}, ++ }, ++ ++ + 'PPTP.EchoFailure': { +- 'order': 25, ++ 'order': 9, + 'name': 32162, + 'value': '0', + 'action': 'set_value', +@@ -1047,7 +1004,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.EchoInterval': { +- 'order': 26, ++ 'order': 9, + 'name': 32163, + 'value': '0', + 'action': 'set_value', +@@ -1056,7 +1013,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.RefuseEAP': { +- 'order': 13, ++ 'order': 9, + 'name': 32151, + 'value': '0', + 'action': 'set_value', +@@ -1065,7 +1022,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.RefusePAP': { +- 'order': 14, ++ 'order': 9, + 'name': 32152, + 'value': '0', + 'action': 'set_value', +@@ -1074,7 +1031,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.RefuseCHAP': { +- 'order': 15, ++ 'order': 9, + 'name': 32153, + 'value': '0', + 'action': 'set_value', +@@ -1083,7 +1040,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.RefuseMSCHAP': { +- 'order': 16, ++ 'order': 9, + 'name': 32154, + 'value': '0', + 'action': 'set_value', +@@ -1092,7 +1049,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.RefuseMSCHAP2': { +- 'order': 17, ++ 'order': 9, + 'name': 32155, + 'value': '0', + 'action': 'set_value', +@@ -1101,7 +1058,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.NoBSDComp': { +- 'order': 28, ++ 'order': 9, + 'name': 32160, + 'value': '0', + 'action': 'set_value', +@@ -1110,7 +1067,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.NoDeflate': { +- 'order': 27, ++ 'order': 9, + 'name': 32164, + 'value': '0', + 'action': 'set_value', +@@ -1119,7 +1076,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.RequirMPPE': { +- 'order': 20, ++ 'order': 9, + 'name': 32156, + 'value': '0', + 'action': 'set_value', +@@ -1128,7 +1085,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.RequirMPPE40': { +- 'order': 21, ++ 'order': 9, + 'name': 32157, + 'value': '0', + 'action': 'set_value', +@@ -1137,7 +1094,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.RequirMPPE128': { +- 'order': 22, ++ 'order': 9, + 'name': 32158, + 'value': '0', + 'action': 'set_value', +@@ -1146,7 +1103,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.RequirMPPEStateful': { +- 'order': 23, ++ 'order': 9, + 'name': 32159, + 'value': '0', + 'action': 'set_value', +@@ -1155,7 +1112,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'PPTP.NoVJ': { +- 'order': 24, ++ 'order': 9, + 'name': 32161, + 'value': '0', + 'action': 'set_value', +@@ -1164,7 +1121,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.CACert': { +- 'order': 8, ++ 'order': 5, + 'name': 32137, + 'value': '', + 'action': 'set_value', +@@ -1173,7 +1130,7 @@ def __init__(self, vpn, oeMain): + ]}, + }, + 'OpenVPN.Cert': { +- 'order': 8, ++ 'order': 5, + 'name': 32138, + 'value': '', + 'action': 'set_value', +@@ -1182,7 +1139,7 @@ def __init__(self, vpn, oeMain): + ]}, + }, + 'OpenVPN.Key': { +- 'order': 8, ++ 'order': 5, + 'name': 32139, + 'value': '', + 'action': 'set_value', +@@ -1191,7 +1148,7 @@ def __init__(self, vpn, oeMain): + ]}, + }, + 'OpenVPN.MTU': { +- 'order': 11, ++ 'order': 9, + 'name': 32165, + 'value': '', + 'action': 'set_value', +@@ -1201,7 +1158,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.NSCertType': { +- 'order': 12, ++ 'order': 9, + 'name': 32166, + 'value': '', + 'action': 'set_value', +@@ -1211,7 +1168,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.Proto': { +- 'order': 13, ++ 'order': 9, + 'name': 32167, + 'value': '', + 'action': 'set_value', +@@ -1221,7 +1178,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.Port': { +- 'order': 6, ++ 'order': 9, + 'name': 32168, + 'value': '', + 'action': 'set_value', +@@ -1231,7 +1188,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.AuthUserPass': { +- 'order': 5, ++ 'order': 9, + 'name': 32169, + 'value': '', + 'action': 'set_value', +@@ -1241,7 +1198,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.AskPass': { +- 'order': 16, ++ 'order': 9, + 'name': 32170, + 'value': '0', + 'action': 'set_value', +@@ -1251,7 +1208,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.AuthNoCache': { +- 'order': 17, ++ 'order': 9, + 'name': 32171, + 'value': '0', + 'action': 'set_value', +@@ -1261,7 +1218,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.TLSRemote': { +- 'order': 18, ++ 'order': 9, + 'name': 32172, + 'value': '0', + 'action': 'set_value', +@@ -1271,7 +1228,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.TLSAuth': { +- 'order': 19, ++ 'order': 9, + 'name': 32173, + 'value': '0', + 'action': 'set_value', +@@ -1281,7 +1238,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.TLSAuthDir': { +- 'order': 20, ++ 'order': 9, + 'name': 32174, + 'value': '', + 'action': 'set_value', +@@ -1291,7 +1248,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.Auth': { +- 'order': 4, ++ 'order': 9, + 'name': 32175, + 'value': '', + 'action': 'set_value', +@@ -1301,7 +1258,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.CompLZO': { +- 'order': 22, ++ 'order': 9, + 'name': 32176, + 'value': '0', + 'action': 'set_value', +@@ -1311,7 +1268,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.RemoteCertTls': { +- 'order': 23, ++ 'order': 9, + 'name': 32177, + 'value': '0', + 'action': 'set_value', +@@ -1321,7 +1278,7 @@ def __init__(self, vpn, oeMain): + 'optional': '', + }, + 'OpenVPN.ConfigFile': { +- 'order': 7, ++ 'order': 9, + 'name': 32178, + 'value': '', + 'action': 'set_value', +@@ -1414,108 +1371,9 @@ def menu_loader(self, menuItem): + self.winOeCon.showButton(1, 32141, 'connmanVpnConfig', + 'delete_vpn_config') + +- category = menuItem.getProperty('category') +- for entry in sorted(self.struct[category]['settings'], +- key=lambda x: \ +- self.struct[category]['settings' +- ][x]['order']): +- +- if 'optional' in self.struct[category]['settings' +- ][entry]: +- continue +- +- dictProperties = { +- 'value': self.struct[category]['settings' +- ][entry]['value'], +- 'typ': self.struct[category]['settings' +- ][entry]['type'], +- 'entry': entry, +- 'category': category, +- 'action': 'set_value', +- } +- +- if 'values' in self.struct[category]['settings'][entry]: +- dictProperties['values'] = \ +- ','.join(self.struct[category]['settings' +- ][entry]['values']) +- +- if not 'parent' in self.struct[category]['settings' +- ][entry]: +- +- self.winOeCon.addConfigItem(self.oe._(self.struct[category]['settings' +- ][entry]['name']), dictProperties, +- menuItem.getProperty('listTyp')) +- else: +- +- if self.struct[category]['settings' +- ][self.struct[category]['settings' +- ][entry]['parent']['entry']]['value'] \ +- in self.struct[category]['settings' +- ][entry]['parent']['value']: +- +- self.winOeCon.addConfigItem(self.oe._(self.struct[category]['settings' +- ][entry]['name']), dictProperties, +- menuItem.getProperty('listTyp')) +- +- if self.struct[category]['settings']['Type']['value'] != '': +- +- self.winOeCon.addConfigItem('Advanced', +- {'typ': 'separator'}, +- menuItem.getProperty('listTyp')) +- +- dictProperties = {'value': self.show_advanced_entrys, +- 'typ': 'bool', +- 'action': 'show_advanced'} +- +- self.winOeCon.addConfigItem('Show Advanced', +- dictProperties, menuItem.getProperty('listTyp')) +- +- if self.show_advanced_entrys == '1': +- +- for entry in sorted(self.struct[category]['settings' +- ], key=lambda x: \ +- self.struct[category]['settings'][x]['order' +- ]): +- +- if not 'optional' \ +- in self.struct[category]['settings'][entry]: +- continue +- +- dictProperties = { +- 'value': self.struct[category]['settings' +- ][entry]['value'], +- 'typ': self.struct[category]['settings' +- ][entry]['type'], +- 'entry': entry, +- 'category': category, +- 'action': 'set_value', +- } +- +- if 'values' in self.struct[category]['settings' +- ][entry]: +- dictProperties['values'] = \ +- ','.join(self.struct[category]['settings' +- ][entry]['values']) +- +- if not 'parent' \ +- in self.struct[category]['settings'][entry]: +- +- self.winOeCon.addConfigItem(self.oe._(self.struct[category]['settings' +- ][entry]['name']), dictProperties, +- menuItem.getProperty('listTyp')) +- else: +- +- if self.struct[category]['settings' +- ][self.struct[category]['settings' +- ][entry]['parent']['entry']]['value' +- ] \ +- in self.struct[category]['settings' +- ][entry]['parent']['value']: +- +- self.winOeCon.addConfigItem(self.oe._(self.struct[category]['settings' +- ][entry]['name']), +- dictProperties, +- menuItem.getProperty('listTyp')) ++ self.winOeCon.build_menu(self.struct, ++ fltr=[menuItem.getProperty('category')], ++ optional=self.struct['Provider']['settings']['advanced']['value']) + + self.oe.dbg_log('connmanVpn::menu_loader', 'exit_function', + 0) +@@ -1693,6 +1551,7 @@ def __init__(self, oeMain): + + self.struct = { + '/net/connman/technology/wifi': { ++ 'hidden': 'true', + 'order': 1, + 'name': 32102, + 'dbus': 'Dictionary', +@@ -1742,8 +1601,9 @@ def __init__(self, oeMain): + 'InfoText': 729, + }, + }, +- }, ++ 'order': 0}, + '/net/connman/technology/ethernet': { ++ 'hidden': 'true', + 'order': 2, + 'name': 32103, + 'dbus': 'Dictionary', +@@ -1755,7 +1615,8 @@ def __init__(self, oeMain): + 'type': 'bool', + 'dbus': 'Boolean', + 'InfoText': 730, +- }}, ++ }}, ++ 'order': 1 + }, + 'vpn': { + 'order': 3, +@@ -1763,11 +1624,13 @@ def __init__(self, oeMain): + 'dbus': 'Dictionary', + 'settings': {'add': { + 'order': 1, ++ 'value': '', + 'name': 32322, + 'action': 'add_vpn', + 'type': 'button', + 'InfoText': 731, + }}, ++ 'order': 2 + }, + 'Timeservers': { + 'order': 4, +@@ -1801,16 +1664,18 @@ def __init__(self, oeMain): + 'validate': '^([a-zA-Z0-9](?:[a-zA-Z0-9-\.]*[a-zA-Z0-9]))$', + 'InfoText': 734, + }}, ++ 'order': 2 + }, + 'mounts': {'order': 5, 'name': 32348, + 'settings': {'add': { + 'order': 1, + 'name': 32349, +- 'value': '', ++ 'value': 'new_mount', + 'action': 'edit_mount', + 'type': 'button', + 'InfoText': 735, +- }}}, ++ }}, 'order': 3 ++ }, + 'advanced': {'order': 6, 'name': 32368, + 'settings': {'wait_for_network': { + 'order': 1, +@@ -1828,15 +1693,24 @@ def __init__(self, oeMain): + 'parent': {'entry': 'wait_for_network', + 'value': ['1']}, + 'InfoText': 737, +- }}}, ++ }}, 'order': 4 ++ }, + } + + self.busy = 0 + self.oe = oeMain ++ self.enabled = True ++ self.connman_daemon = "/usr/sbin/connmand" + + self.wait_conf_file = \ + '%s/openelec/network_wait' % self.oe.CONFIG_CACHE + ++ self.vpn_plugins_dir = \ ++ '/usr/lib/connman/plugins-vpn' ++ ++ if not os.path.exists(self.connman_daemon): ++ self.enabled = False ++ + self.oe.dbg_log('connman::__init__', 'exit_function', 0) + self.vpn_conf_dir = '%s/vpn-config/' % self.oe.USER_CONFIG + except Exception, e: +@@ -1882,7 +1756,8 @@ def exit(self): + + self.oe.dbg_log('connman::exit', 'enter_function', 0) + +- self.dbusMonitor.exit() ++ if hasattr(self, 'dbusMonitor'): ++ self.dbusMonitor.exit() + + self.clear_list() + +@@ -1908,7 +1783,10 @@ def load_values(self): + + self.oe.dbg_log('connman::load_values', 'enter_function', 0) + +- ++ # VPN Available ++ if not os.path.exists(self.vpn_plugins_dir): ++ self.struct['vpn']['hidden'] = 'true' ++ + # Network Wait + self.struct['advanced']['settings']['wait_for_network' + ]['value'] = '0' +@@ -2081,197 +1959,47 @@ def menu_loader(self, menuItem=None): + , '/'), 'net.connman.Clock') + self.clock_properties = self.clock.GetProperties() + +- # Wifi and Ethernet ++ self.struct['/net/connman/technology/wifi']['hidden'] = 'true' ++ self.struct['/net/connman/technology/ethernet']['hidden'] = 'true' ++ + for (path, technologie) in self.technologie_properties: +- + if path in self.struct: +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct[path]['name' +- ]), {'typ': 'separator'}, +- menuItem.getProperty('listTyp')) +- +- if path in self.struct: +- for entry in sorted(self.struct[path]['settings'], +- key=lambda x: self.struct[path]['settings' +- ][x]['order']): +- if entry in technologie: +- if not 'changed' \ +- in self.struct[path]['settings'][entry]: +- self.struct[path]['settings' +- ][entry]['value'] = \ +- unicode(technologie[entry]) +- +- dictProperties = { +- 'value': self.struct[path]['settings' +- ][entry]['value'], +- 'typ': self.struct[path]['settings' +- ][entry]['type'], +- 'entry': entry, +- 'category': path, +- 'action': self.struct[path]['settings' +- ][entry]['action'], +- } +- +- if 'InfoText' in self.struct[path]['settings' +- ][entry]: +- dictProperties['InfoText'] = \ +- self.oe._(self.struct[path]['settings' +- ][entry]['InfoText']) +- +- if 'validate' in self.struct[path]['settings' +- ][entry]: +- dictProperties['validate'] = \ +- self.struct[path]['settings' +- ][entry]['validate'] +- +- if 'values' in self.struct[path]['settings' +- ][entry]: +- dictProperties['values'] = \ +- ','.join(self.struct[path]['settings' +- ][entry]['values']) +- +- if not 'parent' in self.struct[path]['settings' +- ][entry]: +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct[path]['settings' +- ][entry]['name']), dictProperties, +- menuItem.getProperty('listTyp')) +- else: +- +- if self.struct[path]['settings' +- ][self.struct[path]['settings' +- ][entry]['parent']['entry']]['value' +- ] in self.struct[path]['settings' +- ][entry]['parent']['value']: +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct[path]['settings' +- ][entry]['name']), +- dictProperties, +- menuItem.getProperty('listTyp')) +- +- # Virtual Private Network +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct['vpn' +- ]['name']), {'typ': 'separator'}, +- menuItem.getProperty('listTyp')) +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct['vpn' +- ]['settings']['add']['name']), {'typ': 'button', +- 'action': self.struct['vpn']['settings']['add' +- ]['action'], 'InfoText': self.oe._(self.struct['vpn' +- ]['settings']['add']['InfoText'])}, +- menuItem.getProperty('listTyp')) +- +- # Timeservers +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct['Timeservers' +- ]['name']), {'typ': 'separator'}, +- menuItem.getProperty('listTyp')) +- +- if 'Timeservers' in self.clock_properties: +- for setting in sorted(self.struct['Timeservers' +- ]['settings']): +- if int(setting) \ +- < len(self.clock_properties['Timeservers']): +- if not 'changed' in self.struct['Timeservers' +- ]['settings'][setting]: +- self.struct['Timeservers']['settings' +- ][setting]['value'] = \ +- self.clock_properties['Timeservers' +- ][int(setting)] +- +- dictProperties = { +- 'value': self.struct['Timeservers']['settings' +- ][unicode(setting)]['value'], +- 'typ': self.struct['Timeservers']['settings' +- ][unicode(setting)]['type'], +- 'entry': unicode(setting), +- 'category': 'Timeservers', +- 'action': self.struct['Timeservers']['settings' +- ][unicode(setting)]['action'], +- } +- +- if 'InfoText' in self.struct['Timeservers' +- ]['settings'][setting]: +- dictProperties['InfoText'] = \ +- self.oe._(self.struct['Timeservers' +- ]['settings'][setting]['InfoText']) +- +- if 'validate' in self.struct['Timeservers' +- ]['settings'][unicode(setting)]: +- dictProperties['validate'] = \ +- self.struct['Timeservers']['settings' +- ][unicode(setting)]['validate'] +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct['Timeservers' +- ]['settings'][unicode(setting)]['name']), +- dictProperties, +- menuItem.getProperty('listTyp')) +- +- # Mounts +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct['mounts' +- ]['name']), {'typ': 'separator'}, +- menuItem.getProperty('listTyp')) +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct['mounts' +- ]['settings']['add']['name']), { +- 'typ': self.struct['mounts']['settings']['add']['type' +- ], +- 'action': self.struct['mounts']['settings']['add' +- ]['action'], +- 'entry': 'new_mount', +- 'InfoText': self.oe._(self.struct['mounts']['settings' +- ]['add']['InfoText']), +- }, menuItem.getProperty('listTyp')) +- ++ if 'hidden' in self.struct[path]: ++ del self.struct[path]['hidden'] ++ ++ for entry in self.struct[path]['settings']: ++ if entry in technologie: ++ self.struct[path]['settings' ++ ][entry]['value'] = \ ++ unicode(technologie[entry]) ++ ++ for setting in self.struct['Timeservers']['settings']: ++ if 'Timeservers' in self.clock_properties: ++ if int(setting) < len(self.clock_properties['Timeservers']): ++ self.struct['Timeservers']['settings' ++ ][setting]['value'] = \ ++ self.clock_properties['Timeservers' ++ ][int(setting)] ++ else: ++ self.struct['Timeservers']['settings' ++ ][setting]['value'] = '' ++ + mount_dict = self.oe.read_node('mounts') + if 'mounts' in mount_dict: + for mount in mount_dict['mounts']: +- +- dictProperties = { +- 'typ': 'button', +- 'entry': mount, +- 'category': 'mounts', ++ tmp_mount = { ++ 'type': 'button', ++ 'name': mount_dict['mounts'][mount]['mountpoint'], ++ 'value': mount, + 'action': 'edit_mount', ++ 'dynamic': 'true', ++ 'order': 1 + } +- +- self.oe.winOeMain.addConfigItem(mount_dict['mounts' +- ][mount]['mountpoint'], dictProperties, +- menuItem.getProperty('listTyp')) +- +- # Network Wait +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct['advanced' +- ]['name']), {'typ': 'separator'}, +- menuItem.getProperty('listTyp')) +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct['advanced' +- ]['settings']['wait_for_network']['name']), { +- 'entry': 'wait_for_network', +- 'category': 'advanced', +- 'typ': self.struct['advanced']['settings' +- ]['wait_for_network']['type'], +- 'action': self.struct['advanced']['settings' +- ]['wait_for_network']['action'], +- 'value': self.struct['advanced']['settings' +- ]['wait_for_network']['value'], +- 'InfoText': self.oe._(self.struct['advanced']['settings' +- ]['wait_for_network']['InfoText']), +- }, menuItem.getProperty('listTyp')) +- +- if self.struct['advanced']['settings']['wait_for_network' +- ]['value'] in self.struct['advanced']['settings' +- ]['wait_for_network_time']['parent']['value']: +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct['advanced' +- ]['settings']['wait_for_network_time']['name' +- ]), { +- 'entry': 'wait_for_network_time', +- 'category': 'advanced', +- 'typ': self.struct['advanced']['settings' +- ]['wait_for_network_time']['type'], +- 'action': self.struct['advanced']['settings' +- ]['wait_for_network_time']['action'], +- 'value': self.struct['advanced']['settings' +- ]['wait_for_network_time']['value'], +- }, menuItem.getProperty('listTyp')) +- ++ self.struct['mounts']['settings' ++ ][mount] = tmp_mount ++ ++ self.oe.winOeMain.build_menu(self.struct) ++ + self.oe.set_busy(0) + self.oe.dbg_log('connman::menu_loader', 'exit_function', 0) + except Exception, e: +@@ -2750,7 +2478,7 @@ def edit_mount(self, listItem=None): + self.oe.dbg_log('connman::add_mount', 'enter_function', 0) + + self.configureMount = \ +- networkMount(listItem.getProperty('entry'), self.oe) ++ networkMount(listItem.getProperty('value'), self.oe) + del self.configureMount + + self.oe.dbg_log('connman::add_mount', 'enter_function', 0) +diff --git a/resources/lib/modules/services.py b/resources/lib/modules/services.py +index 4a0456d..8cd68dd 100755 +--- a/resources/lib/modules/services.py ++++ b/resources/lib/modules/services.py +@@ -55,7 +55,7 @@ def __init__(self, oeMain): + 'name': 32204, + 'value': '1', + 'action': 'initialize_samba', +- 'typ': 'bool', ++ 'type': 'bool', + 'InfoText': 738, + }, + 'samba_secure': { +@@ -63,7 +63,7 @@ def __init__(self, oeMain): + 'name': 32202, + 'value': '0', + 'action': 'initialize_samba', +- 'typ': 'bool', ++ 'type': 'bool', + 'parent': {'entry': 'samba_autostart', + 'value': ['1']}, + 'InfoText': 739, +@@ -73,7 +73,7 @@ def __init__(self, oeMain): + 'name': 32106, + 'value': 'openelec', + 'action': 'initialize_samba', +- 'typ': 'text', ++ 'type': 'text', + 'parent': {'entry': 'samba_secure', + 'value': ['1']}, + 'InfoText': 740, +@@ -83,7 +83,7 @@ def __init__(self, oeMain): + 'name': 32107, + 'value': 'openelec', + 'action': 'initialize_samba', +- 'typ': 'text', ++ 'type': 'text', + 'parent': {'entry': 'samba_secure', + 'value': ['1']}, + 'InfoText': 741, +@@ -99,14 +99,14 @@ def __init__(self, oeMain): + 'name': 32205, + 'value': '0', + 'action': 'initialize_ssh', +- 'typ': 'bool', ++ 'type': 'bool', + 'InfoText': 742, + }, 'ssh_unsecure': { + 'order': 2, + 'name': 32203, + 'value': '0', + 'action': 'initialize_ssh', +- 'typ': 'bool', ++ 'type': 'bool', + 'parent': {'entry': 'ssh_autostart', + 'value': ['1']}, + 'InfoText': 743, +@@ -121,7 +121,7 @@ def __init__(self, oeMain): + 'name': 32206, + 'value': '1', + 'action': 'initialize_avahi', +- 'typ': 'bool', ++ 'type': 'bool', + 'InfoText': 744, + }}, + }, +@@ -134,7 +134,7 @@ def __init__(self, oeMain): + 'name': 32320, + 'value': '0', + 'action': 'initialize_cron', +- 'typ': 'bool', ++ 'type': 'bool', + 'InfoText': 745, + }}, + }, +@@ -147,14 +147,14 @@ def __init__(self, oeMain): + 'name': 32341, + 'value': '0', + 'action': 'initialize_syslog', +- 'typ': 'bool', ++ 'type': 'bool', + 'InfoText': 746, + }, 'remote_syslog_ip': { + 'order': 2, + 'name': 32342, + 'value': '0', + 'action': 'initialize_syslog', +- 'typ': 'ip', ++ 'type': 'ip', + 'parent': {'entry': 'remote_syslog_autostart', + 'value': ['1']}, + 'InfoText': 747, +@@ -169,12 +169,14 @@ def __init__(self, oeMain): + 'name': 32344, + 'value': '0', + 'action': 'init_bluetooth', +- 'typ': 'bool', ++ 'type': 'bool', + 'InfoText': 720, + }}, + }, + } + ++ self.enabled = True ++ + self.oe = oeMain + + self.kernel_cmd = '/proc/cmdline' +@@ -262,73 +264,8 @@ def load_menu(self, focusItem): + + self.oe.dbg_log('services::load_menu', 'enter_function', 0) + +- for category in sorted(self.struct, key=lambda x: \ +- self.struct[x]['order']): +- if 'not_supported' in self.struct[category]: +- if self.arch \ +- in self.struct[category]['not_supported'] \ +- or not hasattr(self, category): +- continue +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct[category]['name' +- ]), {'typ': 'separator'}, +- focusItem.getProperty('listTyp')) +- +- for setting in sorted(self.struct[category]['settings' +- ], key=lambda x: \ +- self.struct[category]['settings'][x]['order']): +- +- if 'not_supported' in self.struct[category]['settings'][setting]: +- +- #skip setting +- self.oe.dbg_log('services::load_menu', 'skip setting ' + setting, 0) +- +- else: +- +- dictProperties = { +- 'entry': setting, +- 'category': category, +- 'action': self.struct[category]['settings' +- ][setting]['action'], +- 'value': self.struct[category]['settings' +- ][setting]['value'], +- 'typ': self.struct[category]['settings' +- ][setting]['typ'], +- } +- +- if 'InfoText' in self.struct[category]['settings' +- ][setting]: +- dictProperties['InfoText'] = \ +- self.oe._(self.struct[category]['settings' +- ][setting]['InfoText']) +- +- if 'values' in self.struct[category]['settings' +- ][setting]: +- if len(self.struct[category]['settings' +- ][setting]['values']) > 0: +- dictProperties['values'] = \ +- ','.join(self.struct[category]['settings' +- ][setting]['values']) +- +- if not 'parent' in self.struct[category]['settings' +- ][setting]: +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct[category]['settings' +- ][setting]['name']), dictProperties, +- focusItem.getProperty('listTyp')) +- else: +- +- if self.struct[category]['settings' +- ][self.struct[category]['settings' +- ][setting]['parent']['entry']]['value' +- ] in self.struct[category]['settings' +- ][setting]['parent']['value']: +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.struct[category]['settings' +- ][setting]['name']), +- dictProperties, +- focusItem.getProperty('listTyp')) +- ++ self.oe.winOeMain.build_menu(self.struct) ++ + self.oe.dbg_log('services::load_menu', 'exit_function', 0) + except Exception, e: + +@@ -345,8 +282,6 @@ def load_values(self): + + # SSH + if os.path.isfile(self.ssh_daemon): +- self.ssh = True +- + if os.path.exists(self.ssh_conf_dir + '/' + + self.ssh_conf_file): + ssh_file = open(self.ssh_conf_dir + '/' +@@ -386,37 +321,41 @@ def load_values(self): + cmd_args = cmd_file.read() + if 'ssh' in cmd_args: + self.struct['ssh']['settings']['ssh_autostart'] \ +- ['not_supported'] = True ++ ['hidden'] = 'true' + + cmd_file.close() +- ++ else: ++ self.struct['ssh']['hidden'] = 'true' ++ + if os.path.isfile(self.samba_nmbd) \ + and os.path.isfile(self.samba_smbd): +- self.samba = True + for entry in self.struct['samba']['settings']: + value = self.oe.read_setting('services', entry) + if not value is None: + self.struct['samba']['settings'][entry]['value' + ] = value +- ++ else: ++ self.struct['samba']['hidden'] = 'true' ++ + if os.path.isfile(self.avahi_daemon): +- self.avahi = True + value = self.oe.read_setting('services', + 'avahi_autostart') + if not value is None: + self.struct['avahi']['settings']['avahi_autostart' + ]['value'] = value +- ++ else: ++ self.struct['avahi']['hidden'] = 'true' ++ + if os.path.isfile(self.cron_daemon): +- self.cron = True + value = self.oe.read_setting('services', + 'cron_autostart') + if not value is None: + self.struct['cron']['settings']['cron_autostart' + ]['value'] = value +- ++ else: ++ self.struct['cron']['hidden'] = 'true' ++ + if os.path.isfile(self.syslog_daemon): +- self.syslog = True + value = self.oe.read_setting('services', + 'remote_syslog_autostart') + ip = self.oe.read_setting('services', 'remote_syslog_ip' +@@ -427,15 +366,18 @@ def load_values(self): + value + self.struct['syslog']['settings']['remote_syslog_ip' + ]['value'] = ip +- +- if os.path.isfile(self.bluetooth_daemon): +- self.bt = True ++ else: ++ self.struct['syslog']['hidden'] = 'true' ++ ++ if os.path.isfile(self.bluetooth_daemon): + value = self.oe.read_setting('services', + 'disable_bt') + if not value is None: + self.struct['bt']['settings']['disable_bt' + ]['value'] = value +- ++ else: ++ self.struct['bt']['hidden'] = 'true' ++ + + self.oe.dbg_log('services::load_values', 'exit_function', 0) + except Exception, e: +diff --git a/resources/lib/modules/system.py b/resources/lib/modules/system.py +index 35ebfdf..e1867fb 100755 +--- a/resources/lib/modules/system.py ++++ b/resources/lib/modules/system.py +@@ -60,16 +60,16 @@ def __init__(self, oeMain): + + self.oe = oeMain + +- self.config = { ++ self.struct = { + 'ident': { + 'order': 1, + 'name': 32189, +- 'not_supported': [], + 'settings': {'hostname': { ++ 'order': 1, + 'name': 32190, + 'value': 'OpenELEC', + 'action': 'set_hostname', +- 'typ': 'text', ++ 'type': 'text', + 'validate': '^([a-zA-Z0-9](?:[a-zA-Z0-9-\.]*[a-zA-Z0-9]))$', + 'InfoText': 710, + }}, +@@ -78,126 +78,134 @@ def __init__(self, oeMain): + 'order': 2, + 'name': 32009, + 'settings': {'KeyboardLayout1': { ++ 'order': 1, + 'name': 32010, + 'value': 'us', + 'action': 'set_keyboard_layout', +- 'typ': 'multivalue', ++ 'type': 'multivalue', + 'values': [], + 'InfoText': 711, + }, 'KeyboardLayout2': { ++ 'order': 2, + 'name': 32010, + 'value': 'us', + 'action': 'set_keyboard_layout', +- 'typ': 'multivalue', ++ 'type': 'multivalue', + 'values': [], + 'InfoText': 712, +- 'not_supported': ['RPi.arm'], + }, 'KeyboardType': { ++ 'order': 3, + 'name': 32330, + 'value': 'pc105', + 'action': 'set_keyboard_layout', +- 'typ': 'multivalue', ++ 'type': 'multivalue', + 'values': [], +- 'InfoText': 713, +- 'not_supported': ['RPi.arm'], ++ 'InfoText': 713, + }}, + }, + 'update': { + 'order': 3, + 'name': 32013, +- 'not_supported': [], + 'settings': {'AutoUpdate': { + 'name': 32014, + 'value': 'manual', + 'action': 'set_auto_update', +- 'typ': 'multivalue', ++ 'type': 'multivalue', + 'values': ['manual', 'auto'], + 'InfoText': 714, ++ 'order': 1, + }, 'UpdateNotify': { + 'name': 32365, + 'value': '1', + 'action': 'set_value', +- 'typ': 'bool', ++ 'type': 'bool', + 'InfoText': 715, ++ 'order': 2, + }, 'CheckUpdate': { + 'name': 32362, + 'value': '', + 'action': 'manual_check_update', +- 'typ': 'button', ++ 'type': 'button', + 'InfoText': 716, ++ 'order': 3, + }}, + }, + 'driver': { + 'order': 4, + 'name': 32007, +- 'not_supported': [], + 'settings': {'lcd': { + 'name': 32008, + 'value': 'none', + 'action': 'set_lcd_driver', +- 'typ': 'multivalue', ++ 'type': 'multivalue', + 'values': [], + 'InfoText': 717, ++ 'order': 1, + }}, + }, + 'power': { + 'order': 5, + 'name': 32011, +- 'not_supported': [], + 'settings': {'enable_hdd_standby': { + 'name': 32347, + 'value': '0', + 'action': 'set_hdd_standby', +- 'typ': 'bool', ++ 'type': 'bool', + 'InfoText': 718, ++ 'order': 1, + }, 'hdd_standby': { + 'name': 32012, + 'value': '0', + 'action': 'set_hdd_standby', +- 'typ': 'num', ++ 'type': 'num', + 'parent': {'entry': 'enable_hdd_standby', + 'value': ['1']}, + 'InfoText': 719, ++ 'order': 2, + }}, + }, + 'backup': { + 'order': 7, + 'name': 32371, +- 'not_supported': [], + 'settings': {'backup': { + 'name': 32372, + 'value': '0', + 'action': 'do_backup', +- 'typ': 'button', ++ 'type': 'button', + 'InfoText': 722, ++ 'order': 1, + }, 'restore': { + 'name': 32373, + 'value': '0', + 'action': 'do_restore', +- 'typ': 'button', ++ 'type': 'button', + 'InfoText': 723, ++ 'order': 2, + }}, + }, + 'reset': { + 'order': 8, + 'name': 32323, +- 'not_supported': [], + 'settings': {'xbmc_reset': { + 'name': 32324, + 'value': '0', + 'action': 'reset_xbmc', +- 'typ': 'button', ++ 'type': 'button', + 'InfoText': 724, ++ 'order': 1, + }, 'oe_reset': { + 'name': 32325, + 'value': '0', + 'action': 'reset_oe', +- 'typ': 'button', ++ 'type': 'button', + 'InfoText': 725, ++ 'order': 2, + }}, + }, + } + ++ self.enabled = True ++ + self.kernel_cmd = '/proc/cmdline' + + self.lcd_dir = '/usr/lib/lcdproc/' +@@ -264,6 +272,20 @@ def start_service(self): + self.oe.dbg_log('system::start_service', 'ERROR: (' + + repr(e) + ')') + ++ def stop_service(self): ++ try: ++ ++ self.oe.dbg_log('system::stop_service', 'enter_function', ++ 0) ++ if hasattr(self, 'update_thread'): ++ self.update_thread.stop() ++ ++ self.oe.dbg_log('system::stop_service', 'exit_function', 0) ++ except Exception, e: ++ ++ self.oe.dbg_log('system::stop_service', 'ERROR: (' ++ + repr(e) + ')') ++ + def do_init(self): + try: + +@@ -290,31 +312,31 @@ def load_values(self): + + if not arrTypes is None: + +- self.config['keyboard']['settings']['KeyboardType' ++ self.struct['keyboard']['settings']['KeyboardType' + ]['values'] = arrTypes + + value = self.oe.read_setting('system', 'KeyboardType') + if not value is None: +- self.config['keyboard']['settings']['KeyboardType' ++ self.struct['keyboard']['settings']['KeyboardType' + ]['value'] = value + + if not arrLayouts is None: + +- self.config['keyboard']['settings']['KeyboardLayout1' ++ self.struct['keyboard']['settings']['KeyboardLayout1' + ]['values'] = arrLayouts +- self.config['keyboard']['settings']['KeyboardLayout2' ++ self.struct['keyboard']['settings']['KeyboardLayout2' + ]['values'] = arrLayouts + + value = self.oe.read_setting('system', 'KeyboardLayout1' + ) + if not value is None: +- self.config['keyboard']['settings' ++ self.struct['keyboard']['settings' + ]['KeyboardLayout1']['value'] = value + + value = self.oe.read_setting('system', 'KeyboardLayout2' + ) + if not value is None: +- self.config['keyboard']['settings' ++ self.struct['keyboard']['settings' + ]['KeyboardLayout2']['value'] = value + + if not arrTypes == None: +@@ -322,64 +344,65 @@ def load_values(self): + else: + self.rpi_keyboard_layouts = True + ++ if self.arch == "RPi.arm": ++ self.struct['keyboard']['settings'][ ++ 'KeyboardLayout2']['hidden'] = 'true' ++ self.struct['keyboard']['settings'][ ++ 'KeyboardType']['hidden'] = 'true' ++ + # Hostname + value = self.oe.read_setting('system', 'hostname') + if not value is None: +- self.config['ident']['settings']['hostname']['value'] = \ ++ self.struct['ident']['settings']['hostname']['value'] = \ + value + + # LCD Driver + if not arrLcd is None: +- self.config['driver']['settings']['lcd']['values'] = \ ++ self.struct['driver']['settings']['lcd']['values'] = \ + arrLcd + + value = self.oe.read_setting('system', 'lcd') + if not value is None: +- self.config['driver']['settings']['lcd']['value'] = \ ++ self.struct['driver']['settings']['lcd']['value'] = \ + value + + # HDD Standby + value = self.oe.read_setting('system', 'enable_hdd_standby') + if not value is None: +- self.config['power']['settings']['enable_hdd_standby']['value' ++ self.struct['power']['settings']['enable_hdd_standby']['value' + ] = value + + value = self.oe.read_setting('system', 'hdd_standby') + if not value is None: +- self.config['power']['settings']['hdd_standby']['value' ++ self.struct['power']['settings']['hdd_standby']['value' + ] = value + + # AutoUpdate + value = self.oe.read_setting('system', 'AutoUpdate') + if not value is None: +- self.config['update']['settings']['AutoUpdate']['value' ++ self.struct['update']['settings']['AutoUpdate']['value' + ] = value + + value = self.oe.read_setting('system', 'UpdateNotify') + if not value is None: +- self.config['update']['settings']['UpdateNotify' ++ self.struct['update']['settings']['UpdateNotify' + ]['value'] = value + + # AutoUpdate = manual by environment var. +- if 'UPDATE_SUPPORT' in os.environ: +- if os.environ['UPDATE_SUPPORT'] == 'false': +- self.config['update']['settings']['AutoUpdate']['value' +- ] = 'manual' +- +- self.config['update']['settings']['AutoUpdate']['not_supported' +- ] = [self.arch] +- +- self.config['update']['settings']['CheckUpdate']['not_supported' +- ] = [self.arch] ++ ++ if os.environ.get('UPDATE_SUPPORT', 'true') == 'false': ++ ++ self.update_disabled = True ++ ++ self.struct['update']['hidden'] = 'true' ++ ++ self.struct['update']['settings']['AutoUpdate']['value' ++ ] = 'manual' + +- # AutoUpdate File and URL +- value = self.oe.read_setting('system', 'update_file') +- if value != None and value != '': +- self.update_file = value +- value = self.oe.read_setting('system', 'update_url') +- if value != None and value != '': +- self.update_url = value ++ self.struct['update']['settings']['UpdateNotify' ++ ]['value'] = '0' + ++ xbmc.log(repr(self.struct)) + self.oe.dbg_log('system::load_values', 'exit_function', 0) + except Exception, e: + +@@ -392,80 +415,8 @@ def load_menu(self, focusItem): + + self.oe.dbg_log('system::load_menu', 'enter_function', 0) + +- selectedPos = \ +- self.oe.winOeMain.getControl(self.oe.winOeMain.guiList).getSelectedPosition() +- +- for category in sorted(self.config, key=lambda x: \ +- self.config[x]['order']): +- if 'not_supported' in self.config[category]: +- if self.arch \ +- in self.config[category]['not_supported']: +- continue +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.config[category]['name' +- ]), {'typ': 'separator'}, +- focusItem.getProperty('listTyp')) +- +- for setting in sorted(self.config[category]['settings' +- ]): +- +- if 'not_supported' in self.config[category]['settings'][setting]: +- if self.arch \ +- in self.config[category]['settings'][setting]['not_supported']: +- continue +- +- dictProperties = { +- 'entry': setting, +- 'category': category, +- 'action': self.config[category]['settings' +- ][setting]['action'], +- 'value': self.config[category]['settings' +- ][setting]['value'], +- 'typ': self.config[category]['settings' +- ][setting]['typ'], +- } +- +- if 'InfoText' in self.config[category]['settings' +- ][setting]: +- dictProperties['InfoText'] = \ +- self.oe._(self.config[category]['settings' +- ][setting]['InfoText']) +- +- if 'validate' in self.config[category]['settings' +- ][setting]: +- dictProperties['validate'] = \ +- self.config[category]['settings' +- ][setting]['validate'] +- +- if 'values' in self.config[category]['settings' +- ][setting]: +- if len(self.config[category]['settings' +- ][setting]['values']) > 0: +- dictProperties['values'] = \ +- ','.join(self.config[category]['settings' +- ][setting]['values']) +- +- if not 'parent' in self.config[category]['settings' +- ][setting]: +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.config[category]['settings' +- ][setting]['name']), dictProperties, +- focusItem.getProperty('listTyp')) +- else: +- +- if self.config[category]['settings' +- ][self.config[category]['settings' +- ][setting]['parent']['entry']]['value' +- ] in self.config[category]['settings' +- ][setting]['parent']['value']: +- +- self.oe.winOeMain.addConfigItem(self.oe._(self.config[category]['settings' +- ][setting]['name']), +- dictProperties, +- focusItem.getProperty('listTyp')) +- +- self.oe.winOeMain.getControl(self.oe.winOeMain.guiList).selectItem(selectedPos) +- ++ self.oe.winOeMain.build_menu(self.struct) ++ + self.oe.dbg_log('system::load_menu', 'exit_function', 0) + except Exception, e: + +@@ -477,7 +428,7 @@ def set_value(self, listItem): + + self.oe.dbg_log('system::set_value', 'enter_function', 0) + +- self.config[listItem.getProperty('category')]['settings' ++ self.struct[listItem.getProperty('category')]['settings' + ][listItem.getProperty('entry')]['value'] = \ + listItem.getProperty('value') + +@@ -504,34 +455,34 @@ def set_keyboard_layout(self, listItem=None): + if self.keyboard_layouts == True: + + self.oe.dbg_log('system::set_keyboard_layout', +- unicode(self.config['keyboard']['settings' ++ unicode(self.struct['keyboard']['settings' + ]['KeyboardLayout1']['value']) + ',' +- + unicode(self.config['keyboard']['settings' ++ + unicode(self.struct['keyboard']['settings' + ]['KeyboardLayout2']['value']) + ' ' +- + '-model ' + unicode(self.config['keyboard' ++ + '-model ' + unicode(self.struct['keyboard' + ]['settings']['KeyboardType']['value']), 1) + + if not os.path.exists(os.path.dirname(self.udev_keyboard_file)): + os.makedirs(os.path.dirname(self.udev_keyboard_file)) + + config_file = open(self.udev_keyboard_file, 'w') +- config_file.write('XKBMODEL="' + self.config['keyboard' ++ config_file.write('XKBMODEL="' + self.struct['keyboard' + ]['settings']['KeyboardType']['value'] + + '"\n') + config_file.write('XKBVARIANT=""\n') +- config_file.write('XKBLAYOUT="' + self.config['keyboard' ++ config_file.write('XKBLAYOUT="' + self.struct['keyboard' + ]['settings']['KeyboardLayout1']['value'] +- + ',' + self.config['keyboard']['settings' ++ + ',' + self.struct['keyboard']['settings' + ]['KeyboardLayout2']['value'] + '"\n') + config_file.write('XKBOPTIONS="grp:alt_shift_toggle"\n') + config_file.close() + + parameters = ['-display ' + os.environ['DISPLAY'], +- '-layout ' + self.config['keyboard' ++ '-layout ' + self.struct['keyboard' + ]['settings']['KeyboardLayout1']['value'] +- + ',' + self.config['keyboard']['settings' ++ + ',' + self.struct['keyboard']['settings' + ]['KeyboardLayout2']['value'], '-model ' +- + unicode(self.config['keyboard']['settings' ++ + unicode(self.struct['keyboard']['settings' + ]['KeyboardType']['value']), + '-option "grp:alt_shift_toggle"'] + +@@ -541,10 +492,10 @@ def set_keyboard_layout(self, listItem=None): + elif self.rpi_keyboard_layouts == True: + + self.oe.dbg_log('system::set_keyboard_layout', +- unicode(self.config['keyboard']['settings' ++ unicode(self.struct['keyboard']['settings' + ]['KeyboardLayout1']['value']) , 1) + +- parameter = self.config['keyboard' ++ parameter = self.struct['keyboard' + ]['settings']['KeyboardLayout1']['value'] + + command = 'loadkmap < `ls -1 %s/*/%s.bmap`' % (self.rpi_keyboard_info, parameter) +@@ -577,21 +528,21 @@ def set_hostname(self, listItem=None): + if not listItem == None: + self.set_value(listItem) + +- if not self.config['ident']['settings']['hostname']['value' +- ] is None and not self.config['ident']['settings' ++ if not self.struct['ident']['settings']['hostname']['value' ++ ] is None and not self.struct['ident']['settings' + ]['hostname']['value'] == '': + + self.oe.dbg_log('system::set_hostname', +- self.config['ident']['settings' ++ self.struct['ident']['settings' + ]['hostname']['value'], 1) + + hostname = open('/proc/sys/kernel/hostname', 'w') +- hostname.write(self.config['ident']['settings' ++ hostname.write(self.struct['ident']['settings' + ]['hostname']['value']) + hostname.close() + + hostname = open('%s/hostname' % self.oe.CONFIG_CACHE, 'w') +- hostname.write(self.config['ident']['settings' ++ hostname.write(self.struct['ident']['settings' + ]['hostname']['value']) + hostname.close() + +@@ -605,7 +556,7 @@ def set_hostname(self, listItem=None): + user_hosts.close() + + hosts.write('127.0.0.1\tlocalhost %s\n' +- % self.config['ident']['settings' ++ % self.struct['ident']['settings' + ]['hostname']['value']) + hosts.close() + else: +@@ -637,16 +588,16 @@ def set_lcd_driver(self, listItem=None): + else: + lcd_config_file = '/etc/LCDd.conf' + +- if not self.config['driver']['settings']['lcd']['value'] \ +- is None and not self.config['driver']['settings']['lcd' ++ if not self.struct['driver']['settings']['lcd']['value'] \ ++ is None and not self.struct['driver']['settings']['lcd' + ]['value'] == 'none': + + self.oe.dbg_log('system::set_lcd_driver', +- self.config['driver']['settings']['lcd' ++ self.struct['driver']['settings']['lcd' + ]['value'], 1) + + parameters = ['-c ' + lcd_config_file, '-d ' +- + self.config['driver']['settings']['lcd' ++ + self.struct['driver']['settings']['lcd' + ]['value'], '-s true'] + + os.system('killall LCDd') +@@ -679,13 +630,13 @@ def set_hdd_standby(self, listItem=None): + if not listItem == None: + self.set_value(listItem) + +- if self.config['power']['settings']['hdd_standby']['value'] \ +- != None and self.config['power']['settings' ++ if self.struct['power']['settings']['hdd_standby']['value'] \ ++ != None and self.struct['power']['settings' + ]['hdd_standby']['value'] != '0' \ +- and self.config['power']['settings' ++ and self.struct['power']['settings' + ]['enable_hdd_standby']['value'] == '1': + +- value = int(self.config['power']['settings' ++ value = int(self.struct['power']['settings' + ]['hdd_standby']['value']) #* 12 + + #find system hdd +@@ -765,15 +716,17 @@ def set_auto_update(self, listItem=None): + if not listItem == None: + self.set_value(listItem) + +- if not hasattr(self, 'update_thread'): +- self.update_thread = updateThread(self.oe) +- self.update_thread.start() +- else: +- self.update_thread.wait_evt.set() ++ if not hasattr(self, 'update_disabled'): ++ ++ if not hasattr(self, 'update_thread'): ++ self.update_thread = updateThread(self.oe) ++ self.update_thread.start() ++ else: ++ self.update_thread.wait_evt.set() + +- self.oe.dbg_log('system::set_auto_update', +- unicode(self.config['update']['settings' +- ]['AutoUpdate']['value']), 1) ++ self.oe.dbg_log('system::set_auto_update', ++ unicode(self.struct['update']['settings' ++ ]['AutoUpdate']['value']), 1) + + self.oe.dbg_log('system::set_auto_update', 'exit_function', + 0) +@@ -913,13 +866,13 @@ def check_updates_v2(self, force=False): + self.update_file = self.download_url_v2 % (update_json['data']['folder'], + update_json['data']['update']) + +- if self.config['update']['settings']['UpdateNotify' ++ if self.struct['update']['settings']['UpdateNotify' + ]['value'] == '1': + xbmc.executebuiltin('Notification(' + + self.oe._(32363).encode('utf-8') + ', ' + + self.oe._(32364).encode('utf-8') + ')') + +- if (self.config['update']['settings']['AutoUpdate']['value' ++ if (self.struct['update']['settings']['AutoUpdate']['value' + ] == 'manual' and force == True): + silent = False + xbmcDialog = xbmcgui.Dialog() +@@ -935,7 +888,7 @@ def check_updates_v2(self, force=False): + self.update_in_progress = True + self.do_autoupdate() + +- if (self.config['update']['settings']['AutoUpdate']['value' ++ if (self.struct['update']['settings']['AutoUpdate']['value' + ] == 'auto' and force == False): + + self.update_in_progress = True +@@ -966,7 +919,7 @@ def do_autoupdate(self, listItem=None, silent=False): + + self.update_file = self.update_file.split('/')[-1] + +- if self.config['update']['settings']['UpdateNotify' ++ if self.struct['update']['settings']['UpdateNotify' + ]['value'] == '1': + xbmc.executebuiltin('Notification(' + + self.oe._(32363) + ', ' +@@ -981,7 +934,7 @@ def do_autoupdate(self, listItem=None, silent=False): + self.temp_folder + 'oe_update/', silent) \ + == 1: + +- if self.config['update']['settings' ++ if self.struct['update']['settings' + ]['UpdateNotify']['value'] == '1': + xbmc.executebuiltin('Notification(' + + self.oe._(32363) + ', ' +@@ -1281,7 +1234,7 @@ def do_wizard(self): + self.oe.winOeMain.set_wizard_title(self.oe._(32003)) + self.oe.winOeMain.set_wizard_text(self.oe._(32304)) + self.oe.winOeMain.set_wizard_button_title(self.oe._(32308)) +- self.oe.winOeMain.set_wizard_button_1(self.config['ident' ++ self.oe.winOeMain.set_wizard_button_1(self.struct['ident' + ]['settings']['hostname']['value'], self, + 'wizard_set_hostname') + +@@ -1297,7 +1250,7 @@ def wizard_set_hostname(self): + self.oe.dbg_log('system::wizard_set_hostname', + 'enter_function', 0) + +- currentHostname = self.config['ident']['settings' ++ currentHostname = self.struct['ident']['settings' + ]['hostname']['value'] + + xbmcKeyboard = xbmc.Keyboard(currentHostname) +@@ -1307,7 +1260,7 @@ def wizard_set_hostname(self): + + if xbmcKeyboard.isConfirmed(): + result_is_valid = True +- validate_string = self.config['ident']['settings' ++ validate_string = self.struct['ident']['settings' + ]['hostname']['validate'] + if validate_string != '': + if not re.search(validate_string, +@@ -1317,13 +1270,13 @@ def wizard_set_hostname(self): + result_is_valid = True + + if xbmcKeyboard.isConfirmed(): +- self.config['ident']['settings']['hostname']['value'] = \ ++ self.struct['ident']['settings']['hostname']['value'] = \ + xbmcKeyboard.getText() + self.set_hostname() +- self.oe.winOeMain.getControl(1401).setLabel(self.config['ident' ++ self.oe.winOeMain.getControl(1401).setLabel(self.struct['ident' + ]['settings']['hostname']['value']) + self.oe.write_setting('system', 'hostname', +- self.config['ident']['settings']['hostname' ++ self.struct['ident']['settings']['hostname' + ]['value']) + + self.oe.dbg_log('system::wizard_set_hostname', +diff --git a/resources/lib/oeWindows.py b/resources/lib/oeWindows.py +index ea33749..8f23699 100755 +--- a/resources/lib/oeWindows.py ++++ b/resources/lib/oeWindows.py +@@ -85,25 +85,26 @@ def onInit(self): + self.oe.dictModules[x].menu.keys()): + + self.oe.dbg_log('init module', strModule, 0) +- if hasattr(self.oe.dictModules[strModule], 'do_init'): +- Thread(target=self.oe.dictModules[strModule].do_init(), +- args=()).start() +- +- for men in self.oe.dictModules[strModule].menu: +- dictProperties = {'modul': strModule, +- 'listTyp': self.oe.listObject[self.oe.dictModules[strModule].menu[men]['listTyp' +- ]], +- 'menuLoader': self.oe.dictModules[strModule].menu[men]['menuLoader' +- ]} +- +- if 'InfoText' \ +- in self.oe.dictModules[strModule].menu[men]: +- dictProperties['InfoText'] = \ +- self.oe._(self.oe.dictModules[strModule].menu[men]['InfoText' +- ]) +- +- self.addMenuItem(self.oe.dictModules[strModule].menu[men]['name' +- ], dictProperties) ++ if self.oe.dictModules[strModule].enabled: ++ if hasattr(self.oe.dictModules[strModule], 'do_init'): ++ Thread(target=self.oe.dictModules[strModule].do_init(), ++ args=()).start() ++ ++ for men in self.oe.dictModules[strModule].menu: ++ dictProperties = {'modul': strModule, ++ 'listTyp': self.oe.listObject[self.oe.dictModules[strModule].menu[men]['listTyp' ++ ]], ++ 'menuLoader': self.oe.dictModules[strModule].menu[men]['menuLoader' ++ ]} ++ ++ if 'InfoText' \ ++ in self.oe.dictModules[strModule].menu[men]: ++ dictProperties['InfoText'] = \ ++ self.oe._(self.oe.dictModules[strModule].menu[men]['InfoText' ++ ]) ++ ++ self.addMenuItem(self.oe.dictModules[strModule].menu[men]['name' ++ ], dictProperties) + + self.setFocusId(self.guiMenList) + self.onFocus(self.guiMenList) +@@ -155,6 +156,76 @@ def addConfigItem( + self.oe.dbg_log('oeWindows.mainWindow::addConfigItem(' + + strName + ')', 'ERROR: (' + repr(e) + ')') + ++ def build_menu(self, struct, fltr=[], optional='0'): ++ ++ try: ++ ++ for category in sorted(struct, key=lambda x: struct[x]['order']): ++ ++ if not 'hidden' in struct[category]: ++ ++ if fltr == []: ++ self.addConfigItem(self.oe._(struct[category]['name' ++ ]), {'typ': 'separator'}, 1100) ++ ++ else: ++ if category not in fltr: ++ continue ++ ++ for entry in sorted(struct[category]['settings'], ++ key=lambda x: struct[category]['settings' ++ ][x]['order']): ++ ++ setting = struct[category]['settings'][entry] ++ ++ if not 'hidden' in setting: ++ ++ dictProperties = { ++ 'value': setting['value'], ++ 'typ': setting['type'], ++ 'entry': entry, ++ 'category': category, ++ 'action': setting['action'], ++ } ++ ++ if 'InfoText' in setting: ++ dictProperties['InfoText'] = \ ++ self.oe._(setting['InfoText']) ++ ++ if 'validate' in setting: ++ dictProperties['validate'] = \ ++ setting['validate'] ++ ++ if 'values' in setting: ++ dictProperties['values'] = \ ++ ','.join(setting['values']) ++ ++ if isinstance(setting['name'], basestring): ++ name = setting['name'] ++ else: ++ name = self.oe._(setting['name']) ++ ++ if not 'parent' in setting: ++ ++ self.addConfigItem(name, ++ dictProperties, ++ 1100) ++ else: ++ ++ if struct[category]['settings' ++ ][setting['parent']['entry']]['value' ++ ] in setting['parent']['value']: ++ ++ if not 'optional' in setting or \ ++ ('optional' in setting and optional != '0'): ++ self.addConfigItem(name, ++ dictProperties, ++ 1100) ++ ++ except Exception, e: ++ ++ self.oe.dbg_log('oeWindows.mainWindow::build_menu', 'ERROR: (' + repr(e) + ')') ++ + def showButton( + self, + number, +diff --git a/resources/skins/Default/720p/mainWindow.xml b/resources/skins/Default/720p/mainWindow.xml +index a632515..dc035ce 100755 +--- a/resources/skins/Default/720p/mainWindow.xml ++++ b/resources/skins/Default/720p/mainWindow.xml +@@ -371,7 +371,7 @@ + FF757677 + white + ListItem.Property(value) +- !StringCompare(ListItem.Property(Typ), bool) ++ !StringCompare(ListItem.Property(Typ), bool) + !StringCompare(ListItem.Property(Typ), button) + + + +@@ -442,7 +442,7 @@ + 2 + 796 + 38 +- Control.HasFocus(1100) ++ Control.HasFocus(1100) + button-focus2.png + + +@@ -452,7 +452,7 @@ + 20 + white + ListItem.Label +- true ++ true + + + right +@@ -462,7 +462,7 @@ + 20 + white + ListItem.Property(value) +- !StringCompare(ListItem.Property(Typ), bool) ++ !StringCompare(ListItem.Property(Typ), bool) + !StringCompare(ListItem.Property(Typ), button) + + + +-- +1.8.1.6 + + +From 555b10b6bb53088aeaeab8c90e122e00e4187a87 Mon Sep 17 00:00:00 2001 +From: lfiebach +Date: Fri, 2 Aug 2013 17:56:23 +0200 +Subject: [PATCH 3/3] fix wizard + +--- + addon.xml | 2 +- + changelog.txt | 3 +++ + resources/lib/modules/services.py | 2 +- + resources/lib/oeWindows.py | 8 ++++---- + 4 files changed, 9 insertions(+), 6 deletions(-) + +diff --git a/addon.xml b/addon.xml +index c130660..f9741f3 100755 +--- a/addon.xml ++++ b/addon.xml +@@ -1,7 +1,7 @@ + + + + +diff --git a/changelog.txt b/changelog.txt +index a83a37d..eb50d6f 100755 +--- a/changelog.txt ++++ b/changelog.txt +@@ -1,3 +1,6 @@ ++2013-08-02 v0.1.32 ++ (fix) wizard fail after menu redesign ++ + 2013-07-29 v0.1.31 + (change) menu loader redesign + (fix) kill update thread on exit +diff --git a/resources/lib/modules/services.py b/resources/lib/modules/services.py +index 8cd68dd..37aa0c5 100755 +--- a/resources/lib/modules/services.py ++++ b/resources/lib/modules/services.py +@@ -859,7 +859,7 @@ def set_wizard_buttons(self): + self.oe.winOeMain.set_wizard_radiobutton_1(self.oe._(32201), + self, 'wizard_set_ssh') + +- if hasattr(self, 'samba'): ++ if not 'hidden' in self.struct['samba']: + if self.struct['samba']['settings']['samba_autostart' + ]['value'] == '1': + self.oe.winOeMain.set_wizard_radiobutton_2(self.oe._(32200), +diff --git a/resources/lib/oeWindows.py b/resources/lib/oeWindows.py +index 8f23699..10cd60b 100755 +--- a/resources/lib/oeWindows.py ++++ b/resources/lib/oeWindows.py +@@ -1180,7 +1180,7 @@ def get_keyboard_layout(self): + try: + + current_layout = self.oe.dictModules['system' +- ].config['keyboard']['settings']['KeyboardLayout1' ++ ].struct['keyboard']['settings']['KeyboardLayout1' + ]['value'] + + return current_layout +@@ -1196,16 +1196,16 @@ def select_keyboard(self): + select_window = selectWindow('selectWindow.xml', + self.oe.__cwd__, 'Default', oeMain=self.oe) + select_window.defaultValue = self.oe.dictModules['system' +- ].config['keyboard']['settings']['KeyboardLayout1' ++ ].struct['keyboard']['settings']['KeyboardLayout1' + ]['value'] + select_window.availValues = \ +- ','.join(self.oe.dictModules['system'].config['keyboard' ++ ','.join(self.oe.dictModules['system'].struct['keyboard' + ]['settings']['KeyboardLayout1']['values']) + self.oe.set_busy(0) + select_window.doModal() + + if select_window.defaultValue != select_window.result: +- self.oe.dictModules['system'].config['keyboard' ++ self.oe.dictModules['system'].struct['keyboard' + ]['settings']['KeyboardLayout1']['value'] = \ + select_window.result + self.oe.write_setting('system', 'KeyboardLayout1', +-- +1.8.1.6 + diff --git a/packages/mediacenter/service.openelec.settings/unpack b/packages/mediacenter/service.openelec.settings/unpack index 09ae905c23..6c5b6426b7 100755 --- a/packages/mediacenter/service.openelec.settings/unpack +++ b/packages/mediacenter/service.openelec.settings/unpack @@ -27,3 +27,10 @@ ZIP_PKG="`echo $PKG_URL | sed 's%.*/\(.*\)$%\1%'`" mkdir -p $BUILD/${PKG_NAME}-${PKG_VERSION} unzip $SOURCES/$1/$ZIP_PKG -d $BUILD/${PKG_NAME}-${PKG_VERSION} >/dev/null 2>&1 + +echo "### Applying upstream patches ###" + +for patch in `ls $PKG_DIR/patches.upstream/*.patch`; do + cat $patch | patch -d \ + `echo $BUILD/$PKG_NAME-$PKG_VERSION | cut -f1 -d\ ` -p1 +done From 1f41a1541edecf2cd02964221e6dd817850b1de6 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Fri, 2 Aug 2013 18:23:21 +0200 Subject: [PATCH 071/103] xbmc: update to xbmc-13.alpha-6edea14 Signed-off-by: Stephan Raue --- .../mediacenter/xbmc-theme-Confluence/meta | 2 +- packages/mediacenter/xbmc/package.mk | 2 +- ...1-texturepacker-hostflags-and-rework.patch | 0 ...HONOPTIMIZE_with_external_Python-0.1.patch | 0 ...bmc-453-add_openelec.tv_RSS_news-0.1.patch | 0 ...add_as.xml_busy_dialog_delay_control.patch | 57 + ...s-mark_our_wrapped_functions_as_used.patch | 0 .../xbmc-995.01-xvba_support-8fdcc86.patch} | 9673 +---------------- .../xbmc-995.10-disable-alt-tab.patch | 0 .../xbmc-999.02-rpipower.patch | 113 + ...add_as.xml_busy_dialog_delay_control.patch | 57 - .../f68634b/xbmc-999.01-automake-1.13.patch | 12 - 12 files changed, 703 insertions(+), 9213 deletions(-) rename packages/mediacenter/xbmc/patches/{f68634b => 13.alpha-6edea14}/xbmc-321-texturepacker-hostflags-and-rework.patch (100%) rename packages/mediacenter/xbmc/patches/{f68634b => 13.alpha-6edea14}/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{f68634b => 13.alpha-6edea14}/xbmc-453-add_openelec.tv_RSS_news-0.1.patch (100%) create mode 100644 packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-602-add_as.xml_busy_dialog_delay_control.patch rename packages/mediacenter/xbmc/patches/{f68634b => 13.alpha-6edea14}/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch (100%) rename packages/mediacenter/xbmc/patches/{f68634b/xbmc-995.01-xvba_support-275709a.patch => 13.alpha-6edea14/xbmc-995.01-xvba_support-8fdcc86.patch} (67%) rename packages/mediacenter/xbmc/patches/{f68634b => 13.alpha-6edea14}/xbmc-995.10-disable-alt-tab.patch (100%) create mode 100644 packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-999.02-rpipower.patch delete mode 100644 packages/mediacenter/xbmc/patches/f68634b/xbmc-602-add_as.xml_busy_dialog_delay_control.patch delete mode 100644 packages/mediacenter/xbmc/patches/f68634b/xbmc-999.01-automake-1.13.patch diff --git a/packages/mediacenter/xbmc-theme-Confluence/meta b/packages/mediacenter/xbmc-theme-Confluence/meta index 21be4b1a06..dda2ba3f0c 100644 --- a/packages/mediacenter/xbmc-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-theme-Confluence/meta @@ -21,7 +21,7 @@ PKG_NAME="xbmc-theme-Confluence" PKG_VERSION="12.2-e40d13d" if [ "$XBMC" = "master" ]; then - PKG_VERSION="f68634b" + PKG_VERSION="13.alpha-6edea14" elif [ "$XBMC" = "xbmc-aml" ]; then PKG_VERSION="aml-frodo-d9119f2" fi diff --git a/packages/mediacenter/xbmc/package.mk b/packages/mediacenter/xbmc/package.mk index eae61d8fa0..76a23924a2 100644 --- a/packages/mediacenter/xbmc/package.mk +++ b/packages/mediacenter/xbmc/package.mk @@ -21,7 +21,7 @@ PKG_NAME="xbmc" PKG_VERSION="12.2-e40d13d" if [ "$XBMC" = "master" ]; then - PKG_VERSION="f68634b" + PKG_VERSION="13.alpha-6edea14" elif [ "$XBMC" = "xbmc-aml" ]; then PKG_VERSION="aml-frodo-d9119f2" fi diff --git a/packages/mediacenter/xbmc/patches/f68634b/xbmc-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-321-texturepacker-hostflags-and-rework.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/f68634b/xbmc-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-321-texturepacker-hostflags-and-rework.patch diff --git a/packages/mediacenter/xbmc/patches/f68634b/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/f68634b/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/f68634b/xbmc-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/f68634b/xbmc-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-602-add_as.xml_busy_dialog_delay_control.patch b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-602-add_as.xml_busy_dialog_delay_control.patch new file mode 100644 index 0000000000..88807638f3 --- /dev/null +++ b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-602-add_as.xml_busy_dialog_delay_control.patch @@ -0,0 +1,57 @@ +diff -Naur xbmc-13.alpha-6edea14/xbmc/cores/dvdplayer/DVDPlayer.cpp xbmc-13.alpha-6edea14.patch/xbmc/cores/dvdplayer/DVDPlayer.cpp +--- xbmc-13.alpha-6edea14/xbmc/cores/dvdplayer/DVDPlayer.cpp 2013-08-02 16:28:51.000000000 +0200 ++++ xbmc-13.alpha-6edea14.patch/xbmc/cores/dvdplayer/DVDPlayer.cpp 2013-08-02 17:19:34.162512140 +0200 +@@ -479,7 +479,7 @@ + #endif + + Create(); +- if(!m_ready.WaitMSec(100)) ++ if(!m_ready.WaitMSec(g_advancedSettings.m_videoBusyDialogDelay_ms)) + { + CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); + if(dialog) +diff -Naur xbmc-13.alpha-6edea14/xbmc/cores/omxplayer/OMXPlayer.cpp xbmc-13.alpha-6edea14.patch/xbmc/cores/omxplayer/OMXPlayer.cpp +--- xbmc-13.alpha-6edea14/xbmc/cores/omxplayer/OMXPlayer.cpp 2013-08-02 16:28:51.000000000 +0200 ++++ xbmc-13.alpha-6edea14.patch/xbmc/cores/omxplayer/OMXPlayer.cpp 2013-08-02 17:19:34.164512143 +0200 +@@ -522,7 +522,7 @@ + #endif + + Create(); +- if(!m_ready.WaitMSec(100)) ++ if(!m_ready.WaitMSec(g_advancedSettings.m_videoBusyDialogDelay_ms)) + { + CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); + if(dialog) +diff -Naur xbmc-13.alpha-6edea14/xbmc/settings/AdvancedSettings.cpp xbmc-13.alpha-6edea14.patch/xbmc/settings/AdvancedSettings.cpp +--- xbmc-13.alpha-6edea14/xbmc/settings/AdvancedSettings.cpp 2013-08-02 16:28:51.000000000 +0200 ++++ xbmc-13.alpha-6edea14.patch/xbmc/settings/AdvancedSettings.cpp 2013-08-02 17:21:43.772739525 +0200 +@@ -184,6 +184,7 @@ + + m_videoDefaultLatency = 0.0; + m_videoDisableHi10pMultithreading = false; ++ m_videoBusyDialogDelay_ms = 100; + + m_musicUseTimeSeeking = true; + m_musicTimeSeekForward = 10; +@@ -700,6 +701,10 @@ + //0 = disable fps detect, 1 = only detect on timestamps with uniform spacing, 2 detect on all timestamps + XMLUtils::GetInt(pElement, "fpsdetect", m_videoFpsDetect, 0, 2); + ++ // controls the delay, in milliseconds, until ++ // the busy dialog is shown when starting video playback. ++ XMLUtils::GetInt(pElement, "busydialogdelayms", m_videoBusyDialogDelay_ms, 0, 1000); ++ + // Store global display latency settings + TiXmlElement* pVideoLatency = pElement->FirstChildElement("latency"); + if (pVideoLatency) +diff -Naur xbmc-13.alpha-6edea14/xbmc/settings/AdvancedSettings.h xbmc-13.alpha-6edea14.patch/xbmc/settings/AdvancedSettings.h +--- xbmc-13.alpha-6edea14/xbmc/settings/AdvancedSettings.h 2013-08-02 16:28:51.000000000 +0200 ++++ xbmc-13.alpha-6edea14.patch/xbmc/settings/AdvancedSettings.h 2013-08-02 17:21:29.790714897 +0200 +@@ -190,6 +190,7 @@ + bool m_DXVANoDeintProcForProgressive; + int m_videoFpsDetect; + bool m_videoDisableHi10pMultithreading; ++ int m_videoBusyDialogDelay_ms; + StagefrightConfig m_stagefrightConfig; + + CStdString m_videoDefaultPlayer; diff --git a/packages/mediacenter/xbmc/patches/f68634b/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/f68634b/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch rename to packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch diff --git a/packages/mediacenter/xbmc/patches/f68634b/xbmc-995.01-xvba_support-275709a.patch b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-995.01-xvba_support-8fdcc86.patch similarity index 67% rename from packages/mediacenter/xbmc/patches/f68634b/xbmc-995.01-xvba_support-275709a.patch rename to packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-995.01-xvba_support-8fdcc86.patch index c74fde3051..24c5392f3c 100644 --- a/packages/mediacenter/xbmc/patches/f68634b/xbmc-995.01-xvba_support-275709a.patch +++ b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-995.01-xvba_support-8fdcc86.patch @@ -1,8625 +1,7 @@ -From d1437bb713c416176489385d0575281eb3f09ff2 Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Mon, 15 Apr 2013 20:27:39 +0200 -Subject: [PATCH 001/136] AE: Start of planar format internally - ---- - xbmc/cores/AudioEngine/AEAudioFormat.h | 7 +++++++ - xbmc/cores/AudioEngine/Utils/AEUtil.cpp | 14 ++++++++++++++ - 2 files changed, 21 insertions(+) - -diff --git a/xbmc/cores/AudioEngine/AEAudioFormat.h b/xbmc/cores/AudioEngine/AEAudioFormat.h -index 369811c..64be36f 100644 ---- a/xbmc/cores/AudioEngine/AEAudioFormat.h -+++ b/xbmc/cores/AudioEngine/AEAudioFormat.h -@@ -31,26 +31,33 @@ enum AEDataFormat - AE_FMT_INVALID = -1, - - AE_FMT_U8, -+ AE_FMT_U8P, - AE_FMT_S8, - - AE_FMT_S16BE, - AE_FMT_S16LE, - AE_FMT_S16NE, -+ AE_FMT_S16NEP, - - AE_FMT_S32BE, - AE_FMT_S32LE, - AE_FMT_S32NE, -+ AE_FMT_S32NEP, - - AE_FMT_S24BE4, - AE_FMT_S24LE4, - AE_FMT_S24NE4, /* S24 in 4 bytes */ -+ AE_FMT_S24NE4P, - - AE_FMT_S24BE3, - AE_FMT_S24LE3, - AE_FMT_S24NE3, /* S24 in 3 bytes */ -+ AE_FMT_S24NE3P, - - AE_FMT_DOUBLE, -+ AE_FMT_DOUBLEP, - AE_FMT_FLOAT, -+ AE_FMT_FLOATP, - - /* Bitstream formats */ - AE_FMT_AAC, -diff --git a/xbmc/cores/AudioEngine/Utils/AEUtil.cpp b/xbmc/cores/AudioEngine/Utils/AEUtil.cpp -index 2b6e0cd..3a5c78f 100644 ---- a/xbmc/cores/AudioEngine/Utils/AEUtil.cpp -+++ b/xbmc/cores/AudioEngine/Utils/AEUtil.cpp -@@ -82,26 +82,33 @@ const unsigned int CAEUtil::DataFormatToBits(const enum AEDataFormat dataFormat) - static const unsigned int formats[AE_FMT_MAX] = - { - 8, /* U8 */ -+ 8, /* U8P */ - 8, /* S8 */ - - 16, /* S16BE */ - 16, /* S16LE */ - 16, /* S16NE */ -+ 16, /* S16NEP */ - - 32, /* S32BE */ - 32, /* S32LE */ - 32, /* S32NE */ -+ 32, /* S32NEP */ - - 32, /* S24BE */ - 32, /* S24LE */ - 32, /* S24NE */ -+ 32, /* S24NEP */ - - 24, /* S24BE3 */ - 24, /* S24LE3 */ - 24, /* S24NE3 */ -+ 24, /* S24NE3P*/ - - sizeof(double) << 3, /* DOUBLE */ -+ sizeof(double) << 3, /* DOUBLEP */ - sizeof(float ) << 3, /* FLOAT */ -+ sizeof(float ) << 3, /* FLOATP */ - - 16, /* AAC */ - 16, /* AC3 */ -@@ -123,26 +130,33 @@ const char* CAEUtil::DataFormatToStr(const enum AEDataFormat dataFormat) - static const char *formats[AE_FMT_MAX] = - { - "AE_FMT_U8", -+ "AE_FMT_U8P", - "AE_FMT_S8", - - "AE_FMT_S16BE", - "AE_FMT_S16LE", - "AE_FMT_S16NE", -+ "AE_FMT_S16NEP", - - "AE_FMT_S32BE", - "AE_FMT_S32LE", - "AE_FMT_S32NE", -+ "AE_FMT_S32NEP", - - "AE_FMT_S24BE4", - "AE_FMT_S24LE4", - "AE_FMT_S24NE4", /* S24 in 4 bytes */ -+ "AE_FMT_S24NE4P", - - "AE_FMT_S24BE3", - "AE_FMT_S24LE3", - "AE_FMT_S24NE3", /* S24 in 3 bytes */ -+ "AE_FMT_S24NE3P", - - "AE_FMT_DOUBLE", -+ "AE_FMT_DOUBLEP", - "AE_FMT_FLOAT", -+ "AE_FMT_FLOATP", - - /* for passthrough streams and the like */ - "AE_FMT_AAC", --- -1.8.1.6 - - -From 321beb78c4833da8de29c3aabd1a37f063a18202 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Fri, 31 May 2013 16:28:30 +0200 -Subject: [PATCH 002/136] AE: register callback for all audio settings - ---- - xbmc/settings/Settings.cpp | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp -index b5fd369..d8f6889 100644 ---- a/xbmc/settings/Settings.cpp -+++ b/xbmc/settings/Settings.cpp -@@ -840,8 +840,18 @@ void CSettings::InitializeISettingCallbacks() - m_settingsManager->RegisterCallback(&CDisplaySettings::Get(), settingSet); - - settingSet.clear(); -+ settingSet.insert("audiooutput.mode"); - settingSet.insert("audiooutput.channels"); - settingSet.insert("audiooutput.guisoundmode"); -+ settingSet.insert("audiooutput.stereoupmix"); -+ settingSet.insert("audiooutput.ac3passthrough"); -+ settingSet.insert("audiooutput.dtspassthrough"); -+ settingSet.insert("audiooutput.passthroughaac"); -+ settingSet.insert("audiooutput.truehdpassthrough"); -+ settingSet.insert("audiooutput.dtshdpassthrough"); -+ settingSet.insert("audiooutput.multichannellpcm"); -+ settingSet.insert("audiooutput.audiodevice"); -+ settingSet.insert("audiooutput.passthroughdevice"); - settingSet.insert("lookandfeel.skin"); - settingSet.insert("lookandfeel.skinsettings"); - settingSet.insert("lookandfeel.font"); --- -1.8.1.6 - - -From 1e4ee28403cc9af837352672fc1a3e7bbcc2b69c Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Thu, 23 May 2013 10:05:11 +0200 -Subject: [PATCH 003/136] AESinkALSA: drop unneeded member - ---- - xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp | 11 ++++++----- - xbmc/cores/AudioEngine/Sinks/AESinkALSA.h | 1 - - 2 files changed, 6 insertions(+), 6 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -index 45028d6..decd0bd 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -@@ -131,19 +131,20 @@ void CAESinkALSA::GetAESParams(AEAudioFormat format, std::string& params) - - bool CAESinkALSA::Initialize(AEAudioFormat &format, std::string &device) - { -+ CAEChannelInfo channelLayout; - m_initDevice = device; - m_initFormat = format; - - /* if we are raw, correct the data format */ - if (AE_IS_RAW(format.m_dataFormat)) - { -- m_channelLayout = GetChannelLayout(format); -+ channelLayout = GetChannelLayout(format); - format.m_dataFormat = AE_FMT_S16NE; - m_passthrough = true; - } - else - { -- m_channelLayout = GetChannelLayout(format); -+ channelLayout = GetChannelLayout(format); - m_passthrough = false; - } - #if defined(HAS_AMLPLAYER) || defined(HAS_LIBAMCODEC) -@@ -154,13 +155,13 @@ bool CAESinkALSA::Initialize(AEAudioFormat &format, std::string &device) - } - #endif - -- if (m_channelLayout.Count() == 0) -+ if (channelLayout.Count() == 0) - { - CLog::Log(LOGERROR, "CAESinkALSA::Initialize - Unable to open the requested channel layout"); - return false; - } - -- format.m_channelLayout = m_channelLayout; -+ format.m_channelLayout = channelLayout; - - AEDeviceType devType = AEDeviceTypeFromName(device); - -@@ -176,7 +177,7 @@ bool CAESinkALSA::Initialize(AEAudioFormat &format, std::string &device) - snd_config_t *config; - snd_config_copy(&config, snd_config); - -- if (!OpenPCMDevice(device, AESParams, m_channelLayout.Count(), &m_pcm, config)) -+ if (!OpenPCMDevice(device, AESParams, channelLayout.Count(), &m_pcm, config)) - { - CLog::Log(LOGERROR, "CAESinkALSA::Initialize - failed to initialize device \"%s\"", device.c_str()); - snd_config_delete(config); -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h -index 39e3719..90578b9 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h -@@ -64,7 +64,6 @@ class CAESinkALSA : public IAESink - unsigned int m_bufferSize; - double m_formatSampleRateMul; - bool m_passthrough; -- CAEChannelInfo m_channelLayout; - std::string m_device; - snd_pcm_t *m_pcm; - int m_timeout; --- -1.8.1.6 - - -From 8982a8ef935bec12899a07745bf4d049bc066499 Mon Sep 17 00:00:00 2001 -From: xbmc -Date: Sat, 27 Apr 2013 10:47:01 +0200 -Subject: [PATCH 004/136] ffmpeg: add methods to the interface needed for - resampling - ---- - lib/DllAvUtil.h | 14 ++++++++++++++ - lib/DllSwResample.h | 15 +++++++++++++++ - 2 files changed, 29 insertions(+) - -diff --git a/lib/DllAvUtil.h b/lib/DllAvUtil.h -index 1afee5e..bbe9be2 100644 ---- a/lib/DllAvUtil.h -+++ b/lib/DllAvUtil.h -@@ -95,6 +95,9 @@ class DllAvUtilInterface - virtual void av_dict_free(AVDictionary **pm) = 0; - virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) = 0; - virtual int64_t av_get_default_channel_layout(int nb_channels)=0; -+ virtual int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) = 0; -+ virtual int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt) = 0; -+ virtual int av_get_channel_layout_channel_index (uint64_t channel_layout, uint64_t channel) = 0; - }; - - #if defined (USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) -@@ -133,6 +136,10 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface - virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) - { return ::av_samples_get_buffer_size(linesize, nb_channels, nb_samples, sample_fmt, align); } - virtual int64_t av_get_default_channel_layout(int nb_channels) { return ::av_get_default_channel_layout(nb_channels); } -+ virtual int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) -+ { return ::av_samples_alloc(audio_data, linesize, nb_channels, nb_samples, sample_fmt, align); } -+ virtual int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt) { return ::av_sample_fmt_is_planar(sample_fmt); } -+ virtual int av_get_channel_layout_channel_index (uint64_t channel_layout, uint64_t channel) { return ::av_get_channel_layout_channel_index(channel_layout, channel); } - - // DLL faking. - virtual bool ResolveExports() { return true; } -@@ -178,6 +185,9 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface - DEFINE_METHOD1(void, av_dict_free, (AVDictionary **p1)); - DEFINE_METHOD5(int, av_samples_get_buffer_size, (int *p1, int p2, int p3, enum AVSampleFormat p4, int p5)) - DEFINE_METHOD1(int64_t, av_get_default_channel_layout, (int p1)) -+ DEFINE_METHOD6(int, av_samples_alloc, (uint8_t **p1, int *p2, int p3, int p4, enum AVSampleFormat p5, int p6)) -+ DEFINE_METHOD1(int, av_sample_fmt_is_planar, (enum AVSampleFormat p1)) -+ DEFINE_METHOD2(int, av_get_channel_layout_channel_index, (uint64_t p1, uint64_t p2)) - - public: - BEGIN_METHOD_RESOLVE() -@@ -206,6 +216,10 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface - RESOLVE_METHOD(av_dict_free) - RESOLVE_METHOD(av_samples_get_buffer_size) - RESOLVE_METHOD(av_get_default_channel_layout) -+ RESOLVE_METHOD(av_samples_alloc) -+ RESOLVE_METHOD(av_sample_fmt_is_planar) -+ RESOLVE_METHOD(av_get_channel_layout_channel_index) -+ - END_METHOD_RESOLVE() - }; - -diff --git a/lib/DllSwResample.h b/lib/DllSwResample.h -index e9613d3..320b3a7 100644 ---- a/lib/DllSwResample.h -+++ b/lib/DllSwResample.h -@@ -60,6 +60,9 @@ class DllSwResampleInterface - virtual int swr_init(struct SwrContext *s)=0; - virtual void swr_free(struct SwrContext **s)=0; - virtual int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in , int in_count)=0; -+ virtual int64_t swr_get_delay(struct SwrContext *s, int64_t base) = 0; -+ virtual int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map) = 0; -+ virtual int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride) = 0; - }; - - #if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) -@@ -84,6 +87,9 @@ class DllSwResample : public DllDynamic, DllSwResampleInterface - virtual int swr_init(struct SwrContext *s) { return ::swr_init(s); } - virtual void swr_free(struct SwrContext **s){ return ::swr_free(s); } - virtual int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in , int in_count){ return ::swr_convert(s, out, out_count, in, in_count); } -+ virtual int64_t swr_get_delay(struct SwrContext *s, int64_t base) { return ::swr_get_delay(s, base); } -+ virtual int swr_set_channel_mapping (struct SwrContext *s, const int *channel_map) { return ::swr_set_channel_mapping(s, channel_map); } -+ virtual int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride) { return ::swr_set_matrix(s, matrix, stride); } - }; - #else - // Wrap the same API through libavresample. -@@ -114,6 +120,9 @@ class DllSwResample : public DllDynamic, DllSwResampleInterface - virtual int swr_init(struct SwrContext *s) { return ::avresample_open(s); } - virtual void swr_free(struct SwrContext **s){ ::avresample_close(*s); *s = NULL; } - virtual int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in , int in_count){ return ::avresample_convert(s, out, 0, out_count, (uint8_t**)in, 0,in_count); } -+ virtual int64_t swr_get_delay(struct SwrContext *s, int64_t base){return ::swr_get_delay(s, base);} -+ virtual int swr_set_channel_mapping (struct SwrContext *s, const int *channel_map){return ::swr_set_channel_mapping(s, channel_map);} -+ virtual int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride) { return ::swr_set_matrix(s, matrix, stride);} - }; - #endif - -@@ -129,12 +138,18 @@ class DllSwResample : public DllDynamic, DllSwResampleInterface - DEFINE_METHOD1(int, swr_init, (struct SwrContext *p1)) - DEFINE_METHOD1(void, swr_free, (struct SwrContext **p1)) - DEFINE_METHOD5(int, swr_convert, (struct SwrContext *p1, uint8_t **p2, int p3, const uint8_t **p4, int p5)) -+ DEFINE_METHOD2(int64_t, swr_get_delay, (struct SwrContext *p1, int64_t p2)) -+ DEFINE_METHOD2(int, swr_set_channel_mapping, (struct SwrContext *p1, const int *p2)) -+ DEFINE_METHOD3(int, swr_set_matrix, (struct SwrContext *p1, const double *p2, int p3)) - - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD(swr_alloc_set_opts) - RESOLVE_METHOD(swr_init) - RESOLVE_METHOD(swr_free) - RESOLVE_METHOD(swr_convert) -+ RESOLVE_METHOD(swr_get_delay) -+ RESOLVE_METHOD(swr_set_channel_mapping) -+ RESOLVE_METHOD(swr_set_matrix) - END_METHOD_RESOLVE() - - /* dependencies of libavformat */ --- -1.8.1.6 - - -From 1e242da24efe796525a07a599dc2527742e400e2 Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Thu, 25 Jul 2013 19:39:44 +0200 -Subject: [PATCH 005/136] ffmpeg: add av_opt_set_int and av_opt_set_double for - intrumenting swr - ---- - lib/DllAvUtil.h | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/lib/DllAvUtil.h b/lib/DllAvUtil.h -index bbe9be2..521263f 100644 ---- a/lib/DllAvUtil.h -+++ b/lib/DllAvUtil.h -@@ -82,6 +82,8 @@ class DllAvUtilInterface - virtual const AVCRC* av_crc_get_table(AVCRCId crc_id)=0; - virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)=0; - virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags)=0; -+ virtual int av_opt_set_double(void *obj, const char *name, double val, int search_flags)=0; -+ virtual int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)=0; - virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) = 0; - virtual void av_fifo_free(AVFifoBuffer *f) = 0; - virtual void av_fifo_reset(AVFifoBuffer *f) = 0; -@@ -119,6 +121,8 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface - virtual const AVCRC* av_crc_get_table(AVCRCId crc_id) { return ::av_crc_get_table(crc_id); } - virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length) { return ::av_crc(ctx, crc, buffer, length); } - virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags) { return ::av_opt_set(obj, name, val, search_flags); } -+ virtual int av_opt_set_double(void *obj, const char *name, double val, int search_flags) { return ::av_opt_set_double(obj, name, val, search_flags); } -+ virtual int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags) { return ::av_opt_set_int(obj, name, val, search_flags); } - virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) {return ::av_fifo_alloc(size); } - virtual void av_fifo_free(AVFifoBuffer *f) { ::av_fifo_free(f); } - virtual void av_fifo_reset(AVFifoBuffer *f) { ::av_fifo_reset(f); } -@@ -172,6 +176,8 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface - DEFINE_METHOD5(int, av_crc_init, (AVCRC *p1, int p2, int p3, uint32_t p4, int p5)); - DEFINE_METHOD4(uint32_t, av_crc, (const AVCRC *p1, uint32_t p2, const uint8_t *p3, size_t p4)); - DEFINE_METHOD4(int, av_opt_set, (void *p1, const char *p2, const char *p3, int p4)); -+ DEFINE_METHOD4(int, av_opt_set_double, (void *p1, const char *p2, double p3, int p4)) -+ DEFINE_METHOD4(int, av_opt_set_int, (void *p1, const char *p2, int64_t p3, int p4)) - DEFINE_METHOD1(AVFifoBuffer*, av_fifo_alloc, (unsigned int p1)) - DEFINE_METHOD1(void, av_fifo_free, (AVFifoBuffer *p1)) - DEFINE_METHOD1(void, av_fifo_reset, (AVFifoBuffer *p1)) -@@ -203,6 +209,8 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface - RESOLVE_METHOD(av_crc_get_table) - RESOLVE_METHOD(av_crc) - RESOLVE_METHOD(av_opt_set) -+ RESOLVE_METHOD(av_opt_set_double) -+ RESOLVE_METHOD(av_opt_set_int) - RESOLVE_METHOD(av_fifo_alloc) - RESOLVE_METHOD(av_fifo_free) - RESOLVE_METHOD(av_fifo_reset) --- -1.8.1.6 - - -From f79f7713184ed00fb019dd00f755f1e182b2c601 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Wed, 26 Jun 2013 15:12:28 +0200 -Subject: [PATCH 006/136] AE: allow encoder to be fed with planar format - ---- - .../cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp | 66 +++++++++++++++++++++- - xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.h | 3 +- - xbmc/cores/AudioEngine/Interfaces/AEEncoder.h | 13 ++++- - 3 files changed, 78 insertions(+), 4 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp b/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp -index ba89868..2f305b1 100644 ---- a/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp -+++ b/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.cpp -@@ -98,7 +98,7 @@ unsigned int CAEEncoderFFmpeg::BuildChannelLayout(const int64_t ffmap, CAEChanne - return layout.Count(); - } - --bool CAEEncoderFFmpeg::Initialize(AEAudioFormat &format) -+bool CAEEncoderFFmpeg::Initialize(AEAudioFormat &format, bool allow_planar_input) - { - Reset(); - -@@ -150,6 +150,7 @@ bool CAEEncoderFFmpeg::Initialize(AEAudioFormat &format) - bool hasS32 = false; - bool hasS16 = false; - bool hasU8 = false; -+ bool hasFloatP = false; - bool hasUnknownFormat = false; - - for(int i = 0; codec->sample_fmts[i] != AV_SAMPLE_FMT_NONE; ++i) -@@ -161,6 +162,12 @@ bool CAEEncoderFFmpeg::Initialize(AEAudioFormat &format) - case AV_SAMPLE_FMT_S32: hasS32 = true; break; - case AV_SAMPLE_FMT_S16: hasS16 = true; break; - case AV_SAMPLE_FMT_U8 : hasU8 = true; break; -+ case AV_SAMPLE_FMT_FLTP: -+ if (allow_planar_input) -+ hasFloatP = true; -+ else -+ hasUnknownFormat = true; -+ break; - case AV_SAMPLE_FMT_NONE: return false; - default: hasUnknownFormat = true; break; - } -@@ -171,6 +178,11 @@ bool CAEEncoderFFmpeg::Initialize(AEAudioFormat &format) - m_CodecCtx->sample_fmt = AV_SAMPLE_FMT_FLT; - format.m_dataFormat = AE_FMT_FLOAT; - } -+ else if (hasFloatP) -+ { -+ m_CodecCtx->sample_fmt = AV_SAMPLE_FMT_FLTP; -+ format.m_dataFormat = AE_FMT_FLOATP; -+ } - else if (hasDouble) - { - m_CodecCtx->sample_fmt = AV_SAMPLE_FMT_DBL; -@@ -214,7 +226,6 @@ bool CAEEncoderFFmpeg::Initialize(AEAudioFormat &format) - return false; - } - -- format.m_dataFormat = AE_FMT_FLOAT; - format.m_frames = m_CodecCtx->frame_size; - format.m_frameSamples = m_CodecCtx->frame_size * m_CodecCtx->channels; - format.m_frameSize = m_CodecCtx->channels * (CAEUtil::DataFormatToBits(format.m_dataFormat) >> 3); -@@ -351,6 +362,57 @@ int CAEEncoderFFmpeg::Encode(float *data, unsigned int frames) - return m_NeededFrames; - } - -+int CAEEncoderFFmpeg::Encode(uint8_t *in, int in_size, uint8_t *out, int out_size) -+{ -+ int got_output; -+ AVFrame *frame; -+ -+ if (!m_CodecCtx) -+ return 0; -+ -+ /* allocate the input frame -+ * sadly, we have to alloc/dealloc it everytime since we have no guarantee the -+ * data argument will be constant over iterated calls and the frame needs to -+ * setup pointers inside data */ -+ frame = m_dllAvCodec.avcodec_alloc_frame(); -+ if (!frame) -+ return 0; -+ -+ frame->nb_samples = m_CodecCtx->frame_size; -+ frame->format = m_CodecCtx->sample_fmt; -+ frame->channel_layout = m_CodecCtx->channel_layout; -+ -+ m_dllAvCodec.avcodec_fill_audio_frame(frame, m_CodecCtx->channels, m_CodecCtx->sample_fmt, -+ in, in_size, 0); -+ -+ /* initialize the output packet */ -+ m_dllAvCodec.av_init_packet(&m_Pkt); -+ m_Pkt.size = out_size - IEC61937_DATA_OFFSET; -+ m_Pkt.data = out + IEC61937_DATA_OFFSET; -+ -+ /* encode it */ -+ int ret = m_dllAvCodec.avcodec_encode_audio2(m_CodecCtx, &m_Pkt, frame, &got_output); -+ -+ /* free temporary data */ -+ m_dllAvCodec.avcodec_free_frame(&frame); -+ -+ if (ret < 0 || !got_output) -+ { -+ CLog::Log(LOGERROR, "CAEEncoderFFmpeg::Encode - Encoding failed"); -+ return 0; -+ } -+ -+ /* pack it into an IEC958 frame */ -+ m_PackFunc(NULL, m_Pkt.size, out); -+ -+ /* free the packet */ -+ m_dllAvCodec.av_free_packet(&m_Pkt); -+ -+ /* return the number of frames used */ -+ return m_NeededFrames; -+} -+ -+ - int CAEEncoderFFmpeg::GetData(uint8_t **data) - { - int size; -diff --git a/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.h b/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.h -index 4ecc9f2..4fb67c4 100644 ---- a/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.h -+++ b/xbmc/cores/AudioEngine/Encoders/AEEncoderFFmpeg.h -@@ -36,7 +36,7 @@ class CAEEncoderFFmpeg: public IAEEncoder - virtual ~CAEEncoderFFmpeg(); - - virtual bool IsCompatible(AEAudioFormat format); -- virtual bool Initialize(AEAudioFormat &format); -+ virtual bool Initialize(AEAudioFormat &format, bool allow_planar_input = false); - virtual void Reset(); - - virtual unsigned int GetBitRate (); -@@ -44,6 +44,7 @@ class CAEEncoderFFmpeg: public IAEEncoder - virtual unsigned int GetFrames (); - - virtual int Encode (float *data, unsigned int frames); -+ virtual int Encode (uint8_t *in, int in_size, uint8_t *out, int out_size); - virtual int GetData(uint8_t **data); - virtual double GetDelay(unsigned int bufferSize); - private: -diff --git a/xbmc/cores/AudioEngine/Interfaces/AEEncoder.h b/xbmc/cores/AudioEngine/Interfaces/AEEncoder.h -index 8c50fb1..6e4c257 100644 ---- a/xbmc/cores/AudioEngine/Interfaces/AEEncoder.h -+++ b/xbmc/cores/AudioEngine/Interfaces/AEEncoder.h -@@ -48,9 +48,10 @@ class IAEEncoder - /** - * Called to setup the encoder to accept data in the specified format - * @param format the desired audio format, may be changed to suit the encoder -+ * @param allow_planar_input allow engine to use with planar formats - * @return true on success, false on failure - */ -- virtual bool Initialize(AEAudioFormat &format) = 0; -+ virtual bool Initialize(AEAudioFormat &format, bool allow_planar_input = false) = 0; - - /** - * Reset the encoder for new data -@@ -84,6 +85,16 @@ class IAEEncoder - virtual int Encode(float *data, unsigned int frames) = 0; - - /** -+ * Encodes the supplied samples into a provided buffer -+ * @param in the PCM samples encoder requested format -+ * @param in_size input buffer size -+ * @param output buffer -+ * @param out_size output buffer size -+ * @return the number of samples consumed -+ */ -+ virtual int Encode (uint8_t *in, int in_size, uint8_t *out, int out_size) { return 0; }; -+ -+ /** - * Get the encoded data - * @param data return pointer to the buffer with the current encoded block - * @return the size in bytes of *data --- -1.8.1.6 - - -From 0ea994d9cc66de6db9e9b0bf239fb220ddabf9fb Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Wed, 26 Jun 2013 15:13:22 +0200 -Subject: [PATCH 007/136] AE: alsa - close device in blocking mode, fixes - device busy - ---- - xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -index decd0bd..06a949b 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -@@ -196,8 +196,8 @@ bool CAESinkALSA::Initialize(AEAudioFormat &format, std::string &device) - if (!InitializeHW(format) || !InitializeSW(format)) - return false; - -- snd_pcm_nonblock(m_pcm, 1); - snd_pcm_prepare (m_pcm); -+ snd_pcm_nonblock(m_pcm, 1); - - m_format = format; - m_formatSampleRateMul = 1.0 / (double)m_format.m_sampleRate; -@@ -436,10 +436,10 @@ bool CAESinkALSA::InitializeSW(AEAudioFormat &format) - - void CAESinkALSA::Deinitialize() - { -- Stop(); -- - if (m_pcm) - { -+ snd_pcm_nonblock(m_pcm, 0); -+ Stop(); - snd_pcm_close(m_pcm); - m_pcm = NULL; - } --- -1.8.1.6 - - -From 47dc6f36326fafb8b1d7a8cbb61c83f4a5f4f19c Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Wed, 26 Jun 2013 18:48:30 +0200 -Subject: [PATCH 008/136] AE: alsa - set to prepared after drain - ---- - xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -index 06a949b..630dd5d 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -@@ -196,8 +196,8 @@ bool CAESinkALSA::Initialize(AEAudioFormat &format, std::string &device) - if (!InitializeHW(format) || !InitializeSW(format)) - return false; - -- snd_pcm_prepare (m_pcm); - snd_pcm_nonblock(m_pcm, 1); -+ snd_pcm_prepare (m_pcm); - - m_format = format; - m_formatSampleRateMul = 1.0 / (double)m_format.m_sampleRate; -@@ -574,6 +574,7 @@ void CAESinkALSA::Drain() - - snd_pcm_nonblock(m_pcm, 0); - snd_pcm_drain(m_pcm); -+ snd_pcm_prepare(m_pcm); - snd_pcm_nonblock(m_pcm, 1); - } - --- -1.8.1.6 - - -From a69c107e38624076463f2ad501cb13c3f84fe2fd Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Fri, 5 Jul 2013 21:02:00 +0200 -Subject: [PATCH 009/136] AE: Add blocking option to AddPackets, makes Sink - behaviour choosable after c2493d5bf6bc2be2fb45f563affdd214bf9862fb - ---- - xbmc/cores/AudioEngine/Interfaces/AESink.h | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp | 11 +++++++++-- - xbmc/cores/AudioEngine/Sinks/AESinkALSA.h | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp | 4 ++-- - xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkNULL.cpp | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkNULL.h | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkOSS.h | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkProfiler.cpp | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkProfiler.h | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h | 2 +- - 15 files changed, 24 insertions(+), 17 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Interfaces/AESink.h b/xbmc/cores/AudioEngine/Interfaces/AESink.h -index d4fc3b9..520d6ef 100644 ---- a/xbmc/cores/AudioEngine/Interfaces/AESink.h -+++ b/xbmc/cores/AudioEngine/Interfaces/AESink.h -@@ -71,7 +71,7 @@ class IAESink - /* - Adds packets to be sent out, this routine MUST block or sleep. - */ -- virtual unsigned int AddPackets(uint8_t *data, unsigned int frames, bool hasAudio) = 0; -+ virtual unsigned int AddPackets(uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false) = 0; - - /* - Drain the sink -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -index 630dd5d..4e06031 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -@@ -497,7 +497,7 @@ double CAESinkALSA::GetCacheTotal() - return (double)m_bufferSize * m_formatSampleRateMul; - } - --unsigned int CAESinkALSA::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio) -+unsigned int CAESinkALSA::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio, bool blocking) - { - if (!m_pcm) - { -@@ -518,7 +518,14 @@ unsigned int CAESinkALSA::AddPackets(uint8_t *data, unsigned int frames, bool ha - } - - if ((unsigned int)ret < frames) -- return 0; -+ if(blocking) -+ { -+ ret = snd_pcm_wait(m_pcm, m_timeout); -+ if (ret < 0) -+ HandleError("snd_pcm_wait", ret); -+ } -+ else -+ return 0; - - ret = snd_pcm_writei(m_pcm, (void*)data, frames); - if (ret < 0) -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h -index 90578b9..e43ea5e 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h -@@ -47,7 +47,7 @@ class CAESinkALSA : public IAESink - virtual double GetDelay (); - virtual double GetCacheTime (); - virtual double GetCacheTotal (); -- virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); -+ virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false); - virtual void Drain (); - virtual bool SoftSuspend(); - virtual bool SoftResume(); -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp -index 07a4bcc..7b9e205 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp -@@ -212,7 +212,7 @@ double CAESinkAUDIOTRACK::GetCacheTotal() - return m_sinkbuffer_sec + m_audiotrackbuffer_sec; - } - --unsigned int CAESinkAUDIOTRACK::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio) -+unsigned int CAESinkAUDIOTRACK::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio, bool blocking) - { - // write as many frames of audio as we can fit into our internal buffer. - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h -index 3d73d9fb..9600867 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h -@@ -40,7 +40,7 @@ class CAESinkAUDIOTRACK : public CThread, public IAESink - virtual double GetDelay (); - virtual double GetCacheTime (); - virtual double GetCacheTotal (); -- virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); -+ virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false); - virtual void Drain (); - virtual bool HasVolume (); - virtual void SetVolume (float scale); -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -index d46d551..cff916e 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -@@ -367,7 +367,7 @@ bool CAESinkDirectSound::IsCompatible(const AEAudioFormat format, const std::str - return false; - } - --unsigned int CAESinkDirectSound::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio) -+unsigned int CAESinkDirectSound::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false) - { - if (!m_initialized) - return 0; -@@ -910,4 +910,4 @@ bool CAESinkDirectSound::SoftResume() - { - /* Return false to force re-init by engine */ - return false; --} -\ No newline at end of file -+} -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h -index b0149dd..8ff098d 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h -@@ -42,7 +42,7 @@ class CAESinkDirectSound : public IAESink - virtual double GetDelay (); - virtual double GetCacheTime (); - virtual double GetCacheTotal (); -- virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); -+ virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false); - virtual bool SoftSuspend (); - virtual bool SoftResume (); - static std::string GetDefaultDevice (); -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkNULL.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkNULL.cpp -index 254b9c9..7d26017 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkNULL.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkNULL.cpp -@@ -99,7 +99,7 @@ double CAESinkNULL::GetCacheTotal() - return m_sinkbuffer_sec_per_byte * (double)m_sinkbuffer_size; - } - --unsigned int CAESinkNULL::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio) -+unsigned int CAESinkNULL::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio, bool blocking) - { - unsigned int max_frames = (m_sinkbuffer_size - m_sinkbuffer_level) / m_sink_frameSize; - if (frames > max_frames) -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkNULL.h b/xbmc/cores/AudioEngine/Sinks/AESinkNULL.h -index ef77119..1e4a3b9 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkNULL.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkNULL.h -@@ -38,7 +38,7 @@ class CAESinkNULL : public CThread, public IAESink - virtual double GetDelay (); - virtual double GetCacheTime (); - virtual double GetCacheTotal (); -- virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); -+ virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false); - virtual void Drain (); - - static void EnumerateDevices(AEDeviceList &devices, bool passthrough); -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp -index 281088d..3a6461b 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp -@@ -408,7 +408,7 @@ double CAESinkOSS::GetDelay() - return (double)delay / (m_format.m_frameSize * m_format.m_sampleRate); - } - --unsigned int CAESinkOSS::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio) -+unsigned int CAESinkOSS::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio, bool blocking) - { - int size = frames * m_format.m_frameSize; - if (m_fd == -1) -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h -index f50f713..9e558d3 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h -@@ -41,7 +41,7 @@ class CAESinkOSS : public IAESink - virtual double GetDelay (); - virtual double GetCacheTime () { return 0.0; } /* FIXME */ - virtual double GetCacheTotal () { return 0.0; } /* FIXME */ -- virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); -+ virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false); - virtual void Drain (); - static void EnumerateDevicesEx(AEDeviceInfoList &list, bool force = false); - private: -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.cpp -index 2cff0ed..aeceb6b 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.cpp -@@ -71,7 +71,7 @@ double CAESinkProfiler::GetDelay() - return 0.0f; - } - --unsigned int CAESinkProfiler::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio) -+unsigned int CAESinkProfiler::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio, bool blocking) - { - int64_t ts = CurrentHostCounter(); - CLog::Log(LOGDEBUG, "CAESinkProfiler::AddPackets - latency %f ms", (float)(ts - m_ts) / 1000000.0f); -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.h b/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.h -index d9423fb..a0b955b 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkProfiler.h -@@ -39,7 +39,7 @@ class CAESinkProfiler : public IAESink - virtual double GetDelay (); - virtual double GetCacheTime () { return 0.0; } - virtual double GetCacheTotal () { return 0.0; } -- virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); -+ virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false); - virtual void Drain (); - static void EnumerateDevices(AEDeviceList &devices, bool passthrough); - private: -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -index 9af3f2e..4cd95f0 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -@@ -423,7 +423,7 @@ double CAESinkWASAPI::GetCacheTotal() - return m_sinkLatency; - } - --unsigned int CAESinkWASAPI::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio) -+unsigned int CAESinkWASAPI::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio, bool blocking) - { - if (!m_initialized) - return 0; -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h -index df16682..c4a5a51 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h -@@ -42,7 +42,7 @@ class CAESinkWASAPI : public IAESink - virtual double GetDelay (); - virtual double GetCacheTime (); - virtual double GetCacheTotal (); -- virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); -+ virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false); - virtual bool SoftSuspend (); - virtual bool SoftResume (); - static void EnumerateDevicesEx (AEDeviceInfoList &deviceInfoList, bool force = false); --- -1.8.1.6 - - -From 21396738cd866d56a717c1f0999121739ea914d6 Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Sat, 6 Jul 2013 08:07:30 +0200 -Subject: [PATCH 010/136] AE: Give Sinks the possibility to be used in a - blocking way - ---- - xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp | 5 ++++ - xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp | 11 +++++--- - xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp | 2 +- - xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp | 29 +++++++++++++++++++--- - 4 files changed, 40 insertions(+), 7 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp -index 7b9e205..48e488b 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp -@@ -243,6 +243,11 @@ unsigned int CAESinkAUDIOTRACK::AddPackets(uint8_t *data, unsigned int frames, b - break; - } - } -+ // AddPackets runs under a non-idled AE thread we must block or sleep. -+ // Trying to calc the optimal sleep is tricky so just a minimal sleep. -+ if(blocking) -+ Sleep(10); -+ - return hasAudio ? write_frames:frames; - } - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -index cff916e..797d7f2 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -@@ -367,7 +367,7 @@ bool CAESinkDirectSound::IsCompatible(const AEAudioFormat format, const std::str - return false; - } - --unsigned int CAESinkDirectSound::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false) -+unsigned int CAESinkDirectSound::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio, bool blocking) - { - if (!m_initialized) - return 0; -@@ -386,10 +386,15 @@ unsigned int CAESinkDirectSound::AddPackets(uint8_t *data, unsigned int frames, - - while (GetSpace() < total) - { -- if (m_isDirtyDS) -+ if(m_isDirtyDS) - return INT_MAX; - else -- return 0; -+ { -+ if(blocking) -+ Sleep(total * 1000 / m_AvgBytesPerSec); -+ else -+ return 0; -+ } - } - - while (len) -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp -index 3a6461b..b201b7b 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp -@@ -420,7 +420,7 @@ unsigned int CAESinkOSS::AddPackets(uint8_t *data, unsigned int frames, bool has - int wrote = write(m_fd, data, size); - if (wrote < 0) - { -- if(errno == EAGAIN || errno == EWOULDBLOCK) -+ if(!blocking && (errno == EAGAIN || errno == EWOULDBLOCK)) - return 0; - - CLog::Log(LOGERROR, "CAESinkOSS::AddPackets - Failed to write"); -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -index 4cd95f0..8a3d7ce 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -@@ -488,10 +488,33 @@ unsigned int CAESinkWASAPI::AddPackets(uint8_t *data, unsigned int frames, bool - #endif - - /* Wait for Audio Driver to tell us it's got a buffer available */ -- DWORD eventAudioCallback = WaitForSingleObject(m_needDataEvent, 0); -+ DWORD eventAudioCallback; -+ if(!blocking) -+ eventAudioCallback = WaitForSingleObject(m_needDataEvent, 0); -+ else -+ eventAudioCallback = WaitForSingleObject(m_needDataEvent, 1100); -+ -+ if (!blocking) -+ { -+ if(eventAudioCallback != WAIT_OBJECT_0) -+ return 0; -+ } -+ else -+ { -+ if(eventAudioCallback != WAIT_OBJECT_0 || !&buf) -+ { -+ /* Event handle timed out - flag sink as dirty for re-initializing */ -+ CLog::Log(LOGERROR, __FUNCTION__": Endpoint Buffer timed out"); -+ if (g_advancedSettings.m_streamSilence) -+ { -+ m_isDirty = true; //flag new device or re-init needed -+ Deinitialize(); -+ m_running = false; -+ return INT_MAX; -+ } -+ } -+ } - -- if (eventAudioCallback != WAIT_OBJECT_0) -- return 0; - - if (!m_running) - return 0; --- -1.8.1.6 - - -From 8700c98e54c57d48cb50584f1097bddad3fe3a5a Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Sun, 7 Jul 2013 18:22:04 +0200 -Subject: [PATCH 011/136] AE: allow to register audio callback directly into - engine - ---- - xbmc/cores/AudioEngine/AEFactory.cpp | 12 ++++++++++++ - xbmc/cores/AudioEngine/AEFactory.h | 3 +++ - xbmc/cores/AudioEngine/Interfaces/AE.h | 5 +++++ - xbmc/cores/dvdplayer/DVDPlayer.h | 5 +++-- - xbmc/cores/paplayer/PAPlayer.cpp | 2 ++ - 5 files changed, 25 insertions(+), 2 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp -index 7141dd3..0befba9 100644 ---- a/xbmc/cores/AudioEngine/AEFactory.cpp -+++ b/xbmc/cores/AudioEngine/AEFactory.cpp -@@ -358,3 +358,15 @@ void CAEFactory::SettingOptionsAudioDevicesFillerGeneral(const CSetting *setting - if (!foundValue) - current = firstDevice; - } -+ -+void CAEFactory::RegisterAudioCallback(IAudioCallback* pCallback) -+{ -+ if (AE) -+ AE->RegisterAudioCallback(pCallback); -+} -+ -+void CAEFactory::UnregisterAudioCallback() -+{ -+ if (AE) -+ AE->UnregisterAudioCallback(); -+} -diff --git a/xbmc/cores/AudioEngine/AEFactory.h b/xbmc/cores/AudioEngine/AEFactory.h -index 56a1e27..9e15f79 100644 ---- a/xbmc/cores/AudioEngine/AEFactory.h -+++ b/xbmc/cores/AudioEngine/AEFactory.h -@@ -67,6 +67,9 @@ class CAEFactory - static void SettingOptionsAudioDevicesPassthroughFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t); - static void SettingOptionsAudioOutputModesFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t); - -+ static void RegisterAudioCallback(IAudioCallback* pCallback); -+ static void UnregisterAudioCallback(); -+ - private: - static bool LoadEngine(enum AEEngine engine); - static IAE *AE; -diff --git a/xbmc/cores/AudioEngine/Interfaces/AE.h b/xbmc/cores/AudioEngine/Interfaces/AE.h -index cbfa8ed..5741cd8 100644 ---- a/xbmc/cores/AudioEngine/Interfaces/AE.h -+++ b/xbmc/cores/AudioEngine/Interfaces/AE.h -@@ -34,6 +34,7 @@ - class IAEStream; - class IAESound; - class IAEPacketizer; -+class IAudioCallback; - - /* sound options */ - #define AE_SOUND_OFF 0 /* disable sounds */ -@@ -183,5 +184,9 @@ class IAE - * @returns true if the AudioEngine is capable of RAW output - */ - virtual bool SupportsRaw() { return false; } -+ -+ virtual void RegisterAudioCallback(IAudioCallback* pCallback) {} -+ -+ virtual void UnregisterAudioCallback() {} - }; - -diff --git a/xbmc/cores/dvdplayer/DVDPlayer.h b/xbmc/cores/dvdplayer/DVDPlayer.h -index 237aba4d..c6b9ce3 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayer.h -+++ b/xbmc/cores/dvdplayer/DVDPlayer.h -@@ -39,6 +39,7 @@ - #include "Edl.h" - #include "FileItem.h" - #include "threads/SingleLock.h" -+#include "cores/AudioEngine/AEFactory.h" - - - class CDVDInputStream; -@@ -185,8 +186,8 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer - virtual float GetPercentage(); - virtual float GetCachePercentage(); - -- virtual void RegisterAudioCallback(IAudioCallback* pCallback) { m_dvdPlayerAudio.RegisterAudioCallback(pCallback); } -- virtual void UnRegisterAudioCallback() { m_dvdPlayerAudio.UnRegisterAudioCallback(); } -+ virtual void RegisterAudioCallback(IAudioCallback* pCallback) { CAEFactory::RegisterAudioCallback(pCallback); m_dvdPlayerAudio.RegisterAudioCallback(pCallback); } -+ virtual void UnRegisterAudioCallback() { CAEFactory::UnregisterAudioCallback(); m_dvdPlayerAudio.UnRegisterAudioCallback(); } - virtual void SetVolume(float nVolume) { m_dvdPlayerAudio.SetVolume(nVolume); } - virtual void SetDynamicRangeCompression(long drc) { m_dvdPlayerAudio.SetDynamicRangeCompression(drc); } - virtual void GetAudioInfo(CStdString& strAudioInfo); -diff --git a/xbmc/cores/paplayer/PAPlayer.cpp b/xbmc/cores/paplayer/PAPlayer.cpp -index e4ba610..fe77363 100644 ---- a/xbmc/cores/paplayer/PAPlayer.cpp -+++ b/xbmc/cores/paplayer/PAPlayer.cpp -@@ -759,6 +759,7 @@ void PAPlayer::OnExit() - void PAPlayer::RegisterAudioCallback(IAudioCallback* pCallback) - { - CSharedLock lock(m_streamsLock); -+ CAEFactory::RegisterAudioCallback(pCallback); - m_audioCallback = pCallback; - if (m_currentStream && m_currentStream->m_stream) - m_currentStream->m_stream->RegisterAudioCallback(pCallback); -@@ -767,6 +768,7 @@ void PAPlayer::RegisterAudioCallback(IAudioCallback* pCallback) - void PAPlayer::UnRegisterAudioCallback() - { - CSharedLock lock(m_streamsLock); -+ CAEFactory::UnregisterAudioCallback(); - /* only one stream should have the callback, but we do it to all just incase */ - for(StreamList::iterator itt = m_streams.begin(); itt != m_streams.end(); ++itt) - if ((*itt)->m_stream) --- -1.8.1.6 - - -From 8ae0ba4f8e2d00c3dbf7362bfb22b6a8ee0befd7 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Mon, 1 Jul 2013 13:52:29 +0200 -Subject: [PATCH 012/136] AE: add parameter wait to drain, dvdplayer wants to - wait for the stream to be drained, papayer does not - ---- - xbmc/cores/AudioEngine/Engines/CoreAudio/CoreAudioAEStream.cpp | 2 +- - xbmc/cores/AudioEngine/Engines/CoreAudio/CoreAudioAEStream.h | 2 +- - xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp | 2 +- - xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h | 2 +- - xbmc/cores/AudioEngine/Engines/SoftAE/SoftAEStream.cpp | 2 +- - xbmc/cores/AudioEngine/Engines/SoftAE/SoftAEStream.h | 2 +- - xbmc/cores/AudioEngine/Interfaces/AEStream.h | 2 +- - xbmc/cores/dvdplayer/DVDAudio.cpp | 2 +- - xbmc/cores/paplayer/PAPlayer.cpp | 2 +- - 9 files changed, 9 insertions(+), 9 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/CoreAudio/CoreAudioAEStream.cpp b/xbmc/cores/AudioEngine/Engines/CoreAudio/CoreAudioAEStream.cpp -index a9422f7..073769a 100644 ---- a/xbmc/cores/AudioEngine/Engines/CoreAudio/CoreAudioAEStream.cpp -+++ b/xbmc/cores/AudioEngine/Engines/CoreAudio/CoreAudioAEStream.cpp -@@ -603,7 +603,7 @@ void CCoreAudioAEStream::Resume() - m_paused = false; - } - --void CCoreAudioAEStream::Drain() -+void CCoreAudioAEStream::Drain(bool wait) - { - m_draining = true; - } -diff --git a/xbmc/cores/AudioEngine/Engines/CoreAudio/CoreAudioAEStream.h b/xbmc/cores/AudioEngine/Engines/CoreAudio/CoreAudioAEStream.h -index 18c52ed..1366808 100644 ---- a/xbmc/cores/AudioEngine/Engines/CoreAudio/CoreAudioAEStream.h -+++ b/xbmc/cores/AudioEngine/Engines/CoreAudio/CoreAudioAEStream.h -@@ -73,7 +73,7 @@ class CCoreAudioAEStream : public IAEStream, public ICoreAudioSource - - virtual void Pause(); - virtual void Resume(); -- virtual void Drain(); -+ virtual void Drain(bool wait); - virtual void Flush(); - - virtual float GetVolume(); -diff --git a/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp b/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp -index 443c844..e1e1903 100644 ---- a/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp -+++ b/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.cpp -@@ -386,7 +386,7 @@ void CPulseAEStream::Resume() - m_Paused = Cork(false); - } - --void CPulseAEStream::Drain() -+void CPulseAEStream::Drain(bool wait) - { - if (!m_Initialized) - return; -diff --git a/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h b/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h -index 51aeda8..8d9435b 100644 ---- a/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h -+++ b/xbmc/cores/AudioEngine/Engines/PulseAE/PulseAEStream.h -@@ -48,7 +48,7 @@ class CPulseAEStream : public IAEStream - - virtual void Pause (); - virtual void Resume (); -- virtual void Drain (); -+ virtual void Drain (bool wait); - virtual void Flush (); - - virtual float GetVolume (); -diff --git a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAEStream.cpp b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAEStream.cpp -index 05ee1b0..b5c2da3 100644 ---- a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAEStream.cpp -+++ b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAEStream.cpp -@@ -555,7 +555,7 @@ void CSoftAEStream::Resume() - AE.ResumeStream(this); - } - --void CSoftAEStream::Drain() -+void CSoftAEStream::Drain(bool wait) - { - CSingleLock lock(m_lock); - m_draining = true; -diff --git a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAEStream.h b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAEStream.h -index f7410e3..1475c83 100644 ---- a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAEStream.h -+++ b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAEStream.h -@@ -59,7 +59,7 @@ class CSoftAEStream : public IAEStream - - virtual void Pause (); - virtual void Resume (); -- virtual void Drain (); -+ virtual void Drain (bool wait); - virtual bool IsDraining () { return m_draining; } - virtual bool IsDrained (); - virtual void Flush (); -diff --git a/xbmc/cores/AudioEngine/Interfaces/AEStream.h b/xbmc/cores/AudioEngine/Interfaces/AEStream.h -index 67fa5e2..92d5fef 100644 ---- a/xbmc/cores/AudioEngine/Interfaces/AEStream.h -+++ b/xbmc/cores/AudioEngine/Interfaces/AEStream.h -@@ -97,7 +97,7 @@ class IAEStream - * Start draining the stream - * @note Once called AddData will not consume more data. - */ -- virtual void Drain() = 0; -+ virtual void Drain(bool wait) = 0; - - /** - * Returns true if the is stream draining -diff --git a/xbmc/cores/dvdplayer/DVDAudio.cpp b/xbmc/cores/dvdplayer/DVDAudio.cpp -index c37d4c5..6404433 100644 ---- a/xbmc/cores/dvdplayer/DVDAudio.cpp -+++ b/xbmc/cores/dvdplayer/DVDAudio.cpp -@@ -298,7 +298,7 @@ void CDVDAudio::Drain() - Finish(); - CSingleLock lock (m_critSection); - if (m_pAudioStream) -- m_pAudioStream->Drain(); -+ m_pAudioStream->Drain(true); - } - - void CDVDAudio::RegisterAudioCallback(IAudioCallback* pCallback) -diff --git a/xbmc/cores/paplayer/PAPlayer.cpp b/xbmc/cores/paplayer/PAPlayer.cpp -index fe77363..555d51e 100644 ---- a/xbmc/cores/paplayer/PAPlayer.cpp -+++ b/xbmc/cores/paplayer/PAPlayer.cpp -@@ -610,7 +610,7 @@ inline void PAPlayer::ProcessStreams(double &delay, double &buffer) - /* unregister the audio callback */ - si->m_stream->UnRegisterAudioCallback(); - si->m_decoder.Destroy(); -- si->m_stream->Drain(); -+ si->m_stream->Drain(false); - m_finishing.push_back(si); - return; - } --- -1.8.1.6 - - -From 2daf7828c64b2b5d1c1599660fc31d1e1a376420 Mon Sep 17 00:00:00 2001 -From: xbmc -Date: Mon, 25 Mar 2013 13:58:11 +0100 -Subject: [PATCH 013/136] ActiveAE: add new audio engine, co-author: fritsch - ---- - xbmc/cores/AudioEngine/AEFactory.cpp | 3 + - xbmc/cores/AudioEngine/AEFactory.h | 3 +- - .../AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 2270 ++++++++++++++++++++ - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h | 334 +++ - .../Engines/ActiveAE/ActiveAEBuffer.cpp | 365 ++++ - .../AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h | 110 + - .../Engines/ActiveAE/ActiveAEResample.cpp | 250 +++ - .../Engines/ActiveAE/ActiveAEResample.h | 61 + - .../AudioEngine/Engines/ActiveAE/ActiveAESink.cpp | 864 ++++++++ - .../AudioEngine/Engines/ActiveAE/ActiveAESink.h | 138 ++ - .../AudioEngine/Engines/ActiveAE/ActiveAESound.cpp | 161 ++ - .../AudioEngine/Engines/ActiveAE/ActiveAESound.h | 73 + - .../Engines/ActiveAE/ActiveAEStream.cpp | 362 ++++ - .../AudioEngine/Engines/ActiveAE/ActiveAEStream.h | 117 + - xbmc/cores/AudioEngine/Makefile.in | 7 + - xbmc/utils/ActorProtocol.cpp | 253 +++ - xbmc/utils/ActorProtocol.h | 87 + - xbmc/utils/Makefile.in | 1 + - 18 files changed, 5458 insertions(+), 1 deletion(-) - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.h - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp - create mode 100644 xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h - create mode 100644 xbmc/utils/ActorProtocol.cpp - create mode 100644 xbmc/utils/ActorProtocol.h - -diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp -index 0befba9..4f9f566 100644 ---- a/xbmc/cores/AudioEngine/AEFactory.cpp -+++ b/xbmc/cores/AudioEngine/AEFactory.cpp -@@ -27,6 +27,8 @@ - #include "settings/SettingsManager.h" - #else - #include "Engines/SoftAE/SoftAE.h" -+ #include "Engines/ActiveAE/ActiveAE.h" -+ using namespace ActiveAE; - #endif - - #if defined(HAS_PULSEAUDIO) -@@ -99,6 +101,7 @@ bool CAEFactory::LoadEngine(enum AEEngine engine) - case AE_ENGINE_COREAUDIO: AE = new CCoreAudioAE(); break; - #else - case AE_ENGINE_SOFT : AE = new CSoftAE(); break; -+ case AE_ENGINE_ACTIVE : AE = new CActiveAE(); break; - #endif - #if defined(HAS_PULSEAUDIO) - case AE_ENGINE_PULSE : AE = new CPulseAE(); break; -diff --git a/xbmc/cores/AudioEngine/AEFactory.h b/xbmc/cores/AudioEngine/AEFactory.h -index 9e15f79..3059001 100644 ---- a/xbmc/cores/AudioEngine/AEFactory.h -+++ b/xbmc/cores/AudioEngine/AEFactory.h -@@ -31,7 +31,8 @@ enum AEEngine - AE_ENGINE_NULL, - AE_ENGINE_SOFT, - AE_ENGINE_COREAUDIO, -- AE_ENGINE_PULSE -+ AE_ENGINE_PULSE, -+ AE_ENGINE_ACTIVE - }; - - class CAEFactory -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -new file mode 100644 -index 0000000..2defd1d ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -@@ -0,0 +1,2270 @@ -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include "ActiveAE.h" -+ -+using namespace ActiveAE; -+#include "ActiveAESound.h" -+#include "ActiveAEStream.h" -+#include "Utils/AEUtil.h" -+#include "Encoders/AEEncoderFFmpeg.h" -+ -+#include "settings/Settings.h" -+#include "settings/AdvancedSettings.h" -+#include "windowing/WindowingFactory.h" -+ -+#define MAX_CACHE_LEVEL 0.5 // total cache time of stream in seconds -+#define MAX_WATER_LEVEL 0.25 // buffered time after stream stages in seconds -+ -+void CEngineStats::Reset(unsigned int sampleRate) -+{ -+ CSingleLock lock(m_lock); -+ m_sinkUpdate = XbmcThreads::SystemClockMillis(); -+ m_sinkDelay = 0; -+ m_sinkSampleRate = sampleRate; -+ m_bufferedSamples = 0; -+ m_suspended = false; -+} -+ -+void CEngineStats::UpdateSinkDelay(double delay, int samples) -+{ -+ CSingleLock lock(m_lock); -+ m_sinkUpdate = XbmcThreads::SystemClockMillis(); -+ m_sinkDelay = delay; -+ if (samples > m_bufferedSamples) -+ { -+ CLog::Log(LOGERROR, "CEngineStats::UpdateSinkDelay - inconsistency in buffer time"); -+ } -+ else -+ m_bufferedSamples -= samples; -+} -+ -+void CEngineStats::AddSamples(int samples, std::list &streams) -+{ -+ CSingleLock lock(m_lock); -+ m_bufferedSamples += samples; -+ -+ //update buffered time of streams -+ std::list::iterator it; -+ for(it=streams.begin(); it!=streams.end(); ++it) -+ { -+ float delay = 0; -+ std::deque::iterator itBuf; -+ for(itBuf=(*it)->m_processingSamples.begin(); itBuf!=(*it)->m_processingSamples.end(); ++itBuf) -+ { -+ delay += (float)(*itBuf)->pkt->nb_samples / (*itBuf)->pkt->config.sample_rate; -+ } -+ delay += (*it)->m_resampleBuffers->GetDelay(); -+ (*it)->m_bufferedTime = delay; -+ } -+} -+ -+float CEngineStats::GetDelay() -+{ -+ CSingleLock lock(m_lock); -+ unsigned int now = XbmcThreads::SystemClockMillis(); -+ float delay = m_sinkDelay - (double)(now-m_sinkUpdate) / 1000; -+ delay += (float)m_bufferedSamples / m_sinkSampleRate; -+ -+ return delay; -+} -+ -+float CEngineStats::GetDelay(CActiveAEStream *stream) -+{ -+ CSingleLock lock(m_lock); -+ unsigned int now = XbmcThreads::SystemClockMillis(); -+ float delay = m_sinkDelay - (double)(now-m_sinkUpdate) / 1000; -+ delay += (float)m_bufferedSamples / m_sinkSampleRate; -+ -+ delay += stream->m_bufferedTime; -+ return delay; -+} -+ -+float CEngineStats::GetCacheTime(CActiveAEStream *stream) -+{ -+ CSingleLock lock(m_lock); -+ float delay = (float)m_bufferedSamples / m_sinkSampleRate; -+ -+ delay += stream->m_bufferedTime; -+ return delay; -+} -+ -+float CEngineStats::GetCacheTotal(CActiveAEStream *stream) -+{ -+ return MAX_CACHE_LEVEL + m_sinkCacheTotal; -+} -+ -+float CEngineStats::GetWaterLevel() -+{ -+ return (float)m_bufferedSamples / m_sinkSampleRate; -+} -+ -+void CEngineStats::SetSuspended(bool state) -+{ -+ CSingleLock lock(m_lock); -+ m_suspended = state; -+} -+ -+bool CEngineStats::IsSuspended() -+{ -+ CSingleLock lock(m_lock); -+ return m_suspended; -+} -+ -+CActiveAE::CActiveAE() : -+ CThread("ActiveAE"), -+ m_controlPort("OutputControlPort", &m_inMsgEvent, &m_outMsgEvent), -+ m_dataPort("OutputDataPort", &m_inMsgEvent, &m_outMsgEvent), -+ m_sink(&m_outMsgEvent) -+{ -+ m_sinkBuffers = NULL; -+ m_silenceBuffers = NULL; -+ m_encoderBuffers = NULL; -+ m_vizBuffers = NULL; -+ m_volume = 1.0; -+ m_aeVolume = 1.0; -+ m_muted = false; -+ m_aeMuted = false; -+ m_mode = MODE_PCM; -+ m_encoder = NULL; -+ m_audioCallback = NULL; -+ m_vizInitialized = false; -+ m_sinkHasVolume = false; -+} -+ -+CActiveAE::~CActiveAE() -+{ -+ Dispose(); -+} -+ -+void CActiveAE::Dispose() -+{ -+#if defined(HAS_GLX) || defined(TARGET_DARWIN_OSX) -+ g_Windowing.Unregister(this); -+#endif -+ -+ m_bStop = true; -+ m_outMsgEvent.Set(); -+ StopThread(); -+ m_controlPort.Purge(); -+ m_dataPort.Purge(); -+ m_sink.Dispose(); -+ -+ m_dllAvFormat.Unload(); -+ m_dllAvCodec.Unload(); -+ m_dllAvUtil.Unload(); -+} -+ -+//----------------------------------------------------------------------------- -+// Behavior -+//----------------------------------------------------------------------------- -+ -+enum AE_STATES -+{ -+ AE_TOP = 0, // 0 -+ AE_TOP_ERROR, // 1 -+ AE_TOP_UNCONFIGURED, // 2 -+ AE_TOP_RECONFIGURING, // 3 -+ AE_TOP_CONFIGURED, // 4 -+ AE_TOP_CONFIGURED_SUSPEND, // 5 -+ AE_TOP_CONFIGURED_IDLE, // 6 -+ AE_TOP_CONFIGURED_PLAY, // 7 -+}; -+ -+int AE_parentStates[] = { -+ -1, -+ 0, //TOP_ERROR -+ 0, //TOP_UNCONFIGURED -+ 0, //TOP_CONFIGURED -+ 0, //TOP_RECONFIGURING -+ 4, //TOP_CONFIGURED_SUSPEND -+ 4, //TOP_CONFIGURED_IDLE -+ 4, //TOP_CONFIGURED_PLAY -+}; -+ -+void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) -+{ -+ for (int state = m_state; ; state = AE_parentStates[state]) -+ { -+ switch (state) -+ { -+ case AE_TOP: // TOP -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case CActiveAEControlProtocol::GETSTATE: -+ msg->Reply(CActiveAEControlProtocol::ACC, &m_state, sizeof(m_state)); -+ return; -+ case CActiveAEControlProtocol::SOUNDMODE: -+ m_soundMode = *(int*)msg->data; -+ return; -+ case CActiveAEControlProtocol::VOLUME: -+ m_volume = *(float*)msg->data; -+ if (m_sinkHasVolume) -+ m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::VOLUME, &m_volume, sizeof(float)); -+ return; -+ case CActiveAEControlProtocol::MUTE: -+ m_muted = *(bool*)msg->data; -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case CActiveAEDataProtocol::NEWSOUND: -+ CActiveAESound *sound; -+ sound = *(CActiveAESound**)msg->data; -+ if (sound) -+ { -+ m_sounds.push_back(sound); -+ ResampleSounds(); -+ } -+ return; -+ case CActiveAEDataProtocol::FREESTREAM: -+ CActiveAEStream *stream; -+ stream = *(CActiveAEStream**)msg->data; -+ DiscardStream(stream); -+ return; -+ case CActiveAEDataProtocol::FREESOUND: -+ sound = *(CActiveAESound**)msg->data; -+ DiscardSound(sound); -+ return; -+ case CActiveAEDataProtocol::DRAINSTREAM: -+ stream = *(CActiveAEStream**)msg->data; -+ stream->m_drain = true; -+ stream->m_resampleBuffers->m_drain = true; -+ msg->Reply(CActiveAEDataProtocol::ACC); -+ stream->m_streamPort->SendInMessage(CActiveAEDataProtocol::STREAMDRAINED); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (&m_sink.m_dataPort) -+ { -+ switch (signal) -+ { -+ case CSinkDataProtocol::RETURNSAMPLE: -+ CSampleBuffer **buffer; -+ buffer = (CSampleBuffer**)msg->data; -+ if (buffer) -+ { -+ (*buffer)->Return(); -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ { -+ std::string portName = port == NULL ? "timer" : port->portName; -+ CLog::Log(LOGWARNING, "CActiveAE::%s - signal: %d from port: %s not handled for state: %d", __FUNCTION__, signal, portName.c_str(), m_state); -+ } -+ return; -+ -+ case AE_TOP_ERROR: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CActiveAEControlProtocol::TIMEOUT: -+ m_extError = false; -+ LoadSettings(); -+ Configure(); -+ if (!m_extError) -+ { -+ m_state = AE_TOP_CONFIGURED_IDLE; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ m_state = AE_TOP_ERROR; -+ m_extTimeout = 500; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case AE_TOP_UNCONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case CActiveAEControlProtocol::INIT: -+ m_extError = false; -+ m_sink.EnumerateSinkList(); -+ LoadSettings(); -+ Configure(); -+ msg->Reply(CActiveAEControlProtocol::ACC); -+ if (!m_extError) -+ { -+ m_state = AE_TOP_CONFIGURED_IDLE; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ m_state = AE_TOP_ERROR; -+ m_extTimeout = 500; -+ } -+ return; -+ -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case AE_TOP_RECONFIGURING: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CActiveAEControlProtocol::TIMEOUT: -+ // drain -+ if (RunStages()) -+ { -+ m_extTimeout = 0; -+ return; -+ } -+ if (!m_sinkBuffers->m_inputSamples.empty() || !m_sinkBuffers->m_outputSamples.empty()) -+ { -+ m_extTimeout = 100; -+ return; -+ } -+ if (NeedReconfigureSink()) -+ DrainSink(); -+ -+ if (!m_extError) -+ Configure(); -+ if (!m_extError) -+ { -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ m_state = AE_TOP_ERROR; -+ m_extTimeout = 500; -+ } -+ m_extDeferData = false; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case AE_TOP_CONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case CActiveAEControlProtocol::RECONFIGURE: -+ LoadSettings(); -+ if (!NeedReconfigureBuffers() && !NeedReconfigureSink()) -+ return; -+ m_state = AE_TOP_RECONFIGURING; -+ m_extTimeout = 0; -+ // don't accept any data until we are reconfigured -+ m_extDeferData = true; -+ return; -+ case CActiveAEControlProtocol::SUSPEND: -+ UnconfigureSink(); -+ m_stats.SetSuspended(true); -+ m_state = AE_TOP_CONFIGURED_SUSPEND; -+ m_extDeferData = true; -+ return; -+ case CActiveAEControlProtocol::DISPLAYLOST: -+ if (m_settings.mode == AUDIO_HDMI) -+ { -+ UnconfigureSink(); -+ m_stats.SetSuspended(true); -+ m_state = AE_TOP_CONFIGURED_SUSPEND; -+ m_extDeferData = true; -+ } -+ return; -+ case CActiveAEControlProtocol::PAUSESTREAM: -+ CActiveAEStream *stream; -+ stream = *(CActiveAEStream**)msg->data; -+ stream->m_paused = true; -+ return; -+ case CActiveAEControlProtocol::RESUMESTREAM: -+ stream = *(CActiveAEStream**)msg->data; -+ stream->m_paused = false; -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ m_extTimeout = 0; -+ return; -+ case CActiveAEControlProtocol::STREAMAMP: -+ MsgStreamParameter *par; -+ par = (MsgStreamParameter*)msg->data; -+ par->stream->m_limiter.SetAmplification(par->parameter.float_par); -+ return; -+ case CActiveAEControlProtocol::STREAMVOLUME: -+ par = (MsgStreamParameter*)msg->data; -+ par->stream->m_volume = par->parameter.float_par; -+ return; -+ case CActiveAEControlProtocol::STREAMRGAIN: -+ par = (MsgStreamParameter*)msg->data; -+ par->stream->m_rgain = par->parameter.float_par; -+ return; -+ case CActiveAEControlProtocol::STREAMRESAMPLERATIO: -+ par = (MsgStreamParameter*)msg->data; -+ if (par->stream->m_resampleBuffers) -+ { -+ par->stream->m_resampleBuffers->m_resampleRatio = par->parameter.double_par; -+ par->stream->m_resampleBuffers->m_changeRatio = true; -+ } -+ return; -+ case CActiveAEControlProtocol::STREAMFADE: -+ MsgStreamFade *fade; -+ fade = (MsgStreamFade*)msg->data; -+ fade->stream->m_fadingBase = fade->from; -+ fade->stream->m_fadingTarget = fade->target; -+ fade->stream->m_fadingTime = fade->millis; -+ fade->stream->m_fadingSamples = -1; -+ return; -+ case CActiveAEControlProtocol::STOPSOUND: -+ CActiveAESound *sound; -+ sound = *(CActiveAESound**)msg->data; -+ SStopSound(sound); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case CActiveAEDataProtocol::PLAYSOUND: -+ CActiveAESound *sound; -+ sound = *(CActiveAESound**)msg->data; -+ if (m_soundMode == AE_SOUND_OFF || -+ (m_soundMode == AE_SOUND_IDLE && !m_streams.empty())) -+ return; -+ if (sound) -+ { -+ SoundState st = {sound, 0}; -+ m_sounds_playing.push_back(st); -+ m_extTimeout = 0; -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ } -+ return; -+ case CActiveAEDataProtocol::NEWSTREAM: -+ MsgStreamNew *streamMsg; -+ CActiveAEStream *stream; -+ streamMsg = (MsgStreamNew*)msg->data; -+ stream = CreateStream(streamMsg); -+ if(stream) -+ { -+ msg->Reply(CActiveAEDataProtocol::ACC, &stream, sizeof(CActiveAEStream*)); -+ Configure(); -+ if (!m_extError) -+ { -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ m_state = AE_TOP_ERROR; -+ m_extTimeout = 500; -+ } -+ } -+ else -+ msg->Reply(CActiveAEDataProtocol::ERR); -+ return; -+ case CActiveAEDataProtocol::STREAMSAMPLE: -+ MsgStreamSample *msgData; -+ CSampleBuffer *samples; -+ msgData = (MsgStreamSample*)msg->data; -+ samples = msgData->stream->m_processingSamples.front(); -+ msgData->stream->m_processingSamples.pop_front(); -+ if (samples != msgData->buffer) -+ CLog::Log(LOGERROR, "CActiveAE - inconsistency in stream sample message"); -+ if (msgData->buffer->pkt->nb_samples == 0) -+ msgData->buffer->Return(); -+ else -+ msgData->stream->m_resampleBuffers->m_inputSamples.push_back(msgData->buffer); -+ m_extTimeout = 0; -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ return; -+ case CActiveAEDataProtocol::FREESTREAM: -+ stream = *(CActiveAEStream**)msg->data; -+ DiscardStream(stream); -+ if (m_streams.empty()) -+ { -+ m_extDrainTimer.Set(m_stats.GetDelay() * 1000); -+ m_extDrain = true; -+ } -+ m_extTimeout = 0; -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ return; -+ case CActiveAEDataProtocol::DRAINSTREAM: -+ stream = *(CActiveAEStream**)msg->data; -+ stream->m_drain = true; -+ stream->m_resampleBuffers->m_drain = true; -+ m_extTimeout = 0; -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ msg->Reply(CActiveAEDataProtocol::ACC); -+ return; -+ case CActiveAEDataProtocol::FLUSHSTREAM: -+ stream = *(CActiveAEStream**)msg->data; -+ SFlushStream(stream); -+ msg->Reply(CActiveAEDataProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (&m_sink.m_dataPort) -+ { -+ switch (signal) -+ { -+ case CSinkDataProtocol::RETURNSAMPLE: -+ CSampleBuffer **buffer; -+ buffer = (CSampleBuffer**)msg->data; -+ if (buffer) -+ { -+ (*buffer)->Return(); -+ } -+ m_extTimeout = 0; -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case AE_TOP_CONFIGURED_SUSPEND: -+ if (port == &m_controlPort) -+ { -+ bool displayReset = false; -+ switch (signal) -+ { -+ case CActiveAEControlProtocol::DISPLAYRESET: -+ displayReset = true; -+ case CActiveAEControlProtocol::INIT: -+ m_extError = false; -+ if (!displayReset) -+ { -+ m_sink.EnumerateSinkList(); -+ LoadSettings(); -+ } -+ Configure(); -+ if (!displayReset) -+ msg->Reply(CActiveAEControlProtocol::ACC); -+ if (!m_extError) -+ { -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ m_state = AE_TOP_ERROR; -+ m_extTimeout = 500; -+ } -+ m_stats.SetSuspended(false); -+ m_extDeferData = false; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case AE_TOP_CONFIGURED_IDLE: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CActiveAEControlProtocol::TIMEOUT: -+ ResampleSounds(); -+ ClearDiscardedBuffers(); -+ if (m_extDrain) -+ { -+ if (m_extDrainTimer.IsTimePast()) -+ { -+ Configure(); -+ if (!m_extError) -+ { -+ m_state = AE_TOP_CONFIGURED_PLAY; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ m_state = AE_TOP_ERROR; -+ m_extTimeout = 500; -+ } -+ } -+ else -+ m_extTimeout = m_extDrainTimer.MillisLeft(); -+ } -+ else -+ m_extTimeout = 5000; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case AE_TOP_CONFIGURED_PLAY: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CActiveAEControlProtocol::TIMEOUT: -+ if (RunStages()) -+ { -+ m_extTimeout = 0; -+ return; -+ } -+ if (!m_extDrain && HasWork()) -+ { -+ ResampleSounds(); -+ ClearDiscardedBuffers(); -+ m_extTimeout = 100; -+ return; -+ } -+ m_extTimeout = 0; -+ m_state = AE_TOP_CONFIGURED_IDLE; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ default: // we are in no state, should not happen -+ CLog::Log(LOGERROR, "CActiveAE::%s - no valid state: %d", __FUNCTION__, m_state); -+ return; -+ } -+ } // for -+} -+ -+void CActiveAE::Process() -+{ -+ Message *msg = NULL; -+ Protocol *port = NULL; -+ bool gotMsg; -+ bool deferData; -+ -+ m_state = AE_TOP_UNCONFIGURED; -+ m_extTimeout = 1000; -+ m_bStateMachineSelfTrigger = false; -+ m_extDrain = false; -+ m_extDeferData = false; -+ -+ // start sink -+ m_sink.Start(); -+ -+ while (!m_bStop) -+ { -+ gotMsg = false; -+ -+ if (m_bStateMachineSelfTrigger) -+ { -+ m_bStateMachineSelfTrigger = false; -+ // self trigger state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ // check control port -+ else if (m_controlPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_controlPort; -+ } -+ // check sink data port -+ else if (m_sink.m_dataPort.ReceiveInMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_sink.m_dataPort; -+ } -+ else if (!m_extDeferData) -+ { -+ // check data port -+ if (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_dataPort; -+ } -+ // stream data ports -+ else -+ { -+ std::list::iterator it; -+ for(it=m_streams.begin(); it!=m_streams.end(); ++it) -+ { -+ if((*it)->m_streamPort->ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_dataPort; -+ break; -+ } -+ } -+ } -+ } -+ -+ if (gotMsg) -+ { -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ -+ // wait for message -+ else if (m_outMsgEvent.WaitMSec(m_extTimeout)) -+ { -+ continue; -+ } -+ // time out -+ else -+ { -+ msg = m_controlPort.GetMessage(); -+ msg->signal = CActiveAEControlProtocol::TIMEOUT; -+ port = 0; -+ // signal timeout to state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ } -+ } -+} -+ -+void CActiveAE::Configure(AEAudioFormat *desiredFmt) -+{ -+ bool initSink = false; -+ AEAudioFormat sinkInputFormat, inputFormat; -+ m_mode = MODE_PCM; -+ -+ if (m_streams.empty()) -+ { -+ inputFormat.m_dataFormat = AE_FMT_FLOAT; -+ inputFormat.m_sampleRate = 44100; -+ inputFormat.m_encodedRate = 0; -+ inputFormat.m_channelLayout = AE_CH_LAYOUT_2_0; -+ inputFormat.m_frames = 0; -+ inputFormat.m_frameSamples = 0; -+ inputFormat.m_frameSize = 0; -+ UnregisterAudioCallback(); -+ } -+ // force input format after unpausing slave -+ else if (desiredFmt != NULL) -+ { -+ inputFormat = *desiredFmt; -+ } -+ // keep format when having multiple streams -+ else if (m_streams.size() > 1 && m_silenceBuffers == NULL) -+ { -+ inputFormat = m_sinkRequestFormat; -+ } -+ else -+ { -+ inputFormat = m_streams.front()->m_format; -+ } -+ -+ m_sinkRequestFormat = inputFormat; -+ ApplySettingsToFormat(m_sinkRequestFormat, m_settings, true); -+ std::string device = AE_IS_RAW(m_sinkRequestFormat.m_dataFormat) ? m_settings.passthoughdevice : m_settings.device; -+ std::string driver; -+ CAESinkFactory::ParseDevice(device, driver); -+ if (!m_sink.IsCompatible(m_sinkRequestFormat, device) || m_settings.driver.compare(driver) != 0) -+ { -+ if (!InitSink()) -+ return; -+ m_settings.driver = driver; -+ initSink = true; -+ m_stats.Reset(m_sinkFormat.m_sampleRate); -+ m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::VOLUME, &m_volume, sizeof(float)); -+ } -+ -+ if (m_silenceBuffers) -+ { -+ m_discardBufferPools.push_back(m_silenceBuffers); -+ m_silenceBuffers = NULL; -+ } -+ -+ // buffers for driving gui sounds if no streams are active -+ if (m_streams.empty()) -+ { -+ inputFormat = m_sinkFormat; -+ inputFormat.m_dataFormat = AE_FMT_FLOAT; -+ inputFormat.m_frameSize = inputFormat.m_channelLayout.Count() * -+ (CAEUtil::DataFormatToBits(inputFormat.m_dataFormat) >> 3); -+ m_silenceBuffers = new CActiveAEBufferPool(inputFormat); -+ m_silenceBuffers->Create(MAX_WATER_LEVEL*1000); -+ sinkInputFormat = inputFormat; -+ m_internalFormat = inputFormat; -+ -+ bool silence = false; -+ m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::SILENCEMODE, &silence, sizeof(bool)); -+ -+ delete m_encoder; -+ m_encoder = NULL; -+ -+ if (m_encoderBuffers) -+ { -+ m_discardBufferPools.push_back(m_encoderBuffers); -+ m_encoderBuffers = NULL; -+ } -+ if (m_vizBuffers) -+ { -+ m_discardBufferPools.push_back(m_vizBuffers); -+ m_vizBuffers = NULL; -+ } -+ } -+ // resample buffers for streams -+ else -+ { -+ bool silence = true; -+ m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::SILENCEMODE, &silence, sizeof(bool)); -+ -+ AEAudioFormat outputFormat; -+ if (m_mode == MODE_RAW) -+ { -+ outputFormat = inputFormat; -+ sinkInputFormat = m_sinkFormat; -+ } -+ // transcode everything with more than 2 channels -+ else if (m_mode == MODE_TRANSCODE) -+ { -+ outputFormat = inputFormat; -+ outputFormat.m_dataFormat = AE_FMT_FLOATP; -+ -+ if (g_advancedSettings.m_audioResample) -+ { -+ outputFormat.m_sampleRate = g_advancedSettings.m_audioResample; -+ CLog::Log(LOGINFO, "CActiveAE::Configure - Forcing samplerate to %d", inputFormat.m_sampleRate); -+ } -+ -+ // setup encoder -+ if (!m_encoder) -+ { -+ m_encoder = new CAEEncoderFFmpeg(); -+ m_encoder->Initialize(outputFormat, true); -+ m_encoderFormat = outputFormat; -+ } -+ else -+ outputFormat = m_encoderFormat; -+ -+ outputFormat.m_channelLayout = m_encoderFormat.m_channelLayout; -+ outputFormat.m_frames = m_encoderFormat.m_frames; -+ -+ // encoder buffer -+ if (m_encoder->GetCodecID() == CODEC_ID_AC3) -+ { -+ AEAudioFormat format; -+ format.m_channelLayout = AE_CH_LAYOUT_2_0; -+ format.m_dataFormat = AE_FMT_S16NE; -+ format.m_frameSize = 2* (CAEUtil::DataFormatToBits(format.m_dataFormat) >> 3); -+ format.m_frames = AC3_FRAME_SIZE; -+ format.m_sampleRate = 48000; -+ if (m_encoderBuffers && initSink) -+ { -+ m_discardBufferPools.push_back(m_encoderBuffers); -+ m_encoderBuffers = NULL; -+ } -+ if (!m_encoderBuffers) -+ { -+ m_encoderBuffers = new CActiveAEBufferPool(format); -+ m_encoderBuffers->Create(MAX_WATER_LEVEL*1000); -+ } -+ } -+ -+ sinkInputFormat = m_sinkFormat; -+ } -+ else -+ { -+ outputFormat = m_sinkFormat; -+ outputFormat.m_channelLayout = m_sinkRequestFormat.m_channelLayout; -+ outputFormat.m_channelLayout.ResolveChannels(m_sinkFormat.m_channelLayout); -+ outputFormat.m_dataFormat = AE_FMT_FLOAT; -+ outputFormat.m_frameSize = outputFormat.m_channelLayout.Count() * -+ (CAEUtil::DataFormatToBits(outputFormat.m_dataFormat) >> 3); -+ // TODO: adjust to decoder -+ sinkInputFormat = outputFormat; -+ } -+ m_internalFormat = outputFormat; -+ -+ std::list::iterator it; -+ for(it=m_streams.begin(); it!=m_streams.end(); ++it) -+ { -+ // check if we support input format of stream -+ if (!AE_IS_RAW((*it)->m_format.m_dataFormat) && -+ CActiveAEResample::GetAVSampleFormat((*it)->m_format.m_dataFormat) == AV_SAMPLE_FMT_FLT && -+ (*it)->m_format.m_dataFormat != AE_FMT_FLOAT) -+ { -+ (*it)->m_convertFn = CAEConvert::ToFloat((*it)->m_format.m_dataFormat); -+ (*it)->m_format.m_dataFormat = AE_FMT_FLOAT; -+ } -+ -+ if (!(*it)->m_inputBuffers) -+ { -+ // align input buffers with period of sink or encoder -+ (*it)->m_format.m_frames = m_internalFormat.m_frames * ((float)(*it)->m_format.m_sampleRate / m_internalFormat.m_sampleRate); -+ -+ // create buffer pool -+ (*it)->m_inputBuffers = new CActiveAEBufferPool((*it)->m_format); -+ (*it)->m_inputBuffers->Create(MAX_CACHE_LEVEL*1000); -+ } -+ if (initSink && (*it)->m_resampleBuffers) -+ { -+ m_discardBufferPools.push_back((*it)->m_resampleBuffers); -+ (*it)->m_resampleBuffers = NULL; -+ } -+ if (!(*it)->m_resampleBuffers) -+ { -+ (*it)->m_resampleBuffers = new CActiveAEBufferPoolResample((*it)->m_inputBuffers->m_format, outputFormat); -+ (*it)->m_resampleBuffers->Create(MAX_CACHE_LEVEL*1000, false); -+ } -+ if (m_mode == MODE_TRANSCODE || m_streams.size() > 1) -+ (*it)->m_resampleBuffers->m_fillPackets = true; -+ } -+ -+ // buffers for viz -+ if (!AE_IS_RAW(inputFormat.m_dataFormat)) -+ { -+ if (initSink && m_vizBuffers) -+ { -+ m_discardBufferPools.push_back(m_vizBuffers); -+ m_vizBuffers = NULL; -+ } -+ if (!m_vizBuffers) -+ { -+ AEAudioFormat vizFormat = m_internalFormat; -+ vizFormat.m_channelLayout = AE_CH_LAYOUT_2_0; -+ vizFormat.m_dataFormat = AE_FMT_FLOAT; -+ m_vizBuffers = new CActiveAEBufferPoolResample(m_internalFormat, vizFormat); -+ // TODO use cache of sync + water level -+ m_vizBuffers->Create(2000, false); -+ } -+ } -+ } -+ -+ // resample buffers for sink -+ if (m_sinkBuffers && !m_sink.IsCompatible(m_sinkBuffers->m_format, device)) -+ { -+ m_discardBufferPools.push_back(m_sinkBuffers); -+ m_sinkBuffers = NULL; -+ } -+ if (!m_sinkBuffers) -+ { -+ m_sinkBuffers = new CActiveAEBufferPoolResample(sinkInputFormat, m_sinkFormat); -+ m_sinkBuffers->Create(MAX_WATER_LEVEL*1000, true); -+ } -+ -+ // reset gui sounds -+ std::vector::iterator it; -+ for (it = m_sounds.begin(); it != m_sounds.end(); ++it) -+ { -+ (*it)->SetConverted(false); -+ } -+ -+ ClearDiscardedBuffers(); -+ m_extDrain = false; -+} -+ -+CActiveAEStream* CActiveAE::CreateStream(MsgStreamNew *streamMsg) -+{ -+ // we only can handle a single pass through stream -+ if (!m_streams.empty()) -+ { -+ if (AE_IS_RAW(m_streams.front()->m_format.m_dataFormat) || AE_IS_RAW(streamMsg->format.m_dataFormat)) -+ return NULL; -+ } -+ -+ // create the stream -+ CActiveAEStream *stream; -+ stream = new CActiveAEStream(&streamMsg->format); -+ stream->m_streamPort = new CActiveAEDataProtocol("stream", -+ &stream->m_inMsgEvent, &m_outMsgEvent); -+ -+ // create buffer pool -+ stream->m_inputBuffers = NULL; // create in Configure when we know the sink format -+ stream->m_resampleBuffers = NULL; // create in Configure when we know the sink format -+ stream->m_statsLock = m_stats.GetLock(); -+ stream->m_fadingSamples = 0; -+ stream->m_started = false; -+ -+ if (streamMsg->options & AESTREAM_PAUSED) -+ stream->m_paused = true; -+ -+ m_streams.push_back(stream); -+ -+ return stream; -+} -+ -+void CActiveAE::DiscardStream(CActiveAEStream *stream) -+{ -+ std::list::iterator it; -+ for (it=m_streams.begin(); it!=m_streams.end(); ) -+ { -+ if (stream == (*it)) -+ { -+ while (!(*it)->m_processingSamples.empty()) -+ { -+ (*it)->m_processingSamples.front()->Return(); -+ (*it)->m_processingSamples.pop_front(); -+ } -+ m_discardBufferPools.push_back((*it)->m_inputBuffers); -+ m_discardBufferPools.push_back((*it)->m_resampleBuffers); -+ CLog::Log(LOGDEBUG, "CActiveAE::DiscardStream - audio stream deleted"); -+ delete (*it)->m_streamPort; -+ delete (*it); -+ it = m_streams.erase(it); -+ } -+ else -+ ++it; -+ } -+ -+ ClearDiscardedBuffers(); -+} -+ -+void CActiveAE::SFlushStream(CActiveAEStream *stream) -+{ -+ while (!stream->m_processingSamples.empty()) -+ { -+ stream->m_processingSamples.front()->Return(); -+ stream->m_processingSamples.pop_front(); -+ } -+ stream->m_resampleBuffers->Flush(); -+ stream->m_streamPort->Purge(); -+ stream->m_bufferedTime = 0.0; -+ stream->m_paused = true; -+} -+ -+void CActiveAE::ClearDiscardedBuffers() -+{ -+ std::list::iterator it; -+ for (it=m_discardBufferPools.begin(); it!=m_discardBufferPools.end(); ++it) -+ { -+ CActiveAEBufferPoolResample *rbuf = dynamic_cast(*it); -+ if (rbuf) -+ { -+ rbuf->Flush(); -+ } -+ // if all buffers have returned, we can delete the buffer pool -+ if ((*it)->m_allSamples.size() == (*it)->m_freeSamples.size()) -+ { -+ delete (*it); -+ CLog::Log(LOGDEBUG, "CActiveAE::ClearDiscardedBuffers - buffer pool deleted"); -+ m_discardBufferPools.erase(it); -+ return; -+ } -+ } -+} -+ -+void CActiveAE::SStopSound(CActiveAESound *sound) -+{ -+ std::list::iterator it; -+ for (it=m_sounds_playing.begin(); it!=m_sounds_playing.end(); ++it) -+ { -+ if (it->sound == sound) -+ { -+ m_sounds_playing.erase(it); -+ return; -+ } -+ } -+} -+ -+void CActiveAE::DiscardSound(CActiveAESound *sound) -+{ -+ SStopSound(sound); -+ -+ std::vector::iterator it; -+ for (it=m_sounds.begin(); it!=m_sounds.end(); ++it) -+ { -+ if ((*it) == sound) -+ { -+ m_sounds.erase(it); -+ return; -+ } -+ } -+} -+ -+float CActiveAE::CalcStreamAmplification(CActiveAEStream *stream, CSampleBuffer *buf) -+{ -+ float amp = 1.0f; -+ int nb_floats = buf->pkt->nb_samples * buf->pkt->config.channels / buf->pkt->planes; -+ float tamp; -+ for(int i=0; ipkt->planes; i++) -+ { -+ tamp = stream->m_limiter.Run((float*)buf->pkt->data[i], nb_floats); -+ amp = std::min(amp, tamp); -+ } -+ return amp; -+} -+ -+void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &settings, bool setmode) -+{ -+ // raw pass through -+ if (m_settings.mode != AUDIO_ANALOG && AE_IS_RAW(format.m_dataFormat)) -+ { -+ if ((format.m_dataFormat == AE_FMT_AC3 && !settings.ac3passthrough) || -+ (format.m_dataFormat == AE_FMT_TRUEHD && !settings.truehdpassthrough) || -+ (format.m_dataFormat == AE_FMT_DTS && !settings.dtspassthrough) || -+ (format.m_dataFormat == AE_FMT_DTSHD && !settings.dtshdpassthrough)) -+ { -+ CLog::Log(LOGERROR, "CActiveAE::ApplySettingsToFormat - input audio format is wrong"); -+ } -+ if (setmode) -+ m_mode = MODE_RAW; -+ } -+ // transcode -+ else if (m_settings.mode != AUDIO_ANALOG && -+ settings.ac3passthrough && -+ (!settings.multichannellpcm || (m_settings.mode != AUDIO_HDMI)) && -+ !m_streams.empty() && -+ format.m_channelLayout.Count() > 2) -+ { -+ format.m_dataFormat = AE_FMT_AC3; -+ format.m_sampleRate = 48000; -+ if (setmode) -+ m_mode = MODE_TRANSCODE; -+ } -+ else -+ { -+ format.m_dataFormat = AE_FMT_FLOAT; -+ if ((format.m_channelLayout.Count() > 2) || settings.stereoupmix) -+ { -+ switch (settings.channels) -+ { -+ default: -+ case 0: format.m_channelLayout = AE_CH_LAYOUT_2_0; break; -+ case 1: format.m_channelLayout = AE_CH_LAYOUT_2_0; break; -+ case 2: format.m_channelLayout = AE_CH_LAYOUT_2_1; break; -+ case 3: format.m_channelLayout = AE_CH_LAYOUT_3_0; break; -+ case 4: format.m_channelLayout = AE_CH_LAYOUT_3_1; break; -+ case 5: format.m_channelLayout = AE_CH_LAYOUT_4_0; break; -+ case 6: format.m_channelLayout = AE_CH_LAYOUT_4_1; break; -+ case 7: format.m_channelLayout = AE_CH_LAYOUT_5_0; break; -+ case 8: format.m_channelLayout = AE_CH_LAYOUT_5_1; break; -+ case 9: format.m_channelLayout = AE_CH_LAYOUT_7_0; break; -+ case 10: format.m_channelLayout = AE_CH_LAYOUT_7_1; break; -+ } -+ } -+ -+ if (g_advancedSettings.m_audioResample) -+ { -+ format.m_sampleRate = g_advancedSettings.m_audioResample; -+ CLog::Log(LOGINFO, "CActiveAE::ApplySettings - Forcing samplerate to %d", format.m_sampleRate); -+ } -+ -+ // for IEC958 limit to 2 channels -+ if (m_settings.mode == AUDIO_IEC958) -+ { -+ format.m_channelLayout = AE_CH_LAYOUT_2_0; -+ } -+ -+ CAEChannelInfo stdLayout = format.m_channelLayout; -+ format.m_channelLayout.ResolveChannels(stdLayout); -+ } -+} -+ -+bool CActiveAE::NeedReconfigureBuffers() -+{ -+ AEAudioFormat newFormat = m_sinkRequestFormat; -+ ApplySettingsToFormat(newFormat, m_settings); -+ -+ if (newFormat.m_dataFormat != m_sinkRequestFormat.m_dataFormat || -+ newFormat.m_channelLayout != m_sinkRequestFormat.m_channelLayout || -+ newFormat.m_sampleRate != m_sinkRequestFormat.m_sampleRate) -+ return true; -+ -+ return false; -+} -+ -+bool CActiveAE::NeedReconfigureSink() -+{ -+ AEAudioFormat newFormat = m_sinkRequestFormat; -+ ApplySettingsToFormat(newFormat, m_settings); -+ -+ std::string device = AE_IS_RAW(newFormat.m_dataFormat) ? m_settings.passthoughdevice : m_settings.device; -+ std::string driver; -+ CAESinkFactory::ParseDevice(device, driver); -+ if (m_settings.driver.compare(driver) != 0) -+ return true; -+ -+ if (!m_sink.IsCompatible(newFormat, device)) -+ return true; -+ -+ return false; -+} -+ -+bool CActiveAE::InitSink() -+{ -+ SinkConfig config; -+ config.format = m_sinkRequestFormat; -+ config.stats = &m_stats; -+ -+ // send message to sink -+ Message *reply; -+ if (m_sink.m_controlPort.SendOutMessageSync(CSinkControlProtocol::CONFIGURE, -+ &reply, -+ 5000, -+ &config, sizeof(config))) -+ { -+ bool success = reply->signal == CSinkControlProtocol::ACC ? true : false; -+ if (!success) -+ { -+ reply->Release(); -+ CLog::Log(LOGERROR, "ActiveAE::%s - returned error", __FUNCTION__); -+ m_extError = true; -+ return false; -+ } -+ AEAudioFormat *data; -+ data = (AEAudioFormat*)reply->data; -+ if (data) -+ { -+ m_sinkFormat = *data; -+ } -+ m_sinkHasVolume = m_sink.HasVolume(); -+ reply->Release(); -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "ActiveAE::%s - failed to init", __FUNCTION__); -+ m_extError = true; -+ return false; -+ } -+ -+ m_inMsgEvent.Reset(); -+ return true; -+} -+ -+void CActiveAE::DrainSink() -+{ -+ // send message to sink -+ Message *reply; -+ if (m_sink.m_dataPort.SendOutMessageSync(CSinkDataProtocol::DRAIN, -+ &reply, -+ 2000)) -+ { -+ bool success = reply->signal == CSinkDataProtocol::ACC ? true : false; -+ if (!success) -+ { -+ reply->Release(); -+ CLog::Log(LOGERROR, "ActiveAE::%s - returned error on drain", __FUNCTION__); -+ m_extError = true; -+ return; -+ } -+ reply->Release(); -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "ActiveAE::%s - failed to drain", __FUNCTION__); -+ m_extError = true; -+ return; -+ } -+} -+ -+void CActiveAE::UnconfigureSink() -+{ -+ // send message to sink -+ Message *reply; -+ if (m_sink.m_controlPort.SendOutMessageSync(CSinkControlProtocol::UNCONFIGURE, -+ &reply, -+ 2000)) -+ { -+ bool success = reply->signal == CSinkControlProtocol::ACC ? true : false; -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "ActiveAE::%s - returned error", __FUNCTION__); -+ m_extError = true; -+ } -+ reply->Release(); -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "ActiveAE::%s - failed to unconfigure", __FUNCTION__); -+ m_extError = true; -+ } -+ -+ m_inMsgEvent.Reset(); -+} -+ -+ -+bool CActiveAE::RunStages() -+{ -+ bool busy = false; -+ -+ // serve input streams -+ std::list::iterator it; -+ for (it = m_streams.begin(); it != m_streams.end(); ++it) -+ { -+ if ((*it)->m_resampleBuffers && !(*it)->m_paused) -+ busy = (*it)->m_resampleBuffers->ResampleBuffers(); -+ else if ((*it)->m_resampleBuffers && -+ ((*it)->m_resampleBuffers->m_inputSamples.size() > (*it)->m_resampleBuffers->m_allSamples.size() * 0.5)) -+ { -+ CSingleLock lock((*it)->m_streamLock); -+ (*it)->m_streamIsBuffering = false; -+ } -+ -+ // provide buffers to stream -+ float time = m_stats.GetCacheTime((*it)); -+ CSampleBuffer *buffer; -+ if (!(*it)->m_drain) -+ { -+ while (time < MAX_CACHE_LEVEL && !(*it)->m_inputBuffers->m_freeSamples.empty()) -+ { -+ buffer = (*it)->m_inputBuffers->GetFreeBuffer(); -+ (*it)->m_processingSamples.push_back(buffer); -+ (*it)->m_streamPort->SendInMessage(CActiveAEDataProtocol::STREAMBUFFER, &buffer, sizeof(CSampleBuffer*)); -+ (*it)->IncFreeBuffers(); -+ time += (float)buffer->pkt->max_nb_samples / buffer->pkt->config.sample_rate; -+ } -+ } -+ else -+ { -+ if ((*it)->m_inputBuffers->m_allSamples.size() == (*it)->m_inputBuffers->m_freeSamples.size()) -+ { -+ (*it)->m_streamPort->SendInMessage(CActiveAEDataProtocol::STREAMDRAINED); -+ (*it)->m_drain = false; -+ (*it)->m_resampleBuffers->m_drain = false; -+ (*it)->m_started = false; -+ -+ // set variables being polled via stream interface -+ CSingleLock lock((*it)->m_streamLock); -+ if ((*it)->m_streamSlave) -+ { -+ CActiveAEStream *slave = (CActiveAEStream*)((*it)->m_streamSlave); -+ slave->m_paused = false; -+ Configure(&slave->m_format); -+ (*it)->m_streamSlave = NULL; -+ } -+ (*it)->m_streamDrained = true; -+ (*it)->m_streamDraining = false; -+ } -+ } -+ } -+ -+ if (m_stats.GetWaterLevel() < MAX_WATER_LEVEL && -+ (m_mode != MODE_TRANSCODE || (m_encoderBuffers && !m_encoderBuffers->m_freeSamples.empty()))) -+ { -+ // mix streams and sounds sounds -+ if (m_mode != MODE_RAW) -+ { -+ CSampleBuffer *out = NULL; -+ if (!m_sounds_playing.empty() && m_streams.empty()) -+ { -+ if (m_silenceBuffers && !m_silenceBuffers->m_freeSamples.empty()) -+ { -+ out = m_silenceBuffers->GetFreeBuffer(); -+ for (int i=0; ipkt->planes; i++) -+ { -+ memset(out->pkt->data[i], 0, out->pkt->linesize); -+ } -+ out->pkt->nb_samples = out->pkt->max_nb_samples; -+ } -+ } -+ -+ // mix streams -+ std::list::iterator it; -+ -+ // if we deal with more than a single stream, all streams -+ // must provide samples for mixing -+ bool allStreamsReady = true; -+ for (it = m_streams.begin(); it != m_streams.end(); ++it) -+ { -+ if ((*it)->m_paused || !(*it)->m_started || !(*it)->m_resampleBuffers) -+ continue; -+ -+ if ((*it)->m_resampleBuffers->m_outputSamples.empty()) -+ allStreamsReady = false; -+ } -+ -+ for (it = m_streams.begin(); it != m_streams.end() && allStreamsReady; ++it) -+ { -+ if ((*it)->m_paused || !(*it)->m_resampleBuffers) -+ continue; -+ -+ if (!(*it)->m_resampleBuffers->m_outputSamples.empty()) -+ { -+ (*it)->m_started = true; -+ -+ if (!out) -+ { -+ out = (*it)->m_resampleBuffers->m_outputSamples.front(); -+ (*it)->m_resampleBuffers->m_outputSamples.pop_front(); -+ -+ // volume for stream -+ float amp = (*it)->m_rgain * CalcStreamAmplification((*it), out); -+ -+ int nb_floats = out->pkt->nb_samples * out->pkt->config.channels / out->pkt->planes; -+ int nb_loops = 1; -+ float fadingStep; -+ -+ // fading -+ if ((*it)->m_fadingSamples == -1) -+ { -+ (*it)->m_fadingSamples = m_internalFormat.m_sampleRate * (float)(*it)->m_fadingTime / 1000.0f; -+ (*it)->m_volume = (*it)->m_fadingBase; -+ } -+ if ((*it)->m_fadingSamples > 0) -+ { -+ nb_floats = out->pkt->config.channels / out->pkt->planes; -+ nb_loops = out->pkt->nb_samples; -+ float delta = (*it)->m_fadingTarget - (*it)->m_fadingBase; -+ int samples = m_internalFormat.m_sampleRate * (float)(*it)->m_fadingTime / 1000.0f; -+ fadingStep = delta / samples; -+ } -+ for(int i=0; im_fadingSamples > 0) -+ { -+ (*it)->m_volume += fadingStep; -+ (*it)->m_fadingSamples--; -+ -+ if ((*it)->m_fadingSamples == 0) -+ { -+ // set variables being polled via stream interface -+ CSingleLock lock((*it)->m_streamLock); -+ (*it)->m_streamFading = false; -+ } -+ } -+ float volume = (*it)->m_volume * amp; -+ -+ for(int j=0; jpkt->planes; j++) -+ { -+#ifdef __SSE__ -+ CAEUtil::SSEMulArray((float*)out->pkt->data[j]+i*nb_floats, m_muted ? 0.0 : volume, nb_floats); -+#else -+ float* fbuffer = (float*) out->pkt->data[j]+i*nb_floats; -+ for (int k = 0; k < nb_floats; ++k) -+ *fbuffer++ *= m_muted ? 0.0 : volume; -+#endif -+ } -+ } -+ } -+ else -+ { -+ CSampleBuffer *mix = NULL; -+ mix = (*it)->m_resampleBuffers->m_outputSamples.front(); -+ (*it)->m_resampleBuffers->m_outputSamples.pop_front(); -+ -+ // volume for stream -+ float amp = (*it)->m_volume * (*it)->m_rgain * CalcStreamAmplification((*it), mix); -+ -+ int nb_floats = mix->pkt->nb_samples * mix->pkt->config.channels / mix->pkt->planes; -+ int nb_loops = 1; -+ float fadingStep; -+ -+ // fading -+ if ((*it)->m_fadingSamples == -1) -+ { -+ (*it)->m_fadingSamples = m_internalFormat.m_sampleRate * (float)(*it)->m_fadingTime / 1000.0f; -+ (*it)->m_volume = (*it)->m_fadingBase; -+ } -+ if ((*it)->m_fadingSamples > 0) -+ { -+ nb_floats = mix->pkt->config.channels / mix->pkt->planes; -+ nb_loops = mix->pkt->nb_samples; -+ float delta = (*it)->m_fadingTarget - (*it)->m_fadingBase; -+ int samples = m_internalFormat.m_sampleRate * (float)(*it)->m_fadingTime / 1000.0f; -+ fadingStep = delta / samples; -+ } -+ for(int i=0; im_fadingSamples > 0) -+ { -+ (*it)->m_volume += fadingStep; -+ (*it)->m_fadingSamples--; -+ -+ if ((*it)->m_fadingSamples == 0) -+ { -+ // set variables being polled via stream interface -+ CSingleLock lock((*it)->m_streamLock); -+ (*it)->m_streamFading = false; -+ } -+ } -+ float volume = (*it)->m_volume * amp; -+ -+ for(int j=0; jpkt->planes && jpkt->planes; j++) -+ { -+ float *dst = (float*)out->pkt->data[j]+i*nb_floats; -+ float *src = (float*)mix->pkt->data[j]+i*nb_floats; -+#ifdef __SSE__ -+ CAEUtil::SSEMulAddArray(dst, src, m_muted ? 0.0 : volume, nb_floats); -+#else -+ for (int k = 0; k < nb_floats; ++k) -+ *dst++ += *src++ * m_muted ? 0.0 : volume; -+#endif -+ } -+ } -+ mix->Return(); -+ } -+ busy = true; -+ } -+ } -+ -+ // process output buffer, gui sounds, encode, viz -+ if (out) -+ { -+ // mix gui sounds -+ MixSounds(*(out->pkt)); -+ if (!m_sinkHasVolume) -+ Deamplify(*(out->pkt)); -+ -+ // viz -+ { -+ CSingleLock lock(m_vizLock); -+ if (m_audioCallback && m_vizBuffers) -+ { -+ if (!m_vizInitialized) -+ { -+ m_audioCallback->OnInitialize(2, m_vizBuffers->m_format.m_sampleRate, 32); -+ m_vizInitialized = true; -+ } -+ -+ // if viz has no free buffer, it won't return current buffer "out" -+ if (!m_vizBuffers->m_freeSamples.empty()) -+ { -+ out->Acquire(); -+ m_vizBuffers->m_inputSamples.push_back(out); -+ } -+ else -+ CLog::Log(LOGWARNING,"ActiveAE::%s - viz ran out of free buffers", __FUNCTION__); -+ unsigned int now = XbmcThreads::SystemClockMillis(); -+ unsigned int timestamp = now + m_stats.GetDelay() * 1000; -+ m_vizBuffers->ResampleBuffers(timestamp); -+ while(!m_vizBuffers->m_outputSamples.empty()) -+ { -+ CSampleBuffer *buf = m_vizBuffers->m_outputSamples.front(); -+ if ((now - buf->timestamp) & 0x80000000) -+ break; -+ else -+ { -+ int submitted = 0; -+ int samples; -+ while(submitted < buf->pkt->nb_samples) -+ { -+ samples = std::min(512, buf->pkt->nb_samples-submitted); -+ m_audioCallback->OnAudioData((float*)(buf->pkt->data[0]+2*submitted), samples); -+ submitted += samples; -+ } -+ buf->Return(); -+ m_vizBuffers->m_outputSamples.pop_front(); -+ } -+ } -+ } -+ else if (m_vizBuffers) -+ m_vizBuffers->Flush(); -+ } -+ -+ // encode -+ if (m_mode == MODE_TRANSCODE && m_encoder) -+ { -+ CSampleBuffer *buf = m_encoderBuffers->GetFreeBuffer(); -+ int ret = m_encoder->Encode(out->pkt->data[0], out->pkt->planes*out->pkt->linesize, -+ buf->pkt->data[0], buf->pkt->planes*buf->pkt->linesize); -+ buf->pkt->nb_samples = buf->pkt->max_nb_samples; -+ out->Return(); -+ out = buf; -+ } -+ -+ // update stats -+ m_stats.AddSamples(out->pkt->nb_samples, m_streams); -+ m_sinkBuffers->m_inputSamples.push_back(out); -+ -+ busy = true; -+ } -+ } -+ // pass through -+ else -+ { -+ std::list::iterator it; -+ CSampleBuffer *buffer; -+ for (it = m_streams.begin(); it != m_streams.end(); ++it) -+ { -+ if (!(*it)->m_resampleBuffers->m_outputSamples.empty()) -+ { -+ buffer = (*it)->m_resampleBuffers->m_outputSamples.front(); -+ (*it)->m_resampleBuffers->m_outputSamples.pop_front(); -+ m_stats.AddSamples(buffer->pkt->nb_samples, m_streams); -+ m_sinkBuffers->m_inputSamples.push_back(buffer); -+ } -+ } -+ } -+ -+ // serve sink buffers -+ busy = m_sinkBuffers->ResampleBuffers(); -+ while(!m_sinkBuffers->m_outputSamples.empty()) -+ { -+ CSampleBuffer *out = NULL; -+ out = m_sinkBuffers->m_outputSamples.front(); -+ m_sinkBuffers->m_outputSamples.pop_front(); -+ m_sink.m_dataPort.SendOutMessage(CSinkDataProtocol::SAMPLE, -+ &out, sizeof(CSampleBuffer*)); -+ busy = true; -+ } -+ } -+ -+ return busy; -+} -+ -+bool CActiveAE::HasWork() -+{ -+ if (!m_sounds_playing.empty()) -+ return true; -+ if (!m_sinkBuffers->m_inputSamples.empty()) -+ return true; -+ if (!m_sinkBuffers->m_outputSamples.empty()) -+ return true; -+ -+ std::list::iterator it; -+ for (it = m_streams.begin(); it != m_streams.end(); ++it) -+ { -+ if (!(*it)->m_resampleBuffers->m_inputSamples.empty()) -+ return true; -+ if (!(*it)->m_resampleBuffers->m_outputSamples.empty()) -+ return true; -+ if (!(*it)->m_processingSamples.empty()) -+ return true; -+ } -+ -+ return false; -+} -+ -+void CActiveAE::MixSounds(CSoundPacket &dstSample) -+{ -+ if (m_sounds_playing.empty()) -+ return; -+ -+ float volume; -+ float *out; -+ float *sample_buffer; -+ int max_samples = dstSample.nb_samples; -+ -+ std::list::iterator it; -+ for (it = m_sounds_playing.begin(); it != m_sounds_playing.end(); ) -+ { -+ if (!it->sound->IsConverted()) -+ ResampleSound(it->sound); -+ int available_samples = it->sound->GetSound(false)->nb_samples - it->samples_played; -+ int mix_samples = std::min(max_samples, available_samples); -+ int start = it->samples_played * -+ m_dllAvUtil.av_get_bytes_per_sample(it->sound->GetSound(false)->config.fmt) * -+ it->sound->GetSound(false)->config.channels / -+ it->sound->GetSound(false)->planes; -+ -+ for(int j=0; jsound->GetVolume(); -+ out = (float*)dstSample.data[j]; -+ sample_buffer = (float*)(it->sound->GetSound(false)->data[j]+start); -+ int nb_floats = mix_samples * dstSample.config.channels / dstSample.planes; -+#ifdef __SSE__ -+ CAEUtil::SSEMulAddArray(out, sample_buffer, volume, nb_floats); -+#else -+ for (int k = 0; k < nb_floats; ++k) -+ *out++ += *sample_buffer++ * volume; -+#endif -+ } -+ -+ it->samples_played += mix_samples; -+ -+ // no more frames, so remove it from the list -+ if (it->samples_played >= it->sound->GetSound(false)->nb_samples) -+ { -+ it = m_sounds_playing.erase(it); -+ continue; -+ } -+ ++it; -+ } -+} -+ -+void CActiveAE::Deamplify(CSoundPacket &dstSample) -+{ -+ if (m_volume < 1.0) -+ { -+ float *buffer; -+ int nb_floats = dstSample.nb_samples * dstSample.config.channels / dstSample.planes; -+ -+ for(int j=0; jsignal == CActiveAEControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "ActiveAE::%s - returned error", __FUNCTION__); -+ Dispose(); -+ return false; -+ } -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "ActiveAE::%s - failed to init", __FUNCTION__); -+ Dispose(); -+ return false; -+ } -+ -+ // hook into windowing for receiving display reset events -+#if defined(HAS_GLX) || defined(TARGET_DARWIN_OSX) -+ g_Windowing.Register(this); -+#endif -+ -+ m_inMsgEvent.Reset(); -+ return true; -+} -+ -+void CActiveAE::EnumerateOutputDevices(AEDeviceList &devices, bool passthrough) -+{ -+ m_sink.EnumerateOutputDevices(devices, passthrough); -+} -+ -+std::string CActiveAE::GetDefaultDevice(bool passthrough) -+{ -+ return m_sink.GetDefaultDevice(passthrough); -+} -+ -+void CActiveAE::OnSettingsChange(const std::string& setting) -+{ -+ if (setting == "audiooutput.passthroughdevice" || -+ setting == "audiooutput.audiodevice" || -+ setting == "audiooutput.mode" || -+ setting == "audiooutput.ac3passthrough" || -+ setting == "audiooutput.dtspassthrough" || -+ setting == "audiooutput.passthroughaac" || -+ setting == "audiooutput.truehdpassthrough" || -+ setting == "audiooutput.dtshdpassthrough" || -+ setting == "audiooutput.channels" || -+ setting == "audiooutput.multichannellpcm" || -+ setting == "audiooutput.stereoupmix") -+ { -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::RECONFIGURE); -+ } -+} -+ -+bool CActiveAE::SupportsRaw() -+{ -+ return true; -+} -+ -+void CActiveAE::Shutdown() -+{ -+ Dispose(); -+} -+ -+bool CActiveAE::Suspend() -+{ -+ return m_controlPort.SendOutMessage(CActiveAEControlProtocol::SUSPEND); -+} -+ -+bool CActiveAE::Resume() -+{ -+ Message *reply; -+ if (m_controlPort.SendOutMessageSync(CActiveAEControlProtocol::INIT, -+ &reply, -+ 5000)) -+ { -+ bool success = reply->signal == CActiveAEControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "ActiveAE::%s - returned error", __FUNCTION__); -+ return false; -+ } -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "ActiveAE::%s - failed to init", __FUNCTION__); -+ return false; -+ } -+ -+ m_inMsgEvent.Reset(); -+ return true; -+} -+ -+bool CActiveAE::IsSuspended() -+{ -+ return m_stats.IsSuspended(); -+} -+ -+float CActiveAE::GetVolume() -+{ -+ return m_aeVolume; -+} -+ -+void CActiveAE::SetVolume(const float volume) -+{ -+ m_aeVolume = std::max( 0.0f, std::min(1.0f, volume)); -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::VOLUME, &m_aeVolume, sizeof(float)); -+} -+ -+void CActiveAE::SetMute(const bool enabled) -+{ -+ m_aeMuted = enabled; -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::MUTE, &m_aeMuted, sizeof(bool)); -+} -+ -+bool CActiveAE::IsMuted() -+{ -+ return m_aeMuted; -+} -+ -+void CActiveAE::SetSoundMode(const int mode) -+{ -+ int soundmode = mode; -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::SOUNDMODE, &soundmode, sizeof(int)); -+} -+ -+ -+void CActiveAE::OnLostDevice() -+{ -+// m_controlPort.SendOutMessage(CActiveAEControlProtocol::DISPLAYLOST); -+} -+ -+void CActiveAE::OnResetDevice() -+{ -+// m_controlPort.SendOutMessage(CActiveAEControlProtocol::DISPLAYRESET); -+} -+ -+//----------------------------------------------------------------------------- -+// Utils -+//----------------------------------------------------------------------------- -+ -+uint8_t **CActiveAE::AllocSoundSample(SampleConfig &config, int &samples, int &bytes_per_sample, int &planes, int &linesize) -+{ -+ uint8_t **buffer; -+ planes = m_dllAvUtil.av_sample_fmt_is_planar(config.fmt) ? config.channels : 1; -+ buffer = new uint8_t*[planes]; -+ m_dllAvUtil.av_samples_alloc(buffer, &linesize, config.channels, -+ samples, config.fmt, 0); -+ bytes_per_sample = m_dllAvUtil.av_get_bytes_per_sample(config.fmt); -+ return buffer; -+} -+ -+void CActiveAE::FreeSoundSample(uint8_t **data) -+{ -+ m_dllAvUtil.av_freep(data); -+ delete [] data; -+} -+ -+//----------------------------------------------------------------------------- -+// GUI Sounds -+//----------------------------------------------------------------------------- -+ -+/** -+ * load sound from an audio file and store original format -+ * register the sound in ActiveAE -+ * later when the engine is idle it will convert the sound to sink format -+ */ -+ -+#define SOUNDBUFFER_SIZE 20480 -+ -+IAESound *CActiveAE::MakeSound(const std::string& file) -+{ -+ AVFormatContext *fmt_ctx = NULL; -+ AVCodecContext *dec_ctx = NULL; -+ AVIOContext *io_ctx; -+ AVInputFormat *io_fmt; -+ AVCodec *dec = NULL; -+ int bit_rate; -+ CActiveAESound *sound = NULL; -+ SampleConfig config; -+ -+ sound = new CActiveAESound(file); -+ if (!sound->Prepare()) -+ return NULL; -+ int fileSize = sound->GetFileSize(); -+ -+ fmt_ctx = m_dllAvFormat.avformat_alloc_context(); -+ unsigned char* buffer = (unsigned char*)m_dllAvUtil.av_malloc(SOUNDBUFFER_SIZE+FF_INPUT_BUFFER_PADDING_SIZE); -+ io_ctx = m_dllAvFormat.avio_alloc_context(buffer, SOUNDBUFFER_SIZE, 0, -+ sound, CActiveAESound::Read, NULL, CActiveAESound::Seek); -+ io_ctx->max_packet_size = sound->GetChunkSize(); -+ if(io_ctx->max_packet_size) -+ io_ctx->max_packet_size *= SOUNDBUFFER_SIZE / io_ctx->max_packet_size; -+ -+ if(!sound->IsSeekPosible()) -+ io_ctx->seekable = 0; -+ -+ fmt_ctx->pb = io_ctx; -+ -+ m_dllAvFormat.av_probe_input_buffer(io_ctx, &io_fmt, file.c_str(), NULL, 0, 0); -+ if (!io_fmt) -+ { -+ m_dllAvFormat.avformat_close_input(&fmt_ctx); -+ delete sound; -+ return NULL; -+ } -+ -+ // find decoder -+ if (m_dllAvFormat.avformat_open_input(&fmt_ctx, file.c_str(), NULL, NULL) == 0) -+ { -+ fmt_ctx->flags |= AVFMT_FLAG_NOPARSE; -+ if (m_dllAvFormat.avformat_find_stream_info(fmt_ctx, NULL) >= 0) -+ { -+ dec_ctx = fmt_ctx->streams[0]->codec; -+ dec = m_dllAvCodec.avcodec_find_decoder(dec_ctx->codec_id); -+ config.sample_rate = dec_ctx->sample_rate; -+ bit_rate = dec_ctx->bit_rate; -+ config.channels = dec_ctx->channels; -+ config.channel_layout = dec_ctx->channel_layout; -+ } -+ } -+ if (dec == NULL) -+ { -+ m_dllAvFormat.avformat_close_input(&fmt_ctx); -+ delete sound; -+ return NULL; -+ } -+ -+ dec_ctx = m_dllAvCodec.avcodec_alloc_context3(dec); -+ dec_ctx->sample_rate = config.sample_rate; -+ dec_ctx->channels = config.channels; -+ if (!config.channel_layout) -+ config.channel_layout = m_dllAvUtil.av_get_default_channel_layout(config.channels); -+ dec_ctx->channel_layout = config.channel_layout; -+ -+ AVPacket avpkt; -+ AVFrame *decoded_frame = NULL; -+ decoded_frame = m_dllAvCodec.avcodec_alloc_frame(); -+ -+ if (m_dllAvCodec.avcodec_open2(dec_ctx, dec, NULL) >= 0) -+ { -+ bool init = false; -+ -+ // decode until eof -+ m_dllAvCodec.av_init_packet(&avpkt); -+ int len; -+ while (m_dllAvFormat.av_read_frame(fmt_ctx, &avpkt) >= 0) -+ { -+ int got_frame = 0; -+ len = m_dllAvCodec.avcodec_decode_audio4(dec_ctx, decoded_frame, &got_frame, &avpkt); -+ if (len < 0) -+ { -+ m_dllAvCodec.avcodec_close(dec_ctx); -+ m_dllAvUtil.av_free(dec_ctx); -+ m_dllAvUtil.av_free(&decoded_frame); -+ m_dllAvFormat.avformat_close_input(&fmt_ctx); -+ delete sound; -+ return NULL; -+ } -+ if (got_frame) -+ { -+ if (!init) -+ { -+ int samples = fileSize / m_dllAvUtil.av_get_bytes_per_sample(dec_ctx->sample_fmt) / config.channels; -+ config.fmt = dec_ctx->sample_fmt; -+ sound->InitSound(true, config, samples); -+ init = true; -+ } -+ sound->StoreSound(true, decoded_frame->extended_data, -+ decoded_frame->nb_samples, decoded_frame->linesize[0]); -+ } -+ } -+ m_dllAvCodec.avcodec_close(dec_ctx); -+ } -+ -+ m_dllAvUtil.av_free(dec_ctx); -+ m_dllAvUtil.av_free(decoded_frame); -+ m_dllAvFormat.avformat_close_input(&fmt_ctx); -+ -+ sound->Finish(); -+ -+ // register sound -+ m_dataPort.SendOutMessage(CActiveAEDataProtocol::NEWSOUND, &sound, sizeof(CActiveAESound*)); -+ -+ return sound; -+} -+ -+void CActiveAE::FreeSound(IAESound *sound) -+{ -+ m_dataPort.SendOutMessage(CActiveAEDataProtocol::FREESOUND, &sound, sizeof(CActiveAESound*)); -+} -+ -+void CActiveAE::PlaySound(CActiveAESound *sound) -+{ -+ m_dataPort.SendOutMessage(CActiveAEDataProtocol::PLAYSOUND, &sound, sizeof(CActiveAESound*)); -+} -+ -+void CActiveAE::StopSound(CActiveAESound *sound) -+{ -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::STOPSOUND, &sound, sizeof(CActiveAESound*)); -+} -+ -+/** -+ * resample sounds to destination format for mixing -+ * destination format is either format of stream or -+ * default sink format when no stream is playing -+ */ -+void CActiveAE::ResampleSounds() -+{ -+ std::vector::iterator it; -+ for (it = m_sounds.begin(); it != m_sounds.end(); ++it) -+ { -+ if (!(*it)->IsConverted()) -+ ResampleSound(*it); -+ } -+} -+ -+bool CActiveAE::ResampleSound(CActiveAESound *sound) -+{ -+ SampleConfig orig_config, dst_config; -+ uint8_t **dst_buffer; -+ int dst_samples; -+ -+ if (m_mode == MODE_RAW || m_internalFormat.m_dataFormat == AE_FMT_INVALID) -+ return false; -+ -+ if (!sound->GetSound(true)) -+ return false; -+ -+ orig_config = sound->GetSound(true)->config; -+ -+ dst_config.channel_layout = CActiveAEResample::GetAVChannelLayout(m_internalFormat.m_channelLayout); -+ dst_config.channels = m_internalFormat.m_channelLayout.Count(); -+ dst_config.sample_rate = m_internalFormat.m_sampleRate; -+ dst_config.fmt = CActiveAEResample::GetAVSampleFormat(m_internalFormat.m_dataFormat); -+ -+ CActiveAEResample *resampler = new CActiveAEResample(); -+ resampler->Init(dst_config.channel_layout, -+ dst_config.channels, -+ dst_config.sample_rate, -+ dst_config.fmt, -+ orig_config.channel_layout, -+ orig_config.channels, -+ orig_config.sample_rate, -+ orig_config.fmt, -+ NULL); -+ -+ dst_samples = resampler->CalcDstSampleCount(sound->GetSound(true)->nb_samples, -+ m_internalFormat.m_sampleRate, -+ orig_config.sample_rate); -+ -+ dst_buffer = sound->InitSound(false, dst_config, dst_samples); -+ if (!dst_buffer) -+ { -+ delete resampler; -+ return false; -+ } -+ int samples = resampler->Resample(dst_buffer, dst_samples, -+ sound->GetSound(true)->data, -+ sound->GetSound(true)->nb_samples); -+ -+ sound->GetSound(false)->nb_samples = samples; -+ -+ delete resampler; -+ sound->SetConverted(true); -+ return true; -+} -+ -+//----------------------------------------------------------------------------- -+// Streams -+//----------------------------------------------------------------------------- -+ -+IAEStream *CActiveAE::MakeStream(enum AEDataFormat dataFormat, unsigned int sampleRate, unsigned int encodedSampleRate, CAEChannelInfo channelLayout, unsigned int options) -+{ -+ //TODO: pass number of samples in audio packet -+ -+ AEAudioFormat format; -+ format.m_dataFormat = dataFormat; -+ format.m_sampleRate = sampleRate; -+ format.m_encodedRate = encodedSampleRate; -+ format.m_channelLayout = channelLayout; -+ format.m_frames = format.m_sampleRate / 10; -+ format.m_frameSize = format.m_channelLayout.Count() * -+ (CAEUtil::DataFormatToBits(format.m_dataFormat) >> 3); -+ -+ MsgStreamNew msg; -+ msg.format = format; -+ msg.options = options; -+ -+ Message *reply; -+ if (m_dataPort.SendOutMessageSync(CActiveAEDataProtocol::NEWSTREAM, -+ &reply,1000, -+ &msg, sizeof(MsgStreamNew))) -+ { -+ bool success = reply->signal == CActiveAEControlProtocol::ACC ? true : false; -+ if (success) -+ { -+ CActiveAEStream *stream = *(CActiveAEStream**)reply->data; -+ reply->Release(); -+ return stream; -+ } -+ reply->Release(); -+ } -+ -+ CLog::Log(LOGERROR, "ActiveAE::%s - could not create stream", __FUNCTION__); -+ return NULL; -+} -+ -+IAEStream *CActiveAE::FreeStream(IAEStream *stream) -+{ -+ m_dataPort.SendOutMessage(CActiveAEDataProtocol::FREESTREAM, &stream, sizeof(IAEStream*)); -+ return NULL; -+} -+ -+void CActiveAE::FlushStream(CActiveAEStream *stream) -+{ -+ Message *reply; -+ if (m_dataPort.SendOutMessageSync(CActiveAEDataProtocol::FLUSHSTREAM, -+ &reply,1000, -+ &stream, sizeof(CActiveAEStream*))) -+ { -+ bool success = reply->signal == CActiveAEDataProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "CActiveAE::FlushStream - failed"); -+ } -+ } -+} -+ -+void CActiveAE::PauseStream(CActiveAEStream *stream, bool pause) -+{ -+ // TODO pause sink, needs api change -+ if (pause) -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::PAUSESTREAM, -+ &stream, sizeof(CActiveAEStream*)); -+ else -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::RESUMESTREAM, -+ &stream, sizeof(CActiveAEStream*)); -+} -+ -+void CActiveAE::SetStreamAmplification(CActiveAEStream *stream, float amplify) -+{ -+ MsgStreamParameter msg; -+ msg.stream = stream; -+ msg.parameter.float_par = amplify; -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::STREAMAMP, -+ &msg, sizeof(MsgStreamParameter)); -+} -+ -+void CActiveAE::SetStreamReplaygain(CActiveAEStream *stream, float rgain) -+{ -+ MsgStreamParameter msg; -+ msg.stream = stream; -+ msg.parameter.float_par = rgain; -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::STREAMRGAIN, -+ &msg, sizeof(MsgStreamParameter)); -+} -+ -+void CActiveAE::SetStreamVolume(CActiveAEStream *stream, float volume) -+{ -+ MsgStreamParameter msg; -+ msg.stream = stream; -+ msg.parameter.float_par = volume; -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::STREAMVOLUME, -+ &msg, sizeof(MsgStreamParameter)); -+} -+ -+void CActiveAE::SetStreamResampleRatio(CActiveAEStream *stream, double ratio) -+{ -+ MsgStreamParameter msg; -+ msg.stream = stream; -+ msg.parameter.double_par = ratio; -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::STREAMRESAMPLERATIO, -+ &msg, sizeof(MsgStreamParameter)); -+} -+ -+void CActiveAE::SetStreamFade(CActiveAEStream *stream, float from, float target, unsigned int millis) -+{ -+ MsgStreamFade msg; -+ msg.stream = stream; -+ msg.from = from; -+ msg.target = target; -+ msg.millis = millis; -+ m_controlPort.SendOutMessage(CActiveAEControlProtocol::STREAMFADE, -+ &msg, sizeof(MsgStreamFade)); -+} -+ -+void CActiveAE::RegisterAudioCallback(IAudioCallback* pCallback) -+{ -+ CSingleLock lock(m_vizLock); -+ m_audioCallback = pCallback; -+ m_vizInitialized = false; -+} -+ -+void CActiveAE::UnregisterAudioCallback() -+{ -+ CSingleLock lock(m_vizLock); -+ m_audioCallback = NULL; -+} -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -new file mode 100644 -index 0000000..d5c5d97 ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -@@ -0,0 +1,334 @@ -+#pragma once -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include "system.h" -+#include "threads/Thread.h" -+ -+#include "ActiveAESink.h" -+#include "ActiveAEResample.h" -+#include "Interfaces/AEStream.h" -+#include "Interfaces/AESound.h" -+#include "AEFactory.h" -+#include "guilib/DispResource.h" -+ -+// ffmpeg -+#include "DllAvFormat.h" -+#include "DllAvCodec.h" -+#include "DllAvUtil.h" -+ -+class IAESink; -+class IAEEncoder; -+ -+namespace ActiveAE -+{ -+ -+class CActiveAESound; -+class CActiveAEStream; -+ -+struct AudioSettings -+{ -+ std::string device; -+ std::string driver; -+ std::string passthoughdevice; -+ int mode; -+ int channels; -+ bool ac3passthrough; -+ bool dtspassthrough; -+ bool aacpassthrough; -+ bool truehdpassthrough; -+ bool dtshdpassthrough; -+ bool multichannellpcm; -+ bool stereoupmix; -+}; -+ -+class CActiveAEControlProtocol : public Protocol -+{ -+public: -+ CActiveAEControlProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ INIT = 0, -+ RECONFIGURE, -+ SUSPEND, -+ MUTE, -+ VOLUME, -+ PAUSESTREAM, -+ RESUMESTREAM, -+ STREAMRGAIN, -+ STREAMVOLUME, -+ STREAMAMP, -+ STREAMRESAMPLERATIO, -+ STREAMFADE, -+ STOPSOUND, -+ SOUNDMODE, -+ GETSTATE, -+ DISPLAYLOST, -+ DISPLAYRESET, -+ TIMEOUT, -+ }; -+ enum InSignal -+ { -+ ACC, -+ ERR, -+ STATS, -+ }; -+}; -+ -+class CActiveAEDataProtocol : public Protocol -+{ -+public: -+ CActiveAEDataProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ NEWSOUND = 0, -+ PLAYSOUND, -+ FREESOUND, -+ NEWSTREAM, -+ FREESTREAM, -+ STREAMSAMPLE, -+ DRAINSTREAM, -+ FLUSHSTREAM, -+ }; -+ enum InSignal -+ { -+ ACC, -+ ERR, -+ STREAMBUFFER, -+ STREAMDRAINED, -+ }; -+}; -+ -+struct MsgStreamNew -+{ -+ AEAudioFormat format; -+ unsigned int options; -+}; -+ -+struct MsgStreamSample -+{ -+ CSampleBuffer *buffer; -+ CActiveAEStream *stream; -+}; -+ -+struct MsgStreamParameter -+{ -+ CActiveAEStream *stream; -+ union -+ { -+ float float_par; -+ double double_par; -+ } parameter; -+}; -+ -+struct MsgStreamFade -+{ -+ CActiveAEStream *stream; -+ float from; -+ float target; -+ unsigned int millis; -+}; -+ -+class CEngineStats -+{ -+public: -+ void Reset(unsigned int sampleRate); -+ void UpdateSinkDelay(double delay, int samples); -+ void AddSamples(int samples, std::list &streams); -+ float GetDelay(); -+ float GetDelay(CActiveAEStream *stream); -+ float GetCacheTime(CActiveAEStream *stream); -+ float GetCacheTotal(CActiveAEStream *stream); -+ float GetWaterLevel(); -+ void SetSuspended(bool state); -+ void SetSinkCacheTotal(float time) { m_sinkCacheTotal = time; } -+ bool IsSuspended(); -+ CCriticalSection *GetLock() { return &m_lock; } -+protected: -+ float m_sinkDelay; -+ float m_sinkCacheTotal; -+ int m_bufferedSamples; -+ unsigned int m_sinkSampleRate; -+ unsigned int m_sinkUpdate; -+ bool m_suspended; -+ CCriticalSection m_lock; -+}; -+ -+#if defined(HAS_GLX) || defined(TARGET_DARWIN_OSX) -+class CActiveAE : public IAE, public IDispResource, private CThread -+#else -+class CActiveAE : public IAE, private CThread -+#endif -+{ -+protected: -+ friend class ::CAEFactory; -+ friend class CActiveAESound; -+ friend class CActiveAEStream; -+ friend class CSoundPacket; -+ friend class CActiveAEBufferPoolResample; -+ CActiveAE(); -+ virtual ~CActiveAE(); -+ virtual bool Initialize(); -+ -+public: -+ virtual void Shutdown(); -+ virtual bool Suspend(); -+ virtual bool Resume(); -+ virtual bool IsSuspended(); -+ virtual void OnSettingsChange(const std::string& setting); -+ -+ virtual float GetVolume(); -+ virtual void SetVolume(const float volume); -+ virtual void SetMute(const bool enabled); -+ virtual bool IsMuted(); -+ virtual void SetSoundMode(const int mode); -+ -+ /* returns a new stream for data in the specified format */ -+ virtual IAEStream *MakeStream(enum AEDataFormat dataFormat, unsigned int sampleRate, unsigned int encodedSampleRate, CAEChannelInfo channelLayout, unsigned int options = 0); -+ virtual IAEStream *FreeStream(IAEStream *stream); -+ -+ /* returns a new sound object */ -+ virtual IAESound *MakeSound(const std::string& file); -+ virtual void FreeSound(IAESound *sound); -+ -+ virtual void GarbageCollect() {}; -+ -+ virtual void EnumerateOutputDevices(AEDeviceList &devices, bool passthrough); -+ virtual std::string GetDefaultDevice(bool passthrough); -+ virtual bool SupportsRaw(); -+ -+ virtual void RegisterAudioCallback(IAudioCallback* pCallback); -+ virtual void UnregisterAudioCallback(); -+ -+ virtual void OnLostDevice(); -+ virtual void OnResetDevice(); -+ -+protected: -+ void PlaySound(CActiveAESound *sound); -+ uint8_t **AllocSoundSample(SampleConfig &config, int &samples, int &bytes_per_sample, int &planes, int &linesize); -+ void FreeSoundSample(uint8_t **data); -+ float GetDelay(CActiveAEStream *stream) { return m_stats.GetDelay(stream); } -+ float GetCacheTime(CActiveAEStream *stream) { return m_stats.GetCacheTime(stream); } -+ float GetCacheTotal(CActiveAEStream *stream) { return m_stats.GetCacheTotal(stream); } -+ void FlushStream(CActiveAEStream *stream); -+ void PauseStream(CActiveAEStream *stream, bool pause); -+ void StopSound(CActiveAESound *sound); -+ void SetStreamAmplification(CActiveAEStream *stream, float amplify); -+ void SetStreamReplaygain(CActiveAEStream *stream, float rgain); -+ void SetStreamVolume(CActiveAEStream *stream, float volume); -+ void SetStreamResampleRatio(CActiveAEStream *stream, double ratio); -+ void SetStreamFade(CActiveAEStream *stream, float from, float target, unsigned int millis); -+ -+protected: -+ void Process(); -+ void StateMachine(int signal, Protocol *port, Message *msg); -+ bool InitSink(); -+ void DrainSink(); -+ void UnconfigureSink(); -+ void Start(); -+ void Dispose(); -+ void LoadSettings(); -+ bool NeedReconfigureBuffers(); -+ bool NeedReconfigureSink(); -+ void ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &settings, bool setmode = false); -+ void Configure(AEAudioFormat *desiredFmt = NULL); -+ CActiveAEStream* CreateStream(MsgStreamNew *streamMsg); -+ void DiscardStream(CActiveAEStream *stream); -+ void SFlushStream(CActiveAEStream *stream); -+ void ClearDiscardedBuffers(); -+ void SStopSound(CActiveAESound *sound); -+ void DiscardSound(CActiveAESound *sound); -+ float CalcStreamAmplification(CActiveAEStream *stream, CSampleBuffer *buf); -+ -+ bool RunStages(); -+ bool HasWork(); -+ -+ void ResampleSounds(); -+ bool ResampleSound(CActiveAESound *sound); -+ void MixSounds(CSoundPacket &dstSample); -+ void Deamplify(CSoundPacket &dstSample); -+ -+ CEvent m_inMsgEvent; -+ CEvent m_outMsgEvent; -+ CActiveAEControlProtocol m_controlPort; -+ CActiveAEDataProtocol m_dataPort; -+ int m_state; -+ bool m_bStateMachineSelfTrigger; -+ int m_extTimeout; -+ bool m_extError; -+ bool m_extDrain; -+ XbmcThreads::EndTime m_extDrainTimer; -+ bool m_extDeferData; -+ -+ enum -+ { -+ MODE_RAW, -+ MODE_TRANSCODE, -+ MODE_PCM -+ }m_mode; -+ -+ CActiveAESink m_sink; -+ AEAudioFormat m_sinkFormat; -+ AEAudioFormat m_sinkRequestFormat; -+ AEAudioFormat m_encoderFormat; -+ AEAudioFormat m_internalFormat; -+ AudioSettings m_settings; -+ CEngineStats m_stats; -+ IAEEncoder *m_encoder; -+ -+ // buffers -+ CActiveAEBufferPoolResample *m_sinkBuffers; -+ CActiveAEBufferPoolResample *m_vizBuffers; -+ CActiveAEBufferPool *m_silenceBuffers; // needed to drive gui sounds if we have no streams -+ CActiveAEBufferPool *m_encoderBuffers; -+ -+ // streams -+ std::list m_streams; -+ std::list m_discardBufferPools; -+ -+ // gui sounds -+ struct SoundState -+ { -+ CActiveAESound *sound; -+ int samples_played; -+ }; -+ std::list m_sounds_playing; -+ std::vector m_sounds; -+ int m_soundMode; -+ -+ float m_volume; -+ bool m_muted; -+ bool m_sinkHasVolume; -+ -+ // viz -+ IAudioCallback *m_audioCallback; -+ bool m_vizInitialized; -+ CCriticalSection m_vizLock; -+ -+ // ffmpeg -+ DllAvFormat m_dllAvFormat; -+ DllAvCodec m_dllAvCodec; -+ DllAvUtil m_dllAvUtil; -+ -+ // polled via the interface -+ float m_aeVolume; -+ bool m_aeMuted; -+}; -+}; -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp -new file mode 100644 -index 0000000..d3ba213 ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp -@@ -0,0 +1,365 @@ -+/* -+ * Copyright (C) 2010-2013 Team XBMC -+ * http://www.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 -+ * . -+ * -+ */ -+ -+#include "ActiveAEBuffer.h" -+#include "AEFactory.h" -+#include "ActiveAE.h" -+ -+using namespace ActiveAE; -+ -+/* typecast AE to CActiveAE */ -+#define AE (*((CActiveAE*)CAEFactory::GetEngine())) -+ -+CSoundPacket::CSoundPacket(SampleConfig conf, int samples) : config(conf) -+{ -+ data = AE.AllocSoundSample(config, samples, bytes_per_sample, planes, linesize); -+ max_nb_samples = samples; -+ nb_samples = 0; -+} -+ -+CSoundPacket::~CSoundPacket() -+{ -+ if (data) -+ AE.FreeSoundSample(data); -+} -+ -+CSampleBuffer::CSampleBuffer() : pkt(NULL), pool(NULL) -+{ -+ refCount = 0; -+} -+ -+CSampleBuffer::~CSampleBuffer() -+{ -+ delete pkt; -+} -+ -+CSampleBuffer* CSampleBuffer::Acquire() -+{ -+ refCount++; -+ return this; -+} -+ -+void CSampleBuffer::Return() -+{ -+ refCount--; -+ if (pool && refCount <= 0) -+ pool->ReturnBuffer(this); -+} -+ -+CActiveAEBufferPool::CActiveAEBufferPool(AEAudioFormat format) -+{ -+ m_format = format; -+ if (AE_IS_RAW(m_format.m_dataFormat)) -+ m_format.m_dataFormat = AE_FMT_S16NE; -+} -+ -+CActiveAEBufferPool::~CActiveAEBufferPool() -+{ -+ CSampleBuffer *buffer; -+ while(!m_allSamples.empty()) -+ { -+ buffer = m_allSamples.front(); -+ m_allSamples.pop_front(); -+ delete buffer; -+ } -+} -+ -+CSampleBuffer* CActiveAEBufferPool::GetFreeBuffer() -+{ -+ CSampleBuffer* buf = NULL; -+ -+ if (!m_freeSamples.empty()) -+ { -+ buf = m_freeSamples.front(); -+ m_freeSamples.pop_front(); -+ buf->refCount = 1; -+ } -+ return buf; -+} -+ -+void CActiveAEBufferPool::ReturnBuffer(CSampleBuffer *buffer) -+{ -+ buffer->pkt->nb_samples = 0; -+ m_freeSamples.push_back(buffer); -+} -+ -+bool CActiveAEBufferPool::Create(unsigned int totaltime) -+{ -+ CSampleBuffer *buffer; -+ SampleConfig config; -+ config.fmt = CActiveAEResample::GetAVSampleFormat(m_format.m_dataFormat); -+ config.channels = m_format.m_channelLayout.Count(); -+ config.sample_rate = m_format.m_sampleRate; -+ config.channel_layout = CActiveAEResample::GetAVChannelLayout(m_format.m_channelLayout); -+ -+ unsigned int time = 0; -+ unsigned int buffertime = (m_format.m_frames*1000) / m_format.m_sampleRate; -+ unsigned int n = 0; -+ while (time < totaltime || n < 5) -+ { -+ buffer = new CSampleBuffer(); -+ buffer->pool = this; -+ buffer->pkt = new CSoundPacket(config, m_format.m_frames); -+ -+ m_allSamples.push_back(buffer); -+ m_freeSamples.push_back(buffer); -+ time += buffertime; -+ n++; -+ } -+ -+ return true; -+} -+ -+//----------------------------------------------------------------------------- -+ -+CActiveAEBufferPoolResample::CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat) -+ : CActiveAEBufferPool(outputFormat) -+{ -+ m_inputFormat = inputFormat; -+ if (AE_IS_RAW(m_inputFormat.m_dataFormat)) -+ m_inputFormat.m_dataFormat = AE_FMT_S16NE; -+ m_resampler = NULL; -+ m_fillPackets = false; -+ m_drain = false; -+ m_empty = true; -+ m_procSample = NULL; -+ m_resampleRatio = 1.0; -+ m_changeRatio = false; -+} -+ -+CActiveAEBufferPoolResample::~CActiveAEBufferPoolResample() -+{ -+ delete m_resampler; -+} -+ -+bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap) -+{ -+ CActiveAEBufferPool::Create(totaltime); -+ -+ if (m_inputFormat.m_channelLayout != m_format.m_channelLayout || -+ m_inputFormat.m_sampleRate != m_format.m_sampleRate || -+ m_inputFormat.m_dataFormat != m_format.m_dataFormat) -+ { -+ m_resampler = new CActiveAEResample(); -+ m_resampler->Init(CActiveAEResample::GetAVChannelLayout(m_format.m_channelLayout), -+ m_format.m_channelLayout.Count(), -+ m_format.m_sampleRate, -+ CActiveAEResample::GetAVSampleFormat(m_format.m_dataFormat), -+ CActiveAEResample::GetAVChannelLayout(m_inputFormat.m_channelLayout), -+ m_inputFormat.m_channelLayout.Count(), -+ m_inputFormat.m_sampleRate, -+ CActiveAEResample::GetAVSampleFormat(m_inputFormat.m_dataFormat), -+ remap ? &m_format.m_channelLayout : NULL); -+ } -+ -+ // store output sampling rate, needed when ratio gets changed -+ m_outSampleRate = m_format.m_sampleRate; -+ -+ return true; -+} -+ -+void CActiveAEBufferPoolResample::ChangeRatio() -+{ -+// CLog::Log(LOGNOTICE,"---------- sample rate changed from: %d, to: %d", -+// m_outSampleRate, (int)(m_format.m_sampleRate * m_resampleRatio)); -+ -+ m_outSampleRate = m_format.m_sampleRate * m_resampleRatio; -+ -+ delete m_resampler; -+ -+ m_resampler = new CActiveAEResample(); -+ m_resampler->Init(CActiveAEResample::GetAVChannelLayout(m_format.m_channelLayout), -+ m_format.m_channelLayout.Count(), -+ m_outSampleRate, -+ CActiveAEResample::GetAVSampleFormat(m_format.m_dataFormat), -+ CActiveAEResample::GetAVChannelLayout(m_inputFormat.m_channelLayout), -+ m_inputFormat.m_channelLayout.Count(), -+ m_inputFormat.m_sampleRate, -+ CActiveAEResample::GetAVSampleFormat(m_inputFormat.m_dataFormat), -+ NULL); -+ -+ m_changeRatio = false; -+} -+ -+bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) -+{ -+ bool busy = false; -+ CSampleBuffer *in; -+ -+ if (m_changeRatio) -+ { -+ if ((unsigned int)(m_format.m_sampleRate * m_resampleRatio) == m_outSampleRate) -+ m_changeRatio = false; -+ } -+ -+ if (!m_resampler) -+ { -+ if (m_changeRatio) -+ { -+ ChangeRatio(); -+ return true; -+ } -+ while(!m_inputSamples.empty()) -+ { -+ in = m_inputSamples.front(); -+ m_inputSamples.pop_front(); -+ m_outputSamples.push_back(in); -+ busy = true; -+ } -+ } -+ else if (m_procSample || !m_freeSamples.empty()) -+ { -+ // GetBufferedSamples is not accurate because of rounding errors -+ int out_samples = m_resampler->GetBufferedSamples(); -+ int free_samples; -+ if (m_procSample) -+ free_samples = m_procSample->pkt->max_nb_samples - m_procSample->pkt->nb_samples; -+ else -+ free_samples = m_format.m_frames; -+ -+ bool skipInput = false; -+ // avoid that ffmpeg resample buffer grows too large -+ if (out_samples > free_samples * 2 && !m_empty) -+ skipInput = true; -+ -+ bool hasInput = !m_inputSamples.empty(); -+ -+ if (hasInput || skipInput || m_drain || m_changeRatio) -+ { -+ if (!m_procSample) -+ { -+ m_procSample = GetFreeBuffer(); -+ } -+ -+ if (hasInput && !skipInput && !m_changeRatio) -+ { -+ in = m_inputSamples.front(); -+ m_inputSamples.pop_front(); -+ } -+ else -+ in = NULL; -+ -+ int start = m_procSample->pkt->nb_samples * -+ m_procSample->pkt->bytes_per_sample * -+ m_procSample->pkt->config.channels / -+ m_procSample->pkt->planes; -+ -+ for(int i=0; ipkt->planes; i++) -+ { -+ m_planes[i] = m_procSample->pkt->data[i] + start; -+ } -+ -+ out_samples = m_resampler->Resample(m_planes, -+ m_procSample->pkt->max_nb_samples - m_procSample->pkt->nb_samples, -+ in ? in->pkt->data : NULL, -+ in ? in->pkt->nb_samples : 0); -+ m_procSample->pkt->nb_samples += out_samples; -+ busy = true; -+ m_empty = (out_samples == 0); -+ -+ if ((m_drain || m_changeRatio) && m_empty) -+ { -+ if (m_fillPackets && m_procSample->pkt->nb_samples != 0) -+ { -+ // pad with zero -+ start = m_procSample->pkt->nb_samples * -+ m_procSample->pkt->bytes_per_sample * -+ m_procSample->pkt->config.channels / -+ m_procSample->pkt->planes; -+ for(int i=0; ipkt->planes; i++) -+ { -+ memset(m_procSample->pkt->data[i]+start, 0, m_procSample->pkt->linesize-start); -+ } -+ } -+ m_procSample->timestamp = timestamp; -+ -+ // check if draining is finished -+ if (m_drain && m_procSample->pkt->nb_samples == 0) -+ { -+ m_procSample->Return(); -+ busy = false; -+ } -+ else -+ m_outputSamples.push_back(m_procSample); -+ -+ m_procSample = NULL; -+ if (m_changeRatio) -+ ChangeRatio(); -+ } -+ // some methods like encode require completely filled packets -+ else if (!m_fillPackets || (m_procSample->pkt->nb_samples == m_procSample->pkt->max_nb_samples)) -+ { -+ m_procSample->timestamp = timestamp; -+ m_outputSamples.push_back(m_procSample); -+ m_procSample = NULL; -+ } -+ -+ if (in) -+ in->Return(); -+ } -+ } -+ return busy; -+} -+ -+float CActiveAEBufferPoolResample::GetDelay() -+{ -+ float delay = 0; -+ std::deque::iterator itBuf; -+ -+ if (m_procSample) -+ delay += m_procSample->pkt->nb_samples / m_procSample->pkt->config.sample_rate; -+ -+ for(itBuf=m_inputSamples.begin(); itBuf!=m_inputSamples.end(); ++itBuf) -+ { -+ delay += (float)(*itBuf)->pkt->nb_samples / (*itBuf)->pkt->config.sample_rate; -+ } -+ -+ for(itBuf=m_outputSamples.begin(); itBuf!=m_outputSamples.end(); ++itBuf) -+ { -+ delay += (float)(*itBuf)->pkt->nb_samples / (*itBuf)->pkt->config.sample_rate; -+ } -+ -+ if (m_resampler) -+ { -+ int samples = m_resampler->GetBufferedSamples(); -+ delay += (float)samples / m_outSampleRate; -+ } -+ -+ return delay; -+} -+ -+void CActiveAEBufferPoolResample::Flush() -+{ -+ if (m_procSample) -+ { -+ m_procSample->Return(); -+ m_procSample = NULL; -+ } -+ while (!m_inputSamples.empty()) -+ { -+ m_inputSamples.front()->Return(); -+ m_inputSamples.pop_front(); -+ } -+ while (!m_outputSamples.empty()) -+ { -+ m_outputSamples.front()->Return(); -+ m_outputSamples.pop_front(); -+ } -+} -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h -new file mode 100644 -index 0000000..183c49e ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h -@@ -0,0 +1,110 @@ -+#pragma once -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include "DllAvUtil.h" -+#include "DllSwResample.h" -+#include "AEAudioFormat.h" -+#include -+ -+namespace ActiveAE -+{ -+ -+struct SampleConfig -+{ -+ AVSampleFormat fmt; -+ uint64_t channel_layout; -+ int channels; -+ int sample_rate; -+}; -+ -+/** -+ * the variables here follow ffmpeg naming -+ */ -+class CSoundPacket -+{ -+public: -+ CSoundPacket(SampleConfig conf, int samples); -+ ~CSoundPacket(); -+ uint8_t **data; // array with pointers to planes of data -+ SampleConfig config; -+ AEDataFormat internal_format; // used when carrying pass through -+ int bytes_per_sample; // bytes per sample and per channel -+ int linesize; // see ffmpeg, required for planar formats -+ int planes; // 1 for non planar formats, #channels for planar -+ int nb_samples; // number of frames used -+ int max_nb_samples; // max number of frames this packet can hold -+}; -+ -+class CActiveAEBufferPool; -+ -+class CSampleBuffer -+{ -+public: -+ CSampleBuffer(); -+ ~CSampleBuffer(); -+ CSampleBuffer *Acquire(); -+ void Return(); -+ CSoundPacket *pkt; -+ CActiveAEBufferPool *pool; -+ unsigned int timestamp; -+ int refCount; -+}; -+ -+class CActiveAEBufferPool -+{ -+public: -+ CActiveAEBufferPool(AEAudioFormat format); -+ virtual ~CActiveAEBufferPool(); -+ virtual bool Create(unsigned int totaltime); -+ CSampleBuffer *GetFreeBuffer(); -+ void ReturnBuffer(CSampleBuffer *buffer); -+ AEAudioFormat m_format; -+ std::deque m_allSamples; -+ std::deque m_freeSamples; -+}; -+ -+class CActiveAEResample; -+ -+class CActiveAEBufferPoolResample : public CActiveAEBufferPool -+{ -+public: -+ CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat); -+ virtual ~CActiveAEBufferPoolResample(); -+ virtual bool Create(unsigned int totaltime, bool remap); -+ void ChangeRatio(); -+ bool ResampleBuffers(unsigned int timestamp = 0); -+ float GetDelay(); -+ void Flush(); -+ AEAudioFormat m_inputFormat; -+ std::deque m_inputSamples; -+ std::deque m_outputSamples; -+ CSampleBuffer *m_procSample; -+ CActiveAEResample *m_resampler; -+ uint8_t *m_planes[16]; -+ bool m_fillPackets; -+ bool m_drain; -+ bool m_empty; -+ bool m_changeRatio; -+ double m_resampleRatio; -+ unsigned int m_outSampleRate; -+}; -+ -+} -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp -new file mode 100644 -index 0000000..aee3bfc ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp -@@ -0,0 +1,250 @@ -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include "ActiveAEResample.h" -+ -+using namespace ActiveAE; -+ -+CActiveAEResample::CActiveAEResample() -+{ -+ m_pContext = NULL; -+} -+ -+CActiveAEResample::~CActiveAEResample() -+{ -+ if (m_pContext) -+ m_dllSwResample.swr_free(&m_pContext); -+ -+ m_dllAvUtil.Unload(); -+ m_dllSwResample.Unload(); -+} -+ -+bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout) -+{ -+ if (!m_dllAvUtil.Load() || !m_dllSwResample.Load()) -+ return false; -+ -+ m_dst_chan_layout = dst_chan_layout; -+ m_dst_channels = dst_channels; -+ m_dst_rate = dst_rate; -+ m_dst_fmt = dst_fmt; -+ m_src_chan_layout = src_chan_layout; -+ m_src_channels = src_channels; -+ m_src_rate = src_rate; -+ m_src_fmt = src_fmt; -+ -+ if (m_dst_chan_layout == 0) -+ m_dst_chan_layout = m_dllAvUtil.av_get_default_channel_layout(m_dst_channels); -+ if (m_src_chan_layout == 0) -+ m_src_chan_layout = m_dllAvUtil.av_get_default_channel_layout(m_src_channels); -+ -+ m_pContext = m_dllSwResample.swr_alloc_set_opts(NULL, m_dst_chan_layout, m_dst_fmt, m_dst_rate, -+ m_src_chan_layout, m_src_fmt, m_src_rate, -+ 0, NULL); -+ -+ if(!m_pContext) -+ { -+ CLog::Log(LOGERROR, "CActiveAEResample::Init - create context failed"); -+ return false; -+ } -+ if (remapLayout) -+ { -+ // one-to-one mapping of channels -+ // remapLayout is the layout of the sink, if the channel is in our src layout -+ // the channel is mapped by setting coef 1.0 -+ memset(m_rematrix, 0, sizeof(m_rematrix)); -+ for (unsigned int out=0; outCount(); out++) -+ { -+ int idx = GetAVChannelIndex((*remapLayout)[out], m_src_chan_layout); -+ if (idx >= 0) -+ { -+ m_rematrix[out][idx] = 1.0; -+ } -+ } -+ -+ if (m_dllSwResample.swr_set_matrix(m_pContext, (const double*)m_rematrix, AE_CH_MAX) < 0) -+ { -+ CLog::Log(LOGERROR, "CActiveAEResample::Init - setting channel matrix failed"); -+ return false; -+ } -+ } -+ if(m_dllSwResample.swr_init(m_pContext) < 0) -+ { -+ CLog::Log(LOGERROR, "CActiveAEResample::Init - init resampler failed"); -+ return false; -+ } -+ return true; -+} -+ -+int CActiveAEResample::Resample(uint8_t **dst_buffer, int dst_samples, uint8_t **src_buffer, int src_samples) -+{ -+ int ret = m_dllSwResample.swr_convert(m_pContext, dst_buffer, dst_samples, (const uint8_t**)src_buffer, src_samples); -+ if (ret < 0) -+ { -+ CLog::Log(LOGERROR, "CActiveAEResample::Resample - resample failed"); -+ return 0; -+ } -+ return ret; -+} -+ -+int64_t CActiveAEResample::GetDelay(int64_t base) -+{ -+ return m_dllSwResample.swr_get_delay(m_pContext, base); -+} -+ -+int CActiveAEResample::GetBufferedSamples() -+{ -+ return m_dllAvUtil.av_rescale_rnd(m_dllSwResample.swr_get_delay(m_pContext, m_src_rate), -+ m_dst_rate, m_src_rate, AV_ROUND_UP); -+} -+ -+int CActiveAEResample::CalcDstSampleCount(int src_samples, int dst_rate, int src_rate) -+{ -+ return m_dllAvUtil.av_rescale_rnd(src_samples, dst_rate, src_rate, AV_ROUND_UP); -+} -+ -+int CActiveAEResample::GetSrcBufferSize(int samples) -+{ -+ return m_dllAvUtil.av_samples_get_buffer_size(NULL, m_src_channels, samples, m_src_fmt, 1); -+} -+ -+int CActiveAEResample::GetDstBufferSize(int samples) -+{ -+ return m_dllAvUtil.av_samples_get_buffer_size(NULL, m_dst_channels, samples, m_dst_fmt, 1); -+} -+ -+uint64_t CActiveAEResample::GetAVChannelLayout(CAEChannelInfo &info) -+{ -+ uint64_t channelLayout = 0; -+ if (info.HasChannel(AE_CH_FL)) channelLayout |= AV_CH_FRONT_LEFT; -+ if (info.HasChannel(AE_CH_FR)) channelLayout |= AV_CH_FRONT_RIGHT; -+ if (info.HasChannel(AE_CH_FC)) channelLayout |= AV_CH_FRONT_CENTER; -+ if (info.HasChannel(AE_CH_LFE)) channelLayout |= AV_CH_LOW_FREQUENCY; -+ if (info.HasChannel(AE_CH_BL)) channelLayout |= AV_CH_BACK_LEFT; -+ if (info.HasChannel(AE_CH_BR)) channelLayout |= AV_CH_BACK_RIGHT; -+ if (info.HasChannel(AE_CH_FLOC)) channelLayout |= AV_CH_FRONT_LEFT_OF_CENTER; -+ if (info.HasChannel(AE_CH_FROC)) channelLayout |= AV_CH_FRONT_RIGHT_OF_CENTER; -+ if (info.HasChannel(AE_CH_BC)) channelLayout |= AV_CH_BACK_CENTER; -+ if (info.HasChannel(AE_CH_SL)) channelLayout |= AV_CH_SIDE_LEFT; -+ if (info.HasChannel(AE_CH_SR)) channelLayout |= AV_CH_SIDE_RIGHT; -+ if (info.HasChannel(AE_CH_TC)) channelLayout |= AV_CH_TOP_CENTER; -+ if (info.HasChannel(AE_CH_TFL)) channelLayout |= AV_CH_TOP_FRONT_LEFT; -+ if (info.HasChannel(AE_CH_TFC)) channelLayout |= AV_CH_TOP_FRONT_CENTER; -+ if (info.HasChannel(AE_CH_TFR)) channelLayout |= AV_CH_TOP_FRONT_RIGHT; -+ if (info.HasChannel(AE_CH_TBL)) channelLayout |= AV_CH_TOP_BACK_LEFT; -+ if (info.HasChannel(AE_CH_TBC)) channelLayout |= AV_CH_TOP_BACK_CENTER; -+ if (info.HasChannel(AE_CH_TBR)) channelLayout |= AV_CH_TOP_BACK_RIGHT; -+ -+ return channelLayout; -+} -+ -+//CAEChannelInfo CActiveAEResample::GetAEChannelLayout(uint64_t layout) -+//{ -+// CAEChannelInfo channelLayout; -+// channelLayout.Reset(); -+// -+// if (layout & AV_CH_FRONT_LEFT ) channelLayout += AE_CH_FL ; -+// if (layout & AV_CH_FRONT_RIGHT ) channelLayout += AE_CH_FR ; -+// if (layout & AV_CH_FRONT_CENTER ) channelLayout += AE_CH_FC ; -+// if (layout & AV_CH_LOW_FREQUENCY ) channelLayout += AE_CH_LFE ; -+// if (layout & AV_CH_BACK_LEFT ) channelLayout += AE_CH_BL ; -+// if (layout & AV_CH_BACK_RIGHT ) channelLayout += AE_CH_BR ; -+// if (layout & AV_CH_FRONT_LEFT_OF_CENTER ) channelLayout += AE_CH_FLOC; -+// if (layout & AV_CH_FRONT_RIGHT_OF_CENTER) channelLayout += AE_CH_FROC; -+// if (layout & AV_CH_BACK_CENTER ) channelLayout += AE_CH_BC ; -+// if (layout & AV_CH_SIDE_LEFT ) channelLayout += AE_CH_SL ; -+// if (layout & AV_CH_SIDE_RIGHT ) channelLayout += AE_CH_SR ; -+// if (layout & AV_CH_TOP_CENTER ) channelLayout += AE_CH_TC ; -+// if (layout & AV_CH_TOP_FRONT_LEFT ) channelLayout += AE_CH_TFL ; -+// if (layout & AV_CH_TOP_FRONT_CENTER ) channelLayout += AE_CH_TFC ; -+// if (layout & AV_CH_TOP_FRONT_RIGHT ) channelLayout += AE_CH_TFR ; -+// if (layout & AV_CH_TOP_BACK_LEFT ) channelLayout += AE_CH_BL ; -+// if (layout & AV_CH_TOP_BACK_CENTER ) channelLayout += AE_CH_BC ; -+// if (layout & AV_CH_TOP_BACK_RIGHT ) channelLayout += AE_CH_BR ; -+// -+// return channelLayout; -+//} -+ -+AVSampleFormat CActiveAEResample::GetAVSampleFormat(AEDataFormat format) -+{ -+ if (format == AE_FMT_U8) return AV_SAMPLE_FMT_U8; -+ else if (format == AE_FMT_S16NE) return AV_SAMPLE_FMT_S16; -+ else if (format == AE_FMT_S32NE) return AV_SAMPLE_FMT_S32; -+ else if (format == AE_FMT_FLOAT) return AV_SAMPLE_FMT_FLT; -+ else if (format == AE_FMT_DOUBLE) return AV_SAMPLE_FMT_DBL; -+ -+ else if (format == AE_FMT_U8P) return AV_SAMPLE_FMT_U8P; -+ else if (format == AE_FMT_S16NEP) return AV_SAMPLE_FMT_S16P; -+ else if (format == AE_FMT_S32NEP) return AV_SAMPLE_FMT_S32P; -+ else if (format == AE_FMT_FLOATP) return AV_SAMPLE_FMT_FLTP; -+ else if (format == AE_FMT_DOUBLEP) return AV_SAMPLE_FMT_DBLP; -+ -+ return AV_SAMPLE_FMT_FLT; -+} -+ -+AEDataFormat CActiveAEResample::GetAESampleFormat(AVSampleFormat format) -+{ -+ if (format == AV_SAMPLE_FMT_U8) return AE_FMT_U8; -+ else if (format == AV_SAMPLE_FMT_S16) return AE_FMT_S16NE; -+ else if (format == AV_SAMPLE_FMT_S32) return AE_FMT_S32NE; -+ else if (format == AV_SAMPLE_FMT_FLT) return AE_FMT_FLOAT; -+ else if (format == AV_SAMPLE_FMT_DBL) return AE_FMT_DOUBLE; -+ -+ else if (format == AV_SAMPLE_FMT_U8P) return AE_FMT_U8P; -+ else if (format == AV_SAMPLE_FMT_S16P) return AE_FMT_S16NEP; -+ else if (format == AV_SAMPLE_FMT_S32P) return AE_FMT_S32NEP; -+ else if (format == AV_SAMPLE_FMT_FLTP) return AE_FMT_FLOATP; -+ else if (format == AV_SAMPLE_FMT_DBLP) return AE_FMT_DOUBLEP; -+ -+ CLog::Log(LOGERROR, "CActiveAEResample::GetAESampleFormat - format not supported"); -+ return AE_FMT_INVALID; -+} -+ -+uint64_t CActiveAEResample::GetAVChannel(enum AEChannel aechannel) -+{ -+ switch (aechannel) -+ { -+ case AE_CH_FL: return AV_CH_FRONT_LEFT; -+ case AE_CH_FR: return AV_CH_FRONT_RIGHT; -+ case AE_CH_FC: return AV_CH_FRONT_CENTER; -+ case AE_CH_LFE: return AV_CH_LOW_FREQUENCY; -+ case AE_CH_BL: return AV_CH_BACK_LEFT; -+ case AE_CH_BR: return AV_CH_BACK_RIGHT; -+ case AE_CH_FLOC: return AV_CH_FRONT_LEFT_OF_CENTER; -+ case AE_CH_FROC: return AV_CH_FRONT_RIGHT_OF_CENTER; -+ case AE_CH_BC: return AV_CH_BACK_CENTER; -+ case AE_CH_SL: return AV_CH_SIDE_LEFT; -+ case AE_CH_SR: return AV_CH_SIDE_RIGHT; -+ case AE_CH_TC: return AV_CH_TOP_CENTER; -+ case AE_CH_TFL: return AV_CH_TOP_FRONT_LEFT; -+ case AE_CH_TFC: return AV_CH_TOP_FRONT_CENTER; -+ case AE_CH_TFR: return AV_CH_TOP_FRONT_RIGHT; -+ case AE_CH_TBL: return AV_CH_TOP_BACK_LEFT; -+ case AE_CH_TBC: return AV_CH_TOP_BACK_CENTER; -+ case AE_CH_TBR: return AV_CH_TOP_BACK_RIGHT; -+ default: -+ return 0; -+ } -+} -+ -+int CActiveAEResample::GetAVChannelIndex(enum AEChannel aechannel, uint64_t layout) -+{ -+ return m_dllAvUtil.av_get_channel_layout_channel_index(layout, GetAVChannel(aechannel)); -+} -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h -new file mode 100644 -index 0000000..fa95a1d ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h -@@ -0,0 +1,61 @@ -+#pragma once -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include "DllAvUtil.h" -+#include "DllSwResample.h" -+#include "Utils/AEChannelInfo.h" -+#include "AEAudioFormat.h" -+#include "ActiveAEBuffer.h" -+ -+namespace ActiveAE -+{ -+ -+class CActiveAEResample -+{ -+public: -+ CActiveAEResample(); -+ virtual ~CActiveAEResample(); -+ bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout = NULL); -+ int Resample(uint8_t **dst_buffer, int dst_samples, uint8_t **src_buffer, int src_samples); -+ int64_t GetDelay(int64_t base); -+ int GetBufferedSamples(); -+ int CalcDstSampleCount(int src_samples, int dst_rate, int src_rate); -+ int GetSrcBufferSize(int samples); -+ int GetDstBufferSize(int samples); -+ static uint64_t GetAVChannelLayout(CAEChannelInfo &info); -+// static CAEChannelInfo GetAEChannelLayout(uint64_t layout); -+ static AVSampleFormat GetAVSampleFormat(AEDataFormat format); -+ static AEDataFormat GetAESampleFormat(AVSampleFormat format); -+ static uint64_t GetAVChannel(enum AEChannel aechannel); -+ int GetAVChannelIndex(enum AEChannel aechannel, uint64_t layout); -+ -+protected: -+ DllAvUtil m_dllAvUtil; -+ DllSwResample m_dllSwResample; -+ uint64_t m_src_chan_layout, m_dst_chan_layout; -+ int m_src_rate, m_dst_rate; -+ int m_src_channels, m_dst_channels; -+ AVSampleFormat m_src_fmt, m_dst_fmt; -+ SwrContext *m_pContext; -+ double m_rematrix[AE_CH_MAX][AE_CH_MAX]; -+}; -+ -+} -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -new file mode 100644 -index 0000000..c22bb88 ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -@@ -0,0 +1,864 @@ -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include -+ -+#include "ActiveAESink.h" -+#include "Utils/AEUtil.h" -+#include "utils/EndianSwap.h" -+#include "ActiveAE.h" -+ -+#include "settings/Settings.h" -+#include "settings/AdvancedSettings.h" -+ -+using namespace ActiveAE; -+ -+CActiveAESink::CActiveAESink(CEvent *inMsgEvent) : -+ CThread("AESink"), -+ m_controlPort("SinkControlPort", inMsgEvent, &m_outMsgEvent), -+ m_dataPort("SinkDataPort", inMsgEvent, &m_outMsgEvent) -+{ -+ m_inMsgEvent = inMsgEvent; -+ m_sink = NULL; -+ m_stats = NULL; -+ m_convertBuffer = NULL; -+ m_volume = 0.0; -+} -+ -+void CActiveAESink::Start() -+{ -+ if (!IsRunning()) -+ { -+ Create(); -+ SetPriority(THREAD_PRIORITY_ABOVE_NORMAL); -+ } -+} -+ -+void CActiveAESink::Dispose() -+{ -+ m_bStop = true; -+ m_outMsgEvent.Set(); -+ StopThread(); -+ m_controlPort.Purge(); -+ m_dataPort.Purge(); -+ -+ if (m_sink) -+ { -+ m_sink->Drain(); -+ m_sink->Deinitialize(); -+ delete m_sink; -+ m_sink = NULL; -+ } -+ -+ delete m_sampleOfSilence.pkt; -+ m_sampleOfSilence.pkt = NULL; -+ -+ delete m_sampleOfNoise.pkt; -+ m_sampleOfNoise.pkt = NULL; -+ -+ if (m_convertBuffer) -+ { -+ _aligned_free(m_convertBuffer); -+ m_convertBuffer = NULL; -+ } -+} -+ -+bool CActiveAESink::IsCompatible(const AEAudioFormat format, const std::string &device) -+{ -+ if (!m_sink) -+ return false; -+ return m_sink->IsCompatible(format, device); -+} -+ -+bool CActiveAESink::HasVolume() -+{ -+ if (!m_sink) -+ return false; -+ return m_sink->HasVolume(); -+} -+ -+enum SINK_STATES -+{ -+ S_TOP = 0, // 0 -+ S_TOP_UNCONFIGURED, // 1 -+ S_TOP_CONFIGURED, // 2 -+ S_TOP_CONFIGURED_SUSPEND, // 3 -+ S_TOP_CONFIGURED_IDLE, // 4 -+ S_TOP_CONFIGURED_PLAY, // 5 -+ S_TOP_CONFIGURED_SILENCE, // 6 -+ S_TOP_CONFIGURED_WARMUP, // 7 -+}; -+ -+int SINK_parentStates[] = { -+ -1, -+ 0, //TOP_UNCONFIGURED -+ 0, //TOP_CONFIGURED -+ 2, //TOP_CONFIGURED_SUSPEND -+ 2, //TOP_CONFIGURED_IDLE -+ 2, //TOP_CONFIGURED_PLAY -+ 2, //TOP_CONFIGURED_SILENCE -+ 2, //TOP_CONFIGURED_WARMUP -+}; -+ -+void CActiveAESink::StateMachine(int signal, Protocol *port, Message *msg) -+{ -+ for (int state = m_state; ; state = SINK_parentStates[state]) -+ { -+ switch (state) -+ { -+ case S_TOP: // TOP -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case CSinkControlProtocol::CONFIGURE: -+ SinkConfig *data; -+ data = (SinkConfig*)msg->data; -+ if (data) -+ { -+ m_requestedFormat = data->format; -+ m_stats = data->stats; -+ } -+ m_extError = false; -+ m_extSilence = false; -+ ReturnBuffers(); -+ OpenSink(); -+ -+ if (!m_extError) -+ { -+ m_stats->SetSinkCacheTotal(m_sink->GetCacheTotal()); -+ m_state = S_TOP_CONFIGURED_IDLE; -+ m_extTimeout = 10000; -+ msg->Reply(CSinkControlProtocol::ACC, &m_sinkFormat, sizeof(AEAudioFormat)); -+ } -+ else -+ { -+ m_state = S_TOP_UNCONFIGURED; -+ msg->Reply(CSinkControlProtocol::ERR); -+ } -+ return; -+ -+ case CSinkControlProtocol::UNCONFIGURE: -+ ReturnBuffers(); -+ if (m_sink) -+ { -+ m_sink->Drain(); -+ m_sink->Deinitialize(); -+ delete m_sink; -+ m_sink = NULL; -+ } -+ m_state = S_TOP_UNCONFIGURED; -+ msg->Reply(CSinkControlProtocol::ACC); -+ return; -+ -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case CSinkDataProtocol::DRAIN: -+ msg->Reply(CSinkDataProtocol::ACC); -+ m_state = S_TOP_UNCONFIGURED; -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ { -+ std::string portName = port == NULL ? "timer" : port->portName; -+ CLog::Log(LOGWARNING, "CActiveAESink::%s - signal: %d form port: %s not handled for state: %d", __FUNCTION__, signal, portName.c_str(), m_state); -+ } -+ return; -+ -+ case S_TOP_UNCONFIGURED: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CSinkControlProtocol::TIMEOUT: -+ m_extTimeout = 1000; -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case CSinkDataProtocol::SAMPLE: -+ CSampleBuffer *samples; -+ int timeout; -+ samples = *((CSampleBuffer**)msg->data); -+ timeout = 1000*samples->pkt->nb_samples/samples->pkt->config.sample_rate; -+ Sleep(timeout); -+ msg->Reply(CSinkDataProtocol::RETURNSAMPLE, &samples, sizeof(CSampleBuffer*)); -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case S_TOP_CONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case CSinkControlProtocol::SILENCEMODE: -+ m_extSilence = *(bool*)msg->data; -+ if (g_advancedSettings.m_streamSilence) -+ m_extSilence = true; -+ if (m_extSilence) -+ { -+ m_extCycleCounter = 5; -+ m_state = S_TOP_CONFIGURED_WARMUP; -+ m_extTimeout = 0; -+ } -+ return; -+ case CSinkControlProtocol::VOLUME: -+ m_volume = *(float*)msg->data; -+ m_sink->SetVolume(m_volume); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case CSinkDataProtocol::DRAIN: -+ m_sink->Drain(); -+ msg->Reply(CSinkDataProtocol::ACC); -+ m_state = S_TOP_CONFIGURED_IDLE; -+ m_extTimeout = 10000; -+ return; -+ case CSinkDataProtocol::SAMPLE: -+ CSampleBuffer *samples; -+ unsigned int delay; -+ samples = *((CSampleBuffer**)msg->data); -+ delay = OutputSamples(samples); -+ msg->Reply(CSinkDataProtocol::RETURNSAMPLE, &samples, sizeof(CSampleBuffer*)); -+ if (m_extError) -+ { -+ m_sink->Deinitialize(); -+ delete m_sink; -+ m_sink = NULL; -+ m_state = S_TOP_CONFIGURED_SUSPEND; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ m_state = S_TOP_CONFIGURED_PLAY; -+ m_extTimeout = delay / 2; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case S_TOP_CONFIGURED_SUSPEND: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case CSinkControlProtocol::SILENCEMODE: -+ return; -+ case CSinkControlProtocol::VOLUME: -+ m_volume = *(float*)msg->data; -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case CSinkDataProtocol::SAMPLE: -+ m_extError = false; -+ OpenSink(); -+ OutputSamples(&m_sampleOfNoise); -+ m_state = S_TOP_CONFIGURED_PLAY; -+ m_extTimeout = 0; -+ m_bStateMachineSelfTrigger = true; -+ return; -+ case CSinkDataProtocol::DRAIN: -+ msg->Reply(CSinkDataProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CSinkControlProtocol::TIMEOUT: -+ m_extTimeout = 10000; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case S_TOP_CONFIGURED_IDLE: -+ if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case CSinkDataProtocol::SAMPLE: -+ OutputSamples(&m_sampleOfNoise); -+ m_state = S_TOP_CONFIGURED_PLAY; -+ m_extTimeout = 0; -+ m_bStateMachineSelfTrigger = true; -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CSinkControlProtocol::TIMEOUT: -+ m_sink->Deinitialize(); -+ delete m_sink; -+ m_sink = NULL; -+ m_state = S_TOP_CONFIGURED_SUSPEND; -+ m_extTimeout = 10000; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case S_TOP_CONFIGURED_PLAY: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CSinkControlProtocol::TIMEOUT: -+ if (m_extSilence) -+ { -+ m_state = S_TOP_CONFIGURED_SILENCE; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ m_sink->Drain(); -+ m_state = S_TOP_CONFIGURED_IDLE; -+ m_extTimeout = 10000; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case S_TOP_CONFIGURED_SILENCE: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CSinkControlProtocol::TIMEOUT: -+ unsigned int delay; -+ delay = OutputSamples(&m_sampleOfSilence); -+ m_extCycleCounter--; -+ if (m_extError) -+ { -+ m_sink->Deinitialize(); -+ delete m_sink; -+ m_sink = NULL; -+ m_state = S_TOP_CONFIGURED_SUSPEND; -+ } -+ else if(m_extCycleCounter <= 0) -+ { -+ m_extCycleCounter = 2; -+ m_state = S_TOP_CONFIGURED_WARMUP; -+ } -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case S_TOP_CONFIGURED_WARMUP: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CSinkControlProtocol::TIMEOUT: -+ unsigned int delay; -+ delay = OutputSamples(&m_sampleOfNoise); -+ m_extCycleCounter--; -+ if (m_extError) -+ { -+ m_sink->Deinitialize(); -+ delete m_sink; -+ m_sink = NULL; -+ m_state = S_TOP_CONFIGURED_SUSPEND; -+ } -+ else if(m_extCycleCounter <= 0) -+ { -+ m_extCycleCounter = 20; -+ m_state = S_TOP_CONFIGURED_SILENCE; -+ } -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ default: // we are in no state, should not happen -+ CLog::Log(LOGERROR, "CActiveSink::%s - no valid state: %d", __FUNCTION__, m_state); -+ return; -+ } -+ } // for -+} -+ -+void CActiveAESink::Process() -+{ -+ Message *msg = NULL; -+ Protocol *port = NULL; -+ bool gotMsg; -+ -+ m_state = S_TOP_UNCONFIGURED; -+ m_extTimeout = 1000; -+ m_bStateMachineSelfTrigger = false; -+ -+ while (!m_bStop) -+ { -+ gotMsg = false; -+ -+ if (m_bStateMachineSelfTrigger) -+ { -+ m_bStateMachineSelfTrigger = false; -+ // self trigger state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ // check control port -+ else if (m_controlPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_controlPort; -+ } -+ // check data port -+ else if (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_dataPort; -+ } -+ -+ if (gotMsg) -+ { -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ -+ // wait for message -+ else if (m_outMsgEvent.WaitMSec(m_extTimeout)) -+ { -+ continue; -+ } -+ // time out -+ else -+ { -+ msg = m_controlPort.GetMessage(); -+ msg->signal = CSinkControlProtocol::TIMEOUT; -+ port = 0; -+ // signal timeout to state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ } -+ } -+} -+ -+void CActiveAESink::EnumerateSinkList() -+{ -+ unsigned int c_retry = 5; -+ m_sinkInfoList.clear(); -+ CAESinkFactory::EnumerateEx(m_sinkInfoList); -+ while(m_sinkInfoList.size() == 0 && c_retry > 0) -+ { -+ CLog::Log(LOGNOTICE, "No Devices found - retry: %d", c_retry); -+ Sleep(2000); -+ c_retry--; -+ // retry the enumeration -+ CAESinkFactory::EnumerateEx(m_sinkInfoList, true); -+ } -+ CLog::Log(LOGNOTICE, "Found %lu Lists of Devices", m_sinkInfoList.size()); -+ PrintSinks(); -+} -+ -+void CActiveAESink::PrintSinks() -+{ -+ for (AESinkInfoList::iterator itt = m_sinkInfoList.begin(); itt != m_sinkInfoList.end(); ++itt) -+ { -+ CLog::Log(LOGNOTICE, "Enumerated %s devices:", itt->m_sinkName.c_str()); -+ int count = 0; -+ for (AEDeviceInfoList::iterator itt2 = itt->m_deviceInfoList.begin(); itt2 != itt->m_deviceInfoList.end(); ++itt2) -+ { -+ CLog::Log(LOGNOTICE, " Device %d", ++count); -+ CAEDeviceInfo& info = *itt2; -+ std::stringstream ss((std::string)info); -+ std::string line; -+ while(std::getline(ss, line, '\n')) -+ CLog::Log(LOGNOTICE, " %s", line.c_str()); -+ } -+ } -+} -+ -+void CActiveAESink::EnumerateOutputDevices(AEDeviceList &devices, bool passthrough) -+{ -+ for (AESinkInfoList::iterator itt = m_sinkInfoList.begin(); itt != m_sinkInfoList.end(); ++itt) -+ { -+ AESinkInfo sinkInfo = *itt; -+ for (AEDeviceInfoList::iterator itt2 = sinkInfo.m_deviceInfoList.begin(); itt2 != sinkInfo.m_deviceInfoList.end(); ++itt2) -+ { -+ CAEDeviceInfo devInfo = *itt2; -+ if (passthrough && devInfo.m_deviceType == AE_DEVTYPE_PCM) -+ continue; -+ -+ std::string device = sinkInfo.m_sinkName + ":" + devInfo.m_deviceName; -+ -+ std::stringstream ss; -+ -+ /* add the sink name if we have more then one sink type */ -+ if (m_sinkInfoList.size() > 1) -+ ss << sinkInfo.m_sinkName << ": "; -+ -+ ss << devInfo.m_displayName; -+ if (!devInfo.m_displayNameExtra.empty()) -+ ss << ", " << devInfo.m_displayNameExtra; -+ -+ devices.push_back(AEDevice(ss.str(), device)); -+ } -+ } -+} -+ -+std::string CActiveAESink::GetDefaultDevice(bool passthrough) -+{ -+ for (AESinkInfoList::iterator itt = m_sinkInfoList.begin(); itt != m_sinkInfoList.end(); ++itt) -+ { -+ AESinkInfo sinkInfo = *itt; -+ for (AEDeviceInfoList::iterator itt2 = sinkInfo.m_deviceInfoList.begin(); itt2 != sinkInfo.m_deviceInfoList.end(); ++itt2) -+ { -+ CAEDeviceInfo devInfo = *itt2; -+ if (passthrough && devInfo.m_deviceType == AE_DEVTYPE_PCM) -+ continue; -+ -+ std::string device = sinkInfo.m_sinkName + ":" + devInfo.m_deviceName; -+ return device; -+ } -+ } -+ return "default"; -+} -+ -+void CActiveAESink::GetDeviceFriendlyName(std::string &device) -+{ -+ m_deviceFriendlyName = "Device not found"; -+ /* Match the device and find its friendly name */ -+ for (AESinkInfoList::iterator itt = m_sinkInfoList.begin(); itt != m_sinkInfoList.end(); ++itt) -+ { -+ AESinkInfo sinkInfo = *itt; -+ for (AEDeviceInfoList::iterator itt2 = sinkInfo.m_deviceInfoList.begin(); itt2 != sinkInfo.m_deviceInfoList.end(); ++itt2) -+ { -+ CAEDeviceInfo& devInfo = *itt2; -+ if (devInfo.m_deviceName == device) -+ { -+ m_deviceFriendlyName = devInfo.m_displayName; -+ break; -+ } -+ } -+ } -+ return; -+} -+ -+void CActiveAESink::OpenSink() -+{ -+ std::string device, driver; -+ bool passthrough = AE_IS_RAW(m_requestedFormat.m_dataFormat); -+ if (passthrough) -+ device = CSettings::Get().GetString("audiooutput.passthroughdevice"); -+ else -+ device = CSettings::Get().GetString("audiooutput.audiodevice"); -+ -+ CAESinkFactory::ParseDevice(device, driver); -+ if (driver.empty() && m_sink) -+ driver = m_sink->GetName(); -+ -+ std::string sinkName; -+ if (m_sink) -+ { -+ sinkName = m_sink->GetName(); -+ std::transform(sinkName.begin(), sinkName.end(), sinkName.begin(), ::toupper); -+ } -+ -+ if (!m_sink || sinkName != driver || !m_sink->IsCompatible(m_requestedFormat, device)) -+ { -+ CLog::Log(LOGINFO, "CActiveAE::OpenSink - sink incompatible, re-starting"); -+ -+ if (m_sink) -+ { -+ m_sink->Drain(); -+ m_sink->Deinitialize(); -+ delete m_sink; -+ m_sink = NULL; -+ } -+ -+ // get the display name of the device -+ GetDeviceFriendlyName(device); -+ -+ // if we already have a driver, prepend it to the device string -+ if (!driver.empty()) -+ device = driver + ":" + device; -+ -+ // WARNING: this changes format and does not use passthrough -+ m_sinkFormat = m_requestedFormat; -+ m_sink = CAESinkFactory::Create(device, m_sinkFormat, passthrough); -+ -+ if (!m_sink) -+ { -+ m_extError = true; -+ return; -+ } -+ -+ m_sink->SetVolume(m_volume); -+ -+#ifdef WORDS_BIGENDIAN -+ if (m_sinkFormat.m_dataFormat == AE_FMT_S16BE) -+ m_sinkFormat.m_dataFormat = AE_FMT_S16NE; -+ else if (m_sinkFormat.m_dataFormat == AE_FMT_S32BE) -+ m_sinkFormat.m_dataFormat = AE_FMT_S32NE; -+#else -+ if (m_sinkFormat.m_dataFormat == AE_FMT_S16LE) -+ m_sinkFormat.m_dataFormat = AE_FMT_S16NE; -+ else if (m_sinkFormat.m_dataFormat == AE_FMT_S32LE) -+ m_sinkFormat.m_dataFormat = AE_FMT_S32NE; -+#endif -+ -+ CLog::Log(LOGDEBUG, "CActiveAE::OpenSink - %s Initialized:", m_sink->GetName()); -+ CLog::Log(LOGDEBUG, " Output Device : %s", m_deviceFriendlyName.c_str()); -+ CLog::Log(LOGDEBUG, " Sample Rate : %d", m_sinkFormat.m_sampleRate); -+ CLog::Log(LOGDEBUG, " Sample Format : %s", CAEUtil::DataFormatToStr(m_sinkFormat.m_dataFormat)); -+ CLog::Log(LOGDEBUG, " Channel Count : %d", m_sinkFormat.m_channelLayout.Count()); -+ CLog::Log(LOGDEBUG, " Channel Layout: %s", ((std::string)m_sinkFormat.m_channelLayout).c_str()); -+ CLog::Log(LOGDEBUG, " Frames : %d", m_sinkFormat.m_frames); -+ CLog::Log(LOGDEBUG, " Frame Samples : %d", m_sinkFormat.m_frameSamples); -+ CLog::Log(LOGDEBUG, " Frame Size : %d", m_sinkFormat.m_frameSize); -+ } -+ else -+ CLog::Log(LOGINFO, "CActiveAE::OpenSink - keeping old sink with : %s, %s, %dhz", -+ CAEUtil::DataFormatToStr(m_sinkFormat.m_dataFormat), -+ ((std::string)m_sinkFormat.m_channelLayout).c_str(), -+ m_sinkFormat.m_sampleRate); -+ -+ // init sample of silence -+ SampleConfig config; -+ config.fmt = CActiveAEResample::GetAVSampleFormat(m_sinkFormat.m_dataFormat); -+ config.channel_layout = CActiveAEResample::GetAVChannelLayout(m_sinkFormat.m_channelLayout); -+ config.channels = m_sinkFormat.m_channelLayout.Count(); -+ config.sample_rate = m_sinkFormat.m_sampleRate; -+ delete m_sampleOfSilence.pkt; -+ m_sampleOfSilence.pkt = new CSoundPacket(config, m_sinkFormat.m_frames); -+ m_sampleOfSilence.pkt->nb_samples = m_sampleOfSilence.pkt->max_nb_samples; -+ -+ // init sample of noise -+ delete m_sampleOfNoise.pkt; -+ m_sampleOfNoise.pkt = new CSoundPacket(config, m_sinkFormat.m_frames); -+ m_sampleOfNoise.pkt->nb_samples = m_sampleOfNoise.pkt->max_nb_samples; -+ if (!passthrough) -+ GenerateNoise(); -+ -+ if (m_convertBuffer) -+ { -+ _aligned_free(m_convertBuffer); -+ m_convertBuffer = NULL; -+ } -+ m_convertFn = NULL; -+ m_convertState = CHECK_CONVERT; -+} -+ -+void CActiveAESink::ReturnBuffers() -+{ -+ Message *msg = NULL; -+ CSampleBuffer *samples; -+ while (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ if (msg->signal == CSinkDataProtocol::SAMPLE) -+ { -+ samples = *((CSampleBuffer**)msg->data); -+ msg->Reply(CSinkDataProtocol::RETURNSAMPLE, &samples, sizeof(CSampleBuffer*)); -+ } -+ } -+} -+ -+unsigned int CActiveAESink::OutputSamples(CSampleBuffer* samples) -+{ -+ uint8_t *buffer = samples->pkt->data[0]; -+ unsigned int frames = samples->pkt->nb_samples; -+ unsigned int maxFrames; -+ int retry = 0; -+ int written = 0; -+ double sinkDelay = 0.0; -+ -+ switch(m_convertState) -+ { -+ case SKIP_CONVERT: -+ break; -+ case NEED_CONVERT: -+ EnsureConvertBuffer(samples); -+ buffer = Convert(samples); -+ break; -+ case NEED_BYTESWAP: -+ Endian_Swap16_buf((uint16_t *)buffer, (uint16_t *)buffer, frames * samples->pkt->config.channels); -+ break; -+ case CHECK_CONVERT: -+ ConvertInit(samples); -+ if (m_convertState == NEED_CONVERT) -+ buffer = Convert(samples); -+ else if (m_convertState == NEED_BYTESWAP) -+ Endian_Swap16_buf((uint16_t *)buffer, (uint16_t *)buffer, frames * samples->pkt->config.channels); -+ break; -+ default: -+ break; -+ } -+ -+ while(frames > 0) -+ { -+ maxFrames = std::min(frames, m_sinkFormat.m_frames); -+ written = m_sink->AddPackets(buffer, maxFrames, true, true); -+ if (written == 0) -+ { -+ Sleep(500*m_sinkFormat.m_frames/m_sinkFormat.m_sampleRate); -+ retry++; -+ if (retry > 4) -+ { -+ m_extError = true; -+ CLog::Log(LOGERROR, "CActiveAESink::OutputSamples - failed"); -+ return 0; -+ } -+ else -+ continue; -+ } -+ frames -= written; -+ buffer += written*m_sinkFormat.m_frameSize; -+ sinkDelay = m_sink->GetDelay(); -+ m_stats->UpdateSinkDelay(sinkDelay, samples->pool ? written : 0); -+ } -+ return sinkDelay*1000; -+} -+ -+void CActiveAESink::ConvertInit(CSampleBuffer* samples) -+{ -+ if (CActiveAEResample::GetAESampleFormat(samples->pkt->config.fmt) != m_sinkFormat.m_dataFormat) -+ { -+ m_convertFn = CAEConvert::FrFloat(m_sinkFormat.m_dataFormat); -+ if (m_convertBuffer) -+ _aligned_free(m_convertBuffer); -+ m_convertBufferSampleSize = samples->pkt->max_nb_samples; -+ m_convertBuffer = (uint8_t*)_aligned_malloc(samples->pkt->max_nb_samples * m_sinkFormat.m_channelLayout.Count() * m_sinkFormat.m_frameSize, 16); -+ memset(m_convertBuffer, 0, samples->pkt->max_nb_samples * m_sinkFormat.m_channelLayout.Count() * m_sinkFormat.m_frameSize); -+ m_convertState = NEED_CONVERT; -+ } -+ else if (AE_IS_RAW(m_requestedFormat.m_dataFormat) && CAEUtil::S16NeedsByteSwap(AE_FMT_S16NE, m_sinkFormat.m_dataFormat)) -+ { -+ m_convertState = NEED_BYTESWAP; -+ } -+ else -+ m_convertState = SKIP_CONVERT; -+} -+ -+void CActiveAESink::EnsureConvertBuffer(CSampleBuffer* samples) -+{ -+ if (!m_convertBuffer) -+ return; -+ -+ if (samples->pkt->max_nb_samples <= m_convertBufferSampleSize) -+ return; -+ -+ _aligned_free(m_convertBuffer); -+ m_convertBufferSampleSize = samples->pkt->max_nb_samples; -+ m_convertBuffer = (uint8_t*)_aligned_malloc(samples->pkt->max_nb_samples * m_sinkFormat.m_channelLayout.Count() * m_sinkFormat.m_frameSize, 16); -+ memset(m_convertBuffer, 0, samples->pkt->max_nb_samples * m_sinkFormat.m_channelLayout.Count() * m_sinkFormat.m_frameSize); -+} -+ -+uint8_t* CActiveAESink::Convert(CSampleBuffer* samples) -+{ -+ unsigned int nb_samples = m_convertFn((float*)samples->pkt->data[0], samples->pkt->nb_samples * samples->pkt->config.channels, m_convertBuffer); -+ return m_convertBuffer; -+} -+ -+#define PI 3.1415926536f -+ -+void CActiveAESink::GenerateNoise() -+{ -+ int nb_floats = m_sinkFormat.m_frames*m_sinkFormat.m_channelLayout.Count(); -+ float *noise = new float[nb_floats]; -+ -+ float R1, R2; -+ for(int i=0; iconfig.fmt); -+ CAEConvert::AEConvertFrFn convertFn = CAEConvert::FrFloat(fmt); -+ convertFn(noise, nb_floats, m_sampleOfNoise.pkt->data[0]); -+ delete [] noise; -+} -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h -new file mode 100644 -index 0000000..559179c ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.h -@@ -0,0 +1,138 @@ -+#pragma once -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include "threads/Event.h" -+#include "threads/Thread.h" -+#include "utils/ActorProtocol.h" -+#include "Interfaces/AE.h" -+#include "Interfaces/AESink.h" -+#include "AESinkFactory.h" -+#include "ActiveAEResample.h" -+#include "Utils/AEConvert.h" -+ -+namespace ActiveAE -+{ -+using namespace Actor; -+ -+class CEngineStats; -+ -+struct SinkConfig -+{ -+ AEAudioFormat format; -+ CEngineStats *stats; -+}; -+ -+class CSinkControlProtocol : public Protocol -+{ -+public: -+ CSinkControlProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ CONFIGURE, -+ UNCONFIGURE, -+ SILENCEMODE, -+ VOLUME, -+ TIMEOUT, -+ }; -+ enum InSignal -+ { -+ ACC, -+ ERR, -+ STATS, -+ }; -+}; -+ -+class CSinkDataProtocol : public Protocol -+{ -+public: -+ CSinkDataProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ SAMPLE = 0, -+ DRAIN, -+ }; -+ enum InSignal -+ { -+ RETURNSAMPLE, -+ ACC, -+ }; -+}; -+ -+class CActiveAESink : private CThread -+{ -+public: -+ CActiveAESink(CEvent *inMsgEvent); -+ void EnumerateSinkList(); -+ void EnumerateOutputDevices(AEDeviceList &devices, bool passthrough); -+ std::string GetDefaultDevice(bool passthrough); -+ void Start(); -+ void Dispose(); -+ bool IsCompatible(const AEAudioFormat format, const std::string &device); -+ bool HasVolume(); -+ CSinkControlProtocol m_controlPort; -+ CSinkDataProtocol m_dataPort; -+ -+protected: -+ void Process(); -+ void StateMachine(int signal, Protocol *port, Message *msg); -+ void PrintSinks(); -+ void GetDeviceFriendlyName(std::string &device); -+ void OpenSink(); -+ void ReturnBuffers(); -+ -+ unsigned int OutputSamples(CSampleBuffer* samples); -+ void ConvertInit(CSampleBuffer* samples); -+ inline void EnsureConvertBuffer(CSampleBuffer* samples); -+ inline uint8_t* Convert(CSampleBuffer* samples); -+ -+ void GenerateNoise(); -+ -+ CEvent m_outMsgEvent; -+ CEvent *m_inMsgEvent; -+ int m_state; -+ bool m_bStateMachineSelfTrigger; -+ int m_extTimeout; -+ bool m_extError; -+ bool m_extSilence; -+ int m_extCycleCounter; -+ -+ CSampleBuffer m_sampleOfSilence; -+ CSampleBuffer m_sampleOfNoise; -+ uint8_t *m_convertBuffer; -+ int m_convertBufferSampleSize; -+ CAEConvert::AEConvertFrFn m_convertFn; -+ enum -+ { -+ CHECK_CONVERT, -+ NEED_CONVERT, -+ NEED_BYTESWAP, -+ SKIP_CONVERT, -+ } m_convertState; -+ -+ std::string m_deviceFriendlyName; -+ AESinkInfoList m_sinkInfoList; -+ IAESink *m_sink; -+ AEAudioFormat m_sinkFormat, m_requestedFormat; -+ CEngineStats *m_stats; -+ float m_volume; -+}; -+ -+} -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp -new file mode 100644 -index 0000000..fb75ba9 ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.cpp -@@ -0,0 +1,161 @@ -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include "Interfaces/AESound.h" -+ -+#include "AEFactory.h" -+#include "AEAudioFormat.h" -+#include "ActiveAE.h" -+#include "ActiveAESound.h" -+#include "utils/log.h" -+#include "DllAvUtil.h" -+ -+using namespace ActiveAE; -+using namespace XFILE; -+ -+/* typecast AE to CActiveAE */ -+#define AE (*((CActiveAE*)CAEFactory::GetEngine())) -+ -+CActiveAESound::CActiveAESound(const std::string &filename) : -+ IAESound (filename), -+ m_filename (filename), -+ m_volume (1.0f ) -+{ -+ m_orig_sound = NULL; -+ m_dst_sound = NULL; -+ m_pFile = NULL; -+} -+ -+CActiveAESound::~CActiveAESound() -+{ -+ delete m_orig_sound; -+ delete m_dst_sound; -+ Finish(); -+} -+ -+void CActiveAESound::Play() -+{ -+ AE.PlaySound(this); -+} -+ -+void CActiveAESound::Stop() -+{ -+ AE.StopSound(this); -+} -+ -+bool CActiveAESound::IsPlaying() -+{ -+ // TODO -+ return false; -+} -+ -+uint8_t** CActiveAESound::InitSound(bool orig, SampleConfig config, int nb_samples) -+{ -+ CSoundPacket **info; -+ if (orig) -+ info = &m_orig_sound; -+ else -+ info = &m_dst_sound; -+ -+ delete *info; -+ *info = new CSoundPacket(config, nb_samples); -+ -+ (*info)->nb_samples = 0; -+ m_isConverted = false; -+ return (*info)->data; -+} -+ -+bool CActiveAESound::StoreSound(bool orig, uint8_t **buffer, int samples, int linesize) -+{ -+ CSoundPacket **info; -+ if (orig) -+ info = &m_orig_sound; -+ else -+ info = &m_dst_sound; -+ -+ if ((*info)->nb_samples + samples > (*info)->max_nb_samples) -+ { -+ CLog::Log(LOGERROR, "CActiveAESound::StoreSound - exceeded max samples"); -+ return false; -+ } -+ -+ int bytes_to_copy = samples * (*info)->bytes_per_sample * (*info)->config.channels; -+ bytes_to_copy /= (*info)->planes; -+ int start = (*info)->nb_samples * (*info)->bytes_per_sample * (*info)->config.channels; -+ start /= (*info)->planes; -+ -+ for (int i=0; i<(*info)->planes; i++) -+ { -+ memcpy((*info)->data[i]+start, buffer[i], bytes_to_copy); -+ } -+ (*info)->nb_samples += samples; -+ -+ return true; -+} -+ -+CSoundPacket *CActiveAESound::GetSound(bool orig) -+{ -+ if (orig) -+ return m_orig_sound; -+ else -+ return m_dst_sound; -+} -+ -+bool CActiveAESound::Prepare() -+{ -+ unsigned int flags = READ_TRUNCATED | READ_CHUNKED; -+ m_pFile = new CFile(); -+ -+ if (!m_pFile->Open(m_filename, flags)) -+ { -+ delete m_pFile; -+ m_pFile = NULL; -+ return false; -+ } -+ m_isSeekPosible = m_pFile->IoControl(IOCTRL_SEEK_POSSIBLE, NULL) != 0; -+ m_fileSize = m_pFile->GetLength(); -+ return true; -+} -+ -+void CActiveAESound::Finish() -+{ -+ delete m_pFile; -+ m_pFile = NULL; -+} -+ -+int CActiveAESound::GetChunkSize() -+{ -+ return m_pFile->GetChunkSize(); -+} -+ -+int CActiveAESound::Read(void *h, uint8_t* buf, int size) -+{ -+ CFile *pFile = static_cast(h)->m_pFile; -+ return pFile->Read(buf, size); -+} -+ -+offset_t CActiveAESound::Seek(void *h, offset_t pos, int whence) -+{ -+ CFile* pFile = static_cast(h)->m_pFile; -+ if(whence == AVSEEK_SIZE) -+ return pFile->GetLength(); -+ else -+ return pFile->Seek(pos, whence & ~AVSEEK_FORCE); -+} -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.h -new file mode 100644 -index 0000000..7cdf76c ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESound.h -@@ -0,0 +1,73 @@ -+#pragma once -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include "utils/StdString.h" -+#include "Interfaces/AESound.h" -+#include "ActiveAEResample.h" -+#include "filesystem/File.h" -+ -+class DllAvUtil; -+ -+namespace ActiveAE -+{ -+ -+class CActiveAESound : public IAESound -+{ -+public: -+ CActiveAESound (const std::string &filename); -+ virtual ~CActiveAESound(); -+ -+ virtual void Play(); -+ virtual void Stop(); -+ virtual bool IsPlaying(); -+ -+ virtual void SetVolume(float volume) { m_volume = std::max(0.0f, std::min(1.0f, volume)); } -+ virtual float GetVolume() { return m_volume; } -+ -+ uint8_t** InitSound(bool orig, SampleConfig config, int nb_samples); -+ bool StoreSound(bool orig, uint8_t **buffer, int samples, int linesize); -+ CSoundPacket *GetSound(bool orig); -+ -+ bool IsConverted() { return m_isConverted; } -+ void SetConverted(bool state) { m_isConverted = state; } -+ -+ bool Prepare(); -+ void Finish(); -+ int GetChunkSize(); -+ int GetFileSize() { return m_fileSize; } -+ bool IsSeekPosible() { return m_isSeekPosible; } -+ -+ static int Read(void *h, uint8_t* buf, int size); -+ static offset_t Seek(void *h, offset_t pos, int whence); -+ -+protected: -+ std::string m_filename; -+ XFILE::CFile *m_pFile; -+ bool m_isSeekPosible; -+ int m_fileSize; -+ float m_volume; -+ -+ CSoundPacket *m_orig_sound; -+ CSoundPacket *m_dst_sound; -+ -+ bool m_isConverted; -+}; -+} -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp -new file mode 100644 -index 0000000..66f62b7 ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp -@@ -0,0 +1,362 @@ -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include "system.h" -+#include "threads/SingleLock.h" -+#include "utils/log.h" -+#include "utils/MathUtils.h" -+ -+#include "AEFactory.h" -+#include "Utils/AEUtil.h" -+ -+#include "ActiveAE.h" -+#include "ActiveAEStream.h" -+ -+using namespace ActiveAE; -+ -+/* typecast AE to CActiveAE */ -+#define AE (*((CActiveAE*)CAEFactory::GetEngine())) -+ -+ -+CActiveAEStream::CActiveAEStream(AEAudioFormat *format) -+{ -+ m_format = *format; -+ m_bufferedTime = 0; -+ m_currentBuffer = NULL; -+ m_drain = false; -+ m_paused = false; -+ m_rgain = 1.0; -+ m_volume = 1.0; -+ m_streamSpace = m_format.m_frameSize * m_format.m_frames; -+ m_streamDraining = false; -+ m_streamDrained = false; -+ m_streamFading = false; -+ m_streamFreeBuffers = 0; -+ m_streamIsBuffering = true; -+ m_streamSlave = NULL; -+ m_convertFn = NULL; -+} -+ -+CActiveAEStream::~CActiveAEStream() -+{ -+} -+ -+void CActiveAEStream::IncFreeBuffers() -+{ -+ CSingleLock lock(m_streamLock); -+ m_streamFreeBuffers++; -+} -+ -+void CActiveAEStream::DecFreeBuffers() -+{ -+ CSingleLock lock(m_streamLock); -+ m_streamFreeBuffers--; -+} -+ -+void CActiveAEStream::ResetFreeBuffers() -+{ -+ CSingleLock lock(m_streamLock); -+ m_streamFreeBuffers = 0; -+} -+ -+unsigned int CActiveAEStream::GetSpace() -+{ -+ CSingleLock lock(m_streamLock); -+ return m_streamFreeBuffers * m_streamSpace; -+} -+ -+unsigned int CActiveAEStream::AddData(void *data, unsigned int size) -+{ -+ Message *msg; -+ unsigned int copied = 0; -+ int bytesToCopy = size; -+ while(copied < size) -+ { -+ if (m_currentBuffer) -+ { -+ int start = m_currentBuffer->pkt->nb_samples * -+ m_currentBuffer->pkt->bytes_per_sample * -+ m_currentBuffer->pkt->config.channels / -+ m_currentBuffer->pkt->planes; -+ -+ int freeSamples = m_currentBuffer->pkt->max_nb_samples - m_currentBuffer->pkt->nb_samples; -+ int availableSamples = bytesToCopy / m_format.m_frameSize; -+ int space = freeSamples * m_currentBuffer->pkt->bytes_per_sample * m_currentBuffer->pkt->config.channels; -+ int samples = std::min(freeSamples, availableSamples); -+ int bytes = samples * m_format.m_frameSize; -+ //TODO: handle planar formats -+ if (m_convertFn) -+ m_convertFn((uint8_t*)data+copied, samples*m_currentBuffer->pkt->config.channels, (float*)(m_currentBuffer->pkt->data[0] + start)); -+ else -+ memcpy(m_currentBuffer->pkt->data[0] + start, (uint8_t*)data+copied, bytes); -+ { -+ CSingleLock lock(*m_statsLock); -+ m_currentBuffer->pkt->nb_samples += samples; -+ m_bufferedTime += (double)samples / m_currentBuffer->pkt->config.sample_rate; -+ } -+ copied += bytes; -+ bytesToCopy -= bytes; -+ if (m_currentBuffer->pkt->nb_samples == m_currentBuffer->pkt->max_nb_samples) -+ { -+ MsgStreamSample msgData; -+ msgData.buffer = m_currentBuffer; -+ msgData.stream = this; -+ m_streamPort->SendOutMessage(CActiveAEDataProtocol::STREAMSAMPLE, &msgData, sizeof(MsgStreamSample)); -+ m_currentBuffer = NULL; -+ } -+ continue; -+ } -+ else if (m_streamPort->ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == CActiveAEDataProtocol::STREAMBUFFER) -+ { -+ m_currentBuffer = *((CSampleBuffer**)msg->data); -+ msg->Release(); -+ DecFreeBuffers(); -+ continue; -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "CActiveAEStream::AddData - unknown signal"); -+ msg->Release(); -+ break; -+ } -+ } -+ if (!m_inMsgEvent.WaitMSec(200)) -+ break; -+ } -+ return copied; -+} -+ -+double CActiveAEStream::GetDelay() -+{ -+ return AE.GetDelay(this); -+} -+ -+bool CActiveAEStream::IsBuffering() -+{ -+ CSingleLock lock(m_streamLock); -+ return m_streamIsBuffering; -+} -+ -+double CActiveAEStream::GetCacheTime() -+{ -+ return AE.GetCacheTime(this); -+} -+ -+double CActiveAEStream::GetCacheTotal() -+{ -+ return AE.GetCacheTotal(this); -+} -+ -+void CActiveAEStream::Pause() -+{ -+ AE.PauseStream(this, true); -+} -+ -+void CActiveAEStream::Resume() -+{ -+ AE.PauseStream(this, false); -+} -+ -+void CActiveAEStream::Drain(bool wait) -+{ -+ Message *msg; -+ CActiveAEStream *stream = this; -+ -+ m_streamDraining = true; -+ m_streamDrained = false; -+ -+ Message *reply; -+ if (m_streamPort->SendOutMessageSync(CActiveAEDataProtocol::DRAINSTREAM, -+ &reply,2000, -+ &stream, sizeof(CActiveAEStream*))) -+ { -+ bool success = reply->signal == CActiveAEDataProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "CActiveAEStream::Drain - no acc"); -+ } -+ } -+ -+ if (m_currentBuffer) -+ { -+ MsgStreamSample msgData; -+ msgData.buffer = m_currentBuffer; -+ msgData.stream = this; -+ m_streamPort->SendOutMessage(CActiveAEDataProtocol::STREAMSAMPLE, &msgData, sizeof(MsgStreamSample)); -+ m_currentBuffer = NULL; -+ } -+ -+ XbmcThreads::EndTime timer(2000); -+ while (!timer.IsTimePast()) -+ { -+ if (m_streamPort->ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == CActiveAEDataProtocol::STREAMBUFFER) -+ { -+ MsgStreamSample msgData; -+ msgData.stream = this; -+ msgData.buffer = *((CSampleBuffer**)msg->data); -+ msg->Reply(CActiveAEDataProtocol::STREAMSAMPLE, &msgData, sizeof(MsgStreamSample)); -+ DecFreeBuffers(); -+ continue; -+ } -+ else if (msg->signal == CActiveAEDataProtocol::STREAMDRAINED) -+ { -+ msg->Release(); -+ return; -+ } -+ } -+ else if (!wait) -+ return; -+ -+ m_inMsgEvent.WaitMSec(timer.MillisLeft()); -+ } -+ CLog::Log(LOGERROR, "CActiveAEStream::Drain - timeout out"); -+} -+ -+bool CActiveAEStream::IsDraining() -+{ -+ CSingleLock lock(m_streamLock); -+ return m_streamDraining; -+} -+ -+bool CActiveAEStream::IsDrained() -+{ -+ CSingleLock lock(m_streamLock); -+ return m_streamDrained; -+} -+ -+void CActiveAEStream::Flush() -+{ -+ if (m_currentBuffer) -+ { -+ MsgStreamSample msgData; -+ m_currentBuffer->pkt->nb_samples = 0; -+ msgData.buffer = m_currentBuffer; -+ msgData.stream = this; -+ m_streamPort->SendOutMessage(CActiveAEDataProtocol::STREAMSAMPLE, &msgData, sizeof(MsgStreamSample)); -+ m_currentBuffer = NULL; -+ } -+ AE.FlushStream(this); -+ ResetFreeBuffers(); -+} -+ -+float CActiveAEStream::GetAmplification() -+{ -+ return m_streamAmplify; -+} -+ -+void CActiveAEStream::SetAmplification(float amplify) -+{ -+ m_streamAmplify = amplify; -+ AE.SetStreamAmplification(this, m_streamAmplify); -+} -+ -+float CActiveAEStream::GetReplayGain() -+{ -+ return m_streamRgain; -+} -+ -+void CActiveAEStream::SetReplayGain(float factor) -+{ -+ m_streamRgain = std::max( 0.0f, factor); -+ AE.SetStreamReplaygain(this, m_streamRgain); -+} -+ -+float CActiveAEStream::GetVolume() -+{ -+ return m_streamVolume; -+} -+ -+void CActiveAEStream::SetVolume(float volume) -+{ -+ m_streamVolume = std::max( 0.0f, std::min(1.0f, volume)); -+ AE.SetStreamVolume(this, m_streamVolume); -+} -+ -+double CActiveAEStream::GetResampleRatio() -+{ -+ return m_streamResampleRatio; -+} -+ -+bool CActiveAEStream::SetResampleRatio(double ratio) -+{ -+ m_streamResampleRatio = ratio; -+ AE.SetStreamResampleRatio(this, m_streamResampleRatio); -+ return true; -+} -+ -+void CActiveAEStream::FadeVolume(float from, float target, unsigned int time) -+{ -+ if (time == 0) -+ return; -+ -+ m_streamFading = true; -+ AE.SetStreamFade(this, from, target, time); -+} -+ -+bool CActiveAEStream::IsFading() -+{ -+ CSingleLock lock(m_streamLock); -+ return m_streamFading; -+} -+ -+const unsigned int CActiveAEStream::GetFrameSize() const -+{ -+ return m_format.m_frameSize; -+} -+ -+const unsigned int CActiveAEStream::GetChannelCount() const -+{ -+ return m_format.m_channelLayout.Count(); -+} -+ -+const unsigned int CActiveAEStream::GetSampleRate() const -+{ -+ return m_format.m_sampleRate; -+} -+ -+const unsigned int CActiveAEStream::GetEncodedSampleRate() const -+{ -+ return m_format.m_encodedRate; -+} -+ -+const enum AEDataFormat CActiveAEStream::GetDataFormat() const -+{ -+ return m_format.m_dataFormat; -+} -+ -+void CActiveAEStream::RegisterAudioCallback(IAudioCallback* pCallback) -+{ -+} -+ -+void CActiveAEStream::UnRegisterAudioCallback() -+{ -+} -+ -+void CActiveAEStream::RegisterSlave(IAEStream *slave) -+{ -+ CSingleLock lock(m_streamLock); -+ m_streamSlave = slave; -+} -+ -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h -new file mode 100644 -index 0000000..bddf1a3 ---- /dev/null -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h -@@ -0,0 +1,117 @@ -+#pragma once -+/* -+ * Copyright (C) 2010-2013 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 -+ * . -+ * -+ */ -+ -+#include "AEAudioFormat.h" -+#include "Interfaces/AEStream.h" -+#include "Utils/AELimiter.h" -+#include "Utils/AEConvert.h" -+ -+namespace ActiveAE -+{ -+ -+class CActiveAEStream : public IAEStream -+{ -+protected: -+ friend class CActiveAE; -+ friend class CEngineStats; -+ CActiveAEStream(AEAudioFormat *format); -+ virtual ~CActiveAEStream(); -+ void FadingFinished(); -+ void IncFreeBuffers(); -+ void DecFreeBuffers(); -+ void ResetFreeBuffers(); -+ -+public: -+ virtual unsigned int GetSpace(); -+ virtual unsigned int AddData(void *data, unsigned int size); -+ virtual double GetDelay(); -+ virtual bool IsBuffering(); -+ virtual double GetCacheTime(); -+ virtual double GetCacheTotal(); -+ -+ virtual void Pause(); -+ virtual void Resume(); -+ virtual void Drain(bool wait); -+ virtual bool IsDraining(); -+ virtual bool IsDrained(); -+ virtual void Flush(); -+ -+ virtual float GetVolume(); -+ virtual float GetReplayGain(); -+ virtual float GetAmplification(); -+ virtual void SetVolume(float volume); -+ virtual void SetReplayGain(float factor); -+ virtual void SetAmplification(float amplify); -+ -+ virtual const unsigned int GetFrameSize() const; -+ virtual const unsigned int GetChannelCount() const; -+ -+ virtual const unsigned int GetSampleRate() const ; -+ virtual const unsigned int GetEncodedSampleRate() const; -+ virtual const enum AEDataFormat GetDataFormat() const; -+ -+ virtual double GetResampleRatio(); -+ virtual bool SetResampleRatio(double ratio); -+ virtual void RegisterAudioCallback(IAudioCallback* pCallback); -+ virtual void UnRegisterAudioCallback(); -+ virtual void FadeVolume(float from, float to, unsigned int time); -+ virtual bool IsFading(); -+ virtual void RegisterSlave(IAEStream *stream); -+ -+protected: -+ -+ AEAudioFormat m_format; -+ float m_streamVolume; -+ float m_streamRgain; -+ float m_streamAmplify; -+ double m_streamResampleRatio; -+ unsigned int m_streamSpace; -+ bool m_streamDraining; -+ bool m_streamDrained; -+ bool m_streamFading; -+ int m_streamFreeBuffers; -+ bool m_streamIsBuffering; -+ IAEStream *m_streamSlave; -+ CAEConvert::AEConvertToFn m_convertFn; -+ CCriticalSection m_streamLock; -+ -+ // only accessed by engine -+ CActiveAEBufferPool *m_inputBuffers; -+ CActiveAEBufferPoolResample *m_resampleBuffers; -+ std::deque m_processingSamples; -+ CSampleBuffer *m_currentBuffer; -+ CActiveAEDataProtocol *m_streamPort; -+ CEvent m_inMsgEvent; -+ CCriticalSection *m_statsLock; -+ bool m_drain; -+ bool m_paused; -+ bool m_started; -+ CAELimiter m_limiter; -+ float m_volume; -+ float m_rgain; -+ float m_bufferedTime; -+ int m_fadingSamples; -+ float m_fadingBase; -+ float m_fadingTarget; -+ int m_fadingTime; -+}; -+} -+ -diff --git a/xbmc/cores/AudioEngine/Makefile.in b/xbmc/cores/AudioEngine/Makefile.in -index 833dfab..2e1a83d 100644 ---- a/xbmc/cores/AudioEngine/Makefile.in -+++ b/xbmc/cores/AudioEngine/Makefile.in -@@ -43,6 +43,13 @@ SRCS += Engines/SoftAE/SoftAE.cpp - SRCS += Engines/SoftAE/SoftAEStream.cpp - SRCS += Engines/SoftAE/SoftAESound.cpp - -+SRCS += Engines/ActiveAE/ActiveAE.cpp -+SRCS += Engines/ActiveAE/ActiveAESink.cpp -+SRCS += Engines/ActiveAE/ActiveAEStream.cpp -+SRCS += Engines/ActiveAE/ActiveAESound.cpp -+SRCS += Engines/ActiveAE/ActiveAEResample.cpp -+SRCS += Engines/ActiveAE/ActiveAEBuffer.cpp -+ - ifeq (@USE_ANDROID@,1) - SRCS += Sinks/AESinkAUDIOTRACK.cpp - else -diff --git a/xbmc/utils/ActorProtocol.cpp b/xbmc/utils/ActorProtocol.cpp -new file mode 100644 -index 0000000..cf4c26f ---- /dev/null -+++ b/xbmc/utils/ActorProtocol.cpp -@@ -0,0 +1,253 @@ -+/* -+ * Copyright (C) 2005-2013 Team XBMC -+ * http://www.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 -+ * . -+ * -+ */ -+ -+#include "ActorProtocol.h" -+ -+using namespace Actor; -+ -+void Message::Release() -+{ -+ bool skip; -+ origin->Lock(); -+ skip = isSync ? !isSyncFini : false; -+ isSyncFini = true; -+ origin->Unlock(); -+ -+ if (skip) -+ return; -+ -+ // free data buffer -+ if (data != buffer) -+ delete [] data; -+ -+ // delete event in case of sync message -+ if (event) -+ delete event; -+ -+ origin->ReturnMessage(this); -+} -+ -+bool Message::Reply(int sig, void *data /* = NULL*/, int size /* = 0 */) -+{ -+ if (!isSync) -+ { -+ if (isOut) -+ return origin->SendInMessage(sig, data, size); -+ else -+ return origin->SendOutMessage(sig, data, size); -+ } -+ -+ origin->Lock(); -+ -+ if (!isSyncTimeout) -+ { -+ Message *msg = origin->GetMessage(); -+ msg->signal = sig; -+ msg->isOut = !isOut; -+ replyMessage = msg; -+ if (data) -+ { -+ if (size > MSG_INTERNAL_BUFFER_SIZE) -+ msg->data = new uint8_t[size]; -+ else -+ msg->data = msg->buffer; -+ memcpy(msg->data, data, size); -+ } -+ } -+ -+ origin->Unlock(); -+ -+ if (event) -+ event->Set(); -+ -+ return true; -+} -+ -+Protocol::~Protocol() -+{ -+ Message *msg; -+ Purge(); -+ while (!freeMessageQueue.empty()) -+ { -+ msg = freeMessageQueue.front(); -+ freeMessageQueue.pop(); -+ delete msg; -+ } -+} -+ -+Message *Protocol::GetMessage() -+{ -+ Message *msg; -+ -+ CSingleLock lock(criticalSection); -+ -+ if (!freeMessageQueue.empty()) -+ { -+ msg = freeMessageQueue.front(); -+ freeMessageQueue.pop(); -+ } -+ else -+ msg = new Message(); -+ -+ msg->isSync = false; -+ msg->isSyncFini = false; -+ msg->isSyncTimeout = false; -+ msg->event = NULL; -+ msg->data = NULL; -+ msg->payloadSize = 0; -+ msg->replyMessage = NULL; -+ msg->origin = this; -+ -+ return msg; -+} -+ -+void Protocol::ReturnMessage(Message *msg) -+{ -+ CSingleLock lock(criticalSection); -+ -+ freeMessageQueue.push(msg); -+} -+ -+bool Protocol::SendOutMessage(int signal, void *data /* = NULL */, int size /* = 0 */, Message *outMsg /* = NULL */) -+{ -+ Message *msg; -+ if (outMsg) -+ msg = outMsg; -+ else -+ msg = GetMessage(); -+ -+ msg->signal = signal; -+ msg->isOut = true; -+ -+ if (data) -+ { -+ if (size > MSG_INTERNAL_BUFFER_SIZE) -+ msg->data = new uint8_t[size]; -+ else -+ msg->data = msg->buffer; -+ memcpy(msg->data, data, size); -+ } -+ -+ { CSingleLock lock(criticalSection); -+ outMessages.push(msg); -+ } -+ containerOutEvent->Set(); -+ -+ return true; -+} -+ -+bool Protocol::SendInMessage(int signal, void *data /* = NULL */, int size /* = 0 */, Message *outMsg /* = NULL */) -+{ -+ Message *msg; -+ if (outMsg) -+ msg = outMsg; -+ else -+ msg = GetMessage(); -+ -+ msg->signal = signal; -+ msg->isOut = false; -+ -+ if (data) -+ { -+ if (size > MSG_INTERNAL_BUFFER_SIZE) -+ msg->data = new uint8_t[size]; -+ else -+ msg->data = msg->buffer; -+ memcpy(msg->data, data, size); -+ } -+ -+ { CSingleLock lock(criticalSection); -+ inMessages.push(msg); -+ } -+ containerInEvent->Set(); -+ -+ return true; -+} -+ -+ -+bool Protocol::SendOutMessageSync(int signal, Message **retMsg, int timeout, void *data /* = NULL */, int size /* = 0 */) -+{ -+ Message *msg = GetMessage(); -+ msg->isOut = true; -+ msg->isSync = true; -+ msg->event = new CEvent; -+ msg->event->Reset(); -+ SendOutMessage(signal, data, size, msg); -+ -+ if (!msg->event->WaitMSec(timeout)) -+ { -+ msg->origin->Lock(); -+ if (msg->replyMessage) -+ *retMsg = msg->replyMessage; -+ else -+ { -+ *retMsg = NULL; -+ msg->isSyncTimeout = true; -+ } -+ msg->origin->Unlock(); -+ } -+ else -+ *retMsg = msg->replyMessage; -+ -+ msg->Release(); -+ -+ if (*retMsg) -+ return true; -+ else -+ return false; -+} -+ -+bool Protocol::ReceiveOutMessage(Message **msg) -+{ -+ CSingleLock lock(criticalSection); -+ -+ if (outMessages.empty() || outDefered) -+ return false; -+ -+ *msg = outMessages.front(); -+ outMessages.pop(); -+ -+ return true; -+} -+ -+bool Protocol::ReceiveInMessage(Message **msg) -+{ -+ CSingleLock lock(criticalSection); -+ -+ if (inMessages.empty() || inDefered) -+ return false; -+ -+ *msg = inMessages.front(); -+ inMessages.pop(); -+ -+ return true; -+} -+ -+ -+void Protocol::Purge() -+{ -+ Message *msg; -+ -+ while (ReceiveInMessage(&msg)) -+ msg->Release(); -+ -+ while (ReceiveOutMessage(&msg)) -+ msg->Release(); -+} -diff --git a/xbmc/utils/ActorProtocol.h b/xbmc/utils/ActorProtocol.h -new file mode 100644 -index 0000000..8ef3359 ---- /dev/null -+++ b/xbmc/utils/ActorProtocol.h -@@ -0,0 +1,87 @@ -+/* -+ * Copyright (C) 2005-2013 Team XBMC -+ * http://www.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 -+ * . -+ * -+ */ -+ -+#pragma once -+ -+#include "threads/Thread.h" -+#include "utils/log.h" -+#include -+#include "memory.h" -+ -+#define MSG_INTERNAL_BUFFER_SIZE 32 -+ -+namespace Actor -+{ -+ -+class Protocol; -+ -+class Message -+{ -+ friend class Protocol; -+public: -+ int signal; -+ bool isSync; -+ bool isSyncFini; -+ bool isOut; -+ bool isSyncTimeout; -+ int payloadSize; -+ uint8_t buffer[MSG_INTERNAL_BUFFER_SIZE]; -+ uint8_t *data; -+ Message *replyMessage; -+ Protocol *origin; -+ CEvent *event; -+ -+ void Release(); -+ bool Reply(int sig, void *data = NULL, int size = 0); -+ -+private: -+ Message() {isSync = false; data = NULL; event = NULL; replyMessage = NULL;}; -+}; -+ -+class Protocol -+{ -+public: -+ Protocol(std::string name, CEvent* inEvent, CEvent *outEvent) -+ : portName(name), inDefered(false), outDefered(false) {containerInEvent = inEvent; containerOutEvent = outEvent;}; -+ virtual ~Protocol(); -+ Message *GetMessage(); -+ void ReturnMessage(Message *msg); -+ bool SendOutMessage(int signal, void *data = NULL, int size = 0, Message *outMsg = NULL); -+ bool SendInMessage(int signal, void *data = NULL, int size = 0, Message *outMsg = NULL); -+ bool SendOutMessageSync(int signal, Message **retMsg, int timeout, void *data = NULL, int size = 0); -+ bool ReceiveOutMessage(Message **msg); -+ bool ReceiveInMessage(Message **msg); -+ void Purge(); -+ void DeferIn(bool value) {inDefered = value;}; -+ void DeferOut(bool value) {outDefered = value;}; -+ void Lock() {criticalSection.lock();}; -+ void Unlock() {criticalSection.unlock();}; -+ std::string portName; -+ -+protected: -+ CEvent *containerInEvent, *containerOutEvent; -+ CCriticalSection criticalSection; -+ std::queue outMessages; -+ std::queue inMessages; -+ std::queue freeMessageQueue; -+ bool inDefered, outDefered; -+}; -+ -+} -diff --git a/xbmc/utils/Makefile.in b/xbmc/utils/Makefile.in -index 694a9bd..ca49be2 100644 ---- a/xbmc/utils/Makefile.in -+++ b/xbmc/utils/Makefile.in -@@ -70,6 +70,7 @@ SRCS += Vector.cpp - SRCS += Weather.cpp - SRCS += XBMCTinyXML.cpp - SRCS += XMLUtils.cpp -+SRCS += ActorProtocol.cpp - - ifeq (@USE_OPENGLES@,1) - SRCS += AMLUtils.cpp --- -1.8.1.6 - - -From dfaf102c264a11252e053ec4477d08db6cbca1f9 Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Sat, 8 Jun 2013 09:39:38 +0200 -Subject: [PATCH 014/136] ActiveAE: Make Factory aware of environment, change - global namespace - ---- - xbmc/cores/AudioEngine/AEFactory.cpp | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp -index 4f9f566..5adda5f 100644 ---- a/xbmc/cores/AudioEngine/AEFactory.cpp -+++ b/xbmc/cores/AudioEngine/AEFactory.cpp -@@ -28,7 +28,6 @@ - #else - #include "Engines/SoftAE/SoftAE.h" - #include "Engines/ActiveAE/ActiveAE.h" -- using namespace ActiveAE; - #endif - - #if defined(HAS_PULSEAUDIO) -@@ -69,6 +68,8 @@ bool CAEFactory::LoadEngine() - #endif - if (!loaded && engine == "SOFT" ) - loaded = CAEFactory::LoadEngine(AE_ENGINE_SOFT); -+ if (!loaded && engine == "ACTIVE") -+ loaded = CAEFactory::LoadEngine(AE_ENGINE_ACTIVE); - } - #endif - -@@ -101,7 +102,7 @@ bool CAEFactory::LoadEngine(enum AEEngine engine) - case AE_ENGINE_COREAUDIO: AE = new CCoreAudioAE(); break; - #else - case AE_ENGINE_SOFT : AE = new CSoftAE(); break; -- case AE_ENGINE_ACTIVE : AE = new CActiveAE(); break; -+ case AE_ENGINE_ACTIVE : AE = new ActiveAE::CActiveAE(); break; - #endif - #if defined(HAS_PULSEAUDIO) - case AE_ENGINE_PULSE : AE = new CPulseAE(); break; --- -1.8.1.6 - - -From 1032f3155784ceb5781940e7bae5f3369cd7a831 Mon Sep 17 00:00:00 2001 -From: unknown -Date: Thu, 11 Jul 2013 18:33:34 +0200 -Subject: [PATCH 015/136] AE: allow Windows to use ActiveAE via env - ---- - xbmc/cores/AudioEngine/AEFactory.cpp | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp -index 5adda5f..d5517f3 100644 ---- a/xbmc/cores/AudioEngine/AEFactory.cpp -+++ b/xbmc/cores/AudioEngine/AEFactory.cpp -@@ -73,6 +73,20 @@ bool CAEFactory::LoadEngine() - } - #endif - -+#if defined(TARGET_WINDOWS) -+ std::string engine; -+ if (getenv("AE_ENGINE")) -+ { -+ engine = (std::string)getenv("AE_ENGINE"); -+ std::transform(engine.begin(), engine.end(), engine.begin(), ::toupper); -+ -+ if (!loaded && engine == "SOFT" ) -+ loaded = CAEFactory::LoadEngine(AE_ENGINE_SOFT); -+ if (!loaded && engine == "ACTIVE") -+ loaded = CAEFactory::LoadEngine(AE_ENGINE_ACTIVE); -+ } -+#endif -+ - #if defined(HAS_PULSEAUDIO) - if (!loaded) - loaded = CAEFactory::LoadEngine(AE_ENGINE_PULSE); --- -1.8.1.6 - - -From ca1eb43f810ffa679c9420d740e0474e19b474bc Mon Sep 17 00:00:00 2001 -From: unknown -Date: Tue, 16 Jul 2013 17:06:03 +0200 -Subject: [PATCH 017/136] AE: add streamsilence to gui settings for engines - which suppport drain - ---- - language/English/strings.po | 14 +++++++++++--- - system/settings/settings.xml | 5 +++++ - xbmc/cores/AudioEngine/AEFactory.cpp | 8 ++++++++ - xbmc/cores/AudioEngine/AEFactory.h | 1 + - xbmc/cores/AudioEngine/Interfaces/AE.h | 6 ++++++ - xbmc/settings/Settings.cpp | 4 ++++ - 6 files changed, 35 insertions(+), 3 deletions(-) - -diff --git a/language/English/strings.po b/language/English/strings.po -index 069dce0..c2c562f 100644 ---- a/language/English/strings.po -+++ b/language/English/strings.po -@@ -1762,7 +1762,10 @@ msgctxt "#420" - msgid "HDMI" - msgstr "" - --#empty string with id 421 -+#: system/settings/settings.xml -+msgctxt "#421" -+msgid "Stream silence when idle" -+msgstr "" - - msgctxt "#422" - msgid "Delete album info" -@@ -12120,8 +12123,13 @@ msgctxt "#34110" - msgid "7.1" - msgstr "" - --#empty strings from id 34111 to 34119 --#34111-34119 reserved for future use -+#: system/settings/settings.xml -+msgctxt "#34111" -+msgid "When activated silence is output in order to keep alive receiver, otherwise sink is drained in idle state" -+msgstr "" -+ -+#empty strings from id 34112 to 34119 -+#34112-34119 reserved for future use - - #: system/settings/settings.xml - msgctxt "#34120" -diff --git a/system/settings/settings.xml b/system/settings/settings.xml -index a468e97..f7d7f09 100644 ---- a/system/settings/settings.xml -+++ b/system/settings/settings.xml -@@ -2020,6 +2020,11 @@ - - - -+ -+ 2 -+ audiosupportsdrain -+ true -+ - - - -diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp -index d5517f3..5b1d2d6 100644 ---- a/xbmc/cores/AudioEngine/AEFactory.cpp -+++ b/xbmc/cores/AudioEngine/AEFactory.cpp -@@ -261,6 +261,14 @@ bool CAEFactory::SupportsRaw() - return false; - } - -+bool CAEFactory::SupportsDrain() -+{ -+ if(AE) -+ return AE->SupportsDrain(); -+ -+ return false; -+} -+ - void CAEFactory::SetMute(const bool enabled) - { - if(AE) -diff --git a/xbmc/cores/AudioEngine/AEFactory.h b/xbmc/cores/AudioEngine/AEFactory.h -index 3059001..e427519 100644 ---- a/xbmc/cores/AudioEngine/AEFactory.h -+++ b/xbmc/cores/AudioEngine/AEFactory.h -@@ -54,6 +54,7 @@ class CAEFactory - static void VerifyOutputDevice(std::string &device, bool passthrough); - static std::string GetDefaultDevice(bool passthrough); - static bool SupportsRaw(); -+ static bool SupportsDrain(); - static void SetMute(const bool enabled); - static bool IsMuted(); - static float GetVolume(); -diff --git a/xbmc/cores/AudioEngine/Interfaces/AE.h b/xbmc/cores/AudioEngine/Interfaces/AE.h -index 5741cd8..52c4efc 100644 ---- a/xbmc/cores/AudioEngine/Interfaces/AE.h -+++ b/xbmc/cores/AudioEngine/Interfaces/AE.h -@@ -185,6 +185,12 @@ class IAE - */ - virtual bool SupportsRaw() { return false; } - -+ /** -+ * Returns true if the AudioEngine supports drain mode which is not streaming silence when idle -+ * @returns true if the AudioEngine is capable of drain mode -+ */ -+ virtual bool SupportsDrain() { return false; } -+ - virtual void RegisterAudioCallback(IAudioCallback* pCallback) {} - - virtual void UnregisterAudioCallback() {} -diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp -index d8f6889..37174ac 100644 ---- a/xbmc/settings/Settings.cpp -+++ b/xbmc/settings/Settings.cpp -@@ -760,6 +760,9 @@ void CSettings::InitializeConditions() - if (g_application.IsStandAlone()) - m_settingsManager->AddCondition("isstandalone"); - -+ if (CAEFactory::SupportsDrain()) -+ m_settingsManager->AddCondition("audiosupportsdrain"); -+ - // add more complex conditions - m_settingsManager->AddCondition("addonhassettings", AddonHasSettings); - m_settingsManager->AddCondition("checkmasterlock", CheckMasterLock); -@@ -852,6 +855,7 @@ void CSettings::InitializeISettingCallbacks() - settingSet.insert("audiooutput.multichannellpcm"); - settingSet.insert("audiooutput.audiodevice"); - settingSet.insert("audiooutput.passthroughdevice"); -+ settingSet.insert("audiooutput.streamsilence"); - settingSet.insert("lookandfeel.skin"); - settingSet.insert("lookandfeel.skinsettings"); - settingSet.insert("lookandfeel.font"); --- -1.8.1.6 - - -From 24e126184ae12557d73b044357e8d41d96e2c76f Mon Sep 17 00:00:00 2001 -From: unknown -Date: Tue, 16 Jul 2013 17:06:51 +0200 -Subject: [PATCH 018/136] ActiveAE: adjust to gui setting streamsilence - ---- - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 13 ++++++++++++- - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h | 1 + - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp | 3 +-- - 3 files changed, 14 insertions(+), 3 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -index 2defd1d..935f994 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -@@ -384,6 +384,11 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) - switch (signal) - { - case CActiveAEControlProtocol::RECONFIGURE: -+ if (m_streams.empty()) -+ { -+ bool silence = false; -+ m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::SILENCEMODE, &silence, sizeof(bool)); -+ } - LoadSettings(); - if (!NeedReconfigureBuffers() && !NeedReconfigureSink()) - return; -@@ -1815,7 +1820,8 @@ void CActiveAE::OnSettingsChange(const std::string& setting) - setting == "audiooutput.dtshdpassthrough" || - setting == "audiooutput.channels" || - setting == "audiooutput.multichannellpcm" || -- setting == "audiooutput.stereoupmix") -+ setting == "audiooutput.stereoupmix" || -+ setting == "audiooutput.streamsilence") - { - m_controlPort.SendOutMessage(CActiveAEControlProtocol::RECONFIGURE); - } -@@ -1826,6 +1832,11 @@ bool CActiveAE::SupportsRaw() - return true; - } - -+bool CActiveAE::SupportsDrain() -+{ -+ return true; -+} -+ - void CActiveAE::Shutdown() - { - Dispose(); -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -index d5c5d97..9fc1b67 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -@@ -213,6 +213,7 @@ class CActiveAE : public IAE, private CThread - virtual void EnumerateOutputDevices(AEDeviceList &devices, bool passthrough); - virtual std::string GetDefaultDevice(bool passthrough); - virtual bool SupportsRaw(); -+ virtual bool SupportsDrain(); - - virtual void RegisterAudioCallback(IAudioCallback* pCallback); - virtual void UnregisterAudioCallback(); -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -index c22bb88..9af241d 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAESink.cpp -@@ -26,7 +26,6 @@ - #include "ActiveAE.h" - - #include "settings/Settings.h" --#include "settings/AdvancedSettings.h" - - using namespace ActiveAE; - -@@ -229,7 +228,7 @@ void CActiveAESink::StateMachine(int signal, Protocol *port, Message *msg) - { - case CSinkControlProtocol::SILENCEMODE: - m_extSilence = *(bool*)msg->data; -- if (g_advancedSettings.m_streamSilence) -+ if (CSettings::Get().GetBool("audiooutput.streamsilence")) - m_extSilence = true; - if (m_extSilence) - { --- -1.8.1.6 - - -From d186405dca4ab5c17f5cf5e30aca8ca0c4ac9b9a Mon Sep 17 00:00:00 2001 -From: wsoltys -Date: Tue, 16 Jul 2013 21:17:38 +0200 -Subject: [PATCH 019/136] [WIN32][WASAPI]: made wasapi sink accept default as - device string. set "wasapi:default" as default gui string (could be smarter - when handled via the xml system. possible?) - ---- - xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp | 61 +++++++++++++++++---------- - xbmc/settings/Settings.cpp | 3 ++ - 2 files changed, 41 insertions(+), 23 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -index 8a3d7ce..8995a0c 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -@@ -34,6 +34,7 @@ - #include "../Utils/AEDeviceInfo.h" - #include - #include -+#include "utils/StringUtils.h" - - #pragma comment(lib, "Avrt.lib") - -@@ -206,6 +207,7 @@ bool CAESinkWASAPI::Initialize(AEAudioFormat &format, std::string &device) - return false; - - m_device = device; -+ bool bdefault = false; - - /* Save requested format */ - /* Clear returned format */ -@@ -227,41 +229,47 @@ bool CAESinkWASAPI::Initialize(AEAudioFormat &format, std::string &device) - hr = pEnumDevices->GetCount(&uiCount); - EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of audio endpoint count failed.") - -- for (UINT i = 0; i < uiCount; i++) -+ if(StringUtils::EndsWith(device, std::string("default"))) -+ bdefault = true; -+ -+ if(!bdefault) - { -- IPropertyStore *pProperty = NULL; -- PROPVARIANT varName; -+ for (UINT i = 0; i < uiCount; i++) -+ { -+ IPropertyStore *pProperty = NULL; -+ PROPVARIANT varName; - -- hr = pEnumDevices->Item(i, &m_pDevice); -- EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of WASAPI endpoint failed.") -+ hr = pEnumDevices->Item(i, &m_pDevice); -+ EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of WASAPI endpoint failed.") - -- hr = m_pDevice->OpenPropertyStore(STGM_READ, &pProperty); -- EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of WASAPI endpoint properties failed.") -+ hr = m_pDevice->OpenPropertyStore(STGM_READ, &pProperty); -+ EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of WASAPI endpoint properties failed.") - -- hr = pProperty->GetValue(PKEY_AudioEndpoint_GUID, &varName); -- if (FAILED(hr)) -- { -- CLog::Log(LOGERROR, __FUNCTION__": Retrieval of WASAPI endpoint GUID failed."); -- SAFE_RELEASE(pProperty); -- goto failed; -- } -+ hr = pProperty->GetValue(PKEY_AudioEndpoint_GUID, &varName); -+ if (FAILED(hr)) -+ { -+ CLog::Log(LOGERROR, __FUNCTION__": Retrieval of WASAPI endpoint GUID failed."); -+ SAFE_RELEASE(pProperty); -+ goto failed; -+ } - -- std::string strDevName = localWideToUtf(varName.pwszVal); -+ std::string strDevName = localWideToUtf(varName.pwszVal); - -- if (device == strDevName) -- i = uiCount; -- else -- SAFE_RELEASE(m_pDevice); -+ if (device == strDevName) -+ i = uiCount; -+ else -+ SAFE_RELEASE(m_pDevice); - -- PropVariantClear(&varName); -- SAFE_RELEASE(pProperty); -+ PropVariantClear(&varName); -+ SAFE_RELEASE(pProperty); -+ } - } -- - SAFE_RELEASE(pEnumDevices); - - if (!m_pDevice) - { -- CLog::Log(LOGINFO, __FUNCTION__": Could not locate the device named \"%s\" in the list of WASAPI endpoint devices. Trying the default device...", device.c_str()); -+ if(!bdefault) -+ CLog::Log(LOGINFO, __FUNCTION__": Could not locate the device named \"%s\" in the list of WASAPI endpoint devices. Trying the default device...", device.c_str()); - hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_pDevice); - EXIT_ON_FAILURE(hr, __FUNCTION__": Could not retrieve the default WASAPI audio endpoint.") - -@@ -583,6 +591,13 @@ void CAESinkWASAPI::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bool fo - WAVEFORMATEXTENSIBLE wfxex = {0}; - HRESULT hr; - -+ // add default device entry -+ deviceInfo.m_deviceName = std::string("default"); -+ deviceInfo.m_displayName = std::string("default"); -+ -+ /* Store the device info */ -+ deviceInfoList.push_back(deviceInfo); -+ - hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void**)&pEnumerator); - EXIT_ON_FAILURE(hr, __FUNCTION__": Could not allocate WASAPI device enumerator. CoCreateInstance error code: %li", hr) - -diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp -index 37174ac..5df9d09 100644 ---- a/xbmc/settings/Settings.cpp -+++ b/xbmc/settings/Settings.cpp -@@ -642,6 +642,9 @@ void CSettings::InitializeDefaults() - ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(defaultAudioDeviceName); - ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(defaultAudioDeviceName); - #endif -+#elif defined(TARGET_WINDOWS) -+ ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(std::string("WASAPI:default")); -+ ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(std::string("WASAPI:default")); - #else - ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(CAEFactory::GetDefaultDevice(false)); - ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(CAEFactory::GetDefaultDevice(true)); --- -1.8.1.6 - - -From cbedd31759624e0b4f79b1d3d07fa525f1266cf0 Mon Sep 17 00:00:00 2001 -From: wsoltys -Date: Tue, 16 Jul 2013 21:41:50 +0200 -Subject: [PATCH 020/136] [WIN32] changed: use the new settings system instead - of hardcoded values. - ---- - system/settings/win32.xml | 28 ++++++++++++++++++++++++++++ - xbmc/settings/Settings.cpp | 5 +---- - 2 files changed, 29 insertions(+), 4 deletions(-) - -diff --git a/system/settings/win32.xml b/system/settings/win32.xml -index 76bc2bf..1e0a97b 100644 ---- a/system/settings/win32.xml -+++ b/system/settings/win32.xml -@@ -39,5 +39,33 @@ - - - -+ -+ -+ -+ 2 -+ WASAPI:default -+ -+ audiodevices -+ -+ -+ -+ -+ 2 -+ WASAPI:default -+ -+ audiodevicespassthrough -+ -+ -+ -+ -+ 1 -+ 2 -+ -+ -+ -+ -+ -+ -+ - - -diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp -index 5df9d09..436c34a 100644 ---- a/xbmc/settings/Settings.cpp -+++ b/xbmc/settings/Settings.cpp -@@ -642,10 +642,7 @@ void CSettings::InitializeDefaults() - ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(defaultAudioDeviceName); - ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(defaultAudioDeviceName); - #endif --#elif defined(TARGET_WINDOWS) -- ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(std::string("WASAPI:default")); -- ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(std::string("WASAPI:default")); --#else -+#elif !defined(TARGET_WINDOWS) - ((CSettingString*)m_settingsManager->GetSetting("audiooutput.audiodevice"))->SetDefault(CAEFactory::GetDefaultDevice(false)); - ((CSettingString*)m_settingsManager->GetSetting("audiooutput.passthroughdevice"))->SetDefault(CAEFactory::GetDefaultDevice(true)); - #endif --- -1.8.1.6 - - -From 5110d1fcdf43c9be249e6e4d8bd4c322191c86ef Mon Sep 17 00:00:00 2001 -From: unknown -Date: Thu, 18 Jul 2013 08:35:29 +0200 -Subject: [PATCH 021/136] AE: WASAPI, DirectSound - allow engine to provide - less samples than buffer size - ---- - xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp | 3 +- - xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp | 36 +++++++++++++++++++--- - xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h | 3 ++ - 3 files changed, 37 insertions(+), 5 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -index 797d7f2..81f2c4c 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -@@ -403,7 +403,8 @@ unsigned int CAESinkDirectSound::AddPackets(uint8_t *data, unsigned int frames, - DWORD size = 0, sizeWrap = 0; - if (m_BufferOffset >= m_dwBufferLen) // Wrap-around manually - m_BufferOffset = 0; -- HRESULT res = m_pBuffer->Lock(m_BufferOffset, m_dwChunkSize, &start, &size, &startWrap, &sizeWrap, 0); -+ DWORD dwWriteBytes = std::min((int)m_dwChunkSize, (int)len); -+ HRESULT res = m_pBuffer->Lock(m_BufferOffset, dwWriteBytes, &start, &size, &startWrap, &sizeWrap, 0); - if (DS_OK != res) - { - CLog::Log(LOGERROR, __FUNCTION__ ": Unable to lock buffer at offset %u. HRESULT: 0x%08x", m_BufferOffset, res); -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -index 8995a0c..78db727 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -@@ -191,7 +191,9 @@ CStdStringA localWideToUtf(LPCWSTR wstr) - m_isDirty(false), - m_uiBufferLen(0), - m_avgTimeWaiting(50), -- m_sinkLatency(0.0) -+ m_sinkLatency(0.0), -+ m_pBuffer(NULL), -+ m_bufferPtr(0) - { - m_channelLayout.Reset(); - } -@@ -315,6 +317,14 @@ bool CAESinkWASAPI::Initialize(AEAudioFormat &format, std::string &device) - m_initialized = true; - m_isDirty = false; - -+ // allow feeding less samples than buffer size -+ // if the device is opened exclusive and event driven, provided samples must match buffersize -+ // ActiveAE tries to align provided samples with buffer size but cannot guarantee (e.g. transcoding) -+ // this can be avoided by dropping the event mode which has not much benefit; SoftAE polls anyway -+ delete [] m_pBuffer; -+ m_pBuffer = new uint8_t[format.m_frames * format.m_frameSize]; -+ m_bufferPtr = 0; -+ - return true; - - failed: -@@ -359,6 +369,9 @@ void CAESinkWASAPI::Deinitialize() - SAFE_RELEASE(m_pDevice); - - m_initialized = false; -+ -+ delete [] m_pBuffer; -+ m_bufferPtr = 0; - } - - bool CAESinkWASAPI::IsCompatible(const AEAudioFormat format, const std::string &device) -@@ -446,7 +459,15 @@ unsigned int CAESinkWASAPI::AddPackets(uint8_t *data, unsigned int frames, bool - LARGE_INTEGER timerFreq; - #endif - -- unsigned int NumFramesRequested = frames; -+ unsigned int NumFramesRequested = m_format.m_frames; -+ unsigned int FramesToCopy = std::min(m_format.m_frames - m_bufferPtr, frames); -+ if (m_bufferPtr != 0 || frames != m_format.m_frames) -+ { -+ memcpy(m_pBuffer+m_bufferPtr*m_format.m_frameSize, data, FramesToCopy*m_format.m_frameSize); -+ m_bufferPtr += FramesToCopy; -+ if (frames != m_format.m_frames) -+ return frames; -+ } - - if (!m_running) //first time called, pre-fill buffer then start audio client - { -@@ -547,7 +568,8 @@ unsigned int CAESinkWASAPI::AddPackets(uint8_t *data, unsigned int frames, bool - #endif - return INT_MAX; - } -- memcpy(buf, data, NumFramesRequested * m_format.m_frameSize); //fill buffer -+ memcpy(buf, m_bufferPtr == 0 ? data : m_pBuffer, NumFramesRequested * m_format.m_frameSize); //fill buffer -+ m_bufferPtr = 0; - hr = m_pRenderClient->ReleaseBuffer(NumFramesRequested, flags); //pass back to audio driver - if (FAILED(hr)) - { -@@ -557,7 +579,13 @@ unsigned int CAESinkWASAPI::AddPackets(uint8_t *data, unsigned int frames, bool - return INT_MAX; - } - -- return NumFramesRequested; -+ if (FramesToCopy != frames) -+ { -+ m_bufferPtr = frames-FramesToCopy; -+ memcpy(m_pBuffer, data+FramesToCopy*m_format.m_frameSize, m_bufferPtr*m_format.m_frameSize); -+ } -+ -+ return frames; - } - - bool CAESinkWASAPI::SoftSuspend() -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h -index c4a5a51..37cfd68 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h -@@ -78,4 +78,7 @@ class CAESinkWASAPI : public IAESink - unsigned int m_uiBufferLen; /* wasapi endpoint buffer size, in frames */ - double m_avgTimeWaiting; /* time between next buffer of data from SoftAE and driver call for data */ - double m_sinkLatency; /* time in seconds of total duration of the two WASAPI buffers */ -+ -+ uint8_t *m_pBuffer; -+ int m_bufferPtr; - }; --- -1.8.1.6 - - -From 2c7cac05924a2de5dd338e4751c6981a0172190b Mon Sep 17 00:00:00 2001 -From: unknown -Date: Fri, 19 Jul 2013 15:08:33 +0200 -Subject: [PATCH 022/136] AE: DirectSound - implement drain method - ---- - xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp | 25 ++++++++++++++++------ - xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h | 1 + - 2 files changed, 20 insertions(+), 6 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -index 81f2c4c..5c5e015 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -@@ -442,6 +442,23 @@ void CAESinkDirectSound::Stop() - m_pBuffer->Stop(); - } - -+void CAESinkDirectSound::Drain() -+{ -+ if (!m_initialized || m_isDirtyDS) -+ return; -+ -+ m_pBuffer->Stop(); -+ HRESULT res = m_pBuffer->SetCurrentPosition(0); -+ if (DS_OK != res) -+ { -+ CLog::Log(LOGERROR,__FUNCTION__ ": SetCurrentPosition failed. Unable to determine buffer status. HRESULT = 0x%08x", res); -+ m_isDirtyDS = true; -+ return; -+ } -+ m_BufferOffset = 0; -+ UpdateCacheStatus(); -+} -+ - double CAESinkDirectSound::GetDelay() - { - if (!m_initialized) -@@ -683,10 +700,6 @@ void CAESinkDirectSound::CheckPlayStatus() - bool CAESinkDirectSound::UpdateCacheStatus() - { - CSingleLock lock (m_runLock); -- // TODO: Check to see if we may have cycled around since last time -- unsigned int time = XbmcThreads::SystemClockMillis(); -- if (time == m_LastCacheCheck) -- return true; // Don't recalc more frequently than once/ms (that is our max resolution anyway) - - DWORD playCursor = 0, writeCursor = 0; - HRESULT res = m_pBuffer->GetCurrentPosition(&playCursor, &writeCursor); // Get the current playback and safe write positions -@@ -697,7 +710,6 @@ bool CAESinkDirectSound::UpdateCacheStatus() - return false; - } - -- m_LastCacheCheck = time; - // Check the state of the ring buffer (P->O->W == underrun) - // These are the logical situations that can occur - // O: CurrentOffset W: WriteCursor P: PlayCursor -@@ -729,7 +741,8 @@ bool CAESinkDirectSound::UpdateCacheStatus() - return false; - } - } -- else m_BufferTimeouts = 0; -+ else -+ m_BufferTimeouts = 0; - - // Calculate available space in the ring buffer - if (playCursor == m_BufferOffset && m_BufferOffset == writeCursor) // Playback is stopped and we are all at the same place -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h -index 8ff098d..a6f2912 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h -@@ -39,6 +39,7 @@ class CAESinkDirectSound : public IAESink - virtual bool IsCompatible(const AEAudioFormat format, const std::string &device); - - virtual void Stop (); -+ virtual void Drain (); - virtual double GetDelay (); - virtual double GetCacheTime (); - virtual double GetCacheTotal (); --- -1.8.1.6 - - -From 2670e1379f99dc5952bbe073eb9379640747a49d Mon Sep 17 00:00:00 2001 -From: wsoltys -Date: Thu, 18 Jul 2013 18:13:02 +0200 -Subject: [PATCH 023/136] [WIN32][WASAPI] created a drain method. - ---- - xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp | 27 ++++++++++++++++++++++++++- - xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h | 2 ++ - 2 files changed, 28 insertions(+), 1 deletion(-) - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -index 78db727..8c8bc1f 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -@@ -193,7 +193,8 @@ CStdStringA localWideToUtf(LPCWSTR wstr) - m_avgTimeWaiting(50), - m_sinkLatency(0.0), - m_pBuffer(NULL), -- m_bufferPtr(0) -+ m_bufferPtr(0), -+ m_hnsRequestedDuration(0) - { - m_channelLayout.Reset(); - } -@@ -1161,6 +1162,8 @@ bool CAESinkWASAPI::InitializeExclusive(AEAudioFormat &format) - hr = m_pAudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST, - audioSinkBufferDurationMsec, audioSinkBufferDurationMsec, &wfxex.Format, NULL); - -+ m_hnsRequestedDuration = audioSinkBufferDurationMsec; -+ - if (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) - { - /* WASAPI requires aligned buffer */ -@@ -1290,3 +1293,25 @@ const char *CAESinkWASAPI::WASAPIErrToStr(HRESULT err) - } - return NULL; - } -+ -+void CAESinkWASAPI::Drain() -+{ -+ if(!m_pAudioClient) -+ return; -+ -+ Sleep( (DWORD)(m_hnsRequestedDuration / 10000)); -+ -+ if (m_running) -+ { -+ try -+ { -+ m_pAudioClient->Stop(); //stop the audio output -+ m_pAudioClient->Reset(); //flush buffer and reset audio clock stream position -+ } -+ catch (...) -+ { -+ CLog::Log(LOGDEBUG, __FUNCTION__, "Invalidated AudioClient - Releasing"); -+ } -+ } -+ m_running = false; -+} -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h -index 37cfd68..39d62d5 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h -@@ -45,6 +45,7 @@ class CAESinkWASAPI : public IAESink - virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio, bool blocking = false); - virtual bool SoftSuspend (); - virtual bool SoftResume (); -+ virtual void Drain (); - static void EnumerateDevicesEx (AEDeviceInfoList &deviceInfoList, bool force = false); - private: - bool InitializeExclusive(AEAudioFormat &format); -@@ -81,4 +82,5 @@ class CAESinkWASAPI : public IAESink - - uint8_t *m_pBuffer; - int m_bufferPtr; -+ REFERENCE_TIME m_hnsRequestedDuration; - }; --- -1.8.1.6 - - -From 191da169f9bb67d2ecd77a6655115772b53b357b Mon Sep 17 00:00:00 2001 -From: wsoltys -Date: Thu, 18 Jul 2013 20:35:08 +0200 -Subject: [PATCH 024/136] [WIN32][DirectSound] added fake entry default and - make sink understand it. - ---- - xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp | 50 ++++++++++++++-------- - 1 file changed, 31 insertions(+), 19 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -index 5c5e015..da98e1f 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp -@@ -35,6 +35,7 @@ - #include - #include - #include "cores/AudioEngine/Utils/AEUtil.h" -+#include "utils/StringUtils.h" - #pragma comment(lib, "Rpcrt4.lib") - - extern HWND g_hWnd; -@@ -143,10 +144,14 @@ bool CAESinkDirectSound::Initialize(AEAudioFormat &format, std::string &device) - LPGUID deviceGUID = NULL; - RPC_CSTR wszUuid = NULL; - HRESULT hr = E_FAIL; -+ std::string strDeviceGUID = device; - std::list DSDeviceList; - std::string deviceFriendlyName; - DirectSoundEnumerate(DSEnumCallback, &DSDeviceList); - -+ if(StringUtils::EndsWith(device, std::string("default"))) -+ strDeviceGUID = GetDefaultDevice(); -+ - for (std::list::iterator itt = DSDeviceList.begin(); itt != DSDeviceList.end(); ++itt) - { - if ((*itt).lpGuid) -@@ -154,23 +159,27 @@ bool CAESinkDirectSound::Initialize(AEAudioFormat &format, std::string &device) - hr = (UuidToString((*itt).lpGuid, &wszUuid)); - std::string sztmp = (char*)wszUuid; - std::string szGUID = "{" + std::string(sztmp.begin(), sztmp.end()) + "}"; -- if (strcasecmp(szGUID.c_str(), device.c_str()) == 0) -+ if (strcasecmp(szGUID.c_str(), strDeviceGUID.c_str()) == 0) - { - deviceGUID = (*itt).lpGuid; - deviceFriendlyName = (*itt).name.c_str(); - break; - } - } -- if (hr == RPC_S_OK) RpcStringFree(&wszUuid); -+ if (hr == RPC_S_OK) RpcStringFree(&wszUuid); - } - - hr = DirectSoundCreate(deviceGUID, &m_pDSound, NULL); - - if (FAILED(hr)) - { -- CLog::Log(LOGERROR, __FUNCTION__": Failed to create the DirectSound device."); -- CLog::Log(LOGERROR, __FUNCTION__": DSErr: %s", dserr2str(hr)); -- return false; -+ CLog::Log(LOGERROR, __FUNCTION__": Failed to create the DirectSound device %s with error %s, trying the default device.", deviceFriendlyName.c_str(), dserr2str(hr)); -+ hr = DirectSoundCreate(NULL, &m_pDSound, NULL); -+ if (FAILED(hr)) -+ { -+ CLog::Log(LOGERROR, __FUNCTION__": Failed to create the default DirectSound device with error %s.", dserr2str(hr)); -+ return false; -+ } - } - - HWND tmp_hWnd; -@@ -501,6 +510,8 @@ void CAESinkDirectSound::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bo - - HRESULT hr; - -+ std::string strDD = GetDefaultDevice(); -+ - /* See if we are on Windows XP */ - if (!g_sysinfo.IsWindowsVersionAtLeast(CSysInfo::WindowsVersionVista)) - { -@@ -535,6 +546,15 @@ void CAESinkDirectSound::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bo - deviceInfo.m_sampleRates.push_back((DWORD) 96000); - - deviceInfoList.push_back(deviceInfo); -+ -+ // add the default device with m_deviceName = default -+ if(strDD == deviceInfo.m_deviceName) -+ { -+ deviceInfo.m_deviceName = std::string("default"); -+ deviceInfo.m_displayName = std::string("default"); -+ deviceInfo.m_displayNameExtra = std::string(""); -+ deviceInfoList.push_back(deviceInfo); -+ } - } - - RpcStringFree(&cszGUID); -@@ -650,22 +670,14 @@ void CAESinkDirectSound::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bo - deviceInfo.m_deviceType = aeDeviceType; - - deviceInfoList.push_back(deviceInfo); -- } - -- // since AE takes the first device in deviceInfoList as default audio device we need -- // to sort it in order to use the real default device -- if(deviceInfoList.size() > 1) -- { -- std::string strDD = GetDefaultDevice(); -- for (AEDeviceInfoList::iterator itt = deviceInfoList.begin(); itt != deviceInfoList.end(); ++itt) -+ // add the default device with m_deviceName = default -+ if(strDD == strDevName) - { -- CAEDeviceInfo devInfo = *itt; -- if(devInfo.m_deviceName == strDD) -- { -- deviceInfoList.erase(itt); -- deviceInfoList.insert(deviceInfoList.begin(), devInfo); -- break; -- } -+ deviceInfo.m_deviceName = std::string("default"); -+ deviceInfo.m_displayName = std::string("default"); -+ deviceInfo.m_displayNameExtra = std::string(""); -+ deviceInfoList.push_back(deviceInfo); - } - } - --- -1.8.1.6 - - -From ff5caa443be03aefb654f7adb81aadb1a43b9ec4 Mon Sep 17 00:00:00 2001 -From: wsoltys -Date: Tue, 23 Jul 2013 19:03:43 +0200 -Subject: [PATCH 025/136] [WIN32][WASAPI] cosmetics: fill the default device - with proper values. - ---- - xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp | 40 ++++++++++++++++++++------- - 1 file changed, 30 insertions(+), 10 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -index 8c8bc1f..38065cd 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp -@@ -614,24 +614,32 @@ void CAESinkWASAPI::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bool fo - { - IMMDeviceEnumerator* pEnumerator = NULL; - IMMDeviceCollection* pEnumDevices = NULL; -+ IMMDevice* pDefaultDevice = NULL; - CAEDeviceInfo deviceInfo; - CAEChannelInfo deviceChannels; -+ LPWSTR pwszID = NULL; -+ std::wstring wstrDDID; - - WAVEFORMATEXTENSIBLE wfxex = {0}; - HRESULT hr; - -- // add default device entry -- deviceInfo.m_deviceName = std::string("default"); -- deviceInfo.m_displayName = std::string("default"); -- -- /* Store the device info */ -- deviceInfoList.push_back(deviceInfo); -- - hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void**)&pEnumerator); - EXIT_ON_FAILURE(hr, __FUNCTION__": Could not allocate WASAPI device enumerator. CoCreateInstance error code: %li", hr) - - UINT uiCount = 0; - -+ // get the default audio endpoint -+ if(pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDefaultDevice) == S_OK) -+ { -+ if(pDefaultDevice->GetId(&pwszID) == S_OK) -+ { -+ wstrDDID = pwszID; -+ CoTaskMemFree(pwszID); -+ } -+ SAFE_RELEASE(pDefaultDevice); -+ } -+ -+ // enumerate over all audio endpoints - hr = pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pEnumDevices); - EXIT_ON_FAILURE(hr, __FUNCTION__": Retrieval of audio endpoint enumeration failed.") - -@@ -903,9 +911,6 @@ void CAESinkWASAPI::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bool fo - CLog::Log(LOGDEBUG, __FUNCTION__": Failed to activate device for passthrough capability testing."); - } - -- SAFE_RELEASE(pDevice); -- SAFE_RELEASE(pProperty); -- - deviceInfo.m_deviceName = strDevName; - deviceInfo.m_displayName = strWinDevType.append(strFriendlyName); - deviceInfo.m_displayNameExtra = std::string("WASAPI: ").append(strFriendlyName); -@@ -914,6 +919,21 @@ void CAESinkWASAPI::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bool fo - - /* Store the device info */ - deviceInfoList.push_back(deviceInfo); -+ -+ if(pDevice->GetId(&pwszID) == S_OK) -+ { -+ if(wstrDDID.compare(pwszID) == 0) -+ { -+ deviceInfo.m_deviceName = std::string("default"); -+ deviceInfo.m_displayName = std::string("default"); -+ deviceInfo.m_displayNameExtra = std::string(""); -+ deviceInfoList.push_back(deviceInfo); -+ } -+ CoTaskMemFree(pwszID); -+ } -+ -+ SAFE_RELEASE(pDevice); -+ SAFE_RELEASE(pProperty); - } - return; - --- -1.8.1.6 - - -From 46ccc94ce275c574a6eb5bc5f301b79b14fd8e14 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Sat, 27 Jul 2013 08:44:13 +0200 -Subject: [PATCH 026/136] AE: add quality setting for engine which support it - ---- - language/English/strings.po | 35 +++++++++++++++++++++++++++++++--- - system/settings/settings.xml | 13 +++++++++++++ - xbmc/cores/AudioEngine/AEFactory.cpp | 8 ++++++++ - xbmc/cores/AudioEngine/AEFactory.h | 1 + - xbmc/cores/AudioEngine/Interfaces/AE.h | 6 ++++++ - xbmc/settings/Settings.cpp | 4 ++++ - 6 files changed, 64 insertions(+), 3 deletions(-) - -diff --git a/language/English/strings.po b/language/English/strings.po -index c2c562f..40fbb74 100644 ---- a/language/English/strings.po -+++ b/language/English/strings.po -@@ -12154,8 +12154,32 @@ msgctxt "#34123" - msgid "Never" - msgstr "" - --#empty strings from id 34124 to 34200 --#34124-34200 reserved for future use -+#. Resampling quality -+#: system/settings/settings.xml -+msgctxt "#34124" -+msgid "Resampling Quality" -+msgstr "" -+ -+#. Resampling quality -+#: system/settings/settings.xml -+msgctxt "#34125" -+msgid "Low" -+msgstr "" -+ -+#. Resampling quality -+#: system/settings/settings.xml -+msgctxt "#34126" -+msgid "Normal" -+msgstr "" -+ -+#. Resampling quality -+#: system/settings/settings.xml -+msgctxt "#34127" -+msgid "High" -+msgstr "" -+ -+#empty strings from id 34128 to 34200 -+#34128-34200 reserved for future use - - #: xbmc\PlayListPlayer.cpp - msgctxt "#34201" -@@ -14140,7 +14164,12 @@ msgctxt "#36420" - msgid "No info available yet." - msgstr "" - --#empty strings from id 36421 to 36999 -+#: system/settings/settings.xml -+msgctxt "#36421" -+msgid "Resampling Quality, higher quality puts higher load on CPU" -+msgstr "" -+ -+#empty strings from id 36422 to 36999 - #end reservation - - #: xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp -diff --git a/system/settings/settings.xml b/system/settings/settings.xml -index f7d7f09..461e787 100644 ---- a/system/settings/settings.xml -+++ b/system/settings/settings.xml -@@ -1950,6 +1950,19 @@ - - - -+ -+ 2 -+ audiosupportsquality -+ 1 -+ -+ -+ -+ -+ -+ -+ -+ -+ - - 2 - true -diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp -index 5b1d2d6..250056e 100644 ---- a/xbmc/cores/AudioEngine/AEFactory.cpp -+++ b/xbmc/cores/AudioEngine/AEFactory.cpp -@@ -269,6 +269,14 @@ bool CAEFactory::SupportsDrain() - return false; - } - -+bool CAEFactory::SupportsQuality() -+{ -+ if(AE) -+ return AE->SupportsQuality(); -+ -+ return false; -+} -+ - void CAEFactory::SetMute(const bool enabled) - { - if(AE) -diff --git a/xbmc/cores/AudioEngine/AEFactory.h b/xbmc/cores/AudioEngine/AEFactory.h -index e427519..26efe9f 100644 ---- a/xbmc/cores/AudioEngine/AEFactory.h -+++ b/xbmc/cores/AudioEngine/AEFactory.h -@@ -55,6 +55,7 @@ class CAEFactory - static std::string GetDefaultDevice(bool passthrough); - static bool SupportsRaw(); - static bool SupportsDrain(); -+ static bool SupportsQuality(); - static void SetMute(const bool enabled); - static bool IsMuted(); - static float GetVolume(); -diff --git a/xbmc/cores/AudioEngine/Interfaces/AE.h b/xbmc/cores/AudioEngine/Interfaces/AE.h -index 52c4efc..69cfc5e 100644 ---- a/xbmc/cores/AudioEngine/Interfaces/AE.h -+++ b/xbmc/cores/AudioEngine/Interfaces/AE.h -@@ -191,6 +191,12 @@ class IAE - */ - virtual bool SupportsDrain() { return false; } - -+ /** -+ * Returns true if the AudioEngine supports setting resample quality -+ * @returns true if the AudioEngine is capable of changing resample quality -+ */ -+ virtual bool SupportsQuality() { return false; } -+ - virtual void RegisterAudioCallback(IAudioCallback* pCallback) {} - - virtual void UnregisterAudioCallback() {} -diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp -index 436c34a..3f7dfaf 100644 ---- a/xbmc/settings/Settings.cpp -+++ b/xbmc/settings/Settings.cpp -@@ -763,6 +763,9 @@ void CSettings::InitializeConditions() - if (CAEFactory::SupportsDrain()) - m_settingsManager->AddCondition("audiosupportsdrain"); - -+ if (CAEFactory::SupportsQuality()) -+ m_settingsManager->AddCondition("audiosupportsquality"); -+ - // add more complex conditions - m_settingsManager->AddCondition("addonhassettings", AddonHasSettings); - m_settingsManager->AddCondition("checkmasterlock", CheckMasterLock); -@@ -856,6 +859,7 @@ void CSettings::InitializeISettingCallbacks() - settingSet.insert("audiooutput.audiodevice"); - settingSet.insert("audiooutput.passthroughdevice"); - settingSet.insert("audiooutput.streamsilence"); -+ settingSet.insert("audiooutput.resamplequality"); - settingSet.insert("lookandfeel.skin"); - settingSet.insert("lookandfeel.skinsettings"); - settingSet.insert("lookandfeel.font"); --- -1.8.1.6 - - -From 4803c2f384aab14d1548015e989e496f1b1e84c2 Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Thu, 25 Jul 2013 19:40:27 +0200 -Subject: [PATCH 027/136] ActiveAE: Prepare LOW, NORMAL, HIGH quality settings - for resampler - ---- - .../AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp | 18 +++++++++++++++++- - .../AudioEngine/Engines/ActiveAE/ActiveAEResample.h | 7 ++++++- - 2 files changed, 23 insertions(+), 2 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp -index aee3bfc..3412338 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.cpp -@@ -36,7 +36,7 @@ - m_dllSwResample.Unload(); - } - --bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout) -+bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout, int quality) - { - if (!m_dllAvUtil.Load() || !m_dllSwResample.Load()) - return false; -@@ -58,6 +58,22 @@ bool CActiveAEResample::Init(uint64_t dst_chan_layout, int dst_channels, int dst - m_pContext = m_dllSwResample.swr_alloc_set_opts(NULL, m_dst_chan_layout, m_dst_fmt, m_dst_rate, - m_src_chan_layout, m_src_fmt, m_src_rate, - 0, NULL); -+ if(quality == AE_SWR_HIGH_QUALITY) -+ { -+ m_dllAvUtil.av_opt_set_double(m_pContext, "cutoff", 1.0, 0); -+ m_dllAvUtil.av_opt_set_int(m_pContext,"filter_size", 256, 0); -+ } -+ else if(quality == AE_SWR_NORMAL_QUALITY) -+ { -+ // 0.97 is default cutoff so use (1.0 - 0.97) / 2.0 + 0.97 -+ m_dllAvUtil.av_opt_set_double(m_pContext, "cutoff", 0.985, 0); -+ m_dllAvUtil.av_opt_set_int(m_pContext,"filter_size", 64, 0); -+ } -+ else if(quality == AE_SWR_LOW_QUALITY) -+ { -+ m_dllAvUtil.av_opt_set_double(m_pContext, "cutoff", 0.97, 0); -+ m_dllAvUtil.av_opt_set_int(m_pContext,"filter_size", 32, 0); -+ } - - if(!m_pContext) - { -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h -index fa95a1d..baa4ef3 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h -@@ -25,6 +25,11 @@ - #include "AEAudioFormat.h" - #include "ActiveAEBuffer.h" - -+// This is for the Audiophiles -+#define AE_SWR_LOW_QUALITY 0 -+#define AE_SWR_NORMAL_QUALITY 1 -+#define AE_SWR_HIGH_QUALITY 2 -+ - namespace ActiveAE - { - -@@ -33,7 +38,7 @@ class CActiveAEResample - public: - CActiveAEResample(); - virtual ~CActiveAEResample(); -- bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout = NULL); -+ bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout = NULL, int quality = AE_SWR_NORMAL_QUALITY); - int Resample(uint8_t **dst_buffer, int dst_samples, uint8_t **src_buffer, int src_samples); - int64_t GetDelay(int64_t base); - int GetBufferedSamples(); --- -1.8.1.6 - - -From f8639455cc640b92a08b8dd2f1927b4ed2eac743 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Fri, 26 Jul 2013 19:43:24 +0200 -Subject: [PATCH 028/136] ActiveAE: prepare for changing resample quality by - setting - ---- - .../AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 38 ++++++++++++++++++---- - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h | 3 ++ - .../Engines/ActiveAE/ActiveAEBuffer.cpp | 38 +++++++++------------- - .../AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h | 7 ++-- - .../Engines/ActiveAE/ActiveAEResample.h | 2 +- - 5 files changed, 55 insertions(+), 33 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -index 935f994..2388f78 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -@@ -390,6 +390,7 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) - m_sink.m_controlPort.SendOutMessage(CSinkControlProtocol::SILENCEMODE, &silence, sizeof(bool)); - } - LoadSettings(); -+ ChangeResampleQuality(); - if (!NeedReconfigureBuffers() && !NeedReconfigureSink()) - return; - m_state = AE_TOP_RECONFIGURING; -@@ -440,8 +441,11 @@ void CActiveAE::StateMachine(int signal, Protocol *port, Message *msg) - par = (MsgStreamParameter*)msg->data; - if (par->stream->m_resampleBuffers) - { -- par->stream->m_resampleBuffers->m_resampleRatio = par->parameter.double_par; -- par->stream->m_resampleBuffers->m_changeRatio = true; -+ if ((unsigned int)(par->stream->m_resampleBuffers->m_format.m_sampleRate * par->parameter.double_par) != par->stream->m_resampleBuffers->m_outSampleRate) -+ { -+ par->stream->m_resampleBuffers->m_resampleRatio = par->parameter.double_par; -+ par->stream->m_resampleBuffers->m_changeResampler = true; -+ } - } - return; - case CActiveAEControlProtocol::STREAMFADE: -@@ -956,7 +960,7 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) - } - if (!(*it)->m_resampleBuffers) - { -- (*it)->m_resampleBuffers = new CActiveAEBufferPoolResample((*it)->m_inputBuffers->m_format, outputFormat); -+ (*it)->m_resampleBuffers = new CActiveAEBufferPoolResample((*it)->m_inputBuffers->m_format, outputFormat, m_settings.resampleQuality); - (*it)->m_resampleBuffers->Create(MAX_CACHE_LEVEL*1000, false); - } - if (m_mode == MODE_TRANSCODE || m_streams.size() > 1) -@@ -976,7 +980,7 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) - AEAudioFormat vizFormat = m_internalFormat; - vizFormat.m_channelLayout = AE_CH_LAYOUT_2_0; - vizFormat.m_dataFormat = AE_FMT_FLOAT; -- m_vizBuffers = new CActiveAEBufferPoolResample(m_internalFormat, vizFormat); -+ m_vizBuffers = new CActiveAEBufferPoolResample(m_internalFormat, vizFormat, m_settings.resampleQuality); - // TODO use cache of sync + water level - m_vizBuffers->Create(2000, false); - } -@@ -991,7 +995,7 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) - } - if (!m_sinkBuffers) - { -- m_sinkBuffers = new CActiveAEBufferPoolResample(sinkInputFormat, m_sinkFormat); -+ m_sinkBuffers = new CActiveAEBufferPoolResample(sinkInputFormat, m_sinkFormat, m_settings.resampleQuality); - m_sinkBuffers->Create(MAX_WATER_LEVEL*1000, true); - } - -@@ -1137,6 +1141,17 @@ float CActiveAE::CalcStreamAmplification(CActiveAEStream *stream, CSampleBuffer - return amp; - } - -+void CActiveAE::ChangeResampleQuality() -+{ -+ std::list::iterator it; -+ for(it=m_streams.begin(); it!=m_streams.end(); ++it) -+ { -+ if ((*it)->m_resampleBuffers && (*it)->m_resampleBuffers->m_resampler && ((*it)->m_resampleBuffers->m_resampleQuality != m_settings.resampleQuality)) -+ (*it)->m_resampleBuffers->m_changeResampler = true; -+ (*it)->m_resampleBuffers->m_resampleQuality = m_settings.resampleQuality; -+ } -+} -+ - void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &settings, bool setmode) - { - // raw pass through -@@ -1756,6 +1771,8 @@ void CActiveAE::LoadSettings() - m_settings.dtshdpassthrough = CSettings::Get().GetBool("audiooutput.dtshdpassthrough"); - m_settings.aacpassthrough = CSettings::Get().GetBool("audiooutput.passthroughaac"); - m_settings.multichannellpcm = CSettings::Get().GetBool("audiooutput.multichannellpcm"); -+ -+ m_settings.resampleQuality = CSettings::Get().GetInt("audiooutput.resamplequality"); - } - - bool CActiveAE::Initialize() -@@ -1821,7 +1838,8 @@ void CActiveAE::OnSettingsChange(const std::string& setting) - setting == "audiooutput.channels" || - setting == "audiooutput.multichannellpcm" || - setting == "audiooutput.stereoupmix" || -- setting == "audiooutput.streamsilence") -+ setting == "audiooutput.streamsilence" || -+ setting == "audiooutput.resamplequality") - { - m_controlPort.SendOutMessage(CActiveAEControlProtocol::RECONFIGURE); - } -@@ -1837,6 +1855,11 @@ bool CActiveAE::SupportsDrain() - return true; - } - -+bool CActiveAE::SupportsQuality() -+{ -+ return true; -+} -+ - void CActiveAE::Shutdown() - { - Dispose(); -@@ -2124,7 +2147,8 @@ bool CActiveAE::ResampleSound(CActiveAESound *sound) - orig_config.channels, - orig_config.sample_rate, - orig_config.fmt, -- NULL); -+ NULL, -+ AE_SWR_NORMAL_QUALITY); - - dst_samples = resampler->CalcDstSampleCount(sound->GetSound(true)->nb_samples, - m_internalFormat.m_sampleRate, -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -index 9fc1b67..8bbd175 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.h -@@ -57,6 +57,7 @@ struct AudioSettings - bool dtshdpassthrough; - bool multichannellpcm; - bool stereoupmix; -+ int resampleQuality; - }; - - class CActiveAEControlProtocol : public Protocol -@@ -214,6 +215,7 @@ class CActiveAE : public IAE, private CThread - virtual std::string GetDefaultDevice(bool passthrough); - virtual bool SupportsRaw(); - virtual bool SupportsDrain(); -+ virtual bool SupportsQuality(); - - virtual void RegisterAudioCallback(IAudioCallback* pCallback); - virtual void UnregisterAudioCallback(); -@@ -257,6 +259,7 @@ class CActiveAE : public IAE, private CThread - void SStopSound(CActiveAESound *sound); - void DiscardSound(CActiveAESound *sound); - float CalcStreamAmplification(CActiveAEStream *stream, CSampleBuffer *buf); -+ void ChangeResampleQuality(); - - bool RunStages(); - bool HasWork(); -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp -index d3ba213..6a2478f 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp -@@ -129,7 +129,7 @@ bool CActiveAEBufferPool::Create(unsigned int totaltime) - - //----------------------------------------------------------------------------- - --CActiveAEBufferPoolResample::CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat) -+CActiveAEBufferPoolResample::CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat, int quality) - : CActiveAEBufferPool(outputFormat) - { - m_inputFormat = inputFormat; -@@ -141,7 +141,8 @@ bool CActiveAEBufferPool::Create(unsigned int totaltime) - m_empty = true; - m_procSample = NULL; - m_resampleRatio = 1.0; -- m_changeRatio = false; -+ m_resampleQuality = quality; -+ m_changeResampler = false; - } - - CActiveAEBufferPoolResample::~CActiveAEBufferPoolResample() -@@ -166,7 +167,8 @@ bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap) - m_inputFormat.m_channelLayout.Count(), - m_inputFormat.m_sampleRate, - CActiveAEResample::GetAVSampleFormat(m_inputFormat.m_dataFormat), -- remap ? &m_format.m_channelLayout : NULL); -+ remap ? &m_format.m_channelLayout : NULL, -+ m_resampleQuality); - } - - // store output sampling rate, needed when ratio gets changed -@@ -175,11 +177,8 @@ bool CActiveAEBufferPoolResample::Create(unsigned int totaltime, bool remap) - return true; - } - --void CActiveAEBufferPoolResample::ChangeRatio() -+void CActiveAEBufferPoolResample::ChangeResampler() - { --// CLog::Log(LOGNOTICE,"---------- sample rate changed from: %d, to: %d", --// m_outSampleRate, (int)(m_format.m_sampleRate * m_resampleRatio)); -- - m_outSampleRate = m_format.m_sampleRate * m_resampleRatio; - - delete m_resampler; -@@ -193,9 +192,10 @@ void CActiveAEBufferPoolResample::ChangeRatio() - m_inputFormat.m_channelLayout.Count(), - m_inputFormat.m_sampleRate, - CActiveAEResample::GetAVSampleFormat(m_inputFormat.m_dataFormat), -- NULL); -+ NULL, -+ m_resampleQuality); - -- m_changeRatio = false; -+ m_changeResampler = false; - } - - bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) -@@ -203,17 +203,11 @@ bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) - bool busy = false; - CSampleBuffer *in; - -- if (m_changeRatio) -- { -- if ((unsigned int)(m_format.m_sampleRate * m_resampleRatio) == m_outSampleRate) -- m_changeRatio = false; -- } -- - if (!m_resampler) - { -- if (m_changeRatio) -+ if (m_changeResampler) - { -- ChangeRatio(); -+ ChangeResampler(); - return true; - } - while(!m_inputSamples.empty()) -@@ -241,14 +235,14 @@ bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) - - bool hasInput = !m_inputSamples.empty(); - -- if (hasInput || skipInput || m_drain || m_changeRatio) -+ if (hasInput || skipInput || m_drain || m_changeResampler) - { - if (!m_procSample) - { - m_procSample = GetFreeBuffer(); - } - -- if (hasInput && !skipInput && !m_changeRatio) -+ if (hasInput && !skipInput && !m_changeResampler) - { - in = m_inputSamples.front(); - m_inputSamples.pop_front(); -@@ -274,7 +268,7 @@ bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) - busy = true; - m_empty = (out_samples == 0); - -- if ((m_drain || m_changeRatio) && m_empty) -+ if ((m_drain || m_changeResampler) && m_empty) - { - if (m_fillPackets && m_procSample->pkt->nb_samples != 0) - { -@@ -300,8 +294,8 @@ bool CActiveAEBufferPoolResample::ResampleBuffers(unsigned int timestamp) - m_outputSamples.push_back(m_procSample); - - m_procSample = NULL; -- if (m_changeRatio) -- ChangeRatio(); -+ if (m_changeResampler) -+ ChangeResampler(); - } - // some methods like encode require completely filled packets - else if (!m_fillPackets || (m_procSample->pkt->nb_samples == m_procSample->pkt->max_nb_samples)) -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h -index 183c49e..f36d2c0 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.h -@@ -86,10 +86,10 @@ class CActiveAEBufferPool - class CActiveAEBufferPoolResample : public CActiveAEBufferPool - { - public: -- CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat); -+ CActiveAEBufferPoolResample(AEAudioFormat inputFormat, AEAudioFormat outputFormat, int quality); - virtual ~CActiveAEBufferPoolResample(); - virtual bool Create(unsigned int totaltime, bool remap); -- void ChangeRatio(); -+ void ChangeResampler(); - bool ResampleBuffers(unsigned int timestamp = 0); - float GetDelay(); - void Flush(); -@@ -102,8 +102,9 @@ class CActiveAEBufferPoolResample : public CActiveAEBufferPool - bool m_fillPackets; - bool m_drain; - bool m_empty; -- bool m_changeRatio; -+ bool m_changeResampler; - double m_resampleRatio; -+ int m_resampleQuality; - unsigned int m_outSampleRate; - }; - -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h -index baa4ef3..6f13b5e 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResample.h -@@ -38,7 +38,7 @@ class CActiveAEResample - public: - CActiveAEResample(); - virtual ~CActiveAEResample(); -- bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout = NULL, int quality = AE_SWR_NORMAL_QUALITY); -+ bool Init(uint64_t dst_chan_layout, int dst_channels, int dst_rate, AVSampleFormat dst_fmt, uint64_t src_chan_layout, int src_channels, int src_rate, AVSampleFormat src_fmt, CAEChannelInfo *remapLayout, int quality); - int Resample(uint8_t **dst_buffer, int dst_samples, uint8_t **src_buffer, int src_samples); - int64_t GetDelay(int64_t base); - int GetBufferedSamples(); --- -1.8.1.6 - - -From ab54a95500021158e2c17973e963a277eafb9d13 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Sat, 27 Jul 2013 09:02:37 +0200 -Subject: [PATCH 029/136] ActiveAE: fix starvation caused by viz - ---- - .../AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 95 +++++++++++----------- - 1 file changed, 49 insertions(+), 46 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -index 2388f78..4b64235 100644 ---- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -+++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -@@ -1563,52 +1563,6 @@ bool CActiveAE::RunStages() - if (!m_sinkHasVolume) - Deamplify(*(out->pkt)); - -- // viz -- { -- CSingleLock lock(m_vizLock); -- if (m_audioCallback && m_vizBuffers) -- { -- if (!m_vizInitialized) -- { -- m_audioCallback->OnInitialize(2, m_vizBuffers->m_format.m_sampleRate, 32); -- m_vizInitialized = true; -- } -- -- // if viz has no free buffer, it won't return current buffer "out" -- if (!m_vizBuffers->m_freeSamples.empty()) -- { -- out->Acquire(); -- m_vizBuffers->m_inputSamples.push_back(out); -- } -- else -- CLog::Log(LOGWARNING,"ActiveAE::%s - viz ran out of free buffers", __FUNCTION__); -- unsigned int now = XbmcThreads::SystemClockMillis(); -- unsigned int timestamp = now + m_stats.GetDelay() * 1000; -- m_vizBuffers->ResampleBuffers(timestamp); -- while(!m_vizBuffers->m_outputSamples.empty()) -- { -- CSampleBuffer *buf = m_vizBuffers->m_outputSamples.front(); -- if ((now - buf->timestamp) & 0x80000000) -- break; -- else -- { -- int submitted = 0; -- int samples; -- while(submitted < buf->pkt->nb_samples) -- { -- samples = std::min(512, buf->pkt->nb_samples-submitted); -- m_audioCallback->OnAudioData((float*)(buf->pkt->data[0]+2*submitted), samples); -- submitted += samples; -- } -- buf->Return(); -- m_vizBuffers->m_outputSamples.pop_front(); -- } -- } -- } -- else if (m_vizBuffers) -- m_vizBuffers->Flush(); -- } -- - // encode - if (m_mode == MODE_TRANSCODE && m_encoder) - { -@@ -1626,6 +1580,55 @@ bool CActiveAE::RunStages() - - busy = true; - } -+ -+ // viz -+ { -+ CSingleLock lock(m_vizLock); -+ if (m_audioCallback && m_vizBuffers) -+ { -+ if (!m_vizInitialized) -+ { -+ m_audioCallback->OnInitialize(2, m_vizBuffers->m_format.m_sampleRate, 32); -+ m_vizInitialized = true; -+ } -+ -+ // if viz has no free buffer, it won't return current buffer "out" -+ if (!m_vizBuffers->m_freeSamples.empty()) -+ { -+ if (out) -+ { -+ out->Acquire(); -+ m_vizBuffers->m_inputSamples.push_back(out); -+ } -+ } -+ else -+ CLog::Log(LOGWARNING,"ActiveAE::%s - viz ran out of free buffers", __FUNCTION__); -+ unsigned int now = XbmcThreads::SystemClockMillis(); -+ unsigned int timestamp = now + m_stats.GetDelay() * 1000; -+ busy |= m_vizBuffers->ResampleBuffers(timestamp); -+ while(!m_vizBuffers->m_outputSamples.empty()) -+ { -+ CSampleBuffer *buf = m_vizBuffers->m_outputSamples.front(); -+ if ((now - buf->timestamp) & 0x80000000) -+ break; -+ else -+ { -+ int submitted = 0; -+ int samples; -+ while(submitted < buf->pkt->nb_samples) -+ { -+ samples = std::min(512, buf->pkt->nb_samples-submitted); -+ m_audioCallback->OnAudioData((float*)(buf->pkt->data[0]+2*submitted), samples); -+ submitted += samples; -+ } -+ buf->Return(); -+ m_vizBuffers->m_outputSamples.pop_front(); -+ } -+ } -+ } -+ else if (m_vizBuffers) -+ m_vizBuffers->Flush(); -+ } - } - // pass through - else --- -1.8.1.6 - - -From a3ed37aa45ad63ef9c9b51248f820898de696167 Mon Sep 17 00:00:00 2001 +From 6eaedd0e1d1b3bb716ea7458b9782a704bf54f1e Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Thu, 30 May 2013 10:56:06 +0200 -Subject: [PATCH 030/136] renderer: use fence for determination when a buffer +Subject: [PATCH 001/110] renderer: use fence for determination when a buffer is ready for reuse --- @@ -8642,7 +24,7 @@ index a61d3cf..6acf2f3 100644 virtual bool Supports(ERENDERFEATURE feature) { return false; } diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index d4ed4a1..28b254c 100644 +index d52dead..962680a 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp @@ -128,6 +128,7 @@ @@ -8662,7 +44,7 @@ index d4ed4a1..28b254c 100644 #ifdef HAVE_LIBVA delete &vaapi; #endif -@@ -1207,6 +1210,15 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1228,6 +1231,15 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) RenderSoftware(renderBuffer, m_currentField); VerifyGLState(); } @@ -8678,7 +60,7 @@ index d4ed4a1..28b254c 100644 } void CLinuxRendererGL::RenderSinglePass(int index, int field) -@@ -3397,6 +3409,26 @@ unsigned int CLinuxRendererGL::GetProcessorSize() +@@ -3426,6 +3438,26 @@ unsigned int CLinuxRendererGL::GetProcessorSize() return 0; } @@ -8706,7 +88,7 @@ index d4ed4a1..28b254c 100644 void CLinuxRendererGL::AddProcessor(CVDPAU* vdpau, int index) { diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h -index 93b1a69..1b8bfbe 100644 +index b986d93..a90a532 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h @@ -141,6 +141,7 @@ class CLinuxRendererGL : public CBaseRenderer @@ -8726,7 +108,7 @@ index 93b1a69..1b8bfbe 100644 #ifdef HAVE_LIBVDPAU CVDPAU* vdpau; diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 1b88b36..64c5b1d 100644 +index 0d32715..6a8afff 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -374,11 +374,16 @@ void CXBMCRenderManager::FrameMove() @@ -8751,10 +133,10 @@ index 1b88b36..64c5b1d 100644 1.8.1.6 -From 851631f89b7cf5cc6f915e9588982c732bda1847 Mon Sep 17 00:00:00 2001 +From 4e82aa374e215ba627741f7a0a9ea8da770b2672 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:34:39 +0200 -Subject: [PATCH 031/136] videoplayer: adapt lateness detection and dropping to +Subject: [PATCH 002/110] videoplayer: adapt lateness detection and dropping to buffering --- @@ -8768,7 +150,7 @@ Subject: [PATCH 031/136] videoplayer: adapt lateness detection and dropping to 7 files changed, 260 insertions(+), 38 deletions(-) diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 64c5b1d..8b4476f 100644 +index 6a8afff..deac94b 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -299,6 +299,8 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi @@ -8797,7 +179,7 @@ index 64c5b1d..8b4476f 100644 requeue(m_queued, m_free); /* signal to any waiters to check state */ -@@ -1071,6 +1074,8 @@ void CXBMCRenderManager::PrepareNextRender() +@@ -1076,6 +1079,8 @@ void CXBMCRenderManager::PrepareNextRender() m_discard.push_back(m_presentsource); m_presentsource = idx; m_queued.pop_front(); @@ -8806,7 +188,7 @@ index 64c5b1d..8b4476f 100644 m_presentevent.notifyAll(); } } -@@ -1087,3 +1092,12 @@ void CXBMCRenderManager::DiscardBuffer() +@@ -1092,3 +1097,12 @@ void CXBMCRenderManager::DiscardBuffer() m_presentstep = PRESENT_IDLE; m_presentevent.notifyAll(); } @@ -8867,10 +249,10 @@ index 00fe4c3..52380c1 100644 double m_presenterr; double m_errorbuff[ERRORBUFFSIZE]; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h -index dc4e8be..ba4a8d5 100644 +index 8fc76b7..7f6d536 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h -@@ -109,6 +109,10 @@ struct DVDVideoUserData +@@ -117,6 +117,10 @@ struct DVDVideoUserData #define DVP_FLAG_NOSKIP 0x00000010 // indicate this picture should never be dropped #define DVP_FLAG_DROPPED 0x00000020 // indicate that this picture has been dropped in decoder stage, will have no data @@ -8881,7 +263,7 @@ index dc4e8be..ba4a8d5 100644 // DVP_FLAG 0x00000100 - 0x00000f00 is in use by libmpeg2! #define DVP_QSCALE_UNKNOWN 0 -@@ -126,6 +130,9 @@ struct DVDVideoUserData +@@ -134,6 +138,9 @@ struct DVDVideoUserData #define VC_PICTURE 0x00000004 // the decoder got a picture, call Decode(NULL, 0) again to parse the rest of the data #define VC_USERDATA 0x00000008 // the decoder found some userdata, call Decode(NULL, 0) again to parse the rest of the data #define VC_FLUSHED 0x00000010 // the decoder lost it's state, we need to restart decoding again @@ -8891,7 +273,7 @@ index dc4e8be..ba4a8d5 100644 class CDVDVideoCodec { public: -@@ -243,10 +250,16 @@ class CDVDVideoCodec +@@ -251,10 +258,16 @@ class CDVDVideoCodec return 0; } @@ -8910,10 +292,10 @@ index dc4e8be..ba4a8d5 100644 + virtual void SetCodecControl(int flags) {} }; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp -index 4040f38..fef2add 100644 +index 12bad27..530dc9d 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp -@@ -163,6 +163,7 @@ enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx +@@ -167,6 +167,7 @@ enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx m_iLastKeyframe = 0; m_dts = DVD_NOPTS_VALUE; m_started = false; @@ -8921,7 +303,7 @@ index 4040f38..fef2add 100644 } CDVDVideoCodecFFmpeg::~CDVDVideoCodecFFmpeg() -@@ -340,6 +341,14 @@ void CDVDVideoCodecFFmpeg::SetDropState(bool bDrop) +@@ -353,6 +354,14 @@ void CDVDVideoCodecFFmpeg::SetDropState(bool bDrop) { if( m_pCodecContext ) { @@ -8936,7 +318,7 @@ index 4040f38..fef2add 100644 // i don't know exactly how high this should be set // couldn't find any good docs on it. think it varies // from codec to codec on what it does -@@ -541,6 +550,7 @@ int CDVDVideoCodecFFmpeg::Decode(uint8_t* pData, int iSize, double dts, double p +@@ -554,6 +563,7 @@ int CDVDVideoCodecFFmpeg::Decode(uint8_t* pData, int iSize, double dts, double p void CDVDVideoCodecFFmpeg::Reset() { m_started = false; @@ -8944,7 +326,7 @@ index 4040f38..fef2add 100644 m_iLastKeyframe = m_pCodecContext->has_b_frames; m_dllAvCodec.avcodec_flush_buffers(m_pCodecContext); -@@ -643,6 +653,22 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) +@@ -667,6 +677,22 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) else pDvdVideoPicture->pts = DVD_NOPTS_VALUE; @@ -8967,7 +349,7 @@ index 4040f38..fef2add 100644 if(!m_started) pDvdVideoPicture->iFlags |= DVP_FLAG_DROPPED; -@@ -880,3 +906,8 @@ unsigned CDVDVideoCodecFFmpeg::GetAllowedReferences() +@@ -931,3 +957,8 @@ unsigned CDVDVideoCodecFFmpeg::GetAllowedReferences() else return 0; } @@ -8977,7 +359,7 @@ index 4040f38..fef2add 100644 + m_codecControlFlags = flags; +} diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h -index 28416e6..4279222 100644 +index c509339..a511806 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h @@ -46,6 +46,7 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec @@ -8997,7 +379,7 @@ index 28416e6..4279222 100644 bool IsHardwareAllowed() { return !m_bSoftware; } IHardwareDecoder * GetHardware() { return m_pHardware; }; -@@ -124,4 +127,8 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec +@@ -128,4 +131,8 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec double m_dts; bool m_started; std::vector m_formats; @@ -9007,10 +389,10 @@ index 28416e6..4279222 100644 + int m_codecControlFlags; }; diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index dfcbf7e..df54439 100644 +index 51caa05..3284332 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -322,8 +322,10 @@ void CDVDPlayerVideo::Process() +@@ -323,8 +323,10 @@ void CDVDPlayerVideo::Process() int iDropped = 0; //frames dropped in a row bool bRequestDrop = false; @@ -9021,7 +403,7 @@ index dfcbf7e..df54439 100644 while (!m_bStop) { -@@ -433,6 +435,7 @@ void CDVDPlayerVideo::Process() +@@ -434,6 +436,7 @@ void CDVDPlayerVideo::Process() picture.iFlags &= ~DVP_FLAG_ALLOCATED; m_packets.clear(); m_started = false; @@ -9029,7 +411,7 @@ index dfcbf7e..df54439 100644 } else if (pMsg->IsType(CDVDMsg::GENERAL_FLUSH)) // private message sent by (CDVDPlayerVideo::Flush()) { -@@ -445,6 +448,7 @@ void CDVDPlayerVideo::Process() +@@ -446,6 +449,7 @@ void CDVDPlayerVideo::Process() //we need to recalculate the framerate //TODO: this needs to be set on a streamchange instead ResetFrameRateCalc(); @@ -9037,7 +419,7 @@ index dfcbf7e..df54439 100644 m_stalled = true; m_started = false; -@@ -462,8 +466,10 @@ void CDVDPlayerVideo::Process() +@@ -463,8 +467,10 @@ void CDVDPlayerVideo::Process() m_speed = static_cast(pMsg)->m_value; if(m_speed == DVD_PLAYSPEED_PAUSE) m_iNrOfPicturesNotToSkip = 0; @@ -9048,7 +430,7 @@ index dfcbf7e..df54439 100644 } else if (pMsg->IsType(CDVDMsg::PLAYER_STARTED)) { -@@ -509,6 +515,28 @@ void CDVDPlayerVideo::Process() +@@ -510,6 +516,28 @@ void CDVDPlayerVideo::Process() m_iNrOfPicturesNotToSkip = 1; } @@ -9077,7 +459,7 @@ index dfcbf7e..df54439 100644 if (m_messageQueue.GetDataSize() == 0 || m_speed < 0) { -@@ -561,15 +589,8 @@ void CDVDPlayerVideo::Process() +@@ -562,15 +590,8 @@ void CDVDPlayerVideo::Process() } m_videoStats.AddSampleBytes(pPacket->iSize); @@ -9095,7 +477,7 @@ index dfcbf7e..df54439 100644 // loop while no error while (!m_bStop) -@@ -1207,33 +1228,12 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) +@@ -1178,33 +1199,12 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) m_FlipTimeStamp += max(0.0, iSleepTime); m_FlipTimeStamp += iFrameDuration; @@ -9133,7 +515,7 @@ index dfcbf7e..df54439 100644 // set fieldsync if picture is interlaced EFIELDSYNC mDisplayField = FS_NONE; -@@ -1266,7 +1266,7 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) +@@ -1237,7 +1237,7 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) if (index < 0) return EOS_DROPPED; @@ -9142,7 +524,7 @@ index dfcbf7e..df54439 100644 return result; #else -@@ -1566,3 +1566,127 @@ void CDVDPlayerVideo::CalcFrameRate() +@@ -1537,3 +1537,127 @@ void CDVDPlayerVideo::CalcFrameRate() m_iFrameRateCount = 0; } } @@ -9271,7 +653,7 @@ index dfcbf7e..df54439 100644 + m_totalGain += frametime; +} diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.h b/xbmc/cores/dvdplayer/DVDPlayerVideo.h -index 0aee790..c5a3c6c 100644 +index f8ad541..186e271 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.h +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.h @@ -36,6 +36,25 @@ @@ -9300,7 +682,7 @@ index 0aee790..c5a3c6c 100644 class CDVDPlayerVideo : public CThread { public: -@@ -103,6 +122,7 @@ class CDVDPlayerVideo : public CThread +@@ -104,6 +123,7 @@ class CDVDPlayerVideo : public CThread #define EOS_ABORT 1 #define EOS_DROPPED 2 #define EOS_VERYLATE 4 @@ -9308,7 +690,7 @@ index 0aee790..c5a3c6c 100644 void AutoCrop(DVDVideoPicture* pPicture); void AutoCrop(DVDVideoPicture *pPicture, RECT &crop); -@@ -128,6 +148,7 @@ class CDVDPlayerVideo : public CThread +@@ -129,6 +149,7 @@ class CDVDPlayerVideo : public CThread void ResetFrameRateCalc(); void CalcFrameRate(); @@ -9316,7 +698,7 @@ index 0aee790..c5a3c6c 100644 double m_fFrameRate; //framerate of the video currently playing bool m_bCalcFrameRate; //if we should calculate the framerate from the timestamps -@@ -180,5 +201,7 @@ class CDVDPlayerVideo : public CThread +@@ -182,5 +203,7 @@ class CDVDPlayerVideo : public CThread CPullupCorrection m_pullupCorrection; std::list m_packets; @@ -9328,10 +710,10 @@ index 0aee790..c5a3c6c 100644 1.8.1.6 -From 830f20bd53cd8053f27dae9598718070cde562e0 Mon Sep 17 00:00:00 2001 +From 33ea71cda1fc4767c047865112f2e2a245bcdb50 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 2 Sep 2012 16:05:21 +0200 -Subject: [PATCH 032/136] video player: present correct pts to user for a/v +Subject: [PATCH 003/110] video player: present correct pts to user for a/v sync (after buffering in renderer) --- @@ -9340,10 +722,10 @@ Subject: [PATCH 032/136] video player: present correct pts to user for a/v 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index df54439..25ed8f1 100644 +index 3284332..4970675 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -1486,6 +1486,22 @@ void CDVDPlayerVideo::ResetFrameRateCalc() +@@ -1457,6 +1457,22 @@ void CDVDPlayerVideo::ResetFrameRateCalc() g_advancedSettings.m_videoFpsDetect == 0; } @@ -9366,7 +748,7 @@ index df54439..25ed8f1 100644 #define MAXFRAMERATEDIFF 0.01 #define MAXFRAMESERR 1000 -@@ -1604,6 +1620,15 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) +@@ -1575,6 +1591,15 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) else iInterval = 1/m_fFrameRate*(double)DVD_TIME_BASE; @@ -9383,7 +765,7 @@ index df54439..25ed8f1 100644 && bNewFrame && m_bAllowDrop diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.h b/xbmc/cores/dvdplayer/DVDPlayerVideo.h -index c5a3c6c..ec30fc5 100644 +index 186e271..59c7f09 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.h +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.h @@ -100,7 +100,7 @@ class CDVDPlayerVideo : public CThread @@ -9399,10 +781,10 @@ index c5a3c6c..ec30fc5 100644 1.8.1.6 -From 1cd72b29520878b75cef6ec2ff5aa13ec92b291a Mon Sep 17 00:00:00 2001 +From 10a7f371c9c49afcbdbc302380c406bdbb126308 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 16 Feb 2013 18:25:53 +0100 -Subject: [PATCH 033/136] videoplayer: some rework and documentation +Subject: [PATCH 004/110] videoplayer: some rework and documentation --- .../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h | 29 ++++++++++++++++++++-- @@ -9412,10 +794,10 @@ Subject: [PATCH 033/136] videoplayer: some rework and documentation 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h -index ba4a8d5..809d432 100644 +index 7f6d536..2ccae41 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h -@@ -131,7 +131,6 @@ struct DVDVideoUserData +@@ -139,7 +139,6 @@ struct DVDVideoUserData #define VC_USERDATA 0x00000008 // the decoder found some userdata, call Decode(NULL, 0) again to parse the rest of the data #define VC_FLUSHED 0x00000010 // the decoder lost it's state, we need to restart decoding again #define VC_DROPPED 0x00000020 // needed to identify if a picture was dropped @@ -9423,7 +805,7 @@ index ba4a8d5..809d432 100644 class CDVDVideoCodec { -@@ -256,10 +255,36 @@ class CDVDVideoCodec +@@ -264,10 +263,36 @@ class CDVDVideoCodec */ virtual unsigned GetAllowedReferences() { return 0; } @@ -9462,10 +844,10 @@ index ba4a8d5..809d432 100644 virtual void SetCodecControl(int flags) {} }; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp -index fef2add..38e6e3f 100644 +index 530dc9d..e5748df 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp -@@ -907,6 +907,17 @@ unsigned CDVDVideoCodecFFmpeg::GetAllowedReferences() +@@ -958,6 +958,17 @@ unsigned CDVDVideoCodecFFmpeg::GetAllowedReferences() return 0; } @@ -9484,7 +866,7 @@ index fef2add..38e6e3f 100644 { m_codecControlFlags = flags; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h -index 4279222..8e0552f 100644 +index a511806..0436108 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h @@ -64,7 +64,7 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec @@ -9497,10 +879,10 @@ index 4279222..8e0552f 100644 bool IsHardwareAllowed() { return !m_bSoftware; } diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 25ed8f1..3d86d5b 100644 +index 4970675..2e76ff5 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -1597,7 +1597,7 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) +@@ -1568,7 +1568,7 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) int iBufferLevel; // get decoder stats @@ -9513,16 +895,16 @@ index 25ed8f1..3d86d5b 100644 1.8.1.6 -From 781fabbc7ec049f00bd4eb1a6511c39dd1c6dbfe Mon Sep 17 00:00:00 2001 +From 5dd41a12cb592e81866245da375541f97d77b861 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 7 Apr 2012 09:19:00 +0200 -Subject: [PATCH 034/136] vdpau: redesign +Subject: [PATCH 005/110] vdpau: redesign --- - language/English/strings.po | 12 +- + language/English/strings.po | 14 +- system/settings/settings.xml | 10 + system/shaders/yuv2rgb_basic.glsl | 12 + - xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 200 +- + xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 225 +- xbmc/cores/VideoRenderers/LinuxRendererGL.h | 13 +- xbmc/cores/VideoRenderers/RenderFormats.h | 1 + xbmc/cores/VideoRenderers/RenderManager.cpp | 3 +- @@ -9536,34 +918,34 @@ Subject: [PATCH 034/136] vdpau: redesign xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 1 + xbmc/settings/AdvancedSettings.cpp | 8 +- xbmc/settings/AdvancedSettings.h | 4 +- - xbmc/utils/ActorProtocol.cpp | 4 + - xbmc/utils/ActorProtocol.h | 4 + xbmc/video/dialogs/GUIDialogVideoSettings.cpp | 2 +- xbmc/windowing/X11/WinSystemX11.h | 1 + - 21 files changed, 3578 insertions(+), 1230 deletions(-) + 19 files changed, 3597 insertions(+), 1230 deletions(-) diff --git a/language/English/strings.po b/language/English/strings.po -index 40fbb74..f646f9f 100644 +index ec3ee5f..a6b0297 100644 --- a/language/English/strings.po +++ b/language/English/strings.po -@@ -5770,7 +5770,15 @@ msgctxt "#13435" - msgid "Enable HQ Scalers for scalings above" +@@ -5775,7 +5775,17 @@ msgctxt "#13436" + msgid "Allow hardware acceleration (libstagefright)" msgstr "" --#empty strings from id 13436 to 13499 -+msgctxt "#13436" +-#empty strings from id 13437 to 13499 ++#: system/settings/settings.xml ++msgctxt "#13437" +msgid "Allow Vdpau OpenGL interop" +msgstr "" + -+msgctxt "#13437" ++#: system/settings/settings.xml ++msgctxt "#13438" +msgid "Allow Vdpau OpenGL interop YUV" +msgstr "" + -+#empty strings from id 13438 to 13499 ++#empty strings from id 13439 to 13499 #: system/settings/settings.xml msgctxt "#13500" -@@ -6845,7 +6853,7 @@ msgid "Software Blend" +@@ -6850,7 +6860,7 @@ msgid "Software Blend" msgstr "" msgctxt "#16325" @@ -9573,14 +955,14 @@ index 40fbb74..f646f9f 100644 #empty strings from id 16326 to 16399 diff --git a/system/settings/settings.xml b/system/settings/settings.xml -index 461e787..b3ab3d1 100644 +index d1e5eff..56d637d 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -375,6 +375,16 @@ 2 true -+ ++ + HAVE_LIBVDPAU + 2 + true @@ -9617,10 +999,10 @@ index c8c8a2e..0799a4b 100644 #if(XBMC_texture_rectangle) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 28b254c..e7abc7b 100644 +index 962680a..388d778 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -681,6 +681,18 @@ void CLinuxRendererGL::RenderUpdate(bool clear, DWORD flags, DWORD alpha) +@@ -702,6 +702,18 @@ void CLinuxRendererGL::RenderUpdate(bool clear, DWORD flags, DWORD alpha) glDisable(GL_POLYGON_STIPPLE); } @@ -9639,7 +1021,7 @@ index 28b254c..e7abc7b 100644 else Render(flags, index); -@@ -761,11 +773,6 @@ void CLinuxRendererGL::FlipPage(int source) +@@ -782,11 +794,6 @@ void CLinuxRendererGL::FlipPage(int source) m_buffers[m_iYV12RenderBuffer].flipindex = ++m_flipindex; @@ -9651,7 +1033,7 @@ index 28b254c..e7abc7b 100644 return; } -@@ -1092,6 +1099,12 @@ void CLinuxRendererGL::LoadShaders(int field) +@@ -1113,6 +1120,12 @@ void CLinuxRendererGL::LoadShaders(int field) m_textureCreate = &CLinuxRendererGL::CreateVDPAUTexture; m_textureDelete = &CLinuxRendererGL::DeleteVDPAUTexture; } @@ -9664,7 +1046,7 @@ index 28b254c..e7abc7b 100644 else if (m_format == RENDER_FMT_VAAPI) { m_textureUpload = &CLinuxRendererGL::UploadVAAPITexture; -@@ -1167,7 +1180,10 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1188,7 +1201,10 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) m_currentField = FIELD_FULL; // call texture load function @@ -9675,7 +1057,7 @@ index 28b254c..e7abc7b 100644 if (m_renderMethod & RENDER_GLSL) { -@@ -1542,17 +1558,12 @@ void CLinuxRendererGL::RenderFromFBO() +@@ -1563,17 +1579,12 @@ void CLinuxRendererGL::RenderFromFBO() void CLinuxRendererGL::RenderVDPAU(int index, int field) { #ifdef HAVE_LIBVDPAU @@ -9693,9 +1075,9 @@ index 28b254c..e7abc7b 100644 - vdpau->BindPixmap(); + glBindTexture(m_textureTarget, plane.id); - // Try some clamping or wrapping - glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -@@ -1610,8 +1621,6 @@ void CLinuxRendererGL::RenderVDPAU(int index, int field) + // make sure we know the correct texture size + GetPlaneTextureSize(plane); +@@ -1635,8 +1646,6 @@ void CLinuxRendererGL::RenderVDPAU(int index, int field) if (m_pVideoFilterShader) m_pVideoFilterShader->Disable(); @@ -9704,7 +1086,7 @@ index 28b254c..e7abc7b 100644 glBindTexture (m_textureTarget, 0); glDisable(m_textureTarget); #endif -@@ -2288,12 +2297,14 @@ void CLinuxRendererGL::DeleteVDPAUTexture(int index) +@@ -2317,12 +2326,14 @@ void CLinuxRendererGL::DeleteVDPAUTexture(int index) { #ifdef HAVE_LIBVDPAU YUVPLANE &plane = m_buffers[index].fields[0][0]; @@ -9719,7 +1101,7 @@ index 28b254c..e7abc7b 100644 #endif } -@@ -2326,10 +2337,147 @@ bool CLinuxRendererGL::CreateVDPAUTexture(int index) +@@ -2355,10 +2366,172 @@ bool CLinuxRendererGL::CreateVDPAUTexture(int index) void CLinuxRendererGL::UploadVDPAUTexture(int index) { #ifdef HAVE_LIBVDPAU @@ -9727,8 +1109,9 @@ index 28b254c..e7abc7b 100644 + VDPAU::CVdpauRenderPicture *vdpau = m_buffers[index].vdpau; + + unsigned int flipindex = m_buffers[index].flipindex; ++ YV12Image &im = m_buffers[index].image; + YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][0]; ++ YUVPLANE &plane = fields[0][1]; + + if (!vdpau || !vdpau->valid) + { @@ -9736,7 +1119,31 @@ index 28b254c..e7abc7b 100644 + return; + } + -+ fields[0][1].id = vdpau->texture[0]; ++ plane.id = vdpau->texture[0]; ++ ++ plane.pixpertex_x = 1; ++ plane.pixpertex_y = 1; ++ ++ plane.rect = m_sourceRect; ++ plane.width = im.width; ++ plane.height = im.height; ++ ++ plane.height /= plane.pixpertex_y; ++ plane.rect.y1 /= plane.pixpertex_y; ++ plane.rect.y2 /= plane.pixpertex_y; ++ plane.width /= plane.pixpertex_x; ++ plane.rect.x1 /= plane.pixpertex_x; ++ plane.rect.x2 /= plane.pixpertex_x; ++ ++ if (m_textureTarget == GL_TEXTURE_2D) ++ { ++ plane.height /= plane.texheight; ++ plane.rect.y1 /= plane.texheight; ++ plane.rect.y2 /= plane.texheight; ++ plane.width /= plane.texwidth; ++ plane.rect.x1 /= plane.texwidth; ++ plane.rect.x2 /= plane.texwidth; ++ } + +#endif +} @@ -9868,7 +1275,7 @@ index 28b254c..e7abc7b 100644 void CLinuxRendererGL::DeleteVAAPITexture(int index) { -@@ -3252,12 +3400,13 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method) +@@ -3281,12 +3454,13 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method) if(method == VS_INTERLACEMETHOD_AUTO) return true; @@ -9886,7 +1293,7 @@ index 28b254c..e7abc7b 100644 #endif return false; } -@@ -3350,14 +3499,7 @@ EINTERLACEMETHOD CLinuxRendererGL::AutoInterlaceMethod() +@@ -3379,14 +3553,7 @@ EINTERLACEMETHOD CLinuxRendererGL::AutoInterlaceMethod() return VS_INTERLACEMETHOD_NONE; if(m_renderMethod & RENDER_VDPAU) @@ -9901,7 +1308,7 @@ index 28b254c..e7abc7b 100644 if(Supports(VS_INTERLACEMETHOD_RENDER_BOB)) return VS_INTERLACEMETHOD_RENDER_BOB; -@@ -3402,6 +3544,7 @@ void CLinuxRendererGL::UnBindPbo(YUVBUFFER& buff) +@@ -3431,6 +3598,7 @@ void CLinuxRendererGL::UnBindPbo(YUVBUFFER& buff) unsigned int CLinuxRendererGL::GetProcessorSize() { if(m_format == RENDER_FMT_VDPAU @@ -9909,7 +1316,7 @@ index 28b254c..e7abc7b 100644 || m_format == RENDER_FMT_VAAPI || m_format == RENDER_FMT_CVBREF) return 1; -@@ -3430,11 +3573,12 @@ bool CLinuxRendererGL::IsProcessed(int idx) +@@ -3459,11 +3627,12 @@ bool CLinuxRendererGL::IsProcessed(int idx) } #ifdef HAVE_LIBVDPAU @@ -9925,7 +1332,7 @@ index 28b254c..e7abc7b 100644 #endif diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h -index 1b8bfbe..aac04bd 100644 +index a90a532..fdda2ed 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h @@ -39,12 +39,11 @@ @@ -9979,7 +1386,7 @@ index 1b8bfbe..aac04bd 100644 #endif #ifdef HAVE_LIBVA VAAPI::CHolder& vaapi; -@@ -326,6 +330,7 @@ class CLinuxRendererGL : public CBaseRenderer +@@ -327,6 +331,7 @@ class CLinuxRendererGL : public CBaseRenderer bool m_nonLinStretch; bool m_nonLinStretchGui; float m_pixelRatio; @@ -9988,7 +1395,7 @@ index 1b8bfbe..aac04bd 100644 diff --git a/xbmc/cores/VideoRenderers/RenderFormats.h b/xbmc/cores/VideoRenderers/RenderFormats.h -index f67a32c..9ad1671 100644 +index 29d45e0..3b09194 100644 --- a/xbmc/cores/VideoRenderers/RenderFormats.h +++ b/xbmc/cores/VideoRenderers/RenderFormats.h @@ -26,6 +26,7 @@ enum ERenderFormat { @@ -10000,7 +1407,7 @@ index f67a32c..9ad1671 100644 RENDER_FMT_UYVY422, RENDER_FMT_YUYV422, diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 8b4476f..5b08c1e 100644 +index deac94b..a1c2fc7 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -925,7 +925,8 @@ int CXBMCRenderManager::AddVideoPicture(DVDVideoPicture& pic) @@ -10040,7 +1447,7 @@ index ad1940c..48302ff 100644 CLog::Log(LOGERROR, "GL: BaseYUV2RGBGLSLShader - unsupported format %d", m_format); diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h -index 809d432..43befb4 100644 +index 2ccae41..0dd29c3 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h @@ -34,7 +34,7 @@ @@ -10052,7 +1459,7 @@ index 809d432..43befb4 100644 class COpenMax; class COpenMaxVideo; struct OpenMaxVideoBuffer; -@@ -55,7 +55,7 @@ struct DVDVideoPicture +@@ -57,7 +57,7 @@ struct DVDVideoPicture DXVA::CSurfaceContext* context; }; struct { @@ -10062,7 +1469,7 @@ index 809d432..43befb4 100644 struct { VAAPI::CHolder* vaapi; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp -index 38e6e3f..e133d78 100644 +index e5748df..aa2d1e4 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -75,11 +75,11 @@ enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx @@ -10081,7 +1488,7 @@ index 38e6e3f..e133d78 100644 ctx->SetHardware(vdp); return *cur; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h -index 8e0552f..30c67ab 100644 +index 0436108..c0ce198 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h @@ -29,7 +29,6 @@ @@ -15199,10 +6606,10 @@ index e760f28..1c21535 100644 + +} diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 3d86d5b..b0a33de 100644 +index 2e76ff5..8ed34f9 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -1009,6 +1009,7 @@ static std::string GetRenderFormatName(ERenderFormat format) +@@ -1010,6 +1010,7 @@ static std::string GetRenderFormatName(ERenderFormat format) case RENDER_FMT_UYVY422: return "UYVY"; case RENDER_FMT_YUYV422: return "YUY2"; case RENDER_FMT_VDPAU: return "VDPAU"; @@ -15211,7 +6618,7 @@ index 3d86d5b..b0a33de 100644 case RENDER_FMT_VAAPI: return "VAAPI"; case RENDER_FMT_OMXEGL: return "OMXEGL"; diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp -index 2a2a15a..f0a997e 100644 +index 3ec25c1..6541f65 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -161,7 +161,7 @@ void CAdvancedSettings::Initialize() @@ -15232,7 +6639,7 @@ index 2a2a15a..f0a997e 100644 m_DXVACheckCompatibility = false; m_DXVACheckCompatibilityPresent = false; m_DXVAForceProcessorRenderer = true; -@@ -572,7 +574,7 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file) +@@ -590,7 +592,7 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file) XMLUtils::GetString(pElement,"cleandatetime", m_videoCleanDateTimeRegExp); XMLUtils::GetString(pElement,"ppffmpegdeinterlacing",m_videoPPFFmpegDeint); XMLUtils::GetString(pElement,"ppffmpegpostprocessing",m_videoPPFFmpegPostProc); @@ -15241,20 +6648,20 @@ index 2a2a15a..f0a997e 100644 XMLUtils::GetFloat(pElement, "nonlinearstretchratio", m_videoNonLinStretchRatio, 0.01f, 1.0f); XMLUtils::GetBoolean(pElement,"enablehighqualityhwscalers", m_videoEnableHighQualityHwScalers); XMLUtils::GetFloat(pElement,"autoscalemaxfps",m_videoAutoScaleMaxFps, 0.0f, 1000.0f); -@@ -581,6 +583,8 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file) +@@ -599,6 +601,8 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file) XMLUtils::GetBoolean(pElement,"allowmpeg4vaapi",m_videoAllowMpeg4VAAPI); XMLUtils::GetBoolean(pElement, "disablebackgrounddeinterlace", m_videoDisableBackgroundDeinterlace); XMLUtils::GetInt(pElement, "useocclusionquery", m_videoCaptureUseOcclusionQuery, -1, 1); + XMLUtils::GetBoolean(pElement,"vdpauInvTelecine",m_videoVDPAUtelecine); + XMLUtils::GetBoolean(pElement,"vdpauHDdeintSkipChroma",m_videoVDPAUdeintSkipChromaHD); - TiXmlElement* pAdjustRefreshrate = pElement->FirstChildElement("adjustrefreshrate"); - if (pAdjustRefreshrate) + TiXmlElement* pStagefrightElem = pElement->FirstChildElement("stagefright"); + if (pStagefrightElem) diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h -index 084fe8b..3a52878 100644 +index 224268a..310db76 100644 --- a/xbmc/settings/AdvancedSettings.h +++ b/xbmc/settings/AdvancedSettings.h -@@ -147,6 +147,8 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler +@@ -158,6 +158,8 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler int m_videoPercentSeekBackwardBig; CStdString m_videoPPFFmpegDeint; CStdString m_videoPPFFmpegPostProc; @@ -15263,7 +6670,7 @@ index 084fe8b..3a52878 100644 bool m_musicUseTimeSeeking; int m_musicTimeSeekForward; int m_musicTimeSeekBackward; -@@ -162,7 +164,7 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler +@@ -173,7 +175,7 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler CStdString m_audioHost; bool m_audioApplyDrc; @@ -15272,39 +6679,11 @@ index 084fe8b..3a52878 100644 float m_videoNonLinStretchRatio; bool m_videoEnableHighQualityHwScalers; float m_videoAutoScaleMaxFps; -diff --git a/xbmc/utils/ActorProtocol.cpp b/xbmc/utils/ActorProtocol.cpp -index cf4c26f..e3090c3 100644 ---- a/xbmc/utils/ActorProtocol.cpp -+++ b/xbmc/utils/ActorProtocol.cpp -@@ -1,5 +1,9 @@ - /* -+<<<<<<< HEAD - * Copyright (C) 2005-2013 Team XBMC -+======= -+ * Copyright (C) 2005-2012 Team XBMC -+>>>>>>> b5471a2... vdpau: redesign - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify -diff --git a/xbmc/utils/ActorProtocol.h b/xbmc/utils/ActorProtocol.h -index 8ef3359..8c4038a 100644 ---- a/xbmc/utils/ActorProtocol.h -+++ b/xbmc/utils/ActorProtocol.h -@@ -1,5 +1,9 @@ - /* -+<<<<<<< HEAD - * Copyright (C) 2005-2013 Team XBMC -+======= -+ * Copyright (C) 2005-2012 Team XBMC -+>>>>>>> b5471a2... vdpau: redesign - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify diff --git a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp -index 684b471..2bad710 100644 +index a27aed3..8f30248 100644 --- a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp -@@ -104,7 +104,7 @@ void CGUIDialogVideoSettings::CreateSettings() +@@ -108,7 +108,7 @@ void CGUIDialogVideoSettings::CreateSettings() entries.push_back(make_pair(VS_INTERLACEMETHOD_INVERSE_TELECINE , 16314)); entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL , 16311)); entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL , 16310)); @@ -15329,35 +6708,36 @@ index a0f7bba..b6b6ec4 100644 1.8.1.6 -From 72f31a6c742e0d2145f9fc85786b7c4d96759214 Mon Sep 17 00:00:00 2001 +From 64a3764653d8021becc1ba27cb1b9900ab581ff5 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 12 Dec 2012 09:52:17 +0100 -Subject: [PATCH 035/136] vdpau: make interop gl default and remove setting, +Subject: [PATCH 006/110] vdpau: make interop gl default and remove setting, rename and intvert interop yuv --- - language/English/strings.po | 8 ++------ + language/English/strings.po | 9 ++------- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 17 ++++++++++------- - 2 files changed, 12 insertions(+), 13 deletions(-) + 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/language/English/strings.po b/language/English/strings.po -index f646f9f..ba414f9 100644 +index a6b0297..fae2505 100644 --- a/language/English/strings.po +++ b/language/English/strings.po -@@ -5771,14 +5771,10 @@ msgid "Enable HQ Scalers for scalings above" - msgstr "" +@@ -5777,15 +5777,10 @@ msgstr "" - msgctxt "#13436" + #: system/settings/settings.xml + msgctxt "#13437" -msgid "Allow Vdpau OpenGL interop" +msgid "Prefer VDPAU Video Mixer" msgstr "" --msgctxt "#13437" +-#: system/settings/settings.xml +-msgctxt "#13438" -msgid "Allow Vdpau OpenGL interop YUV" -msgstr "" - --#empty strings from id 13438 to 13499 -+#empty strings from id 13437 to 13499 +-#empty strings from id 13439 to 13499 ++#empty strings from id 13438 to 13499 #: system/settings/settings.xml msgctxt "#13500" @@ -15437,10 +6817,10 @@ index 4844469..fc95760 100644 1.8.1.6 -From 284223523ec875a402ea85c208da19e5949cab44 Mon Sep 17 00:00:00 2001 +From 9288e2009b64f9ceebda4c27a98a412c07ee8cbf Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 12 Dec 2012 18:34:47 +0100 -Subject: [PATCH 036/136] vdpau: drop studio level conversion +Subject: [PATCH 007/110] vdpau: drop studio level conversion --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 4 +- @@ -15448,10 +6828,10 @@ Subject: [PATCH 036/136] vdpau: drop studio level conversion 2 files changed, 6 insertions(+), 92 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index e7abc7b..2d63413 100644 +index 388d778..2de63b8 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -3316,7 +3316,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3370,7 +3370,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) { if(feature == RENDERFEATURE_BRIGHTNESS) { @@ -15460,7 +6840,7 @@ index e7abc7b..2d63413 100644 return true; if (m_renderMethod & RENDER_VAAPI) -@@ -3329,7 +3329,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3383,7 +3383,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) if(feature == RENDERFEATURE_CONTRAST) { @@ -15592,10 +6972,10 @@ index fc95760..07af62a 100644 1.8.1.6 -From 16f3d1420c64bd711b95102c6364a308c1b5bd54 Mon Sep 17 00:00:00 2001 +From 471ec30394381baccd0d7c6fe24efc834a1e9d25 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 12 Dec 2012 20:28:49 +0100 -Subject: [PATCH 037/136] vdpau: observe ffmpeg tags for color space +Subject: [PATCH 008/110] vdpau: observe ffmpeg tags for color space --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 38 ++++++++++++++++++-------- @@ -15699,10 +7079,10 @@ index 1c21535..674571b 100644 1.8.1.6 -From b301b228ac26b0ea083865cca42337b9bf816175 Mon Sep 17 00:00:00 2001 +From 0d627c2dfe93bc9cbde2f0c45b209b24ae3afcf6 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 27 Jan 2013 12:10:19 +0100 -Subject: [PATCH 038/136] vdpau: switch off de-interlacing on ff +Subject: [PATCH 009/110] vdpau: switch off de-interlacing on ff --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 5 +++-- @@ -15728,10 +7108,10 @@ index 7ecc2cf..3cc02ee 100644 1.8.1.6 -From cdd164a91bd82358f2c6c0923ba9a33f59ab9c1c Mon Sep 17 00:00:00 2001 +From 9bd37f8dce8f15c2b7db6d998b7637645345f432 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 2 Feb 2013 13:17:09 +0100 -Subject: [PATCH 039/136] vdpau: fix mp4 part2 decoding, activate by default +Subject: [PATCH 010/110] vdpau: fix mp4 part2 decoding, activate by default --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 3 +-- @@ -15755,7 +7135,7 @@ index 3cc02ee..d90df12 100644 { if (!CDVDCodecUtils::IsVP3CompatibleWidth(avctx->coded_width)) diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp -index f0a997e..292750d 100644 +index 6541f65..8287651 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -165,7 +165,7 @@ void CAdvancedSettings::Initialize() @@ -15771,10 +7151,10 @@ index f0a997e..292750d 100644 1.8.1.6 -From 5f076a0a19a3e5443d08a0a8d1f20c1189919848 Mon Sep 17 00:00:00 2001 +From 084d9ac176408dd4240edb14b144f67a884eda5e Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 2 Mar 2013 15:19:19 +0100 -Subject: [PATCH 040/136] vdpau: re-add limited range conversion +Subject: [PATCH 011/110] vdpau: re-add limited range conversion --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 4 +- @@ -15782,10 +7162,10 @@ Subject: [PATCH 040/136] vdpau: re-add limited range conversion 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 2d63413..e7abc7b 100644 +index 2de63b8..388d778 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -3316,7 +3316,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3370,7 +3370,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) { if(feature == RENDERFEATURE_BRIGHTNESS) { @@ -15794,7 +7174,7 @@ index 2d63413..e7abc7b 100644 return true; if (m_renderMethod & RENDER_VAAPI) -@@ -3329,7 +3329,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3383,7 +3383,7 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) if(feature == RENDERFEATURE_CONTRAST) { @@ -15918,10 +7298,10 @@ index d90df12..62cd72e 100644 1.8.1.6 -From f2b725fe8b735a7e6899b5a8dc5630c6498fa277 Mon Sep 17 00:00:00 2001 +From 4b7e68462033d60522677cb8abd3472ffe0734f0 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 25 Sep 2012 12:14:15 +0200 -Subject: [PATCH 041/136] linuxrenderer: drop method RenderMultiPass +Subject: [PATCH 012/110] linuxrenderer: drop method RenderMultiPass --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 9 ++------- @@ -15929,10 +7309,10 @@ Subject: [PATCH 041/136] linuxrenderer: drop method RenderMultiPass 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index e7abc7b..39ba8a4 100644 +index 388d778..e8ae9df 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -1197,7 +1197,8 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1218,7 +1218,8 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) break; case RQ_MULTIPASS: @@ -15942,7 +7322,7 @@ index e7abc7b..39ba8a4 100644 VerifyGLState(); break; } -@@ -1329,12 +1330,6 @@ void CLinuxRendererGL::RenderSinglePass(int index, int field) +@@ -1350,12 +1351,6 @@ void CLinuxRendererGL::RenderSinglePass(int index, int field) VerifyGLState(); } @@ -15956,7 +7336,7 @@ index e7abc7b..39ba8a4 100644 { YUVPLANES &planes = m_buffers[index].fields[field]; diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h -index aac04bd..41a1be7 100644 +index fdda2ed..1a3a6cf 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h @@ -218,7 +218,6 @@ class CLinuxRendererGL : public CBaseRenderer @@ -15971,10 +7351,10 @@ index aac04bd..41a1be7 100644 1.8.1.6 -From 67e034b0cec5e24c0c5e8394e27e7046e5a77f69 Mon Sep 17 00:00:00 2001 +From b92169b126e26347156b617be5c7c7ac7a9ed191 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 25 Sep 2012 13:20:47 +0200 -Subject: [PATCH 042/136] linuxrenderer: implement progressive weave for vdpau +Subject: [PATCH 013/110] linuxrenderer: implement progressive weave for vdpau --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 55 +++++++++++++++++++-------- @@ -15982,10 +7362,10 @@ Subject: [PATCH 042/136] linuxrenderer: implement progressive weave for vdpau 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 39ba8a4..c072f5e 100644 +index e8ae9df..6807df7 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -681,18 +681,6 @@ void CLinuxRendererGL::RenderUpdate(bool clear, DWORD flags, DWORD alpha) +@@ -702,18 +702,6 @@ void CLinuxRendererGL::RenderUpdate(bool clear, DWORD flags, DWORD alpha) glDisable(GL_POLYGON_STIPPLE); } @@ -16004,7 +7384,7 @@ index 39ba8a4..c072f5e 100644 else Render(flags, index); -@@ -1192,13 +1180,21 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1213,13 +1201,21 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) { case RQ_LOW: case RQ_SINGLEPASS: @@ -16029,7 +7409,7 @@ index 39ba8a4..c072f5e 100644 VerifyGLState(); break; } -@@ -1330,7 +1326,7 @@ void CLinuxRendererGL::RenderSinglePass(int index, int field) +@@ -1351,7 +1347,7 @@ void CLinuxRendererGL::RenderSinglePass(int index, int field) VerifyGLState(); } @@ -16038,7 +7418,7 @@ index 39ba8a4..c072f5e 100644 { YUVPLANES &planes = m_buffers[index].fields[field]; -@@ -1432,6 +1428,8 @@ void CLinuxRendererGL::RenderToFBO(int index, int field) +@@ -1453,6 +1449,8 @@ void CLinuxRendererGL::RenderToFBO(int index, int field) } m_fbo.width *= planes[0].pixpertex_x; m_fbo.height *= planes[0].pixpertex_y; @@ -16047,7 +7427,7 @@ index 39ba8a4..c072f5e 100644 // 1st Pass to video frame size glBegin(GL_QUADS); -@@ -1550,6 +1548,31 @@ void CLinuxRendererGL::RenderFromFBO() +@@ -1571,6 +1569,31 @@ void CLinuxRendererGL::RenderFromFBO() VerifyGLState(); } @@ -16080,7 +7460,7 @@ index 39ba8a4..c072f5e 100644 { #ifdef HAVE_LIBVDPAU diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h -index 41a1be7..274f980 100644 +index 1a3a6cf..258a598 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h @@ -218,12 +218,12 @@ class CLinuxRendererGL : public CBaseRenderer @@ -16102,10 +7482,10 @@ index 41a1be7..274f980 100644 1.8.1.6 -From 561523ebacefe1e8f29b6f701501cc4212daf134 Mon Sep 17 00:00:00 2001 +From 43a1ea8a43bc950f3f60bdeb02adf0d2a117273f Mon Sep 17 00:00:00 2001 From: fritsch Date: Thu, 28 Mar 2013 10:38:37 +0100 -Subject: [PATCH 043/136] VDPAU: silence compiler warnings +Subject: [PATCH 014/110] VDPAU: silence compiler warnings --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 19 ++++++++----------- @@ -16201,10 +7581,10 @@ index 62cd72e..a0ccd9f 100644 1.8.1.6 -From b65e8eb5fd1a5ba8fc4371c73f3f5ddb9b1f4f06 Mon Sep 17 00:00:00 2001 +From 6e2414da30e6a874fa7ac6a56930e42b737eeac8 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 25 Feb 2013 08:47:10 +0100 -Subject: [PATCH 044/136] vdpau: release more resources on pre-cleanup +Subject: [PATCH 015/110] vdpau: release more resources on pre-cleanup --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 72 +++++++++++++++++++++++--- @@ -16342,10 +7722,10 @@ index 674571b..c0835cf 100644 1.8.1.6 -From 190abb1d038374350c9b3ec41de6d78632a58d49 Mon Sep 17 00:00:00 2001 +From dd49526d8216e4544ec56101f62f85a5b92ee2e0 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 6 Mar 2013 07:35:10 +0100 -Subject: [PATCH 045/136] vdpau: set deinterlacing method to auto, if default +Subject: [PATCH 016/110] vdpau: set deinterlacing method to auto, if default method not supported --- @@ -16377,10 +7757,10 @@ index 89ffc6e..b23f530 100644 1.8.1.6 -From d0f6095e6298ed46e4ccc991d2491fada8d1a0fd Mon Sep 17 00:00:00 2001 +From c5785dcbd029102df0e3bcd0e3ef071105ed6954 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 21 Apr 2013 09:19:34 +0200 -Subject: [PATCH 046/136] vdpau: fix deadlock if decoder is closed while +Subject: [PATCH 017/110] vdpau: fix deadlock if decoder is closed while refresh rate changes --- @@ -16418,10 +7798,10 @@ index b23f530..2fdcf37 100644 1.8.1.6 -From 2fc0e791999aa60262088b97e67d11fc339be17f Mon Sep 17 00:00:00 2001 +From a8f89679a150db3f6d9e11dbe214de888b373546 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sat, 1 Jun 2013 11:21:19 +0200 -Subject: [PATCH 047/136] renderer: bump buffers to 5 +Subject: [PATCH 018/110] renderer: bump buffers to 5 --- xbmc/cores/VideoRenderers/BaseRenderer.h | 2 +- @@ -16444,10 +7824,10 @@ index 6acf2f3..f44024c 100644 1.8.1.6 -From 4d6c7fbefdfedad5e67a37e8f1f33714a9cc10dd Mon Sep 17 00:00:00 2001 +From 152844f66eeca185da6982d9e7e66a2ae5a502da Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:41:31 +0200 -Subject: [PATCH 048/136] videoplayer: update frametime, it might change due to +Subject: [PATCH 019/110] videoplayer: update frametime, it might change due to fps detection --- @@ -16455,10 +7835,10 @@ Subject: [PATCH 048/136] videoplayer: update frametime, it might change due to 1 file changed, 2 insertions(+) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index b0a33de..d45d8ae 100644 +index 8ed34f9..bc049bd 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -707,6 +707,8 @@ void CDVDPlayerVideo::Process() +@@ -708,6 +708,8 @@ void CDVDPlayerVideo::Process() int iResult = OutputPicture(&picture, pts); @@ -16471,10 +7851,10 @@ index b0a33de..d45d8ae 100644 1.8.1.6 -From e4359bc5349ccecd4b7d7511c513eadcde12bc87 Mon Sep 17 00:00:00 2001 +From 4375b9a0c7e7e12f5f7d5d7dfd8319b26c4f1490 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:43:06 +0200 -Subject: [PATCH 049/136] videoplayer: give streams with invalid fps a chance +Subject: [PATCH 020/110] videoplayer: give streams with invalid fps a chance for fps detection --- @@ -16482,10 +7862,10 @@ Subject: [PATCH 049/136] videoplayer: give streams with invalid fps a chance 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index d45d8ae..9dc5cd6 100644 +index bc049bd..21d023e 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -1529,7 +1529,7 @@ void CDVDPlayerVideo::CalcFrameRate() +@@ -1500,7 +1500,7 @@ void CDVDPlayerVideo::CalcFrameRate() double frameduration = m_pullupCorrection.GetFrameDuration(); if (frameduration == DVD_NOPTS_VALUE || @@ -16498,10 +7878,10 @@ index d45d8ae..9dc5cd6 100644 1.8.1.6 -From 4843169664c024b7361a1191c72fdca6d17f88de Mon Sep 17 00:00:00 2001 +From a217254277fdd441c31713bcdad816d72263da4e Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:49:05 +0200 -Subject: [PATCH 050/136] dvdplayer: allow rewinding at end of stream, do a +Subject: [PATCH 021/110] dvdplayer: allow rewinding at end of stream, do a seek after rewind --- @@ -16509,10 +7889,10 @@ Subject: [PATCH 050/136] dvdplayer: allow rewinding at end of stream, do a 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index 1246b9f..994e7b4 100644 +index 27e9ff1..1bd122b 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp -@@ -1555,7 +1555,7 @@ void CDVDPlayer::HandlePlaySpeed() +@@ -1556,7 +1556,7 @@ void CDVDPlayer::HandlePlaySpeed() } else if (m_CurrentVideo.id >= 0 @@ -16521,7 +7901,7 @@ index 1246b9f..994e7b4 100644 && m_SpeedState.lastpts != m_dvdPlayerVideo.GetCurrentPts() && m_SpeedState.lasttime != GetTime()) { -@@ -2221,6 +2221,12 @@ void CDVDPlayer::HandleMessages() +@@ -2222,6 +2222,12 @@ void CDVDPlayer::HandleMessages() pvrinputstream->Pause( speed == 0 ); } @@ -16538,10 +7918,10 @@ index 1246b9f..994e7b4 100644 1.8.1.6 -From 79f7fcd5ba7b5f8ed2bc9b0df83b8d88b2173324 Mon Sep 17 00:00:00 2001 +From 1e02fb0d7f844b722743ea37f2984f5595b38e3a Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 15:22:05 +0200 -Subject: [PATCH 051/136] X11: ditch SDL for video and window events +Subject: [PATCH 022/110] X11: ditch SDL for video and window events --- xbmc/Application.cpp | 2 +- @@ -16557,10 +7937,10 @@ Subject: [PATCH 051/136] X11: ditch SDL for video and window events create mode 100644 xbmc/windowing/WinEventsX11.h diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp -index ae82308..eb81f6e 100644 +index b4fa73b..55a2685 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp -@@ -844,7 +844,7 @@ bool CApplication::CreateGUI() +@@ -845,7 +845,7 @@ bool CApplication::CreateGUI() uint32_t sdlFlags = 0; @@ -18025,10 +9405,10 @@ index b6b6ec4..448a1bb 100644 1.8.1.6 -From 218b76e5a0d3701e853a7837a37f781879bbe194 Mon Sep 17 00:00:00 2001 +From 629aa294a77faa2a9165909ee7750039d997396e Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 15:24:22 +0200 -Subject: [PATCH 052/136] X11: Add xbmc icon +Subject: [PATCH 023/110] X11: Add xbmc icon --- xbmc/windowing/X11/WinSystemX11.cpp | 126 +++++++++++++++++++++++++++++++++++- @@ -18217,10 +9597,10 @@ index 448a1bb..e618268 100644 1.8.1.6 -From 26831a9a36a7bcc6b4fd8f96ab2520006a3956de Mon Sep 17 00:00:00 2001 +From aa580c081b65e5697123a70c128c35a32701ec0b Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 20 May 2012 14:11:26 +0200 -Subject: [PATCH 053/136] X11: add SDL joystick until we have a better solution +Subject: [PATCH 024/110] X11: add SDL joystick until we have a better solution --- xbmc/windowing/WinEventsX11.cpp | 26 ++++++++++++++++++++++++++ @@ -18274,10 +9654,10 @@ index 5a8bbb8..5bc1de0 100644 1.8.1.6 -From 3423c3a34e42f14feeb11b5b6ad118ae202317e5 Mon Sep 17 00:00:00 2001 +From d7ec27990c479ef980236e7a20a40bb8f7be791a Mon Sep 17 00:00:00 2001 From: Joakim Plate Date: Thu, 5 Jul 2012 12:35:55 +0200 -Subject: [PATCH 054/136] X11: factor out code handling device reset +Subject: [PATCH 025/110] X11: factor out code handling device reset notification --- @@ -18341,10 +9721,10 @@ index e618268..c4d4b76 100644 1.8.1.6 -From 8c27a2f1921746ada6d896d3b2aaff684f7592ba Mon Sep 17 00:00:00 2001 +From 7a15d6da19afaa671225156f8364b289a78ad677 Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 15:02:00 +0200 -Subject: [PATCH 055/136] X11: move xrandr events to WinEventsX11 +Subject: [PATCH 026/110] X11: move xrandr events to WinEventsX11 --- xbmc/windowing/WinEventsX11.cpp | 42 +++++++++++++++++++++++++++++++++++++ @@ -18488,10 +9868,10 @@ index c5938af..9f74dd5 100644 1.8.1.6 -From 698851ff884e21eaa8bb8507f0a409a65c02541e Mon Sep 17 00:00:00 2001 +From c3f7dcc65a38d830f80937011e03aa936ab459a8 Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 12 Apr 2012 15:43:56 +0200 -Subject: [PATCH 056/136] xrandr: remove method RestoreState +Subject: [PATCH 027/110] xrandr: remove method RestoreState --- xbmc/windowing/X11/WinSystemX11.cpp | 13 +++++++++++-- @@ -18570,10 +9950,10 @@ index 0aec487..00b49dc 100644 1.8.1.6 -From 25150228eac582bf7c58a1ab8ff23c19b26bed94 Mon Sep 17 00:00:00 2001 +From 15e2791c6a56f086182134662fca12e2b6ce7bcc Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 20 May 2012 13:17:10 +0200 -Subject: [PATCH 057/136] xrandr: observe orientation +Subject: [PATCH 028/110] xrandr: observe orientation --- xbmc/windowing/X11/WinSystemX11.cpp | 89 ++++++++++++++++++++++++++++++------- @@ -18788,10 +10168,10 @@ index 00b49dc..508604d 100644 1.8.1.6 -From daca99e7b7078a1ad99d06a97317d7d4f7576c05 Mon Sep 17 00:00:00 2001 +From 4211de0e0358648ef50f9449c496757081b7671a Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 11:54:15 +0200 -Subject: [PATCH 058/136] xrandr: allow getting info for multiple screen's +Subject: [PATCH 029/110] xrandr: allow getting info for multiple screen's Refactored by: Joakim Plate --- @@ -18966,10 +10346,10 @@ index 508604d..d37838a 100644 1.8.1.6 -From 2ec9d0a9b0c843ac8b4f4de2482f29ce89441479 Mon Sep 17 00:00:00 2001 +From 752269938c1f15620b39d7473236252eaf8a9ebf Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 11:44:00 +0200 -Subject: [PATCH 059/136] X11: fix multi-head setups +Subject: [PATCH 030/110] X11: fix multi-head setups --- language/English/strings.po | 4 +- @@ -18984,7 +10364,7 @@ Subject: [PATCH 059/136] X11: fix multi-head setups 9 files changed, 229 insertions(+), 116 deletions(-) diff --git a/language/English/strings.po b/language/English/strings.po -index ba414f9..940dded 100644 +index fae2505..ce56914 100644 --- a/language/English/strings.po +++ b/language/English/strings.po @@ -999,7 +999,9 @@ msgctxt "#245" @@ -18999,10 +10379,10 @@ index ba414f9..940dded 100644 msgctxt "#247" msgid "Scripts" diff --git a/system/settings/settings.xml b/system/settings/settings.xml -index b3ab3d1..60135a1 100644 +index 56d637d..f99ba9c 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml -@@ -1841,6 +1841,15 @@ +@@ -1863,6 +1863,15 @@

@@ -19018,7 +10398,7 @@ index b3ab3d1..60135a1 100644 0 0 -@@ -1862,6 +1871,7 @@ +@@ -1884,6 +1893,7 @@ -1 @@ -19026,7 +10406,7 @@ index b3ab3d1..60135a1 100644 -@@ -1879,6 +1889,7 @@ +@@ -1901,6 +1911,7 @@ -1 @@ -19035,7 +10415,7 @@ index b3ab3d1..60135a1 100644 diff --git a/xbmc/rendering/gl/RenderSystemGL.h b/xbmc/rendering/gl/RenderSystemGL.h -index 662134d..292761a 100644 +index 4bd540b..f1e2c50 100644 --- a/xbmc/rendering/gl/RenderSystemGL.h +++ b/xbmc/rendering/gl/RenderSystemGL.h @@ -44,6 +44,7 @@ class CRenderSystemGL : public CRenderSystemBase @@ -19047,10 +10427,10 @@ index 662134d..292761a 100644 virtual void SetViewPort(CRect& viewPort); virtual void GetViewPort(CRect& viewPort); diff --git a/xbmc/settings/DisplaySettings.cpp b/xbmc/settings/DisplaySettings.cpp -index 032e752..cf5deba 100644 +index bf307f6..1a85651 100644 --- a/xbmc/settings/DisplaySettings.cpp +++ b/xbmc/settings/DisplaySettings.cpp -@@ -198,13 +198,19 @@ bool CDisplaySettings::OnSettingChanging(const CSetting *setting) +@@ -219,13 +219,19 @@ bool CDisplaySettings::OnSettingChanging(const CSetting *setting) const std::string &settingId = setting->GetId(); if (settingId == "videoscreen.resolution" || @@ -19071,7 +10451,7 @@ index 032e752..cf5deba 100644 string screenmode = GetStringFromResolution(newRes); CSettings::Get().SetString("videoscreen.screenmode", screenmode); -@@ -215,7 +221,11 @@ bool CDisplaySettings::OnSettingChanging(const CSetting *setting) +@@ -236,7 +242,11 @@ bool CDisplaySettings::OnSettingChanging(const CSetting *setting) RESOLUTION newRes = GetResolutionFromString(((CSettingString*)setting)->GetValue()); SetCurrentResolution(newRes, false); @@ -19084,7 +10464,7 @@ index 032e752..cf5deba 100644 // check if the old or the new resolution was/is windowed // in which case we don't show any prompt to the user -@@ -571,6 +581,10 @@ void CDisplaySettings::SettingOptionsScreensFiller(const CSetting *setting, std: +@@ -622,6 +632,10 @@ void CDisplaySettings::SettingOptionsScreensFiller(const CSetting *setting, std: if (g_advancedSettings.m_canWindowed) list.push_back(make_pair(g_localizeStrings.Get(242), DM_WINDOWED)); @@ -19095,7 +10475,7 @@ index 032e752..cf5deba 100644 for (int idx = 0; idx < g_Windowing.GetNumScreens(); idx++) { int screen = CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP + idx).iScreen; -@@ -585,6 +599,7 @@ void CDisplaySettings::SettingOptionsScreensFiller(const CSetting *setting, std: +@@ -636,6 +650,7 @@ void CDisplaySettings::SettingOptionsScreensFiller(const CSetting *setting, std: RESOLUTION_INFO resInfo = CDisplaySettings::Get().GetResolutionInfo(res); current = resInfo.iScreen; } @@ -19103,9 +10483,9 @@ index 032e752..cf5deba 100644 } void CDisplaySettings::SettingOptionsVerticalSyncsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t) -@@ -596,3 +611,28 @@ void CDisplaySettings::SettingOptionsVerticalSyncsFiller(const CSetting *setting - list.push_back(make_pair(g_localizeStrings.Get(13107), VSYNC_VIDEO)); - list.push_back(make_pair(g_localizeStrings.Get(13108), VSYNC_ALWAYS)); +@@ -663,3 +678,28 @@ void CDisplaySettings::SettingOptionsPreferredStereoscopicViewModesFiller(const + SettingOptionsStereoscopicModesFiller(setting, list, current); + list.push_back(make_pair(g_localizeStrings.Get(36525), RENDER_STEREO_MODE_AUTO)); // option for autodetect } + +void CDisplaySettings::SettingOptionsMonitorsFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t) @@ -19133,7 +10513,7 @@ index 032e752..cf5deba 100644 + } +} diff --git a/xbmc/settings/DisplaySettings.h b/xbmc/settings/DisplaySettings.h -index 4540a34..618a644 100644 +index cc4002b..d80f1dc 100644 --- a/xbmc/settings/DisplaySettings.h +++ b/xbmc/settings/DisplaySettings.h @@ -78,6 +78,7 @@ class CDisplaySettings : public ISettingCallback, public ISubSettings, @@ -19144,35 +10524,35 @@ index 4540a34..618a644 100644 float GetZoomAmount() const { return m_zoomAmount; } void SetZoomAmount(float zoomAmount) { m_zoomAmount = zoomAmount; } -@@ -93,6 +94,7 @@ class CDisplaySettings : public ISettingCallback, public ISubSettings, - static void SettingOptionsResolutionsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t); - static void SettingOptionsScreensFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t); +@@ -95,6 +96,7 @@ class CDisplaySettings : public ISettingCallback, public ISubSettings, static void SettingOptionsVerticalSyncsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t); + static void SettingOptionsStereoscopicModesFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t); + static void SettingOptionsPreferredStereoscopicViewModesFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t); + static void SettingOptionsMonitorsFiller(const CSetting *setting, std::vector< std::pair > &list, std::string ¤t); protected: CDisplaySettings(); diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp -index 3f7dfaf..42a1363 100644 +index c1d6443..1de1ac6 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp -@@ -374,6 +374,7 @@ void CSettings::Uninitialize() - m_settingsManager->UnregisterSettingOptionsFiller("rendermethods"); - m_settingsManager->UnregisterSettingOptionsFiller("resolutions"); +@@ -381,6 +381,7 @@ void CSettings::Uninitialize() m_settingsManager->UnregisterSettingOptionsFiller("screens"); + m_settingsManager->UnregisterSettingOptionsFiller("stereoscopicmodes"); + m_settingsManager->UnregisterSettingOptionsFiller("preferedstereoscopicviewmodes"); + m_settingsManager->UnregisterSettingOptionsFiller("monitors"); m_settingsManager->UnregisterSettingOptionsFiller("shutdownstates"); m_settingsManager->UnregisterSettingOptionsFiller("startupwindows"); m_settingsManager->UnregisterSettingOptionsFiller("streamlanguages"); -@@ -677,6 +678,7 @@ void CSettings::InitializeOptionFillers() - m_settingsManager->RegisterSettingOptionsFiller("rendermethods", CBaseRenderer::SettingOptionsRenderMethodsFiller); - m_settingsManager->RegisterSettingOptionsFiller("resolutions", CDisplaySettings::SettingOptionsResolutionsFiller); +@@ -688,6 +689,7 @@ void CSettings::InitializeOptionFillers() m_settingsManager->RegisterSettingOptionsFiller("screens", CDisplaySettings::SettingOptionsScreensFiller); + m_settingsManager->RegisterSettingOptionsFiller("stereoscopicmodes", CDisplaySettings::SettingOptionsStereoscopicModesFiller); + m_settingsManager->RegisterSettingOptionsFiller("preferedstereoscopicviewmodes", CDisplaySettings::SettingOptionsPreferredStereoscopicViewModesFiller); + m_settingsManager->RegisterSettingOptionsFiller("monitors", CDisplaySettings::SettingOptionsMonitorsFiller); m_settingsManager->RegisterSettingOptionsFiller("shutdownstates", CPowerManager::SettingOptionsShutdownStatesFiller); m_settingsManager->RegisterSettingOptionsFiller("startupwindows", ADDON::CSkinInfo::SettingOptionsStartupWindowsFiller); m_settingsManager->RegisterSettingOptionsFiller("streamlanguages", CLangInfo::SettingOptionsStreamLanguagesFiller); -@@ -704,6 +706,9 @@ void CSettings::InitializeConditions() +@@ -715,6 +717,9 @@ void CSettings::InitializeConditions() #ifdef HAS_GL m_settingsManager->AddCondition("has_gl"); #endif @@ -19182,7 +10562,7 @@ index 3f7dfaf..42a1363 100644 #ifdef HAS_GLES m_settingsManager->AddCondition("has_gles"); #endif -@@ -843,6 +848,7 @@ void CSettings::InitializeISettingCallbacks() +@@ -857,6 +862,7 @@ void CSettings::InitializeISettingCallbacks() settingSet.insert("videoscreen.screen"); settingSet.insert("videoscreen.resolution"); settingSet.insert("videoscreen.screenmode"); @@ -19738,10 +11118,10 @@ index 0727bb9..b1eb278 100644 1.8.1.6 -From d425584dff1c7740e6a4608cb199703fb0fb5bcf Mon Sep 17 00:00:00 2001 +From 9626121cde1743a8d2ef2d51cf92592523ab8b7b Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 11:36:32 +0200 -Subject: [PATCH 060/136] X11: remove all DefaultScreen and RootWindow macros +Subject: [PATCH 031/110] X11: remove all DefaultScreen and RootWindow macros --- xbmc/windowing/X11/WinSystemX11.cpp | 6 +++--- @@ -19809,10 +11189,10 @@ index 095012f..60a6878 100644 1.8.1.6 -From 2a854ad8f557b07417803aadf1bef203805ec25b Mon Sep 17 00:00:00 2001 +From 5d281408e8eb37184e44c1f6aebf3dea09c9b952 Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 11:45:22 +0200 -Subject: [PATCH 061/136] X11: remove all DefaultScreen and RootWindow macros +Subject: [PATCH 032/110] X11: remove all DefaultScreen and RootWindow macros (VideoRefClock) Note this is on a separate display connection. @@ -19884,10 +11264,10 @@ index 5bf3656..0b9e7b3 100644 1.8.1.6 -From 6e45c9935e11576ed87be25bfcddeb20de52965f Mon Sep 17 00:00:00 2001 +From 583087348aa3e019f13df994090cadc7dd1bfbf3 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 20 Jun 2012 17:37:11 +0200 -Subject: [PATCH 062/136] X11: recreate gl context after output has changed +Subject: [PATCH 033/110] X11: recreate gl context after output has changed --- xbmc/windowing/X11/WinSystemX11.cpp | 24 ++++++++++++++---------- @@ -20038,10 +11418,10 @@ index 60a6878..d6ba80a 100644 1.8.1.6 -From ea23b4d9befee933789c1fa1b5075a1a3a823bbe Mon Sep 17 00:00:00 2001 +From fe9ee4c66e08f11d514b94d61b0fc0585626796e Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 12:06:25 +0200 -Subject: [PATCH 063/136] X11: hook video reference clock in windowing +Subject: [PATCH 034/110] X11: hook video reference clock in windowing --- xbmc/video/VideoReferenceClock.cpp | 71 +++++++++++++++++++++++++++----------- @@ -20246,10 +11626,10 @@ index dd65a1b..afd71fc 100644 1.8.1.6 -From 329948c02c86f251c1cb62c02dee4b9e0138d0b2 Mon Sep 17 00:00:00 2001 +From 7cd90575e2e7ba0cba25f8882828a03eedd3fa9a Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 21 Jun 2012 17:26:51 +0200 -Subject: [PATCH 064/136] X11: fix video calibrations +Subject: [PATCH 035/110] X11: fix video calibrations --- xbmc/windowing/WinSystem.h | 1 + @@ -20258,7 +11638,7 @@ Subject: [PATCH 064/136] X11: fix video calibrations 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/xbmc/windowing/WinSystem.h b/xbmc/windowing/WinSystem.h -index 3500a8d..0e309f9 100644 +index fc467f1..608b1e1 100644 --- a/xbmc/windowing/WinSystem.h +++ b/xbmc/windowing/WinSystem.h @@ -103,6 +103,7 @@ class CWinSystemBase @@ -20341,10 +11721,10 @@ index 05aa60e..95672d1 100644 1.8.1.6 -From e29ff8d63cd564e8a04456ed46a66f9791768f60 Mon Sep 17 00:00:00 2001 +From 53d7b5b81553e08dd98c6bd8b7fa47b2407e3eb6 Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 12:00:26 +0200 -Subject: [PATCH 065/136] X11: deactivate screen saver on startup +Subject: [PATCH 036/110] X11: deactivate screen saver on startup --- xbmc/windowing/X11/WinSystemX11.cpp | 29 +++++++++++++++++++++++++++++ @@ -20414,10 +11794,10 @@ index 95672d1..51ac314 100644 1.8.1.6 -From 921bc0eb36b61dd20cbc0c73f64b1d57de7e2d76 Mon Sep 17 00:00:00 2001 +From b5864a4dc3b1c84fddb4d9f2bbaf51fc365c51af Mon Sep 17 00:00:00 2001 From: FernetMenta Date: Thu, 5 Jul 2012 12:10:09 +0200 -Subject: [PATCH 066/136] X11: change method of going full-screen +Subject: [PATCH 037/110] X11: change method of going full-screen --- xbmc/windowing/X11/WinSystemX11.cpp | 9 ++++++++- @@ -20461,10 +11841,10 @@ index 14a4307..66b91fd 100644 1.8.1.6 -From ae3d417b4be9fa2d650305d77ca5809226d01922 Mon Sep 17 00:00:00 2001 +From c815c5039786c0edfb5a008346f6400be5e8ec29 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 28 Jun 2012 19:12:39 +0200 -Subject: [PATCH 067/136] X11: reset key repeat and key modifier on focus lost +Subject: [PATCH 038/110] X11: reset key repeat and key modifier on focus lost and gain --- @@ -20496,10 +11876,10 @@ index c58067b..c9f8a20 100644 1.8.1.6 -From 0803e7aa355c5e8a5ec2985b8c052d7731259a70 Mon Sep 17 00:00:00 2001 +From 18d3da75416f79bb9482c79d00a8449105690bea Mon Sep 17 00:00:00 2001 From: Joakim Plate Date: Thu, 5 Jul 2012 14:18:46 +0200 -Subject: [PATCH 068/136] X11: replace custom utf8 to unicode with charset +Subject: [PATCH 039/110] X11: replace custom utf8 to unicode with charset convertor (squash to x11 events) --- @@ -20716,10 +12096,10 @@ index 6100933..72955ad 100644 1.8.1.6 -From e5ed6062126c8af426a27e85aaacf2f9f40fe246 Mon Sep 17 00:00:00 2001 +From 7de91f91cb2686e468206bd646d303ce65fe8b98 Mon Sep 17 00:00:00 2001 From: Joakim Plate Date: Thu, 5 Jul 2012 14:23:54 +0200 -Subject: [PATCH 069/136] X11: fixed invalid usage of sizeof() (squash into x11 +Subject: [PATCH 040/110] X11: fixed invalid usage of sizeof() (squash into x11 changes) --- @@ -20783,10 +12163,10 @@ index 72955ad..102a076 100644 1.8.1.6 -From 3cea9e4151c7aab9d885a52553b920a829fbf618 Mon Sep 17 00:00:00 2001 +From 81b0fe7a671d9c366eae577e4be00f52d3d9c435 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 9 Jun 2012 18:23:53 +0200 -Subject: [PATCH 070/136] add missing keys to xbmc keytable +Subject: [PATCH 041/110] add missing keys to xbmc keytable --- xbmc/input/XBMC_keytable.cpp | 2 ++ @@ -20809,10 +12189,10 @@ index b430f55..246164b 100644 1.8.1.6 -From 69be70d8245123c599ff08b2fd34077dedfd4fc4 Mon Sep 17 00:00:00 2001 +From a610a6c24039fb885956894fbcfd19b3b35df3db Mon Sep 17 00:00:00 2001 From: xbmc Date: Fri, 16 Mar 2012 15:57:51 +0100 -Subject: [PATCH 071/136] videorefclock: temp deactivate of nv settings +Subject: [PATCH 042/110] videorefclock: temp deactivate of nv settings --- xbmc/video/VideoReferenceClock.cpp | 2 +- @@ -20835,10 +12215,10 @@ index 3bd8133..59f924c 100644 1.8.1.6 -From 9df52bfe9977127883d9402fdc38801370c45d32 Mon Sep 17 00:00:00 2001 +From 1492ea88c9b9659d8e0345fd8d18580cb9ceb259 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 20 Aug 2012 09:09:09 +0200 -Subject: [PATCH 072/136] videorefclock: ask graphics context for refresh rate +Subject: [PATCH 043/110] videorefclock: ask graphics context for refresh rate --- xbmc/video/VideoReferenceClock.cpp | 3 ++- @@ -20869,10 +12249,10 @@ index 59f924c..2f8bc69 100644 1.8.1.6 -From d98805eb590a6288109e4a57195d72170f0ce8c0 Mon Sep 17 00:00:00 2001 +From df1cfeff10a2e8e766925da2f60bf06f635da404 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 9 Jul 2012 14:00:18 +0200 -Subject: [PATCH 073/136] X11: fix icon texture after +Subject: [PATCH 044/110] X11: fix icon texture after cc5ed3c2474084ebc0373a3046410e6f766e03f4 --- @@ -20980,10 +12360,10 @@ index 66b91fd..b00eddc 100644 1.8.1.6 -From 6cac4892fb21d6e57c746d7a1e283a52d79af39f Mon Sep 17 00:00:00 2001 +From 33a8571e84fb01fd33a6cb3ae72b6feaf23d6776 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 10 Jul 2012 11:14:12 +0200 -Subject: [PATCH 074/136] X11: check for window manager +Subject: [PATCH 045/110] X11: check for window manager --- xbmc/windowing/X11/WinSystemX11.cpp | 74 ++++++++++++++++++++++++++++++++++++- @@ -21104,10 +12484,10 @@ index 51ac314..ce3c289 100644 1.8.1.6 -From 098d70d4fad6852652aa95a2609255b278aa1e3c Mon Sep 17 00:00:00 2001 +From 12c401980ef933b8f8c1cba6b7eee11118ca48d3 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 12 Jul 2012 11:11:47 +0200 -Subject: [PATCH 075/136] X11: dont set window on xrandr if no mode available +Subject: [PATCH 046/110] X11: dont set window on xrandr if no mode available --- xbmc/windowing/X11/WinSystemX11.cpp | 11 ++++++----- @@ -21144,10 +12524,10 @@ index 05279ad..9697cbb 100644 1.8.1.6 -From e1389a1e33971decac7a919457b8dd67252e4535 Mon Sep 17 00:00:00 2001 +From ca53c5cdd2b3b9067f750cd47f1789e00f1436c6 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 26 Jul 2012 09:34:28 +0200 -Subject: [PATCH 076/136] X11: fix crash after a resolution change on startup +Subject: [PATCH 047/110] X11: fix crash after a resolution change on startup --- xbmc/windowing/X11/WinSystemX11.cpp | 3 ++- @@ -21171,10 +12551,10 @@ index 9697cbb..868071c 100644 1.8.1.6 -From d49dd6375898d0775205b0954fd9ed9ebc0e3ec8 Mon Sep 17 00:00:00 2001 +From a2a2730899584fdfe5c8eb9888076941cb9502e8 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 15 Sep 2012 18:27:29 +0200 -Subject: [PATCH 077/136] X11: lock graphics context in NotifyXRREvent +Subject: [PATCH 048/110] X11: lock graphics context in NotifyXRREvent --- xbmc/windowing/X11/WinSystemX11.cpp | 2 ++ @@ -21197,10 +12577,10 @@ index 868071c..9ff947c 100644 1.8.1.6 -From 4f3fad4a542e166e557a34c27ae333478f9ff613 Mon Sep 17 00:00:00 2001 +From 8b0a7d7533a3b77e5673b31f5b0493aeb0718b0a Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sat, 8 Oct 2011 16:45:13 +0200 -Subject: [PATCH 078/136] ffmpeg: add xvba hwaccel +Subject: [PATCH 049/110] ffmpeg: add xvba hwaccel --- lib/ffmpeg/configure | 11 ++ @@ -21372,7 +12752,7 @@ index 584446f..7a8f61c 100644 /* video codecs */ REGISTER_ENCODER(A64MULTI, a64multi); diff --git a/lib/ffmpeg/libavcodec/h264.c b/lib/ffmpeg/libavcodec/h264.c -index 937ad7a..299039f 100644 +index 85f2372..02d0a26 100644 --- a/lib/ffmpeg/libavcodec/h264.c +++ b/lib/ffmpeg/libavcodec/h264.c @@ -81,6 +81,9 @@ @@ -22049,33 +13429,33 @@ index 1c00ac4..6437e29 100644 1.8.1.6 -From db45b1127b0b81ff013e4f03b8938b3076fef306 Mon Sep 17 00:00:00 2001 +From 6e42c0d587b54da3ea6af2afab48f8b5d50457c8 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 12 Apr 2012 12:09:31 +0200 -Subject: [PATCH 079/136] xvba: add decoder +Subject: [PATCH 050/110] xvba: add decoder --- configure.in | 47 + - language/English/strings.po | 12 +- + language/English/strings.po | 13 +- system/settings/settings.xml | 5 + xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 218 +- xbmc/cores/VideoRenderers/LinuxRendererGL.h | 15 +- xbmc/cores/VideoRenderers/RenderFormats.h | 1 + - xbmc/cores/VideoRenderers/RenderManager.cpp | 4 + + xbmc/cores/VideoRenderers/RenderManager.cpp | 8 +- .../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h | 4 + .../DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 16 + - xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in | 3 + + xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in | 4 + xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp | 2367 ++++++++++++++++++++ xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h | 383 ++++ xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 1 + xbmc/settings/VideoSettings.h | 2 + xbmc/video/dialogs/GUIDialogVideoSettings.cpp | 1 + - 15 files changed, 3071 insertions(+), 8 deletions(-) + 15 files changed, 3076 insertions(+), 9 deletions(-) create mode 100644 xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp create mode 100644 xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h diff --git a/configure.in b/configure.in -index bd2934d..94f6455 100644 +index d63d13d..e145d43 100644 --- a/configure.in +++ b/configure.in @@ -143,6 +143,8 @@ vaapi_not_found="== Could not find libva. VAAPI support disabled. ==" @@ -22138,7 +13518,7 @@ index bd2934d..94f6455 100644 # VTBDecoder if test "x$use_vtbdecoder" != "xno"; then if test "$host_vendor" = "apple" ; then -@@ -1977,6 +2016,12 @@ else +@@ -1982,6 +2021,12 @@ else final_message="$final_message\n CrystalHD:\tNo" fi @@ -22151,7 +13531,7 @@ index bd2934d..94f6455 100644 if test "x$use_vtbdecoder" != "xno"; then final_message="$final_message\n VTBDecoder:\tYes" else -@@ -2447,6 +2492,7 @@ AC_SUBST(USE_OPENGLES) +@@ -2452,6 +2497,7 @@ AC_SUBST(USE_OPENGLES) AC_SUBST(USE_VDPAU) AC_SUBST(USE_VAAPI) AC_SUBST(USE_CRYSTALHD) @@ -22159,7 +13539,7 @@ index bd2934d..94f6455 100644 AC_SUBST(USE_LIBSMBCLIENT) AC_SUBST(USE_LIBNFS) AC_SUBST(USE_LIBAFPCLIENT) -@@ -2631,6 +2677,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ +@@ -2636,6 +2682,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ `if test "x$use_vdpau" != "xno"; then echo --enable-vdpau; else echo --disable-vdpau; fi` \ `if test "x$use_vaapi" != "xno"; then echo --enable-vaapi; else echo --disable-vaapi; fi` \ `if test "$use_optimizations" != "no"; then echo --enable-optimizations; else echo --disable-optimizations; fi` \ @@ -22168,23 +13548,24 @@ index bd2934d..94f6455 100644 --enable-pthreads \ --enable-runtime-cpudetect \ diff --git a/language/English/strings.po b/language/English/strings.po -index 940dded..1fdf542 100644 +index ce56914..fc1f5ec4d 100644 --- a/language/English/strings.po +++ b/language/English/strings.po -@@ -5776,7 +5776,11 @@ msgctxt "#13436" +@@ -5782,7 +5782,12 @@ msgctxt "#13437" msgid "Prefer VDPAU Video Mixer" msgstr "" --#empty strings from id 13437 to 13499 -+msgctxt "#13437" +-#empty strings from id 13438 to 13499 ++#: system/settings/settings.xml ++msgctxt "#13438" +msgid "Allow hardware acceleration (XVBA)" +msgstr "" + -+#empty strings from id 13438 to 13499 ++#empty strings from id 13439 to 13499 #: system/settings/settings.xml msgctxt "#13500" -@@ -6854,7 +6858,11 @@ msgctxt "#16325" +@@ -6860,7 +6865,11 @@ msgctxt "#16325" msgid "VDPAU - Bob" msgstr "" @@ -22198,23 +13579,23 @@ index 940dded..1fdf542 100644 msgctxt "#16400" msgid "Post-processing" diff --git a/system/settings/settings.xml b/system/settings/settings.xml -index 60135a1..4655d59 100644 +index f99ba9c..ac87a69 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -410,6 +410,11 @@ 2 true -+ ++ + HAVE_LIBXVBA + 2 + true -+ - - HAS_GL - 4 ++ + + HAVE_LIBSTAGEFRIGHTDECODER + 2 diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index c072f5e..73a8cc8 100644 +index 6807df7..b2beb2e 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp @@ -65,6 +65,9 @@ @@ -22237,7 +13618,7 @@ index c072f5e..73a8cc8 100644 } CLinuxRendererGL::YUVBUFFER::~YUVBUFFER() -@@ -600,12 +606,15 @@ void CLinuxRendererGL::Flush() +@@ -621,12 +627,15 @@ void CLinuxRendererGL::Flush() void CLinuxRendererGL::ReleaseBuffer(int idx) { @@ -22254,7 +13635,7 @@ index c072f5e..73a8cc8 100644 #ifdef HAVE_LIBVA buf.vaapi.surface.reset(); #endif -@@ -871,7 +880,7 @@ void CLinuxRendererGL::UpdateVideoFilter() +@@ -892,7 +901,7 @@ void CLinuxRendererGL::UpdateVideoFilter() case VS_SCALINGMETHOD_LINEAR: SetTextureFilter(m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR); m_renderQuality = RQ_SINGLEPASS; @@ -22263,7 +13644,7 @@ index c072f5e..73a8cc8 100644 { m_pVideoFilterShader = new StretchFilterShader(); if (!m_pVideoFilterShader->CompileAndLink()) -@@ -957,6 +966,11 @@ void CLinuxRendererGL::LoadShaders(int field) +@@ -978,6 +987,11 @@ void CLinuxRendererGL::LoadShaders(int field) CLog::Log(LOGNOTICE, "GL: Using CVBREF render method"); m_renderMethod = RENDER_CVREF; } @@ -22275,7 +13656,7 @@ index c072f5e..73a8cc8 100644 else { int requestedMethod = CSettings::Get().GetInt("videoplayer.rendermethod"); -@@ -1105,6 +1119,12 @@ void CLinuxRendererGL::LoadShaders(int field) +@@ -1126,6 +1140,12 @@ void CLinuxRendererGL::LoadShaders(int field) m_textureCreate = &CLinuxRendererGL::CreateCVRefTexture; m_textureDelete = &CLinuxRendererGL::DeleteCVRefTexture; } @@ -22288,7 +13669,7 @@ index c072f5e..73a8cc8 100644 else { // setup default YV12 texture handlers -@@ -1217,6 +1237,13 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1238,6 +1258,13 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) RenderVAAPI(renderBuffer, m_currentField); } #endif @@ -22302,7 +13683,7 @@ index c072f5e..73a8cc8 100644 else { // RENDER_CVREF uses the same render as the default case -@@ -1733,6 +1760,77 @@ void CLinuxRendererGL::RenderVAAPI(int index, int field) +@@ -1762,6 +1789,77 @@ void CLinuxRendererGL::RenderVAAPI(int index, int field) #endif } @@ -22354,17 +13735,17 @@ index c072f5e..73a8cc8 100644 + glBegin(GL_QUADS); + if (m_textureTarget==GL_TEXTURE_2D) + { -+ glTexCoord2f(plane.rect.x1, plane.rect.y1); glVertex2f(m_destRect.x1, m_destRect.y1); -+ glTexCoord2f(plane.rect.x2, plane.rect.y1); glVertex2f(m_destRect.x2, m_destRect.y1); -+ glTexCoord2f(plane.rect.x2, plane.rect.y2); glVertex2f(m_destRect.x2, m_destRect.y2); -+ glTexCoord2f(plane.rect.x1, plane.rect.y2); glVertex2f(m_destRect.x1, m_destRect.y2); ++ glTexCoord2f(plane.rect.x1, plane.rect.y1); glVertex2f(m_rotatedDestCoords[0].x, m_rotatedDestCoords[0].y); ++ glTexCoord2f(plane.rect.x2, plane.rect.y1); glVertex2f(m_rotatedDestCoords[1].x, m_rotatedDestCoords[1].y); ++ glTexCoord2f(plane.rect.x2, plane.rect.y2); glVertex2f(m_rotatedDestCoords[2].x, m_rotatedDestCoords[2].y); ++ glTexCoord2f(plane.rect.x1, plane.rect.y2); glVertex2f(m_rotatedDestCoords[3].x, m_rotatedDestCoords[3].y); + } + else + { -+ glTexCoord2f(m_destRect.x1, m_destRect.y1); glVertex4f(m_destRect.x1, m_destRect.y1, 0.0f, 0.0f); -+ glTexCoord2f(m_destRect.x2, m_destRect.y1); glVertex4f(m_destRect.x2, m_destRect.y1, 1.0f, 0.0f); -+ glTexCoord2f(m_destRect.x2, m_destRect.y2); glVertex4f(m_destRect.x2, m_destRect.y2, 1.0f, 1.0f); -+ glTexCoord2f(m_destRect.x1, m_destRect.y2); glVertex4f(m_destRect.x1, m_destRect.y2, 0.0f, 1.0f); ++ glTexCoord2f(m_rotatedDestCoords[0].x, m_rotatedDestCoords[0].y); glVertex4f(m_rotatedDestCoords[0].x, m_rotatedDestCoords[0].y, 0.0f, 0.0f); ++ glTexCoord2f(m_rotatedDestCoords[1].x, m_rotatedDestCoords[1].y); glVertex4f(m_rotatedDestCoords[1].x, m_rotatedDestCoords[1].y, 1.0f, 0.0f); ++ glTexCoord2f(m_rotatedDestCoords[2].x, m_rotatedDestCoords[2].y); glVertex4f(m_rotatedDestCoords[2].x, m_rotatedDestCoords[2].y, 1.0f, 1.0f); ++ glTexCoord2f(m_rotatedDestCoords[3].x, m_rotatedDestCoords[3].y); glVertex4f(m_rotatedDestCoords[3].x, m_rotatedDestCoords[3].y, 0.0f, 1.0f); + } + glEnd(); + VerifyGLState(); @@ -22380,7 +13761,7 @@ index c072f5e..73a8cc8 100644 void CLinuxRendererGL::RenderSoftware(int index, int field) { // used for textues uploaded from rgba or CVPixelBuffers. -@@ -2766,6 +2864,88 @@ bool CLinuxRendererGL::CreateCVRefTexture(int index) +@@ -2820,6 +2918,88 @@ bool CLinuxRendererGL::CreateCVRefTexture(int index) return true; } @@ -22469,7 +13850,7 @@ index c072f5e..73a8cc8 100644 void CLinuxRendererGL::UploadYUV422PackedTexture(int source) { YUVBUFFER& buf = m_buffers[source]; -@@ -3340,6 +3520,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3394,6 +3574,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) if (m_renderMethod & RENDER_VAAPI) return false; @@ -22479,7 +13860,7 @@ index c072f5e..73a8cc8 100644 return (m_renderMethod & RENDER_GLSL) || (m_renderMethod & RENDER_ARB) || ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE); -@@ -3353,6 +3536,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3407,6 +3590,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) if (m_renderMethod & RENDER_VAAPI) return false; @@ -22489,7 +13870,7 @@ index c072f5e..73a8cc8 100644 return (m_renderMethod & RENDER_GLSL) || (m_renderMethod & RENDER_ARB) || ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE); -@@ -3376,7 +3562,8 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) +@@ -3430,7 +3616,8 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) if (feature == RENDERFEATURE_NONLINSTRETCH) { if (((m_renderMethod & RENDER_GLSL) && !(m_renderMethod & RENDER_POT)) || @@ -22499,7 +13880,7 @@ index c072f5e..73a8cc8 100644 return true; } -@@ -3448,6 +3635,16 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method) +@@ -3502,6 +3689,16 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method) return false; } @@ -22516,7 +13897,7 @@ index c072f5e..73a8cc8 100644 #ifdef TARGET_DARWIN // YADIF too slow for HD but we have no methods to fall back // to something that works so just turn it off. -@@ -3497,7 +3694,7 @@ bool CLinuxRendererGL::Supports(ESCALINGMETHOD method) +@@ -3551,7 +3748,7 @@ bool CLinuxRendererGL::Supports(ESCALINGMETHOD method) return false; if ((glewIsSupported("GL_EXT_framebuffer_object") && (m_renderMethod & RENDER_GLSL)) || @@ -22525,7 +13906,7 @@ index c072f5e..73a8cc8 100644 { // spline36 and lanczos3 are only allowed through advancedsettings.xml if(method != VS_SCALINGMETHOD_SPLINE36 -@@ -3564,7 +3761,8 @@ unsigned int CLinuxRendererGL::GetProcessorSize() +@@ -3618,7 +3815,8 @@ unsigned int CLinuxRendererGL::GetProcessorSize() if(m_format == RENDER_FMT_VDPAU || m_format == RENDER_FMT_VDPAU_420 || m_format == RENDER_FMT_VAAPI @@ -22535,7 +13916,7 @@ index c072f5e..73a8cc8 100644 return 1; else return 0; -@@ -3620,4 +3818,14 @@ void CLinuxRendererGL::AddProcessor(struct __CVBuffer *cvBufferRef, int index) +@@ -3674,4 +3872,14 @@ void CLinuxRendererGL::AddProcessor(struct __CVBuffer *cvBufferRef, int index) } #endif @@ -22551,7 +13932,7 @@ index c072f5e..73a8cc8 100644 + #endif diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h -index 274f980..958a06c 100644 +index 258a598..6fa1dbc 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h @@ -44,6 +44,8 @@ @@ -22612,34 +13993,42 @@ index 274f980..958a06c 100644 typedef YUVBUFFER YUVBUFFERS[NUM_BUFFERS]; diff --git a/xbmc/cores/VideoRenderers/RenderFormats.h b/xbmc/cores/VideoRenderers/RenderFormats.h -index 9ad1671..cfa4726 100644 +index 3b09194..b193c24 100644 --- a/xbmc/cores/VideoRenderers/RenderFormats.h +++ b/xbmc/cores/VideoRenderers/RenderFormats.h -@@ -35,6 +35,7 @@ enum ERenderFormat { - RENDER_FMT_OMXEGL, +@@ -36,6 +36,7 @@ enum ERenderFormat { RENDER_FMT_CVBREF, RENDER_FMT_BYPASS, + RENDER_FMT_EGLIMG, + RENDER_FMT_XVBA, }; #endif diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 5b08c1e..7e12a46 100644 +index a1c2fc7..5056100 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp -@@ -941,6 +941,10 @@ int CXBMCRenderManager::AddVideoPicture(DVDVideoPicture& pic) +@@ -941,11 +941,17 @@ int CXBMCRenderManager::AddVideoPicture(DVDVideoPicture& pic) else if(pic.format == RENDER_FMT_VAAPI) m_pRenderer->AddProcessor(*pic.vaapi, index); #endif +-#ifdef HAS_LIBSTAGEFRIGHT ++ ++ #ifdef HAS_LIBSTAGEFRIGHT + else if(pic.format == RENDER_FMT_EGLIMG) + m_pRenderer->AddProcessor(pic.stf, pic.eglimg, index); + #endif + +#ifdef HAVE_LIBXVBA + else if(pic.format == RENDER_FMT_XVBA) + m_pRenderer->AddProcessor(pic.xvba, index); +#endif ++ m_pRenderer->ReleaseImage(index, false); return index; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h -index 43befb4..46369c7 100644 +index 0dd29c3..b346d26 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h @@ -35,6 +35,7 @@ @@ -22650,7 +14039,7 @@ index 43befb4..46369c7 100644 class COpenMax; class COpenMaxVideo; struct OpenMaxVideoBuffer; -@@ -60,6 +61,9 @@ struct DVDVideoPicture +@@ -62,6 +63,9 @@ struct DVDVideoPicture struct { VAAPI::CHolder* vaapi; }; @@ -22661,7 +14050,7 @@ index 43befb4..46369c7 100644 struct { COpenMax *openMax; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp -index e133d78..6dabb25 100644 +index aa2d1e4..cd48f4e 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -60,6 +60,9 @@ @@ -22695,19 +14084,20 @@ index e133d78..6dabb25 100644 // mpeg4 vaapi decoding is disabled if(*cur == PIX_FMT_VAAPI_VLD && CSettings::Get().GetBool("videoplayer.usevaapi") diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in b/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in -index 979e3ce..cacc876 100644 +index 86b0a89..7bc4065 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in -@@ -22,6 +22,9 @@ SRCS += OpenMax.cpp - SRCS += OpenMaxVideo.cpp - SRCS += DVDVideoCodecOpenMax.cpp +@@ -34,6 +34,10 @@ INCLUDES += -I${prefix}/opt/android-source/system/core/include + INCLUDES += -I${prefix}/opt/android-source/libhardware/include endif + +ifeq (@USE_XVBA@,1) +SRCS += XVBA.cpp +endif - ++ ifeq (@USE_LIBAMCODEC@,1) SRCS += AMLCodec.cpp + SRCS += DVDVideoCodecAmlogic.cpp diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp new file mode 100644 index 0000000..43a331f @@ -25471,19 +16861,19 @@ index 0000000..3bd0cea + +} diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 9dc5cd6..b18cc79 100644 +index 21d023e..f35419f 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -1017,6 +1017,7 @@ static std::string GetRenderFormatName(ERenderFormat format) - case RENDER_FMT_OMXEGL: return "OMXEGL"; +@@ -1019,6 +1019,7 @@ static std::string GetRenderFormatName(ERenderFormat format) case RENDER_FMT_CVBREF: return "BGRA"; + case RENDER_FMT_EGLIMG: return "EGLIMG"; case RENDER_FMT_BYPASS: return "BYPASS"; + case RENDER_FMT_XVBA: return "XVBA"; case RENDER_FMT_NONE: return "NONE"; } return "UNKNOWN"; diff --git a/xbmc/settings/VideoSettings.h b/xbmc/settings/VideoSettings.h -index 0de785d..f3fed5d 100644 +index 293f363..3db70fb 100644 --- a/xbmc/settings/VideoSettings.h +++ b/xbmc/settings/VideoSettings.h @@ -63,6 +63,8 @@ enum EINTERLACEMETHOD @@ -25496,10 +16886,10 @@ index 0de785d..f3fed5d 100644 }; diff --git a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp -index 2bad710..2146e9b 100644 +index 8f30248..db58075 100644 --- a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp -@@ -111,6 +111,7 @@ void CGUIDialogVideoSettings::CreateSettings() +@@ -115,6 +115,7 @@ void CGUIDialogVideoSettings::CreateSettings() entries.push_back(make_pair(VS_INTERLACEMETHOD_DXVA_BOB , 16320)); entries.push_back(make_pair(VS_INTERLACEMETHOD_DXVA_BEST , 16321)); entries.push_back(make_pair(VS_INTERLACEMETHOD_AUTO_ION , 16325)); @@ -25511,10 +16901,10 @@ index 2bad710..2146e9b 100644 1.8.1.6 -From a0188b0aa26af315b65cad2f4ca5ba979298330f Mon Sep 17 00:00:00 2001 +From 21b33a37ba677c4b62a15cb02182b44c542b7613 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sun, 4 Nov 2012 16:24:10 +0100 -Subject: [PATCH 080/136] xvba: add string for available decoders - we are +Subject: [PATCH 051/110] xvba: add string for available decoders - we are important so make sure we are there --- @@ -25522,10 +16912,10 @@ Subject: [PATCH 080/136] xvba: add string for available decoders - we are 1 file changed, 5 insertions(+) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp -index 022c613..a9ce269 100644 +index ab3696e..329b6f0 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp -@@ -177,6 +177,11 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, unsigne +@@ -183,6 +183,11 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, unsigne #elif defined(TARGET_POSIX) && !defined(TARGET_DARWIN) hwSupport += "VAAPI:no "; #endif @@ -25541,17 +16931,17 @@ index 022c613..a9ce269 100644 1.8.1.6 -From f7f273c95dc1e31e8f141a73e102494b61d61a18 Mon Sep 17 00:00:00 2001 +From 6bbda006ed9e8b2503d69908e571391fbff90532 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 16 Jun 2012 12:46:30 +0200 -Subject: [PATCH 081/136] xvba: do not use vaapi if xvba is present +Subject: [PATCH 052/110] xvba: do not use vaapi if xvba is present --- xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp -index 7951ee7..ff0b550 100644 +index 52b356d..6ed0fc5 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp @@ -261,6 +261,15 @@ void CDecoder::Close() @@ -25574,10 +16964,10 @@ index 7951ee7..ff0b550 100644 1.8.1.6 -From b101c41a7a96fdadafea70fa4c063c934f18bf04 Mon Sep 17 00:00:00 2001 +From c6d9d1aeaa7905066d354d6182df6da8dcee58b6 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 23 Aug 2012 19:39:49 +0200 -Subject: [PATCH 082/136] ffmpeg: add av_find_default_stream_index to interface +Subject: [PATCH 053/110] ffmpeg: add av_find_default_stream_index to interface --- lib/DllAvFormat.h | 4 ++++ @@ -25623,10 +17013,10 @@ index ee41fa8..56605cb 100644 1.8.1.6 -From b303da3d1b9f8d8be5fe562ecdbbcaabc182ba5e Mon Sep 17 00:00:00 2001 +From 17456e4ad8737d27ae084dfae0045ed3eb9da577 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 13 Apr 2013 11:30:39 +0200 -Subject: [PATCH 083/136] XVBA: revisit draw functions +Subject: [PATCH 054/110] XVBA: revisit draw functions --- lib/ffmpeg/libavcodec/xvba_h264.c | 2 +- @@ -25663,10 +17053,10 @@ index bf3d9c2..ff35a28 100644 1.8.1.6 -From ec2cddc3964a33d9a129b07a303d774cb4c222b8 Mon Sep 17 00:00:00 2001 +From 898c52bb46e3ad80cf64d7db7c60d5b2d338563b Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 13 Apr 2013 12:06:02 +0200 -Subject: [PATCH 084/136] (ffmpeg): Make XVBA codec available +Subject: [PATCH 055/110] (ffmpeg): Make XVBA codec available --- lib/ffmpeg/libavcodec/vc1dec.c | 3 +++ @@ -25690,10 +17080,10 @@ index 2130c74..4d611f9 100644 1.8.1.6 -From 7ed99cc1226802f84c6de6388945a833b0e0040d Mon Sep 17 00:00:00 2001 +From 3b952bf28abbd43949c303b858be9a27ebf864d2 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 13 Apr 2013 16:38:50 +0200 -Subject: [PATCH 085/136] ffmpeg: XVBA-VC1 use v->second_field instead of +Subject: [PATCH 056/110] ffmpeg: XVBA-VC1 use v->second_field instead of !s->first_field to make VC1 interlaced working --- @@ -25717,10 +17107,10 @@ index ff35a28..04e7983 100644 1.8.1.6 -From 36e745498803b6eb8ac6e7d6b1aa3e5b9e9342b3 Mon Sep 17 00:00:00 2001 +From 80e05a1fdafc66ab25364cd661f4839df4d16a1a Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 27 Apr 2013 17:36:15 +0200 -Subject: [PATCH 086/136] XVBA: Only set second_field when we are interlaced +Subject: [PATCH 057/110] XVBA: Only set second_field when we are interlaced and an interlaced field --- @@ -25744,10 +17134,10 @@ index 04e7983..eb90c12 100644 1.8.1.6 -From 1a5b0d7e28e410df41d97659fc327c39308001e1 Mon Sep 17 00:00:00 2001 +From fdd88b6e39dd8ec7cf5899276dc583b7eb4237fd Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 27 Apr 2013 22:08:50 +0200 -Subject: [PATCH 087/136] xvba: translate picture_structure to a value xvba +Subject: [PATCH 058/110] xvba: translate picture_structure to a value xvba understands --- @@ -25830,10 +17220,10 @@ index eb90c12..c98dba5 100644 1.8.1.6 -From 4cc7e515c75eb853055cc74367751829fc425b96 Mon Sep 17 00:00:00 2001 +From 98b0def969e92f7c8075f8401cd2bb107b0e79b1 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 30 Apr 2013 21:18:55 +0200 -Subject: [PATCH 088/136] ffmpeg xvba: fix vc1 field interlace +Subject: [PATCH 059/110] ffmpeg xvba: fix vc1 field interlace --- lib/ffmpeg/libavcodec/xvba.c | 4 ++-- @@ -25885,10 +17275,10 @@ index c98dba5..e7a85a7 100644 1.8.1.6 -From f058a132f053d6bb86452d249a74cd6f05c80fad Mon Sep 17 00:00:00 2001 +From a2d3dec001d3876d74a8838744050648eff45724 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 30 Apr 2013 21:19:07 +0200 -Subject: [PATCH 089/136] xvba: fix vc1 field interlace +Subject: [PATCH 060/110] xvba: fix vc1 field interlace --- xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp | 3 +++ @@ -25912,10 +17302,10 @@ index 43a331f..568632f 100644 1.8.1.6 -From ea6a0186f1321a74ff34ce0e72df4ad7939b7981 Mon Sep 17 00:00:00 2001 +From 0199079932e05c87a5166d190bd9f414a85eada3 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 30 Apr 2013 21:40:55 +0200 -Subject: [PATCH 090/136] xvba: vc1 - honor psf +Subject: [PATCH 061/110] xvba: vc1 - honor psf --- xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp | 3 +++ @@ -25946,20 +17336,20 @@ index 568632f..1db9363 100644 1.8.1.6 -From 4c749cca39425daa10533aa8a5cc7498fa236766 Mon Sep 17 00:00:00 2001 +From 5903b207c8fd52c5bee549612c0c35d86ebef1eb Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 4 May 2013 10:31:32 +0200 -Subject: [PATCH 091/136] xvba: squash me, settings +Subject: [PATCH 062/110] xvba: squash me, settings --- xbmc/settings/Settings.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp -index 42a1363..861bd1a 100644 +index 1de1ac6..1174659 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp -@@ -747,6 +747,9 @@ void CSettings::InitializeConditions() +@@ -758,6 +758,9 @@ void CSettings::InitializeConditions() #ifdef HAVE_LIBVDPAU m_settingsManager->AddCondition("have_libvdpau"); #endif @@ -25973,10 +17363,10 @@ index 42a1363..861bd1a 100644 1.8.1.6 -From abf5055b780fca08a495f76b1258c2eea3fe84d2 Mon Sep 17 00:00:00 2001 +From 03a51a564d6a80f53c67d1204737bb61b3265c2f Mon Sep 17 00:00:00 2001 From: fritsch Date: Fri, 24 May 2013 12:02:02 +0200 -Subject: [PATCH 092/136] XVBA: Limit video to 2048x1152 as this is the max all +Subject: [PATCH 063/110] XVBA: Limit video to 2048x1152 as this is the max all blocks can handle --- @@ -26006,10 +17396,10 @@ index 1db9363..54d7aea 100644 1.8.1.6 -From ba8f531d904709116d23f135fd512c6fb7eb666c Mon Sep 17 00:00:00 2001 +From bc55f265667c12b21f24f443f434a9541d8871fc Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 20 Aug 2012 16:06:39 +0200 -Subject: [PATCH 093/136] dvdplayer: observe pts counter overflow +Subject: [PATCH 064/110] dvdplayer: observe pts counter overflow --- .../cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 198 ++++++++++++++++++++- @@ -26017,7 +17407,7 @@ Subject: [PATCH 093/136] dvdplayer: observe pts counter overflow 2 files changed, 201 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -index 9c395da..356b965 100644 +index 4e7ca89..4a21438 100644 --- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp @@ -18,7 +18,6 @@ @@ -26296,10 +17686,10 @@ index aef5ab1..35abbdf 100644 1.8.1.6 -From 9eba76f46ea93a2d60b8277296a93eb04a431c7c Mon Sep 17 00:00:00 2001 +From 1ef2e98ecd3c9f22c66c7b0abb2def18559fd114 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 2 Oct 2012 13:02:10 +0200 -Subject: [PATCH 094/136] dvdplayer: avoid short screen flicker caused by +Subject: [PATCH 065/110] dvdplayer: avoid short screen flicker caused by unnecessary reconfigure of renderer --- @@ -26307,10 +17697,10 @@ Subject: [PATCH 094/136] dvdplayer: avoid short screen flicker caused by 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index b18cc79..adee04a 100644 +index f35419f..61aa709 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -1095,7 +1095,7 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) +@@ -1062,7 +1062,7 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) || ( m_output.height != pPicture->iHeight ) || ( m_output.dwidth != pPicture->iDisplayWidth ) || ( m_output.dheight != pPicture->iDisplayHeight ) @@ -26319,7 +17709,7 @@ index b18cc79..adee04a 100644 || ( m_output.color_format != (unsigned int)pPicture->format ) || ( m_output.extended_format != pPicture->extended_format ) || ( m_output.color_matrix != pPicture->color_matrix && pPicture->color_matrix != 0 ) // don't reconfigure on unspecified -@@ -1148,7 +1148,7 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) +@@ -1118,7 +1118,7 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) m_output.height = pPicture->iHeight; m_output.dwidth = pPicture->iDisplayWidth; m_output.dheight = pPicture->iDisplayHeight; @@ -26332,10 +17722,10 @@ index b18cc79..adee04a 100644 1.8.1.6 -From 129c2699510723ffa813b04d098377018854a40c Mon Sep 17 00:00:00 2001 +From d54a67b705e0cb0febdb7acb7cee45b77975c2a2 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 11 Oct 2012 12:05:50 +0200 -Subject: [PATCH 095/136] vdpau: advanced settings for auto deinterlacing +Subject: [PATCH 066/110] vdpau: advanced settings for auto deinterlacing --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 8 ++++---- @@ -26363,7 +17753,7 @@ index 2fdcf37..2805613 100644 if (deint != -1) { diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp -index 292750d..f0cb9dd 100644 +index 8287651..79d4f90 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -169,6 +169,8 @@ void CAdvancedSettings::Initialize() @@ -26375,7 +17765,7 @@ index 292750d..f0cb9dd 100644 m_videoVDPAUtelecine = false; m_videoVDPAUdeintSkipChromaHD = false; m_DXVACheckCompatibility = false; -@@ -583,6 +585,8 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file) +@@ -601,6 +603,8 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file) XMLUtils::GetBoolean(pElement,"allowmpeg4vaapi",m_videoAllowMpeg4VAAPI); XMLUtils::GetBoolean(pElement, "disablebackgrounddeinterlace", m_videoDisableBackgroundDeinterlace); XMLUtils::GetInt(pElement, "useocclusionquery", m_videoCaptureUseOcclusionQuery, -1, 1); @@ -26385,10 +17775,10 @@ index 292750d..f0cb9dd 100644 XMLUtils::GetBoolean(pElement,"vdpauHDdeintSkipChroma",m_videoVDPAUdeintSkipChromaHD); diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h -index 3a52878..3e6901b 100644 +index 310db76..830a241 100644 --- a/xbmc/settings/AdvancedSettings.h +++ b/xbmc/settings/AdvancedSettings.h -@@ -147,6 +147,8 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler +@@ -158,6 +158,8 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler int m_videoPercentSeekBackwardBig; CStdString m_videoPPFFmpegDeint; CStdString m_videoPPFFmpegPostProc; @@ -26401,10 +17791,10 @@ index 3a52878..3e6901b 100644 1.8.1.6 -From ffa4c08a6d26b68604c4980728a91569097f530d Mon Sep 17 00:00:00 2001 +From 46d6b77751fa93a9868bba4086250e8841d939db Mon Sep 17 00:00:00 2001 From: xbmc Date: Fri, 2 Nov 2012 13:20:03 +0100 -Subject: [PATCH 096/136] player: fix rewind +Subject: [PATCH 067/110] player: fix rewind --- xbmc/cores/dvdplayer/DVDMessage.h | 5 ++++- @@ -26452,10 +17842,10 @@ index 2ea8b8f..e8274f9 100644 class CDVDMsgPlayerSeekChapter : public CDVDMsg diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index 994e7b4..c8a4585 100644 +index 1bd122b..99f0042 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp -@@ -1556,11 +1556,13 @@ void CDVDPlayer::HandlePlaySpeed() +@@ -1557,11 +1557,13 @@ void CDVDPlayer::HandlePlaySpeed() } else if (m_CurrentVideo.id >= 0 && (m_CurrentVideo.inited == true || GetPlaySpeed() < 0) // allow rewind at end of file @@ -26470,7 +17860,7 @@ index 994e7b4..c8a4585 100644 // check how much off clock video is when ff/rw:ing // a problem here is that seeking isn't very accurate // and since the clock will be resynced after seek -@@ -1579,7 +1581,7 @@ void CDVDPlayer::HandlePlaySpeed() +@@ -1580,7 +1582,7 @@ void CDVDPlayer::HandlePlaySpeed() { CLog::Log(LOGDEBUG, "CDVDPlayer::Process - Seeking to catch up"); int64_t iTime = (int64_t)DVD_TIME_TO_MSEC(m_clock.GetClock() + m_State.time_offset + 500000.0 * m_playSpeed / DVD_PLAYSPEED_NORMAL); @@ -26479,7 +17869,7 @@ index 994e7b4..c8a4585 100644 } } } -@@ -2067,7 +2069,7 @@ void CDVDPlayer::HandleMessages() +@@ -2068,7 +2070,7 @@ void CDVDPlayer::HandleMessages() else m_StateInput.dts = start; @@ -26488,7 +17878,7 @@ index 994e7b4..c8a4585 100644 } else CLog::Log(LOGWARNING, "error while seeking"); -@@ -2206,9 +2208,10 @@ void CDVDPlayer::HandleMessages() +@@ -2207,9 +2209,10 @@ void CDVDPlayer::HandleMessages() double offset; offset = CDVDClock::GetAbsoluteClock() - m_State.timestamp; offset *= m_playSpeed / DVD_PLAYSPEED_NORMAL; @@ -26500,7 +17890,7 @@ index 994e7b4..c8a4585 100644 m_State.timestamp = CDVDClock::GetAbsoluteClock(); } -@@ -2224,7 +2227,8 @@ void CDVDPlayer::HandleMessages() +@@ -2225,7 +2228,8 @@ void CDVDPlayer::HandleMessages() // do a seek after rewind, clock is not in sync with current pts if (m_playSpeed < 0 && speed >= 0) { @@ -26510,7 +17900,7 @@ index 994e7b4..c8a4585 100644 } // if playspeed is different then DVD_PLAYSPEED_NORMAL or DVD_PLAYSPEED_PAUSE -@@ -3173,7 +3177,7 @@ bool CDVDPlayer::CloseTeletextStream(bool bWaitForBuffers) +@@ -3177,7 +3181,7 @@ bool CDVDPlayer::CloseTeletextStream(bool bWaitForBuffers) return true; } @@ -26519,7 +17909,7 @@ index 994e7b4..c8a4585 100644 { double startpts; if(accurate) -@@ -3185,19 +3189,23 @@ void CDVDPlayer::FlushBuffers(bool queued, double pts, bool accurate) +@@ -3189,19 +3193,23 @@ void CDVDPlayer::FlushBuffers(bool queued, double pts, bool accurate) if(startpts != DVD_NOPTS_VALUE) startpts -= m_offset_pts; @@ -26547,7 +17937,7 @@ index 994e7b4..c8a4585 100644 m_CurrentTeletext.dts = DVD_NOPTS_VALUE; m_CurrentTeletext.startpts = startpts; -@@ -3241,7 +3249,7 @@ void CDVDPlayer::FlushBuffers(bool queued, double pts, bool accurate) +@@ -3245,7 +3253,7 @@ void CDVDPlayer::FlushBuffers(bool queued, double pts, bool accurate) m_CurrentTeletext.started = false; } @@ -26557,10 +17947,10 @@ index 994e7b4..c8a4585 100644 UpdatePlayState(0); diff --git a/xbmc/cores/dvdplayer/DVDPlayer.h b/xbmc/cores/dvdplayer/DVDPlayer.h -index c6b9ce3..c49b9e7 100644 +index 237aba4d..9e54bc8 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.h +++ b/xbmc/cores/dvdplayer/DVDPlayer.h -@@ -304,7 +304,7 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer +@@ -303,7 +303,7 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer bool GetCachingTimes(double& play_left, double& cache_left, double& file_offset); @@ -26569,7 +17959,7 @@ index c6b9ce3..c49b9e7 100644 void HandleMessages(); void HandlePlaySpeed(); -@@ -353,8 +353,9 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer +@@ -352,8 +352,9 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer int m_playSpeed; struct SSpeedState { @@ -26582,10 +17972,10 @@ index c6b9ce3..c49b9e7 100644 int m_errorCount; diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index adee04a..e28c57d 100644 +index 61aa709..e668d29 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -1500,7 +1500,7 @@ double CDVDPlayerVideo::GetCurrentPts() +@@ -1471,7 +1471,7 @@ double CDVDPlayerVideo::GetCurrentPts() if( m_stalled ) iRenderPts = DVD_NOPTS_VALUE; @@ -26594,7 +17984,7 @@ index adee04a..e28c57d 100644 iRenderPts = iRenderPts - max(0.0, iSleepTime); return iRenderPts; -@@ -1600,6 +1600,8 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) +@@ -1571,6 +1571,8 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) int iSkippedDeint = 0; int iBufferLevel; @@ -26604,7 +17994,7 @@ index adee04a..e28c57d 100644 if (!m_pVideoCodec->GetCodecStats(iDecoderPts, iSkippedDeint, interlaced)) iDecoderPts = pts; diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.h b/xbmc/cores/dvdplayer/DVDPlayerVideo.h -index ec30fc5..be22aef 100644 +index 59c7f09..65dea76 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.h +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.h @@ -50,6 +50,7 @@ class CDroppingStats @@ -26619,10 +18009,10 @@ index ec30fc5..be22aef 100644 1.8.1.6 -From e1373b7a234d42c675a4394afcfdca25e85ff28b Mon Sep 17 00:00:00 2001 +From 9dd0b7d5f46e62f4868f414a599bc8c7bbc7a8b8 Mon Sep 17 00:00:00 2001 From: xbmc Date: Fri, 23 Nov 2012 17:41:12 +0100 -Subject: [PATCH 097/136] xrandr: fix query for multiple screens +Subject: [PATCH 068/110] xrandr: fix query for multiple screens --- xbmc/windowing/X11/XRandR.cpp | 10 ++++++---- @@ -26663,10 +18053,10 @@ index 9e181f2..ce0a02b 100644 1.8.1.6 -From a8e1b0e463c796066fcd66309b974ed7d699bb25 Mon Sep 17 00:00:00 2001 +From 8e619e069765d3ee80e17c92d5e4f9ef395046ee Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 2 Dec 2012 15:46:55 +0100 -Subject: [PATCH 098/136] X11: add debug log to print out refresh after xrr +Subject: [PATCH 069/110] X11: add debug log to print out refresh after xrr event --- @@ -26694,10 +18084,10 @@ index 9ff947c..a3394e6 100644 1.8.1.6 -From b02869e45241811e11468721a45ddd574a8f00cc Mon Sep 17 00:00:00 2001 +From e9039e88331e391396b445120472b15f8e782cb3 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 11 Dec 2012 11:08:13 +0100 -Subject: [PATCH 099/136] X11: dont call XCloseDisplay on shutdown, it crashes +Subject: [PATCH 070/110] X11: dont call XCloseDisplay on shutdown, it crashes when powered doen by cec on ATI --- @@ -26722,10 +18112,10 @@ index a3394e6..b941c14 100644 1.8.1.6 -From f4d209618fabd698c22843bfd5ae5503c8ec4c77 Mon Sep 17 00:00:00 2001 +From 1e2b5a08eac009b3972c62c58a7f9ed92ce827a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Coutant?= Date: Wed, 12 Dec 2012 19:49:47 +0100 -Subject: [PATCH 100/136] x11: support for multiple x screens +Subject: [PATCH 071/110] x11: support for multiple x screens --- xbmc/windowing/X11/XRandR.cpp | 2 +- @@ -26748,10 +18138,10 @@ index ce0a02b..aa27d2b 100644 1.8.1.6 -From 52ec48f34857ee51438bec6726713d76a1b9a220 Mon Sep 17 00:00:00 2001 +From 55e7a139566a3d3d00ba6119deffb0f39c4ef911 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 24 Dec 2012 16:02:42 +0100 -Subject: [PATCH 101/136] pvr: increase changes counter of stream on stream +Subject: [PATCH 072/110] pvr: increase changes counter of stream on stream change, cosmetics after dd307930d39d92f145a01a16600cd00e01ec39be --- @@ -26785,10 +18175,10 @@ index 7e35581..7adfa27 100644 1.8.1.6 -From 899be2ee7821494b1288d628726a55c7358f1de1 Mon Sep 17 00:00:00 2001 +From 3897839d0a960e56b0fb2428fac1b6b984c8aa33 Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 17 Jan 2013 16:03:22 +0100 -Subject: [PATCH 102/136] X11: add keymapping for XF86XK_Sleep +Subject: [PATCH 073/110] X11: add keymapping for XF86XK_Sleep --- xbmc/windowing/WinEventsX11.cpp | 1 + @@ -26810,17 +18200,17 @@ index 4a5aab4..da5d412 100644 1.8.1.6 -From bb11996a98324a9aa649dd5c4bc5dde7a56b4646 Mon Sep 17 00:00:00 2001 +From 05b4672c598d37ff47e07839e3329fcbe2756c14 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 21 Jan 2013 09:00:19 +0100 -Subject: [PATCH 103/136] X11: remove toggle full screen after resume +Subject: [PATCH 074/110] X11: remove toggle full screen after resume --- xbmc/powermanagement/PowerManager.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/xbmc/powermanagement/PowerManager.cpp b/xbmc/powermanagement/PowerManager.cpp -index fa2a21d..c47219c 100644 +index d658a97..7f12a5d 100644 --- a/xbmc/powermanagement/PowerManager.cpp +++ b/xbmc/powermanagement/PowerManager.cpp @@ -260,11 +260,6 @@ void CPowerManager::OnWake() @@ -26839,10 +18229,10 @@ index fa2a21d..c47219c 100644 1.8.1.6 -From da18dc246c24c1f5e41193fccd9fbdd998e4b862 Mon Sep 17 00:00:00 2001 +From fcab0158f441c5f7ee06bb360a2d56a14ab79b77 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 23 Jan 2013 17:03:02 +0100 -Subject: [PATCH 104/136] xrandr: set screen on mode change command +Subject: [PATCH 075/110] xrandr: set screen on mode change command --- xbmc/windowing/X11/XRandR.cpp | 2 +- @@ -26865,10 +18255,10 @@ index aa27d2b..67bf6ca 100644 1.8.1.6 -From 85c1875c1ed563e78620ee21e96e90a1ea390ef5 Mon Sep 17 00:00:00 2001 +From 3c978a401c2624ec0391b25cc66633e247255cd5 Mon Sep 17 00:00:00 2001 From: xbmc Date: Wed, 23 Jan 2013 17:03:39 +0100 -Subject: [PATCH 105/136] X11: recreate glx context when output changes +Subject: [PATCH 076/110] X11: recreate glx context when output changes --- xbmc/windowing/X11/WinSystemX11.cpp | 6 +++--- @@ -26919,10 +18309,10 @@ index ce3c289..311e4cc 100644 1.8.1.6 -From 8ff7803668859d0b56739338c9cfea0a50b28fad Mon Sep 17 00:00:00 2001 +From 6cddfccd77d365c81a384512a5cfee3b00f9b15c Mon Sep 17 00:00:00 2001 From: xbmc Date: Fri, 14 Dec 2012 14:19:15 +0100 -Subject: [PATCH 106/136] pvr: do not show selection dialog for a single menu +Subject: [PATCH 077/110] pvr: do not show selection dialog for a single menu hook --- @@ -26960,10 +18350,10 @@ index c84bd4d..a39584b 100644 1.8.1.6 -From d96801eb4eb8fe38f8217890de6b0728b9c00d67 Mon Sep 17 00:00:00 2001 +From 2f7e8b17ab53a312588d4895cae2fa678760e069 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 3 Feb 2013 08:17:16 +0100 -Subject: [PATCH 107/136] X11: use default screen parameters if no output +Subject: [PATCH 078/110] X11: use default screen parameters if no output connected --- @@ -27067,10 +18457,10 @@ index c84e793..5215f4d 100644 1.8.1.6 -From 3b55e3a3239d6d78abe5a5bb515e9e0791269d11 Mon Sep 17 00:00:00 2001 +From f15251c6dabb64a50cec28eb745534be103437db Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 23 Mar 2013 15:13:32 +0100 -Subject: [PATCH 108/136] X11: create parent window +Subject: [PATCH 079/110] X11: create parent window --- xbmc/windowing/X11/WinSystemX11.cpp | 69 +++++++++++++++++++++++-------------- @@ -27336,10 +18726,10 @@ index 311e4cc..49365a8 100644 1.8.1.6 -From 5886b4f4c1f33dc17d0f0bd6737ffb445443261c Mon Sep 17 00:00:00 2001 +From fdbc56ee223bb0ab998470b5ceb897ac82519530 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 24 Mar 2013 12:30:12 +0100 -Subject: [PATCH 109/136] X11: use system key repeat rate instead of hardcoded +Subject: [PATCH 080/110] X11: use system key repeat rate instead of hardcoded one, taken from 58fd64b194e38b73b5f3132744bab35e994e7441 --- @@ -27541,10 +18931,10 @@ index 102a076..5b1f3fa 100644 1.8.1.6 -From 93f2e693d0f4079e0fc5be4db844683166bb97c6 Mon Sep 17 00:00:00 2001 +From a70c2e4a776c5be440a1b6c65824d4b36402574f Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 24 Mar 2013 16:04:48 +0100 -Subject: [PATCH 110/136] linux: use CLOCK_MONOTONIC_RAW as this is not subject +Subject: [PATCH 081/110] linux: use CLOCK_MONOTONIC_RAW as this is not subject to NTP --- @@ -27582,20 +18972,20 @@ index c06b8c5..4390d2e 100644 1.8.1.6 -From d302ad05afaf2abe50cc17b0ad76bcd20b30250d Mon Sep 17 00:00:00 2001 +From a79350b43a1c60dc162868475da99421863c74bc Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 28 Mar 2013 15:18:53 +0100 -Subject: [PATCH 111/136] OMXPlayer: some caching fixes for pvr +Subject: [PATCH 082/110] OMXPlayer: some caching fixes for pvr --- xbmc/cores/omxplayer/OMXPlayer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/omxplayer/OMXPlayer.cpp b/xbmc/cores/omxplayer/OMXPlayer.cpp -index b3d4314..12f6087 100644 +index 31b690c..9d24622 100644 --- a/xbmc/cores/omxplayer/OMXPlayer.cpp +++ b/xbmc/cores/omxplayer/OMXPlayer.cpp -@@ -2459,7 +2459,8 @@ void COMXPlayer::HandleMessages() +@@ -2460,7 +2460,8 @@ void COMXPlayer::HandleMessages() m_messenger.Put(new CDVDMsgPlayerSeek(DVD_TIME_TO_MSEC(m_clock.GetClock()), (speed < 0), true, false, false, true)); m_playSpeed = speed; @@ -27609,20 +18999,20 @@ index b3d4314..12f6087 100644 1.8.1.6 -From d7b3c8730b73b45e21f8e2c6af5ae13fc1a2408f Mon Sep 17 00:00:00 2001 +From c36206ab65b88bee3d9216d09382f523f470635c Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 28 Mar 2013 20:50:59 +0100 -Subject: [PATCH 112/136] fix incorrect display of fps when dr kicks in +Subject: [PATCH 083/110] fix incorrect display of fps when dr kicks in --- xbmc/Application.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp -index eb81f6e..93a790c 100644 +index 55a2685..c864770 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp -@@ -2153,10 +2153,11 @@ void CApplication::Render() +@@ -2174,10 +2174,11 @@ void CApplication::Render() if (frameTime < singleFrameTime) Sleep(singleFrameTime - frameTime); } @@ -27639,17 +19029,17 @@ index eb81f6e..93a790c 100644 1.8.1.6 -From 9e585b158ee04aa95ed4cfe3f7d51bb3d38cd627 Mon Sep 17 00:00:00 2001 +From 26f9d7c84392476cd83eb25fae0cd467478d5300 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 8 Apr 2013 11:18:31 +0200 -Subject: [PATCH 113/136] squash to dropping control +Subject: [PATCH 084/110] squash to dropping control --- xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index e28c57d..3c3309b 100644 +index e668d29..3474fe6 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -39,6 +39,7 @@ @@ -27664,10 +19054,10 @@ index e28c57d..3c3309b 100644 1.8.1.6 -From 22a6a2ad21e3bbfac94102794f9141634d6f759b Mon Sep 17 00:00:00 2001 +From be88e4fbe0b07c5604e1e8a548b09f55b67f02ae Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 11 Apr 2013 12:33:46 +0200 -Subject: [PATCH 114/136] pvr: try SwtichChannel when selecting a channel via +Subject: [PATCH 085/110] pvr: try SwtichChannel when selecting a channel via EPG --- @@ -27702,10 +19092,10 @@ index 8616980..198b074 100644 1.8.1.6 -From 572ed7a6fe6427533c92ea6637dc800759c7bf6f Mon Sep 17 00:00:00 2001 +From 51814a1e2c8a562395544a5424fb514a3cda8883 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sat, 13 Apr 2013 08:32:06 +0200 -Subject: [PATCH 115/136] X11: fix mouse coverage +Subject: [PATCH 086/110] X11: fix mouse coverage --- xbmc/windowing/X11/WinSystemX11.cpp | 11 ++++++++--- @@ -27771,10 +19161,10 @@ index 49365a8..924af1d 100644 1.8.1.6 -From f397661d5f0dbc97d6d133a4326deeca7db44e11 Mon Sep 17 00:00:00 2001 +From 72e48eb8dbcd4e9d6463a5bfaf32bb8eb03aa8c3 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Wed, 8 May 2013 13:14:58 +0200 -Subject: [PATCH 116/136] X11: fix incorrectly used screen num in desktop +Subject: [PATCH 087/110] X11: fix incorrectly used screen num in desktop resolution --- @@ -27809,10 +19199,10 @@ index 186a28e..66955b8 100644 1.8.1.6 -From 758cbebfba5fb5dcddca399a7fcd1c49382015f8 Mon Sep 17 00:00:00 2001 +From 5f7c989345a0bc874dab7985e5b1dd7f524b743d Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Thu, 9 May 2013 12:07:09 +0200 -Subject: [PATCH 117/136] X11: do not overwrite user selected monitor with +Subject: [PATCH 088/110] X11: do not overwrite user selected monitor with fallback --- @@ -27937,10 +19327,10 @@ index 924af1d..2fb9e0f 100644 1.8.1.6 -From 21f9058201f4968525f53dc6d05e486ad0fb8f14 Mon Sep 17 00:00:00 2001 +From 4df886974f2671a5879f43f5154d7204f8b4f11b Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sun, 12 May 2013 10:50:30 +0200 -Subject: [PATCH 118/136] xrandr: add turn on/off to wrapper +Subject: [PATCH 089/110] xrandr: add turn on/off to wrapper --- xbmc/windowing/X11/XRandR.cpp | 78 +++++++++++++++++++++++++++++++++++++++---- @@ -28106,10 +19496,10 @@ index d37838a..059062f 100644 1.8.1.6 -From cbec1e01b383d19b0f830d252fe8913f0c9f55ea Mon Sep 17 00:00:00 2001 +From 48754be0ac3f25931cef14a72090a775536d1443 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sun, 19 May 2013 12:55:35 +0200 -Subject: [PATCH 119/136] xrandr: add GetPreferredMode to wrapper +Subject: [PATCH 090/110] xrandr: add GetPreferredMode to wrapper --- xbmc/windowing/X11/XRandR.cpp | 23 +++++++++++++++++++++++ @@ -28166,10 +19556,10 @@ index 059062f..ab7cc63 100644 1.8.1.6 -From 5d21236a1a099b7daa68b956ab39161bbe22151f Mon Sep 17 00:00:00 2001 +From 667eb31e549880a80aaf1ccd983e010ddc833eae Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sat, 11 May 2013 17:12:12 +0200 -Subject: [PATCH 120/136] X11: multi-head improvement - poll for desired output +Subject: [PATCH 091/110] X11: multi-head improvement - poll for desired output if we do not get an xrr event --- @@ -28184,10 +19574,10 @@ Subject: [PATCH 120/136] X11: multi-head improvement - poll for desired output 8 files changed, 105 insertions(+), 12 deletions(-) diff --git a/language/English/strings.po b/language/English/strings.po -index 1fdf542..38d0b08 100644 +index fc1f5ec4d..645d7be 100644 --- a/language/English/strings.po +++ b/language/English/strings.po -@@ -6235,7 +6235,7 @@ msgctxt "#14071" +@@ -6242,7 +6242,7 @@ msgctxt "#14071" msgid "Allow file renaming and deletion" msgstr "" @@ -28196,7 +19586,7 @@ index 1fdf542..38d0b08 100644 msgctxt "#14074" msgid "Set timezone" -@@ -6367,7 +6367,12 @@ msgctxt "#14100" +@@ -6374,7 +6374,12 @@ msgctxt "#14100" msgid "Stop ripping CD" msgstr "" @@ -28211,10 +19601,10 @@ index 1fdf542..38d0b08 100644 #: xbmc/dialogs/GUIDialogFavourites.cpp msgctxt "#15015" diff --git a/system/settings/settings.xml b/system/settings/settings.xml -index 4655d59..1875ad4 100644 +index ac87a69..688964e 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml -@@ -1855,6 +1855,11 @@ +@@ -1877,6 +1877,11 @@ @@ -28226,7 +19616,7 @@ index 4655d59..1875ad4 100644 0 0 -@@ -1906,6 +1911,7 @@ +@@ -1928,6 +1933,7 @@ @@ -28235,10 +19625,10 @@ index 4655d59..1875ad4 100644 false diff --git a/xbmc/settings/DisplaySettings.cpp b/xbmc/settings/DisplaySettings.cpp -index cf5deba..0cbcdd1 100644 +index 1a85651..46895d2 100644 --- a/xbmc/settings/DisplaySettings.cpp +++ b/xbmc/settings/DisplaySettings.cpp -@@ -244,6 +244,10 @@ bool CDisplaySettings::OnSettingChanging(const CSetting *setting) +@@ -265,6 +265,10 @@ bool CDisplaySettings::OnSettingChanging(const CSetting *setting) m_resolutionChangeAborted = false; } } @@ -28450,10 +19840,10 @@ index 4809821..1ad26b2 100644 1.8.1.6 -From 71cc7a9d64c06d3fe0f3a13f6e14a1b2175a35f6 Mon Sep 17 00:00:00 2001 +From b83db2b42b1f940544e4c353439a97d43379cd73 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Wed, 15 May 2013 09:14:34 +0200 -Subject: [PATCH 121/136] X11: ignore mouse move event form other windows +Subject: [PATCH 092/110] X11: ignore mouse move event form other windows --- xbmc/windowing/WinEventsX11.cpp | 4 +++- @@ -28485,10 +19875,10 @@ index 879d8f2..2ec9b6f 100644 1.8.1.6 -From 0072bf85d4c6a8046cbc0bbf27a80033906f2bfe Mon Sep 17 00:00:00 2001 +From f8633b3687ef65d4467e0779854ba2f6b6a853b1 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sun, 2 Jun 2013 14:53:45 +0200 -Subject: [PATCH 122/136] vdpau: fix segfault caused by uninitialized member +Subject: [PATCH 093/110] vdpau: fix segfault caused by uninitialized member --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 1 + @@ -28510,10 +19900,10 @@ index 2805613..cdfceb7 100644 1.8.1.6 -From 9ab5f948068b49d38cc721f1e1107ac4f23f3a5b Mon Sep 17 00:00:00 2001 +From d1884a4dade9ce7e7e6a90a15fdcc13b789f23b0 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Tue, 11 Jun 2013 16:13:45 +0200 -Subject: [PATCH 123/136] vdpau: sync video mixer +Subject: [PATCH 094/110] vdpau: sync video mixer --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 15 +++++++++++++++ @@ -28549,10 +19939,10 @@ index cdfceb7..75ac6f0 100644 1.8.1.6 -From c32f6f0f83cf5e85526e24753b9af7d4baf2b08b Mon Sep 17 00:00:00 2001 +From 01311ab34796feff00c771a3ac357b650ef340e6 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Tue, 11 Jun 2013 16:20:29 +0200 -Subject: [PATCH 124/136] renderer: allow some lateness within vblank interval +Subject: [PATCH 095/110] renderer: allow some lateness within vblank interval --- xbmc/cores/VideoRenderers/RenderManager.cpp | 12 ++++++++++-- @@ -28560,7 +19950,7 @@ Subject: [PATCH 124/136] renderer: allow some lateness within vblank interval 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 7e12a46..9347766 100644 +index 5056100..97fed9a 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -398,6 +398,8 @@ void CXBMCRenderManager::FrameFinish() @@ -28572,7 +19962,7 @@ index 7e12a46..9347766 100644 { CSingleLock lock(m_presentlock); if(m_presentstep == PRESENT_FRAME) -@@ -1043,6 +1045,12 @@ void CXBMCRenderManager::PrepareNextRender() +@@ -1050,6 +1052,12 @@ void CXBMCRenderManager::PrepareNextRender() double clocktime = GetPresentTime(); double frametime = 1.0 / GetMaximumFPS(); @@ -28585,7 +19975,7 @@ index 7e12a46..9347766 100644 /* see if any future queued frames are already due */ std::deque::reverse_iterator curr, prev; -@@ -1051,8 +1059,8 @@ void CXBMCRenderManager::PrepareNextRender() +@@ -1058,8 +1066,8 @@ void CXBMCRenderManager::PrepareNextRender() ++prev; while (prev != m_queued.rend()) { @@ -28612,10 +20002,10 @@ index befd851..27283ec 100644 1.8.1.6 -From 6a67efb103960272e96ef716cbeff0d2880db689 Mon Sep 17 00:00:00 2001 +From caa6819211e3709d0b07a243769efd98713abf7d Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Fri, 14 Jun 2013 09:23:22 +0200 -Subject: [PATCH 125/136] vdpau: calculate timestamp of second field when doing +Subject: [PATCH 096/110] vdpau: calculate timestamp of second field when doing deinterlacing --- @@ -28641,10 +20031,10 @@ index 75ac6f0..67b6cf2 100644 1.8.1.6 -From a42f4fb77882658c70d9e53a0c2510395d005572 Mon Sep 17 00:00:00 2001 +From e25ff6fc6ca096549e9a8be0d87b63d4dd9bc45c Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Fri, 14 Jun 2013 10:46:58 +0200 -Subject: [PATCH 126/136] vdpau: comment debug log: long decoding time +Subject: [PATCH 097/110] vdpau: comment debug log: long decoding time --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 8 ++++---- @@ -28680,10 +20070,10 @@ index 67b6cf2..55430a6 100644 1.8.1.6 -From 0f900c89fd4136858fcb45365004dd236499fcf5 Mon Sep 17 00:00:00 2001 +From 9fe7fd83414c3963a10fe333c439203d6b34873e Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 16 Jun 2013 13:22:58 +0200 -Subject: [PATCH 127/136] X11: another fix for mouse coverage +Subject: [PATCH 098/110] X11: another fix for mouse coverage --- xbmc/windowing/WinEventsX11.cpp | 6 ++++-- @@ -28716,20 +20106,20 @@ index 2ec9b6f..4ed978c 100644 1.8.1.6 -From 15b76d91f51cb399b9574fe2758255214c7fba66 Mon Sep 17 00:00:00 2001 +From cb8babb62b2adb4ec05722d67a23982516a5c3f0 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 16 Jun 2013 13:23:19 +0200 -Subject: [PATCH 128/136] renderer: delete fence on uninit +Subject: [PATCH 099/110] renderer: delete fence on uninit --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 73a8cc8..6b28601 100644 +index b2beb2e..2613083 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -1166,7 +1166,12 @@ void CLinuxRendererGL::UnInit() +@@ -1187,7 +1187,12 @@ void CLinuxRendererGL::UnInit() // YV12 textures for (int i = 0; i < NUM_BUFFERS; ++i) @@ -28746,20 +20136,20 @@ index 73a8cc8..6b28601 100644 1.8.1.6 -From 168265eeba10a227cee2c310d8812f67ced95a25 Mon Sep 17 00:00:00 2001 +From adc3b53ae2357465184d38409c9dc5f2d61dc007 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sun, 16 Jun 2013 14:28:01 +0200 -Subject: [PATCH 129/136] renderer: limit fence to vdpau +Subject: [PATCH 100/110] renderer: limit fence to vdpau --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 6b28601..1594d45 100644 +index 2613083..9337ee6 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -1256,14 +1256,17 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) +@@ -1277,14 +1277,17 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) VerifyGLState(); } @@ -28787,10 +20177,10 @@ index 6b28601..1594d45 100644 1.8.1.6 -From 804b001ee6c35f10dbb8076816250e8fccaf04f4 Mon Sep 17 00:00:00 2001 +From 69b3991f1c8f45295dbd62f42f3af0e153337980 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Thu, 4 Jul 2013 16:38:26 +0200 -Subject: [PATCH 130/136] XVBA: replace CODEC_IS with AV_CODEC_ID +Subject: [PATCH 101/110] XVBA: replace CODEC_IS with AV_CODEC_ID --- xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp | 14 +++++++------- @@ -28865,10 +20255,10 @@ index 54d7aea..5845dbf 100644 1.8.1.6 -From 4de4eabbb2532bb841618980625ce1973e858377 Mon Sep 17 00:00:00 2001 +From 07d82699f9aff83d4228e1cea4a5da05460f8717 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Fri, 5 Jul 2013 12:14:00 +0200 -Subject: [PATCH 131/136] X11: set windows class name +Subject: [PATCH 102/110] X11: set windows class name --- xbmc/windowing/X11/WinSystemX11.cpp | 9 ++++++++- @@ -28910,10 +20300,10 @@ index 7e4b637..44e40a3 100644 1.8.1.6 -From d5461fcb39aea90cd9deb3ccac1dd25a0d6fd865 Mon Sep 17 00:00:00 2001 +From 4a6c2229447b4dfbbadaa0fa8005d2278ee52353 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sat, 13 Jul 2013 20:00:45 +0200 -Subject: [PATCH 132/136] VDPAU: revert sync mixer, does a busy wait +Subject: [PATCH 103/110] VDPAU: revert sync mixer, does a busy wait --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 31 +++++++++++++------------- @@ -28979,10 +20369,10 @@ index 55430a6..aac0646 100644 1.8.1.6 -From b6d69ffe7399e8f75927b32ae8b5c421247b2bf7 Mon Sep 17 00:00:00 2001 +From 810827650de3ad9c682d6c40bb275c8549c093f7 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sun, 14 Jul 2013 14:21:52 +0200 -Subject: [PATCH 133/136] ActiveAE: Make ActiveAE default Audio Engine to get +Subject: [PATCH 104/110] ActiveAE: Make ActiveAE default Audio Engine to get it tested via ppa --- @@ -28990,7 +20380,7 @@ Subject: [PATCH 133/136] ActiveAE: Make ActiveAE default Audio Engine to get 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/cores/AudioEngine/AEFactory.cpp b/xbmc/cores/AudioEngine/AEFactory.cpp -index 250056e..9c2ccb6 100644 +index 50a309c..8ce02d7 100644 --- a/xbmc/cores/AudioEngine/AEFactory.cpp +++ b/xbmc/cores/AudioEngine/AEFactory.cpp @@ -97,7 +97,7 @@ bool CAEFactory::LoadEngine() @@ -29006,10 +20396,10 @@ index 250056e..9c2ccb6 100644 1.8.1.6 -From 81ab9de24651da35b3dc3f1d4e1b292c7ac5877b Mon Sep 17 00:00:00 2001 +From 13d61226017eede4aae9e48edcbb6c8fa90dc42a Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 21 Jul 2013 13:03:45 +0200 -Subject: [PATCH 134/136] ffmpeg: xvba - add missing pix formats for xvba +Subject: [PATCH 105/110] ffmpeg: xvba - add missing pix formats for xvba --- lib/ffmpeg/libavcodec/h263dec.c | 3 +++ @@ -29031,7 +20421,7 @@ index e231b08..6fcd2a0 100644 AV_PIX_FMT_NONE }; diff --git a/lib/ffmpeg/libavcodec/h264.c b/lib/ffmpeg/libavcodec/h264.c -index 299039f..2f628ab 100644 +index 02d0a26..4f09c67 100644 --- a/lib/ffmpeg/libavcodec/h264.c +++ b/lib/ffmpeg/libavcodec/h264.c @@ -101,6 +101,9 @@ @@ -29048,20 +20438,20 @@ index 299039f..2f628ab 100644 1.8.1.6 -From fe7dcabef8bb02c29494206818bb20491767cbc0 Mon Sep 17 00:00:00 2001 +From db09e815ec42cca91d13ef48479f05d4abed9c24 Mon Sep 17 00:00:00 2001 From: spiff Date: Tue, 16 Jul 2013 14:34:04 +0200 -Subject: [PATCH 135/136] fixed: typo +Subject: [PATCH 106/110] fixed: typo --- language/English/strings.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/language/English/strings.po b/language/English/strings.po -index 38d0b08..484c564 100644 +index 645d7be..7cc5c3b 100644 --- a/language/English/strings.po +++ b/language/English/strings.po -@@ -6369,7 +6369,7 @@ msgstr "" +@@ -6376,7 +6376,7 @@ msgstr "" #: xbmc/settings/settings.xml msgctxt "#14101" @@ -29074,17 +20464,17 @@ index 38d0b08..484c564 100644 1.8.1.6 -From 275709a2b99e437d2940bc2b3126b96700e03d39 Mon Sep 17 00:00:00 2001 +From e0368f17203eda08ea68b6c4665ced323c37852a Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Thu, 25 Jul 2013 17:18:13 +0200 -Subject: [PATCH 136/136] ActiveAE: slightly reduce buffer size +Subject: [PATCH 107/110] ActiveAE: slightly reduce buffer size --- xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -index 4b64235..7835e81 100644 +index 31aa3c0..fd4d7c5 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp @@ -30,8 +30,8 @@ @@ -29100,4 +20490,3 @@ index 4b64235..7835e81 100644 { -- 1.8.1.6 - diff --git a/packages/mediacenter/xbmc/patches/f68634b/xbmc-995.10-disable-alt-tab.patch b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-995.10-disable-alt-tab.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/f68634b/xbmc-995.10-disable-alt-tab.patch rename to packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-995.10-disable-alt-tab.patch diff --git a/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-999.02-rpipower.patch b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-999.02-rpipower.patch new file mode 100644 index 0000000000..5153c26caa --- /dev/null +++ b/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-999.02-rpipower.patch @@ -0,0 +1,113 @@ +From 3c27e947a2c52c7b124b1bcf32f554b82b60f690 Mon Sep 17 00:00:00 2001 +From: Stephan Raue +Date: Fri, 2 Aug 2013 01:32:03 +0200 +Subject: [PATCH] Disable Hibernate and Suspend related power options for + Raspberry & Co. without (working) Upower/HAL/CK/Systemd support. Usually this + devices dont support Suspend & Hibernate. + +--- + xbmc/powermanagement/PowerManager.cpp | 21 ++++++++---- + xbmc/powermanagement/linux/FallbackPowerSyscall.h | 39 +++++++++++++++++++++++ + 2 files changed, 53 insertions(+), 7 deletions(-) + create mode 100644 xbmc/powermanagement/linux/FallbackPowerSyscall.h + +diff --git a/xbmc/powermanagement/PowerManager.cpp b/xbmc/powermanagement/PowerManager.cpp +index d658a97..993477e 100644 +--- a/xbmc/powermanagement/PowerManager.cpp ++++ b/xbmc/powermanagement/PowerManager.cpp +@@ -40,14 +40,17 @@ + #include "osx/CocoaPowerSyscall.h" + #elif defined(TARGET_ANDROID) + #include "android/AndroidPowerSyscall.h" +-#elif defined(TARGET_POSIX) && defined(HAS_DBUS) ++#elif defined(TARGET_POSIX) ++#include "linux/FallbackPowerSyscall.h" ++#if defined(HAS_DBUS) + #include "linux/ConsoleUPowerSyscall.h" + #include "linux/ConsoleDeviceKitPowerSyscall.h" + #include "linux/LogindUPowerSyscall.h" + #include "linux/UPowerSyscall.h" +-#ifdef HAS_HAL ++#if defined(HAS_HAL) + #include "linux/HALPowerSyscall.h" +-#endif ++#endif // HAS_HAL ++#endif // HAS_DBUS + #elif defined(TARGET_WINDOWS) + #include "powermanagement/windows/Win32PowerSyscall.h" + extern HWND g_hWnd; +@@ -73,7 +76,8 @@ void CPowerManager::Initialize() + m_instance = new CCocoaPowerSyscall(); + #elif defined(TARGET_ANDROID) + m_instance = new CAndroidPowerSyscall(); +-#elif defined(TARGET_POSIX) && defined(HAS_DBUS) ++#elif defined(TARGET_POSIX) ++#if defined(HAS_DBUS) + if (CConsoleUPowerSyscall::HasConsoleKitAndUPower()) + m_instance = new CConsoleUPowerSyscall(); + else if (CConsoleDeviceKitPowerSyscall::HasDeviceConsoleKit()) +@@ -82,10 +86,13 @@ void CPowerManager::Initialize() + m_instance = new CLogindUPowerSyscall(); + else if (CUPowerSyscall::HasUPower()) + m_instance = new CUPowerSyscall(); +-#ifdef HAS_HAL +- else ++#if defined(HAS_HAL) ++ else if(1) + m_instance = new CHALPowerSyscall(); +-#endif ++#endif // HAS_HAL ++ else ++#endif // HAS_DBUS ++ m_instance = new CFallbackPowerSyscall(); + #elif defined(TARGET_WINDOWS) + m_instance = new CWin32PowerSyscall(); + #endif +diff --git a/xbmc/powermanagement/linux/FallbackPowerSyscall.h b/xbmc/powermanagement/linux/FallbackPowerSyscall.h +new file mode 100644 +index 0000000..a6ed27b +--- /dev/null ++++ b/xbmc/powermanagement/linux/FallbackPowerSyscall.h +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (C) 2005-2013 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 ++ * . ++ * ++ */ ++#pragma once ++#include "powermanagement/IPowerSyscall.h" ++#include "system.h" ++#if defined(TARGET_POSIX) ++ ++class CFallbackPowerSyscall : public CPowerSyscallWithoutEvents ++{ ++public: ++ virtual bool Powerdown() {return true; } ++ virtual bool Suspend() {return false; } ++ virtual bool Hibernate() {return false; } ++ virtual bool Reboot() {return true; } ++ ++ virtual bool CanPowerdown() {return true; } ++ virtual bool CanSuspend() {return false; } ++ virtual bool CanHibernate() {return false; } ++ virtual bool CanReboot() {return true; } ++ virtual int BatteryLevel() {return 0; } ++}; ++#endif +-- +1.8.1.6 + diff --git a/packages/mediacenter/xbmc/patches/f68634b/xbmc-602-add_as.xml_busy_dialog_delay_control.patch b/packages/mediacenter/xbmc/patches/f68634b/xbmc-602-add_as.xml_busy_dialog_delay_control.patch deleted file mode 100644 index 8300e13296..0000000000 --- a/packages/mediacenter/xbmc/patches/f68634b/xbmc-602-add_as.xml_busy_dialog_delay_control.patch +++ /dev/null @@ -1,57 +0,0 @@ -diff -Naur xbmc-12.1.8/xbmc/cores/dvdplayer/DVDPlayer.cpp xbmc-12.1.8.patch/xbmc/cores/dvdplayer/DVDPlayer.cpp ---- xbmc-12.1.8/xbmc/cores/dvdplayer/DVDPlayer.cpp 2013-04-24 23:38:36.000000000 +0200 -+++ xbmc-12.1.8.patch/xbmc/cores/dvdplayer/DVDPlayer.cpp 2013-04-26 00:49:07.732011721 +0200 -@@ -470,7 +470,7 @@ - #endif - - Create(); -- if(!m_ready.WaitMSec(100)) -+ if(!m_ready.WaitMSec(g_advancedSettings.m_videoBusyDialogDelay_ms)) - { - CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); - if(dialog) -diff -Naur xbmc-12.1.8/xbmc/cores/omxplayer/OMXPlayer.cpp xbmc-12.1.8.patch/xbmc/cores/omxplayer/OMXPlayer.cpp ---- xbmc-12.1.8/xbmc/cores/omxplayer/OMXPlayer.cpp 2013-04-24 23:38:36.000000000 +0200 -+++ xbmc-12.1.8.patch/xbmc/cores/omxplayer/OMXPlayer.cpp 2013-04-26 00:50:56.974691417 +0200 -@@ -474,7 +474,7 @@ - g_renderManager.PreInit(); - - Create(); -- if(!m_ready.WaitMSec(100)) -+ if(!m_ready.WaitMSec(g_advancedSettings.m_videoBusyDialogDelay_ms)) - { - CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY); - if(dialog) -diff -Naur xbmc-12.1.8/xbmc/settings/AdvancedSettings.cpp xbmc-12.1.8.patch/xbmc/settings/AdvancedSettings.cpp ---- xbmc-12.1.8/xbmc/settings/AdvancedSettings.cpp 2013-04-26 00:48:59.375036542 +0200 -+++ xbmc-12.1.8.patch/xbmc/settings/AdvancedSettings.cpp 2013-04-26 00:49:07.732011721 +0200 -@@ -111,6 +111,7 @@ - m_DXVAForceProcessorRenderer = true; - m_DXVANoDeintProcForProgressive = false; - m_videoFpsDetect = 1; -+ m_videoBusyDialogDelay_ms = 100; - m_videoDefaultLatency = 0.0; - m_videoDisableHi10pMultithreading = false; - -@@ -592,6 +593,10 @@ - //0 = disable fps detect, 1 = only detect on timestamps with uniform spacing, 2 detect on all timestamps - XMLUtils::GetInt(pElement, "fpsdetect", m_videoFpsDetect, 0, 2); - -+ // controls the delay, in milliseconds, until -+ // the busy dialog is shown when starting video playback. -+ XMLUtils::GetInt(pElement, "busydialogdelayms", m_videoBusyDialogDelay_ms, 0, 1000); -+ - // Store global display latency settings - TiXmlElement* pVideoLatency = pElement->FirstChildElement("latency"); - if (pVideoLatency) -diff -Naur xbmc-12.1.8/xbmc/settings/AdvancedSettings.h xbmc-12.1.8.patch/xbmc/settings/AdvancedSettings.h ---- xbmc-12.1.8/xbmc/settings/AdvancedSettings.h 2013-04-26 00:48:59.383036518 +0200 -+++ xbmc-12.1.8.patch/xbmc/settings/AdvancedSettings.h 2013-04-26 00:49:07.732011721 +0200 -@@ -165,6 +165,7 @@ - bool m_DXVANoDeintProcForProgressive; - int m_videoFpsDetect; - bool m_videoDisableHi10pMultithreading; -+ int m_videoBusyDialogDelay_ms; - - CStdString m_videoDefaultPlayer; - CStdString m_videoDefaultDVDPlayer; diff --git a/packages/mediacenter/xbmc/patches/f68634b/xbmc-999.01-automake-1.13.patch b/packages/mediacenter/xbmc/patches/f68634b/xbmc-999.01-automake-1.13.patch deleted file mode 100644 index a4703491b5..0000000000 --- a/packages/mediacenter/xbmc/patches/f68634b/xbmc-999.01-automake-1.13.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-8ad691a/lib/libdvd/libdvdcss/configure.ac xbmc-8ad691a.patch/lib/libdvd/libdvdcss/configure.ac ---- xbmc-8ad691a/lib/libdvd/libdvdcss/configure.ac 2013-04-08 12:03:51.000000000 +0200 -+++ xbmc-8ad691a.patch/lib/libdvd/libdvdcss/configure.ac 2013-04-08 14:20:14.793113682 +0200 -@@ -5,7 +5,7 @@ - AC_CANONICAL_SYSTEM - - AM_INIT_AUTOMAKE(libdvdcss, 1.2.12) --AM_CONFIG_HEADER(config.h) -+AC_CONFIG_HEADERS(config.h) - - AC_PROG_CC - AC_STDC_HEADERS From e6a8bda422532261dbf923cab1a41adcbbaec976 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Fri, 2 Aug 2013 18:24:32 +0200 Subject: [PATCH 072/103] Mesa: update to Mesa-9.1.6 Signed-off-by: Stephan Raue --- packages/graphics/Mesa/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphics/Mesa/package.mk b/packages/graphics/Mesa/package.mk index 3c8b85efed..680d4825b8 100644 --- a/packages/graphics/Mesa/package.mk +++ b/packages/graphics/Mesa/package.mk @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="Mesa" -PKG_VERSION="9.1.5" +PKG_VERSION="9.1.6" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="OSS" From 80cf62ec12ebf3bb6f7753afe8f688dddfcfec43 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Fri, 2 Aug 2013 18:25:01 +0200 Subject: [PATCH 073/103] tools/mkpkg: update 'mkpkg_xbmc-gotham' script Signed-off-by: Stephan Raue --- tools/mkpkg/mkpkg_xbmc-gotham | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/mkpkg/mkpkg_xbmc-gotham b/tools/mkpkg/mkpkg_xbmc-gotham index faf3682ec5..ea170e32cc 100755 --- a/tools/mkpkg/mkpkg_xbmc-gotham +++ b/tools/mkpkg/mkpkg_xbmc-gotham @@ -38,7 +38,7 @@ echo "getting sources..." cd .. if [ -z "$PKG_VERSION" ]; then - PKG_VERSION="$GIT_REV" + PKG_VERSION="13.alpha-$GIT_REV" fi echo "copying sources..." From fe1224fc57f5ba987269d082e46c6eb8f20bfeac Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 3 Aug 2013 06:05:51 +0200 Subject: [PATCH 074/103] xbmc: update to xbmc-13.alpha-df91888 Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc-theme-Confluence/meta | 2 +- packages/mediacenter/xbmc/package.mk | 2 +- .../xbmc-321-texturepacker-hostflags-and-rework.patch | 0 ...bmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch | 0 .../xbmc-453-add_openelec.tv_RSS_news-0.1.patch | 0 .../xbmc-602-add_as.xml_busy_dialog_delay_control.patch | 0 ...xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch | 0 .../xbmc-995.01-xvba_support-8fdcc86.patch | 0 .../xbmc-995.10-disable-alt-tab.patch | 0 .../xbmc-999.02-rpipower.patch | 0 10 files changed, 2 insertions(+), 2 deletions(-) rename packages/mediacenter/xbmc/patches/{13.alpha-6edea14 => 13.alpha-df91888}/xbmc-321-texturepacker-hostflags-and-rework.patch (100%) rename packages/mediacenter/xbmc/patches/{13.alpha-6edea14 => 13.alpha-df91888}/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{13.alpha-6edea14 => 13.alpha-df91888}/xbmc-453-add_openelec.tv_RSS_news-0.1.patch (100%) rename packages/mediacenter/xbmc/patches/{13.alpha-6edea14 => 13.alpha-df91888}/xbmc-602-add_as.xml_busy_dialog_delay_control.patch (100%) rename packages/mediacenter/xbmc/patches/{13.alpha-6edea14 => 13.alpha-df91888}/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch (100%) rename packages/mediacenter/xbmc/patches/{13.alpha-6edea14 => 13.alpha-df91888}/xbmc-995.01-xvba_support-8fdcc86.patch (100%) rename packages/mediacenter/xbmc/patches/{13.alpha-6edea14 => 13.alpha-df91888}/xbmc-995.10-disable-alt-tab.patch (100%) rename packages/mediacenter/xbmc/patches/{13.alpha-6edea14 => 13.alpha-df91888}/xbmc-999.02-rpipower.patch (100%) diff --git a/packages/mediacenter/xbmc-theme-Confluence/meta b/packages/mediacenter/xbmc-theme-Confluence/meta index dda2ba3f0c..89104478d9 100644 --- a/packages/mediacenter/xbmc-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-theme-Confluence/meta @@ -21,7 +21,7 @@ PKG_NAME="xbmc-theme-Confluence" PKG_VERSION="12.2-e40d13d" if [ "$XBMC" = "master" ]; then - PKG_VERSION="13.alpha-6edea14" + PKG_VERSION="13.alpha-df91888" elif [ "$XBMC" = "xbmc-aml" ]; then PKG_VERSION="aml-frodo-d9119f2" fi diff --git a/packages/mediacenter/xbmc/package.mk b/packages/mediacenter/xbmc/package.mk index 76a23924a2..209b8961b4 100644 --- a/packages/mediacenter/xbmc/package.mk +++ b/packages/mediacenter/xbmc/package.mk @@ -21,7 +21,7 @@ PKG_NAME="xbmc" PKG_VERSION="12.2-e40d13d" if [ "$XBMC" = "master" ]; then - PKG_VERSION="13.alpha-6edea14" + PKG_VERSION="13.alpha-df91888" elif [ "$XBMC" = "xbmc-aml" ]; then PKG_VERSION="aml-frodo-d9119f2" fi diff --git a/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-321-texturepacker-hostflags-and-rework.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-321-texturepacker-hostflags-and-rework.patch diff --git a/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-602-add_as.xml_busy_dialog_delay_control.patch b/packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-602-add_as.xml_busy_dialog_delay_control.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-602-add_as.xml_busy_dialog_delay_control.patch rename to packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-602-add_as.xml_busy_dialog_delay_control.patch diff --git a/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch b/packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch rename to packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-990.15-depends-mark_our_wrapped_functions_as_used.patch diff --git a/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-995.01-xvba_support-8fdcc86.patch b/packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-995.01-xvba_support-8fdcc86.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-995.01-xvba_support-8fdcc86.patch rename to packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-995.01-xvba_support-8fdcc86.patch diff --git a/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-995.10-disable-alt-tab.patch b/packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-995.10-disable-alt-tab.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-995.10-disable-alt-tab.patch rename to packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-995.10-disable-alt-tab.patch diff --git a/packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-999.02-rpipower.patch b/packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-999.02-rpipower.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/13.alpha-6edea14/xbmc-999.02-rpipower.patch rename to packages/mediacenter/xbmc/patches/13.alpha-df91888/xbmc-999.02-rpipower.patch From 9dbc9b038ecbb798abf975c270756e0904d438b6 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 3 Aug 2013 06:06:17 +0200 Subject: [PATCH 075/103] ffmpeg: add upstream patch Signed-off-by: Stephan Raue --- ...-frame-packing-as-stereo_mode-metada.patch | 236 ++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 packages/multimedia/ffmpeg/patches/1.2.1/ffmpeg-0039-h264-expose-h264-frame-packing-as-stereo_mode-metada.patch diff --git a/packages/multimedia/ffmpeg/patches/1.2.1/ffmpeg-0039-h264-expose-h264-frame-packing-as-stereo_mode-metada.patch b/packages/multimedia/ffmpeg/patches/1.2.1/ffmpeg-0039-h264-expose-h264-frame-packing-as-stereo_mode-metada.patch new file mode 100644 index 0000000000..5c6384f87c --- /dev/null +++ b/packages/multimedia/ffmpeg/patches/1.2.1/ffmpeg-0039-h264-expose-h264-frame-packing-as-stereo_mode-metada.patch @@ -0,0 +1,236 @@ +From 3a6ea59e122d5bc981a2a5c8f9bafcba0f9f8754 Mon Sep 17 00:00:00 2001 +From: Joakim Plate +Date: Wed, 26 Jun 2013 22:07:28 +0200 +Subject: [PATCH 1/1] h264: expose h264 frame packing as stereo_mode metadata + +--- + libavcodec/h264.c | 3 ++ + libavcodec/h264.h | 35 ++++++++++++++- + libavcodec/h264_parser.c | 1 + + libavcodec/h264_sei.c | 85 +++++++++++++++++++++++++++++++++++++ + 4 files changed, 123 insertions(+), 1 deletion(-) + +diff --git a/libavcodec/h264.c b/libavcodec/h264.c +index 937ad7a..85f2372 100644 +--- a/libavcodec/h264.c ++++ b/libavcodec/h264.c +@@ -1437,6 +1437,7 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx) + h->prev_poc_msb = 1 << 16; + h->prev_frame_num = -1; + h->x264_build = -1; ++ h->sei_fpa.frame_packing_arrangement_cancel_flag = -1; + ff_h264_reset_sei(h); + if (avctx->codec_id == AV_CODEC_ID_H264) { + if (avctx->ticks_per_frame == 1) { +@@ -4783,6 +4784,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, + out->f.reference &= ~DELAYED_PIC_REF; + *got_frame = 1; + *pict = out->f; ++ av_dict_set(&pict->metadata, "stereo_mode", ff_h264_sei_stereo_mode(h), 0); + } + + return buf_index; +@@ -4839,6 +4841,7 @@ not_extra: + if (h->next_output_pic && (h->next_output_pic->sync || h->sync>1)) { + *got_frame = 1; + *pict = h->next_output_pic->f; ++ av_dict_set(&pict->metadata, "stereo_mode", ff_h264_sei_stereo_mode(h), 0); + } + } + +diff --git a/libavcodec/h264.h b/libavcodec/h264.h +index 7ea613c..15a0b21 100644 +--- a/libavcodec/h264.h ++++ b/libavcodec/h264.h +@@ -126,7 +126,8 @@ typedef enum { + SEI_TYPE_PIC_TIMING = 1, ///< picture timing + SEI_TYPE_USER_DATA_ITU_T_T35 = 4, ///< user data registered by ITU-T Recommendation T.35 + SEI_TYPE_USER_DATA_UNREGISTERED = 5, ///< unregistered user data +- SEI_TYPE_RECOVERY_POINT = 6 ///< recovery point (frame # to decoder sync) ++ SEI_TYPE_RECOVERY_POINT = 6, ///< recovery point (frame # to decoder sync) ++ SEI_TYPE_FRAME_PACKING = 45, ///< frame packing arrangement + } SEI_Type; + + /** +@@ -145,6 +146,19 @@ typedef enum { + } SEI_PicStructType; + + /** ++ * frame_packing_arrangement types ++ */ ++typedef enum { ++ SEI_FPA_TYPE_CHECKERBOARD = 0, ++ SEI_FPA_TYPE_INTERLEAVE_COLUMN = 1, ++ SEI_FPA_TYPE_INTERLEAVE_ROW = 2, ++ SEI_FPA_TYPE_SIDE_BY_SIDE = 3, ++ SEI_FPA_TYPE_TOP_BOTTOM = 4, ++ SEI_FPA_TYPE_INTERLEAVE_TEMPORAL = 5, ++ SEI_FPA_TYPE_2D = 6, ++} SEI_FpaType; ++ ++/** + * Sequence parameter set + */ + typedef struct SPS { +@@ -230,6 +244,17 @@ typedef struct PPS { + } PPS; + + /** ++ * Frame Packing Arrangement Type ++ */ ++typedef struct FPA { ++ int frame_packing_arrangement_id; ++ int frame_packing_arrangement_cancel_flag; ///< is previous arrangement canceled, -1 if never received ++ SEI_FpaType frame_packing_arrangement_type; ++ int content_interpretation_type; ++ int quincunx_sampling_flag; ++} FPA; ++ ++/** + * Memory management control operation opcode. + */ + typedef enum MMCOOpcode { +@@ -626,6 +651,8 @@ typedef struct H264Context { + */ + int valid_recovery_point; + ++ FPA sei_fpa; ++ + int luma_weight_flag[2]; ///< 7.4.3.2 luma_weight_lX_flag + int chroma_weight_flag[2]; ///< 7.4.3.2 chroma_weight_lX_flag + +@@ -771,6 +798,12 @@ void ff_h264_filter_mb(H264Context *h, int mb_x, int mb_y, + */ + void ff_h264_reset_sei(H264Context *h); + ++/** ++ * Get stereo_mode string from the h264 frame_packing_arrangement ++ * @param h H.264 context. ++ */ ++const char* ff_h264_sei_stereo_mode(H264Context *h); ++ + /* + * o-o o-o + * / / / +diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c +index 44b92b7..aff9ba1 100644 +--- a/libavcodec/h264_parser.c ++++ b/libavcodec/h264_parser.c +@@ -158,6 +158,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, + h->sei_dpb_output_delay = 0; + h->sei_cpb_removal_delay = -1; + h->sei_buffering_period_present = 0; ++ h->sei_fpa.frame_packing_arrangement_cancel_flag = -1; + + if (!buf_size) + return 0; +diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c +index ece54f1..fc9b96f 100644 +--- a/libavcodec/h264_sei.c ++++ b/libavcodec/h264_sei.c +@@ -194,6 +194,43 @@ static int decode_buffering_period(H264Context *h){ + return 0; + } + ++static int decode_frame_packing(H264Context *h, int size){ ++ int bits = get_bits_left(&h->gb); ++ ++ h->sei_fpa.frame_packing_arrangement_id = get_ue_golomb(&h->gb); ++ h->sei_fpa.frame_packing_arrangement_cancel_flag = get_bits(&h->gb, 1); ++ if (!h->sei_fpa.frame_packing_arrangement_cancel_flag) { ++ h->sei_fpa.frame_packing_arrangement_type = get_bits(&h->gb, 7); ++ h->sei_fpa.quincunx_sampling_flag = get_bits(&h->gb, 1); ++ h->sei_fpa.content_interpretation_type = get_bits(&h->gb, 6); ++ skip_bits(&h->gb, 1); /* spatial_flipping_flag */ ++ skip_bits(&h->gb, 1); /* frame0_flipped_flag */ ++ skip_bits(&h->gb, 1); /* field_views_flag */ ++ skip_bits(&h->gb, 1); /* current_frame_is_frame0_flag */ ++ skip_bits(&h->gb, 1); /* frame0_self_contained_flag */ ++ skip_bits(&h->gb, 1); /* frame1_self_contained_flag */ ++ if (!h->sei_fpa.quincunx_sampling_flag && h->sei_fpa.frame_packing_arrangement_type != 5) { ++ skip_bits(&h->gb, 4); /* frame0_grid_position_x */ ++ skip_bits(&h->gb, 4); /* frame0_grid_position_y */ ++ skip_bits(&h->gb, 4); /* frame1_grid_position_x */ ++ skip_bits(&h->gb, 4); /* frame1_grid_position_y */ ++ } ++ skip_bits(&h->gb, 8); /* frame_packing_arrangement_reserved_byte */ ++ get_ue_golomb(&h->gb) /* frame_packing_arrangement_repetition_period */; ++ } ++ skip_bits(&h->gb, 1); /* frame_packing_arrangement_extension_flag */ ++ ++ if (h->avctx->debug & FF_DEBUG_PICT_INFO) ++ av_log(h->avctx, AV_LOG_DEBUG, "SEI FPA %d %d %d %d %d\n", ++ h->sei_fpa.frame_packing_arrangement_id, ++ h->sei_fpa.frame_packing_arrangement_cancel_flag, ++ h->sei_fpa.frame_packing_arrangement_type, ++ h->sei_fpa.quincunx_sampling_flag, ++ h->sei_fpa.content_interpretation_type); ++ skip_bits(&h->gb, 8*size - (bits - get_bits_left(&h->gb))); ++ return 0; ++} ++ + int ff_h264_decode_sei(H264Context *h){ + while (get_bits_left(&h->gb) > 16) { + int size, type; +@@ -236,6 +273,9 @@ int ff_h264_decode_sei(H264Context *h){ + if(decode_buffering_period(h) < 0) + return -1; + break; ++ case SEI_TYPE_FRAME_PACKING: ++ if(decode_frame_packing(h, size) < 0) ++ return -1; + default: + skip_bits(&h->gb, 8*size); + } +@@ -246,3 +286,48 @@ int ff_h264_decode_sei(H264Context *h){ + + return 0; + } ++ ++const char* ff_h264_sei_stereo_mode(H264Context *h) ++{ ++ if (h->sei_fpa.frame_packing_arrangement_cancel_flag == 0) { ++ switch (h->sei_fpa.frame_packing_arrangement_type) { ++ case SEI_FPA_TYPE_CHECKERBOARD: ++ if (h->sei_fpa.content_interpretation_type == 2) ++ return "checkerboard_rl"; ++ else ++ return "checkerboard_lr"; ++ case SEI_FPA_TYPE_INTERLEAVE_COLUMN: ++ if (h->sei_fpa.content_interpretation_type == 2) ++ return "col_interleaved_rl"; ++ else ++ return "col_interleaved_lr"; ++ case SEI_FPA_TYPE_INTERLEAVE_ROW: ++ if (h->sei_fpa.content_interpretation_type == 2) ++ return "row_interleaved_rl"; ++ else ++ return "row_interleaved_lr"; ++ case SEI_FPA_TYPE_SIDE_BY_SIDE: ++ if (h->sei_fpa.content_interpretation_type == 2) ++ return "right_left"; ++ else ++ return "left_right"; ++ case SEI_FPA_TYPE_TOP_BOTTOM: ++ if (h->sei_fpa.content_interpretation_type == 2) ++ return "bottom_top"; ++ else ++ return "top_bottom"; ++ case SEI_FPA_TYPE_INTERLEAVE_TEMPORAL: ++ if (h->sei_fpa.content_interpretation_type == 2) ++ return "block_rl"; ++ else ++ return "block_lr"; ++ case SEI_FPA_TYPE_2D: ++ default: ++ return "mono"; ++ } ++ } else if (h->sei_fpa.frame_packing_arrangement_cancel_flag == 1) { ++ return "mono"; ++ } else { ++ return NULL; ++ } ++} +-- +1.8.2 + From 04987647c79204bd957a913c9898895ace59c4e0 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 3 Aug 2013 06:06:55 +0200 Subject: [PATCH 076/103] mysql: build with system ssl and zlib support Signed-off-by: Stephan Raue --- packages/databases/mysql/package.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/databases/mysql/package.mk b/packages/databases/mysql/package.mk index 36351cd2f4..ba26f88038 100644 --- a/packages/databases/mysql/package.mk +++ b/packages/databases/mysql/package.mk @@ -26,8 +26,8 @@ PKG_LICENSE="LGPL" PKG_SITE="http://www.mysql.com" PKG_URL="http://cdn.mysql.com/Downloads/MySQL-5.6/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS="zlib ncurses" -PKG_BUILD_DEPENDS_HOST="toolchain ncurses" -PKG_BUILD_DEPENDS_TARGET="toolchain ncurses mysql:host" +PKG_BUILD_DEPENDS_HOST="toolchain zlib openssl ncurses" +PKG_BUILD_DEPENDS_TARGET="toolchain zlib openssl ncurses mysql:host" PKG_PRIORITY="optional" PKG_SECTION="database" PKG_SHORTDESC="mysql: A database server" @@ -103,9 +103,9 @@ configure_target() { -DENABLE_DTRACE=OFF \ -DWITH_EDITLINE=bundled \ -DWITH_LIBEVENT=bundled \ - -DWITH_SSL=bundled \ + -DWITH_SSL=system \ -DWITH_UNIT_TESTS=OFF \ - -DWITH_ZLIB=bundled \ + -DWITH_ZLIB=system \ -DSTACK_DIRECTION=1 \ .. } From 80a7920bf98fa26eb45118f4d691a314ae192e0c Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 3 Aug 2013 16:27:45 +0200 Subject: [PATCH 077/103] dbus: convert to new package format Signed-off-by: Stephan Raue --- packages/devel/dbus-glib-host/meta | 2 +- packages/sysutils/dbus-host/build | 50 ------------------ packages/sysutils/dbus-host/meta | 36 ------------- packages/sysutils/dbus/build | 56 -------------------- packages/sysutils/dbus/install | 52 ------------------- packages/sysutils/dbus/meta | 36 ------------- packages/sysutils/dbus/package.mk | 83 ++++++++++++++++++++++++++++++ 7 files changed, 84 insertions(+), 231 deletions(-) delete mode 100755 packages/sysutils/dbus-host/build delete mode 100644 packages/sysutils/dbus-host/meta delete mode 100755 packages/sysutils/dbus/build delete mode 100755 packages/sysutils/dbus/install delete mode 100644 packages/sysutils/dbus/meta create mode 100644 packages/sysutils/dbus/package.mk diff --git a/packages/devel/dbus-glib-host/meta b/packages/devel/dbus-glib-host/meta index 4ca0904d51..842c55bb0a 100644 --- a/packages/devel/dbus-glib-host/meta +++ b/packages/devel/dbus-glib-host/meta @@ -26,7 +26,7 @@ PKG_LICENSE="GPL" PKG_SITE="http://freedesktop.org/wiki/Software/dbus" PKG_URL="" PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain glib-host dbus-host" +PKG_BUILD_DEPENDS="toolchain glib-host dbus:host" PKG_PRIORITY="optional" PKG_SECTION="devel" PKG_SHORTDESC="dbus-glib: A message bus system" diff --git a/packages/sysutils/dbus-host/build b/packages/sysutils/dbus-host/build deleted file mode 100755 index 1c9f9c32f3..0000000000 --- a/packages/sysutils/dbus-host/build +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -$SCRIPTS/unpack dbus - -DBUS_DIR=`ls -d $BUILD/dbus-[0-9]*` - -setup_toolchain host - -cd $DBUS_DIR - -do_autoreconf - -mkdir -p .build-host && cd .build-host -../configure --host=$HOST_NAME \ - --build=$HOST_NAME \ - --prefix=$ROOT/$TOOLCHAIN \ - --sysconfdir=$ROOT/$TOOLCHAIN/etc \ - --enable-verbose-mode \ - --enable-asserts \ - --enable-checks \ - --disable-tests \ - --disable-xml-docs \ - --disable-doxygen-docs \ - -make -make install - -$ROOT/$TOOLCHAIN/bin/dbus-daemon --introspect > introspect.xml diff --git a/packages/sysutils/dbus-host/meta b/packages/sysutils/dbus-host/meta deleted file mode 100644 index c2a814d55a..0000000000 --- a/packages/sysutils/dbus-host/meta +++ /dev/null @@ -1,36 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="dbus-host" -PKG_VERSION="" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://dbus.freedesktop.org" -PKG_URL="" -PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain expat:host" -PKG_PRIORITY="optional" -PKG_SECTION="system" -PKG_SHORTDESC="dbus: simple interprocess messaging system" -PKG_LONGDESC="D-Bus is a message bus, used for sending messages between applications. This package contains the D-Bus daemon and related utilities and the dbus shared library." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="no" diff --git a/packages/sysutils/dbus/build b/packages/sysutils/dbus/build deleted file mode 100755 index a769e20805..0000000000 --- a/packages/sysutils/dbus/build +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -export ac_cv_have_abstract_sockets=yes - -cd $PKG_BUILD -mkdir -p .build-target && cd .build-target -../configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --libexecdir=/usr/lib/dbus \ - --localstatedir=/var \ - --disable-static \ - --enable-shared \ - --enable-verbose-mode \ - --enable-asserts \ - --enable-checks \ - --disable-tests \ - --disable-ansi \ - --disable-xml-docs \ - --disable-doxygen-docs \ - --enable-abstract-sockets \ - --disable-x11-autolaunch \ - --disable-selinux \ - --disable-libaudit \ - --enable-dnotify \ - --enable-inotify \ - --with-xml=expat \ - --without-x \ - --with-dbus-user=dbus \ - -make - -$MAKEINSTALL diff --git a/packages/sysutils/dbus/install b/packages/sysutils/dbus/install deleted file mode 100755 index 7cc5f5c8fc..0000000000 --- a/packages/sysutils/dbus/install +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -add_user dbus x 81 81 "System message bus" "/" "/bin/sh" -add_group dbus 81 -add_group netdev 497 - -mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/.build-target/tools/dbus-cleanup-sockets $INSTALL/usr/bin - cp $PKG_BUILD/.build-target/bus/dbus-daemon $INSTALL/usr/bin - cp $PKG_BUILD/.build-target/tools/.libs/dbus-monitor $INSTALL/usr/bin - cp $PKG_BUILD/.build-target/tools/.libs/dbus-uuidgen $INSTALL/usr/bin - cp $PKG_BUILD/.build-target/tools/.libs/dbus-send $INSTALL/usr/bin -# cp $PKG_BUILD/.build-target/tools/dbus-launch $INSTALL/usr/bin - -mkdir -p $INSTALL/usr/lib - cp -P $PKG_BUILD/.build-target/dbus/.libs/libdbus-1.so* $INSTALL/usr/lib - -mkdir -p $INSTALL/usr/lib/dbus - cp $PKG_BUILD/.build-target/bus/dbus-daemon-launch-helper $INSTALL/usr/lib/dbus - echo "chmod 4750 $INSTALL/usr/lib/dbus/dbus-daemon-launch-helper" >> $FAKEROOT_SCRIPT - echo "chown 0:81 $INSTALL/usr/lib/dbus/dbus-daemon-launch-helper" >> $FAKEROOT_SCRIPT - -mkdir -p $INSTALL/etc/dbus-1 - cp $PKG_BUILD/.build-target/bus/session.conf $INSTALL/etc/dbus-1 - cp $PKG_BUILD/.build-target/bus/system.conf $INSTALL/etc/dbus-1 - -mkdir -p $INSTALL/etc/dbus-1/system.d -mkdir -p $INSTALL/etc/dbus-1/session.d -mkdir -p $INSTALL/usr/share/dbus-1/services -mkdir -p $INSTALL/usr/share/dbus-1/system-services diff --git a/packages/sysutils/dbus/meta b/packages/sysutils/dbus/meta deleted file mode 100644 index 8a3feb1ef2..0000000000 --- a/packages/sysutils/dbus/meta +++ /dev/null @@ -1,36 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="dbus" -PKG_VERSION="1.6.12" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://dbus.freedesktop.org" -PKG_URL="http://dbus.freedesktop.org/releases/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.gz" -PKG_DEPENDS="expat" -PKG_BUILD_DEPENDS="toolchain expat" -PKG_PRIORITY="required" -PKG_SECTION="system" -PKG_SHORTDESC="dbus: simple interprocess messaging system" -PKG_LONGDESC="D-Bus is a message bus, used for sending messages between applications. This package contains the D-Bus daemon and related utilities and the dbus shared library." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="yes" diff --git a/packages/sysutils/dbus/package.mk b/packages/sysutils/dbus/package.mk new file mode 100644 index 0000000000..b877a41fae --- /dev/null +++ b/packages/sysutils/dbus/package.mk @@ -0,0 +1,83 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="dbus" +PKG_VERSION="1.6.12" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://dbus.freedesktop.org" +PKG_URL="http://dbus.freedesktop.org/releases/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.gz" +PKG_DEPENDS="expat" +PKG_BUILD_DEPENDS_TARGET="toolchain expat" +PKG_BUILD_DEPENDS_HOST="toolchain expat:host" +PKG_PRIORITY="required" +PKG_SECTION="system" +PKG_SHORTDESC="dbus: simple interprocess messaging system" +PKG_LONGDESC="D-Bus is a message bus, used for sending messages between applications. This package contains the D-Bus daemon and related utilities and the dbus shared library." + +PKG_IS_ADDON="no" +PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="export ac_cv_have_abstract_sockets=yes \ + --libexecdir=/usr/lib/dbus \ + --enable-verbose-mode \ + --enable-asserts \ + --enable-checks \ + --disable-tests \ + --disable-ansi \ + --disable-xml-docs \ + --disable-doxygen-docs \ + --enable-abstract-sockets \ + --disable-x11-autolaunch \ + --disable-selinux \ + --disable-libaudit \ + --disable-systemd \ + --enable-dnotify \ + --enable-inotify \ + --with-xml=expat \ + --without-x \ + --with-dbus-user=dbus" + +PKG_CONFIGURE_OPTS_HOST="--enable-verbose-mode \ + --enable-asserts \ + --enable-checks \ + --disable-tests \ + --disable-xml-docs \ + --disable-doxygen-docs" + +post_makeinstall_host() { + $ROOT/$TOOLCHAIN/bin/dbus-daemon --introspect > introspect.xml +} + +post_makeinstall_target() { + rm -rf $INSTALL/lib/systemd + rm -rf $INSTALL/etc/rc.d + rm -rf $INSTALL/usr/lib/dbus-1.0/include +} + +post_install() { + add_user dbus x 81 81 "System message bus" "/" "/bin/sh" + add_group dbus 81 + add_group netdev 497 + + echo "chmod 4750 $INSTALL/usr/lib/dbus/dbus-daemon-launch-helper" >> $FAKEROOT_SCRIPT + echo "chown 0:81 $INSTALL/usr/lib/dbus/dbus-daemon-launch-helper" >> $FAKEROOT_SCRIPT +} From 8a7431104cb23d32b50355d00a2fb8b31ae3fc57 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 3 Aug 2013 21:03:54 +0200 Subject: [PATCH 078/103] connman: convert to new package format Signed-off-by: Stephan Raue --- packages/network/connman/build | 78 ------------------ packages/network/connman/install | 81 ------------------- packages/network/connman/meta | 48 ----------- packages/network/connman/package.mk | 118 ++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+), 207 deletions(-) delete mode 100755 packages/network/connman/build delete mode 100755 packages/network/connman/install delete mode 100644 packages/network/connman/meta create mode 100644 packages/network/connman/package.mk diff --git a/packages/network/connman/build b/packages/network/connman/build deleted file mode 100755 index 5c550d32d3..0000000000 --- a/packages/network/connman/build +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -if [ "$PPTP_SUPPORT" = yes ]; then - CONNMAN_PPTP="--enable-pptp" - export PPPD="/usr/sbin/pppd" - export PPTP="/usr/sbin/pptp" -else - CONNMAN_PPTP="--disable-pptp" -fi - -if [ "$OPENVPN_SUPPORT" = yes ]; then - CONNMAN_OPENVPN="--enable-openvpn --with-openvpn=/usr/sbin/openvpn" -else - CONNMAN_OPENVPN="--disable-openvpn" -fi - -export WPASUPPLICANT="/usr/bin/wpa_supplicant" - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --disable-static \ - --enable-shared \ - --disable-gtk-doc \ - --disable-debug \ - --disable-hh2serial-gps \ - --disable-openconnect \ - $CONNMAN_OPENVPN \ - --disable-vpnc \ - --disable-l2tp \ - $CONNMAN_PPTP \ - --disable-iospm \ - --disable-tist \ - --disable-session-policy-local \ - --disable-test \ - --disable-nmcompat \ - --disable-polkit \ - --disable-selinux \ - --enable-loopback=builtin \ - --enable-ethernet=builtin \ - --enable-wifi=builtin \ - --disable-bluetooth \ - --disable-ofono \ - --disable-dundee \ - --disable-pacrunner \ - --disable-neard \ - --disable-wispr \ - --disable-tools \ - --enable-client \ - --enable-datafiles \ - --disable-silent-rules \ - -make storagedir=/storage/.cache/connman vpn_storagedir=/storage/.config/vpn-config statedir=/run/connman diff --git a/packages/network/connman/install b/packages/network/connman/install deleted file mode 100755 index 3f64248b57..0000000000 --- a/packages/network/connman/install +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -add_user system x 430 430 "service" "/var/run/connman" "/bin/sh" -add_group system 430 - -mkdir -p $INSTALL/etc - ln -sf /var/cache/resolv.conf $INSTALL/etc/resolv.conf - -mkdir -p $INSTALL/etc/connman - cp $PKG_BUILD/src/main.conf $INSTALL/etc/connman - sed -i $INSTALL/etc/connman/main.conf \ - -e "s|^# BackgroundScanning.*|BackgroundScanning = true|g" \ - -e "s|^# FallbackNameservers.*|FallbackNameservers = 8.8.8.8,8.8.4.4|g" \ - -e "s|^# PreferredTechnologies.*|PreferredTechnologies = ethernet,wifi,cellular|g" \ - -e "s|^# TetheringTechnologies.*|TetheringTechnologies = wifi|g" \ - -e "s|^# PersistentTetheringMode.*|PersistentTetheringMode = true|g" - -mkdir -p $INSTALL/etc/dbus-1/system.d - cp $PKG_BUILD/src/connman.conf $INSTALL/etc/dbus-1/system.d - -mkdir -p $INSTALL/usr/bin - cp -P $PKG_BUILD/client/connmanctl $INSTALL/usr/bin - -mkdir -p $INSTALL/usr/lib/connman - cp -P $PKG_BUILD/test/* $INSTALL/usr/lib/connman - -mkdir -p $INSTALL/usr/lib/connman/plugins - cp -P $PKG_BUILD/plugins/.libs/*.so* $INSTALL/usr/lib/connman/plugins || true - -mkdir -p $INSTALL/usr/lib/connman/scripts - cp -P $PKG_BUILD/scripts/.libs/*.so* $INSTALL/usr/lib/connman/scripts || true - -mkdir -p $INSTALL/usr/sbin - cp -P $PKG_BUILD/src/connmand $INSTALL/usr/sbin - -mkdir -p $INSTALL/usr/config - cp $PKG_DIR/config/hosts.conf $INSTALL/usr/config - -mkdir -p $INSTALL/usr/share/connman/ - cp $PKG_DIR/config/settings $INSTALL/usr/share/connman/ - -if [ "$PPTP_SUPPORT" = yes -o "$OPENVPN_SUPPORT" = yes ]; then - mkdir -p $INSTALL/etc/dbus-1/system.d - cp $PKG_BUILD/vpn/connman-vpn-dbus.conf $INSTALL/etc/dbus-1/system.d - - mkdir -p $INSTALL/usr/lib/connman/plugins-vpn - cp -P $PKG_BUILD/vpn/plugins/.libs/*.so $INSTALL/usr/lib/connman/plugins-vpn || true - - mkdir -p $INSTALL/usr/sbin - cp -P $PKG_BUILD/vpn/connman-vpnd $INSTALL/usr/sbin - - mkdir -p $INSTALL/usr/share/dbus-1/system-services - cp -P $PKG_BUILD/vpn/net.connman.vpn.service $INSTALL/usr/share/dbus-1/system-services -fi - -if [ "$OPENVPN_SUPPORT" = yes ]; then - mkdir -p $INSTALL/usr/lib/connman/scripts - cp -P $PKG_BUILD/scripts/openvpn-script $INSTALL/usr/lib/connman/scripts -fi diff --git a/packages/network/connman/meta b/packages/network/connman/meta deleted file mode 100644 index 143f46db64..0000000000 --- a/packages/network/connman/meta +++ /dev/null @@ -1,48 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="connman" -PKG_VERSION="d052eb3" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://www.connman.net" -#PKG_URL="http://www.kernel.org/pub/linux/network/connman/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_DEPENDS="glib readline dbus iptables wpa_supplicant ntp Python pygobject dbus-python" -PKG_BUILD_DEPENDS="toolchain glib readline dbus iptables" -PKG_PRIORITY="optional" -PKG_SECTION="network" -PKG_SHORTDESC="connman: Network manager daemon" -PKG_LONGDESC="The ConnMan project provides a daemon for managing internet connections within embedded devices running the Linux operating system. The Connection Manager is designed to be slim and to use as few resources as possible, so it can be easily integrated. It is a fully modular system that can be extended, through plug-ins, to support all kinds of wired or wireless technologies. Also, configuration methods, like DHCP and domain name resolving, are implemented using plug-ins. The plug-in approach allows for easy adaption and modification for various use cases." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="yes" - -if [ "$PPTP_SUPPORT" = yes ]; then - PKG_DEPENDS="$PKG_DEPENDS ppp pptp" - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS ppp pptp" -fi - -if [ "$OPENVPN_SUPPORT" = yes ]; then - PKG_DEPENDS="$PKG_DEPENDS openvpn" - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS openvpn" -fi - diff --git a/packages/network/connman/package.mk b/packages/network/connman/package.mk new file mode 100644 index 0000000000..6d6af1c56d --- /dev/null +++ b/packages/network/connman/package.mk @@ -0,0 +1,118 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="connman" +PKG_VERSION="d052eb3" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://www.connman.net" +#PKG_URL="http://www.kernel.org/pub/linux/network/connman/$PKG_NAME-$PKG_VERSION.tar.xz" +PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" +PKG_DEPENDS="glib readline dbus iptables wpa_supplicant ntp Python pygobject dbus-python" +PKG_BUILD_DEPENDS_TARGET="toolchain glib readline dbus iptables" +PKG_PRIORITY="optional" +PKG_SECTION="network" +PKG_SHORTDESC="connman: Network manager daemon" +PKG_LONGDESC="The ConnMan project provides a daemon for managing internet connections within embedded devices running the Linux operating system. The Connection Manager is designed to be slim and to use as few resources as possible, so it can be easily integrated. It is a fully modular system that can be extended, through plug-ins, to support all kinds of wired or wireless technologies. Also, configuration methods, like DHCP and domain name resolving, are implemented using plug-ins. The plug-in approach allows for easy adaption and modification for various use cases." + +PKG_IS_ADDON="no" +PKG_AUTORECONF="yes" + +if [ "$PPTP_SUPPORT" = yes ]; then + PKG_DEPENDS="$PKG_DEPENDS ppp pptp" + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET ppp pptp" + CONNMAN_PPTP="--enable-pptp PPPD=/usr/sbin/pppd PPTP=/usr/sbin/pptp" +else + CONNMAN_PPTP="--disable-pptp" +fi + +if [ "$OPENVPN_SUPPORT" = yes ]; then + PKG_DEPENDS="$PKG_DEPENDS openvpn" + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET openvpn" + CONNMAN_OPENVPN="--enable-openvpn --with-openvpn=/usr/sbin/openvpn" +else + CONNMAN_OPENVPN="--disable-openvpn" +fi + +PKG_CONFIGURE_OPTS_TARGET="WPASUPPLICANT=/usr/bin/wpa_supplicant \ + --disable-gtk-doc \ + --disable-debug \ + --disable-hh2serial-gps \ + --disable-openconnect \ + $CONNMAN_OPENVPN \ + --disable-vpnc \ + --disable-l2tp \ + $CONNMAN_PPTP \ + --disable-iospm \ + --disable-tist \ + --disable-session-policy-local \ + --disable-test \ + --disable-nmcompat \ + --disable-polkit \ + --disable-selinux \ + --enable-loopback=builtin \ + --enable-ethernet=builtin \ + --enable-wifi=builtin \ + --disable-bluetooth \ + --disable-ofono \ + --disable-dundee \ + --disable-pacrunner \ + --disable-neard \ + --disable-wispr \ + --disable-tools \ + --enable-client \ + --enable-datafiles \ + --disable-silent-rules" + + +PKG_MAKE_OPTS_TARGET="storagedir=/storage/.cache/connman \ + vpn_storagedir=/storage/.config/vpn-config \ + statedir=/run/connman" + +post_makeinstall_target() { + rm -rf $INSTALL/lib/systemd + + mkdir $INSTALL/usr/bin + cp -P client/connmanctl $INSTALL/usr/bin + + mkdir -p $INSTALL/etc + ln -sf /var/cache/resolv.conf $INSTALL/etc/resolv.conf + + mkdir -p $INSTALL/etc/connman + cp ../src/main.conf $INSTALL/etc/connman + sed -i $INSTALL/etc/connman/main.conf \ + -e "s|^# BackgroundScanning.*|BackgroundScanning = true|g" \ + -e "s|^# FallbackNameservers.*|FallbackNameservers = 8.8.8.8,8.8.4.4|g" \ + -e "s|^# PreferredTechnologies.*|PreferredTechnologies = ethernet,wifi,cellular|g" \ + -e "s|^# TetheringTechnologies.*|TetheringTechnologies = wifi|g" \ + -e "s|^# PersistentTetheringMode.*|PersistentTetheringMode = true|g" + + mkdir -p $INSTALL/usr/config + cp $PKG_DIR/config/hosts.conf $INSTALL/usr/config + + mkdir -p $INSTALL/usr/share/connman/ + cp $PKG_DIR/config/settings $INSTALL/usr/share/connman/ +} + +post_install() { + add_user system x 430 430 "service" "/var/run/connman" "/bin/sh" + add_group system 430 +} From 0b7d137ec1aedb746c8c25e10fdbb8435411f797 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 3 Aug 2013 22:09:14 +0200 Subject: [PATCH 079/103] opnessh: convert to new package format Signed-off-by: Stephan Raue --- packages/network/openssh/build | 44 ----------------- packages/network/openssh/install | 47 ------------------- packages/network/openssh/{meta => package.mk} | 37 ++++++++++++++- 3 files changed, 35 insertions(+), 93 deletions(-) delete mode 100755 packages/network/openssh/build delete mode 100755 packages/network/openssh/install rename packages/network/openssh/{meta => package.mk} (64%) diff --git a/packages/network/openssh/build b/packages/network/openssh/build deleted file mode 100755 index b8e3dcd726..0000000000 --- a/packages/network/openssh/build +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -export LD="$TARGET_CC" -export LDFLAGS="$TARGET_CFLAGS $TARGET_LDFLAGS" - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --disable-strip \ - --disable-lastlog \ - --with-sandbox=no \ - --disable-utmp \ - --disable-utmpx \ - --disable-wtmp \ - --disable-wtmpx \ - --without-rpath \ - --with-ssl-engine \ - --without-pam - -make diff --git a/packages/network/openssh/install b/packages/network/openssh/install deleted file mode 100755 index 4645770c8e..0000000000 --- a/packages/network/openssh/install +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -add_user sshd x 74 74 "Privilege-separated SSH" "/var/empty/sshd" "/bin/sh" -add_group sshd 74 - -mkdir -p $INSTALL/etc - cp $PKG_DIR/config/ssh_config $INSTALL/etc - cp $PKG_DIR/config/sshd_config $INSTALL/etc - cp $PKG_BUILD/moduli $INSTALL/etc - -mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/scp $INSTALL/usr/bin/ - cp $PKG_BUILD/ssh $INSTALL/usr/bin/ - cp $PKG_BUILD/ssh-add $INSTALL/usr/bin/ - cp $PKG_BUILD/ssh-agent $INSTALL/usr/bin/ - cp $PKG_BUILD/ssh-keygen $INSTALL/usr/bin/ - -mkdir -p $INSTALL/usr/sbin - cp $PKG_BUILD/sshd $INSTALL/usr/sbin/ - -if [ $SFTP_SERVER = "yes" ]; then - mkdir -p $INSTALL/usr/libexec - cp $PKG_BUILD/sftp-server $INSTALL/usr/libexec -fi - diff --git a/packages/network/openssh/meta b/packages/network/openssh/package.mk similarity index 64% rename from packages/network/openssh/meta rename to packages/network/openssh/package.mk index 9c51c715a6..fd71bff90e 100644 --- a/packages/network/openssh/meta +++ b/packages/network/openssh/package.mk @@ -26,12 +26,45 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.openssh.com/" PKG_URL="ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS="zlib openssl" -PKG_BUILD_DEPENDS="toolchain zlib openssl" +PKG_BUILD_DEPENDS_TARGET="toolchain zlib openssl" PKG_PRIORITY="optional" PKG_SECTION="network" PKG_SHORTDESC="openssh: An open re-implementation of the SSH package" PKG_LONGDESC="This is a Linux port of OpenBSD's excellent OpenSSH. OpenSSH is based on the last free version of Tatu Ylonen's SSH with all patent-encumbered algorithms removed, all known security bugs fixed, new features reintroduced, and many other clean-ups. SSH (Secure Shell) is a program to log into another computer over a network, to execute commands in a remote machine, and to move files from one machine to another. It provides strong authentication and secure communications over insecure channels. It is intended as a replacement for rlogin, rsh, rcp, and rdist." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" +PKG_CONFIGURE_OPTS_TARGET="--libexecdir=/usr/lib/openssh \ + --disable-strip \ + --disable-lastlog \ + --with-sandbox=no \ + --disable-utmp \ + --disable-utmpx \ + --disable-wtmp \ + --disable-wtmpx \ + --without-rpath \ + --with-ssl-engine \ + --without-pam" + +pre_configure_target() { + export LD="$TARGET_CC" + export LDFLAGS="$TARGET_CFLAGS $TARGET_LDFLAGS" +} + +post_makeinstall_target() { + mkdir -p $INSTALL/etc + cp $PKG_DIR/config/ssh_config $INSTALL/etc + cp $PKG_DIR/config/sshd_config $INSTALL/etc + + rm -rf $INSTALL/usr/lib/openssh/ssh-keysign + rm -rf $INSTALL/usr/lib/openssh/ssh-pkcs11-helper + if [ ! $SFTP_SERVER = "yes" ]; then + rm -rf $INSTALL/usr/lib/openssh/sftp-server + fi +} + +post_install() { + add_user sshd x 74 74 "Privilege-separated SSH" "/var/empty/sshd" "/bin/sh" + add_group sshd 74 +} From 1df4ac98a7ad5e6cb24c22c63eaf2ba0c3e588b1 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 4 Aug 2013 12:36:57 +0200 Subject: [PATCH 080/103] rpcbind: convert to new package format Signed-off-by: Stephan Raue --- packages/network/rpcbind/build | 36 ------------------- packages/network/rpcbind/install | 27 -------------- packages/network/rpcbind/{meta => package.mk} | 9 +++-- 3 files changed, 7 insertions(+), 65 deletions(-) delete mode 100755 packages/network/rpcbind/build delete mode 100755 packages/network/rpcbind/install rename packages/network/rpcbind/{meta => package.mk} (86%) diff --git a/packages/network/rpcbind/build b/packages/network/rpcbind/build deleted file mode 100755 index c8b26811ca..0000000000 --- a/packages/network/rpcbind/build +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --enable-warmstarts \ - --disable-libwrap \ - --with-statedir=/tmp \ - --with-rpcuser=root \ - -make -$MAKEINSTALL diff --git a/packages/network/rpcbind/install b/packages/network/rpcbind/install deleted file mode 100755 index 62d7f24c1e..0000000000 --- a/packages/network/rpcbind/install +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/rpcbind $INSTALL/usr/bin - cp $PKG_BUILD/rpcinfo $INSTALL/usr/bin diff --git a/packages/network/rpcbind/meta b/packages/network/rpcbind/package.mk similarity index 86% rename from packages/network/rpcbind/meta rename to packages/network/rpcbind/package.mk index 65edef95fb..09c71e4673 100644 --- a/packages/network/rpcbind/meta +++ b/packages/network/rpcbind/package.mk @@ -26,11 +26,16 @@ PKG_LICENSE="OSS" PKG_SITE="http://rpcbind.sourceforge.net/" PKG_URL="$SOURCEFORGE_SRC/rpcbind/rpcbind/$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="libtirpc" -PKG_BUILD_DEPENDS="toolchain libtirpc" +PKG_BUILD_DEPENDS_TARGET="toolchain libtirpc" PKG_PRIORITY="optional" PKG_SECTION="network" PKG_SHORTDESC="rpcbind: a server that converts RPC program numbers into universal addresses." PKG_LONGDESC="The rpcbind utility is a server that converts RPC program numbers into universal addresses." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--enable-warmstarts \ + --disable-libwrap \ + --with-statedir=/tmp \ + --with-rpcuser=root" From c927b5f695a477414d99801f663e310eeeb0a3b1 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 4 Aug 2013 14:51:38 +0200 Subject: [PATCH 081/103] eventlircd: convert to new package format Signed-off-by: Stephan Raue --- packages/sysutils/remote/eventlircd/build | 34 ------------------ packages/sysutils/remote/eventlircd/install | 35 ------------------- .../remote/eventlircd/{meta => package.mk} | 14 ++++++-- 3 files changed, 12 insertions(+), 71 deletions(-) delete mode 100755 packages/sysutils/remote/eventlircd/build delete mode 100755 packages/sysutils/remote/eventlircd/install rename packages/sysutils/remote/eventlircd/{meta => package.mk} (84%) diff --git a/packages/sysutils/remote/eventlircd/build b/packages/sysutils/remote/eventlircd/build deleted file mode 100755 index 0cc8c47eb4..0000000000 --- a/packages/sysutils/remote/eventlircd/build +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sbindir=/usr/sbin \ - --exec-prefix=/usr \ - --localstatedir=/var \ - --sysconfdir=/etc \ - -make diff --git a/packages/sysutils/remote/eventlircd/install b/packages/sysutils/remote/eventlircd/install deleted file mode 100755 index bf92e2d891..0000000000 --- a/packages/sysutils/remote/eventlircd/install +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/sbin - cp $PKG_BUILD/src/eventlircd $INSTALL/usr/sbin - -mkdir -p $INSTALL/lib/udev - cp $PKG_BUILD/udev/lircd_helper $INSTALL/lib/udev - chmod +x $INSTALL/lib/udev/lircd_helper - cp $PKG_BUILD/udev/wakeup_enable $INSTALL/lib/udev - chmod +x $INSTALL/lib/udev/wakeup_enable - -mkdir -p $INSTALL/etc/eventlircd.d - cp $PKG_DIR/evmap/*.evmap $INSTALL/etc/eventlircd.d diff --git a/packages/sysutils/remote/eventlircd/meta b/packages/sysutils/remote/eventlircd/package.mk similarity index 84% rename from packages/sysutils/remote/eventlircd/meta rename to packages/sysutils/remote/eventlircd/package.mk index 79b9f2fac7..8d9e65438b 100644 --- a/packages/sysutils/remote/eventlircd/meta +++ b/packages/sysutils/remote/eventlircd/package.mk @@ -26,11 +26,21 @@ PKG_LICENSE="GPL" PKG_SITE="http://code.google.com/p/eventlircd" PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="systemd lirc" -PKG_BUILD_DEPENDS="toolchain systemd" +PKG_BUILD_DEPENDS_TARGET="toolchain systemd" PKG_PRIORITY="optional" PKG_SECTION="system/remote" PKG_SHORTDESC="eventlircd:The eventlircd daemon provides various functions for LIRC devices" PKG_LONGDESC="The eventlircd daemon provides four functions for LIRC devices" -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +post_makeinstall_target() { +# install our own evmap files and udev rules + rm -rf $INSTALL/etc/eventlircd.d + rm -rf $INSTALL/lib/udev/rules.d + + mkdir -p $INSTALL/etc/eventlircd.d + cp $PKG_DIR/evmap/*.evmap $INSTALL/etc/eventlircd.d +} + From ea878068ccee7a09c6d7a09428b34aecb41cd9e6 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 4 Aug 2013 17:06:52 +0200 Subject: [PATCH 082/103] udisks: convert to new package format Signed-off-by: Stephan Raue --- packages/sysutils/udisks/build | 48 ------------- packages/sysutils/udisks/install | 69 ------------------- packages/sysutils/udisks/{meta => package.mk} | 20 +++++- 3 files changed, 18 insertions(+), 119 deletions(-) delete mode 100755 packages/sysutils/udisks/build delete mode 100755 packages/sysutils/udisks/install rename packages/sysutils/udisks/{meta => package.mk} (73%) diff --git a/packages/sysutils/udisks/build b/packages/sysutils/udisks/build deleted file mode 100755 index 757af4c93d..0000000000 --- a/packages/sysutils/udisks/build +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --bindir=/usr/bin \ - --sbindir=/usr/bin \ - --sysconfdir=/etc \ - --datadir=/usr/share \ - --libexecdir=/usr/lib/udisks \ - --localstatedir=/var \ - --disable-static \ - --enable-shared \ - --disable-man-pages \ - --disable-gtk-doc \ - --disable-gtk-doc-html \ - --disable-gtk-doc-pdf \ - --disable-lvm2 \ - --disable-dmmp \ - --disable-remote-access \ - --enable-nls \ - -make - -$MAKEINSTALL diff --git a/packages/sysutils/udisks/install b/packages/sysutils/udisks/install deleted file mode 100755 index a27c17503b..0000000000 --- a/packages/sysutils/udisks/install +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/etc/dbus-1/system.d - cp $PKG_BUILD/data/org.freedesktop.UDisks.conf $INSTALL/etc/dbus-1/system.d - -mkdir -p $INSTALL/lib/udev - cp -P $PKG_BUILD/src/probers/udisks-part-id $INSTALL/lib/udev - cp -P $PKG_BUILD/src/probers/udisks-probe-ata-smart $INSTALL/lib/udev - -mkdir -p $INSTALL/lib/udev/rules.d -# cp $PKG_BUILD/data/80-udisks.rules $INSTALL/lib/udev/rules.d - -mkdir -p $INSTALL/usr/bin - cp -P $PKG_BUILD/tools/udisks $INSTALL/usr/bin - cp -P $PKG_BUILD/tools/umount.udisks $INSTALL/usr/bin - -mkdir -p $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/udisks-daemon $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-ata-smart-collect $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-ata-smart-selftest $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-change-filesystem-label $INSTALL/usr/lib/udisks -# cp -P $PKG_BUILD/src/helpers/udisks-helper-change-luks-password $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-create-partition $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-create-partition-table $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-delete-partition $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-drive-benchmark $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-drive-detach $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-drive-poll $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-fstab-mounter $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-linux-md-check $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-linux-md-remove-component $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-mdadm-expand $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-mkfs $INSTALL/usr/lib/udisks - cp -P $PKG_BUILD/src/helpers/udisks-helper-modify-partition $INSTALL/usr/lib/udisks - -mkdir -p $INSTALL/usr/share/dbus-1/interfaces - cp -P $PKG_BUILD/data/org.freedesktop.UDisks.Adapter.xml $INSTALL/usr/share/dbus-1/interfaces - cp -P $PKG_BUILD/data/org.freedesktop.UDisks.Device.xml $INSTALL/usr/share/dbus-1/interfaces - cp -P $PKG_BUILD/data/org.freedesktop.UDisks.Expander.xml $INSTALL/usr/share/dbus-1/interfaces - cp -P $PKG_BUILD/data/org.freedesktop.UDisks.Port.xml $INSTALL/usr/share/dbus-1/interfaces - cp -P $PKG_BUILD/data/org.freedesktop.UDisks.xml $INSTALL/usr/share/dbus-1/interfaces - -mkdir -p $INSTALL/usr/share/dbus-1/system-services - cp -P $PKG_BUILD/data/org.freedesktop.UDisks.service $INSTALL/usr/share/dbus-1/system-services - -mkdir -p $INSTALL/usr/share/polkit-1/actions - cp -P $PKG_BUILD/policy/org.freedesktop.udisks.policy $INSTALL/usr/share/polkit-1/actions diff --git a/packages/sysutils/udisks/meta b/packages/sysutils/udisks/package.mk similarity index 73% rename from packages/sysutils/udisks/meta rename to packages/sysutils/udisks/package.mk index 1bfa6f6bb0..31c67651d8 100644 --- a/packages/sysutils/udisks/meta +++ b/packages/sysutils/udisks/package.mk @@ -26,11 +26,27 @@ PKG_LICENSE="GPL" PKG_SITE="http://www.freedesktop.org/wiki/Software/udisks" PKG_URL="http://hal.freedesktop.org/releases/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS="systemd glib dbus parted polkit libatasmart" -PKG_BUILD_DEPENDS="toolchain sg3_utils systemd glib dbus dbus-glib parted polkit libatasmart" +PKG_BUILD_DEPENDS_TARGET="toolchain sg3_utils systemd glib dbus dbus-glib parted polkit libatasmart" PKG_PRIORITY="optional" PKG_SECTION="system" PKG_SHORTDESC="udisks: a modular hardware abstraction layer designed for use in Linux systems that is designed to simplify device management." PKG_LONGDESC="Udisks is a modular hardware abstraction layer designed for use in Linux systems that is designed to simplify device management and replace the current monolithic Linux HAL. Udisks includes the ability to enumerate system devices and send notifications when hardware is added or removed from the computer system." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--datadir=/usr/share \ + --libexecdir=/usr/lib/udisks \ + --disable-man-pages \ + --disable-gtk-doc \ + --disable-gtk-doc-html \ + --disable-gtk-doc-pdf \ + --disable-lvm2 \ + --disable-dmmp \ + --disable-remote-access \ + --enable-nls" + +post_makeinstall_target() { + rm -rf $INSTALL/etc/profile.d + rm -rf $INSTALL/lib/udev/rules.d +} From 328e2223777575b27bbb076510010638705d461d Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 4 Aug 2013 18:31:26 +0200 Subject: [PATCH 083/103] xorg-server: convert to new package format Signed-off-by: Stephan Raue --- packages/x11/xserver/xorg-server/build | 137 ------------- packages/x11/xserver/xorg-server/install | 81 -------- packages/x11/xserver/xorg-server/meta | 73 ------- packages/x11/xserver/xorg-server/package.mk | 189 ++++++++++++++++++ .../xorg-server/tmpfiles.d/xorg-server.conf | 22 ++ 5 files changed, 211 insertions(+), 291 deletions(-) delete mode 100755 packages/x11/xserver/xorg-server/build delete mode 100755 packages/x11/xserver/xorg-server/install delete mode 100644 packages/x11/xserver/xorg-server/meta create mode 100644 packages/x11/xserver/xorg-server/package.mk create mode 100644 packages/x11/xserver/xorg-server/tmpfiles.d/xorg-server.conf diff --git a/packages/x11/xserver/xorg-server/build b/packages/x11/xserver/xorg-server/build deleted file mode 100755 index 3065a91938..0000000000 --- a/packages/x11/xserver/xorg-server/build +++ /dev/null @@ -1,137 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -XORG_SRC="$PKG_BUILD/hw/xfree86" - -get_graphicdrivers - -if [ "$COMPOSITE_SUPPORT" = "yes" ]; then - XORG_COMPOSITE="--enable-composite" -else - XORG_COMPOSITE="--disable-composite" -fi - -if [ "$XINERAMA_SUPPORT" = "yes" ]; then - XORG_XINERAMA="--enable-xinerama" -else - XORG_XINERAMA="--disable-xinerama" -fi - -if [ "$OPENGL" = "Mesa" ]; then - XORG_MESA="--enable-glx --enable-dri" -else - XORG_MESA="--disable-glx --disable-dri" -fi - -# hack to prevent a build error - CFLAGS=`echo $CFLAGS | sed -e "s|-O3|-O2|" -e "s|-Ofast|-O2|"` - LDFLAGS=`echo $LDFLAGS | sed -e "s|-O3|-O2|" -e "s|-Ofast|-O2|"` - -cd $PKG_BUILD - -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --datarootdir=/usr/share \ - --disable-static \ - --enable-shared \ - --disable-debug \ - --disable-silent-rules \ - --disable-strict-compilation \ - --enable-largefile \ - --enable-visibility \ - --disable-unit-tests \ - --disable-sparkle \ - --disable-install-libxf86config \ - --disable-xselinux \ - --enable-aiglx \ - --enable-glx-tls \ - --enable-registry \ - $XORG_COMPOSITE \ - $XORG_XINERAMA \ - --enable-mitshm \ - --disable-xres \ - --enable-record \ - --enable-xv \ - --disable-xvmc \ - --enable-dga \ - --disable-screensaver \ - --disable-xdmcp \ - --disable-xdm-auth-1 \ - $XORG_MESA \ - --enable-dri2 \ - --enable-xf86vidmode \ - --disable-xace \ - --disable-xcsecurity \ - --disable-tslib \ - --enable-dbe \ - --disable-xf86bigfont \ - --enable-dpms \ - --enable-config-udev \ - --disable-config-dbus \ - --disable-config-hal \ - --enable-xfree86-utils \ - --enable-xaa \ - --enable-vgahw \ - --enable-vbe \ - --enable-int10-module \ - --disable-windowswm \ - --enable-libdrm \ - --enable-xorg \ - --disable-dmx \ - --disable-xvfb \ - --disable-xnest \ - --disable-xquartz \ - --disable-standalone-xpbproxy \ - --disable-xwin \ - --disable-kdrive \ - --disable-xephyr \ - --disable-xfake \ - --disable-xfbdev \ - --enable-unix-transport \ - --disable-tcp-transport \ - --disable-local-transport \ - --disable-install-setuid \ - --disable-secure-rpc \ - --disable-docs \ - --disable-devel-docs \ - --with-int10=x86emu \ - --disable-ipv6 \ - --with-gnu-ld \ - --with-sha1=libcrypto \ - --with-os-vendor="OpenELEC.tv" \ - --with-module-dir=$XORG_PATH_MODULES \ - --with-xkb-path=$XORG_PATH_XKB \ - --with-xkb-output=/var/cache/xkb \ - --with-log-dir=/var/log \ - --with-fontrootdir=/usr/share/fonts \ - --with-default-font-path="/usr/share/fonts/misc,built-ins" \ - --with-serverconfig-path="/usr/lib/xserver" \ - --without-xmlto \ - --without-fop \ - -make -$MAKEINSTALL diff --git a/packages/x11/xserver/xorg-server/install b/packages/x11/xserver/xorg-server/install deleted file mode 100755 index db5d7c1354..0000000000 --- a/packages/x11/xserver/xorg-server/install +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -get_graphicdrivers - -XORG_SRC="$PKG_BUILD/hw/xfree86" -XORG_DST="$INSTALL/$XORG_PATH_MODULES" - -mkdir -p $INSTALL/usr/bin - cp $XORG_SRC/Xorg $INSTALL/usr/bin - -mkdir -p $INSTALL/lib/udev - cp $PKG_DIR/scripts/xorg_start $INSTALL/lib/udev - -mkdir -p $XORG_DST - cp -P $XORG_SRC/exa/.libs/libexa.so $XORG_DST - cp -P $XORG_SRC/dixmods/.libs/libfb.so $XORG_DST - cp -P $XORG_SRC/fbdevhw/.libs/libfbdevhw.so $XORG_DST - cp -P $XORG_SRC/int10/.libs/libint10.so $XORG_DST - cp -P $XORG_SRC/dixmods/.libs/libshadow.so $XORG_DST - cp -P $XORG_SRC/shadowfb/.libs/libshadowfb.so $XORG_DST - cp -P $XORG_SRC/vbe/.libs/libvbe.so $XORG_DST - cp -P $XORG_SRC/vgahw/.libs/libvgahw.so $XORG_DST - cp -P $XORG_SRC/dixmods/.libs/libwfb.so $XORG_DST - cp -P $XORG_SRC/xaa/.libs/libxaa.so $XORG_DST - -mkdir -p $XORG_DST/extensions - cp -P $XORG_SRC/dixmods/.libs/libdbe.so $XORG_DST/extensions - cp -P $XORG_SRC/dixmods/.libs/librecord.so $XORG_DST/extensions - cp -P $XORG_SRC/dri2/.libs/libdri2.so $XORG_DST/extensions - cp -P $XORG_SRC/dixmods/extmod/.libs/libextmod.so $XORG_DST/extensions - - if [ -f $XORG_SRC/dri/.libs/libdri.so ]; then - cp -P $XORG_SRC/dri/.libs/libdri.so $XORG_DST/extensions - fi - if [ -f $XORG_SRC/dixmods/.libs/libglx.so ]; then - cp -P $XORG_SRC/dixmods/.libs/libglx.so $XORG_DST/extensions/libglx_mesa.so # rename for cooperate with nvidia drivers - ln -sf /var/lib/libglx.so $XORG_DST/extensions/libglx.so - fi - -mkdir -p $XORG_DST/multimedia - cp -P $XORG_SRC/i2c/.libs/*_drv.so $XORG_DST/multimedia - -mkdir -p $INSTALL/usr/lib/xserver - cp $PKG_BUILD/dix/protocol.txt $INSTALL/usr/lib/xserver - -mkdir -p $INSTALL/usr/share/X11/xorg.conf.d - cp $PKG_BUILD/config/10-evdev.conf $INSTALL/usr/share/X11/xorg.conf.d - -mkdir -p $INSTALL/etc/X11 - if [ -f $PROJECT_DIR/$PROJECT/xorg/xorg.conf ]; then - cp $PROJECT_DIR/$PROJECT/xorg/xorg.conf $INSTALL/etc/X11 - elif [ -f $PKG_DIR/config/xorg.conf ]; then - cp $PKG_DIR/config/xorg.conf $INSTALL/etc/X11 - fi - -if [ "$DEVTOOLS" = yes ]; then - cp $XORG_SRC/utils/cvt/cvt $INSTALL/usr/bin - cp $XORG_SRC/utils/gtf/gtf $INSTALL/usr/bin -fi diff --git a/packages/x11/xserver/xorg-server/meta b/packages/x11/xserver/xorg-server/meta deleted file mode 100644 index c30b9a858c..0000000000 --- a/packages/x11/xserver/xorg-server/meta +++ /dev/null @@ -1,73 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="xorg-server" -PKG_VERSION="1.12.4" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="OSS" -PKG_SITE="http://www.X.org" -PKG_URL="http://xorg.freedesktop.org/archive/individual/xserver/$PKG_NAME-$PKG_VERSION.tar.bz2" -PKG_DEPENDS="libpciaccess libX11 libXfont libdrm openssl freetype pixman systemd" -PKG_BUILD_DEPENDS="toolchain util-macros font-util fontsproto randrproto recordproto renderproto dri2proto fixesproto damageproto scrnsaverproto videoproto inputproto xf86dgaproto xf86vidmodeproto xf86driproto xf86miscproto glproto libpciaccess libX11 libXfont libxkbfile libdrm openssl freetype pixman fontsproto systemd" -PKG_PRIORITY="optional" -PKG_SECTION="x11/xserver" -PKG_SHORTDESC="xorg-server: The Xorg X server" -PKG_LONGDESC="Xorg is a full featured X server that was originally designed for UNIX and UNIX-like operating systems running on Intel x86 hardware." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="yes" - -get_graphicdrivers -if [ "$COMPOSITE_SUPPORT" = "yes" ]; then - PKG_DEPENDS="$PKG_DEPENDS libXcomposite" - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libXcomposite" -fi - -if [ "$XINERAMA_SUPPORT" = "yes" ]; then - PKG_DEPENDS="$PKG_DEPENDS libXinerama" - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libXinerama" -fi - -if [ "$OPENGL" = "Mesa" ]; then - PKG_DEPENDS="$PKG_DEPENDS Mesa glu" - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS Mesa glu" -fi - -# Additional packages we need for using xorg-server: -# Fonts - PKG_DEPENDS="$PKG_DEPENDS encodings font-xfree86-type1 font-bitstream-type1 font-misc-misc" - -# Server - PKG_DEPENDS="$PKG_DEPENDS xkeyboard-config xkbcomp" - -# Drivers - PKG_DEPENDS="$PKG_DEPENDS xf86-input-evdev" - - for drv in $XORG_DRIVERS; do - PKG_DEPENDS="$PKG_DEPENDS xf86-video-$drv" - done - -# Tools - PKG_DEPENDS="$PKG_DEPENDS pciutils xrandr setxkbmap" - -if [ -n "$WINDOWMANAGER" -a "$WINDOWMANAGER" != "none" ]; then - PKG_DEPENDS="$PKG_DEPENDS $WINDOWMANAGER" -fi diff --git a/packages/x11/xserver/xorg-server/package.mk b/packages/x11/xserver/xorg-server/package.mk new file mode 100644 index 0000000000..a211d72c18 --- /dev/null +++ b/packages/x11/xserver/xorg-server/package.mk @@ -0,0 +1,189 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="xorg-server" +PKG_VERSION="1.12.4" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="OSS" +PKG_SITE="http://www.X.org" +PKG_URL="http://xorg.freedesktop.org/archive/individual/xserver/$PKG_NAME-$PKG_VERSION.tar.bz2" +PKG_DEPENDS="libpciaccess libX11 libXfont libdrm openssl freetype pixman systemd" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros font-util fontsproto randrproto recordproto renderproto dri2proto fixesproto damageproto scrnsaverproto videoproto inputproto xf86dgaproto xf86vidmodeproto xf86driproto xf86miscproto glproto libpciaccess libX11 libXfont libxkbfile libdrm openssl freetype pixman fontsproto systemd" +PKG_PRIORITY="optional" +PKG_SECTION="x11/xserver" +PKG_SHORTDESC="xorg-server: The Xorg X server" +PKG_LONGDESC="Xorg is a full featured X server that was originally designed for UNIX and UNIX-like operating systems running on Intel x86 hardware." + +PKG_IS_ADDON="no" +PKG_AUTORECONF="yes" + +# Additional packages we need for using xorg-server: +# Fonts + PKG_DEPENDS="$PKG_DEPENDS encodings font-xfree86-type1 font-bitstream-type1 font-misc-misc" + +# Server + PKG_DEPENDS="$PKG_DEPENDS xkeyboard-config xkbcomp" + +# Drivers + PKG_DEPENDS="$PKG_DEPENDS xf86-input-evdev" + + for drv in $XORG_DRIVERS; do + PKG_DEPENDS="$PKG_DEPENDS xf86-video-$drv" + done + +# Tools + PKG_DEPENDS="$PKG_DEPENDS pciutils xrandr setxkbmap" + +if [ -n "$WINDOWMANAGER" -a "$WINDOWMANAGER" != "none" ]; then + PKG_DEPENDS="$PKG_DEPENDS $WINDOWMANAGER" +fi + +get_graphicdrivers + +if [ "$COMPOSITE_SUPPORT" = "yes" ]; then + PKG_DEPENDS="$PKG_DEPENDS libXcomposite" + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libXcomposite" + XORG_COMPOSITE="--enable-composite" +else + XORG_COMPOSITE="--disable-composite" +fi + +if [ "$XINERAMA_SUPPORT" = "yes" ]; then + PKG_DEPENDS="$PKG_DEPENDS libXinerama" + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET libXinerama" + XORG_XINERAMA="--enable-xinerama" +else + XORG_XINERAMA="--disable-xinerama" +fi + +if [ "$OPENGL" = "Mesa" ]; then + PKG_DEPENDS="$PKG_DEPENDS Mesa glu" + PKG_BUILD_DEPENDS_TARGET="$PKG_BUILD_DEPENDS_TARGET Mesa glu" + XORG_MESA="--enable-glx --enable-dri" +else + XORG_MESA="--disable-glx --disable-dri" +fi + +PKG_CONFIGURE_OPTS_TARGET="--disable-debug \ + --disable-silent-rules \ + --disable-strict-compilation \ + --enable-largefile \ + --enable-visibility \ + --disable-unit-tests \ + --disable-sparkle \ + --disable-install-libxf86config \ + --disable-xselinux \ + --enable-aiglx \ + --enable-glx-tls \ + --enable-registry \ + $XORG_COMPOSITE \ + $XORG_XINERAMA \ + --enable-mitshm \ + --disable-xres \ + --enable-record \ + --enable-xv \ + --disable-xvmc \ + --enable-dga \ + --disable-screensaver \ + --disable-xdmcp \ + --disable-xdm-auth-1 \ + $XORG_MESA \ + --enable-dri2 \ + --enable-xf86vidmode \ + --disable-xace \ + --disable-xcsecurity \ + --disable-tslib \ + --enable-dbe \ + --disable-xf86bigfont \ + --enable-dpms \ + --enable-config-udev \ + --disable-config-dbus \ + --disable-config-hal \ + --enable-xfree86-utils \ + --enable-xaa \ + --enable-vgahw \ + --enable-vbe \ + --enable-int10-module \ + --disable-windowswm \ + --enable-libdrm \ + --enable-xorg \ + --disable-dmx \ + --disable-xvfb \ + --disable-xnest \ + --disable-xquartz \ + --disable-standalone-xpbproxy \ + --disable-xwin \ + --disable-kdrive \ + --disable-xephyr \ + --disable-xfake \ + --disable-xfbdev \ + --enable-unix-transport \ + --disable-tcp-transport \ + --disable-local-transport \ + --disable-install-setuid \ + --disable-secure-rpc \ + --disable-docs \ + --disable-devel-docs \ + --with-int10=x86emu \ + --disable-ipv6 \ + --with-gnu-ld \ + --with-sha1=libcrypto \ + --with-os-vendor=OpenELEC.tv \ + --with-module-dir=$XORG_PATH_MODULES \ + --with-xkb-path=$XORG_PATH_XKB \ + --with-xkb-output=/var/cache/xkb \ + --with-log-dir=/var/log \ + --with-fontrootdir=/usr/share/fonts \ + --with-default-font-path=/usr/share/fonts/misc,built-ins \ + --with-serverconfig-path=/usr/lib/xserver \ + --without-xmlto \ + --without-fop" + +pre_configure_target() { +# hack to prevent a build error + CFLAGS=`echo $CFLAGS | sed -e "s|-O3|-O2|" -e "s|-Ofast|-O2|"` + LDFLAGS=`echo $LDFLAGS | sed -e "s|-O3|-O2|" -e "s|-Ofast|-O2|"` +} + +post_makeinstall_target() { + rm -rf $INSTALL/var/cache/xkb + + mkdir -p $INSTALL/lib/udev + cp $PKG_DIR/scripts/xorg_start $INSTALL/lib/udev + + if [ -f $INSTALL/usr/lib/xorg/modules/extensions/libglx.so ]; then + mv $INSTALL/usr/lib/xorg/modules/extensions/libglx.so \ + $INSTALL/usr/lib/xorg/modules/extensions/libglx_mesa.so # rename for cooperate with nvidia drivers + ln -sf /var/lib/libglx.so $INSTALL/usr/lib/xorg/modules/extensions/libglx.so + fi + + mkdir -p $INSTALL/etc/X11 + if [ -f $PROJECT_DIR/$PROJECT/xorg/xorg.conf ]; then + cp $PROJECT_DIR/$PROJECT/xorg/xorg.conf $INSTALL/etc/X11 + elif [ -f $PKG_DIR/config/xorg.conf ]; then + cp $PKG_DIR/config/xorg.conf $INSTALL/etc/X11 + fi + + if [ ! "$DEVTOOLS" = yes ]; then + rm -rf $INSTALL/usr/bin/cvt + rm -rf $INSTALL/usr/bin/gtf + fi +} \ No newline at end of file diff --git a/packages/x11/xserver/xorg-server/tmpfiles.d/xorg-server.conf b/packages/x11/xserver/xorg-server/tmpfiles.d/xorg-server.conf new file mode 100644 index 0000000000..c82673c81f --- /dev/null +++ b/packages/x11/xserver/xorg-server/tmpfiles.d/xorg-server.conf @@ -0,0 +1,22 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +d /var/cache/xkb 0755 root root 10d - +d /var/lib 0755 root root - - From 3b688078cb039b133ed1776883cfd2233161c9d0 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 5 Aug 2013 07:35:12 +0200 Subject: [PATCH 084/103] xorg-server: fix package.mk script Signed-off-by: Stephan Raue --- packages/x11/xserver/xorg-server/package.mk | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/x11/xserver/xorg-server/package.mk b/packages/x11/xserver/xorg-server/package.mk index a211d72c18..b8f5c03a05 100644 --- a/packages/x11/xserver/xorg-server/package.mk +++ b/packages/x11/xserver/xorg-server/package.mk @@ -42,13 +42,6 @@ PKG_AUTORECONF="yes" # Server PKG_DEPENDS="$PKG_DEPENDS xkeyboard-config xkbcomp" -# Drivers - PKG_DEPENDS="$PKG_DEPENDS xf86-input-evdev" - - for drv in $XORG_DRIVERS; do - PKG_DEPENDS="$PKG_DEPENDS xf86-video-$drv" - done - # Tools PKG_DEPENDS="$PKG_DEPENDS pciutils xrandr setxkbmap" @@ -57,6 +50,11 @@ if [ -n "$WINDOWMANAGER" -a "$WINDOWMANAGER" != "none" ]; then fi get_graphicdrivers +# Drivers + PKG_DEPENDS="$PKG_DEPENDS xf86-input-evdev" + for drv in $XORG_DRIVERS; do + PKG_DEPENDS="$PKG_DEPENDS xf86-video-$drv" + done if [ "$COMPOSITE_SUPPORT" = "yes" ]; then PKG_DEPENDS="$PKG_DEPENDS libXcomposite" From 08423ac7195ec32d1f1db304fc04781ba2d6902b Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 5 Aug 2013 09:53:09 +0200 Subject: [PATCH 085/103] linux: update to linux-3.10.5 Signed-off-by: Stephan Raue --- packages/linux/meta | 2 +- ...restore-fences-with-objects-attached.patch | 106 ------------------ .../linux-003-no_dev_console.patch | 0 .../linux-010-perf_crosscompiling.patch | 0 .../linux-052-XBOX_remote_support.patch | 0 .../linux-053-spinelplus-remote-0.2.patch | 0 ...1056c5564eec8a1b169c6e84ff3.6.114c13.patch | 0 ...-add_Formosa_eHome_Infrared_Receiver.patch | 0 ...-add_Adaptec_eHome_Infrared_Receiver.patch | 0 ...tomer-code-restriction-in-rc6-decode.patch | 0 ..._Manufacturing_Inc_Infrared_Receiver.patch | 0 ...nux-058.01-HID-Sony-upstream_patches.patch | 0 ..._sony-add_autorepeat_for_PS3_remotes.patch | 0 .../linux-058.06-hid_sony-add_SMK_link.patch | 0 .../linux-059-remove_some_xpad_pids-0.2.patch | 0 .../linux-060-add_AUGUST_DVB-T205.patch | 0 ...x-203-stb0899_enable_low_symbol_rate.patch | 0 .../{3.10.4 => 3.10.5}/linux-210-dvbsky.patch | 0 ...linux-212-mantis_stb0899_faster_lock.patch | 0 .../linux-221-ngene-octopus.patch | 0 .../linux-222-stb0899_signal_quality.patch | 0 ...-video-artifacts-with-tt-3600-s2-usb.patch | 0 .../linux-700-jmicron_1_0_8_5.patch | 0 .../linux-701-linksys_aes2500_brcmfmac.patch | 0 ...port-for-cheap-Ralink-3070-WiFi-plug.patch | 0 .../linux-703-macmini2012-ethernet.patch | 0 .../linux-900-hide_tsc_error.patch | 0 ...x-950-saa716x_PCIe_interface_chipset.patch | 0 ...utputting-HDMI-audio-before-prepare-.patch | 0 .../linux-995-CX24120-13Z_frontend.patch | 0 ...x-997-disable-rc6-on-sandybridge-gt1.patch | 0 ...e4af3be0235d4cf41ea9fd774205a32e58a2.patch | 0 32 files changed, 1 insertion(+), 107 deletions(-) delete mode 100644 packages/linux/patches/3.10.4/linux-999.02-drm-i915-correctly-restore-fences-with-objects-attached.patch rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-003-no_dev_console.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-010-perf_crosscompiling.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-052-XBOX_remote_support.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-053-spinelplus-remote-0.2.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-055-add_Formosa_eHome_Infrared_Receiver.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-056-add_Adaptec_eHome_Infrared_Receiver.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-057-Removed-MCE-customer-code-restriction-in-rc6-decode.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-058.01-HID-Sony-upstream_patches.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-058.06-hid_sony-add_SMK_link.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-059-remove_some_xpad_pids-0.2.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-060-add_AUGUST_DVB-T205.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-203-stb0899_enable_low_symbol_rate.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-210-dvbsky.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-212-mantis_stb0899_faster_lock.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-221-ngene-octopus.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-222-stb0899_signal_quality.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-700-jmicron_1_0_8_5.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-701-linksys_aes2500_brcmfmac.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-703-macmini2012-ethernet.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-900-hide_tsc_error.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-950-saa716x_PCIe_interface_chipset.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-995-CX24120-13Z_frontend.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-997-disable-rc6-on-sandybridge-gt1.patch (100%) rename packages/linux/patches/{3.10.4 => 3.10.5}/linux-998.01-cpufreq-revert-9d3ce4af3be0235d4cf41ea9fd774205a32e58a2.patch (100%) diff --git a/packages/linux/meta b/packages/linux/meta index 94b60a266d..dbba7cc3d7 100644 --- a/packages/linux/meta +++ b/packages/linux/meta @@ -34,7 +34,7 @@ case "$LINUX" in PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.bz2" ;; *) - PKG_VERSION="3.10.4" + PKG_VERSION="3.10.5" PKG_URL="http://www.kernel.org/pub/linux/kernel/v3.x/$PKG_NAME-$PKG_VERSION.tar.xz" ;; esac diff --git a/packages/linux/patches/3.10.4/linux-999.02-drm-i915-correctly-restore-fences-with-objects-attached.patch b/packages/linux/patches/3.10.4/linux-999.02-drm-i915-correctly-restore-fences-with-objects-attached.patch deleted file mode 100644 index ce2b44dfdc..0000000000 --- a/packages/linux/patches/3.10.4/linux-999.02-drm-i915-correctly-restore-fences-with-objects-attached.patch +++ /dev/null @@ -1,106 +0,0 @@ -From 94a335dba34ff47cad3d6d0c29b452d43a1be3c8 Mon Sep 17 00:00:00 2001 -From: Daniel Vetter -Date: Wed, 17 Jul 2013 12:51:28 +0000 -Subject: drm/i915: correctly restore fences with objects attached - -To avoid stalls we delay tiling changes and especially hold of -committing the new fence state for as long as possible. -Synchronization points are in the execbuf code and in our gtt fault -handler. - -Unfortunately we've missed that tricky detail when adding proper fence -restore code in - -commit 19b2dbde5732170a03bd82cc8bd442cf88d856f7 -Author: Chris Wilson -Date: Wed Jun 12 10:15:12 2013 +0100 - - drm/i915: Restore fences after resume and GPU resets - -The result was that we've restored fences for objects with no tiling, -since the object<->fence link still existed after resume. Now that -wouldn't have been too bad since any subsequent access would have -fixed things up, but if we've changed from tiled to untiled real havoc -happened: - -The tiling stride is stored -1 in the fence register, so a stride of 0 -resulted in all 1s in the top 32bits, and so a completely bogus fence -spanning everything from the start of the object to the top of the -GTT. The tell-tale in the register dumps looks like: - - FENCE START 2: 0x0214d001 - FENCE END 2: 0xfffff3ff - -Bit 11 isn't set since the hw doesn't store it, even when writing all -1s (at least on my snb here). - -To prevent such a gaffle in the future add a sanity check for fences -with an untiled object attached in i915_gem_write_fence. - -v2: Fix the WARN, spotted by Chris. - -v3: Trying to reuse get_fences looked ugly and obfuscated the code. -Instead reuse update_fence and to make it really dtrt also move the -fence dirty state clearing into update_fence. - -Cc: Chris Wilson -Cc: Stéphane Marchesin -Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=60530 -Cc: stable@vger.kernel.org (for 3.10 only) -Reviewed-by: Chris Wilson -Tested-by: Matthew Garrett -Tested-by: Björn Bidar -Signed-off-by: Daniel Vetter ---- -diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c -index 97afd26..d9e2208 100644 ---- a/drivers/gpu/drm/i915/i915_gem.c -+++ b/drivers/gpu/drm/i915/i915_gem.c -@@ -2258,7 +2258,17 @@ void i915_gem_restore_fences(struct drm_device *dev) - - for (i = 0; i < dev_priv->num_fence_regs; i++) { - struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i]; -- i915_gem_write_fence(dev, i, reg->obj); -+ -+ /* -+ * Commit delayed tiling changes if we have an object still -+ * attached to the fence, otherwise just clear the fence. -+ */ -+ if (reg->obj) { -+ i915_gem_object_update_fence(reg->obj, reg, -+ reg->obj->tiling_mode); -+ } else { -+ i915_gem_write_fence(dev, i, NULL); -+ } - } - } - -@@ -2795,6 +2805,10 @@ static void i915_gem_write_fence(struct drm_device *dev, int reg, - if (i915_gem_object_needs_mb(dev_priv->fence_regs[reg].obj)) - mb(); - -+ WARN(obj && (!obj->stride || !obj->tiling_mode), -+ "bogus fence setup with stride: 0x%x, tiling mode: %i\n", -+ obj->stride, obj->tiling_mode); -+ - switch (INTEL_INFO(dev)->gen) { - case 7: - case 6: -@@ -2836,6 +2850,7 @@ static void i915_gem_object_update_fence(struct drm_i915_gem_object *obj, - fence->obj = NULL; - list_del_init(&fence->lru_list); - } -+ obj->fence_dirty = false; - } - - static int -@@ -2965,7 +2980,6 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj) - return 0; - - i915_gem_object_update_fence(obj, reg, enable); -- obj->fence_dirty = false; - - return 0; - } --- -cgit v0.9.0.2-2-gbebe diff --git a/packages/linux/patches/3.10.4/linux-003-no_dev_console.patch b/packages/linux/patches/3.10.5/linux-003-no_dev_console.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-003-no_dev_console.patch rename to packages/linux/patches/3.10.5/linux-003-no_dev_console.patch diff --git a/packages/linux/patches/3.10.4/linux-010-perf_crosscompiling.patch b/packages/linux/patches/3.10.5/linux-010-perf_crosscompiling.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-010-perf_crosscompiling.patch rename to packages/linux/patches/3.10.5/linux-010-perf_crosscompiling.patch diff --git a/packages/linux/patches/3.10.4/linux-052-XBOX_remote_support.patch b/packages/linux/patches/3.10.5/linux-052-XBOX_remote_support.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-052-XBOX_remote_support.patch rename to packages/linux/patches/3.10.5/linux-052-XBOX_remote_support.patch diff --git a/packages/linux/patches/3.10.4/linux-053-spinelplus-remote-0.2.patch b/packages/linux/patches/3.10.5/linux-053-spinelplus-remote-0.2.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-053-spinelplus-remote-0.2.patch rename to packages/linux/patches/3.10.5/linux-053-spinelplus-remote-0.2.patch diff --git a/packages/linux/patches/3.10.4/linux-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch b/packages/linux/patches/3.10.5/linux-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch rename to packages/linux/patches/3.10.5/linux-054-nuvoton_revert_d7b290a1056c5564eec8a1b169c6e84ff3.6.114c13.patch diff --git a/packages/linux/patches/3.10.4/linux-055-add_Formosa_eHome_Infrared_Receiver.patch b/packages/linux/patches/3.10.5/linux-055-add_Formosa_eHome_Infrared_Receiver.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-055-add_Formosa_eHome_Infrared_Receiver.patch rename to packages/linux/patches/3.10.5/linux-055-add_Formosa_eHome_Infrared_Receiver.patch diff --git a/packages/linux/patches/3.10.4/linux-056-add_Adaptec_eHome_Infrared_Receiver.patch b/packages/linux/patches/3.10.5/linux-056-add_Adaptec_eHome_Infrared_Receiver.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-056-add_Adaptec_eHome_Infrared_Receiver.patch rename to packages/linux/patches/3.10.5/linux-056-add_Adaptec_eHome_Infrared_Receiver.patch diff --git a/packages/linux/patches/3.10.4/linux-057-Removed-MCE-customer-code-restriction-in-rc6-decode.patch b/packages/linux/patches/3.10.5/linux-057-Removed-MCE-customer-code-restriction-in-rc6-decode.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-057-Removed-MCE-customer-code-restriction-in-rc6-decode.patch rename to packages/linux/patches/3.10.5/linux-057-Removed-MCE-customer-code-restriction-in-rc6-decode.patch diff --git a/packages/linux/patches/3.10.4/linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch b/packages/linux/patches/3.10.5/linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch rename to packages/linux/patches/3.10.5/linux-057-add_SMK_Manufacturing_Inc_Infrared_Receiver.patch diff --git a/packages/linux/patches/3.10.4/linux-058.01-HID-Sony-upstream_patches.patch b/packages/linux/patches/3.10.5/linux-058.01-HID-Sony-upstream_patches.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-058.01-HID-Sony-upstream_patches.patch rename to packages/linux/patches/3.10.5/linux-058.01-HID-Sony-upstream_patches.patch diff --git a/packages/linux/patches/3.10.4/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch b/packages/linux/patches/3.10.5/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch rename to packages/linux/patches/3.10.5/linux-058.05-hid_sony-add_autorepeat_for_PS3_remotes.patch diff --git a/packages/linux/patches/3.10.4/linux-058.06-hid_sony-add_SMK_link.patch b/packages/linux/patches/3.10.5/linux-058.06-hid_sony-add_SMK_link.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-058.06-hid_sony-add_SMK_link.patch rename to packages/linux/patches/3.10.5/linux-058.06-hid_sony-add_SMK_link.patch diff --git a/packages/linux/patches/3.10.4/linux-059-remove_some_xpad_pids-0.2.patch b/packages/linux/patches/3.10.5/linux-059-remove_some_xpad_pids-0.2.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-059-remove_some_xpad_pids-0.2.patch rename to packages/linux/patches/3.10.5/linux-059-remove_some_xpad_pids-0.2.patch diff --git a/packages/linux/patches/3.10.4/linux-060-add_AUGUST_DVB-T205.patch b/packages/linux/patches/3.10.5/linux-060-add_AUGUST_DVB-T205.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-060-add_AUGUST_DVB-T205.patch rename to packages/linux/patches/3.10.5/linux-060-add_AUGUST_DVB-T205.patch diff --git a/packages/linux/patches/3.10.4/linux-203-stb0899_enable_low_symbol_rate.patch b/packages/linux/patches/3.10.5/linux-203-stb0899_enable_low_symbol_rate.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-203-stb0899_enable_low_symbol_rate.patch rename to packages/linux/patches/3.10.5/linux-203-stb0899_enable_low_symbol_rate.patch diff --git a/packages/linux/patches/3.10.4/linux-210-dvbsky.patch b/packages/linux/patches/3.10.5/linux-210-dvbsky.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-210-dvbsky.patch rename to packages/linux/patches/3.10.5/linux-210-dvbsky.patch diff --git a/packages/linux/patches/3.10.4/linux-212-mantis_stb0899_faster_lock.patch b/packages/linux/patches/3.10.5/linux-212-mantis_stb0899_faster_lock.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-212-mantis_stb0899_faster_lock.patch rename to packages/linux/patches/3.10.5/linux-212-mantis_stb0899_faster_lock.patch diff --git a/packages/linux/patches/3.10.4/linux-221-ngene-octopus.patch b/packages/linux/patches/3.10.5/linux-221-ngene-octopus.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-221-ngene-octopus.patch rename to packages/linux/patches/3.10.5/linux-221-ngene-octopus.patch diff --git a/packages/linux/patches/3.10.4/linux-222-stb0899_signal_quality.patch b/packages/linux/patches/3.10.5/linux-222-stb0899_signal_quality.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-222-stb0899_signal_quality.patch rename to packages/linux/patches/3.10.5/linux-222-stb0899_signal_quality.patch diff --git a/packages/linux/patches/3.10.4/linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch b/packages/linux/patches/3.10.5/linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch rename to packages/linux/patches/3.10.5/linux-223-Fix-video-artifacts-with-tt-3600-s2-usb.patch diff --git a/packages/linux/patches/3.10.4/linux-700-jmicron_1_0_8_5.patch b/packages/linux/patches/3.10.5/linux-700-jmicron_1_0_8_5.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-700-jmicron_1_0_8_5.patch rename to packages/linux/patches/3.10.5/linux-700-jmicron_1_0_8_5.patch diff --git a/packages/linux/patches/3.10.4/linux-701-linksys_aes2500_brcmfmac.patch b/packages/linux/patches/3.10.5/linux-701-linksys_aes2500_brcmfmac.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-701-linksys_aes2500_brcmfmac.patch rename to packages/linux/patches/3.10.5/linux-701-linksys_aes2500_brcmfmac.patch diff --git a/packages/linux/patches/3.10.4/linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch b/packages/linux/patches/3.10.5/linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch rename to packages/linux/patches/3.10.5/linux-702-Support-for-cheap-Ralink-3070-WiFi-plug.patch diff --git a/packages/linux/patches/3.10.4/linux-703-macmini2012-ethernet.patch b/packages/linux/patches/3.10.5/linux-703-macmini2012-ethernet.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-703-macmini2012-ethernet.patch rename to packages/linux/patches/3.10.5/linux-703-macmini2012-ethernet.patch diff --git a/packages/linux/patches/3.10.4/linux-900-hide_tsc_error.patch b/packages/linux/patches/3.10.5/linux-900-hide_tsc_error.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-900-hide_tsc_error.patch rename to packages/linux/patches/3.10.5/linux-900-hide_tsc_error.patch diff --git a/packages/linux/patches/3.10.4/linux-950-saa716x_PCIe_interface_chipset.patch b/packages/linux/patches/3.10.5/linux-950-saa716x_PCIe_interface_chipset.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-950-saa716x_PCIe_interface_chipset.patch rename to packages/linux/patches/3.10.5/linux-950-saa716x_PCIe_interface_chipset.patch diff --git a/packages/linux/patches/3.10.4/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch b/packages/linux/patches/3.10.5/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch rename to packages/linux/patches/3.10.5/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch diff --git a/packages/linux/patches/3.10.4/linux-995-CX24120-13Z_frontend.patch b/packages/linux/patches/3.10.5/linux-995-CX24120-13Z_frontend.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-995-CX24120-13Z_frontend.patch rename to packages/linux/patches/3.10.5/linux-995-CX24120-13Z_frontend.patch diff --git a/packages/linux/patches/3.10.4/linux-997-disable-rc6-on-sandybridge-gt1.patch b/packages/linux/patches/3.10.5/linux-997-disable-rc6-on-sandybridge-gt1.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-997-disable-rc6-on-sandybridge-gt1.patch rename to packages/linux/patches/3.10.5/linux-997-disable-rc6-on-sandybridge-gt1.patch diff --git a/packages/linux/patches/3.10.4/linux-998.01-cpufreq-revert-9d3ce4af3be0235d4cf41ea9fd774205a32e58a2.patch b/packages/linux/patches/3.10.5/linux-998.01-cpufreq-revert-9d3ce4af3be0235d4cf41ea9fd774205a32e58a2.patch similarity index 100% rename from packages/linux/patches/3.10.4/linux-998.01-cpufreq-revert-9d3ce4af3be0235d4cf41ea9fd774205a32e58a2.patch rename to packages/linux/patches/3.10.5/linux-998.01-cpufreq-revert-9d3ce4af3be0235d4cf41ea9fd774205a32e58a2.patch From 9cfd00fba271f0ef54aeef5975c788e1e2bfc115 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 5 Aug 2013 08:01:57 +0200 Subject: [PATCH 086/103] fontconfig: convert to new package format Signed-off-by: Stephan Raue --- packages/x11/other/fontconfig/build | 46 ------------------- packages/x11/other/fontconfig/install | 38 --------------- .../x11/other/fontconfig/{meta => package.mk} | 27 ++++++++++- 3 files changed, 25 insertions(+), 86 deletions(-) delete mode 100755 packages/x11/other/fontconfig/build delete mode 100755 packages/x11/other/fontconfig/install rename packages/x11/other/fontconfig/{meta => package.mk} (63%) diff --git a/packages/x11/other/fontconfig/build b/packages/x11/other/fontconfig/build deleted file mode 100755 index f0919f414f..0000000000 --- a/packages/x11/other/fontconfig/build +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -# ensure we dont use '-O3' optimization. - CFLAGS=`echo $CFLAGS | sed -e "s|-O3|-O2|"` - CXXFLAGS=`echo $CXXFLAGS | sed -e "s|-O3|-O2|"` - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --disable-static \ - --enable-shared \ - --with-arch=$TARGET_ARCH \ - --with-freetype-config=$ROOT/$TOOLCHAIN/bin/freetype-config \ - --with-default-fonts=/usr/share/fonts/liberation \ - --without-add-fonts \ - --disable-dependency-tracking \ - --disable-docs - -make V=1 - -$MAKEINSTALL diff --git a/packages/x11/other/fontconfig/install b/packages/x11/other/fontconfig/install deleted file mode 100755 index 9e5ab74174..0000000000 --- a/packages/x11/other/fontconfig/install +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/lib - cp -P $PKG_BUILD/src/.libs/libfontconfig.so* $INSTALL/usr/lib - -mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/fc-cache/.libs/fc-cache $INSTALL/usr/bin - -mkdir -p $INSTALL/usr/share/fontconfig/conf.avail - cp $PKG_BUILD/conf.d/*.conf $INSTALL/usr/share/fontconfig/conf.avail - -mkdir -p $INSTALL/usr/share/xml/fontconfig - cp $PKG_BUILD/fonts.dtd $INSTALL/usr/share/xml/fontconfig - -mkdir -p $INSTALL/etc/fonts - cp -R $SYSROOT_PREFIX/etc/fonts/* $INSTALL/etc/fonts diff --git a/packages/x11/other/fontconfig/meta b/packages/x11/other/fontconfig/package.mk similarity index 63% rename from packages/x11/other/fontconfig/meta rename to packages/x11/other/fontconfig/package.mk index 7a08b5566e..4e69f1d120 100644 --- a/packages/x11/other/fontconfig/meta +++ b/packages/x11/other/fontconfig/package.mk @@ -26,11 +26,34 @@ PKG_LICENSE="OSS" PKG_SITE="http://www.fontconfig.org" PKG_URL="http://www.freedesktop.org/software/fontconfig/release/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS="freetype libxml2 zlib expat" -PKG_BUILD_DEPENDS="toolchain util-macros freetype libxml2 zlib expat" +PKG_BUILD_DEPENDS_TARGET="toolchain util-macros freetype libxml2 zlib expat" PKG_PRIORITY="optional" PKG_SECTION="x11/other" PKG_SHORTDESC="fontconfig: A library for font customization and configuration" PKG_LONGDESC="Fontconfig is a library for font customization and configuration." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--with-arch=$TARGET_ARCH \ + --with-freetype-config=$ROOT/$TOOLCHAIN/bin/freetype-config \ + --with-default-fonts=/usr/share/fonts/liberation \ + --without-add-fonts \ + --disable-dependency-tracking \ + --disable-docs" + +pre_configure_target() { +# ensure we dont use '-O3' optimization. + CFLAGS=`echo $CFLAGS | sed -e "s|-O3|-O2|"` + CXXFLAGS=`echo $CXXFLAGS | sed -e "s|-O3|-O2|"` +} + +post_makeinstall_target() { + rm -rf $INSTALL/usr/bin/fc-cat + rm -rf $INSTALL/usr/bin/fc-list + rm -rf $INSTALL/usr/bin/fc-match + rm -rf $INSTALL/usr/bin/fc-pattern + rm -rf $INSTALL/usr/bin/fc-query + rm -rf $INSTALL/usr/bin/fc-scan + rm -rf $INSTALL/usr/bin/fc-validate +} From 16d7b5a941cc14ca51a2f299f43d80dfaa0117b8 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 5 Aug 2013 10:41:52 +0200 Subject: [PATCH 087/103] connman: fix package.mk script Signed-off-by: Stephan Raue --- packages/network/connman/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/network/connman/package.mk b/packages/network/connman/package.mk index 6d6af1c56d..1a6f1724e3 100644 --- a/packages/network/connman/package.mk +++ b/packages/network/connman/package.mk @@ -90,7 +90,7 @@ PKG_MAKE_OPTS_TARGET="storagedir=/storage/.cache/connman \ post_makeinstall_target() { rm -rf $INSTALL/lib/systemd - mkdir $INSTALL/usr/bin + mkdir -p $INSTALL/usr/bin cp -P client/connmanctl $INSTALL/usr/bin mkdir -p $INSTALL/etc From bae8c36ff84cc642f8c86da2a310e5309c5b9492 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 5 Aug 2013 12:47:44 +0200 Subject: [PATCH 088/103] fontconfig: fix build Signed-off-by: Stephan Raue --- packages/x11/other/fontconfig/package.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/x11/other/fontconfig/package.mk b/packages/x11/other/fontconfig/package.mk index 4e69f1d120..9a48b6e011 100644 --- a/packages/x11/other/fontconfig/package.mk +++ b/packages/x11/other/fontconfig/package.mk @@ -36,7 +36,6 @@ PKG_IS_ADDON="no" PKG_AUTORECONF="yes" PKG_CONFIGURE_OPTS_TARGET="--with-arch=$TARGET_ARCH \ - --with-freetype-config=$ROOT/$TOOLCHAIN/bin/freetype-config \ --with-default-fonts=/usr/share/fonts/liberation \ --without-add-fonts \ --disable-dependency-tracking \ @@ -46,6 +45,8 @@ pre_configure_target() { # ensure we dont use '-O3' optimization. CFLAGS=`echo $CFLAGS | sed -e "s|-O3|-O2|"` CXXFLAGS=`echo $CXXFLAGS | sed -e "s|-O3|-O2|"` + CFLAGS="$CFLAGS -I$ROOT/$PKG_BUILD" + CXXFLAGS="$CXXFLAGS -I$ROOT/$PKG_BUILD" } post_makeinstall_target() { From e1e984aaf34a1ace4b56f47d971bf88c189d99da Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 6 Aug 2013 10:33:51 +0300 Subject: [PATCH 089/103] sync unofficial --- packages/unofficial | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/unofficial b/packages/unofficial index 726e8ef3d6..ff051d8de5 160000 --- a/packages/unofficial +++ b/packages/unofficial @@ -1 +1 @@ -Subproject commit 726e8ef3d6addd5ff2cf4525be574d6e5abd5a57 +Subproject commit ff051d8de5a8cc1cc378653df36e0a17ac95a9c1 From bb45d810726ac683b769c248429489df3add01bb Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 6 Aug 2013 11:20:32 +0300 Subject: [PATCH 090/103] bluez: obexd: use system bus --- .../patches/bluez-obexd-use-system-bus.patch | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 packages/network/bluez/patches/bluez-obexd-use-system-bus.patch diff --git a/packages/network/bluez/patches/bluez-obexd-use-system-bus.patch b/packages/network/bluez/patches/bluez-obexd-use-system-bus.patch new file mode 100644 index 0000000000..dd52a299ea --- /dev/null +++ b/packages/network/bluez/patches/bluez-obexd-use-system-bus.patch @@ -0,0 +1,25 @@ +From 20dfa1079c088236bcd63f1a986956b488177ebf Mon Sep 17 00:00:00 2001 +From: Stefan Saraev +Date: Tue, 6 Aug 2013 11:18:09 +0300 +Subject: [PATCH] obexd: use system bus + +--- + obexd/src/manager.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/obexd/src/manager.c b/obexd/src/manager.c +index dbfbef8..9a29f8c 100644 +--- a/obexd/src/manager.c ++++ b/obexd/src/manager.c +@@ -569,7 +569,7 @@ gboolean manager_init(void) + + dbus_error_init(&err); + +- connection = g_dbus_setup_bus(DBUS_BUS_SESSION, OBEXD_SERVICE, &err); ++ connection = g_dbus_setup_bus(DBUS_BUS_SYSTEM, OBEXD_SERVICE, &err); + if (connection == NULL) { + if (dbus_error_is_set(&err) == TRUE) { + fprintf(stderr, "%s\n", err.message); +-- +1.7.2.5 + From 6f8fc86e386ba015ffc63dc158f758da9a30523a Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 6 Aug 2013 11:21:30 +0300 Subject: [PATCH 091/103] bluez: install obexd as system service --- packages/network/bluez/package.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/network/bluez/package.mk b/packages/network/bluez/package.mk index ee94378618..823d702a95 100644 --- a/packages/network/bluez/package.mk +++ b/packages/network/bluez/package.mk @@ -71,6 +71,6 @@ pre_configure_target() { } post_makeinstall_target() { - mkdir -p $INSTALL/usr/share/dbus-1/services - cp $PKG_DIR/config/org.bluez.obex.service $INSTALL/usr/share/dbus-1/services + mkdir -p $INSTALL/usr/share/dbus-1/system-services + cp $PKG_DIR/config/org.bluez.obex.service $INSTALL/usr/share/dbus-1/system-services } From 2d7faa8b220b825f95d4e5f17e0948e1daaa0874 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 6 Aug 2013 12:37:04 +0300 Subject: [PATCH 092/103] bluez: add obexd policy --- .../patches/bluez-add-obexd-policy.patch | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 packages/network/bluez/patches/bluez-add-obexd-policy.patch diff --git a/packages/network/bluez/patches/bluez-add-obexd-policy.patch b/packages/network/bluez/patches/bluez-add-obexd-policy.patch new file mode 100644 index 0000000000..f8080a0f32 --- /dev/null +++ b/packages/network/bluez/patches/bluez-add-obexd-policy.patch @@ -0,0 +1,53 @@ +From ef19c237a2578bd78cd75b4be636207c06e34c11 Mon Sep 17 00:00:00 2001 +From: Stefan Saraev +Date: Tue, 6 Aug 2013 12:35:27 +0300 +Subject: [PATCH] add obexd policy + +--- + src/bluetooth.conf | 16 ++++++++++++++++ + 1 files changed, 16 insertions(+), 0 deletions(-) + +diff --git a/src/bluetooth.conf b/src/bluetooth.conf +index 0495200..38020d7 100644 +--- a/src/bluetooth.conf ++++ b/src/bluetooth.conf +@@ -18,20 +18,36 @@ + + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + ++ + + + + + ++ + + + + ++ + + + +-- +1.7.2.5 + From 3d6039d605499f99ba823f3c060a28d4926b3d20 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 6 Aug 2013 12:50:31 +0300 Subject: [PATCH 093/103] bluez: obexd: set root folder location --- packages/network/bluez/config/org.bluez.obex.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/network/bluez/config/org.bluez.obex.service b/packages/network/bluez/config/org.bluez.obex.service index 8c3a8a0517..4a34bd8b76 100644 --- a/packages/network/bluez/config/org.bluez.obex.service +++ b/packages/network/bluez/config/org.bluez.obex.service @@ -1,5 +1,5 @@ [D-BUS Service] Name=org.bluez.obex -Exec=/usr/lib/bluetooth/obexd +Exec=/usr/lib/bluetooth/obexd -r /storage/downloads User=root From 2689c5252f6fe1bf76f1c183e8faa88f24f69bd2 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 6 Aug 2013 11:54:08 +0200 Subject: [PATCH 094/103] wpa_supplicant: convert to new package format Signed-off-by: Stephan Raue --- packages/network/wpa_supplicant/build | 37 ------------------- packages/network/wpa_supplicant/install | 34 ----------------- .../wpa_supplicant/{meta => package.mk} | 30 ++++++++++++++- 3 files changed, 28 insertions(+), 73 deletions(-) delete mode 100755 packages/network/wpa_supplicant/build delete mode 100755 packages/network/wpa_supplicant/install rename packages/network/wpa_supplicant/{meta => package.mk} (64%) diff --git a/packages/network/wpa_supplicant/build b/packages/network/wpa_supplicant/build deleted file mode 100755 index 3111eda243..0000000000 --- a/packages/network/wpa_supplicant/build +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -# wpa_supplicant fails to build with LTO - strip_lto - -LDFLAGS="$LDFLAGS -lpthread" - -cd $PKG_BUILD/$1 - -cp $PKG_DIR/config/makefile.config .config - -# echo "CONFIG_TLS=gnutls" >> .config -# echo "CONFIG_GNUTLS_EXTRA=y" >> .config - -make V=1 LIBDIR=/usr/lib BINDIR=/usr/bin diff --git a/packages/network/wpa_supplicant/install b/packages/network/wpa_supplicant/install deleted file mode 100755 index 0bc3f95840..0000000000 --- a/packages/network/wpa_supplicant/install +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/etc/dbus-1/system.d - cp $PKG_BUILD/wpa_supplicant/dbus/dbus-wpa_supplicant.conf $INSTALL/etc/dbus-1/system.d - -mkdir -p $INSTALL/usr/bin - cp $PKG_BUILD/wpa_supplicant/wpa_supplicant $INSTALL/usr/bin - cp $PKG_BUILD/wpa_supplicant/wpa_passphrase $INSTALL/usr/bin - -mkdir -p $INSTALL/usr/share/dbus-1/system-services - cp $PKG_BUILD/wpa_supplicant/dbus/fi.w1.wpa_supplicant1.service $INSTALL/usr/share/dbus-1/system-services - cp $PKG_BUILD/wpa_supplicant/dbus/fi.epitest.hostap.WPASupplicant.service $INSTALL/usr/share/dbus-1/system-services diff --git a/packages/network/wpa_supplicant/meta b/packages/network/wpa_supplicant/package.mk similarity index 64% rename from packages/network/wpa_supplicant/meta rename to packages/network/wpa_supplicant/package.mk index 07d28be926..2b8b8f9ffd 100644 --- a/packages/network/wpa_supplicant/meta +++ b/packages/network/wpa_supplicant/package.mk @@ -26,11 +26,37 @@ PKG_LICENSE="GPL" PKG_SITE="http://hostap.epitest.fi/wpa_supplicant/" PKG_URL="http://hostap.epitest.fi/releases/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS="dbus openssl" -PKG_BUILD_DEPENDS="toolchain dbus libnl openssl" +PKG_BUILD_DEPENDS_TARGET="toolchain dbus libnl openssl" PKG_PRIORITY="optional" PKG_SECTION="network" PKG_SHORTDESC="wpa_supplicant: An IEEE 802.11i supplicant implementation" PKG_LONGDESC="The wpa_supplicant is a free software implementation of an IEEE 802.11i supplicant. In addition to being a full-featured WPA2 supplicant, it also has support for WPA and older wireless LAN security protocols." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="no" + +PKG_MAKE_OPTS_TARGET="-C wpa_supplicant V=1 LIBDIR=/usr/lib BINDIR=/usr/bin" +PKG_MAKEINSTALL_OPTS_TARGET="-C wpa_supplicant V=1 LIBDIR=/usr/lib BINDIR=/usr/bin" + +configure_target() { +# wpa_supplicant fails to build with LTO + strip_lto + + LDFLAGS="$LDFLAGS -lpthread" + + cp $PKG_DIR/config/makefile.config wpa_supplicant/.config + +# echo "CONFIG_TLS=gnutls" >> .config +# echo "CONFIG_GNUTLS_EXTRA=y" >> .config +} + +post_makeinstall_target() { + rm -r $INSTALL/usr/bin/wpa_cli + +mkdir -p $INSTALL/etc/dbus-1/system.d + cp wpa_supplicant/dbus/dbus-wpa_supplicant.conf $INSTALL/etc/dbus-1/system.d + +mkdir -p $INSTALL/usr/share/dbus-1/system-services + cp wpa_supplicant/dbus/fi.w1.wpa_supplicant1.service $INSTALL/usr/share/dbus-1/system-services + cp wpa_supplicant/dbus/fi.epitest.hostap.WPASupplicant.service $INSTALL/usr/share/dbus-1/system-services +} From 9973ea84c8aa11e006ce937f6f8e1b6603e0d1d2 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 6 Aug 2013 12:44:14 +0200 Subject: [PATCH 095/103] fontconfig: use /storage/.cache/fontconfig as persistent font cache dir, create fontcache only on first boot Signed-off-by: Stephan Raue --- packages/x11/other/fontconfig/init.d/35_fontconfig | 7 ++++--- packages/x11/other/fontconfig/package.mk | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/x11/other/fontconfig/init.d/35_fontconfig b/packages/x11/other/fontconfig/init.d/35_fontconfig index 639deeda32..6b3ea3011c 100644 --- a/packages/x11/other/fontconfig/init.d/35_fontconfig +++ b/packages/x11/other/fontconfig/init.d/35_fontconfig @@ -22,7 +22,6 @@ # # runlevels: openelec, textmode - FC_CACHE_DIRS="/usr/share/fonts/ /usr/share/xbmc/media/Fonts/" # hack to support user installed fonts @@ -35,9 +34,11 @@ FC_CACHE_DIRS="/usr/share/fonts/ /usr/share/xbmc/media/Fonts/" mount --bind $SUBFONTS /usr/share/xbmc/media/Fonts/ fi - ( progress "Creating fontconfig cache" - fc-cache $FC_CACHE_DIRS + if [ ! -f /storage/.cache/fontconfig/CACHEDIR.TAG ]; then + mkdir -p /storage/.cache/fontconfig + fc-cache $FC_CACHE_DIRS + fi )& diff --git a/packages/x11/other/fontconfig/package.mk b/packages/x11/other/fontconfig/package.mk index 9a48b6e011..5d47cdaa89 100644 --- a/packages/x11/other/fontconfig/package.mk +++ b/packages/x11/other/fontconfig/package.mk @@ -36,6 +36,7 @@ PKG_IS_ADDON="no" PKG_AUTORECONF="yes" PKG_CONFIGURE_OPTS_TARGET="--with-arch=$TARGET_ARCH \ + --with-cache-dir=/storage/.cache/fontconfig \ --with-default-fonts=/usr/share/fonts/liberation \ --without-add-fonts \ --disable-dependency-tracking \ From 1ba46a20328eb8df7e4c13d982114f75a8ea1013 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 6 Aug 2013 15:36:32 +0300 Subject: [PATCH 096/103] tmpfiles.d/*: clean up "age".. --- .../network/connman/tmpfiles.d/21_connman.conf | 6 +++--- packages/network/openssh/tmpfiles.d/51_sshd.conf | 2 +- .../security/polkit/tmpfiles.d/34_polkit.conf | 12 ++++++------ .../sysutils/busybox/tmpfiles.d/02_busybox.conf | 16 ++++++++-------- packages/sysutils/dbus/tmpfiles.d/14_dbus.conf | 4 ++-- .../atvclient/tmpfiles.d/63_atvclient.conf | 2 +- .../eventlircd/tmpfiles.d/62_eventlircd.conf | 2 +- .../remote/irserver/tmpfiles.d/63_irserver.conf | 2 +- .../sysutils/remote/lirc/tmpfiles.d/61_lirc.conf | 2 +- .../sysutils/udisks/tmpfiles.d/31_udisks.conf | 2 +- .../sysutils/upower/tmpfiles.d/32_upower.conf | 2 +- .../xorg-server/tmpfiles.d/xorg-server.conf | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/network/connman/tmpfiles.d/21_connman.conf b/packages/network/connman/tmpfiles.d/21_connman.conf index 7383b3da93..a5d25d97e8 100644 --- a/packages/network/connman/tmpfiles.d/21_connman.conf +++ b/packages/network/connman/tmpfiles.d/21_connman.conf @@ -18,6 +18,6 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /run/connman 0755 root root 10d - -d /storage/.cache/connman 0755 root root 10d - -d /storage/.config/vpn-config 0755 root root 10d - +d /run/connman 0755 root root - - +d /storage/.cache/connman 0755 root root - - +d /storage/.config/vpn-config 0755 root root - - diff --git a/packages/network/openssh/tmpfiles.d/51_sshd.conf b/packages/network/openssh/tmpfiles.d/51_sshd.conf index 22664d4584..2a208a7829 100644 --- a/packages/network/openssh/tmpfiles.d/51_sshd.conf +++ b/packages/network/openssh/tmpfiles.d/51_sshd.conf @@ -18,6 +18,6 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /var/empty 0600 root root 10d - +d /var/empty 0600 root root - - d /storage/.cache/ssh 0755 root root - - d /storage/.ssh 0700 root root - - diff --git a/packages/security/polkit/tmpfiles.d/34_polkit.conf b/packages/security/polkit/tmpfiles.d/34_polkit.conf index 127a9bcb83..c006a7ce4c 100644 --- a/packages/security/polkit/tmpfiles.d/34_polkit.conf +++ b/packages/security/polkit/tmpfiles.d/34_polkit.conf @@ -18,9 +18,9 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /var/lib/polkit-1 0700 root root 10d - -d /var/lib/polkit-1/localauthority/10-vendor.d 0755 root root 10d - -d /var/lib/polkit-1/localauthority/20-org.d 0755 root root 10d - -d /var/lib/polkit-1/localauthority/30-site.d 0755 root root 10d - -d /var/lib/polkit-1/localauthority/50-local.d 0755 root root 10d - -d /var/lib/polkit-1/localauthority/90-mandatory.d 0755 root root 10d - +d /var/lib/polkit-1 0700 root root - - +d /var/lib/polkit-1/localauthority/10-vendor.d 0755 root root - - +d /var/lib/polkit-1/localauthority/20-org.d 0755 root root - - +d /var/lib/polkit-1/localauthority/30-site.d 0755 root root - - +d /var/lib/polkit-1/localauthority/50-local.d 0755 root root - - +d /var/lib/polkit-1/localauthority/90-mandatory.d 0755 root root - - diff --git a/packages/sysutils/busybox/tmpfiles.d/02_busybox.conf b/packages/sysutils/busybox/tmpfiles.d/02_busybox.conf index 2d1b051c58..281eb319be 100644 --- a/packages/sysutils/busybox/tmpfiles.d/02_busybox.conf +++ b/packages/sysutils/busybox/tmpfiles.d/02_busybox.conf @@ -18,12 +18,12 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /var/cache 0755 root root 10d - -d /var/lib 0755 root root 10d - -d /var/lock 0755 root root 10d - -d /var/media 0755 root root 10d - -d /var/run 1777 root root 10d - -d /var/tmp 1777 root root 10d - +d /var/cache 0755 root root - - +d /var/lib 0755 root root - - +d /var/lock 0755 root root - - +d /var/media 0755 root root - - +d /var/run 1777 root root - - +d /var/tmp 1777 root root - - -f /var/run/utmp 1777 root root 10d - -f /var/log/wtmp 1777 root root 10d - +f /var/run/utmp 1777 root root - - +f /var/log/wtmp 1777 root root - - diff --git a/packages/sysutils/dbus/tmpfiles.d/14_dbus.conf b/packages/sysutils/dbus/tmpfiles.d/14_dbus.conf index 3a620aec44..1bd1272f5a 100644 --- a/packages/sysutils/dbus/tmpfiles.d/14_dbus.conf +++ b/packages/sysutils/dbus/tmpfiles.d/14_dbus.conf @@ -18,7 +18,7 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /var/lib/dbus 0755 root root 10d - -d /var/run/dbus 0755 root root 10d - +d /var/lib/dbus 0755 root root - - +d /var/run/dbus 0755 root root - - L /var/lib/dbus/machine-id - - - - /etc/machine-id diff --git a/packages/sysutils/remote/atvclient/tmpfiles.d/63_atvclient.conf b/packages/sysutils/remote/atvclient/tmpfiles.d/63_atvclient.conf index 66ef20dd4a..363e7605f1 100644 --- a/packages/sysutils/remote/atvclient/tmpfiles.d/63_atvclient.conf +++ b/packages/sysutils/remote/atvclient/tmpfiles.d/63_atvclient.conf @@ -18,4 +18,4 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /storage/.cache 0755 root root 10d - +d /storage/.cache 0755 root root - - diff --git a/packages/sysutils/remote/eventlircd/tmpfiles.d/62_eventlircd.conf b/packages/sysutils/remote/eventlircd/tmpfiles.d/62_eventlircd.conf index f857190c06..d5cb376b07 100644 --- a/packages/sysutils/remote/eventlircd/tmpfiles.d/62_eventlircd.conf +++ b/packages/sysutils/remote/eventlircd/tmpfiles.d/62_eventlircd.conf @@ -18,4 +18,4 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /var/run/lirc 0755 root root 10d - +d /var/run/lirc 0755 root root - - diff --git a/packages/sysutils/remote/irserver/tmpfiles.d/63_irserver.conf b/packages/sysutils/remote/irserver/tmpfiles.d/63_irserver.conf index f857190c06..d5cb376b07 100644 --- a/packages/sysutils/remote/irserver/tmpfiles.d/63_irserver.conf +++ b/packages/sysutils/remote/irserver/tmpfiles.d/63_irserver.conf @@ -18,4 +18,4 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /var/run/lirc 0755 root root 10d - +d /var/run/lirc 0755 root root - - diff --git a/packages/sysutils/remote/lirc/tmpfiles.d/61_lirc.conf b/packages/sysutils/remote/lirc/tmpfiles.d/61_lirc.conf index f857190c06..d5cb376b07 100644 --- a/packages/sysutils/remote/lirc/tmpfiles.d/61_lirc.conf +++ b/packages/sysutils/remote/lirc/tmpfiles.d/61_lirc.conf @@ -18,4 +18,4 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /var/run/lirc 0755 root root 10d - +d /var/run/lirc 0755 root root - - diff --git a/packages/sysutils/udisks/tmpfiles.d/31_udisks.conf b/packages/sysutils/udisks/tmpfiles.d/31_udisks.conf index 9178325697..fe79b7e0cd 100644 --- a/packages/sysutils/udisks/tmpfiles.d/31_udisks.conf +++ b/packages/sysutils/udisks/tmpfiles.d/31_udisks.conf @@ -18,4 +18,4 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /var/lib/udisks 0755 root root 10d - +d /var/lib/udisks 0755 root root - - diff --git a/packages/sysutils/upower/tmpfiles.d/32_upower.conf b/packages/sysutils/upower/tmpfiles.d/32_upower.conf index a9d84fdf9e..f38fa38838 100644 --- a/packages/sysutils/upower/tmpfiles.d/32_upower.conf +++ b/packages/sysutils/upower/tmpfiles.d/32_upower.conf @@ -18,4 +18,4 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /var/lib/upower 0755 root root 10d - +d /var/lib/upower 0755 root root - - diff --git a/packages/x11/xserver/xorg-server/tmpfiles.d/xorg-server.conf b/packages/x11/xserver/xorg-server/tmpfiles.d/xorg-server.conf index c82673c81f..ba39386809 100644 --- a/packages/x11/xserver/xorg-server/tmpfiles.d/xorg-server.conf +++ b/packages/x11/xserver/xorg-server/tmpfiles.d/xorg-server.conf @@ -18,5 +18,5 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -d /var/cache/xkb 0755 root root 10d - +d /var/cache/xkb 0755 root root - - d /var/lib 0755 root root - - From 1ece5d4a182eb45d44d7a8bd4a4b17ab6cf00ad3 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 6 Aug 2013 15:41:32 +0300 Subject: [PATCH 097/103] fontconfig: add tmpfiles.d support --- .../x11/other/fontconfig/init.d/35_fontconfig | 1 - .../fontconfig/tmpfiles.d/35_fontconfig.conf | 21 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 packages/x11/other/fontconfig/tmpfiles.d/35_fontconfig.conf diff --git a/packages/x11/other/fontconfig/init.d/35_fontconfig b/packages/x11/other/fontconfig/init.d/35_fontconfig index 6b3ea3011c..8197696a8d 100644 --- a/packages/x11/other/fontconfig/init.d/35_fontconfig +++ b/packages/x11/other/fontconfig/init.d/35_fontconfig @@ -37,7 +37,6 @@ FC_CACHE_DIRS="/usr/share/fonts/ /usr/share/xbmc/media/Fonts/" ( progress "Creating fontconfig cache" if [ ! -f /storage/.cache/fontconfig/CACHEDIR.TAG ]; then - mkdir -p /storage/.cache/fontconfig fc-cache $FC_CACHE_DIRS fi )& diff --git a/packages/x11/other/fontconfig/tmpfiles.d/35_fontconfig.conf b/packages/x11/other/fontconfig/tmpfiles.d/35_fontconfig.conf new file mode 100644 index 0000000000..0baa588bbe --- /dev/null +++ b/packages/x11/other/fontconfig/tmpfiles.d/35_fontconfig.conf @@ -0,0 +1,21 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +d /storage/.cache/fontconfig 0755 root root - - From 9373a11b4a5e94520f914e4b4c021470e82aff86 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 6 Aug 2013 16:33:21 +0300 Subject: [PATCH 098/103] obexd: start via initscript --- .../bluez/config/org.bluez.obex.service | 5 -- packages/network/bluez/init.d/55_obexd | 46 +++++++++++++++++++ 2 files changed, 46 insertions(+), 5 deletions(-) delete mode 100644 packages/network/bluez/config/org.bluez.obex.service create mode 100644 packages/network/bluez/init.d/55_obexd diff --git a/packages/network/bluez/config/org.bluez.obex.service b/packages/network/bluez/config/org.bluez.obex.service deleted file mode 100644 index 4a34bd8b76..0000000000 --- a/packages/network/bluez/config/org.bluez.obex.service +++ /dev/null @@ -1,5 +0,0 @@ -[D-BUS Service] -Name=org.bluez.obex -Exec=/usr/lib/bluetooth/obexd -r /storage/downloads -User=root - diff --git a/packages/network/bluez/init.d/55_obexd b/packages/network/bluez/init.d/55_obexd new file mode 100644 index 0000000000..cd1995c6ce --- /dev/null +++ b/packages/network/bluez/init.d/55_obexd @@ -0,0 +1,46 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +# +# start obexd +# +# runlevels: openelec, textmode + +( + # can be called from openelec addon. + # ensure that environment is sane + . /etc/profile + + if [ "$DEBUG" = "yes" ]; then + OBEXD_DEBUG="-d" + fi + + OBEXD_ENABLED=true + OBEXD_ROOT=/storage/downloads + if [ -f $CONFIG_CACHE/service_bluez.conf ]; then + . $CONFIG_CACHE/service_bluez.conf + fi + + if [ "$BLUEZ_ENABLED" == "true" -a "$OBEXD_ENABLED" == "true" ]; then + progress "Starting obexd" + wait_for_dbus + /usr/lib/bluetooth/obexd $OBEXD_DEBUG -r "$OBEXD_ROOT" &>/dev/null + fi +)& From e650705b8a79231e4238ae32f7a384508185fb38 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Wed, 7 Aug 2013 00:42:50 +0300 Subject: [PATCH 099/103] projects/*/linux/linux.*.conf: CONFIG_PPP (ppp_generic) must be built-in --- projects/ARCTIC_MC/linux/linux.x86_64.conf | 2 +- projects/ATV/linux/linux.i386.conf | 2 +- projects/Fusion/linux/linux.x86_64.conf | 2 +- projects/Generic/linux/linux.i386.conf | 2 +- projects/Generic/linux/linux.x86_64.conf | 2 +- projects/Generic_OSS/linux/linux.i386.conf | 2 +- projects/ION/linux/linux.x86_64.conf | 2 +- projects/Intel/linux/linux.x86_64.conf | 2 +- projects/RPi/linux/linux.arm.conf | 2 +- projects/Ultra/linux/linux.x86_64.conf | 2 +- projects/Virtual/linux/linux.i386.conf | 2 +- projects/Virtual/linux/linux.x86_64.conf | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/projects/ARCTIC_MC/linux/linux.x86_64.conf b/projects/ARCTIC_MC/linux/linux.x86_64.conf index 1ac2d81744..977b39d550 100644 --- a/projects/ARCTIC_MC/linux/linux.x86_64.conf +++ b/projects/ARCTIC_MC/linux/linux.x86_64.conf @@ -1311,7 +1311,7 @@ CONFIG_REALTEK_PHY=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/ATV/linux/linux.i386.conf b/projects/ATV/linux/linux.i386.conf index 80da55de68..f590e963d9 100644 --- a/projects/ATV/linux/linux.i386.conf +++ b/projects/ATV/linux/linux.i386.conf @@ -1240,7 +1240,7 @@ CONFIG_PHYLIB=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/Fusion/linux/linux.x86_64.conf b/projects/Fusion/linux/linux.x86_64.conf index 10a4e9bb94..e5d8dd7690 100644 --- a/projects/Fusion/linux/linux.x86_64.conf +++ b/projects/Fusion/linux/linux.x86_64.conf @@ -1245,7 +1245,7 @@ CONFIG_REALTEK_PHY=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/Generic/linux/linux.i386.conf b/projects/Generic/linux/linux.i386.conf index f2fe25d6e1..34b3119936 100644 --- a/projects/Generic/linux/linux.i386.conf +++ b/projects/Generic/linux/linux.i386.conf @@ -1331,7 +1331,7 @@ CONFIG_REALTEK_PHY=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/Generic/linux/linux.x86_64.conf b/projects/Generic/linux/linux.x86_64.conf index 67d131c21a..119c82bb90 100644 --- a/projects/Generic/linux/linux.x86_64.conf +++ b/projects/Generic/linux/linux.x86_64.conf @@ -1312,7 +1312,7 @@ CONFIG_REALTEK_PHY=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/Generic_OSS/linux/linux.i386.conf b/projects/Generic_OSS/linux/linux.i386.conf index d672501f7f..d1adfb06e8 100644 --- a/projects/Generic_OSS/linux/linux.i386.conf +++ b/projects/Generic_OSS/linux/linux.i386.conf @@ -1329,7 +1329,7 @@ CONFIG_REALTEK_PHY=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/ION/linux/linux.x86_64.conf b/projects/ION/linux/linux.x86_64.conf index 161b7c3851..37ba9937df 100644 --- a/projects/ION/linux/linux.x86_64.conf +++ b/projects/ION/linux/linux.x86_64.conf @@ -1233,7 +1233,7 @@ CONFIG_REALTEK_PHY=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/Intel/linux/linux.x86_64.conf b/projects/Intel/linux/linux.x86_64.conf index 6520b4e4e5..37119cf078 100644 --- a/projects/Intel/linux/linux.x86_64.conf +++ b/projects/Intel/linux/linux.x86_64.conf @@ -1256,7 +1256,7 @@ CONFIG_REALTEK_PHY=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/RPi/linux/linux.arm.conf b/projects/RPi/linux/linux.arm.conf index 3611556bee..d44fe3fb78 100644 --- a/projects/RPi/linux/linux.arm.conf +++ b/projects/RPi/linux/linux.arm.conf @@ -873,7 +873,7 @@ CONFIG_PHYLIB=y # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set # CONFIG_MICREL_KS8995MA is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/Ultra/linux/linux.x86_64.conf b/projects/Ultra/linux/linux.x86_64.conf index 0b619f8cb1..84dca8faee 100644 --- a/projects/Ultra/linux/linux.x86_64.conf +++ b/projects/Ultra/linux/linux.x86_64.conf @@ -1209,7 +1209,7 @@ CONFIG_PHYLIB=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/Virtual/linux/linux.i386.conf b/projects/Virtual/linux/linux.i386.conf index 5a193b25fa..6c1dd430f3 100644 --- a/projects/Virtual/linux/linux.i386.conf +++ b/projects/Virtual/linux/linux.i386.conf @@ -1330,7 +1330,7 @@ CONFIG_REALTEK_PHY=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set diff --git a/projects/Virtual/linux/linux.x86_64.conf b/projects/Virtual/linux/linux.x86_64.conf index 1ac2d81744..977b39d550 100644 --- a/projects/Virtual/linux/linux.x86_64.conf +++ b/projects/Virtual/linux/linux.x86_64.conf @@ -1311,7 +1311,7 @@ CONFIG_REALTEK_PHY=y # CONFIG_MICREL_PHY is not set # CONFIG_FIXED_PHY is not set # CONFIG_MDIO_BITBANG is not set -CONFIG_PPP=m +CONFIG_PPP=y CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_FILTER is not set From e9cb41965dddc44841d336c6d526a55212f7e01d Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Wed, 7 Aug 2013 00:56:50 +0300 Subject: [PATCH 100/103] projects/*/linux/linux.*.conf: CONFIG_TUN must be built-in --- projects/ARCTIC_MC/linux/linux.x86_64.conf | 2 +- projects/ATV/linux/linux.i386.conf | 2 +- projects/Fusion/linux/linux.x86_64.conf | 2 +- projects/Generic/linux/linux.i386.conf | 2 +- projects/Generic/linux/linux.x86_64.conf | 2 +- projects/Generic_OSS/linux/linux.i386.conf | 2 +- projects/ION/linux/linux.x86_64.conf | 2 +- projects/Intel/linux/linux.x86_64.conf | 2 +- projects/RPi/linux/linux.arm.conf | 2 +- projects/Ultra/linux/linux.x86_64.conf | 2 +- projects/Virtual/linux/linux.i386.conf | 2 +- projects/Virtual/linux/linux.x86_64.conf | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/projects/ARCTIC_MC/linux/linux.x86_64.conf b/projects/ARCTIC_MC/linux/linux.x86_64.conf index 977b39d550..df33e0a9b1 100644 --- a/projects/ARCTIC_MC/linux/linux.x86_64.conf +++ b/projects/ARCTIC_MC/linux/linux.x86_64.conf @@ -1164,7 +1164,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set diff --git a/projects/ATV/linux/linux.i386.conf b/projects/ATV/linux/linux.i386.conf index f590e963d9..f21aa88900 100644 --- a/projects/ATV/linux/linux.i386.conf +++ b/projects/ATV/linux/linux.i386.conf @@ -1143,7 +1143,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set diff --git a/projects/Fusion/linux/linux.x86_64.conf b/projects/Fusion/linux/linux.x86_64.conf index e5d8dd7690..f75ba12ecb 100644 --- a/projects/Fusion/linux/linux.x86_64.conf +++ b/projects/Fusion/linux/linux.x86_64.conf @@ -1139,7 +1139,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set diff --git a/projects/Generic/linux/linux.i386.conf b/projects/Generic/linux/linux.i386.conf index 34b3119936..e0f97691fc 100644 --- a/projects/Generic/linux/linux.i386.conf +++ b/projects/Generic/linux/linux.i386.conf @@ -1183,7 +1183,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set diff --git a/projects/Generic/linux/linux.x86_64.conf b/projects/Generic/linux/linux.x86_64.conf index 119c82bb90..4d369a5c27 100644 --- a/projects/Generic/linux/linux.x86_64.conf +++ b/projects/Generic/linux/linux.x86_64.conf @@ -1164,7 +1164,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set diff --git a/projects/Generic_OSS/linux/linux.i386.conf b/projects/Generic_OSS/linux/linux.i386.conf index d1adfb06e8..6b839f6805 100644 --- a/projects/Generic_OSS/linux/linux.i386.conf +++ b/projects/Generic_OSS/linux/linux.i386.conf @@ -1183,7 +1183,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set diff --git a/projects/ION/linux/linux.x86_64.conf b/projects/ION/linux/linux.x86_64.conf index 37ba9937df..dbe731c5cc 100644 --- a/projects/ION/linux/linux.x86_64.conf +++ b/projects/ION/linux/linux.x86_64.conf @@ -1126,7 +1126,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set diff --git a/projects/Intel/linux/linux.x86_64.conf b/projects/Intel/linux/linux.x86_64.conf index 37119cf078..c9269e92db 100644 --- a/projects/Intel/linux/linux.x86_64.conf +++ b/projects/Intel/linux/linux.x86_64.conf @@ -1141,7 +1141,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set diff --git a/projects/RPi/linux/linux.arm.conf b/projects/RPi/linux/linux.arm.conf index d44fe3fb78..7d4fe2e870 100644 --- a/projects/RPi/linux/linux.arm.conf +++ b/projects/RPi/linux/linux.arm.conf @@ -832,7 +832,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # diff --git a/projects/Ultra/linux/linux.x86_64.conf b/projects/Ultra/linux/linux.x86_64.conf index 84dca8faee..c752ca737e 100644 --- a/projects/Ultra/linux/linux.x86_64.conf +++ b/projects/Ultra/linux/linux.x86_64.conf @@ -1118,7 +1118,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set diff --git a/projects/Virtual/linux/linux.i386.conf b/projects/Virtual/linux/linux.i386.conf index 6c1dd430f3..7097df3df7 100644 --- a/projects/Virtual/linux/linux.i386.conf +++ b/projects/Virtual/linux/linux.i386.conf @@ -1183,7 +1183,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set diff --git a/projects/Virtual/linux/linux.x86_64.conf b/projects/Virtual/linux/linux.x86_64.conf index 977b39d550..df33e0a9b1 100644 --- a/projects/Virtual/linux/linux.x86_64.conf +++ b/projects/Virtual/linux/linux.x86_64.conf @@ -1164,7 +1164,7 @@ CONFIG_MII=y # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m +CONFIG_TUN=y # CONFIG_VETH is not set # CONFIG_ARCNET is not set From 3941c7fe41c90011db55b2c11d01b0b59f50aa97 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Wed, 7 Aug 2013 00:59:38 +0300 Subject: [PATCH 101/103] bluez: ups. closes #2511 --- packages/network/bluez/package.mk | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/network/bluez/package.mk b/packages/network/bluez/package.mk index 823d702a95..4f8f0d0430 100644 --- a/packages/network/bluez/package.mk +++ b/packages/network/bluez/package.mk @@ -70,7 +70,3 @@ pre_configure_target() { rm -rf .$TARGET_NAME } -post_makeinstall_target() { - mkdir -p $INSTALL/usr/share/dbus-1/system-services - cp $PKG_DIR/config/org.bluez.obex.service $INSTALL/usr/share/dbus-1/system-services -} From 9883906dd533f2d5a893bee9825e59364bc6ce7d Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 7 Aug 2013 02:16:12 +0200 Subject: [PATCH 102/103] polkit: convert to new package format Signed-off-by: Stephan Raue --- packages/security/polkit/build | 46 ------------- packages/security/polkit/install | 68 ------------------- packages/security/polkit/{meta => package.mk} | 24 ++++++- 3 files changed, 22 insertions(+), 116 deletions(-) delete mode 100755 packages/security/polkit/build delete mode 100755 packages/security/polkit/install rename packages/security/polkit/{meta => package.mk} (64%) diff --git a/packages/security/polkit/build b/packages/security/polkit/build deleted file mode 100755 index 0da741cf88..0000000000 --- a/packages/security/polkit/build +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --prefix=/usr \ - --sysconfdir=/etc \ - --datadir=/usr/share \ - --libexecdir=/usr/lib/polkit-1 \ - --localstatedir=/var \ - --disable-static \ - --enable-shared \ - --disable-man-pages \ - --disable-gtk-doc \ - --disable-nls \ - --disable-introspection \ - --disable-systemd \ - --with-authfw=shadow \ - --with-os-type=redhat \ - --with-expat=$SYSROOT_PREFIX/usr \ - -make - -$MAKEINSTALL diff --git a/packages/security/polkit/install b/packages/security/polkit/install deleted file mode 100755 index 4d99cb6561..0000000000 --- a/packages/security/polkit/install +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/etc/dbus-1/system.d - cp -P $PKG_BUILD/data/org.freedesktop.PolicyKit1.conf $INSTALL/etc/dbus-1/system.d - -mkdir -p $INSTALL/etc/polkit-1/localauthority - echo "chmod 700 $INSTALL/etc/polkit-1/localauthority" >> $FAKEROOT_SCRIPT - -mkdir -p $INSTALL/etc/polkit-1/localauthority/10-vendor.d -mkdir -p $INSTALL/etc/polkit-1/localauthority/20-org.d -mkdir -p $INSTALL/etc/polkit-1/localauthority/30-site.d -mkdir -p $INSTALL/etc/polkit-1/localauthority/50-local.d -mkdir -p $INSTALL/etc/polkit-1/localauthority/90-mandatory.d - -mkdir -p $INSTALL/etc/polkit-1/localauthority.conf.d - cp -P $PKG_BUILD/src/polkitbackend/50-localauthority.conf $INSTALL/etc/polkit-1/localauthority.conf.d - -mkdir -p $INSTALL/etc/polkit-1/nullbackend.conf.d - cp -P $PKG_BUILD/src/nullbackend/50-nullbackend.conf $INSTALL/etc/polkit-1/nullbackend.conf.d - -mkdir -p $INSTALL/usr/bin - cp -P $PKG_BUILD/src/programs/.libs/pkaction $INSTALL/usr/bin - cp -P $PKG_BUILD/src/programs/.libs/pkcheck $INSTALL/usr/bin - cp -P $PKG_BUILD/src/programs/.libs/pkexec $INSTALL/usr/bin - echo "chmod 4755 $INSTALL/usr/bin/pkexec" >> $FAKEROOT_SCRIPT - -mkdir -p $INSTALL/usr/lib - cp -P $PKG_BUILD/src/polkitagent/.libs/libpolkit-agent-1.so* $INSTALL/usr/lib - rm -rf $INSTALL/usr/lib/libpolkit-agent-1.so*T - cp -P $PKG_BUILD/src/polkitbackend/.libs/libpolkit-backend-1.so* $INSTALL/usr/lib - rm -rf $INSTALL/usr/lib/libpolkit-backend-1.so*T - cp -P $PKG_BUILD/src/polkit/.libs/libpolkit-gobject-1.so* $INSTALL/usr/lib - -mkdir -p $INSTALL/usr/lib/polkit-1/extensions - cp -P $PKG_BUILD/src/nullbackend/.libs/*.so $INSTALL/usr/lib/polkit-1/extensions - -mkdir -p $INSTALL/usr/lib/polkit-1 - cp -P $PKG_BUILD/src/polkitagent/.libs/polkit-agent-helper-1 $INSTALL/usr/lib/polkit-1 - echo "chmod 4755 $INSTALL/usr/lib/polkit-1/polkit-agent-helper-1" >> $FAKEROOT_SCRIPT - cp -P $PKG_BUILD/src/polkitd/.libs/polkitd $INSTALL/usr/lib/polkit-1 - -mkdir -p $INSTALL/usr/share/dbus-1/system-services - cp -P $PKG_BUILD/data/org.freedesktop.PolicyKit1.service $INSTALL/usr/share/dbus-1/system-services - -mkdir -p $INSTALL/usr/share/polkit-1/actions - cp -P $PKG_BUILD/actions/org.freedesktop.policykit.policy $INSTALL/usr/share/polkit-1/actions diff --git a/packages/security/polkit/meta b/packages/security/polkit/package.mk similarity index 64% rename from packages/security/polkit/meta rename to packages/security/polkit/package.mk index e8932328f2..48b4a69c60 100644 --- a/packages/security/polkit/meta +++ b/packages/security/polkit/package.mk @@ -26,11 +26,31 @@ PKG_LICENSE="MIT" PKG_SITE="http://gitweb.freedesktop.org/?p=PolicyKit.git;a=summary" PKG_URL="http://hal.freedesktop.org/releases/$PKG_NAME-$PKG_VERSION.tar.gz" PKG_DEPENDS="zlib glib expat" -PKG_BUILD_DEPENDS="toolchain zlib sg3_utils glib expat" +PKG_BUILD_DEPENDS_TARGET="toolchain zlib sg3_utils glib expat" PKG_PRIORITY="optional" PKG_SECTION="security" PKG_SHORTDESC="polkit: Authorization Toolkit" PKG_LONGDESC="PolicyKit is a toolkit for defining and handling authorizations. It is used for allowing unprivileged processes to speak to privileged processes." -PKG_IS_ADDON="no" +PKG_IS_ADDON="no" PKG_AUTORECONF="yes" + +PKG_CONFIGURE_OPTS_TARGET="--libexecdir=/usr/lib/polkit-1 \ + --disable-man-pages \ + --disable-gtk-doc \ + --disable-nls \ + --disable-introspection \ + --disable-systemd \ + --with-authfw=shadow \ + --with-os-type=redhat \ + --with-expat=$SYSROOT_PREFIX/usr" + +post_makeinstall_target() { + rm -rf $INSTALL/usr/bin/pk-example-frobnicate + rm -rf $INSTALL/usr/share/polkit-1/actions/org.freedesktop.policykit.examples.pkexec.policy +} + +post_install() { + echo "chmod 4755 $INSTALL/usr/bin/pkexec" >> $FAKEROOT_SCRIPT + echo "chmod 4755 $INSTALL/usr/lib/polkit-1/polkit-agent-helper-1" >> $FAKEROOT_SCRIPT +} From 9bcf835a1b32849ed335a0e35bd8e09e9f0af155 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 7 Aug 2013 10:39:57 +0200 Subject: [PATCH 103/103] udisks: rework automounter script Signed-off-by: Stephan Raue --- .../sysutils/udisks/init.d/31_mount-disks | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/packages/sysutils/udisks/init.d/31_mount-disks b/packages/sysutils/udisks/init.d/31_mount-disks index 70ee7a72a4..4824c39236 100644 --- a/packages/sysutils/udisks/init.d/31_mount-disks +++ b/packages/sysutils/udisks/init.d/31_mount-disks @@ -28,22 +28,12 @@ wait_for_dbus - drive_dump () { - udisks --dump | tr -d ' ' | grep 'device-file:' | cut -d ':' -f2 - } - - show_info () { - udisks --show-info $2 | grep "$1:" | tr -d ' ' | cut -d ":" -f2 - } - - for DEVICE in `drive_dump`; do - REMOVABLE="`show_info "removable" $DEVICE`" - MOUNTED="`show_info "is mounted" $DEVICE`" - USAGE="`show_info "usage" $DEVICE`" - - if [ "$REMOVABLE" = "0" -a "$MOUNTED" = "0" -a "$USAGE" = "filesystem" ]; then - udisks --mount "$DEVICE" >/dev/null + for DEVICE in `find /sys/class/block/sd*/removable`; do + if [ "$(cat $DEVICE)" = "0" ]; then + DISK=$(echo "$DEVICE" | sed -e "s,/sys/class/block,/dev," -e "s,/removable,,") + for PART in $(ls "$DISK"[0-9]*);do + udisks --mount "$PART" >/dev/null + done fi - done )&