Index: 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);