Skip to content

Commit

Permalink
Audio Glitch
Browse files Browse the repository at this point in the history
Bug solved.
Buffer size calculation improved.
If failed due to wrong size - audio buffer released
restart audio stream on glitch

Audio Log: Added timestamp to log
  • Loading branch information
shauleiz committed Jun 20, 2016
1 parent 4fc43f9 commit 848dbec
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 47 deletions.
67 changes: 27 additions & 40 deletions SPP4/trunk/Spp/SppAudio/SppAudio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1805,39 +1805,34 @@ HRESULT CSppAudio::ProcessAudioPacket(CPulseData * pPulseDataObj)
//
HRESULT CSppAudio::GetAudioPacket(PBYTE pBuffer, PUINT pBufLength, UINT bMax)
{
UINT32 packetLength=0, packetLengthNext=0;
UINT32 packetLength = 0, packetLengthNext = 0;
HRESULT hr = S_OK;
DWORD retval, flags;
BYTE *pDataIn;
static UINT32 pad=0;

// Skip the waiting if padding is waiting to be processed
if (!pad)
{
// Wait for next buffer event to be signaled.
retval = WaitForSingleObject(g_hAudioBufferReady, 2000);

//In case of timeout - continue
if (retval == WAIT_TIMEOUT)
{
return S_FALSE;
};
};
static UINT32 pad = 0;

// Wait for next buffer event to be signaled.
retval = WaitForSingleObject(g_hAudioBufferReady, 2000);

//In case of timeout - break
if (retval == WAIT_TIMEOUT)
{
LogMessage(WARN, IDS_W_PROCPACK_TIMEOUT, L"");
return S_FALSE;
};

// Audio Logger
LogAudio(ALOG_GETPCK, m_CurrentWaveFormat.wBitsPerSample, NULL, m_LogAudioParam);

#pragma warning( disable : 6102 )
// Get pointer to next data packet in capture buffer.
pDataIn = 0;
flags = 0;
hr = m_pCaptureClient->GetBuffer(&pDataIn, &packetLength, &flags, NULL, NULL);
if (FAILED(hr) /*|| flags*/)
if (FAILED(hr))
{
m_pCaptureClient->ReleaseBuffer(packetLength);
LogMessage(ERR, IDS_E_PROCPACK_GETBUF, GetWasapiText(hr));
//LogStatus(PROCPACK_GETBUF,ERR,GetWasapiText(hr),m_LogParam);
packetLength = NULL;
return hr;
};
#pragma warning( default : 6102 )
Expand All @@ -1847,50 +1842,42 @@ HRESULT CSppAudio::GetAudioPacket(PBYTE pBuffer, PUINT pBufLength, UINT bMax)
SendDbgInputSignal(pDataIn, packetLength, m_CurrentWaveFormat.nChannels, m_CurrentWaveFormat.wBitsPerSample);


// Detect glitch in data (Unused in Vista)
// Detect glitch in data (Unused in Vista) but do nothing about it
if (flags == AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY)
{
//m_pCaptureClient->ReleaseBuffer(packetLength);
LogMessage(WARN, IDS_W_PROCPACK_DISC, L"");
};


// Log packets - usually just NO-OP
LogAudio(ALOG_PACK, packetLength*m_CurrentWaveFormat.nChannels, pDataIn, m_LogAudioParam);

// Export buffer to caller
rsize_t size = packetLength*m_CurrentWaveFormat.wBitsPerSample*m_CurrentWaveFormat.nChannels/8;
if (bMax<size)
// Calculate the size of the required buffer
rsize_t size = packetLength*m_CurrentWaveFormat.wBitsPerSample*m_CurrentWaveFormat.nChannels / 8;
if (bMax < size)
{
// Buffer is too small - abort
m_pCaptureClient->ReleaseBuffer(packetLength);
LogMessage(WARN, IDS_E_PROCPACK_TOOBIG, L"");
return AUDCLNT_E_BUFFER_SIZE_ERROR;
}


// Export buffer to caller and update packet length
memcpy_s(pBuffer, bMax, pDataIn, size);
*pBufLength = packetLength;


/* Release the buffer*/
/* Release the audio buffer */
hr = m_pCaptureClient->ReleaseBuffer(packetLength);
if (FAILED(hr))
{
// In case of failure - continue
// In case of failure - break
LogMessage(ERR, IDS_E_PROCPACK_RLS, GetWasapiText(hr));
//LogStatus(PROCPACK_RLS,ERR,GetWasapiText(hr),m_LogParam);
packetLength = NULL;
return hr;
};

// Test how many frames where left - usually none.
// See: http://social.msdn.microsoft.com/Forums/en-US/windowspro-audiodevelopment/thread/0d4a839d-2c10-49f6-965d-094b692af4f0
if (m_pAudioClient)
hr = m_pAudioClient->GetCurrentPadding(&pad);
else
return S_FALSE;

if (FAILED(hr))
{
LogMessage(ERR, IDS_E_PROCPACK_PADD, GetWasapiText(hr));
//LogStatus(PROCPACK_PADD,ERR,GetWasapiText(hr),m_LogParam);
return hr;
};

return hr;
}

