mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 04:33:32 +00:00
- implement MMixerGetDeviceNameWithComponentId, which retrieves the device name via component id
- start implement MMixerHandleTopologyFilter, does not yet fully work svn path=/trunk/; revision=73017
This commit is contained in:
parent
a9a9930090
commit
3e7f31ebe1
3 changed files with 165 additions and 5 deletions
|
@ -1268,6 +1268,110 @@ MMixerApplyOutputFilterHack(
|
||||||
*PinsCount = Count;
|
*PinsCount = Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MIXER_STATUS
|
||||||
|
MMixerHandleTopologyFilter(
|
||||||
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
IN PMIXER_LIST MixerList,
|
||||||
|
IN LPMIXER_DATA MixerData,
|
||||||
|
IN OUT LPMIXER_INFO MixerInfo,
|
||||||
|
IN ULONG bInput,
|
||||||
|
IN ULONG Pin)
|
||||||
|
{
|
||||||
|
MIXER_STATUS Status;
|
||||||
|
ULONG PinsCount, LineTerminator, DestinationLineID;
|
||||||
|
PULONG Pins;
|
||||||
|
PTOPOLOGY Topology;
|
||||||
|
|
||||||
|
/* re-use existing topology */
|
||||||
|
Topology = MixerData->Topology;
|
||||||
|
|
||||||
|
if (!bInput)
|
||||||
|
{
|
||||||
|
/* allocate pin index array which will hold all referenced pins */
|
||||||
|
Status = MMixerAllocateTopologyPinArray(MixerContext, Topology, &Pins);
|
||||||
|
if (Status != MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* failed to create topology */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the mixer is an output mixer
|
||||||
|
* find end pin of the node path
|
||||||
|
*/
|
||||||
|
PinsCount = 0;
|
||||||
|
Status = MMixerGetAllUpOrDownstreamPinsFromPinIndex(MixerContext, Topology, Pin, FALSE, &PinsCount, Pins);
|
||||||
|
|
||||||
|
/* check for success */
|
||||||
|
if (Status != MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* failed to get end pin */
|
||||||
|
MixerContext->Free(Pins);
|
||||||
|
//MMixerFreeTopology(Topology);
|
||||||
|
|
||||||
|
/* return error code */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
/* HACK:
|
||||||
|
* some topologies do not have strict boundaries
|
||||||
|
* WorkArround: remove all pin ids which have a physical connection
|
||||||
|
* because bridge pins may belong to different render paths
|
||||||
|
*/
|
||||||
|
MMixerApplyOutputFilterHack(MixerContext, MixerData, MixerData->hDevice, &PinsCount, Pins);
|
||||||
|
|
||||||
|
/* sanity checks */
|
||||||
|
ASSERT(PinsCount != 0);
|
||||||
|
if (PinsCount != 1)
|
||||||
|
{
|
||||||
|
DPRINT1("MMixerHandlePhysicalConnection Expected 1 pin but got %lu\n", PinsCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create destination line */
|
||||||
|
Status = MMixerBuildMixerDestinationLine(MixerContext, MixerInfo, MixerData->hDevice, Pins[0], bInput);
|
||||||
|
|
||||||
|
/* calculate destination line id */
|
||||||
|
DestinationLineID = (DESTINATION_LINE + MixerInfo->MixCaps.cDestinations - 1);
|
||||||
|
|
||||||
|
if (Status != MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* failed to build destination line */
|
||||||
|
MixerContext->Free(Pins);
|
||||||
|
|
||||||
|
/* return error code */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add mixer controls to destination line */
|
||||||
|
Status = MMixerAddMixerControlsToDestinationLine(MixerContext, MixerInfo, MixerData->hDevice, Topology, Pins[0], bInput, DestinationLineID, &LineTerminator);
|
||||||
|
|
||||||
|
if (Status == MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* now add the rest of the source lines */
|
||||||
|
Status = MMixerAddMixerSourceLines(MixerContext, MixerInfo, MixerData->hDevice, Topology, DestinationLineID, LineTerminator);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* mark pin as consumed */
|
||||||
|
MMixerSetTopologyPinReserved(Topology, Pins[0]);
|
||||||
|
|
||||||
|
/* free topology pin array */
|
||||||
|
MixerContext->Free(Pins);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* calculate destination line id */
|
||||||
|
DestinationLineID = (DESTINATION_LINE + MixerInfo->MixCaps.cDestinations - 1);
|
||||||
|
|
||||||
|
/* add mixer controls */
|
||||||
|
Status = MMixerAddMixerControlsToDestinationLine(MixerContext, MixerInfo, MixerData->hDevice, Topology, Pin, bInput, DestinationLineID, &LineTerminator);
|
||||||
|
|
||||||
|
if (Status == MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* now add the rest of the source lines */
|
||||||
|
Status = MMixerAddMixerSourceLines(MixerContext, MixerInfo, MixerData->hDevice, Topology, DestinationLineID, LineTerminator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
MIXER_STATUS
|
MIXER_STATUS
|
||||||
MMixerHandlePhysicalConnection(
|
MMixerHandlePhysicalConnection(
|
||||||
IN PMIXER_CONTEXT MixerContext,
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
@ -1450,7 +1554,12 @@ MMixerInitializeFilter(
|
||||||
MixerInfo->MixCaps.cDestinations = 0;
|
MixerInfo->MixCaps.cDestinations = 0;
|
||||||
|
|
||||||
/* get mixer name */
|
/* get mixer name */
|
||||||
MMixerGetDeviceName(MixerContext, MixerInfo->MixCaps.szPname, MixerData->hDeviceInterfaceKey);
|
Status = MMixerGetDeviceName(MixerContext, MixerInfo->MixCaps.szPname, MixerData->hDeviceInterfaceKey);
|
||||||
|
if (Status != MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* try get name with component id */
|
||||||
|
Status = MMixerGetDeviceNameWithComponentId(MixerContext, MixerData->hDevice, MixerInfo->MixCaps.szPname);
|
||||||
|
}
|
||||||
|
|
||||||
/* initialize line list */
|
/* initialize line list */
|
||||||
InitializeListHead(&MixerInfo->LineList);
|
InitializeListHead(&MixerInfo->LineList);
|
||||||
|
@ -1546,10 +1655,8 @@ MMixerInitializeFilter(
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* FIXME
|
/* topology is on the same filter */
|
||||||
* handle drivers which expose their topology on the same filter
|
Status = MMixerHandleTopologyFilter(MixerContext, MixerList, MixerData, MixerInfo, bInputMixer, Pins[0]);
|
||||||
*/
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* free pins */
|
/* free pins */
|
||||||
|
|
|
@ -359,6 +359,12 @@ MMixerGetDeviceName(
|
||||||
OUT LPWSTR DeviceName,
|
OUT LPWSTR DeviceName,
|
||||||
IN HANDLE hKey);
|
IN HANDLE hKey);
|
||||||
|
|
||||||
|
MIXER_STATUS
|
||||||
|
MMixerGetDeviceNameWithComponentId(
|
||||||
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
IN HANDLE hMixer,
|
||||||
|
OUT LPWSTR DeviceName);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
MMixerInitializePinConnect(
|
MMixerInitializePinConnect(
|
||||||
IN OUT PKSPIN_CONNECT PinConnect,
|
IN OUT PKSPIN_CONNECT PinConnect,
|
||||||
|
|
|
@ -801,6 +801,53 @@ MMixerCreateMixerData(
|
||||||
return MM_STATUS_SUCCESS;
|
return MM_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MIXER_STATUS
|
||||||
|
MMixerGetDeviceNameWithComponentId(
|
||||||
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
IN HANDLE hMixer,
|
||||||
|
OUT LPWSTR OutDeviceName)
|
||||||
|
{
|
||||||
|
MIXER_STATUS Status;
|
||||||
|
KSPROPERTY Property;
|
||||||
|
KSCOMPONENTID ComponentId;
|
||||||
|
ULONG Length;
|
||||||
|
UNICODE_STRING GuidString;
|
||||||
|
ULONG ResultLength, KeyType;
|
||||||
|
HANDLE hMediaKey, hGuidKey;
|
||||||
|
LPWSTR DeviceName;
|
||||||
|
|
||||||
|
/* prepare property */
|
||||||
|
Property.Flags = KSPROPERTY_TYPE_GET;
|
||||||
|
Property.Set = KSPROPSETID_General;
|
||||||
|
Property.Id = KSPROPERTY_GENERAL_COMPONENTID;
|
||||||
|
|
||||||
|
/* try get component id */
|
||||||
|
Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), &ComponentId, sizeof(KSCOMPONENTID), &Length);
|
||||||
|
|
||||||
|
if (Status == MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
Status = MixerContext->OpenKey(NULL, L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\MediaCategories", KEY_READ, &hMediaKey);
|
||||||
|
if (Status == MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
RtlStringFromGUID(&ComponentId.Name, &GuidString);
|
||||||
|
Status = MixerContext->OpenKey(hMediaKey, GuidString.Buffer, KEY_READ, &hGuidKey);
|
||||||
|
RtlFreeUnicodeString(&GuidString);
|
||||||
|
if (Status == MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
Status = MixerContext->QueryKeyValue(hGuidKey, L"Name", (PVOID*)&DeviceName, &ResultLength, &KeyType);
|
||||||
|
if (Status == MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
MixerContext->Copy(OutDeviceName, DeviceName, min(ResultLength, (MAXPNAMELEN-1)*2));
|
||||||
|
}
|
||||||
|
|
||||||
|
MixerContext->CloseKey(hGuidKey);
|
||||||
|
}
|
||||||
|
MixerContext->CloseKey(hMediaKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
MIXER_STATUS
|
MIXER_STATUS
|
||||||
MMixerGetDeviceName(
|
MMixerGetDeviceName(
|
||||||
IN PMIXER_CONTEXT MixerContext,
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue