mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 07:36:21 +00:00
[CMAKE]
Sync trunk (rr49606) svn path=/branches/cmake-bringup/; revision=49607
This commit is contained in:
commit
406dfdbc87
324 changed files with 15065 additions and 2892 deletions
|
@ -62,32 +62,32 @@ GetSoundDeviceCapabilities(
|
|||
{
|
||||
case WAVE_OUT_DEVICE_TYPE :
|
||||
{
|
||||
GoodSize = CapabilitiesSize >= sizeof(WAVEOUTCAPS);
|
||||
GoodSize = CapabilitiesSize >= sizeof(WAVEOUTCAPSW);
|
||||
break;
|
||||
}
|
||||
case WAVE_IN_DEVICE_TYPE :
|
||||
{
|
||||
GoodSize = CapabilitiesSize >= sizeof(WAVEINCAPS);
|
||||
GoodSize = CapabilitiesSize >= sizeof(WAVEINCAPSW);
|
||||
break;
|
||||
}
|
||||
case MIDI_OUT_DEVICE_TYPE :
|
||||
{
|
||||
GoodSize = CapabilitiesSize >= sizeof(MIDIOUTCAPS);
|
||||
GoodSize = CapabilitiesSize >= sizeof(MIDIOUTCAPSW);
|
||||
break;
|
||||
}
|
||||
case MIDI_IN_DEVICE_TYPE :
|
||||
{
|
||||
GoodSize = CapabilitiesSize >= sizeof(MIDIINCAPS);
|
||||
GoodSize = CapabilitiesSize >= sizeof(MIDIINCAPSW);
|
||||
break;
|
||||
}
|
||||
case AUX_DEVICE_TYPE :
|
||||
{
|
||||
GoodSize = CapabilitiesSize >= sizeof(AUXCAPS);
|
||||
GoodSize = CapabilitiesSize >= sizeof(AUXCAPSW);
|
||||
break;
|
||||
}
|
||||
case MIXER_DEVICE_TYPE :
|
||||
{
|
||||
GoodSize = CapabilitiesSize >= sizeof(MIXERCAPS);
|
||||
GoodSize = CapabilitiesSize >= sizeof(MIXERCAPSW);
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -65,6 +65,33 @@ midMessage(
|
|||
break;
|
||||
}
|
||||
|
||||
case MIDM_OPEN :
|
||||
{
|
||||
Result = MmeOpenDevice(MIDI_IN_DEVICE_TYPE,
|
||||
DeviceId,
|
||||
(LPWAVEOPENDESC) Parameter1,
|
||||
Parameter2,
|
||||
(DWORD_PTR*) PrivateHandle);
|
||||
break;
|
||||
}
|
||||
|
||||
case MIDM_CLOSE :
|
||||
{
|
||||
Result = MmeCloseDevice(PrivateHandle);
|
||||
break;
|
||||
}
|
||||
|
||||
case MIDM_START :
|
||||
{
|
||||
Result = MmeSetState(PrivateHandle, TRUE);
|
||||
break;
|
||||
}
|
||||
|
||||
case MIDM_STOP :
|
||||
{
|
||||
Result = MmeSetState(PrivateHandle, FALSE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
SND_TRACE(L"midMessage returning MMRESULT %d\n", Result);
|
||||
|
|
|
@ -64,6 +64,24 @@ modMessage(
|
|||
Result = MmeGetDeviceInterfaceString(MIDI_OUT_DEVICE_TYPE, DeviceId, (LPWSTR)Parameter1, Parameter2, NULL); //FIXME DWORD_PTR
|
||||
break;
|
||||
}
|
||||
|
||||
case MODM_OPEN :
|
||||
{
|
||||
Result = MmeOpenDevice(MIDI_OUT_DEVICE_TYPE,
|
||||
DeviceId,
|
||||
(LPWAVEOPENDESC) Parameter1, /* unused */
|
||||
Parameter2,
|
||||
(DWORD_PTR*)PrivateHandle);
|
||||
break;
|
||||
}
|
||||
|
||||
case MODM_CLOSE :
|
||||
{
|
||||
Result = MmeCloseDevice(PrivateHandle);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
SND_TRACE(L"modMessage returning MMRESULT %d\n", Result);
|
||||
|
|
|
@ -52,99 +52,6 @@ MmeGetLineInfo(
|
|||
}
|
||||
|
||||
|
||||
MMRESULT
|
||||
MmeCloseMixerDevice(
|
||||
IN DWORD_PTR PrivateHandle)
|
||||
{
|
||||
MMRESULT Result;
|
||||
PSOUND_DEVICE_INSTANCE SoundDeviceInstance;
|
||||
PSOUND_DEVICE SoundDevice;
|
||||
|
||||
SND_TRACE(L"Closing mixer device \n");
|
||||
|
||||
VALIDATE_MMSYS_PARAMETER( PrivateHandle );
|
||||
SoundDeviceInstance = (PSOUND_DEVICE_INSTANCE) PrivateHandle;
|
||||
|
||||
if ( ! IsValidSoundDeviceInstance(SoundDeviceInstance) )
|
||||
return MMSYSERR_INVALHANDLE;
|
||||
|
||||
Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
return TranslateInternalMmResult(Result);
|
||||
|
||||
|
||||
Result = DestroySoundDeviceInstance(SoundDeviceInstance);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
MMRESULT
|
||||
MmeOpenMixerDevice(
|
||||
IN MMDEVICE_TYPE DeviceType,
|
||||
IN DWORD DeviceId,
|
||||
IN LPMIXEROPENDESC OpenParameters,
|
||||
IN DWORD Flags,
|
||||
OUT DWORD* PrivateHandle)
|
||||
{
|
||||
MMRESULT Result;
|
||||
PMMFUNCTION_TABLE FunctionTable;
|
||||
PSOUND_DEVICE SoundDevice;
|
||||
PSOUND_DEVICE_INSTANCE SoundDeviceInstance;
|
||||
|
||||
SND_TRACE(L"Opening mixer device");
|
||||
|
||||
VALIDATE_MMSYS_PARAMETER( OpenParameters );
|
||||
|
||||
Result = GetSoundDevice(DeviceType, DeviceId, &SoundDevice);
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
return TranslateInternalMmResult(Result);
|
||||
|
||||
/* Check that winmm gave us a private handle to fill */
|
||||
VALIDATE_MMSYS_PARAMETER( PrivateHandle );
|
||||
|
||||
/* Create a sound device instance and open the sound device */
|
||||
Result = CreateSoundDeviceInstance(SoundDevice, &SoundDeviceInstance);
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
return TranslateInternalMmResult(Result);
|
||||
|
||||
Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable);
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
return TranslateInternalMmResult(Result);
|
||||
|
||||
if ( ! FunctionTable->SetWaveFormat )
|
||||
return MMSYSERR_NOTSUPPORTED;
|
||||
|
||||
Result = FunctionTable->SetWaveFormat(SoundDeviceInstance, DeviceId, NULL, 0);
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
{
|
||||
/* TODO: Destroy sound instance */
|
||||
return TranslateInternalMmResult(Result);
|
||||
}
|
||||
|
||||
/* Store the device instance pointer in the private handle - is DWORD safe here? */
|
||||
*PrivateHandle = (DWORD_PTR) SoundDeviceInstance;
|
||||
|
||||
/* Store the additional information we were given - FIXME: Need flags! */
|
||||
SetSoundDeviceInstanceMmeData(SoundDeviceInstance,
|
||||
(HDRVR)OpenParameters->hmx,
|
||||
OpenParameters->dwCallback,
|
||||
OpenParameters->dwInstance,
|
||||
Flags);
|
||||
|
||||
/* Let the application know the device is open */
|
||||
ReleaseEntrypointMutex(DeviceType);
|
||||
#if 0
|
||||
NotifyMmeClient(SoundDeviceInstance,
|
||||
DeviceType == WAVE_OUT_DEVICE_TYPE ? WOM_OPEN : WIM_OPEN,
|
||||
0);
|
||||
#endif
|
||||
AcquireEntrypointMutex(DeviceType);
|
||||
|
||||
SND_TRACE(L"Mixer device now open\n");
|
||||
|
||||
return MMSYSERR_NOERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
Standard MME driver entry-point for messages relating to mixers.
|
||||
*/
|
||||
|
@ -188,18 +95,18 @@ mxdMessage(
|
|||
|
||||
case MXDM_OPEN :
|
||||
{
|
||||
Result = MmeOpenMixerDevice(MIXER_DEVICE_TYPE,
|
||||
DeviceId,
|
||||
(LPMIXEROPENDESC) Parameter1,
|
||||
Parameter2,
|
||||
(DWORD*) PrivateHandle);
|
||||
Result = MmeOpenDevice(MIXER_DEVICE_TYPE,
|
||||
DeviceId,
|
||||
(LPWAVEOPENDESC) Parameter1, /* unused */
|
||||
Parameter2,
|
||||
(DWORD*) PrivateHandle);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case MXDM_CLOSE :
|
||||
{
|
||||
Result = MmeCloseMixerDevice(PrivateHandle);
|
||||
Result = MmeCloseDevice(PrivateHandle);
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -119,7 +119,7 @@ MmeGetSoundDeviceCapabilities(
|
|||
}
|
||||
|
||||
MMRESULT
|
||||
MmeOpenWaveDevice(
|
||||
MmeOpenDevice(
|
||||
IN MMDEVICE_TYPE DeviceType,
|
||||
IN UINT DeviceId,
|
||||
IN LPWAVEOPENDESC OpenParameters,
|
||||
|
@ -127,33 +127,36 @@ MmeOpenWaveDevice(
|
|||
OUT DWORD_PTR* PrivateHandle)
|
||||
{
|
||||
MMRESULT Result;
|
||||
|
||||
UINT Message;
|
||||
PSOUND_DEVICE SoundDevice;
|
||||
PSOUND_DEVICE_INSTANCE SoundDeviceInstance;
|
||||
LPWAVEFORMATEX Format;
|
||||
|
||||
SND_TRACE(L"Opening wave device (WIDM_OPEN / WODM_OPEN)");
|
||||
SND_TRACE(L"Opening device");
|
||||
|
||||
VALIDATE_MMSYS_PARAMETER( IS_WAVE_DEVICE_TYPE(DeviceType) ); /* FIXME? wave in too? */
|
||||
VALIDATE_MMSYS_PARAMETER( OpenParameters );
|
||||
|
||||
Format = OpenParameters->lpFormat;
|
||||
|
||||
Result = GetSoundDevice(DeviceType, DeviceId, &SoundDevice);
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
return TranslateInternalMmResult(Result);
|
||||
|
||||
/* Does this device support the format? */
|
||||
Result = QueryWaveDeviceFormatSupport(SoundDevice, Format, sizeof(WAVEFORMATEX));
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE)
|
||||
{
|
||||
SND_ERR(L"Format not supported\n");
|
||||
return TranslateInternalMmResult(Result);
|
||||
}
|
||||
Format = OpenParameters->lpFormat;
|
||||
|
||||
/* If the caller just wanted to know if a format is supported, end here */
|
||||
if ( Flags & WAVE_FORMAT_QUERY )
|
||||
return MMSYSERR_NOERROR;
|
||||
/* Does this device support the format? */
|
||||
Result = QueryWaveDeviceFormatSupport(SoundDevice, Format, sizeof(WAVEFORMATEX));
|
||||
if ( ! MMSUCCESS(Result) )
|
||||
{
|
||||
SND_ERR(L"Format not supported\n");
|
||||
return TranslateInternalMmResult(Result);
|
||||
}
|
||||
|
||||
/* If the caller just wanted to know if a format is supported, end here */
|
||||
if ( Flags & WAVE_FORMAT_QUERY )
|
||||
return MMSYSERR_NOERROR;
|
||||
}
|
||||
|
||||
/* Check that winmm gave us a private handle to fill */
|
||||
VALIDATE_MMSYS_PARAMETER( PrivateHandle );
|
||||
|
@ -175,20 +178,35 @@ MmeOpenWaveDevice(
|
|||
|
||||
/* Store the additional information we were given - FIXME: Need flags! */
|
||||
SetSoundDeviceInstanceMmeData(SoundDeviceInstance,
|
||||
(HDRVR)OpenParameters->hWave,
|
||||
(HDRVR)OpenParameters->hWave, /* works because LPMIXEROPENDESC/etc has also the handle as first member */
|
||||
OpenParameters->dwCallback,
|
||||
OpenParameters->dwInstance,
|
||||
Flags);
|
||||
|
||||
/* Let the application know the device is open */
|
||||
ReleaseEntrypointMutex(DeviceType);
|
||||
NotifyMmeClient(SoundDeviceInstance,
|
||||
DeviceType == WAVE_OUT_DEVICE_TYPE ? WOM_OPEN : WIM_OPEN,
|
||||
0);
|
||||
if (DeviceType == WAVE_OUT_DEVICE_TYPE || DeviceType == WAVE_IN_DEVICE_TYPE ||
|
||||
DeviceType == MIDI_OUT_DEVICE_TYPE || DeviceType == MIDI_IN_DEVICE_TYPE)
|
||||
{
|
||||
/* Let the application know the device is open */
|
||||
|
||||
AcquireEntrypointMutex(DeviceType);
|
||||
if (DeviceType == WAVE_OUT_DEVICE_TYPE)
|
||||
Message = WOM_OPEN;
|
||||
else if (DeviceType == WAVE_IN_DEVICE_TYPE)
|
||||
Message = WIM_OPEN;
|
||||
else if (DeviceType == MIDI_IN_DEVICE_TYPE)
|
||||
Message = MIM_OPEN;
|
||||
else
|
||||
Message = MOM_OPEN;
|
||||
|
||||
SND_TRACE(L"Wave device now open\n");
|
||||
ReleaseEntrypointMutex(DeviceType);
|
||||
|
||||
NotifyMmeClient(SoundDeviceInstance,
|
||||
Message,
|
||||
0);
|
||||
|
||||
AcquireEntrypointMutex(DeviceType);
|
||||
}
|
||||
|
||||
SND_TRACE(L"device now open\n");
|
||||
|
||||
return MMSYSERR_NOERROR;
|
||||
}
|
||||
|
@ -201,6 +219,7 @@ MmeCloseDevice(
|
|||
PSOUND_DEVICE_INSTANCE SoundDeviceInstance;
|
||||
PSOUND_DEVICE SoundDevice;
|
||||
MMDEVICE_TYPE DeviceType;
|
||||
UINT Message = 0;
|
||||
|
||||
SND_TRACE(L"Closing wave device (WIDM_CLOSE / WODM_CLOSE)\n");
|
||||
|
||||
|
@ -221,12 +240,26 @@ MmeCloseDevice(
|
|||
|
||||
/* TODO: Check device is stopped! */
|
||||
|
||||
ReleaseEntrypointMutex(DeviceType);
|
||||
/* TODO: Work with MIDI devices too */
|
||||
NotifyMmeClient(SoundDeviceInstance,
|
||||
DeviceType == WAVE_OUT_DEVICE_TYPE ? WOM_CLOSE : WIM_CLOSE,
|
||||
0);
|
||||
AcquireEntrypointMutex(DeviceType);
|
||||
|
||||
if (DeviceType != MIXER_DEVICE_TYPE)
|
||||
{
|
||||
ReleaseEntrypointMutex(DeviceType);
|
||||
|
||||
if (DeviceType == WAVE_OUT_DEVICE_TYPE)
|
||||
Message = WOM_CLOSE;
|
||||
else if (DeviceType == WAVE_IN_DEVICE_TYPE)
|
||||
Message = WIM_CLOSE;
|
||||
else if (DeviceType == MIDI_IN_DEVICE_TYPE)
|
||||
Message = MIM_CLOSE;
|
||||
else if (DeviceType == MIDI_OUT_DEVICE_TYPE)
|
||||
Message = MOM_CLOSE;
|
||||
|
||||
/* TODO: Work with MIDI devices too */
|
||||
NotifyMmeClient(SoundDeviceInstance,
|
||||
Message,
|
||||
0);
|
||||
AcquireEntrypointMutex(DeviceType);
|
||||
}
|
||||
|
||||
Result = DestroySoundDeviceInstance(SoundDeviceInstance);
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ widMessage(
|
|||
}
|
||||
case WIDM_OPEN :
|
||||
{
|
||||
Result = MmeOpenWaveDevice(WAVE_IN_DEVICE_TYPE,
|
||||
Result = MmeOpenDevice(WAVE_IN_DEVICE_TYPE,
|
||||
DeviceId,
|
||||
(LPWAVEOPENDESC) Parameter1,
|
||||
Parameter2,
|
||||
|
|
|
@ -65,11 +65,11 @@ wodMessage(
|
|||
|
||||
case WODM_OPEN :
|
||||
{
|
||||
Result = MmeOpenWaveDevice(WAVE_OUT_DEVICE_TYPE,
|
||||
DeviceId,
|
||||
(LPWAVEOPENDESC) Parameter1,
|
||||
Parameter2,
|
||||
(DWORD_PTR*)PrivateHandle);
|
||||
Result = MmeOpenDevice(WAVE_OUT_DEVICE_TYPE,
|
||||
DeviceId,
|
||||
(LPWAVEOPENDESC) Parameter1,
|
||||
Parameter2,
|
||||
(DWORD_PTR*)PrivateHandle);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ include_directories(${REACTOS_SOURCE_DIR}/include/reactos/libs/sound)
|
|||
list(APPEND SOURCE
|
||||
controls.c
|
||||
filter.c
|
||||
midi.c
|
||||
mixer.c
|
||||
sup.c
|
||||
wave.c
|
||||
|
|
|
@ -955,7 +955,7 @@ MMixerInitializeFilter(
|
|||
MixerInfo->hMixer = MixerData->hDevice;
|
||||
|
||||
/* get mixer name */
|
||||
MMixerGetDeviceName(MixerContext, MixerInfo, MixerData->hDeviceInterfaceKey);
|
||||
MMixerGetDeviceName(MixerContext, MixerInfo->MixCaps.szPname, MixerData->hDeviceInterfaceKey);
|
||||
|
||||
/* initialize line list */
|
||||
InitializeListHead(&MixerInfo->LineList);
|
||||
|
@ -1128,6 +1128,9 @@ MMixerSetupFilter(
|
|||
|
||||
}
|
||||
|
||||
/* activate midi devices */
|
||||
MMixerInitializeMidiForFilter(MixerContext, MixerList, MixerData, Topology);
|
||||
|
||||
/* done */
|
||||
return Status;
|
||||
}
|
||||
|
|
541
lib/drivers/sound/mmixer/midi.c
Normal file
541
lib/drivers/sound/mmixer/midi.c
Normal file
|
@ -0,0 +1,541 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS Kernel Streaming
|
||||
* FILE: lib/drivers/sound/mmixer/midi.c
|
||||
* PURPOSE: Midi Support Functions
|
||||
* PROGRAMMER: Johannes Anderwald
|
||||
*/
|
||||
|
||||
#include "priv.h"
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetPinDataFlowAndCommunication(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN LPMIXER_DATA MixerData,
|
||||
IN ULONG PinId,
|
||||
OUT PKSPIN_DATAFLOW DataFlow,
|
||||
OUT PKSPIN_COMMUNICATION Communication)
|
||||
{
|
||||
KSP_PIN Pin;
|
||||
ULONG BytesReturned;
|
||||
MIXER_STATUS Status;
|
||||
|
||||
/* setup request */
|
||||
Pin.PinId = PinId;
|
||||
Pin.Reserved = 0;
|
||||
Pin.Property.Flags = KSPROPERTY_TYPE_GET;
|
||||
Pin.Property.Id = KSPROPERTY_PIN_DATAFLOW;
|
||||
Pin.Property.Set = KSPROPSETID_Pin;
|
||||
|
||||
/* get pin dataflow */
|
||||
Status = MixerContext->Control(MixerData->hDevice, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)DataFlow, sizeof(KSPIN_DATAFLOW), &BytesReturned);
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* failed to retrieve dataflow */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* setup communication request */
|
||||
Pin.Property.Id = KSPROPERTY_PIN_COMMUNICATION;
|
||||
|
||||
/* get pin communication */
|
||||
Status = MixerContext->Control(MixerData->hDevice, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)Communication, sizeof(KSPIN_COMMUNICATION), &BytesReturned);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerAddMidiPin(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_LIST MixerList,
|
||||
IN ULONG DeviceId,
|
||||
IN ULONG PinId,
|
||||
IN ULONG bInput,
|
||||
IN LPWSTR DeviceName)
|
||||
{
|
||||
LPMIDI_INFO MidiInfo;
|
||||
|
||||
/* allocate midi info */
|
||||
MidiInfo = MixerContext->Alloc(sizeof(MIDI_INFO));
|
||||
|
||||
if (!MidiInfo)
|
||||
{
|
||||
/* no memory */
|
||||
return MM_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* initialize midi info */
|
||||
MidiInfo->DeviceId = DeviceId;
|
||||
MidiInfo->PinId = PinId;
|
||||
|
||||
/* sanity check */
|
||||
ASSERT(wcslen(DeviceName) + 1 < MAXPNAMELEN);
|
||||
|
||||
/* copy device name */
|
||||
if (bInput && DeviceName)
|
||||
{
|
||||
wcscpy(MidiInfo->u.InCaps.szPname, DeviceName);
|
||||
}
|
||||
else if (!bInput && DeviceName)
|
||||
{
|
||||
wcscpy(MidiInfo->u.OutCaps.szPname, DeviceName);
|
||||
}
|
||||
|
||||
/* FIXME determine manufacturer / product id */
|
||||
if (bInput)
|
||||
{
|
||||
MidiInfo->u.InCaps.dwSupport = 0;
|
||||
MidiInfo->u.InCaps.wMid = MM_MICROSOFT;
|
||||
MidiInfo->u.InCaps.wPid = MM_PID_UNMAPPED;
|
||||
MidiInfo->u.InCaps.vDriverVersion = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
MidiInfo->u.OutCaps.dwSupport = 0;
|
||||
MidiInfo->u.OutCaps.wMid = MM_MICROSOFT;
|
||||
MidiInfo->u.OutCaps.wPid = MM_PID_UNMAPPED;
|
||||
MidiInfo->u.OutCaps.vDriverVersion = 1;
|
||||
}
|
||||
|
||||
if (bInput)
|
||||
{
|
||||
/* insert into list */
|
||||
InsertTailList(&MixerList->MidiInList, &MidiInfo->Entry);
|
||||
MixerList->MidiInListCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* insert into list */
|
||||
InsertTailList(&MixerList->MidiOutList, &MidiInfo->Entry);
|
||||
MixerList->MidiOutListCount++;
|
||||
}
|
||||
|
||||
return MM_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VOID
|
||||
MMixerCheckFilterPinMidiSupport(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_LIST MixerList,
|
||||
IN LPMIXER_DATA MixerData,
|
||||
IN ULONG PinId,
|
||||
IN PKSMULTIPLE_ITEM MultipleItem,
|
||||
IN LPWSTR szPname)
|
||||
{
|
||||
ULONG Index;
|
||||
PKSDATARANGE DataRange;
|
||||
KSPIN_COMMUNICATION Communication;
|
||||
KSPIN_DATAFLOW DataFlow;
|
||||
MIXER_STATUS Status;
|
||||
|
||||
/* get first datarange */
|
||||
DataRange = (PKSDATARANGE)(MultipleItem + 1);
|
||||
|
||||
/* alignment assert */
|
||||
ASSERT(((ULONG_PTR)DataRange & 0x7) == 0);
|
||||
|
||||
/* iterate through all data ranges */
|
||||
for(Index = 0; Index < MultipleItem->Count; Index++)
|
||||
{
|
||||
if (IsEqualGUIDAligned(&DataRange->MajorFormat, &KSDATAFORMAT_TYPE_MUSIC) &&
|
||||
IsEqualGUIDAligned(&DataRange->SubFormat, &KSDATAFORMAT_SUBTYPE_MIDI) &&
|
||||
IsEqualGUIDAligned(&DataRange->Specifier, &KSDATAFORMAT_SPECIFIER_NONE))
|
||||
{
|
||||
/* pin supports midi datarange */
|
||||
if (MMixerGetPinDataFlowAndCommunication(MixerContext, MixerData, PinId, &DataFlow, &Communication) == MM_STATUS_SUCCESS)
|
||||
{
|
||||
if (DataFlow == KSPIN_DATAFLOW_IN && Communication == KSPIN_COMMUNICATION_SINK)
|
||||
{
|
||||
Status = MMixerAddMidiPin(MixerContext, MixerList, MixerData->DeviceId, PinId, FALSE, szPname);
|
||||
}
|
||||
else if (DataFlow == KSPIN_DATAFLOW_OUT && Communication == KSPIN_COMMUNICATION_SOURCE)
|
||||
{
|
||||
Status = MMixerAddMidiPin(MixerContext, MixerList, MixerData->DeviceId, PinId, TRUE, szPname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* move to next datarange */
|
||||
DataRange = (PKSDATARANGE)((ULONG_PTR)DataRange + DataRange->FormatSize);
|
||||
|
||||
/* alignment assert */
|
||||
ASSERT(((ULONG_PTR)DataRange & 0x7) == 0);
|
||||
|
||||
/* data ranges are 64-bit aligned */
|
||||
DataRange = (PVOID)(((ULONG_PTR)DataRange + 0x7) & ~0x7);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
MMixerInitializeMidiForFilter(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_LIST MixerList,
|
||||
IN LPMIXER_DATA MixerData,
|
||||
IN PTOPOLOGY Topology)
|
||||
{
|
||||
ULONG PinCount, Index;
|
||||
MIXER_STATUS Status;
|
||||
PKSMULTIPLE_ITEM MultipleItem;
|
||||
WCHAR szPname[MAXPNAMELEN];
|
||||
|
||||
/* get filter pin count */
|
||||
MMixerGetTopologyPinCount(Topology, &PinCount);
|
||||
|
||||
/* get mixer name */
|
||||
if (MMixerGetDeviceName(MixerContext, szPname, MixerData->hDeviceInterfaceKey) != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* clear name */
|
||||
szPname[0] = 0;
|
||||
}
|
||||
|
||||
/* iterate all pins and check for KSDATARANGE_MUSIC support */
|
||||
for(Index = 0; Index < PinCount; Index++)
|
||||
{
|
||||
/* get audio pin data ranges */
|
||||
Status = MMixerGetAudioPinDataRanges(MixerContext, MixerData->hDevice, Index, &MultipleItem);
|
||||
|
||||
/* check for success */
|
||||
if (Status == MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* check if there is support KSDATARANGE_MUSIC */
|
||||
MMixerCheckFilterPinMidiSupport(MixerContext, MixerList, MixerData, Index, MultipleItem, szPname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerOpenMidiPin(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_LIST MixerList,
|
||||
IN ULONG DeviceId,
|
||||
IN ULONG PinId,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN PIN_CREATE_CALLBACK CreateCallback,
|
||||
IN PVOID Context,
|
||||
OUT PHANDLE PinHandle)
|
||||
{
|
||||
PKSPIN_CONNECT PinConnect;
|
||||
PKSDATAFORMAT DataFormat;
|
||||
LPMIXER_DATA MixerData;
|
||||
NTSTATUS Status;
|
||||
MIXER_STATUS MixerStatus;
|
||||
|
||||
MixerData = MMixerGetDataByDeviceId(MixerList, DeviceId);
|
||||
if (!MixerData)
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
|
||||
/* allocate pin connect */
|
||||
PinConnect = MMixerAllocatePinConnect(MixerContext, sizeof(KSDATAFORMAT));
|
||||
if (!PinConnect)
|
||||
{
|
||||
/* no memory */
|
||||
return MM_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* initialize pin connect struct */
|
||||
MMixerInitializePinConnect(PinConnect, PinId);
|
||||
|
||||
/* get offset to dataformat */
|
||||
DataFormat = (PKSDATAFORMAT) (PinConnect + 1);
|
||||
|
||||
/* initialize data format */
|
||||
RtlMoveMemory(&DataFormat->MajorFormat, &KSDATAFORMAT_TYPE_MUSIC, sizeof(GUID));
|
||||
RtlMoveMemory(&DataFormat->SubFormat, &KSDATAFORMAT_SUBTYPE_MIDI, sizeof(GUID));
|
||||
RtlMoveMemory(&DataFormat->Specifier, &KSDATAFORMAT_SPECIFIER_NONE, sizeof(GUID));
|
||||
|
||||
if (CreateCallback)
|
||||
{
|
||||
/* let the callback handle the creation */
|
||||
MixerStatus = CreateCallback(Context, DeviceId, PinId, MixerData->hDevice, PinConnect, DesiredAccess, PinHandle);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* now create the pin */
|
||||
Status = KsCreatePin(MixerData->hDevice, PinConnect, DesiredAccess, PinHandle);
|
||||
|
||||
/* normalize status */
|
||||
if (Status == STATUS_SUCCESS)
|
||||
MixerStatus = MM_STATUS_SUCCESS;
|
||||
else
|
||||
MixerStatus = MM_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
/* free create info */
|
||||
MixerContext->Free(PinConnect);
|
||||
|
||||
/* done */
|
||||
return MixerStatus;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetMidiInfoByIndexAndType(
|
||||
IN PMIXER_LIST MixerList,
|
||||
IN ULONG DeviceIndex,
|
||||
IN ULONG bMidiInputType,
|
||||
OUT LPMIDI_INFO *OutMidiInfo)
|
||||
{
|
||||
ULONG Index = 0;
|
||||
PLIST_ENTRY Entry, ListHead;
|
||||
LPMIDI_INFO MidiInfo;
|
||||
|
||||
if (bMidiInputType)
|
||||
ListHead = &MixerList->MidiInList;
|
||||
else
|
||||
ListHead = &MixerList->MidiOutList;
|
||||
|
||||
/* get first entry */
|
||||
Entry = ListHead->Flink;
|
||||
|
||||
while(Entry != ListHead)
|
||||
{
|
||||
MidiInfo = (LPMIDI_INFO)CONTAINING_RECORD(Entry, MIDI_INFO, Entry);
|
||||
|
||||
if (Index == DeviceIndex)
|
||||
{
|
||||
*OutMidiInfo = MidiInfo;
|
||||
return MM_STATUS_SUCCESS;
|
||||
}
|
||||
Index++;
|
||||
Entry = Entry->Flink;
|
||||
}
|
||||
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerMidiOutCapabilities(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG DeviceIndex,
|
||||
OUT LPMIDIOUTCAPSW Caps)
|
||||
{
|
||||
PMIXER_LIST MixerList;
|
||||
MIXER_STATUS Status;
|
||||
LPMIDI_INFO MidiInfo;
|
||||
|
||||
/* verify mixer context */
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* invalid context passed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* grab mixer list */
|
||||
MixerList = (PMIXER_LIST)MixerContext->MixerContext;
|
||||
|
||||
/* find destination midi */
|
||||
Status = MMixerGetMidiInfoByIndexAndType(MixerList, DeviceIndex, FALSE, &MidiInfo);
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* failed to find midi info */
|
||||
return MM_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
/* copy capabilities */
|
||||
MixerContext->Copy(Caps, &MidiInfo->u.OutCaps, sizeof(MIDIOUTCAPSW));
|
||||
|
||||
return MM_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerMidiInCapabilities(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG DeviceIndex,
|
||||
OUT LPMIDIINCAPSW Caps)
|
||||
{
|
||||
PMIXER_LIST MixerList;
|
||||
MIXER_STATUS Status;
|
||||
LPMIDI_INFO MidiInfo;
|
||||
|
||||
/* verify mixer context */
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* invalid context passed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* grab mixer list */
|
||||
MixerList = (PMIXER_LIST)MixerContext->MixerContext;
|
||||
|
||||
/* find destination midi */
|
||||
Status = MMixerGetMidiInfoByIndexAndType(MixerList, DeviceIndex, TRUE, &MidiInfo);
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* failed to find midi info */
|
||||
return MM_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
/* copy capabilities */
|
||||
MixerContext->Copy(Caps, &MidiInfo->u.InCaps, sizeof(MIDIINCAPSW));
|
||||
|
||||
return MM_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetMidiDevicePath(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG bMidiIn,
|
||||
IN ULONG DeviceId,
|
||||
OUT LPWSTR * DevicePath)
|
||||
{
|
||||
PMIXER_LIST MixerList;
|
||||
LPMIXER_DATA MixerData;
|
||||
LPMIDI_INFO MidiInfo;
|
||||
ULONG Length;
|
||||
MIXER_STATUS Status;
|
||||
|
||||
/* verify mixer context */
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* invalid context passed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* grab mixer list */
|
||||
MixerList = (PMIXER_LIST)MixerContext->MixerContext;
|
||||
|
||||
/* find destination midi */
|
||||
Status = MMixerGetMidiInfoByIndexAndType(MixerList, DeviceId, bMidiIn, &MidiInfo);
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* failed to find midi info */
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* get associated device id */
|
||||
MixerData = MMixerGetDataByDeviceId(MixerList, MidiInfo->DeviceId);
|
||||
if (!MixerData)
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
|
||||
/* calculate length */
|
||||
Length = wcslen(MixerData->DeviceName)+1;
|
||||
|
||||
/* allocate destination buffer */
|
||||
*DevicePath = MixerContext->Alloc(Length * sizeof(WCHAR));
|
||||
|
||||
if (!*DevicePath)
|
||||
{
|
||||
/* no memory */
|
||||
return MM_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* copy device path */
|
||||
MixerContext->Copy(*DevicePath, MixerData->DeviceName, Length * sizeof(WCHAR));
|
||||
|
||||
/* done */
|
||||
return MM_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerSetMidiStatus(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE PinHandle,
|
||||
IN KSSTATE State)
|
||||
{
|
||||
KSPROPERTY Property;
|
||||
ULONG Length;
|
||||
|
||||
/* setup property request */
|
||||
Property.Set = KSPROPSETID_Connection;
|
||||
Property.Id = KSPROPERTY_CONNECTION_STATE;
|
||||
Property.Flags = KSPROPERTY_TYPE_SET;
|
||||
|
||||
return MixerContext->Control(PinHandle, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), &State, sizeof(KSSTATE), &Length);
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerOpenMidi(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG DeviceIndex,
|
||||
IN ULONG bMidiIn,
|
||||
IN PIN_CREATE_CALLBACK CreateCallback,
|
||||
IN PVOID Context,
|
||||
OUT PHANDLE PinHandle)
|
||||
{
|
||||
PMIXER_LIST MixerList;
|
||||
MIXER_STATUS Status;
|
||||
LPMIDI_INFO MidiInfo;
|
||||
ACCESS_MASK DesiredAccess = 0;
|
||||
|
||||
/* verify mixer context */
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* invalid context passed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* grab mixer list */
|
||||
MixerList = (PMIXER_LIST)MixerContext->MixerContext;
|
||||
|
||||
/* find destination midi */
|
||||
Status = MMixerGetMidiInfoByIndexAndType(MixerList, DeviceIndex, bMidiIn, &MidiInfo);
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* failed to find midi info */
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* get desired access */
|
||||
if (bMidiIn)
|
||||
{
|
||||
DesiredAccess |= GENERIC_READ;
|
||||
}
|
||||
else
|
||||
{
|
||||
DesiredAccess |= GENERIC_WRITE;
|
||||
}
|
||||
|
||||
/* now try open the pin */
|
||||
return MMixerOpenMidiPin(MixerContext, MixerList, MidiInfo->DeviceId, MidiInfo->PinId, DesiredAccess, CreateCallback, Context, PinHandle);
|
||||
}
|
||||
|
||||
ULONG
|
||||
MMixerGetMidiInCount(
|
||||
IN PMIXER_CONTEXT MixerContext)
|
||||
{
|
||||
PMIXER_LIST MixerList;
|
||||
MIXER_STATUS Status;
|
||||
|
||||
/* verify mixer context */
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* invalid context passed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* grab mixer list */
|
||||
MixerList = (PMIXER_LIST)MixerContext->MixerContext;
|
||||
|
||||
return MixerList->MidiInListCount;
|
||||
}
|
||||
|
||||
ULONG
|
||||
MMixerGetMidiOutCount(
|
||||
IN PMIXER_CONTEXT MixerContext)
|
||||
{
|
||||
PMIXER_LIST MixerList;
|
||||
MIXER_STATUS Status;
|
||||
|
||||
/* verify mixer context */
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* invalid context passed */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* grab mixer list */
|
||||
MixerList = (PMIXER_LIST)MixerContext->MixerContext;
|
||||
|
||||
return MixerList->MidiOutListCount;
|
||||
}
|
|
@ -447,11 +447,14 @@ MMixerInitialize(
|
|||
MixerList->MixerDataCount = 0;
|
||||
MixerList->WaveInListCount = 0;
|
||||
MixerList->WaveOutListCount = 0;
|
||||
MixerList->MidiInListCount = 0;
|
||||
MixerList->MidiOutListCount = 0;
|
||||
InitializeListHead(&MixerList->MixerList);
|
||||
InitializeListHead(&MixerList->MixerData);
|
||||
InitializeListHead(&MixerList->WaveInList);
|
||||
InitializeListHead(&MixerList->WaveOutList);
|
||||
|
||||
InitializeListHead(&MixerList->MidiInList);
|
||||
InitializeListHead(&MixerList->MidiOutList);
|
||||
|
||||
/* store mixer list */
|
||||
MixerContext->MixerContext = (PVOID)MixerList;
|
||||
|
|
|
@ -122,6 +122,15 @@ ULONG
|
|||
MMixerGetWaveOutCount(
|
||||
IN PMIXER_CONTEXT MixerContext);
|
||||
|
||||
ULONG
|
||||
MMixerGetMidiInCount(
|
||||
IN PMIXER_CONTEXT MixerContext);
|
||||
|
||||
ULONG
|
||||
MMixerGetMidiOutCount(
|
||||
IN PMIXER_CONTEXT MixerContext);
|
||||
|
||||
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetCapabilities(
|
||||
|
@ -199,3 +208,37 @@ MMixerGetWaveDevicePath(
|
|||
IN ULONG bWaveIn,
|
||||
IN ULONG DeviceId,
|
||||
OUT LPWSTR * DevicePath);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerMidiOutCapabilities(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG DeviceIndex,
|
||||
OUT LPMIDIOUTCAPSW Caps);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerMidiInCapabilities(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG DeviceIndex,
|
||||
OUT LPMIDIINCAPSW Caps);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetMidiDevicePath(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG bMidiIn,
|
||||
IN ULONG DeviceId,
|
||||
OUT LPWSTR * DevicePath);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerSetMidiStatus(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE PinHandle,
|
||||
IN KSSTATE State);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerOpenMidi(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG DeviceIndex,
|
||||
IN ULONG bMidiIn,
|
||||
IN PIN_CREATE_CALLBACK CreateCallback,
|
||||
IN PVOID Context,
|
||||
OUT PHANDLE PinHandle);
|
||||
|
|
|
@ -128,16 +128,38 @@ typedef struct
|
|||
}u;
|
||||
}WAVE_INFO, *LPWAVE_INFO;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
LIST_ENTRY Entry;
|
||||
ULONG DeviceId;
|
||||
ULONG PinId;
|
||||
union
|
||||
{
|
||||
MIDIOUTCAPSW OutCaps;
|
||||
MIDIINCAPSW InCaps;
|
||||
}u;
|
||||
|
||||
}MIDI_INFO, *LPMIDI_INFO;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ULONG MixerListCount;
|
||||
LIST_ENTRY MixerList;
|
||||
|
||||
ULONG MixerDataCount;
|
||||
LIST_ENTRY MixerData;
|
||||
|
||||
ULONG WaveInListCount;
|
||||
LIST_ENTRY WaveInList;
|
||||
|
||||
ULONG WaveOutListCount;
|
||||
LIST_ENTRY WaveOutList;
|
||||
|
||||
ULONG MidiInListCount;
|
||||
LIST_ENTRY MidiInList;
|
||||
|
||||
ULONG MidiOutListCount;
|
||||
LIST_ENTRY MidiOutList;
|
||||
}MIXER_LIST, *PMIXER_LIST;
|
||||
|
||||
typedef struct
|
||||
|
@ -196,16 +218,6 @@ MMixerFreeMixerInfo(
|
|||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN LPMIXER_INFO MixerInfo);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetTargetPins(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PKSMULTIPLE_ITEM NodeTypes,
|
||||
IN PKSMULTIPLE_ITEM NodeConnections,
|
||||
IN ULONG NodeIndex,
|
||||
IN ULONG bUpDirection,
|
||||
OUT PULONG Pins,
|
||||
IN ULONG PinCount);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetPhysicalConnection(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
|
@ -213,11 +225,6 @@ MMixerGetPhysicalConnection(
|
|||
IN ULONG PinId,
|
||||
OUT PKSPIN_PHYSICALCONNECTION *OutConnection);
|
||||
|
||||
ULONG
|
||||
MMixerGetIndexOfGuid(
|
||||
PKSMULTIPLE_ITEM MultipleItem,
|
||||
LPCGUID NodeType);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerSetupFilter(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
|
@ -225,24 +232,24 @@ MMixerSetupFilter(
|
|||
IN LPMIXER_DATA MixerData,
|
||||
IN PULONG DeviceCount);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetTargetPinsByNodeConnectionIndex(
|
||||
PKSPIN_CONNECT
|
||||
MMixerAllocatePinConnect(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PKSMULTIPLE_ITEM NodeConnections,
|
||||
IN PKSMULTIPLE_ITEM NodeTypes,
|
||||
IN ULONG bUpDirection,
|
||||
IN ULONG NodeConnectionIndex,
|
||||
IN ULONG PinCount,
|
||||
OUT PULONG Pins);
|
||||
ULONG DataFormatSize);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetControlsFromPin(
|
||||
MMixerGetAudioPinDataRanges(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PKSMULTIPLE_ITEM NodeConnections,
|
||||
IN PKSMULTIPLE_ITEM NodeTypes,
|
||||
IN HANDLE hDevice,
|
||||
IN ULONG PinId,
|
||||
IN ULONG bUpDirection,
|
||||
OUT PULONG Nodes);
|
||||
IN OUT PKSMULTIPLE_ITEM * OutMultipleItem);
|
||||
|
||||
VOID
|
||||
MMixerInitializeMidiForFilter(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_LIST MixerList,
|
||||
IN LPMIXER_DATA MixerData,
|
||||
IN PTOPOLOGY Topology);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerVerifyContext(
|
||||
|
@ -314,12 +321,6 @@ MMixerCreateMixerData(
|
|||
IN HANDLE hDevice,
|
||||
IN HANDLE hKey);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetDeviceName(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN LPMIXER_INFO MixerInfo,
|
||||
IN HANDLE hKey);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerInitializeWaveInfo(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
|
@ -337,6 +338,18 @@ MMixerAddEvent(
|
|||
IN PVOID MixerEvent,
|
||||
IN PMIXER_EVENT MixerEventRoutine);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetDeviceName(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
OUT LPWSTR DeviceName,
|
||||
IN HANDLE hKey);
|
||||
|
||||
VOID
|
||||
MMixerInitializePinConnect(
|
||||
IN OUT PKSPIN_CONNECT PinConnect,
|
||||
IN ULONG PinId);
|
||||
|
||||
|
||||
/* topology.c */
|
||||
|
||||
MIXER_STATUS
|
||||
|
@ -448,3 +461,9 @@ MMixerIsTopologyNodeReserved(
|
|||
IN PTOPOLOGY Topology,
|
||||
IN ULONG NodeIndex,
|
||||
OUT PULONG bReserved);
|
||||
|
||||
VOID
|
||||
MMixerGetTopologyPinCount(
|
||||
IN PTOPOLOGY Topology,
|
||||
OUT PULONG PinCount);
|
||||
|
||||
|
|
|
@ -31,6 +31,11 @@ const GUID KSPROPSETID_General = {0x1464EDA5L, 0x6A8F, 0x11D1,
|
|||
const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
|
||||
const GUID KSEVENTSETID_AudioControlChange = {0xE85E9698L, 0xFA2F, 0x11D1, {0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}};
|
||||
|
||||
const GUID KSDATAFORMAT_TYPE_MUSIC = {0xE725D360L, 0x62CC, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
|
||||
const GUID KSDATAFORMAT_SUBTYPE_MIDI = {0x1D262760L, 0xE957, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
|
||||
const GUID KSDATAFORMAT_SPECIFIER_NONE = {0x0F6417D6L, 0xC318, 0x11D0, {0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
|
||||
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerVerifyContext(
|
||||
IN PMIXER_CONTEXT MixerContext)
|
||||
|
@ -444,7 +449,7 @@ MMixerCreateMixerData(
|
|||
MIXER_STATUS
|
||||
MMixerGetDeviceName(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN LPMIXER_INFO MixerInfo,
|
||||
OUT LPWSTR DeviceName,
|
||||
IN HANDLE hKey)
|
||||
{
|
||||
LPWSTR Name;
|
||||
|
@ -457,10 +462,10 @@ MMixerGetDeviceName(
|
|||
if (Status == MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* copy device name */
|
||||
MixerContext->Copy(MixerInfo->MixCaps.szPname, Name, min(wcslen(Name), MAXPNAMELEN-1) * sizeof(WCHAR));
|
||||
MixerContext->Copy(DeviceName, Name, min(wcslen(Name), MAXPNAMELEN-1) * sizeof(WCHAR));
|
||||
|
||||
/* make sure its null terminated */
|
||||
MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] = L'\0';
|
||||
DeviceName[MAXPNAMELEN-1] = L'\0';
|
||||
|
||||
/* free device name */
|
||||
MixerContext->Free(Name);
|
||||
|
@ -473,14 +478,14 @@ MMixerGetDeviceName(
|
|||
if (Status != MM_STATUS_SUCCESS)
|
||||
return Status;
|
||||
|
||||
Status = MixerContext->QueryKeyValue(hKey, L"FriendlyName", (PVOID*)&Name, &Length, &Type);
|
||||
Status = MixerContext->QueryKeyValue(hTemp, L"FriendlyName", (PVOID*)&Name, &Length, &Type);
|
||||
if (Status == MM_STATUS_SUCCESS)
|
||||
{
|
||||
/* copy device name */
|
||||
MixerContext->Copy(MixerInfo->MixCaps.szPname, Name, min(wcslen(Name), MAXPNAMELEN-1) * sizeof(WCHAR));
|
||||
MixerContext->Copy(DeviceName, Name, min(wcslen(Name), MAXPNAMELEN-1) * sizeof(WCHAR));
|
||||
|
||||
/* make sure its null terminated */
|
||||
MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] = L'\0';
|
||||
DeviceName[MAXPNAMELEN-1] = L'\0';
|
||||
|
||||
/* free device name */
|
||||
MixerContext->Free(Name);
|
||||
|
@ -489,3 +494,21 @@ MMixerGetDeviceName(
|
|||
MixerContext->CloseKey(hTemp);
|
||||
return Status;
|
||||
}
|
||||
|
||||
VOID
|
||||
MMixerInitializePinConnect(
|
||||
IN OUT PKSPIN_CONNECT PinConnect,
|
||||
IN ULONG PinId)
|
||||
{
|
||||
PinConnect->Interface.Set = KSINTERFACESETID_Standard;
|
||||
PinConnect->Interface.Id = KSINTERFACE_STANDARD_STREAMING;
|
||||
PinConnect->Interface.Flags = 0;
|
||||
PinConnect->Medium.Set = KSMEDIUMSETID_Standard;
|
||||
PinConnect->Medium.Id = KSMEDIUM_TYPE_ANYINSTANCE;
|
||||
PinConnect->Medium.Flags = 0;
|
||||
PinConnect->PinToHandle = NULL;
|
||||
PinConnect->PinId = PinId;
|
||||
PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL;
|
||||
PinConnect->Priority.PrioritySubClass = 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -983,6 +983,15 @@ MMixerGetNextNodesFromNodeIndex(
|
|||
*OutNodesCount = TopologyNodesCount;
|
||||
}
|
||||
|
||||
VOID
|
||||
MMixerGetTopologyPinCount(
|
||||
IN PTOPOLOGY Topology,
|
||||
OUT PULONG PinCount)
|
||||
{
|
||||
/* store pin count */
|
||||
*PinCount = Topology->TopologyPinsCount;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerAllocateTopologyPinArray(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
|
|
|
@ -109,22 +109,7 @@ MMixerGetWaveInfoByIndexAndType(
|
|||
}
|
||||
|
||||
|
||||
VOID
|
||||
MMixerInitializePinConnect(
|
||||
IN OUT PKSPIN_CONNECT PinConnect,
|
||||
IN ULONG PinId)
|
||||
{
|
||||
PinConnect->Interface.Set = KSINTERFACESETID_Standard;
|
||||
PinConnect->Interface.Id = KSINTERFACE_STANDARD_STREAMING;
|
||||
PinConnect->Interface.Flags = 0;
|
||||
PinConnect->Medium.Set = KSMEDIUMSETID_Standard;
|
||||
PinConnect->Medium.Id = KSMEDIUM_TYPE_ANYINSTANCE;
|
||||
PinConnect->Medium.Flags = 0;
|
||||
PinConnect->PinToHandle = NULL;
|
||||
PinConnect->PinId = PinId;
|
||||
PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL;
|
||||
PinConnect->Priority.PrioritySubClass = 1;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
MMixerInitializeDataFormat(
|
||||
|
@ -369,7 +354,7 @@ MMixerInitializeWaveInfo(
|
|||
WaveInfo->PinId = Pins[0];
|
||||
|
||||
/* sanity check */
|
||||
ASSERT(wcslen(DeviceName) < MAXPNAMELEN);
|
||||
ASSERT(wcslen(DeviceName) + 1 < MAXPNAMELEN);
|
||||
|
||||
/* copy device name */
|
||||
if (bWaveIn)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue