mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 20:25:39 +00:00
[AUDIO-BRINGUP]
- Implement support for retrieving mux mixer controls - Implement support for on/off controls - Store logical pins for nodes connecting to another nodes. Currently not yet used svn path=/branches/audio-bringup/; revision=49965
This commit is contained in:
parent
3da0b30d8a
commit
4256033623
3 changed files with 68 additions and 30 deletions
|
@ -53,19 +53,7 @@ MMixerAddMixerControl(
|
||||||
MixerControl->dwControlType = MMixerGetControlTypeFromTopologyNode(NodeType);
|
MixerControl->dwControlType = MMixerGetControlTypeFromTopologyNode(NodeType);
|
||||||
|
|
||||||
MixerControl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; /* FIXME */
|
MixerControl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; /* FIXME */
|
||||||
MixerControl->cMultipleItems = 0; /* FIXME */
|
MixerControl->cMultipleItems = 0;
|
||||||
|
|
||||||
if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
|
|
||||||
{
|
|
||||||
MixerControl->Bounds.dwMinimum = 0;
|
|
||||||
MixerControl->Bounds.dwMaximum = 1;
|
|
||||||
}
|
|
||||||
else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
|
|
||||||
{
|
|
||||||
MixerControl->Bounds.dwMinimum = 0;
|
|
||||||
MixerControl->Bounds.dwMaximum = 0xFFFF;
|
|
||||||
MixerControl->Metrics.cSteps = 0xC0; /* FIXME */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* setup request to retrieve name */
|
/* setup request to retrieve name */
|
||||||
Node.NodeId = NodeIndex;
|
Node.NodeId = NodeIndex;
|
||||||
|
@ -104,28 +92,46 @@ MMixerAddMixerControl(
|
||||||
}
|
}
|
||||||
|
|
||||||
MixerInfo->ControlId++;
|
MixerInfo->ControlId++;
|
||||||
#if 0
|
|
||||||
if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUX)
|
if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUX)
|
||||||
{
|
{
|
||||||
KSNODEPROPERTY Property;
|
ULONG NodesCount;
|
||||||
ULONG PinId = 2;
|
PULONG Nodes;
|
||||||
|
|
||||||
/* setup the request */
|
/* allocate topology nodes array */
|
||||||
RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY));
|
Status = MMixerAllocateTopologyNodeArray(MixerContext, Topology, &Nodes);
|
||||||
|
|
||||||
Property.NodeId = NodeIndex;
|
if (Status != MM_STATUS_SUCCESS)
|
||||||
Property.Property.Id = KSPROPERTY_AUDIO_MUX_SOURCE;
|
{
|
||||||
Property.Property.Flags = KSPROPERTY_TYPE_SET;
|
/* out of memory */
|
||||||
Property.Property.Set = KSPROPSETID_Audio;
|
return STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
/* get node volume level info */
|
/* get connected node count */
|
||||||
Status = MixerContext->Control(hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY), (PVOID)&PinId, sizeof(ULONG), &BytesReturned);
|
MMixerGetNextNodesFromNodeIndex(MixerContext, Topology, NodeIndex, TRUE, &NodesCount, Nodes);
|
||||||
|
|
||||||
DPRINT1("Status %x NodeIndex %u PinId %u\n", Status, NodeIndex, PinId);
|
/* TODO */
|
||||||
//DbgBreakPoint();
|
MixerContext->Free(Nodes);
|
||||||
}else
|
|
||||||
#endif
|
/* setup mux bounds */
|
||||||
if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
|
MixerControl->Bounds.dwMinimum = 0;
|
||||||
|
MixerControl->Bounds.dwMaximum = NodesCount - 1;
|
||||||
|
MixerControl->Metrics.dwReserved[0] = NodesCount;
|
||||||
|
MixerControl->cMultipleItems = NodesCount;
|
||||||
|
MixerControl->fdwControl |= MIXERCONTROL_CONTROLF_MULTIPLE;
|
||||||
|
}
|
||||||
|
else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
|
||||||
|
{
|
||||||
|
MixerControl->Bounds.dwMinimum = 0;
|
||||||
|
MixerControl->Bounds.dwMaximum = 1;
|
||||||
|
}
|
||||||
|
else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_ONOFF)
|
||||||
|
{
|
||||||
|
/* only needs to set bounds */
|
||||||
|
MixerControl->Bounds.dwMinimum = 0;
|
||||||
|
MixerControl->Bounds.dwMaximum = 1;
|
||||||
|
}
|
||||||
|
else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
|
||||||
{
|
{
|
||||||
KSNODEPROPERTY_AUDIO_CHANNEL Property;
|
KSNODEPROPERTY_AUDIO_CHANNEL Property;
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
|
@ -133,6 +139,10 @@ MMixerAddMixerControl(
|
||||||
PKSPROPERTY_MEMBERSHEADER Members;
|
PKSPROPERTY_MEMBERSHEADER Members;
|
||||||
PKSPROPERTY_STEPPING_LONG Range;
|
PKSPROPERTY_STEPPING_LONG Range;
|
||||||
|
|
||||||
|
MixerControl->Bounds.dwMinimum = 0;
|
||||||
|
MixerControl->Bounds.dwMaximum = 0xFFFF;
|
||||||
|
MixerControl->Metrics.cSteps = 0xC0; /* FIXME */
|
||||||
|
|
||||||
Length = sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG);
|
Length = sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG);
|
||||||
Desc = (PKSPROPERTY_DESCRIPTION)MixerContext->Alloc(Length);
|
Desc = (PKSPROPERTY_DESCRIPTION)MixerContext->Alloc(Length);
|
||||||
ASSERT(Desc);
|
ASSERT(Desc);
|
||||||
|
@ -142,7 +152,7 @@ MMixerAddMixerControl(
|
||||||
|
|
||||||
Property.NodeProperty.NodeId = NodeIndex;
|
Property.NodeProperty.NodeId = NodeIndex;
|
||||||
Property.NodeProperty.Property.Id = KSPROPERTY_AUDIO_VOLUMELEVEL;
|
Property.NodeProperty.Property.Id = KSPROPERTY_AUDIO_VOLUMELEVEL;
|
||||||
Property.NodeProperty.Property.Flags = KSPROPERTY_TYPE_BASICSUPPORT;
|
Property.NodeProperty.Property.Flags = KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_TOPOLOGY;
|
||||||
Property.NodeProperty.Property.Set = KSPROPSETID_Audio;
|
Property.NodeProperty.Property.Set = KSPROPSETID_Audio;
|
||||||
|
|
||||||
/* get node volume level info */
|
/* get node volume level info */
|
||||||
|
|
|
@ -27,6 +27,7 @@ typedef struct __TOPOLOGY_NODE__
|
||||||
|
|
||||||
ULONG NodeConnectedFromCount;
|
ULONG NodeConnectedFromCount;
|
||||||
struct __TOPOLOGY_NODE__ ** NodeConnectedFrom;
|
struct __TOPOLOGY_NODE__ ** NodeConnectedFrom;
|
||||||
|
PULONG LogicalPinNodeConnectedFrom;
|
||||||
|
|
||||||
ULONG PinConnectedFromCount;
|
ULONG PinConnectedFromCount;
|
||||||
PULONG PinConnectedFrom;
|
PULONG PinConnectedFrom;
|
||||||
|
@ -54,6 +55,7 @@ typedef struct
|
||||||
ULONG PinConnectedToCount;
|
ULONG PinConnectedToCount;
|
||||||
PULONG PinConnectedTo;
|
PULONG PinConnectedTo;
|
||||||
|
|
||||||
|
|
||||||
ULONG Visited;
|
ULONG Visited;
|
||||||
}PIN, *PPIN;
|
}PIN, *PPIN;
|
||||||
|
|
||||||
|
|
|
@ -264,7 +264,9 @@ MMixerHandleNodeToNodeConnection(
|
||||||
{
|
{
|
||||||
PTOPOLOGY_NODE InNode, OutNode;
|
PTOPOLOGY_NODE InNode, OutNode;
|
||||||
PTOPOLOGY_NODE * NewNodes;
|
PTOPOLOGY_NODE * NewNodes;
|
||||||
|
PULONG NewLogicalPinNodeConnectedFrom;
|
||||||
ULONG Count;
|
ULONG Count;
|
||||||
|
ULONG LogicalPinId;
|
||||||
|
|
||||||
/* sanity checks */
|
/* sanity checks */
|
||||||
ASSERT(Topology->TopologyNodesCount > Connection->ToNode);
|
ASSERT(Topology->TopologyNodesCount > Connection->ToNode);
|
||||||
|
@ -274,6 +276,9 @@ MMixerHandleNodeToNodeConnection(
|
||||||
InNode = &Topology->TopologyNodes[Connection->FromNode];
|
InNode = &Topology->TopologyNodes[Connection->FromNode];
|
||||||
OutNode = &Topology->TopologyNodes[Connection->ToNode];
|
OutNode = &Topology->TopologyNodes[Connection->ToNode];
|
||||||
|
|
||||||
|
/* get logical pin node id */
|
||||||
|
LogicalPinId = Connection->ToNodePin;
|
||||||
|
|
||||||
/* get existing count */
|
/* get existing count */
|
||||||
Count = OutNode->NodeConnectedFromCount;
|
Count = OutNode->NodeConnectedFromCount;
|
||||||
|
|
||||||
|
@ -286,21 +291,42 @@ MMixerHandleNodeToNodeConnection(
|
||||||
return MM_STATUS_NO_MEMORY;
|
return MM_STATUS_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* allocate logical pin nodes array */
|
||||||
|
NewLogicalPinNodeConnectedFrom = MixerContext->Alloc((Count + 1) * sizeof(ULONG));
|
||||||
|
if (!NewLogicalPinNodeConnectedFrom)
|
||||||
|
{
|
||||||
|
/* out of memory */
|
||||||
|
MixerContext->Free(NewNodes);
|
||||||
|
return MM_STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
if (Count)
|
if (Count)
|
||||||
{
|
{
|
||||||
/* copy existing nodes */
|
/* copy existing nodes */
|
||||||
MixerContext->Copy(NewNodes, OutNode->NodeConnectedFrom, sizeof(PTOPOLOGY) * Count);
|
MixerContext->Copy(NewNodes, OutNode->NodeConnectedFrom, sizeof(PTOPOLOGY) * Count);
|
||||||
|
|
||||||
|
/* copy existing logical pin node array */
|
||||||
|
MixerContext->Copy(NewLogicalPinNodeConnectedFrom, OutNode->LogicalPinNodeConnectedFrom, sizeof(ULONG) * Count);
|
||||||
|
|
||||||
/* release old nodes array */
|
/* release old nodes array */
|
||||||
MixerContext->Free(OutNode->NodeConnectedFrom);
|
MixerContext->Free(OutNode->NodeConnectedFrom);
|
||||||
|
|
||||||
|
/* release old logical pin node array */
|
||||||
|
MixerContext->Free(OutNode->LogicalPinNodeConnectedFrom);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add new topology node */
|
/* add new topology node */
|
||||||
NewNodes[OutNode->NodeConnectedFromCount] = InNode;
|
NewNodes[OutNode->NodeConnectedFromCount] = InNode;
|
||||||
|
|
||||||
|
/* add logical node id */
|
||||||
|
NewLogicalPinNodeConnectedFrom[OutNode->NodeConnectedFromCount] = LogicalPinId;
|
||||||
|
|
||||||
/* replace old nodes array */
|
/* replace old nodes array */
|
||||||
OutNode->NodeConnectedFrom = NewNodes;
|
OutNode->NodeConnectedFrom = NewNodes;
|
||||||
|
|
||||||
|
/* replace old logical pin node array */
|
||||||
|
OutNode->LogicalPinNodeConnectedFrom = NewLogicalPinNodeConnectedFrom;
|
||||||
|
|
||||||
/* increment nodes count */
|
/* increment nodes count */
|
||||||
OutNode->NodeConnectedFromCount++;
|
OutNode->NodeConnectedFromCount++;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue