📄 audiodecodertask.cpp
字号:
#include "AudioDecoderTask.h"
#include "Log.h"
//##ModelId=4753B7EA03CA
CAudioDecoderTask::CAudioDecoderTask()
{
m_bSeek = FALSE;
m_nSeekPoint = 0;
m_nSampleSize = 0;
m_nState = THREAD_STOP;
}
//##ModelId=4753B7EA03CB
CAudioDecoderTask::~CAudioDecoderTask()
{
}
//##ModelId=4753B7EA03CC
BOOL CAudioDecoderTask::InitDecTask(IMediaPlayer *pPlayerMedia, CSyncFifo *pAudioStream)
{
if( !pPlayerMedia || !pAudioStream )
return FALSE;
m_pPlayerMedia = pPlayerMedia;
m_pAudioStream = pAudioStream;
m_hStop = CreateEvent(NULL, FALSE, FALSE, NULL);
m_hPause = CreateEvent(NULL, FALSE, FALSE, NULL);
m_hWait = CreateEvent(NULL, FALSE, FALSE, NULL);
if( !m_hStop || !m_hPause || !m_hWait )
return FALSE;
if( CodecInit() < 0 )
return FALSE;
AAC_DECPARAM decParam;
GetDecParam(&decParam);
m_nSampleSize = 1024 * decParam.numChannels * 2;
LogMsg(LOG_INFO, HCLN, "Initialize Audio decoder task!");
return TRUE;
}
//##ModelId=4753B7EA03D9
BOOL CAudioDecoderTask::UninitDecTask()
{
if( m_nState == THREAD_PAUSE )
{
SetEvent(m_hPause);
m_nState = THREAD_RUNNING;
}
if( GetHandle() )
{
SetEvent(m_hStop);
WaitForClosure(INFINITE);
Close();
CloseHandle(m_hStop);
m_nState = THREAD_STOP;
}
CloseHandle(m_hPause);
CloseHandle(m_hWait);
CodecFree();
LogMsg(LOG_INFO, HCLN, "Uninitialize Audio decoder task!");
return TRUE;
}
//##ModelId=4753B7EA03DA
BOOL CAudioDecoderTask::StartDecTask()
{
if( m_nState == THREAD_STOP )
{
if( !Create(ThreadEntry, this) )
return FALSE;
m_nState = THREAD_RUNNING;
LogMsg(LOG_INFO, HCLN, "Create AudioDecoderTask!");
}
else if( m_nState == THREAD_PAUSE)
{
LogMsg(LOG_INFO, HCLN, "Start AudioDecoderTask!");
SetEvent(m_hPause);
m_nState = THREAD_RUNNING;
}
return TRUE;
}
//##ModelId=4753B7EA03DB
BOOL CAudioDecoderTask::StopDecTask()
{
if( m_nState == THREAD_RUNNING )
{
LogMsg(LOG_INFO, HCLN, "Stop AudioDecoderTask!");
SetEvent(m_hPause);
WaitForSingleObject(m_hWait, INFINITE);
m_nState = THREAD_PAUSE;
}
return TRUE;
}
//##ModelId=4753B7EA03DC
BOOL CAudioDecoderTask::SeekPoint(UINT nSeekTime)
{
m_nSeekPoint = nSeekTime;
m_bSeek = TRUE;
return TRUE;
}
//##ModelId=4753B7EA03DE
UINT WINAPI CAudioDecoderTask::ThreadEntry(void *lpParam)
{
((CAudioDecoderTask *) lpParam)->RunDecoding();
return 0;
}
//##ModelId=4753B7EB0002
void CAudioDecoderTask::RunDecoding()
{
BYTE *lpEncData = NULL;
UINT nEncLen;
DWORD nTime;
BYTE *pData = NULL;
HANDLE hEvents[2];
DWORD nRet;
while (TRUE)
{
hEvents[0] = m_hStop;
hEvents[1] = m_hPause;
nRet = WaitForMultipleObjects(2, hEvents, FALSE, 0);
if( nRet == WAIT_OBJECT_0 )
break;
else if( nRet == WAIT_OBJECT_0 + 1 )
{
SetEvent(m_hWait);
WaitForSingleObject(m_hPause, INFINITE);
continue;
}
if( ( pData = (BYTE *)m_pAudioStream->GetPushBuffer(m_nSampleSize) ) &&
( nEncLen = m_pPlayerMedia->OnReadAudio(&lpEncData, nTime) ) )
{
if( Decode(lpEncData, nEncLen, pData) >= 0 )
{
//LogMsg(LOG_DEBUG, HCLN, "Success audio decode %d!", m_nSampleSize);
m_pAudioStream->Push(m_nSampleSize, nTime);
}
}
else
{
if( !pData )
{
//LogMsg(LOG_DEBUG, HCLN, "Sleep for stream!");
Sleep(20);
}
if( !lpEncData )
{
//LogMsg(LOG_DEBUG, HCLN, "Sleep for receive");
Sleep(30);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -