diff --git a/packages/mediacenter/xbmc-theme-Confluence/meta b/packages/mediacenter/xbmc-theme-Confluence/meta index 23ff36811a..b1738abc8e 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.0.1" +PKG_VERSION="12.0.2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/xbmc/meta b/packages/mediacenter/xbmc/meta index 4938f18068..321e843e2b 100644 --- a/packages/mediacenter/xbmc/meta +++ b/packages/mediacenter/xbmc/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xbmc" -PKG_VERSION="12.0.1" +PKG_VERSION="12.0.2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/xbmc/patches/xbmc-990.01-PR2158.patch b/packages/mediacenter/xbmc/patches/xbmc-990.01-PR2158.patch deleted file mode 100644 index 7f984189e7..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-990.01-PR2158.patch +++ /dev/null @@ -1,39 +0,0 @@ -From ac86e23aa11861a4fa063fb2fa05f10cbc4eea19 Mon Sep 17 00:00:00 2001 -From: popcornmix -Date: Fri, 1 Feb 2013 18:37:20 +0000 -Subject: [PATCH] [rbp] Avoid blocking the video thread keeping the video fifo - full. OpenMAX IL is an asynchronous media player. The key - to getting good performance is to ensure the audio and - video fifo have sufficient data to withstand any processing - spikes by the ARM. Ideally the fifos would allow the arm to - crash, and video and audio playback to continue smoothly - for a couple of seconds. - -I've examined the fifo behaviour, and found the video fifo is always almost empty. (The audio fifo is full). -It turns out that the PlayerVideo task (which submits video frames to GPU fifo) blocks until the presentation time has arrived before calling FlipPage (in order to keep subtitles etc. synced). -This is very bad. We generally only one frame of video data in the GPU fifo. This means a spike in ARM workload (e.g. bringing up OSD, or a peak in bitrate) causes the fifo to empty and video to stutter. - -The patch here avoids blocking, and lets the FlipPage happen on a later packet. -I've found with this patch, my test clip (1080p with software DTS audio decode) I can play without stuttering at 700MHz. Without this patch it fails to play even at 1000MHz. ---- - xbmc/cores/omxplayer/OMXPlayerVideo.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -index 90f94aa..5f3f050 100644 ---- a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -+++ b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -@@ -455,8 +455,8 @@ void OMXPlayerVideo::Output(int iGroupId, double pts, bool bDropPacket) - double pts_media = m_av_clock->OMXMediaTime(false, false); - ProcessOverlays(iGroupId, pts_media); - -- while(!CThread::m_bStop && m_av_clock->GetAbsoluteClock(false) < (iCurrentClock + iSleepTime + DVD_MSEC_TO_TIME(500)) ) -- Sleep(1); -+ if (!CThread::m_bStop && m_av_clock->GetAbsoluteClock(false) < (iCurrentClock + iSleepTime + DVD_MSEC_TO_TIME(500)) ) -+ return; - - g_renderManager.FlipPage(CThread::m_bStop, (iCurrentClock + iSleepTime) / DVD_TIME_BASE, -1, FS_NONE); - --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-990.03-Remove_some_annoying_log-spam.patch b/packages/mediacenter/xbmc/patches/xbmc-990.03-Remove_some_annoying_log-spam.patch deleted file mode 100644 index 29d276a2a5..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-990.03-Remove_some_annoying_log-spam.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 5c61cc2c3ef7b047060742d736fd2a8cc037ae57 Mon Sep 17 00:00:00 2001 -From: Jim Carroll -Date: Sun, 3 Feb 2013 16:31:51 -0500 -Subject: [PATCH] Remove some annoying log-spam. - ---- - xbmc/interfaces/python/CallbackHandler.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/xbmc/interfaces/python/CallbackHandler.cpp b/xbmc/interfaces/python/CallbackHandler.cpp -index 01707b9..61c0b5f 100644 ---- a/xbmc/interfaces/python/CallbackHandler.cpp -+++ b/xbmc/interfaces/python/CallbackHandler.cpp -@@ -35,8 +35,8 @@ - */ - PythonCallbackHandler::PythonCallbackHandler() : RetardedAsynchCallbackHandler("PythonCallbackHandler") - { -+ TRACE; - objectThreadState = PyThreadState_Get(); -- CLog::Log(LOGDEBUG,"NEWADDON PythonCallbackHandler construction with PyThreadState 0x%lx",(long)objectThreadState); - } - - /** --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-990.06-PR2152.patch b/packages/mediacenter/xbmc/patches/xbmc-990.06-PR2152.patch deleted file mode 100644 index 3bb40ef921..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-990.06-PR2152.patch +++ /dev/null @@ -1,575 +0,0 @@ -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/AESinkFactory.cpp xbmc-12.0.1.patch/xbmc/cores/AudioEngine/AESinkFactory.cpp ---- xbmc-12.0.1/xbmc/cores/AudioEngine/AESinkFactory.cpp 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/AESinkFactory.cpp 2013-02-09 22:42:48.089803355 +0100 -@@ -129,15 +129,15 @@ - return NULL; - } - --#define ENUMERATE_SINK(SINK) { \ -+#define ENUMERATE_SINK(SINK, force) { \ - AESinkInfo info; \ - info.m_sinkName = #SINK; \ -- CAESink ##SINK::EnumerateDevicesEx(info.m_deviceInfoList); \ -+ CAESink ##SINK::EnumerateDevicesEx(info.m_deviceInfoList, force); \ - if(!info.m_deviceInfoList.empty()) \ - list.push_back(info); \ - } - --void CAESinkFactory::EnumerateEx(AESinkInfoList &list) -+void CAESinkFactory::EnumerateEx(AESinkInfoList &list, bool force) - { - #if defined(TARGET_WINDOWS) - ENUMERATE_SINK(DirectSound); -@@ -147,10 +147,10 @@ - ENUMERATE_SINK(AUDIOTRACK); - #elif defined(TARGET_LINUX) || defined(TARGET_FREEBSD) - #if defined(HAS_ALSA) -- ENUMERATE_SINK(ALSA); -+ ENUMERATE_SINK(ALSA, force); - #endif - -- ENUMERATE_SINK(OSS); -+ ENUMERATE_SINK(OSS, force); - #endif - - } -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/AESinkFactory.h xbmc-12.0.1.patch/xbmc/cores/AudioEngine/AESinkFactory.h ---- xbmc-12.0.1/xbmc/cores/AudioEngine/AESinkFactory.h 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/AESinkFactory.h 2013-02-09 22:42:48.089803355 +0100 -@@ -40,6 +40,6 @@ - public: - static void ParseDevice(std::string &device, std::string &driver); - static IAESink *Create(std::string &device, AEAudioFormat &desiredFormat, bool rawPassthrough); -- static void EnumerateEx(AESinkInfoList &list); -+ static void EnumerateEx(AESinkInfoList &list, bool force = false); /* The force flag can be used to indicate the rescan devices */ - }; - -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp 2013-02-09 22:42:48.101803299 +0100 -@@ -59,6 +59,8 @@ - m_audiophile (true ), - m_running (false ), - m_reOpen (false ), -+ m_closeSink (false ), -+ m_sinkIsSuspended (false ), - m_isSuspended (false ), - m_softSuspend (false ), - m_softSuspendTimer (0 ), -@@ -74,21 +76,18 @@ - m_outputStageFn (NULL ), - m_streamStageFn (NULL ) - { -+ unsigned int c_retry = 5; - CAESinkFactory::EnumerateEx(m_sinkInfoList); -- for (AESinkInfoList::iterator itt = m_sinkInfoList.begin(); itt != m_sinkInfoList.end(); ++itt) -+ while(m_sinkInfoList.size() == 0 && c_retry > 0) - { -- 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()); -- } -+ 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(); - } - - CSoftAE::~CSoftAE() -@@ -179,6 +178,20 @@ - m_wake.Set(); - } - -+void CSoftAE::InternalCloseSink() -+{ -+ /* close the old sink if it was open */ -+ if (m_sink) -+ { -+ CExclusiveLock sinkLock(m_sinkLock); -+ m_sink->Drain(); -+ m_sink->Deinitialize(); -+ delete m_sink; -+ m_sink = NULL; -+ } -+ m_closeSink = false; -+ m_closeEvent.Set(); -+} - /* this must NEVER be called from outside the main thread or Initialization */ - void CSoftAE::InternalOpenSink() - { -@@ -305,15 +318,8 @@ - CExclusiveLock sinkLock(m_sinkLock); - - reInit = true; -- -- /* we are going to open, so close the old sink if it was open */ -- if (m_sink) -- { -- m_sink->Drain(); -- m_sink->Deinitialize(); -- delete m_sink; -- m_sink = NULL; -- } -+ //close the sink cause it gets reinited -+ InternalCloseSink(); - - /* get the display name of the device */ - GetDeviceFriendlyName(device); -@@ -867,10 +873,17 @@ - RemoveStream(m_playingStreams, (CSoftAEStream*)stream); - RemoveStream(m_streams , (CSoftAEStream*)stream); - lock.Leave(); -- -- /* if it was the master stream we need to reopen before deletion */ -- if (m_masterStream == stream) -- OpenSink(); -+ // Close completely when we go to suspend, reopen as it was old behaviour. -+ // Not opening when masterstream stops means clipping on S/PDIF. -+ if(m_isSuspended) -+ { -+ m_closeEvent.Reset(); -+ m_closeSink = true; -+ m_closeEvent.Wait(); -+ m_wake.Set(); -+ } -+ else if (m_masterStream == stream) -+ OpenSink(); - - delete (CSoftAEStream*)stream; - return NULL; -@@ -976,14 +989,54 @@ - CSoftAEStream *stream = *itt; - stream->Flush(); - } -+ #if defined(TARGET_LINUX) -+ /*workaround sinks not playing sound after resume */ -+ StopAllSounds(); -+ CExclusiveLock sinkLock(m_sinkLock); -+ for (AESinkInfoList::iterator itt = m_sinkInfoList.begin(); itt != m_sinkInfoList.end(); ++itt) -+ { -+ itt->m_deviceInfoList.pop_back(); -+ } -+ if(m_sink) -+ { -+ /* Deinitialize and delete current m_sink */ -+ // we don't want that Run reopens our device, so we wait. -+ m_saveSuspend.Reset(); -+ // wait until we are looping in ProcessSuspend() -+ m_saveSuspend.Wait(); -+ m_sink->Drain(); -+ m_sink->Deinitialize(); -+ delete m_sink; -+ m_sink = NULL; -+ // signal anybody, that the sink is closed now -+ // this should help us not to run into deadlocks -+ if(m_closeSink) -+ m_closeEvent.Set(); -+ } -+ // The device list is now empty and must be reenumerated afterwards. -+ m_sinkInfoList.clear(); -+ #endif - - return true; - } - - bool CSoftAE::Resume() - { -+#if defined(TARGET_LINUX) -+ // We must make sure, that we don't return empty. -+ if(m_isSuspended || m_sinkInfoList.empty()) -+ { -+ CLog::Log(LOGDEBUG, "CSoftAE::Resume - Re Enumerating Sinks"); -+ CExclusiveLock sinkLock(m_sinkLock); -+ // Forced enumeration - we are sure that we start completely fresh. -+ CAESinkFactory::EnumerateEx(m_sinkInfoList, true); -+ sinkLock.Leave(); // we leave here explicitly to not lock while printing new sinks -+ PrintSinks(); -+ } -+#endif - CLog::Log(LOGDEBUG, "CSoftAE::Resume - Resuming AE processing"); - m_isSuspended = false; -+ // we flag reopen - m_reOpen = true; - - return true; -@@ -1000,6 +1053,16 @@ - { - bool restart = false; - -+ /* Clean Up what the suspend guy might have forgotten */ -+ // ProcessSuspending() cannot guarantee that we get our sink back softresumed -+ // that is a big problem as another thread could start adding packets -+ // this must be checked here, before writing anything on the sinks -+ if(m_sinkIsSuspended) -+ { -+ CLog::Log(LOGDEBUG, "CSoftAE::Run - Someone has forgotten to resume us (device resumed)"); -+ m_sink->SoftResume(); -+ m_sinkIsSuspended = false; -+ } - if ((this->*m_outputStageFn)(hasAudio) > 0) - hasAudio = false; /* taken some audio - reset our silence flag */ - -@@ -1020,6 +1083,12 @@ - restart = true; - } - -+ //we are told to close the sink -+ if(m_closeSink) -+ { -+ InternalCloseSink(); -+ } -+ - /* Handle idle or forced suspend */ - ProcessSuspend(); - -@@ -1028,8 +1097,8 @@ - { - CLog::Log(LOGDEBUG, "CSoftAE::Run - Sink restart flagged"); - InternalOpenSink(); -- m_isSuspended = false; // exit Suspend state - } -+ - #if defined(TARGET_ANDROID) - else if (m_playingStreams.empty() - && m_playing_sounds.empty() -@@ -1280,6 +1349,24 @@ - return encodedFrames; - } - -+void CSoftAE::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()); -+ } -+ } -+} -+ - unsigned int CSoftAE::RunRawStreamStage(unsigned int channelCount, void *out, bool &restart) - { - StreamList resumeStreams; -@@ -1395,10 +1482,9 @@ - - inline void CSoftAE::ProcessSuspend() - { -- bool sinkIsSuspended = false; -+ m_sinkIsSuspended = false; - unsigned int curSystemClock = 0; -- --#if defined(TARGET_WINDOWS) -+#if defined(TARGET_WINDOWS) || defined(TARGET_LINUX) - if (!m_softSuspend && m_playingStreams.empty() && m_playing_sounds.empty() && - !g_advancedSettings.m_streamSilence) - { -@@ -1410,37 +1496,54 @@ - if (m_softSuspend) - curSystemClock = XbmcThreads::SystemClockMillis(); - #endif -- - /* idle while in Suspend() state until Resume() called */ - /* idle if nothing to play and user hasn't enabled */ - /* continuous streaming (silent stream) in as.xml */ -- while ((m_isSuspended || (m_softSuspend && (curSystemClock > m_softSuspendTimer))) && -- m_running && !m_reOpen) -+ /* In case of Suspend stay in there until Resume is called from outer thread */ -+ while (m_isSuspended || ((m_softSuspend && (curSystemClock > m_softSuspendTimer)) && -+ m_running && !m_reOpen)) - { -- if (m_sink && !sinkIsSuspended) -+ if (!m_isSuspended && m_sink && !m_sinkIsSuspended) - { - /* put the sink in Suspend mode */ - CExclusiveLock sinkLock(m_sinkLock); -- if (!m_sink->SoftSuspend()) -+ if (m_sink && !m_sink->SoftSuspend()) - { -- sinkIsSuspended = false; //sink cannot be suspended -+ m_sinkIsSuspended = false; //sink cannot be suspended - m_softSuspend = false; //break suspend loop - break; - } - else -- sinkIsSuspended = true; //sink has suspended processing -+ { -+ CLog::Log(LOGDEBUG, "Suspended the Sink"); -+ m_sinkIsSuspended = true; //sink has suspended processing -+ } - sinkLock.Leave(); - } -+ // Signal that the Suspend can go on now. -+ // Idea: Outer thread calls Suspend() - but -+ // because of AddPackets does not care about locks, we must make -+ // sure, that our school bus (AE::Run) is currently driving through -+ // some gas station, before we move away the sink. -+ if(m_isSuspended) -+ m_saveSuspend.Set(); - - /* idle for platform-defined time */ - m_wake.WaitMSec(SOFTAE_IDLE_WAIT_MSEC); - -- /* check if we need to resume for stream or sound */ -+ /* check if we need to resume for stream or sound or somebody wants to open us -+ * the suspend checks are only there to: -+ * a) not run out of softSuspend directly when we are sleeping -+ * b) nail(!) the thread during real Suspend into this method -+ * Note: It is not enough to check the streams buffer, cause it might not be filled yet -+ * We have to check after ProcessSuspending() if the sink is still in softsleep and resume it -+ */ - if (!m_isSuspended && (!m_playingStreams.empty() || !m_playing_sounds.empty())) - { -- m_reOpen = !m_sink->SoftResume(); // sink returns false if it requires reinit -- sinkIsSuspended = false; //sink processing data -- m_softSuspend = false; //break suspend loop -+ m_reOpen = m_reOpen || !m_sink->SoftResume(); // sink returns false if it requires reinit -+ m_sinkIsSuspended = false; //sink processing data -+ m_softSuspend = false; //break suspend loop (under some conditions) -+ CLog::Log(LOGDEBUG, "Resumed the Sink"); - break; - } - } -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.h xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.h ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.h 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.h 2013-02-09 22:42:48.101803299 +0100 -@@ -116,6 +116,7 @@ - void OpenSink(); - - void InternalOpenSink(); -+ void InternalCloseSink(); - void ResetEncoder(); - bool SetupEncoder(AEAudioFormat &format); - void Deinitialize(); -@@ -136,11 +137,15 @@ - - /* internal vars */ - bool m_running, m_reOpen; -+ bool m_closeSink; -+ bool m_sinkIsSuspended; /* The sink is in unusable state, e.g. SoftSuspended */ - bool m_isSuspended; /* engine suspended by external function to release audio context */ - bool m_softSuspend; /* latches after last stream or sound played for timer below for idle */ - unsigned int m_softSuspendTimer; /* time in milliseconds to hold sink open before soft suspend for idle */ - CEvent m_reOpenEvent; - CEvent m_wake; -+ CEvent m_closeEvent; -+ CEvent m_saveSuspend; - - CCriticalSection m_runningLock; /* released when the thread exits */ - CCriticalSection m_streamLock; /* m_streams lock */ -@@ -242,5 +247,6 @@ - void RunNormalizeStage (unsigned int channelCount, void *out, unsigned int mixed); - - void RemoveStream(StreamList &streams, CSoftAEStream *stream); -+ void PrintSinks(); - }; - -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp 2013-02-09 22:42:48.101803299 +0100 -@@ -426,7 +426,6 @@ - - if (m_pcm) - { -- snd_pcm_drop (m_pcm); - snd_pcm_close(m_pcm); - m_pcm = NULL; - } -@@ -487,7 +486,13 @@ - unsigned int CAESinkALSA::AddPackets(uint8_t *data, unsigned int frames, bool hasAudio) - { - if (!m_pcm) -- return 0; -+ { -+ SoftResume(); -+ if(!m_pcm) -+ return 0; -+ -+ CLog::Log(LOGDEBUG, "CAESinkALSA - the grAEken is hunger, feed it (I am the downmost fallback - fix your code)"); -+ } - - int ret; - -@@ -676,12 +681,17 @@ - return false; - } - --void CAESinkALSA::EnumerateDevicesEx(AEDeviceInfoList &list) -+void CAESinkALSA::EnumerateDevicesEx(AEDeviceInfoList &list, bool force) - { - /* ensure that ALSA has been initialized */ - snd_lib_error_set_handler(sndLibErrorHandler); -- if(!snd_config) -+ if(!snd_config || force) -+ { -+ if(force) -+ snd_config_update_free_global(); -+ - snd_config_update(); -+ } - - snd_config_t *config; - snd_config_copy(&config, snd_config); -@@ -1125,6 +1135,27 @@ - return true; - } - -+bool CAESinkALSA::SoftSuspend() -+{ -+ if(m_pcm) // it is still there -+ Deinitialize(); -+ -+ return true; -+} -+bool CAESinkALSA::SoftResume() -+{ -+ // reinit all the clibber -+ if(!m_pcm) -+ { -+ if (!snd_config) -+ snd_config_update(); -+ -+ Initialize(m_initFormat, m_initDevice); -+ } -+ //we want that AE loves us again -+ return false; // force reinit -+} -+ - void CAESinkALSA::sndLibErrorHandler(const char *file, int line, const char *function, int err, const char *fmt, ...) - { - va_list arg; -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkALSA.h 2013-02-09 22:42:48.099803309 +0100 -@@ -49,8 +49,10 @@ - virtual double GetCacheTotal (); - virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); - virtual void Drain (); -+ virtual bool SoftSuspend(); -+ virtual bool SoftResume(); - -- static void EnumerateDevicesEx(AEDeviceInfoList &list); -+ static void EnumerateDevicesEx(AEDeviceInfoList &list, bool force = false); - private: - CAEChannelInfo GetChannelLayout(AEAudioFormat format); - void GetAESParams(const AEAudioFormat format, std::string& params); -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp 2013-02-09 22:42:48.090803350 +0100 -@@ -234,7 +234,7 @@ - m_volume_changed = true; - } - --void CAESinkAUDIOTRACK::EnumerateDevicesEx(AEDeviceInfoList &list) -+void CAESinkAUDIOTRACK::EnumerateDevicesEx(AEDeviceInfoList &list, bool force) - { - m_info.m_channels.Reset(); - m_info.m_dataFormats.clear(); -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h 2013-02-09 22:43:15.490676456 +0100 -@@ -43,7 +43,7 @@ - virtual void Drain (); - virtual bool HasVolume (); - virtual void SetVolume (float volume); -- static void EnumerateDevicesEx(AEDeviceInfoList &list); -+ static void EnumerateDevicesEx(AEDeviceInfoList &list, bool force = false); - - private: - virtual void Process(); -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp 2013-02-09 22:42:48.091803346 +0100 -@@ -464,7 +464,7 @@ - return (double)m_dwBufferLen / (double)m_AvgBytesPerSec; - } - --void CAESinkDirectSound::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList) -+void CAESinkDirectSound::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bool force) - { - CAEDeviceInfo deviceInfo; - -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.h 2013-02-09 22:43:40.853559163 +0100 -@@ -43,7 +43,7 @@ - virtual double GetCacheTime (); - virtual double GetCacheTotal (); - virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); -- static void EnumerateDevicesEx (AEDeviceInfoList &deviceInfoList); -+ static void EnumerateDevicesEx (AEDeviceInfoList &deviceInfoList, bool force = false); - private: - void AEChannelsFromSpeakerMask(DWORD speakers); - DWORD SpeakerMaskFromAEChannels(const CAEChannelInfo &channels); -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp 2013-02-09 22:42:48.092803341 +0100 -@@ -427,7 +427,7 @@ - // ??? - } - --void CAESinkOSS::EnumerateDevicesEx(AEDeviceInfoList &list) -+void CAESinkOSS::EnumerateDevicesEx(AEDeviceInfoList &list, bool force) - { - int mixerfd; - const char * mixerdev = "/dev/mixer"; -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkOSS.h 2013-02-09 22:42:48.093803336 +0100 -@@ -43,7 +43,7 @@ - virtual double GetCacheTotal () { return 0.0; } /* FIXME */ - virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); - virtual void Drain (); -- static void EnumerateDevicesEx(AEDeviceInfoList &list); -+ static void EnumerateDevicesEx(AEDeviceInfoList &list, bool force = false); - private: - int m_fd; - std::string m_device; -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.cpp 2013-02-09 22:42:48.093803336 +0100 -@@ -559,7 +559,7 @@ - return false; - } - --void CAESinkWASAPI::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList) -+void CAESinkWASAPI::EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, bool force) - { - IMMDeviceEnumerator* pEnumerator = NULL; - IMMDeviceCollection* pEnumDevices = NULL; -diff -Naur xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h ---- xbmc-12.0.1/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h 2013-02-08 00:07:33.000000000 +0100 -+++ xbmc-12.0.1.patch/xbmc/cores/AudioEngine/Sinks/AESinkWASAPI.h 2013-02-09 22:42:48.094803332 +0100 -@@ -45,7 +45,7 @@ - virtual unsigned int AddPackets (uint8_t *data, unsigned int frames, bool hasAudio); - virtual bool SoftSuspend (); - virtual bool SoftResume (); -- static void EnumerateDevicesEx (AEDeviceInfoList &deviceInfoList); -+ static void EnumerateDevicesEx (AEDeviceInfoList &deviceInfoList, bool force = false); - private: - bool InitializeExclusive(AEAudioFormat &format); - void AEChannelsFromSpeakerMask(DWORD speakers); -@@ -78,4 +78,4 @@ - 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 */ --}; -\ Kein Zeilenumbruch am Dateiende. -+}; diff --git a/packages/mediacenter/xbmc/patches/xbmc-990.08-PR2206.patch b/packages/mediacenter/xbmc/patches/xbmc-990.08-PR2206.patch deleted file mode 100644 index 9868737e8b..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-990.08-PR2206.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 94ea56fc7c14ade6338e00ff67942ebd7b345e01 Mon Sep 17 00:00:00 2001 -From: popcornmix -Date: Mon, 11 Feb 2013 11:38:26 +0000 -Subject: [PATCH] [rbp] Fix for broken ASS subtitles. - -The video fifo patch broke some types of subtitles including ASS. -This keeps closer track of when the sleep time would have ended and calls FlipPage at the appropriate time. -I've also removed the 500ms in the sleep time calculation as that makes the subs render 500ms late. Not sure what its purpose was. ---- - xbmc/cores/omxplayer/OMXPlayerVideo.cpp | 19 +++++++++++++++---- - xbmc/cores/omxplayer/OMXPlayerVideo.h | 1 + - 2 files changed, 16 insertions(+), 4 deletions(-) - -diff --git a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -index 4dec28a..ec7e7f6 100644 ---- a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -+++ b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -@@ -124,6 +124,7 @@ bool OMXPlayerVideo::OpenStream(CDVDStreamInfo &hints) - m_started = false; - m_stalled = m_messageQueue.GetPacketCount(CDVDMsg::DEMUXER_PACKET) == 0; - m_autosync = 1; -+ m_iSleepEndTime = DVD_NOPTS_VALUE; - - m_audio_count = m_av_clock->HasAudio(); - -@@ -452,13 +453,23 @@ void OMXPlayerVideo::Output(int iGroupId, double pts, bool bDropPacket) - m_dropbase = 0.0f; - #endif - -- double pts_media = m_av_clock->OMXMediaTime(false, false); -- ProcessOverlays(iGroupId, pts_media); -+ // DVDPlayer sleeps until m_iSleepEndTime here before calling FlipPage. -+ // Video playback in asynchronous in OMXPlayer, so we don't want to do that here, as it prevents the video fifo from being kept full. -+ // So, we keep track of when FlipPage would have been called on DVDPlayer and return early if it is not time. -+ // m_iSleepEndTime == DVD_NOPTS_VALUE means we are not waiting to call FlipPage, otherwise it is the time we want to call FlipPage -+ if (m_iSleepEndTime == DVD_NOPTS_VALUE) { -+ m_iSleepEndTime = iCurrentClock + iSleepTime; -+ } - -- if (!CThread::m_bStop && m_av_clock->GetAbsoluteClock(false) < (iCurrentClock + iSleepTime + DVD_MSEC_TO_TIME(500)) ) -+ if (!CThread::m_bStop && m_av_clock->GetAbsoluteClock(false) < m_iSleepEndTime) - return; - -- g_renderManager.FlipPage(CThread::m_bStop, (iCurrentClock + iSleepTime) / DVD_TIME_BASE, -1, FS_NONE); -+ m_iSleepEndTime = DVD_NOPTS_VALUE; -+ -+ double pts_media = m_av_clock->OMXMediaTime(false, false); -+ ProcessOverlays(iGroupId, pts_media); -+ -+ g_renderManager.FlipPage(CThread::m_bStop, pts_media / DVD_TIME_BASE, -1, FS_NONE); - - //m_av_clock->WaitAbsoluteClock((iCurrentClock + iSleepTime)); - } -diff --git a/xbmc/cores/omxplayer/OMXPlayerVideo.h b/xbmc/cores/omxplayer/OMXPlayerVideo.h -index 3fd643e..cf05c1f 100644 ---- a/xbmc/cores/omxplayer/OMXPlayerVideo.h -+++ b/xbmc/cores/omxplayer/OMXPlayerVideo.h -@@ -49,6 +49,7 @@ class OMXPlayerVideo : public CThread - bool m_open; - CDVDStreamInfo m_hints; - double m_iCurrentPts; -+ double m_iSleepEndTime; - OMXClock *m_av_clock; - COMXVideo m_omxVideo; - float m_fFrameRate; --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-990.09-PR2146.patch b/packages/mediacenter/xbmc/patches/xbmc-990.09-PR2146.patch deleted file mode 100644 index 01e6350733..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-990.09-PR2146.patch +++ /dev/null @@ -1,34 +0,0 @@ -From d1196435876904453d49b93ce5cefa6903489162 Mon Sep 17 00:00:00 2001 -From: Martijn Kaijser -Date: Wed, 30 Jan 2013 19:30:47 +0100 -Subject: [PATCH] [visualizations] fix crash in goom fixes #12584 - ---- - xbmc/visualizations/Goom/goom2k4-0/src/mmx.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/xbmc/visualizations/Goom/goom2k4-0/src/mmx.c b/xbmc/visualizations/Goom/goom2k4-0/src/mmx.c -index fdf0649..8effa52 100644 ---- a/xbmc/visualizations/Goom/goom2k4-0/src/mmx.c -+++ b/xbmc/visualizations/Goom/goom2k4-0/src/mmx.c -@@ -91,7 +91,7 @@ void zoom_filter_mmx (int prevX, int prevY, - "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */ - - /* ajouter la longueur de ligne a esi */ -- "addl 8(%%ebp),%1 \n\t" -+ "addl %4,%1 \n\t" - - /* recuperation des 2 derniers pixels */ - "movq (%3,%1,4), %%mm1 \n\t" -@@ -115,7 +115,7 @@ void zoom_filter_mmx (int prevX, int prevY, - - "movd %%mm0,%0 \n\t" - :"=g"(expix2[loop]) -- :"r"(pos),"r"(coeffs),"r"(expix1) -+ :"r"(pos),"r"(coeffs),"r"(expix1),"r"(prevX) - - ); - --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-990.10-PR2208.patch b/packages/mediacenter/xbmc/patches/xbmc-990.10-PR2208.patch deleted file mode 100644 index 6ca8eeea6b..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-990.10-PR2208.patch +++ /dev/null @@ -1,58 +0,0 @@ -From c1cc1b3dd1065c7a1dea33cf57fbbcae19b38c3b Mon Sep 17 00:00:00 2001 -From: Andy Maloney -Date: Sun, 10 Feb 2013 08:31:51 -0500 -Subject: [PATCH] Fix memory leaks & Use correct "delete" for arrays - ---- - xbmc/network/AirTunesServer.cpp | 6 +++++- - xbmc/visualizations/Vortex/VortexVis/Core/Renderer.cpp | 2 +- - xbmc/windowing/egl/EGLNativeTypeRaspberryPI.cpp | 2 +- - 3 files changed, 7 insertions(+), 3 deletions(-) - -diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp -index fe3d78d..2f30773 100644 ---- a/xbmc/network/AirTunesServer.cpp -+++ b/xbmc/network/AirTunesServer.cpp -@@ -339,8 +339,12 @@ ao_device* CAirTunesServer::AudioOutputFunctions::ao_open_live(int driver_id, ao - header.durationMs = 0; - - if (device->pipe->Write(&header, sizeof(header)) == 0) -+ { -+ delete device->pipe; -+ delete device; - return 0; -- -+ } -+ - ThreadMessage tMsg = { TMSG_MEDIA_STOP }; - CApplicationMessenger::Get().SendMessage(tMsg, true); - -diff --git a/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.cpp b/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.cpp -index 2191505..ffd39b9 100644 ---- a/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.cpp -+++ b/xbmc/visualizations/Vortex/VortexVis/Core/Renderer.cpp -@@ -1347,7 +1347,7 @@ void Renderer::Sphere(int del_uhol_x, int del_uhol_y, float size) - // g_device->DrawPrimitive(D3DPT_TRIANGLESTRIP, i*2*(del_y+1), 2*del_y ); - m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2*del_uhol_y, &v[i*2*(del_uhol_y+1)], sizeof(PosColNormalUVVertex)); - -- delete v; -+ delete [] v; - // pd->DrawPrimitive( D3DPT_TRIANGLESTRIP, i*2*(del_y+1), 2*del_y ); - } - -diff --git a/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.cpp b/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.cpp -index 71e32c7..d04141b 100644 ---- a/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.cpp -+++ b/xbmc/windowing/egl/EGLNativeTypeRaspberryPI.cpp -@@ -634,7 +634,7 @@ void CEGLNativeTypeRaspberryPI::GetSupportedModes(HDMI_RES_GROUP_T group, std::v - } - } - if (supported_modes) -- delete supported_modes; -+ delete [] supported_modes; - } - - void CEGLNativeTypeRaspberryPI::TvServiceCallback(uint32_t reason, uint32_t param1, uint32_t param2) --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-990.12-PR2058.patch b/packages/mediacenter/xbmc/patches/xbmc-990.12-PR2058.patch deleted file mode 100644 index e44ec9bfae..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-990.12-PR2058.patch +++ /dev/null @@ -1,174 +0,0 @@ -From 6e28059b93220b1188461bfc99709cf7d27ae11c Mon Sep 17 00:00:00 2001 -From: norbini -Date: Wed, 9 Jan 2013 23:08:02 +0000 -Subject: [PATCH] Override CSFTPDirectory::Exists() method to correctly report - whether an SFTP url represents a directory or not. Fixes - ticket #13784. - -Refactored CSFTPSession::Exists() into FileExists() and DirectoryExists() methods, and have CSFTPFile and CSFTPDirectory classes use them. -This means that Exists() calls on these classes correctly only return true if the url refers to an item of the appropriate type (e.g. a file or a directory). ---- - xbmc/filesystem/SFTPDirectory.cpp | 15 ++++++++++ - xbmc/filesystem/SFTPDirectory.h | 1 + - xbmc/filesystem/SFTPFile.cpp | 55 +++++++++++++++++++++++++++++-------- - xbmc/filesystem/SFTPFile.h | 4 ++- - 4 files changed, 63 insertions(+), 12 deletions(-) - -diff --git a/xbmc/filesystem/SFTPDirectory.cpp b/xbmc/filesystem/SFTPDirectory.cpp -index ed04eb2..a7d7c93 100644 ---- a/xbmc/filesystem/SFTPDirectory.cpp -+++ b/xbmc/filesystem/SFTPDirectory.cpp -@@ -20,6 +20,7 @@ - - #include "SFTPDirectory.h" - #ifdef HAS_FILESYSTEM_SFTP -+#include "utils/log.h" - #include "URL.h" - - using namespace XFILE; -@@ -39,4 +40,18 @@ bool CSFTPDirectory::GetDirectory(const CStdString& strPath, CFileItemList &item - CSFTPSessionPtr session = CSFTPSessionManager::CreateSession(url); - return session->GetDirectory(url.GetWithoutFilename().c_str(), url.GetFileName().c_str(), items); - } -+ -+bool CSFTPDirectory::Exists(const char* strPath) -+{ -+ CURL url(strPath); -+ -+ CSFTPSessionPtr session = CSFTPSessionManager::CreateSession(url); -+ if (session) -+ return session->DirectoryExists(url.GetFileName().c_str()); -+ else -+ { -+ CLog::Log(LOGERROR, "SFTPDirectory: Failed to create session to check exists"); -+ return false; -+ } -+} - #endif -diff --git a/xbmc/filesystem/SFTPDirectory.h b/xbmc/filesystem/SFTPDirectory.h -index 82ef542..bc94a83 100644 ---- a/xbmc/filesystem/SFTPDirectory.h -+++ b/xbmc/filesystem/SFTPDirectory.h -@@ -35,6 +35,7 @@ - CSFTPDirectory(void); - virtual ~CSFTPDirectory(void); - virtual bool GetDirectory(const CStdString& strPath, CFileItemList &items); -+ virtual bool Exists(const char* strPath); - }; - } - #endif -diff --git a/xbmc/filesystem/SFTPFile.cpp b/xbmc/filesystem/SFTPFile.cpp -index d176969..34b797f 100644 ---- a/xbmc/filesystem/SFTPFile.cpp -+++ b/xbmc/filesystem/SFTPFile.cpp -@@ -35,6 +35,11 @@ - #pragma comment(lib, "ssh.lib") - #endif - -+#ifdef TARGET_WINDOWS -+#define S_ISDIR(m) ((m & _S_IFDIR) != 0) -+#define S_ISREG(m) ((m & _S_IFREG) != 0) -+#endif -+ - #ifdef _MSC_VER - #define O_RDONLY _O_RDONLY - #endif -@@ -187,19 +192,20 @@ bool CSFTPSession::GetDirectory(const CStdString &base, const CStdString &folder - return false; - } - --bool CSFTPSession::Exists(const char *path) -+bool CSFTPSession::DirectoryExists(const char *path) - { - bool exists = false; -- CSingleLock lock(m_critSect); -- if(m_connected) -- { -- sftp_attributes attributes = sftp_stat(m_sftp_session, CorrectPath(path).c_str()); -- exists = attributes != NULL; -+ uint32_t permissions = 0; -+ exists = GetItemPermissions(path, permissions); -+ return exists && S_ISDIR(permissions); -+} - -- if (attributes) -- sftp_attributes_free(attributes); -- } -- return exists; -+bool CSFTPSession::FileExists(const char *path) -+{ -+ bool exists = false; -+ uint32_t permissions = 0; -+ exists = GetItemPermissions(path, permissions); -+ return exists && S_ISREG(permissions); - } - - int CSFTPSession::Stat(const char *path, struct __stat64* buffer) -@@ -422,6 +428,33 @@ void CSFTPSession::Disconnect() - m_session = NULL; - } - -+/*! -+ \brief Gets POSIX compatible permissions information about the specified file or directory. -+ \param path Remote SSH path to the file or directory. -+ \param permissions POSIX compatible permissions information for the file or directory (if it exists). i.e. can use macros S_ISDIR() etc. -+ \return Returns \e true, if it was possible to get permissions for the file or directory, \e false otherwise. -+ */ -+bool CSFTPSession::GetItemPermissions(const char *path, uint32_t &permissions) -+{ -+ bool gotPermissions = false; -+ CSingleLock lock(m_critSect); -+ if(m_connected) -+ { -+ sftp_attributes attributes = sftp_stat(m_sftp_session, CorrectPath(path).c_str()); -+ if (attributes) -+ { -+ if (attributes->flags & SSH_FILEXFER_ATTR_PERMISSIONS) -+ { -+ permissions = attributes->permissions; -+ gotPermissions = true; -+ } -+ -+ sftp_attributes_free(attributes); -+ } -+ } -+ return gotPermissions; -+} -+ - CCriticalSection CSFTPSessionManager::m_critSect; - map CSFTPSessionManager::sessions; - -@@ -554,7 +587,7 @@ bool CSFTPFile::Exists(const CURL& url) - { - CSFTPSessionPtr session = CSFTPSessionManager::CreateSession(url); - if (session) -- return session->Exists(url.GetFileName().c_str()); -+ return session->FileExists(url.GetFileName().c_str()); - else - { - CLog::Log(LOGERROR, "SFTPFile: Failed to create session to check exists"); -diff --git a/xbmc/filesystem/SFTPFile.h b/xbmc/filesystem/SFTPFile.h -index 7d3574c..1ac83c8 100644 ---- a/xbmc/filesystem/SFTPFile.h -+++ b/xbmc/filesystem/SFTPFile.h -@@ -58,7 +58,8 @@ class CSFTPSession - sftp_file CreateFileHande(const CStdString &file); - void CloseFileHandle(sftp_file handle); - bool GetDirectory(const CStdString &base, const CStdString &folder, CFileItemList &items); -- bool Exists(const char *path); -+ bool DirectoryExists(const char *path); -+ bool FileExists(const char *path); - int Stat(const char *path, struct __stat64* buffer); - int Seek(sftp_file handle, uint64_t position); - int Read(sftp_file handle, void *buffer, size_t length); -@@ -68,6 +69,7 @@ class CSFTPSession - bool VerifyKnownHost(ssh_session session); - bool Connect(const CStdString &host, unsigned int port, const CStdString &username, const CStdString &password); - void Disconnect(); -+ bool GetItemPermissions(const char *path, uint32_t &permissions); - CCriticalSection m_critSect; - - bool m_connected; --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-990.13-PR2218.patch b/packages/mediacenter/xbmc/patches/xbmc-990.13-PR2218.patch deleted file mode 100644 index 60797bc436..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-990.13-PR2218.patch +++ /dev/null @@ -1,420 +0,0 @@ -From 4ffe9d056514aee9728a707f15f8eb78b71fd202 Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Sun, 10 Feb 2013 21:49:31 +0100 -Subject: [PATCH 1/5] AE: Linux AE - some fixes of yesterday merge (Enumerate - + Resume) - ---- - xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -index 96a9a72..20af5a1 100644 ---- a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -+++ b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -@@ -1024,7 +1024,7 @@ bool CSoftAE::Resume() - { - #if defined(TARGET_LINUX) - // We must make sure, that we don't return empty. -- if(m_isSuspended || m_sinkInfoList.empty()) -+ if(m_sinkInfoList.empty()) - { - CLog::Log(LOGDEBUG, "CSoftAE::Resume - Re Enumerating Sinks"); - CExclusiveLock sinkLock(m_sinkLock); -@@ -1095,6 +1095,12 @@ void CSoftAE::Run() - /* if we are told to restart */ - if (m_reOpen || restart || !m_sink) - { -+ if(m_sinkIsSuspended && m_sink) -+ { -+ m_reOpen = m_reOpen || m_sink->SoftResume(); -+ m_sinkIsSuspended = false; -+ CLog::Log(LOGDEBUG, "CSoftAE::Run - Sink was forgotten"); -+ } - CLog::Log(LOGDEBUG, "CSoftAE::Run - Sink restart flagged"); - InternalOpenSink(); - } --- -1.7.10 - - -From 934a29f37b97f7c7b43a9da7086765f1134428a4 Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Mon, 11 Feb 2013 00:08:05 +0100 -Subject: [PATCH 2/5] AE: in doubt restore old suspend behaviour - ---- - xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp | 49 +++++++++++++++------- - 1 file changed, 33 insertions(+), 16 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -index 20af5a1..0f6c6ed 100644 ---- a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -+++ b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -@@ -989,32 +989,50 @@ bool CSoftAE::Suspend() - CSoftAEStream *stream = *itt; - stream->Flush(); - } -+ streamLock.Leave(); - #if defined(TARGET_LINUX) - /*workaround sinks not playing sound after resume */ - StopAllSounds(); -- CExclusiveLock sinkLock(m_sinkLock); -- for (AESinkInfoList::iterator itt = m_sinkInfoList.begin(); itt != m_sinkInfoList.end(); ++itt) -- { -- itt->m_deviceInfoList.pop_back(); -- } -+ bool ret = true; - if(m_sink) - { - /* Deinitialize and delete current m_sink */ - // we don't want that Run reopens our device, so we wait. - m_saveSuspend.Reset(); - // wait until we are looping in ProcessSuspend() -- m_saveSuspend.Wait(); -- m_sink->Drain(); -- m_sink->Deinitialize(); -- delete m_sink; -- m_sink = NULL; -- // signal anybody, that the sink is closed now -- // this should help us not to run into deadlocks -- if(m_closeSink) -- m_closeEvent.Set(); -+ // this is more save to not come up unclean -+ // we cannot wait forever -+ ret = m_saveSuspend.WaitMSec(500); -+ if(ret) -+ { -+ CLog::Log(LOGDEBUG, "CSoftAE::Suspend - After Event"); -+ CExclusiveLock sinkLock(m_sinkLock); -+ // remove all the sinks -+ for (AESinkInfoList::iterator itt = m_sinkInfoList.begin(); itt != m_sinkInfoList.end(); ++itt) -+ { -+ itt->m_deviceInfoList.pop_back(); -+ } -+ m_sink->Drain(); -+ m_sink->Deinitialize(); -+ delete m_sink; -+ m_sink = NULL; -+ } -+ else -+ { -+ CLog::Log(LOGDEBUG, "CSoftAE::Suspend - Unload failed will continue"); -+ m_saveSuspend.Reset(); -+ } - } - // The device list is now empty and must be reenumerated afterwards. -- m_sinkInfoList.clear(); -+ if(ret) -+ m_sinkInfoList.clear(); -+ -+ // signal anybody, that we are gone now (beware of deadlocks) -+ // we don't unset the fields here, to care for reinit after resume -+ if(m_closeSink) -+ m_closeEvent.Set(); -+ if(m_reOpen) -+ m_reOpenEvent.Set(); - #endif - - return true; -@@ -1378,7 +1396,6 @@ unsigned int CSoftAE::RunRawStreamStage(unsigned int channelCount, void *out, bo - StreamList resumeStreams; - static StreamList::iterator itt; - CSingleLock streamLock(m_streamLock); -- - /* handle playing streams */ - for (itt = m_playingStreams.begin(); itt != m_playingStreams.end(); ++itt) - { --- -1.7.10 - - -From cfa7d8d2ca9aa5641f5a6cb5169b2c19c0990992 Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Mon, 11 Feb 2013 03:08:42 +0100 -Subject: [PATCH 3/5] AE: Choose indirection when possible. Care for lazy - evaluation - ---- - xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp | 46 ++++++---------------- - xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.h | 2 - - xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp | 11 +++--- - 3 files changed, 18 insertions(+), 41 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -index 0f6c6ed..dc01abe 100644 ---- a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -+++ b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -@@ -59,7 +59,6 @@ - m_audiophile (true ), - m_running (false ), - m_reOpen (false ), -- m_closeSink (false ), - m_sinkIsSuspended (false ), - m_isSuspended (false ), - m_softSuspend (false ), -@@ -189,8 +188,6 @@ void CSoftAE::InternalCloseSink() - delete m_sink; - m_sink = NULL; - } -- m_closeSink = false; -- m_closeEvent.Set(); - } - /* this must NEVER be called from outside the main thread or Initialization */ - void CSoftAE::InternalOpenSink() -@@ -732,7 +729,7 @@ void CSoftAE::PauseStream(CSoftAEStream *stream) - stream->m_paused = true; - streamLock.Leave(); - -- OpenSink(); -+ m_reOpen = true; - } - - void CSoftAE::ResumeStream(CSoftAEStream *stream) -@@ -743,7 +740,7 @@ void CSoftAE::ResumeStream(CSoftAEStream *stream) - streamLock.Leave(); - - m_streamsPlaying = true; -- OpenSink(); -+ m_reOpen = true; - } - - void CSoftAE::Stop() -@@ -780,7 +777,7 @@ IAEStream *CSoftAE::MakeStream(enum AEDataFormat dataFormat, unsigned int sample - CSoftAEStream *stream = new CSoftAEStream(dataFormat, sampleRate, encodedSampleRate, channelLayout, options); - m_newStreams.push_back(stream); - streamLock.Leave(); -- -+ // this is really needed here - OpenSink(); - return stream; - } -@@ -873,17 +870,9 @@ IAEStream *CSoftAE::FreeStream(IAEStream *stream) - RemoveStream(m_playingStreams, (CSoftAEStream*)stream); - RemoveStream(m_streams , (CSoftAEStream*)stream); - lock.Leave(); -- // Close completely when we go to suspend, reopen as it was old behaviour. -- // Not opening when masterstream stops means clipping on S/PDIF. -- if(m_isSuspended) -- { -- m_closeEvent.Reset(); -- m_closeSink = true; -- m_closeEvent.Wait(); -- m_wake.Set(); -- } -- else if (m_masterStream == stream) -- OpenSink(); -+ // Reopen is old behaviour. Not opening when masterstream stops means clipping on S/PDIF. -+ if(!m_isSuspended && (m_masterStream == stream)) -+ m_reOpen = true; - - delete (CSoftAEStream*)stream; - return NULL; -@@ -1012,10 +1001,7 @@ bool CSoftAE::Suspend() - { - itt->m_deviceInfoList.pop_back(); - } -- m_sink->Drain(); -- m_sink->Deinitialize(); -- delete m_sink; -- m_sink = NULL; -+ InternalCloseSink(); - } - else - { -@@ -1029,8 +1015,6 @@ bool CSoftAE::Suspend() - - // signal anybody, that we are gone now (beware of deadlocks) - // we don't unset the fields here, to care for reinit after resume -- if(m_closeSink) -- m_closeEvent.Set(); - if(m_reOpen) - m_reOpenEvent.Set(); - #endif -@@ -1075,10 +1059,10 @@ void CSoftAE::Run() - // ProcessSuspending() cannot guarantee that we get our sink back softresumed - // that is a big problem as another thread could start adding packets - // this must be checked here, before writing anything on the sinks -- if(m_sinkIsSuspended) -+ if(m_sinkIsSuspended && m_sink) - { - CLog::Log(LOGDEBUG, "CSoftAE::Run - Someone has forgotten to resume us (device resumed)"); -- m_sink->SoftResume(); -+ m_reOpen = !m_sink->SoftResume() || m_reOpen; - m_sinkIsSuspended = false; - } - if ((this->*m_outputStageFn)(hasAudio) > 0) -@@ -1101,12 +1085,6 @@ void CSoftAE::Run() - restart = true; - } - -- //we are told to close the sink -- if(m_closeSink) -- { -- InternalCloseSink(); -- } -- - /* Handle idle or forced suspend */ - ProcessSuspend(); - -@@ -1115,7 +1093,8 @@ void CSoftAE::Run() - { - if(m_sinkIsSuspended && m_sink) - { -- m_reOpen = m_reOpen || m_sink->SoftResume(); -+ // hint for fritsch: remember lazy evaluation -+ m_reOpen = !m_sink->SoftResume() || m_reOpen; - m_sinkIsSuspended = false; - CLog::Log(LOGDEBUG, "CSoftAE::Run - Sink was forgotten"); - } -@@ -1505,7 +1484,6 @@ inline void CSoftAE::RemoveStream(StreamList &streams, CSoftAEStream *stream) - - inline void CSoftAE::ProcessSuspend() - { -- m_sinkIsSuspended = false; - unsigned int curSystemClock = 0; - #if defined(TARGET_WINDOWS) || defined(TARGET_LINUX) - if (!m_softSuspend && m_playingStreams.empty() && m_playing_sounds.empty() && -@@ -1563,7 +1541,7 @@ inline void CSoftAE::ProcessSuspend() - */ - if (!m_isSuspended && (!m_playingStreams.empty() || !m_playing_sounds.empty())) - { -- m_reOpen = m_reOpen || !m_sink->SoftResume(); // sink returns false if it requires reinit -+ m_reOpen = !m_sink->SoftResume() || m_reOpen; // sink returns false if it requires reinit (worthless with current implementation) - m_sinkIsSuspended = false; //sink processing data - m_softSuspend = false; //break suspend loop (under some conditions) - CLog::Log(LOGDEBUG, "Resumed the Sink"); -diff --git a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.h b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.h -index 559e055..26d5e9c 100644 ---- a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.h -+++ b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.h -@@ -137,14 +137,12 @@ class CSoftAE : public IThreadedAE - - /* internal vars */ - bool m_running, m_reOpen; -- bool m_closeSink; - bool m_sinkIsSuspended; /* The sink is in unusable state, e.g. SoftSuspended */ - bool m_isSuspended; /* engine suspended by external function to release audio context */ - bool m_softSuspend; /* latches after last stream or sound played for timer below for idle */ - unsigned int m_softSuspendTimer; /* time in milliseconds to hold sink open before soft suspend for idle */ - CEvent m_reOpenEvent; - CEvent m_wake; -- CEvent m_closeEvent; - CEvent m_saveSuspend; - - CCriticalSection m_runningLock; /* released when the thread exits */ -diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -index b06d358..fe40d17 100644 ---- a/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -+++ b/xbmc/cores/AudioEngine/Sinks/AESinkALSA.cpp -@@ -1144,16 +1144,17 @@ bool CAESinkALSA::SoftSuspend() - } - bool CAESinkALSA::SoftResume() - { -- // reinit all the clibber -+ // reinit all the clibber -+ bool ret = true; // all fine - if(!m_pcm) - { - if (!snd_config) -- snd_config_update(); -+ snd_config_update(); - -- Initialize(m_initFormat, m_initDevice); -+ ret = Initialize(m_initFormat, m_initDevice); - } -- //we want that AE loves us again -- return false; // force reinit -+ //we want that AE loves us again - reinit when initialize failed -+ return ret; // force reinit if false - } - - void CAESinkALSA::sndLibErrorHandler(const char *file, int line, const char *function, int err, const char *fmt, ...) --- -1.7.10 - - -From 87cc3d07ec7eb27c065920f0741e649f72b86acd Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Tue, 12 Feb 2013 22:29:27 +0100 -Subject: [PATCH 4/5] AE: make sure we reOpen when the flag is set or we run - into trouble - ---- - xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp | 15 +++------------ - 1 file changed, 3 insertions(+), 12 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -index dc01abe..085ae30 100644 ---- a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -+++ b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -@@ -1055,21 +1055,12 @@ void CSoftAE::Run() - { - bool restart = false; - -- /* Clean Up what the suspend guy might have forgotten */ -- // ProcessSuspending() cannot guarantee that we get our sink back softresumed -- // that is a big problem as another thread could start adding packets -- // this must be checked here, before writing anything on the sinks -- if(m_sinkIsSuspended && m_sink) -- { -- CLog::Log(LOGDEBUG, "CSoftAE::Run - Someone has forgotten to resume us (device resumed)"); -- m_reOpen = !m_sink->SoftResume() || m_reOpen; -- m_sinkIsSuspended = false; -- } -- if ((this->*m_outputStageFn)(hasAudio) > 0) -+ /* with the new non blocking implementation - we just reOpen here, when it tells reOpen */ -+ if (!m_reOpen && (this->*m_outputStageFn)(hasAudio) > 0) - hasAudio = false; /* taken some audio - reset our silence flag */ - - /* if we have enough room in the buffer */ -- if (m_buffer.Free() >= m_frameSize) -+ if (!m_reOpen && m_buffer.Free() >= m_frameSize) - { - /* take some data for our use from the buffer */ - uint8_t *out = (uint8_t*)m_buffer.Take(m_frameSize); --- -1.7.10 - - -From d6b5df01dee73bf3a6bf4c88c9aeb242396a7b69 Mon Sep 17 00:00:00 2001 -From: fritsch -Date: Wed, 13 Feb 2013 08:34:09 +0100 -Subject: [PATCH 5/5] AE: hold streamlock longer in FreeStream until the data - is gone (could still be used in Output Stage) - ---- - xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -index 085ae30..3dcdcd7 100644 ---- a/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -+++ b/xbmc/cores/AudioEngine/Engines/SoftAE/SoftAE.cpp -@@ -730,6 +730,7 @@ void CSoftAE::PauseStream(CSoftAEStream *stream) - streamLock.Leave(); - - m_reOpen = true; -+ m_wake.Set(); - } - - void CSoftAE::ResumeStream(CSoftAEStream *stream) -@@ -741,6 +742,7 @@ void CSoftAE::ResumeStream(CSoftAEStream *stream) - - m_streamsPlaying = true; - m_reOpen = true; -+ m_wake.Set(); - } - - void CSoftAE::Stop() -@@ -869,7 +871,6 @@ IAEStream *CSoftAE::FreeStream(IAEStream *stream) - CSingleLock lock(m_streamLock); - RemoveStream(m_playingStreams, (CSoftAEStream*)stream); - RemoveStream(m_streams , (CSoftAEStream*)stream); -- lock.Leave(); - // Reopen is old behaviour. Not opening when masterstream stops means clipping on S/PDIF. - if(!m_isSuspended && (m_masterStream == stream)) - m_reOpen = true; --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-990.15-PR2245.patch b/packages/mediacenter/xbmc/patches/xbmc-990.15-PR2245.patch deleted file mode 100644 index 40b17c8756..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-990.15-PR2245.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 8b6032793bcc05a6ec06773c95463a22d2c9881b Mon Sep 17 00:00:00 2001 -From: popcornmix -Date: Fri, 15 Feb 2013 17:58:41 +0000 -Subject: [PATCH] [rbp] Fix for hang after seeking introduced by ASS fix - -#2206 introduced a regression when seeking in some types of SD files where the video stutters and/or stalls. -This is caused by using the wrong clock in FlipPage ---- - xbmc/cores/omxplayer/OMXPlayerVideo.cpp | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - -diff --git a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -index ec7e7f6..5a6e31e 100644 ---- a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -+++ b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -@@ -461,15 +461,15 @@ void OMXPlayerVideo::Output(int iGroupId, double pts, bool bDropPacket) - m_iSleepEndTime = iCurrentClock + iSleepTime; - } - -- if (!CThread::m_bStop && m_av_clock->GetAbsoluteClock(false) < m_iSleepEndTime) -+ if (!CThread::m_bStop && m_av_clock->GetAbsoluteClock(false) < m_iSleepEndTime + DVD_MSEC_TO_TIME(500)) - return; - -- m_iSleepEndTime = DVD_NOPTS_VALUE; -- - double pts_media = m_av_clock->OMXMediaTime(false, false); - ProcessOverlays(iGroupId, pts_media); - -- g_renderManager.FlipPage(CThread::m_bStop, pts_media / DVD_TIME_BASE, -1, FS_NONE); -+ g_renderManager.FlipPage(CThread::m_bStop, m_iSleepEndTime / DVD_TIME_BASE, -1, FS_NONE); -+ -+ m_iSleepEndTime = DVD_NOPTS_VALUE; - - //m_av_clock->WaitAbsoluteClock((iCurrentClock + iSleepTime)); - } -@@ -580,12 +580,14 @@ void OMXPlayerVideo::Process() - m_av_clock->OMXReset(false); - m_av_clock->UnLock(); - m_started = false; -+ m_iSleepEndTime = DVD_NOPTS_VALUE; - } - else if (pMsg->IsType(CDVDMsg::GENERAL_FLUSH)) // private message sent by (COMXPlayerVideo::Flush()) - { - CLog::Log(LOGDEBUG, "COMXPlayerVideo - CDVDMsg::GENERAL_FLUSH"); - m_stalled = true; - m_started = false; -+ m_iSleepEndTime = DVD_NOPTS_VALUE; - m_av_clock->Lock(); - m_av_clock->OMXStop(false); - m_omxVideo.Reset(); --- -1.7.10 - diff --git a/tools/mkpkg/mkpkg_xbmc-frodo b/tools/mkpkg/mkpkg_xbmc-frodo index f6a20125aa..36075d4626 100755 --- a/tools/mkpkg/mkpkg_xbmc-frodo +++ b/tools/mkpkg/mkpkg_xbmc-frodo @@ -20,7 +20,7 @@ ################################################################################ PKG_NAME="xbmc" -PKG_VERSION="12.0.1" +PKG_VERSION="12.0.2" GIT_REPO="-b Frodo git://github.com/xbmc/xbmc.git" DEST_DIR="$PKG_NAME-frodo"