Expand Down
9 changes: 5 additions & 4 deletions SPP4/trunk/Spp/SppProcess/SppProcess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -767,12 +767,13 @@ void CSppProcess::CaptureAudio(void)
while (m_waveRecording)
{
m_tCaptureActive = TRUE;

// Capture packet, copy it to buffer and release it
hr = m_Audio->GetAudioPacket(buffer, &bSize, bMax);
if (hr != S_OK)
{
//if (hr = AUDCLNT_E_DEVICE_INVALIDATED)
// break;
continue;
m_ChangeCapture = TRUE;
break;
}


Expand All @@ -785,7 +786,7 @@ void CSppProcess::CaptureAudio(void)

// Test buffer size and adjust if needed
UINT currsize = bSize*m_WaveBitsPerSample*m_WaveNChannels/8;
if (currsize != bMax && currsize)
if (currsize > bMax)
{
delete [] (buffer);
bMax = currsize;
Expand Down
5 changes: 4 additions & 1 deletion SPP4/trunk/Spp/SppUI/Resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -402,13 +402,16 @@
#define IDS_E_CONF_NOFOLDER 40213
#define IDS_I_CONF_CREATEFOLDER 40214
#define IDS_W_NO_MONITOR 40215
#define IDS_W_PROCPACK_TIMEOUT 40301
#define IDS_I_PROCPACK_PADDING 40302
#define IDS_E_PROCPACK_TOOBIG 40303

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 202
#define _APS_NEXT_COMMAND_VALUE 40301
#define _APS_NEXT_COMMAND_VALUE 40304
#define _APS_NEXT_CONTROL_VALUE 2000
#define _APS_NEXT_SYMED_VALUE 202
#endif
Expand Down
13 changes: 12 additions & 1 deletion SPP4/trunk/Spp/SppUI/SppLog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,9 @@ void SppLog::LogAudioUnit(int Code, int source, int Severity, LPVOID Data)

// Initialize
LRESULT lr;
SYSTEMTIME SystemTime;
HWND hEdit=NULL;
WCHAR prefix[6], prtcode[20], src[20];
WCHAR prefix[6], prtcode[20], src[20], PrtTime[30];
GETTEXTLENGTHEX tl;
CHARFORMAT cf;
tl.codepage = CP_ACP;
Expand Down Expand Up @@ -110,8 +111,18 @@ void SppLog::LogAudioUnit(int Code, int source, int Severity, LPVOID Data)

SendMessage(hEdit,EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&cf);


// Calculate Time
GetLocalTime(&SystemTime);
swprintf_s(PrtTime, 30, L"%02d:%02d:%02d.%03d : ", SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, SystemTime.wMilliseconds);

// Print one Line

// Time
lr = SendMessage(hEdit,EM_GETTEXTLENGTHEX , (WPARAM)&tl,0);
SendMessage(hEdit,EM_SETSEL , lr, lr);
SendMessage(hEdit,EM_REPLACESEL , TRUE, (LPARAM)PrtTime);

// Prefix
lr = SendMessage(hEdit,EM_GETTEXTLENGTHEX , (WPARAM)&tl,0);
SendMessage(hEdit,EM_SETSEL , lr, lr);
Expand Down
5 changes: 4 additions & 1 deletion SPP4/trunk/Spp/SppUI/SppUI.rc
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,10 @@ BEGIN
40077 "Request to restart audio streaming - OK"
40078 "Request to restart audio streaming - failed to start capture thread"
40079 "Failed to start audio streaming"
END
40301 "Wait for next buffer event to be signaled - Timeout occured"
40302 "Wait for next buffer event to be signaled - Timeout occured"
40303 "Audio buffer smaller than packet"
END

STRINGTABLE
BEGIN
Expand Down

0 comments on commit 848dbec

Please sign in to comment.