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

📄 sndctrl.c

📁 超级解霸源代码。纯c语言写的。适合有一定编程基础的开发人员用来学习提高
💻 C
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////
//	Sound Control face handle include SndWndProc
//	Sound can mute and control volume,mono etc.
//		    Southern.Liang
//		       1996.5.25
////////////////////////////////////////////////////////
#pragma	option	-zCOTHER_TEXT
#include <windows.h>
#include <mmsystem.h>
#include "VCDAPI.H"

#define	BEAUDIOPOWER	1
#define	BELEFT		2
#define	BEDOWN		3
#define	BEUP		4
#define	BERIGHT		5
#define	BEMONO		6
#define	BEVOLUME	7
#define	BEMUTE		8
#define	BEAM		9
#define	BEFM		10
#define	BECD		11
#define	BEFLOAT		12
#define	BEINT		13
#define	BEQUICK		14
#define	ALLBUTTON	14
////////////////////////////////
extern	int	Playing;
extern	int 	videoID;
extern	int	StopFlags;
extern	int	StepFlags;
void	MemSet(LPSTR MemPtr,BYTE C,WORD Size);
HWND	AudioMainWindow;
//The Audio Decoder support 8 bits and 16 bits.
//And auto used them.
HINSTANCE	AudiohInst;
void  	FAR PASCAL	(*SetDecode)(int Channel,int Bits,int Rate);
DWORD	FAR PASCAL	(*GethWaveOuthDeviceID)(void);//[hWaveOut|DevID]
static	int	LoadAudioDecoder(void)
{
	AudiohInst=LoadLibrary("STHMPEG.ADO");
	return	(AudiohInst>HINSTANCE_ERROR);
}
static	void	GetAudioDecoderAddress(void)
{
	(FARPROC)SetDecode=GetProcAddress(AudiohInst,MAKELP(0,18));
	(FARPROC)GethWaveOuthDeviceID=GetProcAddress(AudiohInst,MAKELP(0,27));
	(WORD)GethWaveOuthDeviceID+=4;
}
HWAVEOUT PASCAL	GethWaveOut(void)
{
	DWORD	Val;
	if(GethWaveOuthDeviceID==NULL) return 0;
	Val=(*GethWaveOuthDeviceID)();
	return	HIWORD(Val);
}
UINT 	PASCAL	GetDeviceID(void)
{
	DWORD	Val;
	if(GethWaveOuthDeviceID==NULL) return 0;
	Val=(*GethWaveOuthDeviceID)();
	return	LOWORD(Val);
}
static	void	FreeAudioDecoder(void)
{
	if(AudiohInst>HINSTANCE_ERROR)
		{
		FreeLibrary(AudiohInst);
		AudiohInst=0;
		}
}
static	void	SetDecoder(int Rate,int Bits,int Channel)
{	//Rate 0=44.1K 1=22.05K 2=11.025K
	//Precision	0=Integer 1=Floating 2=Mixed 3=Quick
	//		when Rate=1 or 2 This=3 ,when Rate=0 This=1
	//Channel 	=0 Stereo with 2 speaker
	//		=1 Mixed Stereo to Mono with 2 speaker
	//		=2 Left  Channel Mono with 2 speaker
	//		=3 Right Channel Mono with 2 speaker
	if(SetDecode==NULL)	return;
	(*SetDecode)(Channel,Bits,Rate);
}
int	CurDevID=0;
UINT	Devs=0;
DWORD	DevVolume[10];
WAVEOUTCAPS	AudioCaps[10];
static	void	ReadVolume(void)
{	// return the Old Volume.
	unsigned long	Vol;
	int		i;

	Devs=waveOutGetNumDevs();
	if(Devs>10) Devs=10;
	for(i=0;i<Devs;i++)
		{
		waveOutGetDevCaps(i,&AudioCaps[i],sizeof(WAVEOUTCAPS));
		waveOutGetVolume(i,&DevVolume[i]);
		}
}
static	void	RestoreVolume(void)
{
	int	i;
	for(i=0;i<Devs;i++)
		{
		waveOutSetVolume(i,DevVolume[i]);
		}
}
static	unsigned long	SetAudioVolume(unsigned long Volume)
{
	DWORD	Vol;
	CurDevID=GetDeviceID();
	waveOutGetVolume(CurDevID,&Vol);
	waveOutSetVolume(CurDevID,Volume);
	return	Vol;
}
#define	VIDEONUMBER	30
char	AudioButtonState[ALLBUTTON]={0};
extern 	char	VideoName[VIDEONUMBER][80];	// Video File Name.
extern	int	CurFileNum;
static	void	BuildCommandStr(char *Com,char *Op)
{
	lstrcpy(Com,"setaudio ");
	lstrcat(Com,VideoName[CurFileNum]);
	lstrcat(Com," ");
	lstrcat(Com,Op);
}
static	void	SetAudioOff(void)
{
	char	Com[128];
	char	Str[10];
	BuildCommandStr(Com,"off");
	mciSendString(Com,Str,sizeof(Str),AudioMainWindow);
}
static	void	SetAudioOn(void)
{
	char	Com[128];
	char	Str[10];
	BuildCommandStr(Com,"on");
	mciSendString(Com,Str,sizeof(Str),AudioMainWindow);
}
int	MixSound=0;
int	SampleRate=2;	//Rate 0=44.1K 1=22.05K 2=11.025K
int	DecodeMode=1;	//above 486-66 all had FPU,So use Float
static	void	SetLeftRightSelect(int LeftRight)
{
	int	Mute;

	Mute=AudioButtonState[BEMUTE-1];
	// Set Mute off
	if(Mute==1 || AudioButtonState[BEAUDIOPOWER-1]==1)
		{
		SetAudioOff();
		return;
		}
	/////////////// Sound On /////////////
	SetAudioOn();
	//////////// Set Channel //////////
	if(LeftRight==0 && MixSound) LeftRight=3;
	switch(LeftRight)
		{
		case 0:	SetDecoder(SampleRate,DecodeMode,0); break;
		case 1:	SetDecoder(SampleRate,DecodeMode,2); break;
		case 2:	SetDecoder(SampleRate,DecodeMode,3); break;
		case 3:	SetDecoder(SampleRate,DecodeMode,1); break;
		}
}
//int	OldLR=0;
//int	OldMute=1;
static	void	SetChannelMute(int LeftRight)
{
	int	Mute;
	char	Com[128];
	char	Str[10];

	Mute=AudioButtonState[BEMUTE-1];
	// Set Mute off
	if(Mute==1 || AudioButtonState[BEAUDIOPOWER-1]==1)
		{
//		if(Mute==OldMute) return;
		BuildCommandStr(Com,"off");
		mciSendString(Com,Str,sizeof(Str),AudioMainWindow);
//		OldMute=0;
		return;
		}
//	if(OldLR==LeftRight && Mute==OldMute) return;
//	OldMute=1;
	//Set Audio On.
	BuildCommandStr(Com,"on");
	mciSendString(Com,Str,sizeof(Str),AudioMainWindow);
	//Set Audio Off.
	if(LeftRight!=0)
		{
		if(LeftRight==1)
			{
			BuildCommandStr(Com,"right off");
			mciSendString(Com,Str,sizeof(Str),AudioMainWindow);
			}
		if(LeftRight==2)
			{
			BuildCommandStr(Com,"left off");
			mciSendString(Com,Str,sizeof(Str),AudioMainWindow);
			}
		}
//	OldLR=LeftRight;
}
DWORD		SndPos=0;
MMTIME		MmTime;
HWAVEOUT	hWaveOut;
static	void	GethWaveOutAndID(void)	//when start play read these.
{
	CurDevID=GetDeviceID();
	hWaveOut=GethWaveOut();
}
static	DWORD	SetVideoAudeo(int LeftRight,LONG LVolume,LONG RVolume)
{
	if(videoID==-1) goto SetVolume;
	GethWaveOutAndID();	//Get hWaveOut & DeviceID when start play
	if(SetDecode==NULL)    	SetChannelMute(LeftRight);
	else	SetLeftRightSelect(LeftRight);
	//Set Volume ..
	SetVolume:
	if(LVolume>65535) LVolume=65535;
	if(RVolume>65535) RVolume=65535;
	if(LeftRight==1)  RVolume=LVolume;
	if(LeftRight==2)  LVolume=RVolume;
	return	SetAudioVolume(RVolume<<16|LVolume);
}
#pragma	warn -par
void _huge PASCAL SndTimerProc(HWND hwnd,UINT message,UINT idTimer,DWORD dwTime)
{
	DWORD	CurPos;
	if(!Playing) return;
	if(StopFlags) return;
	if(StepFlags) return;
	if(AudioButtonState[BEMUTE-1]==1) return; //Mute
	if(Devs==0) return;
	if(hWaveOut==0) hWaveOut=GethWaveOut();
	if(hWaveOut==0)	return;	//No Audio Device
	if(waveOutGetPosition(hWaveOut,&MmTime,sizeof(MMTIME))!=0)
		{//HWAVEOUT HANDLE ERROR
		GethWaveOutAndID();
		return;
		}
	CurPos=MmTime.u.ms;
	if(CurPos==SndPos)
		{//Audio Stop now.
		SetAudioOff();
		SetAudioOn();
		}
	SndPos=CurPos;
}
#pragma	warn .par
////////////////////////////////
HBITMAP	AUDIOFACE;
char	VolumeState=1;
char	MuteState=1;
char	MonoState=1;
DWORD	OldVolume;
LONG	LVolume=50411;
LONG	RVolume=50411;
int	CheckTime=1000;
void	PASCAL	FAR	BuildCheckTimer(void)
{
	if(CheckTime!=-1)
		{//If CheckTime =-1 mean not check Audio Time.
		if(CheckTime<300) CheckTime=300;
		if(CheckTime>8000) CheckTime=8000;
		SetTimer(AudioMainWindow,4545,CheckTime,(TIMERPROC)SndTimerProc);
		}
}
#pragma	warn -par
extern	HANDLE 	hInst;
long FAR PASCAL AudioWndProc(HWND hwnd,WORD message,WORD wParam,LONG lParam);
int PASCAL FAR CreateAudioWindow(HANDLE hInstance,HWND ParenthWnd)
{
	static char szAppName[]="Southern Soft VCD Player";
	HWND		hWnd;
	RECT		Rc;
	BITMAP		bm;

	AudioButtonState[BEMUTE-1]=0;
	AudioButtonState[BEVOLUME-1]=1;
	if(SampleRate==2)	AudioButtonState[BEAM-1]=1;
	if(SampleRate==1)	AudioButtonState[BEFM-1]=1;
	if(SampleRate==0)	AudioButtonState[BECD-1]=1;
	if(DecodeMode==0)	AudioButtonState[BEINT-1]=1;
	if(DecodeMode==1)	AudioButtonState[BEFLOAT-1]=1;
	if(DecodeMode==3)	AudioButtonState[BEQUICK-1]=1;
	//////////////////////////
	hInst=hInstance;
	//////////////////////////////////
	ReadVolume();
	OldVolume=DevVolume[CurDevID];
	RVolume=OldVolume>>16;
	LVolume=(LONG)(unsigned short)OldVolume;
	////////// Control Window ////////
	AUDIOFACE=LoadBitmap(hInstance,"AUDIOFACE");
	GetObject(AUDIOFACE,sizeof(BITMAP),&bm);
	DeleteObject(AUDIOFACE);
	GetWindowRect(GetDesktopWindow(),&Rc);	/* Get DeckTop size. */
	AudioMainWindow=hWnd=CreateWindow(szAppName,"STH Soft VCD Audio Control",
			WS_POPUP,
			(Rc.right-bm.bmWidth)/2,
			(Rc.bottom-Rc.top)/2-bm.bmHeight,
			bm.bmWidth,bm.bmHeight,
			ParenthWnd,NULL,hInstance,NULL);
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
	BuildCheckTimer();
	if(LoadAudioDecoder())
		GetAudioDecoderAddress();
	return	AudioMainWindow;
}
#pragma	warn .par
static	void	AudioDrawBitmap(HDC hdc,HBITMAP hBitmap,int x,int y)
{
	HDC	hdcMem;
	BITMAP	bm;

	hdcMem=CreateCompatibleDC(hdc);
	SelectObject(hdcMem,hBitmap);
	GetObject(hBitmap,sizeof(BITMAP),&bm);
	BitBlt(hdc,x,y,bm.bmWidth,bm.bmHeight,
		hdcMem,0,0,SRCCOPY);
	DeleteDC(hdcMem);
}
static	int	AudioInButton(HWND hwnd)
{
	RECT	Rc;
	POINT	Pos;
	int	X,Y;

	GetWindowRect(hwnd,&Rc);
	GetCursorPos(&Pos);
	X=Pos.x-Rc.left;
	Y=Pos.y-Rc.top;
	X+=2;
	if((X>=12 && X<=56) && (Y>=109 && Y<=138)) return BEAUDIOPOWER;
	if(X>=332 && X<=396)
		{
		if(Y>=41  && Y<61 ) return BEAM;
		if(Y>=61  && Y<81 ) return BEFM;
		if(Y>=81  && Y<101) return BECD;
		}
	if(X>=396 && X<=460)
		{
		if(Y>=41  && Y<61 ) return BEFLOAT;
		if(Y>=61  && Y<81 ) return BEINT;
		if(Y>=81  && Y<101) return BEQUICK;
		}
	if(Y>=114 && Y<=134)
		{
		if(X>=65  && X<96 ) return BELEFT;
		if(X>=96  && X<160) return BEDOWN;
		if(X>=160 && X<224) return BEUP;
		if(X>=224 && X<255) return BERIGHT;
		//////////////////////////
		if(X>=268 && X<332) return BEMONO;
		if(X>=332 && X<396) return BEVOLUME;
		if(X>=396 && X<460) return BEMUTE;
		}
	return 0;
}
static	void	AudioDrawPower(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1100+State));
	AudioDrawBitmap(hdc,hBmp,12,109);
	DeleteObject(hBmp);
}
static	void	DrawLeft(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1110+State));
	AudioDrawBitmap(hdc,hBmp,65,114);
	DeleteObject(hBmp);
}
static	void	DrawDown(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1120+State));
	AudioDrawBitmap(hdc,hBmp,96,114);
	DeleteObject(hBmp);
}
static	void	DrawUp(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1130+State));
	AudioDrawBitmap(hdc,hBmp,160,114);
	DeleteObject(hBmp);
}
static	void	DrawRight(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1140+State));
	AudioDrawBitmap(hdc,hBmp,224,114);
	DeleteObject(hBmp);
}
static	void	DrawMono(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1150+State));
	AudioDrawBitmap(hdc,hBmp,268,114);
	DeleteObject(hBmp);
}
static	void	DrawVolume(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1160+State));
	AudioDrawBitmap(hdc,hBmp,332,114);
	DeleteObject(hBmp);
}
static	void	DrawMute(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1170+State));
	AudioDrawBitmap(hdc,hBmp,396,114);
	DeleteObject(hBmp);
}
static	void	DrawAM(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1180+State));
	AudioDrawBitmap(hdc,hBmp,332,41);
	DeleteObject(hBmp);
}
static	void	DrawFM(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1190+State));
	AudioDrawBitmap(hdc,hBmp,332,61);
	DeleteObject(hBmp);
}
static	void	DrawCD(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1200+State));
	AudioDrawBitmap(hdc,hBmp,332,81);
	DeleteObject(hBmp);
}
static	void	DrawFloat(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1210+State));
	AudioDrawBitmap(hdc,hBmp,396,41);
	DeleteObject(hBmp);
}
static	void	DrawInt(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1220+State));
	AudioDrawBitmap(hdc,hBmp,396,61);
	DeleteObject(hBmp);
}
static	void	DrawQuick(HDC hdc,int State)
{
	HBITMAP	hBmp;
	if(Playing) return;
	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(1230+State));
	AudioDrawBitmap(hdc,hBmp,396,81);
	DeleteObject(hBmp);
}

