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

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

?? cpi_player_output_file.c

?? VC++視頻開發實例集錦(包括“遠程視頻監控”"語音識別系統"等13個經典例子)
?? C
字號:
/*
* CoolPlayer - Blazing fast audio player.
* Copyright (C) 2000-2001 Niek Albers
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
////////////////////////////////////////////////////////////////////////////////




#include "stdafx.h"
#include "globals.h"
#include "CPI_Player.h"
#include "CPI_Player_CoDec.h"
#include "CPI_Player_Output.h"
#include "CPI_Equaliser.h"
#include "CPI_Playlist.h"
#include "CPI_PlaylistItem.h"
////////////////////////////////////////////////////////////////////////////////
//
// This is an output stage that uses the File output. 
//
////////////////////////////////////////////////////////////////////////////////



// Total buffer size must quantise at 64Kb (because that what Windows gives us anyway!)
#define CPC_OUTPUTBLOCKSIZE			0x8000 // 32k blocks
////////////////////////////////////////////////////////////////////////////////
//
typedef struct __CPs_OutputContext_File
{
	FILE *m_hFile;
	CPs_EqualiserModule* m_pEqualiser;
	BOOL m_bPaused;

} CPs_OutputContext_File;
//
////////////////////////////////////////////////////////////////////////////////



void CPP_OMFL_Initialise(CPs_OutputModule* pModule, const CPs_FileInfo* pFileInfo, CP_HEQUALISER hEqualiser);
void CPP_OMFL_Uninitialise(CPs_OutputModule* pModule);
void CPP_OMFL_RefillBuffers(CPs_OutputModule* pModule);
void CPP_OMFL_SetPause(CPs_OutputModule* pModule, const BOOL bPause);
BOOL CPP_OMFL_IsOutputComplete(CPs_OutputModule* pModule);
void CPP_OMFL_Flush(CPs_OutputModule* pModule);
void CPP_OMFL_OnEQChanged(CPs_OutputModule* pModule);
void CPP_OMFL_SetInternalVolume(CPs_OutputModule* pModule, const int iNewVolume);
////////////////////////////////////////////////////////////////////////////////
//
//
//
void CPI_Player_Output_Initialise_File(CPs_OutputModule* pModule)
{
	// This is a one off call to set up the function pointers
	pModule->Initialise = CPP_OMFL_Initialise;
	pModule->Uninitialise = CPP_OMFL_Uninitialise;
	pModule->RefillBuffers = CPP_OMFL_RefillBuffers;
	pModule->SetPause = CPP_OMFL_SetPause;
	pModule->IsOutputComplete = CPP_OMFL_IsOutputComplete;
	pModule->Flush = CPP_OMFL_Flush;
	pModule->OnEQChanged = CPP_OMFL_OnEQChanged;
	pModule->SetInternalVolume = CPP_OMFL_SetInternalVolume;
	pModule->m_pModuleCookie = NULL;
	pModule->m_pcModuleName = "WAV File Writer";
	pModule->m_pCoDec = NULL;
	pModule->m_pEqualiser = NULL;
}
//
//
//
void CPP_OMFL_Initialise(CPs_OutputModule* pModule, const CPs_FileInfo* pFileInfo, CP_HEQUALISER hEqualiser)
{

	// This is called when some playing is required.
	// Do all allocation here so that we do not hold
	// resources while we are just sitting waiting for
	// something to happen.

	// Create a context
	CPs_OutputContext_File* pContext;
	CP_ASSERT(pModule->m_pModuleCookie == NULL);
	pContext = (CPs_OutputContext_File*)malloc(sizeof(CPs_OutputContext_File));
	pModule->m_pModuleCookie = pContext;
	CP_TRACE0("File out initialising");

	// Create sync object
	pModule->m_evtBlockFree = CreateEvent(NULL, FALSE, FALSE, NULL);

	// Setup thread prioity to lowest 
	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL  );
	pModule->m_pEqualiser = hEqualiser;
	pContext->m_bPaused=FALSE;
	pContext->m_hFile=NULL;
}
//
//
//
void CPP_OMFL_Uninitialise(CPs_OutputModule* pModule)
{
	CPs_OutputContext_File* pContext = (CPs_OutputContext_File*)pModule->m_pModuleCookie;
	CP_CHECKOBJECT(pContext);
	CP_TRACE0("Wave out shutting down");
	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);

	// If there is a File handle
	if(pContext->m_hFile)
	{
		// Stop any pending playing
		fclose(pContext->m_hFile);
		pContext->m_hFile=NULL;
		// Clean up
		DeleteObject(pModule->m_evtBlockFree);
	}
	free(pContext);
	pModule->m_pModuleCookie = NULL;
}
//
//
//
void CPP_OMFL_RefillBuffers(CPs_OutputModule* pModule)
{
	BOOL bMoreData;
	DWORD dwBufferLength = CPC_OUTPUTBLOCKSIZE;
	BYTE	lpData[CPC_OUTPUTBLOCKSIZE];

	CPs_OutputContext_File* pContext = (CPs_OutputContext_File*)pModule->m_pModuleCookie;
	CP_CHECKOBJECT(pContext);


	// Open a file out
	if(!pContext->m_hFile)
	{
		CPs_FileInfo pFileInfo;
		CP_HPLAYLISTITEM hCurrent = CPL_GetActiveItem(globals.m_hPlaylist);
		const char *pathname = CPLI_GetPath(hCurrent);
		char newpath[MAX_PATH];
		int rec_rate;
		int rec_bits;
		UINT temp;
		WAVEFORMATEX wfs;
		char *dot;

		pModule->m_pCoDec->GetFileInfo(pModule->m_pCoDec,&pFileInfo);
		rec_rate = pFileInfo.m_iFreq_Hz;
		rec_bits = pFileInfo.m_b16bit == TRUE ? 16 : 8;

		// saving internet stream
		if(strnicmp(pathname,CIC_HTTPHEADER,strlen(CIC_HTTPHEADER)) == 0)
		{
			strcpy(newpath,"Stream.wav");
			pFileInfo.m_iFileLength_Secs = 0xffffffff;
		}else
		{
			// replace the extension with .wav
			strcpy(newpath,pathname);
			dot = strrchr(newpath,'.');
			if(dot)*dot='\0';
			strcat(newpath,".wav");
		}
		// Trap error
		while(!pContext->m_hFile)
		{
			OPENFILENAME fn;
			char    filefilter[] =
				"WAV files (*.wav)\0*.wav\0"
				"All Files (*.*)\0*.*\0";
			BOOL    returnval;
			fn.lStructSize = sizeof(OPENFILENAME);
			fn.hwndOwner = (HWND) GetWindowLong(windows.wnd_main, DWL_USER);
			fn.hInstance = NULL;
			fn.lpstrFilter = filefilter;
			fn.lpstrCustomFilter = NULL;
			fn.nMaxCustFilter = 0;
			fn.nFilterIndex = 0;
			fn.lpstrFile = newpath;
			fn.nMaxFile = MAX_PATH * 200;
			fn.lpstrFileTitle = NULL;
			fn.nMaxFileTitle = 0;
			fn.lpstrInitialDir = options.last_used_directory;
			fn.lpstrTitle = NULL;
			fn.Flags = OFN_ENABLESIZING |
				OFN_HIDEREADONLY | OFN_EXPLORER;
			fn.nFileOffset = 0;
			fn.nFileExtension = 0;
			fn.lpstrDefExt = NULL;
			fn.lCustData = 0;
			fn.lpfnHook = NULL;
			fn.lpTemplateName = NULL;
			returnval = GetSaveFileName(&fn);
			if(!returnval) return;
			pContext->m_hFile = fopen(fn.lpstrFile,"wb");
			if(pContext->m_hFile)break;
		}
		// Wave header stuff

		// prep wave format header
		wfs.wFormatTag = WAVE_FORMAT_PCM;
		wfs.nChannels = pFileInfo.m_bStereo == TRUE ? 2 : 1;
		wfs.nSamplesPerSec = rec_rate;
		wfs.nBlockAlign = (short)(rec_bits/8 * wfs.nChannels);
		wfs.nAvgBytesPerSec = rec_rate * wfs.nBlockAlign;
		wfs.wBitsPerSample = rec_bits;
		wfs.cbSize = 0;

		// RIFF header block
		fwrite("RIFF",4,1,pContext->m_hFile);
		temp =  sizeof(wfs) + 20 + (pFileInfo.m_iFileLength_Secs*wfs.nAvgBytesPerSec);
		fwrite(&temp,4,1,pContext->m_hFile);
		fwrite("WAVE",4,1,pContext->m_hFile);
		// 'fmt ' block
		fwrite("fmt ",4,1,pContext->m_hFile);
		temp = sizeof(wfs);
		fwrite(&temp,4,1,pContext->m_hFile);
		fwrite(&wfs,sizeof(wfs),1,pContext->m_hFile);

		// 'data' block
		fwrite("data",4,1,pContext->m_hFile);
		temp = pFileInfo.m_iFileLength_Secs*wfs.nAvgBytesPerSec;
		fwrite(&temp,4,1,pContext->m_hFile);
	}



	// Scan ring buffer and fill any empty blocks - any blocks that become free
	// while this loop is running will retrigger the event - the worse that can
	// happen is that we enter this loop with no blocks free

	// Get block from CoDec and then just send it to the device (how easy is this!)
	bMoreData = pModule->m_pCoDec->GetPCMBlock(pModule->m_pCoDec, lpData, &dwBufferLength);


	// If there is EQ then apply it
	{
		// Note that the EQ module is initailised and uninitialsed by the engine
		CPs_EqualiserModule* pEQModule = (CPs_EqualiserModule*)pModule->m_pEqualiser;
		pEQModule->ApplyEQToBlock_Inplace(pEQModule, lpData, dwBufferLength);
	}

	if(dwBufferLength > 0)
		fwrite(lpData,dwBufferLength,1,pContext->m_hFile);

	// Nothing to send
	if(bMoreData == FALSE)
	{
		pModule->m_pCoDec->CloseFile(pModule->m_pCoDec);
		pModule->m_pCoDec = NULL;
		if(pContext->m_hFile) fclose(pContext->m_hFile);
		pContext->m_hFile=NULL;
	}

	if(!pContext->m_bPaused)
		SetEvent(pModule->m_evtBlockFree);
}
//
//
//
void CPP_OMFL_SetPause(CPs_OutputModule* pModule, const BOOL bPause)
{
	CPs_OutputContext_File* pContext = (CPs_OutputContext_File*)pModule->m_pModuleCookie;
	CP_CHECKOBJECT(pContext);
	if(!pContext->m_hFile)
		return;

	// Toggle pause state
	if(bPause == TRUE)
		pContext->m_bPaused=TRUE;
	else
	{
		pContext->m_bPaused=FALSE;   
		SetEvent(pModule->m_evtBlockFree);
	}
}
//
//
//
BOOL CPP_OMFL_IsOutputComplete(CPs_OutputModule* pModule)
{
	//    int iBlockIDX;
	CPs_OutputContext_File* pContext = (CPs_OutputContext_File*)pModule->m_pModuleCookie;
	CP_CHECKOBJECT(pContext);
	if(!pContext->m_hFile)
		return TRUE;

	return TRUE;
}
//
//
//
void CPP_OMFL_OnEQChanged(CPs_OutputModule* pModule)
{
	CPs_OutputContext_File* pContext = (CPs_OutputContext_File*)pModule->m_pModuleCookie;

	CP_CHECKOBJECT(pContext);

	return;
}
//
//
//
void CPP_OMFL_Flush(CPs_OutputModule* pModule)
{
	CPs_OutputContext_File* pContext = (CPs_OutputContext_File*)pModule->m_pModuleCookie;

	CP_CHECKOBJECT(pContext);

	// Stop any pending playing

	CP_ASSERT(CPP_OMFL_IsOutputComplete(pModule));
}
//
//
//
void CPP_OMFL_SetInternalVolume(CPs_OutputModule* pModule, const int iNewVolume)
{
	CPs_OutputContext_File* pContext = (CPs_OutputContext_File*)pModule->m_pModuleCookie;
	int iNewVolume_DWORD;
	CP_CHECKOBJECT(pContext);
	if(!pContext->m_hFile)
		return;

	// Clip volume to word
	iNewVolume_DWORD = iNewVolume * 656;
	if(iNewVolume_DWORD > 0xFFFF)
		iNewVolume_DWORD = 0xFFFF;
	iNewVolume_DWORD |= (iNewVolume_DWORD<<16);

}
//
//
//

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩精品久久久| 美女高潮久久久| 奇米影视在线99精品| 国产激情视频一区二区三区欧美| 91影院在线观看| 欧美一区三区二区| 亚洲啪啪综合av一区二区三区| 肉丝袜脚交视频一区二区| 成人h精品动漫一区二区三区| 欧美日韩精品一区二区天天拍小说 | 亚洲成av人**亚洲成av**| 国产成人免费在线观看| 在线观看91精品国产麻豆| 国产精品嫩草久久久久| 九九**精品视频免费播放| 欧美写真视频网站| 国产精品久久久久永久免费观看| 久久精品99国产精品日本| 欧美三级韩国三级日本一级| 国产精品久久久久久久久图文区 | 人妖欧美一区二区| 色婷婷精品久久二区二区蜜臂av | 91网站在线观看视频| 久久久久久久久久久电影| 蜜桃一区二区三区在线观看| 欧美日韩成人高清| 亚洲国产视频网站| 在线观看视频91| 日韩毛片高清在线播放| 不卡的电影网站| 国产精品免费视频一区| 国产69精品久久99不卡| 久久综合色天天久久综合图片| 天堂蜜桃91精品| 欧美老女人在线| 丝袜a∨在线一区二区三区不卡| 欧美系列一区二区| 日韩高清一级片| 在线不卡a资源高清| 日韩国产欧美在线视频| 欧美精品九九99久久| 亚洲成人av一区二区三区| 欧美日韩亚洲综合一区二区三区| 亚洲日本免费电影| 91亚洲国产成人精品一区二区三 | 国产在线精品免费| 国产亚洲精久久久久久| 国产成人午夜精品影院观看视频| 久久精品一区蜜桃臀影院| 成人不卡免费av| 一区二区三区在线影院| 欧美日韩一区二区在线观看| 亚洲1区2区3区4区| 日韩欧美一区二区不卡| 国产成人亚洲综合a∨婷婷图片| 国产精品色在线观看| 一本色道久久综合狠狠躁的推荐| 亚洲第一激情av| 精品少妇一区二区三区免费观看| 国产一区二区三区香蕉| 亚洲人吸女人奶水| 欧美一区二区黄| 国产大陆精品国产| 洋洋av久久久久久久一区| 7777精品伊人久久久大香线蕉经典版下载 | 欧美电影免费观看高清完整版在线观看| 蜜臀精品一区二区三区在线观看| 欧美一区二区三区四区在线观看| 国产一区二区三区久久久| 国产精品久久久久一区二区三区共| 97精品久久久久中文字幕| 亚洲成人精品一区二区| 久久综合九色综合欧美98| 91在线免费视频观看| 日韩国产精品91| 中文字幕中文字幕一区| 欧美日韩国产综合草草| 国产91精品一区二区麻豆网站| 亚洲自拍另类综合| 国产亚洲成年网址在线观看| 欧美在线免费播放| 成人一区二区三区视频在线观看 | 成人av免费在线| 日韩av一级电影| 国产精品电影一区二区| 5566中文字幕一区二区电影| 不卡一卡二卡三乱码免费网站| 午夜视频久久久久久| 欧美国产1区2区| 欧美一级艳片视频免费观看| 99精品视频在线播放观看| 九色综合狠狠综合久久| 亚洲成年人网站在线观看| 国产精品卡一卡二卡三| 精品日本一线二线三线不卡| 欧美色图天堂网| eeuss影院一区二区三区| 韩国三级中文字幕hd久久精品| 艳妇臀荡乳欲伦亚洲一区| 欧美精彩视频一区二区三区| 欧美一级日韩不卡播放免费| 91在线视频免费91| 成人免费视频网站在线观看| 麻豆久久久久久| 午夜精品免费在线观看| 一区二区三区在线免费视频| 国产精品久久久久久久午夜片| 亚洲精品一区二区三区香蕉| 欧美一区二区三区视频在线观看| 色综合久久99| 91丨国产丨九色丨pron| 成人激情综合网站| 岛国av在线一区| 成人午夜短视频| 国产成人免费视频网站 | 久久久www成人免费无遮挡大片 | av男人天堂一区| 国产.欧美.日韩| 国产大陆精品国产| 成人影视亚洲图片在线| 成人h动漫精品一区二区| youjizz久久| 99精品视频在线观看免费| 99精品国产91久久久久久| 成人高清免费观看| 99久久综合国产精品| jlzzjlzz国产精品久久| 91久久精品一区二区三区| 日本久久精品电影| 欧美日韩精品专区| 日韩免费性生活视频播放| 精品国产成人在线影院 | 日本不卡一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 美女网站色91| 国产精品资源网站| aaa欧美大片| 91福利在线看| 日韩一级片在线观看| 国产亚洲一区二区三区四区| 中文字幕精品一区二区三区精品| 18成人在线视频| 亚洲成人av一区二区三区| 久久精品国产**网站演员| 成人一区二区在线观看| 欧美三级日韩三级| 精品国产乱码久久| 亚洲女厕所小便bbb| 日韩va欧美va亚洲va久久| 国产精品1区二区.| 欧美丝袜自拍制服另类| 精品久久久网站| 成人免费在线视频| 日韩在线卡一卡二| 99在线精品一区二区三区| 欧美精品久久天天躁| 中文字幕第一区| 丝袜美腿亚洲综合| 成人免费看的视频| 3751色影院一区二区三区| 国产欧美久久久精品影院| 亚洲一区二区在线免费看| 国产乱码精品一区二区三区忘忧草| 91老师国产黑色丝袜在线| 欧美大尺度电影在线| 亚洲免费电影在线| 国产一二精品视频| 欧美色视频在线观看| 国产欧美一区二区精品秋霞影院| 亚洲一区二区三区小说| 国产成人在线色| 日韩欧美国产一二三区| 亚洲欧美视频在线观看| 韩国av一区二区三区四区| 欧美性感一区二区三区| 中文字幕日本乱码精品影院| 麻豆国产精品777777在线| 色先锋aa成人| 中文字幕一区二区三区在线播放 | 国产乱码精品一品二品| 欧美色窝79yyyycom| 亚洲欧洲精品一区二区三区| 狠狠色综合日日| 91精品欧美综合在线观看最新| 亚洲欧洲av在线| 成人午夜视频在线观看| 欧美精品一区二区三区蜜桃| 日韩av在线播放中文字幕| 欧美图区在线视频| 亚洲精品福利视频网站| kk眼镜猥琐国模调教系列一区二区| 26uuu色噜噜精品一区二区| 日韩国产欧美在线视频| 欧美日韩精品系列| 一区二区三区欧美亚洲| 91浏览器打开| 亚洲乱码国产乱码精品精可以看| 高清国产一区二区三区| 久久精品一区蜜桃臀影院| 国产精品自拍三区|