mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-24 11:16:51 +00:00
xbmc: update to xbmc-12.0.2
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
22c53cb072
commit
6b8f37c527
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -1,39 +0,0 @@
|
||||
From ac86e23aa11861a4fa063fb2fa05f10cbc4eea19 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
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
|
||||
|
@ -1,26 +0,0 @@
|
||||
From 5c61cc2c3ef7b047060742d736fd2a8cc037ae57 Mon Sep 17 00:00:00 2001
|
||||
From: Jim Carroll <thecarrolls@jiminger.com>
|
||||
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
|
||||
|
@ -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.
|
||||
+};
|
@ -1,68 +0,0 @@
|
||||
From 94ea56fc7c14ade6338e00ff67942ebd7b345e01 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
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
|
||||
|
@ -1,34 +0,0 @@
|
||||
From d1196435876904453d49b93ce5cefa6903489162 Mon Sep 17 00:00:00 2001
|
||||
From: Martijn Kaijser <mcm.kaijser@gmail.com>
|
||||
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
|
||||
|
@ -1,58 +0,0 @@
|
||||
From c1cc1b3dd1065c7a1dea33cf57fbbcae19b38c3b Mon Sep 17 00:00:00 2001
|
||||
From: Andy Maloney <andy@forident.com>
|
||||
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
|
||||
|
@ -1,174 +0,0 @@
|
||||
From 6e28059b93220b1188461bfc99709cf7d27ae11c Mon Sep 17 00:00:00 2001
|
||||
From: norbini <norbini@norbini.co.uk>
|
||||
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<CStdString, CSFTPSessionPtr> 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
|
||||
|
@ -1,420 +0,0 @@
|
||||
From 4ffe9d056514aee9728a707f15f8eb78b71fd202 Mon Sep 17 00:00:00 2001
|
||||
From: fritsch <peter.fruehberger@gmail.com>
|
||||
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 <peter.fruehberger@gmail.com>
|
||||
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 <peter.fruehberger@gmail.com>
|
||||
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 <peter.fruehberger@gmail.com>
|
||||
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 <peter.fruehberger@gmail.com>
|
||||
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
|
||||
|
@ -1,53 +0,0 @@
|
||||
From 8b6032793bcc05a6ec06773c95463a22d2c9881b Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
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
|
||||
|
@ -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"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user