📄 mixer.c
字号:
0,
Line);
Ret = FALSE;
break;
}
}
else
{
DPRINT("Allocation of SND_MIXER_DEST structure for id %d failed!\n", i);
Ret = FALSE;
break;
}
}
return Ret;
}
BOOL
SndMixerSelect(PSND_MIXER Mixer,
UINT MixerId)
{
if (MixerId >= Mixer->MixersCount)
{
return FALSE;
}
SndMixerClose(Mixer);
if (mixerOpen(&Mixer->hmx,
MixerId,
(DWORD_PTR)Mixer->hWndNotification,
0,
CALLBACK_WINDOW | MIXER_OBJECTF_MIXER) == MMSYSERR_NOERROR ||
mixerOpen(&Mixer->hmx,
MixerId,
(DWORD_PTR)Mixer->hWndNotification,
0,
CALLBACK_WINDOW) == MMSYSERR_NOERROR ||
mixerOpen(&Mixer->hmx,
MixerId,
0,
0,
0) == MMSYSERR_NOERROR)
{
if (mixerGetDevCaps(MixerId,
&Mixer->Caps,
sizeof(Mixer->Caps)) == MMSYSERR_NOERROR)
{
BOOL Ret = FALSE;
Mixer->MixerId = MixerId;
ClearMixerCache(Mixer);
Ret = SndMixerQueryDestinations(Mixer);
if (!Ret)
{
ClearMixerCache(Mixer);
}
return Ret;
}
else
{
mixerClose(Mixer->hmx);
}
}
Mixer->hmx = NULL;
Mixer->MixerId = NO_MIXER_SELECTED;
return FALSE;
}
UINT
SndMixerGetSelection(PSND_MIXER Mixer)
{
return Mixer->MixerId;
}
INT
SndMixerGetProductName(PSND_MIXER Mixer,
LPTSTR lpBuffer,
UINT uSize)
{
if (Mixer->hmx)
{
UINT lnsz = (UINT) lstrlen(Mixer->Caps.szPname);
if(lnsz + 1 > uSize)
{
return lnsz + 1;
}
else
{
memcpy(lpBuffer, Mixer->Caps.szPname, lnsz * sizeof(TCHAR));
lpBuffer[lnsz] = _T('\0');
return lnsz;
}
}
return -1;
}
INT
SndMixerGetLineName(PSND_MIXER Mixer,
DWORD LineID,
LPTSTR lpBuffer,
UINT uSize,
BOOL LongName)
{
if (Mixer->hmx)
{
UINT lnsz;
PSND_MIXER_DESTINATION Line;
LPMIXERLINE lpl = NULL;
for (Line = Mixer->Lines; Line != NULL; Line = Line->Next)
{
if (Line->Info.dwLineID == LineID)
{
lpl = &Line->Info;
break;
}
}
if (lpl != NULL)
{
lnsz = (UINT) lstrlen(LongName ? lpl->szName : lpl->szShortName);
if(lnsz + 1 > uSize)
{
return lnsz + 1;
}
else
{
memcpy(lpBuffer, LongName ? lpl->szName : lpl->szShortName, lnsz * sizeof(TCHAR));
lpBuffer[lnsz] = _T('\0');
return lnsz;
}
}
}
return -1;
}
BOOL
SndMixerEnumProducts(PSND_MIXER Mixer,
PFNSNDMIXENUMPRODUCTS EnumProc,
PVOID Context)
{
MIXERCAPS Caps;
HMIXER hMixer;
UINT i;
BOOL Ret = TRUE;
for (i = 0; i < Mixer->MixersCount; i++)
{
if (mixerOpen(&hMixer,
i,
0,
0,
0) == MMSYSERR_NOERROR)
{
if (mixerGetDevCaps(i,
&Caps,
sizeof(Caps)) == MMSYSERR_NOERROR)
{
if (!EnumProc(Mixer,
i,
Caps.szPname,
Context))
{
mixerClose(hMixer);
Ret = FALSE;
break;
}
}
else
{
DPRINT("Failed to get device capabilities for mixer id %d!\n", i);
}
mixerClose(hMixer);
}
}
return Ret;
}
INT
SndMixerGetDestinationCount(PSND_MIXER Mixer)
{
return (Mixer->hmx ? Mixer->Caps.cDestinations : -1);
}
BOOL
SndMixerEnumLines(PSND_MIXER Mixer,
PFNSNDMIXENUMLINES EnumProc,
PVOID Context)
{
if (Mixer->hmx)
{
PSND_MIXER_DESTINATION Line;
for (Line = Mixer->Lines; Line != NULL; Line = Line->Next)
{
if (!EnumProc(Mixer,
&Line->Info,
Line->DisplayControls,
Context))
{
return FALSE;
}
}
return TRUE;
}
return FALSE;
}
BOOL
SndMixerEnumConnections(PSND_MIXER Mixer,
DWORD LineID,
PFNSNDMIXENUMCONNECTIONS EnumProc,
PVOID Context)
{
if (Mixer->hmx)
{
PSND_MIXER_DESTINATION Line;
for (Line = Mixer->Lines; Line != NULL; Line = Line->Next)
{
if (Line->Info.dwLineID == LineID)
{
PSND_MIXER_CONNECTION Connection;
if (Line->DisplayControls != 0)
{
if (!EnumProc(Mixer,
LineID,
&Line->Info,
Context))
{
return FALSE;
}
}
for (Connection = Line->Connections; Connection != NULL; Connection = Connection->Next)
{
if (!EnumProc(Mixer,
LineID,
&Connection->Info,
Context))
{
return FALSE;
}
}
return TRUE;
}
}
}
return FALSE;
}
BOOL
SndMixerIsDisplayControl(PSND_MIXER Mixer,
LPMIXERCONTROL Control)
{
if (Mixer->hmx && !(Control->fdwControl & MIXERCONTROL_CONTROLF_DISABLED))
{
switch (Control->dwControlType & MIXERCONTROL_CT_CLASS_MASK)
{
case MIXERCONTROL_CT_CLASS_FADER:
case MIXERCONTROL_CT_CLASS_SWITCH:
return TRUE;
}
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -