亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? audiodecoderacm.cpp

?? < VC++視頻音頻開發>> 這本書的源碼
?? CPP
字號:
/**************************************************************************************
 *                                                                                    *
 *                                                                                    *
 **************************************************************************************/

#include "AudioDecoderACM.h"

/*
 * ACM封裝器類
 *
 */

MediaAudioDecoderACM::MediaAudioDecoderACM()
{
	this->out_buffer  = NULL;
	this->in_buffer   = NULL;
	this->oFormat     = NULL;

	this->ring        = new MediaRingBuffer();
}

MediaAudioDecoderACM::~MediaAudioDecoderACM()
{
	delete this->ring;
}

/*
 * 媒體項函數
 */

media_type_t  MediaAudioDecoderACM::GetType()
{
	return MEDIA_TYPE_AUDIO_DECODER;
}

char		 *MediaAudioDecoderACM::GetName()
{
	if(this->hacm != NULL) {

		char            *name;
		HACMDRIVERID     dId;
		ACMDRIVERDETAILS details;

		name = (char *) new char[128];

		if(acmDriverID((HACMOBJ) this->hacm, &dId, 0) > 0) {
			
			return NULL;
		}

		memset(&details, 0, sizeof(ACMDRIVERDETAILS));
		details.cbStruct = sizeof(ACMDRIVERDETAILS);

		if(acmDriverDetails(dId, &details, 0) == MMSYSERR_INVALHANDLE) {

			return NULL;
		}

		strcpy(name, details.szLongName);
		return name;
	}

	return "ACM Wrapper";
}
	
MP_RESULT     MediaAudioDecoderACM::Connect(MediaItem *item)
{
	MMRESULT      mmres;
	WAVEFORMATEX *inFormat;
	DWORD         dwOutputFormatSize;

	if(item && item->GetType() == MEDIA_TYPE_DECAPS) {

		this->decaps = (MediaItemDecaps *) item;

		inFormat = this->decaps->GetAudioFormat(0);



		if(inFormat->wFormatTag == 85 && inFormat->cbSize != 12) {



			MPEGLAYER3WAVEFORMAT *format;

			format = (MPEGLAYER3WAVEFORMAT *) inFormat;

			format->wfx.cbSize      = 12;

			format->wID             = 1;
			format->fdwFlags        = 2;
			format->nBlockSize      = 313;
			format->nFramesPerBlock = 1;
			format->nCodecDelay     = 1393;
		}



		if (acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, (LPVOID)&dwOutputFormatSize)) {
			
			return MP_RESULT_ERROR;
		}

		this->oFormat = (WAVEFORMATEX *) new WAVEFORMATEX;
		this->oFormat->wFormatTag = WAVE_FORMAT_PCM;

		if (acmFormatSuggest(NULL, inFormat, this->oFormat, dwOutputFormatSize, ACM_FORMATSUGGESTF_WFORMATTAG)) {

		}

		if (oFormat->wBitsPerSample!=8 && oFormat->wBitsPerSample!=16)
			oFormat->wBitsPerSample=16;
	
		if (oFormat->nChannels!=1 && oFormat->nChannels!=2)
			oFormat->nChannels = 2;

		oFormat->nBlockAlign		= (oFormat->wBitsPerSample/8) * oFormat->nChannels;
		oFormat->nAvgBytesPerSec	= oFormat->nBlockAlign * oFormat->nSamplesPerSec;
		oFormat->cbSize				= 0;

		mmres = acmStreamOpen(&hacm, NULL, inFormat, 
							  this->oFormat, NULL, NULL, 0, ACM_STREAMOPENF_NONREALTIME);

		if(mmres != 0) {


			
			return MP_RESULT_ERROR;
		}



		this->inputSize  = max(2048 - (2048 % inFormat->nBlockAlign),  8*inFormat->nBlockAlign);
		this->outputSize = 0;

		if (acmStreamSize(this->hacm, this->inputSize, &this->outputSize, ACM_STREAMSIZEF_SOURCE))
			return MP_RESULT_ERROR;

		this->ring->Init();

		this->in_buffer  = (char *) new char[this->inputSize];
		this->out_buffer = (char *) new char[this->outputSize];

		this->acmInLeft = 0;
		this->acmLeft   = 0;

		return MP_RESULT_OK;
	}

	return MP_RESULT_ERROR;
}