static	void	AudioDrawAllStatus(HDC hdc)
{
	AudioDrawPower(hdc,AudioButtonState[BEAUDIOPOWER-1]);
	DrawLeft(hdc,AudioButtonState[BELEFT-1]);
	DrawDown(hdc,AudioButtonState[BEDOWN-1]);
	DrawUp(hdc,AudioButtonState[BEUP-1]);
	DrawRight(hdc,AudioButtonState[BERIGHT-1]);
	DrawMono(hdc,AudioButtonState[BEMONO-1]);
	DrawVolume(hdc,AudioButtonState[BEVOLUME-1]);
	DrawMute(hdc,AudioButtonState[BEMUTE-1]);
	DrawAM(hdc,AudioButtonState[BEAM-1]);
	DrawFM(hdc,AudioButtonState[BEFM-1]);
	DrawCD(hdc,AudioButtonState[BECD-1]);
	DrawFloat(hdc,AudioButtonState[BEFLOAT-1]);
	DrawInt(hdc,AudioButtonState[BEINT-1]);
	DrawQuick(hdc,AudioButtonState[BEQUICK-1]);
}
static	void	AudioDrawButtonState(HWND hwnd,int Button,int Status)
{
	HDC	hdc;

	if(Playing) return;
	hdc=GetDC(hwnd);
	switch(Button)
		{
		case	BEAUDIOPOWER: 	AudioDrawPower(hdc,Status);break;
		case	BELEFT:		DrawLeft(hdc,Status);break;
		case	BEDOWN:		DrawDown(hdc,Status);break;
		case	BEUP:		DrawUp(hdc,Status);break;
		case	BERIGHT:    	DrawRight(hdc,Status);break;
		case	BEMONO:   	DrawMono(hdc,Status);break;
		case	BEVOLUME:   	DrawVolume(hdc,Status);break;
		case	BEMUTE:   	DrawMute(hdc,Status);break;
		case	BEAM:   	DrawAM(hdc,Status);break;
		case	BEFM:   	DrawFM(hdc,Status);break;
		case	BECD:   	DrawCD(hdc,Status);break;
		case	BEFLOAT:  	DrawFloat(hdc,Status);break;
		case	BEINT:   	DrawInt(hdc,Status);break;
		case	BEQUICK:  	DrawQuick(hdc,Status);break;
		}
	ReleaseDC(hwnd,hdc);
}
static	void	DisplayVolume(LONG LVolume,LONG RVolume)
{
	HDC	hdc;
	HBITMAP	hBmp1,hBmp2;
	int	i;
	long	V;

	if(Playing) return;
	hdc=GetDC(AudioMainWindow);
	hBmp1=LoadBitmap(hInst,"LED1");
	hBmp2=LoadBitmap(hInst,"LED2");
	for(i=0;i<13;i++)
		{
		V=LVolume-(i*5041L);
		AudioDrawBitmap(hdc,V>0?hBmp1:hBmp2,65,87-i*4);
		}
	for(i=0;i<13;i++)
		{
		V=RVolume-(i*5041L);
		AudioDrawBitmap(hdc,V>0?hBmp1:hBmp2,199,87-i*4);
		}
	DeleteObject(hBmp1);
	DeleteObject(hBmp2);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -