All pastes #1438418 Raw Edit

Anonymous

public text v1 · immutable
#1438418 ·published 2009-05-28 20:23 UTC
rendered paste body
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);