📄 sndctrl.c
字号:
////////////////////////////////////////////////////////
// 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 + -