rendered paste bodyIndex: xbmc/cores/AudioRenderers/CoreAudioRenderer.cpp
===================================================================
--- xbmc/cores/AudioRenderers/CoreAudioRenderer.cpp (revision 20724)
+++ xbmc/cores/AudioRenderers/CoreAudioRenderer.cpp (arbetskopia)
@@ -540,6 +540,11 @@
return m_MaxCacheLen - m_pCache->GetTotalBytes(); // This is just an estimate, since the driver is asynchonously pulling data.
}
+unsigned int CCoreAudioRenderer::GetBufferSize()
+{
+ return m_MaxCacheLen;
+}
+
DWORD CCoreAudioRenderer::AddPackets(const void* data, DWORD len)
{
VERIFY_INIT(0);
Index: xbmc/cores/AudioRenderers/Win32DirectSound.cpp
===================================================================
--- xbmc/cores/AudioRenderers/Win32DirectSound.cpp (revision 20724)
+++ xbmc/cores/AudioRenderers/Win32DirectSound.cpp (arbetskopia)
@@ -397,6 +397,11 @@
return m_dwBufferLen - m_CacheLen;
}
+unsigned int CWin32DirectSound::GetBufferSize()
+{
+ return m_dwBufferLen;
+}
+
//***********************************************************************************************
FLOAT CWin32DirectSound::GetDelay()
{
Index: xbmc/cores/AudioRenderers/IAudioRenderer.h
===================================================================
--- xbmc/cores/AudioRenderers/IAudioRenderer.h (revision 20724)
+++ xbmc/cores/AudioRenderers/IAudioRenderer.h (arbetskopia)
@@ -46,6 +46,7 @@
virtual DWORD AddPackets(const void* data, DWORD len) = 0;
virtual bool IsResampling() { return false;};
virtual DWORD GetSpace() = 0;
+ virtual unsigned int GetBufferSize() = 0;
virtual HRESULT Deinitialize() = 0;
virtual HRESULT Pause() = 0;
virtual HRESULT Stop() = 0;
Index: xbmc/cores/AudioRenderers/CoreAudioRenderer.h
===================================================================
--- xbmc/cores/AudioRenderers/CoreAudioRenderer.h (revision 20724)
+++ xbmc/cores/AudioRenderers/CoreAudioRenderer.h (arbetskopia)
@@ -109,6 +109,7 @@
virtual HRESULT Deinitialize();
virtual DWORD AddPackets(const void* data, DWORD len);
virtual DWORD GetSpace();
+ virtual unsigned int GetBufferSize();
virtual HRESULT Pause();
virtual HRESULT Stop();
virtual HRESULT Resume();
Index: xbmc/cores/AudioRenderers/Win32DirectSound.h
===================================================================
--- xbmc/cores/AudioRenderers/Win32DirectSound.h (revision 20724)
+++ xbmc/cores/AudioRenderers/Win32DirectSound.h (arbetskopia)
@@ -48,6 +48,7 @@
virtual DWORD AddPackets(const void* data, DWORD len);
virtual DWORD GetSpace();
+ virtual unsigned int GetBufferSize();
virtual HRESULT Deinitialize();
virtual HRESULT Pause();
virtual HRESULT Stop();
Index: xbmc/cores/AudioRenderers/PulseAudioDirectSound.cpp
===================================================================
--- xbmc/cores/AudioRenderers/PulseAudioDirectSound.cpp (revision 20724)
+++ xbmc/cores/AudioRenderers/PulseAudioDirectSound.cpp (arbetskopia)
@@ -134,6 +134,7 @@
m_uiSamplesPerSec = uiSamplesPerSec;
m_uiBitsPerSample = uiBitsPerSample;
m_bPassthrough = bPassthrough;
+ m_bufferSize = 0;
m_nCurrentVolume = g_stSettings.m_nVolumeLevel;
@@ -276,6 +277,7 @@
else
{
m_dwPacketSize = a->minreq;
+ m_bufferSize = a->tlength;
CLog::Log(LOGDEBUG, "PulseAudio: Default buffer attributes, maxlength=%u, tlength=%u, prebuf=%u, minreq=%u", a->maxlength, a->tlength, a->prebuf, a->minreq);
pa_buffer_attr b;
b.prebuf = a->minreq * 10;
@@ -292,6 +294,7 @@
else
{
m_dwPacketSize = a->minreq;
+ m_bufferSize = a->tlength;
CLog::Log(LOGDEBUG, "PulseAudio: Choosen buffer attributes, maxlength=%u, tlength=%u, prebuf=%u, minreq=%u", a->maxlength, a->tlength, a->prebuf, a->minreq);
}
}
@@ -483,6 +486,11 @@
return l;
}
+unsigned int CPulseAudioDirectSound::GetBufferSize()
+{
+ return m_bufferSize;
+}
+
DWORD CPulseAudioDirectSound::AddPackets(const void* data, DWORD len)
{
if (!m_bIsAllocated)
Index: xbmc/cores/AudioRenderers/NullDirectSound.cpp
===================================================================
--- xbmc/cores/AudioRenderers/NullDirectSound.cpp (revision 20724)
+++ xbmc/cores/AudioRenderers/NullDirectSound.cpp (arbetskopia)
@@ -137,6 +137,12 @@
return (int)BUFFER - m_packetsSent;
}
+//************************************************************************************************
+unsigned int CNullDirectSound::GetBufferSize()
+{
+ return BUFFER;
+}
+
//***********************************************************************************************
DWORD CNullDirectSound::AddPackets(const void* data, DWORD len)
{
Index: xbmc/cores/AudioRenderers/PulseAudioDirectSound.h
===================================================================
--- xbmc/cores/AudioRenderers/PulseAudioDirectSound.h (revision 20724)
+++ xbmc/cores/AudioRenderers/PulseAudioDirectSound.h (arbetskopia)
@@ -50,6 +50,7 @@
virtual DWORD AddPackets(const void* data, DWORD len);
virtual DWORD GetSpace();
+ virtual unsigned int GetBufferSize();
virtual HRESULT Deinitialize();
virtual HRESULT Pause();
virtual HRESULT Stop();
@@ -77,6 +78,7 @@
bool m_bIsAllocated;
+ unsigned int m_bufferSize;
unsigned int m_uiSamplesPerSec;
unsigned int m_uiBitsPerSample;
unsigned int m_uiChannels;
Index: xbmc/cores/AudioRenderers/NullDirectSound.h
===================================================================
--- xbmc/cores/AudioRenderers/NullDirectSound.h (revision 20724)
+++ xbmc/cores/AudioRenderers/NullDirectSound.h (arbetskopia)
@@ -45,6 +45,7 @@
virtual DWORD AddPackets(const void* data, DWORD len);
virtual DWORD GetSpace();
+ virtual unsigned int GetBufferSize();
virtual HRESULT Deinitialize();
virtual HRESULT Pause();
virtual HRESULT Stop();
Index: xbmc/cores/AudioRenderers/ALSADirectSound.cpp
===================================================================
--- xbmc/cores/AudioRenderers/ALSADirectSound.cpp (revision 20724)
+++ xbmc/cores/AudioRenderers/ALSADirectSound.cpp (arbetskopia)
@@ -273,6 +273,7 @@
m_bCanPause = !!snd_pcm_hw_params_can_pause(hw_params);
m_dwPacketSize = snd_pcm_frames_to_bytes(m_pPlayHandle, dwFrameCount);
m_dwNumPackets = dwNumPackets;
+ m_dwBufferSize = dwBufferSize;
CLog::Log(LOGDEBUG, "CALSADirectSound::Initialize - packet size:%u, packet count:%u, buffer size:%u"
, (unsigned int)m_dwPacketSize, m_dwNumPackets, (unsigned int)dwBufferSize);
@@ -438,6 +439,12 @@
}
//***********************************************************************************************
+unsigned int CALSADirectSound::GetBufferSize()
+{
+ return m_dwBufferSize;
+}
+
+//***********************************************************************************************
DWORD CALSADirectSound::AddPackets(const void* data, DWORD len)
{
if (!m_bIsAllocated) {
Index: xbmc/cores/AudioRenderers/ALSADirectSound.h
===================================================================
--- xbmc/cores/AudioRenderers/ALSADirectSound.h (revision 20724)
+++ xbmc/cores/AudioRenderers/ALSADirectSound.h (arbetskopia)
@@ -54,6 +54,7 @@
virtual DWORD AddPackets(const void* data, DWORD len);
virtual DWORD GetSpace();
+ virtual unsigned int GetBufferSize();
virtual HRESULT Deinitialize();
virtual HRESULT Pause();
virtual HRESULT Stop();
@@ -79,10 +80,12 @@
LONG m_nCurrentVolume;
snd_pcm_uframes_t m_dwPacketSize;
unsigned int m_dwNumPackets;
+ unsigned int m_dwBufferSize;
bool m_bPause;
bool m_bIsAllocated;
bool m_bCanPause;
+
unsigned int m_uiSamplesPerSec;
unsigned int m_uiBitsPerSample;
unsigned int m_uiChannels;
Index: xbmc/cores/paplayer/PAPlayer.cpp
===================================================================
--- xbmc/cores/paplayer/PAPlayer.cpp (revision 20724)
+++ xbmc/cores/paplayer/PAPlayer.cpp (arbetskopia)
@@ -727,7 +727,16 @@
retVal = RET_SUCCESS;
if (retVal == RET_SLEEP && retVal2 == RET_SLEEP)
- Sleep(1);
+ {
+ int bufferedTime = (int)((double)(m_pAudioDecoder[m_currentStream]->GetBufferSize() - m_pAudioDecoder[m_currentStream]->GetSpace()) * 1000.0 / (double)m_BytesPerSecond);
+
+ if (m_pAudioDecoder[1 - m_currentStream])
+ bufferedTime = std::min(bufferedTime, (int)((double)(m_pAudioDecoder[1 - m_currentStream]->GetBufferSize() - m_pAudioDecoder[1 - m_currentStream]->GetSpace()) * 1000.0 / (double)m_BytesPerSecond));
+
+ int sleep = std::max(bufferedTime / 2, 1);
+
+ Sleep(std::min(sleep, 15));
+ }
}
else
Sleep(100);