MP_RESULT     MediaAudioDecoderACM::ReleaseConnections()
{


	this->decaps = NULL;

	free(this->in_buffer);
	this->in_buffer = NULL;

	free(this->out_buffer);
	this->out_buffer = NULL;

	free(this->oFormat);
	this->oFormat = NULL;

	acmStreamClose(this->hacm, 0);

	return MP_RESULT_OK;
}

DWORD         MediaAudioDecoderACM::GetCaps()
{
	return 0;
}

MP_RESULT     MediaAudioDecoderACM::Configure(HINSTANCE hInstance, HWND hwnd)
{
	return MP_RESULT_ERROR;
}



WAVEFORMATEX *MediaAudioDecoderACM::GetAudioFormat()
{
	return this->oFormat;
}

MP_RESULT     MediaAudioDecoderACM::EmptyAudioBuffer()
{
	if(this->ring)
		this->ring->Init();

	this->acmLeft   = 0;
	this->acmInLeft = 0;

	return MP_RESULT_OK;
}

unsigned int MediaAudioDecoderACM::Decompress(void *buffer, unsigned int size)
{
	DWORD    i, done;
	MMRESULT res;

	done = 0;

	if(this->hacm) {

		if(size < 16384) {

			if(this->acmLeft > 0 && !this->ring->IsFullFor(this->acmLeft)) {
			
	
				this->ring->Write((char *) this->out_buffer, this->acmLeft);
				this->acmLeft = 0;
			}

			if(this->acmLeft > 0)
				goto done;
				
			if(!this->acmInLeft) {

				if(this->decaps->ReadAudioData(0, this->in_buffer, this->inputSize) != this->inputSize) {

					return done;
				}
			}

			memset(&this->acmHeader, 0, sizeof(ACMSTREAMHEADER));
	
			this->acmHeader.cbStruct    = sizeof(ACMSTREAMHEADER);
				
			if(this->acmInLeft > 0) {
				
				memcpy(this->in_buffer, ((char *) this->in_buffer) + this->inputSize - this->acmInLeft, this->acmInLeft);

				if(this->decaps->ReadAudioData(0, ((char *) this->in_buffer) + this->acmInLeft, this->inputSize - this->acmInLeft) != (this->inputSize - this->acmInLeft) ) {

					return done;
				}

				this->acmHeader.pbSrc       = (unsigned char *) this->in_buffer;
				this->acmHeader.cbSrcLength = this->inputSize;
		
				this->acmInLeft = 0;
			}
			else {
					this->acmHeader.pbSrc       = (unsigned char *) this->in_buffer;
					this->acmHeader.cbSrcLength = this->inputSize;
			}
			
			this->acmHeader.pbDst       = (unsigned char *) this->out_buffer;
			this->acmHeader.cbDstLength = this->outputSize;	

			res = acmStreamPrepareHeader(this->hacm, &this->acmHeader, 0);	
	
			if(res > 0) {

				return done;
			}

			res = acmStreamConvert(this->hacm, &this->acmHeader, 0);
	
			if(res > 0) {
	
				acmStreamUnprepareHeader(this->hacm, &this->acmHeader, 0);
				return done;
			}

			while(!this->ring->IsFullFor(this->acmHeader.cbDstLengthUsed)) {
	


				this->ring->Write((char *) this->acmHeader.pbDst, this->acmHeader.cbDstLengthUsed);



				acmStreamUnprepareHeader(this->hacm, &this->acmHeader, 0);
						
				if(!this->acmInLeft) {

					if(this->decaps->ReadAudioData(0, this->in_buffer, this->inputSize) != this->inputSize) {
					
						return done;
					}
				}

				memset(&this->acmHeader, 0, sizeof(ACMSTREAMHEADER));

				this->acmHeader.cbStruct    = sizeof(ACMSTREAMHEADER);
				
				if(this->acmInLeft > 0) {
		
					memcpy(this->in_buffer, ((char *) this->in_buffer) + this->inputSize - this->acmInLeft, this->acmInLeft);

					if(this->decaps->ReadAudioData(0, ((char *) this->in_buffer) + this->acmInLeft, this->inputSize - this->acmInLeft) != (this->inputSize - this->acmInLeft) ) {

						return done;
					}

					this->acmHeader.pbSrc       = (unsigned char *) this->in_buffer;
					this->acmHeader.cbSrcLength = this->inputSize;
		
					this->acmInLeft = 0;
				}
				else {
					this->acmHeader.pbSrc       = (unsigned char *) this->in_buffer;
					this->acmHeader.cbSrcLength = this->inputSize;
				}

				this->acmHeader.pbDst       = (unsigned char *) this->out_buffer;
				this->acmHeader.cbDstLength = this->outputSize;
	
				res = acmStreamPrepareHeader(this->hacm, &this->acmHeader, 0);
	
				if(res > 0) {
						
					return done;
				}	

				res = acmStreamConvert(this->hacm, &this->acmHeader, 0);
	
				if(res > 0) {	
	
					acmStreamUnprepareHeader(this->hacm, &this->acmHeader, 0);
					return done;
				}
				
				this->acmInLeft = this->inputSize - this->acmHeader.cbSrcLengthUsed;
			}

			this->acmLeft = this->acmHeader.cbDstLengthUsed;
	
			acmStreamUnprepareHeader(this->hacm, &this->acmHeader, 0);
done:
				
			this->ring->Read((char *) buffer, size);
			done += size;

			return done;
		}
		else {
	
			unsigned int blocks = size / 16384;
	
			for(i = 0; i < blocks; i++) {

			if(this->acmLeft > 0 && !this->ring->IsFullFor(this->acmLeft)) {
			

		
				this->ring->Write((char *) this->out_buffer, this->acmLeft);
				this->acmLeft = 0;
			}

			if(this->acmLeft > 0)
				goto done2;
					
			if(!this->acmInLeft) {

				if(this->decaps->ReadAudioData(0, this->in_buffer, this->inputSize) != this->inputSize) {

					return done;
				}
			}

				memset(&this->acmHeader, 0, sizeof(ACMSTREAMHEADER));
		
				this->acmHeader.cbStruct    = sizeof(ACMSTREAMHEADER);
					
				if(this->acmInLeft > 0) {
				
					memcpy(this->in_buffer, ((char *) this->in_buffer) + this->inputSize - this->acmInLeft, this->acmInLeft);

					if(this->decaps->ReadAudioData(0, ((char *) this->in_buffer) + this->acmInLeft, this->inputSize - this->acmInLeft) != (this->inputSize - this->acmInLeft) ) {

						return done;
					}

					this->acmHeader.pbSrc       = (unsigned char *) this->in_buffer;
					this->acmHeader.cbSrcLength = this->inputSize;
		
					this->acmInLeft = 0;
				}
				else {
					this->acmHeader.pbSrc       = (unsigned char *) this->in_buffer;
					this->acmHeader.cbSrcLength = this->inputSize;
				}
			
				this->acmHeader.pbDst       = (unsigned char *) this->out_buffer;
				this->acmHeader.cbDstLength = this->outputSize;	

				res = acmStreamPrepareHeader(this->hacm, &this->acmHeader, 0);	
	
				if(res > 0) {
				
					return done;
				}
	
				res = acmStreamConvert(this->hacm, &this->acmHeader, 0);
	
				if(res > 0) {
	
					acmStreamUnprepareHeader(this->hacm, &this->acmHeader, 0);
					return done;
				}

				while(!this->ring->IsFullFor(this->acmHeader.cbDstLengthUsed)) {
	


					this->ring->Write((char *) this->acmHeader.pbDst, this->acmHeader.cbDstLengthUsed);


	
					acmStreamUnprepareHeader(this->hacm, &this->acmHeader, 0);
								
					if(!this->acmInLeft) {

						if(this->decaps->ReadAudioData(0, this->in_buffer, this->inputSize) != this->inputSize) {
					
							return done;
						}
					}

					memset(&this->acmHeader, 0, sizeof(ACMSTREAMHEADER));

					this->acmHeader.cbStruct    = sizeof(ACMSTREAMHEADER);
				
					if(this->acmInLeft > 0) {
					
						memcpy(this->in_buffer, ((char *) this->in_buffer) + this->inputSize - this->acmInLeft, this->acmInLeft);

						if(this->decaps->ReadAudioData(0, ((char *) this->in_buffer) + this->acmInLeft, this->inputSize - this->acmInLeft) != (this->inputSize - this->acmInLeft) ) {

							return done;
						}

						this->acmHeader.pbSrc       = (unsigned char *) this->in_buffer;
						this->acmHeader.cbSrcLength = this->inputSize;
		
						this->acmInLeft = 0;
					}
					else {
					
						this->acmHeader.pbSrc       = (unsigned char *) this->in_buffer;
						this->acmHeader.cbSrcLength = this->inputSize;
					}	

					this->acmHeader.pbDst       = (unsigned char *) this->out_buffer;
					this->acmHeader.cbDstLength = this->outputSize;
	
					res = acmStreamPrepareHeader(this->hacm, &this->acmHeader, 0);
	
					if(res > 0) {
					
						return done;
					}		

					res = acmStreamConvert(this->hacm, &this->acmHeader, 0);
		
					if(res > 0) {	
		
						acmStreamUnprepareHeader(this->hacm, &this->acmHeader, 0);
						return done;
					}
				
					this->acmInLeft = this->inputSize - this->acmHeader.cbSrcLengthUsed;
				}

				this->acmLeft = this->acmHeader.cbDstLengthUsed;
	
				acmStreamUnprepareHeader(this->hacm, &this->acmHeader, 0);
done2:
					
				this->ring->Read(((char *) buffer) + i*16384, 16384);
				done += 16384;
			}

	 			
			int left = size - (blocks * 16384);

			if(left > 0) {
				this->Decompress((void *) ((char *) buffer + size - left), left);
			
				done += left;
			}

			return done;
		}
	}

	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
奇米精品一区二区三区在线观看| 国产精品久久久久久久岛一牛影视| 亚洲一区二区三区三| 色综合久久66| 亚洲成人av资源| 欧美人伦禁忌dvd放荡欲情| 日韩国产欧美一区二区三区| 日韩欧美专区在线| 国产精品一区二区久久不卡| 日本一区二区不卡视频| 91美女精品福利| 香蕉久久夜色精品国产使用方法| 欧美一区二区三区在线观看 | 99久久精品国产麻豆演员表| 亚洲伦在线观看| 欧美精品久久久久久久多人混战| 久久精品99国产国产精| 国产欧美一区二区三区沐欲| 色爱区综合激月婷婷| 琪琪久久久久日韩精品| 日本一区二区三区四区| 欧美在线免费视屏| 精品一二线国产| 自拍偷拍欧美激情| 日韩欧美国产综合一区 | 色综合网站在线| 日韩午夜激情视频| 国产成人精品1024| 亚洲一区二区在线免费看| 日韩欧美一卡二卡| 91在线高清观看| 激情丁香综合五月| 亚洲高清久久久| 91福利精品视频| 99国内精品久久| 日韩精品91亚洲二区在线观看| 日韩免费高清视频| 99精品国产视频| 国产一区二区三区四区在线观看| 中文字幕中文在线不卡住| 51午夜精品国产| 99精品视频一区二区| 久久99精品视频| 一区二区三区四区国产精品| 久久日一线二线三线suv| 亚洲国产精品久久一线不卡| 久久久国产一区二区三区四区小说| 色网站国产精品| 国产精品亚洲а∨天堂免在线| 五月婷婷欧美视频| 中文字幕一区二区三区视频| 精品国产3级a| 91精品国产入口| 欧美综合天天夜夜久久| av在线综合网| 国产99精品视频| 欧美日韩国产免费一区二区 | 精品成人一区二区三区四区| 欧美视频中文一区二区三区在线观看| 久久国产人妖系列| 日本午夜精品视频在线观看| 亚洲影视在线观看| 最新国产の精品合集bt伙计| 久久视频一区二区| 久久综合狠狠综合久久综合88 | 成人妖精视频yjsp地址| 韩国一区二区三区| 精品一二三四在线| 九九在线精品视频| 极品少妇xxxx精品少妇偷拍| 激情偷乱视频一区二区三区| 久久国产福利国产秒拍| 日韩av电影免费观看高清完整版在线观看| 一区二区免费看| 亚洲精品ww久久久久久p站| 亚洲欧洲国产日韩| 亚洲精品自拍动漫在线| 亚洲精品写真福利| 亚洲影院在线观看| 亚洲18色成人| 秋霞电影一区二区| 精品一区二区三区久久久| 久久精品国产一区二区三| 国内精品视频666| 成人三级在线视频| 99riav久久精品riav| 欧美在线一区二区三区| 5858s免费视频成人| 欧美成人女星排名| 国产日产亚洲精品系列| 亚洲图片你懂的| 亚洲v日本v欧美v久久精品| 日韩va亚洲va欧美va久久| 老司机精品视频导航| 粉嫩高潮美女一区二区三区| caoporn国产精品| 欧美系列亚洲系列| 精品久久久久久久久久久久久久久久久| 久久一区二区三区四区| 国产精品不卡在线观看| 亚洲午夜成aⅴ人片| 精品中文av资源站在线观看| 国产精品资源在线| 欧美在线一区二区三区| 欧美videos中文字幕| 欧美激情一二三区| 一区二区在线看| 久久综合综合久久综合| 成人午夜短视频| 欧美日韩国产高清一区| 久久在线免费观看| 一区二区久久久久| 国产精品99精品久久免费| 91精品福利在线| 久久天天做天天爱综合色| 亚洲精选在线视频| 国产在线精品视频| 在线视频欧美精品| 国产午夜一区二区三区| 亚洲国产成人tv| 岛国av在线一区| 欧美不卡一区二区| 一区二区免费视频| 成人一区在线观看| 欧美一级久久久久久久大片| 久久精品日韩一区二区三区| 亚洲第一激情av| 色综合天天在线| 久久精品人人做人人爽人人| 日韩av在线播放中文字幕| 91在线精品一区二区| 精品国产伦一区二区三区观看方式| 亚洲伊人伊色伊影伊综合网| 国产精品白丝jk黑袜喷水| 欧美一级一级性生活免费录像| 亚洲人成网站色在线观看| 国产精品亚洲人在线观看| 欧美一区中文字幕| 亚洲综合在线免费观看| av男人天堂一区| 久久无码av三级| 久久精品国产99| 欧美一级二级三级乱码| 亚洲va欧美va天堂v国产综合| www.视频一区| 国产欧美综合在线| 国产精品一区二区三区四区 | 国产成人免费视频网站| 日韩午夜激情视频| 日本特黄久久久高潮| 欧美日韩国产影片| 一二三区精品福利视频| 一本久道中文字幕精品亚洲嫩| 国产嫩草影院久久久久| 国产一区二区在线观看免费 | 欧美日韩一区小说| 亚洲视频一区二区在线| av一二三不卡影片| 国产精品久久一卡二卡| 国产成人在线视频网站| 日本一区二区免费在线| 成人毛片在线观看| 国产精品久99| 99久久精品国产导航| 亚洲女与黑人做爰| 91视频91自| 一区二区三区视频在线看| 色综合久久综合网| 亚洲一区二区三区爽爽爽爽爽| 一本久久综合亚洲鲁鲁五月天| 亚洲男人的天堂av| 欧美日韩免费高清一区色橹橹| 亚洲一区二区不卡免费| 欧美日韩精品高清| 奇米一区二区三区av| 精品福利二区三区| 成人黄色av网站在线| 亚洲欧美影音先锋| 欧美在线免费播放| 日韩精品午夜视频| 久久久www成人免费毛片麻豆| 国产成人午夜精品影院观看视频| 国产精品视频一二| 欧美午夜宅男影院| 久久99最新地址| 国产精品嫩草99a| 欧洲亚洲精品在线| 免费观看日韩av| 中文字幕欧美国产| 欧美亚洲综合一区| 久久国产欧美日韩精品| 欧美激情一区二区三区| 欧美午夜一区二区| 麻豆精品久久久| 亚洲欧洲成人自拍| 这里只有精品电影| 成人免费视频播放| 亚洲国产成人高清精品| 国产欧美精品在线观看| 欧美日韩三级一区|