mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
[MMIXER]
- Store initialized mixers in a struct MIXER_LIST - Implement MMixerGetCapabilities svn path=/trunk/; revision=44479
This commit is contained in:
parent
3af3194bbc
commit
757fd23400
5 changed files with 244 additions and 19 deletions
|
@ -781,6 +781,7 @@ MMixerHandlePhysicalConnection(
|
|||
MIXER_STATUS
|
||||
MMixerInitializeFilter(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_LIST MixerList,
|
||||
IN HANDLE hMixer,
|
||||
IN LPWSTR DeviceName,
|
||||
IN PKSMULTIPLE_ITEM NodeTypes,
|
||||
|
@ -866,9 +867,9 @@ MMixerInitializeFilter(
|
|||
}
|
||||
MixerContext->Free(Pins);
|
||||
|
||||
//FIXME
|
||||
// store MixerInfo in context
|
||||
|
||||
// store mixer info in list
|
||||
InsertTailList(&MixerList->MixerList, &MixerInfo->Entry);
|
||||
MixerList->MixerListCount++;
|
||||
|
||||
// done
|
||||
return Status;
|
||||
|
@ -876,7 +877,8 @@ MMixerInitializeFilter(
|
|||
|
||||
MIXER_STATUS
|
||||
MMixerSetupFilter(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_LIST MixerList,
|
||||
IN HANDLE hMixer,
|
||||
IN PULONG DeviceCount,
|
||||
IN LPWSTR DeviceName)
|
||||
|
@ -913,7 +915,7 @@ MMixerSetupFilter(
|
|||
if (NodeIndex != MAXULONG)
|
||||
{
|
||||
// it has
|
||||
Status = MMixerInitializeFilter(MixerContext, hMixer, DeviceName, NodeTypes, NodeConnections, PinCount, NodeIndex, FALSE);
|
||||
Status = MMixerInitializeFilter(MixerContext, MixerList, hMixer, DeviceName, NodeTypes, NodeConnections, PinCount, NodeIndex, FALSE);
|
||||
|
||||
// check for success
|
||||
if (Status == MM_STATUS_SUCCESS)
|
||||
|
@ -929,7 +931,7 @@ MMixerSetupFilter(
|
|||
if (NodeIndex != MAXULONG)
|
||||
{
|
||||
// it has
|
||||
Status = MMixerInitializeFilter(MixerContext, hMixer, DeviceName, NodeTypes, NodeConnections, PinCount, NodeIndex, TRUE);
|
||||
Status = MMixerInitializeFilter(MixerContext, MixerList, hMixer, DeviceName, NodeTypes, NodeConnections, PinCount, NodeIndex, TRUE);
|
||||
|
||||
// check for success
|
||||
if (Status == MM_STATUS_SUCCESS)
|
||||
|
|
|
@ -10,6 +10,169 @@
|
|||
|
||||
#include "priv.h"
|
||||
|
||||
ULONG
|
||||
MMixerGetCount(
|
||||
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 number of mixers
|
||||
return MixerList->MixerListCount;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetCapabilities(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG MixerIndex,
|
||||
OUT LPMIXERCAPSW MixerCaps)
|
||||
{
|
||||
MIXER_STATUS Status;
|
||||
LPMIXER_INFO MixerInfo;
|
||||
|
||||
// verify mixer context
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
// invalid context passed
|
||||
return Status;
|
||||
}
|
||||
|
||||
// get mixer info
|
||||
MixerInfo = MMixerGetMixerInfoByIndex(MixerContext, MixerIndex);
|
||||
|
||||
if (!MixerInfo)
|
||||
{
|
||||
// invalid device index
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
MixerCaps->wMid = MixerInfo->MixCaps.wMid;
|
||||
MixerCaps->wPid = MixerInfo->MixCaps.wPid;
|
||||
MixerCaps->vDriverVersion = MixerInfo->MixCaps.vDriverVersion;
|
||||
MixerCaps->fdwSupport = MixerInfo->MixCaps.fdwSupport;
|
||||
MixerCaps->cDestinations = MixerInfo->MixCaps.cDestinations;
|
||||
wcscpy(MixerCaps->szPname, MixerInfo->MixCaps.szPname);
|
||||
|
||||
return MM_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerOpen(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PVOID MixerEvent,
|
||||
IN PMIXER_EVENT MixerEventRoutine,
|
||||
OUT PHANDLE MixerHandle)
|
||||
{
|
||||
MIXER_STATUS Status;
|
||||
|
||||
// verify mixer context
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
// invalid context passed
|
||||
return Status;
|
||||
}
|
||||
|
||||
return MM_STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetLineInfo(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERLINEW MixerLine)
|
||||
{
|
||||
MIXER_STATUS Status;
|
||||
|
||||
// verify mixer context
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
// invalid context passed
|
||||
return Status;
|
||||
}
|
||||
return MM_STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetLineControls(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERLINECONTROLS MixerLineControls)
|
||||
{
|
||||
MIXER_STATUS Status;
|
||||
|
||||
// verify mixer context
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
// invalid context passed
|
||||
return Status;
|
||||
}
|
||||
|
||||
return MM_STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerSetControlDetails(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERCONTROLDETAILS MixerControlDetails)
|
||||
{
|
||||
MIXER_STATUS Status;
|
||||
|
||||
// verify mixer context
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
// invalid context passed
|
||||
return Status;
|
||||
}
|
||||
return MM_STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetControlDetails(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERCONTROLDETAILS MixerControlDetails)
|
||||
{
|
||||
MIXER_STATUS Status;
|
||||
|
||||
// verify mixer context
|
||||
Status = MMixerVerifyContext(MixerContext);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
{
|
||||
// invalid context passed
|
||||
return Status;
|
||||
}
|
||||
|
||||
return MM_STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerInitialize(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
|
@ -20,6 +183,7 @@ MMixerInitialize(
|
|||
HANDLE hMixer;
|
||||
ULONG DeviceIndex, Count;
|
||||
LPWSTR DeviceName;
|
||||
PMIXER_LIST MixerList;
|
||||
|
||||
if (!MixerContext || !EnumFunction || !EnumContext)
|
||||
{
|
||||
|
@ -27,12 +191,23 @@ MMixerInitialize(
|
|||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free)
|
||||
if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open || !MixerContext->Close)
|
||||
{
|
||||
// invalid parameter
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
// allocate a mixer list
|
||||
MixerList = (PMIXER_LIST)MixerContext->Alloc(sizeof(MIXER_LIST));
|
||||
if (!MixerList)
|
||||
{
|
||||
// no memory
|
||||
return MM_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
//initialize mixer list
|
||||
MixerList->MixerListCount = 0;
|
||||
InitializeListHead(&MixerList->MixerList);
|
||||
|
||||
// start enumerating all available devices
|
||||
Count = 0;
|
||||
|
@ -59,7 +234,7 @@ MMixerInitialize(
|
|||
// increment device index
|
||||
DeviceIndex++;
|
||||
|
||||
Status = MMixerSetupFilter(MixerContext, hMixer, &Count, DeviceName);
|
||||
Status = MMixerSetupFilter(MixerContext, MixerList, hMixer, &Count, DeviceName);
|
||||
|
||||
if (Status != MM_STATUS_SUCCESS)
|
||||
break;
|
||||
|
@ -69,5 +244,3 @@ MMixerInitialize(
|
|||
// done
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -60,17 +60,12 @@ typedef struct
|
|||
PMIXER_CLOSE Close;
|
||||
}MIXER_CONTEXT, *PMIXER_CONTEXT;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerInitialize(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_ENUM EnumFunction,
|
||||
IN PVOID EnumContext);
|
||||
|
||||
|
||||
ULONG
|
||||
MMixerGetCount(
|
||||
IN PMIXER_CONTEXT MixerContext);
|
||||
|
@ -79,7 +74,7 @@ MIXER_STATUS
|
|||
MMixerGetCapabilities(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG MixerIndex,
|
||||
OUT MIXERCAPSW MixerCaps);
|
||||
OUT LPMIXERCAPSW MixerCaps);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerOpen(
|
||||
|
@ -90,24 +85,28 @@ MMixerOpen(
|
|||
|
||||
MIXER_STATUS
|
||||
MMixerGetLineInfo(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERLINEW MixerLine);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetLineControls(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERLINECONTROLS MixerLineControls);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerSetControlDetails(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERCONTROLDETAILS MixerControlDetails);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerGetControlDetails(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN HANDLE MixerHandle,
|
||||
IN ULONG Flags,
|
||||
OUT LPMIXERCONTROLDETAILS MixerControlDetails);
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
typedef struct
|
||||
{
|
||||
LIST_ENTRY Entry;
|
||||
MIXERCAPSW MixCaps;
|
||||
HANDLE hMixer;
|
||||
LIST_ENTRY LineList;
|
||||
|
@ -52,6 +53,11 @@ typedef struct
|
|||
PLONG Values;
|
||||
}MIXERVOLUME_DATA, *LPMIXERVOLUME_DATA;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ULONG MixerListCount;
|
||||
LIST_ENTRY MixerList;
|
||||
}MIXER_LIST, *PMIXER_LIST;
|
||||
|
||||
#define DESTINATION_LINE 0xFFFF0000
|
||||
|
||||
|
@ -125,7 +131,8 @@ MMixerGetIndexOfGuid(
|
|||
|
||||
MIXER_STATUS
|
||||
MMixerSetupFilter(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN PMIXER_LIST MixerList,
|
||||
IN HANDLE hMixer,
|
||||
IN PULONG DeviceCount,
|
||||
IN LPWSTR DeviceName);
|
||||
|
@ -148,4 +155,14 @@ MMixerGetControlsFromPin(
|
|||
IN ULONG bUpDirection,
|
||||
OUT PULONG Nodes);
|
||||
|
||||
MIXER_STATUS
|
||||
MMixerVerifyContext(
|
||||
IN PMIXER_CONTEXT MixerContext);
|
||||
|
||||
LPMIXER_INFO
|
||||
MMixerGetMixerInfoByIndex(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG MixerIndex);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -17,7 +17,7 @@ MMixerVerifyContext(
|
|||
if (MixerContext->SizeOfStruct != sizeof(MIXER_CONTEXT))
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
|
||||
if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free)
|
||||
if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open || !MixerContext->Close)
|
||||
return MM_STATUS_INVALID_PARAMETER;
|
||||
|
||||
if (!MixerContext->MixerContext)
|
||||
|
@ -38,6 +38,40 @@ MMixerFreeMixerInfo(
|
|||
MixerContext->Free((PVOID)MixerInfo);
|
||||
}
|
||||
|
||||
LPMIXER_INFO
|
||||
MMixerGetMixerInfoByIndex(
|
||||
IN PMIXER_CONTEXT MixerContext,
|
||||
IN ULONG MixerIndex)
|
||||
{
|
||||
LPMIXER_INFO MixerInfo;
|
||||
PLIST_ENTRY Entry;
|
||||
PMIXER_LIST MixerList;
|
||||
ULONG Index = 0;
|
||||
|
||||
// get mixer list
|
||||
MixerList = (PMIXER_LIST)MixerContext->MixerContext;
|
||||
|
||||
if (!MixerList->MixerListCount)
|
||||
return NULL;
|
||||
|
||||
Entry = MixerList->MixerList.Flink;
|
||||
|
||||
while(Entry != &MixerList->MixerList)
|
||||
{
|
||||
MixerInfo = (LPMIXER_INFO)CONTAINING_RECORD(Entry, MIXER_INFO, Entry);
|
||||
|
||||
if (Index == MixerIndex)
|
||||
return MixerInfo;
|
||||
|
||||
// move to next mixer entry
|
||||
Index++;
|
||||
Entry = Entry->Flink;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
LPMIXERLINE_EXT
|
||||
MMixerGetSourceMixerLineByLineId(
|
||||
LPMIXER_INFO MixerInfo,
|
||||
|
|
Loading…
Reference in a new issue