⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audiodecodertask.cpp

📁 播放被H264_AAC所压缩的avi文件的播放器。
💻 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 + -