[osxsink/iossink] - don't spam the log with audiobuffer underruns with 0 bytes availa...
authorMemphiz <memphis@machzwo.de>
Fri, 14 Mar 2014 18:33:23 +0000 (19:33 +0100)
committerMemphiz <memphis@machzwo.de>
Fri, 14 Mar 2014 22:47:39 +0000 (23:47 +0100)
xbmc/cores/AudioEngine/Sinks/AESinkDARWINIOS.cpp
xbmc/cores/AudioEngine/Sinks/AESinkDARWINOSX.cpp

index 130b8a9..c7d3d03 100644 (file)
@@ -529,6 +529,21 @@ void CAAudioUnitSink::sessionInterruptionCallback(void *inClientData, UInt32 inI
   }
 }
 
+inline void LogLevel(unsigned int got, unsigned int wanted)
+{
+  static unsigned int lastReported = INT_MAX;
+  if (got != wanted)
+  {
+    if (got != lastReported)
+    {
+      CLog::Log(LOGWARNING, "DARWINIOS: %sflow (%u vs %u bytes)", got > wanted ? "over" : "under", got, wanted);
+      lastReported = got;
+    }    
+  }
+  else
+    lastReported = INT_MAX; // indicate we were good at least once
+}
+
 OSStatus CAAudioUnitSink::renderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags,
   const AudioTimeStamp *inTimeStamp, UInt32 inOutputBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
 {
@@ -542,8 +557,8 @@ OSStatus CAAudioUnitSink::renderCallback(void *inRefCon, AudioUnitRenderActionFl
     unsigned int wanted = ioData->mBuffers[i].mDataByteSize;
     unsigned int bytes = std::min(sink->m_buffer->GetReadSize(), wanted);
     sink->m_buffer->Read((unsigned char*)ioData->mBuffers[i].mData, bytes);
-    if (bytes != wanted)
-      CLog::Log(LOGERROR, "%s: %sFLOW (%i vs %i) bytes", __FUNCTION__, bytes > wanted ? "OVER" : "UNDER", bytes, wanted);
+    LogLevel(bytes, wanted);
+    
     if (bytes == 0)
       *ioActionFlags |= kAudioUnitRenderAction_OutputIsSilence;
   }
index 60eb532..fc366b5 100644 (file)
@@ -673,6 +673,21 @@ void CAESinkDARWINOSX::EnumerateDevicesEx(AEDeviceInfoList &list, bool force)
     list.push_back(i->second);
 }
 
+inline void LogLevel(unsigned int got, unsigned int wanted)
+{
+  static unsigned int lastReported = INT_MAX;
+  if (got != wanted)
+  {
+    if (got != lastReported)
+    {
+      CLog::Log(LOGWARNING, "DARWINOSX: %sflow (%u vs %u bytes)", got > wanted ? "over" : "under", got, wanted);
+      lastReported = got;
+    }    
+  }
+  else
+    lastReported = INT_MAX; // indicate we were good at least once
+}
+
 OSStatus CAESinkDARWINOSX::renderCallback(AudioDeviceID inDevice, const AudioTimeStamp* inNow, const AudioBufferList* inInputData, const AudioTimeStamp* inInputTime, AudioBufferList* outOutputData, const AudioTimeStamp* inOutputTime, void* inClientData)
 {
   CAESinkDARWINOSX *sink = (CAESinkDARWINOSX*)inClientData;
@@ -702,8 +717,7 @@ OSStatus CAESinkDARWINOSX::renderCallback(AudioDeviceID inDevice, const AudioTim
       unsigned int wanted = outOutputData->mBuffers[i].mDataByteSize;
       unsigned int bytes = std::min(sink->m_buffer->GetReadSize(), wanted);
       sink->m_buffer->Read((unsigned char*)outOutputData->mBuffers[i].mData, bytes);
-      if (bytes != wanted)
-        CLog::Log(LOGERROR, "%s: %sFLOW (%i vs %i) bytes", __FUNCTION__, bytes > wanted ? "OVER" : "UNDER", bytes, wanted);
+      LogLevel(bytes, wanted);
     }
 
     // tell the sink we're good for more data