mirror of
https://github.com/reactos/reactos.git
synced 2025-05-19 17:14:32 +00:00
[MMIXER]
- Implement registering hardware events (volume / mute control changes) - Fix a bug when querying a source mixer line. The wrong line id was passed which caused the call to fail. svn path=/trunk/; revision=44872
This commit is contained in:
parent
0926ed6652
commit
c42d9f27cc
5 changed files with 108 additions and 5 deletions
reactos/lib/drivers/sound/mmixer
|
@ -853,6 +853,7 @@ MMixerInitializeFilter(
|
||||||
|
|
||||||
// initialize line list
|
// initialize line list
|
||||||
InitializeListHead(&MixerInfo->LineList);
|
InitializeListHead(&MixerInfo->LineList);
|
||||||
|
InitializeListHead(&MixerInfo->EventList);
|
||||||
|
|
||||||
// now allocate an array which will receive the indices of the pin
|
// now allocate an array which will receive the indices of the pin
|
||||||
// which has a ADC / DAC nodetype in its path
|
// which has a ADC / DAC nodetype in its path
|
||||||
|
@ -1075,3 +1076,79 @@ MMixerSetupFilter(
|
||||||
// done
|
// done
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MIXER_STATUS
|
||||||
|
MMixerAddEvent(
|
||||||
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
IN OUT LPMIXER_INFO MixerInfo,
|
||||||
|
IN ULONG NodeId)
|
||||||
|
{
|
||||||
|
KSE_NODE Property;
|
||||||
|
LPEVENT_ITEM EventData;
|
||||||
|
ULONG BytesReturned;
|
||||||
|
MIXER_STATUS Status;
|
||||||
|
|
||||||
|
EventData = (LPEVENT_ITEM)MixerContext->AllocEventData(sizeof(LIST_ENTRY));
|
||||||
|
if (!EventData)
|
||||||
|
{
|
||||||
|
// not enough memory
|
||||||
|
return MM_STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* setup request */
|
||||||
|
Property.Event.Set = KSEVENTSETID_AudioControlChange;
|
||||||
|
Property.Event.Flags = KSEVENT_TYPE_TOPOLOGY|KSEVENT_TYPE_ENABLE;
|
||||||
|
Property.Event.Id = KSEVENT_CONTROL_CHANGE;
|
||||||
|
|
||||||
|
Property.NodeId = NodeId;
|
||||||
|
Property.Reserved = 0;
|
||||||
|
|
||||||
|
Status = MixerContext->Control(MixerInfo->hMixer, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSP_NODE), (PVOID)EventData, sizeof(KSEVENTDATA), &BytesReturned);
|
||||||
|
if (Status != MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
// failed to add event
|
||||||
|
MixerContext->FreeEventData(EventData);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//store event
|
||||||
|
InsertTailList(&MixerInfo->EventList, &EventData->Entry);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
MIXER_STATUS
|
||||||
|
MMixerAddEvents(
|
||||||
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
IN OUT LPMIXER_INFO MixerInfo)
|
||||||
|
{
|
||||||
|
PKSMULTIPLE_ITEM NodeTypes;
|
||||||
|
ULONG Index;
|
||||||
|
MIXER_STATUS Status;
|
||||||
|
LPGUID Guid;
|
||||||
|
|
||||||
|
// get filter node types
|
||||||
|
Status = MMixerGetFilterTopologyProperty(MixerContext, MixerInfo->hMixer, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes);
|
||||||
|
|
||||||
|
if (Status != MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
// failed
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Index = 0; Index < NodeTypes->Count; Index++)
|
||||||
|
{
|
||||||
|
Guid = MMixerGetNodeType(NodeTypes, Index);
|
||||||
|
if (IsEqualGUID(&KSNODETYPE_VOLUME, Guid) || IsEqualGUID(&KSNODETYPE_MUTE, Guid))
|
||||||
|
{
|
||||||
|
//add an event for volume / mute controls
|
||||||
|
//TODO: extra control types
|
||||||
|
MMixerAddEvent(MixerContext, MixerInfo, Index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// free node types
|
||||||
|
MixerContext->Free(NodeTypes);
|
||||||
|
|
||||||
|
return MM_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
|
@ -100,6 +100,9 @@ MMixerOpen(
|
||||||
// FIXME
|
// FIXME
|
||||||
// handle event notification
|
// handle event notification
|
||||||
|
|
||||||
|
Status = MMixerAddEvents(MixerContext, MixerInfo);
|
||||||
|
|
||||||
|
|
||||||
// store result
|
// store result
|
||||||
*MixerHandle = (HANDLE)MixerInfo;
|
*MixerHandle = (HANDLE)MixerInfo;
|
||||||
|
|
||||||
|
@ -163,7 +166,7 @@ MMixerGetLineInfo(
|
||||||
return MM_STATUS_INVALID_PARAMETER;
|
return MM_STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwSource);
|
MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwSource * 0x10000);
|
||||||
if (MixerLineSrc)
|
if (MixerLineSrc)
|
||||||
{
|
{
|
||||||
DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName);
|
DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName);
|
||||||
|
@ -423,6 +426,7 @@ MMixerInitialize(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open ||
|
if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open ||
|
||||||
|
!MixerContext->AllocEventData || !MixerContext->FreeEventData ||
|
||||||
!MixerContext->Close || !MixerContext->OpenKey || !MixerContext->QueryKeyValue || !MixerContext->CloseKey)
|
!MixerContext->Close || !MixerContext->OpenKey || !MixerContext->QueryKeyValue || !MixerContext->CloseKey)
|
||||||
{
|
{
|
||||||
// invalid parameter
|
// invalid parameter
|
||||||
|
|
|
@ -69,6 +69,12 @@ typedef MIXER_STATUS(*PMIXER_OPEN_KEY)(
|
||||||
IN ULONG DesiredAccess,
|
IN ULONG DesiredAccess,
|
||||||
OUT PHANDLE OutKey);
|
OUT PHANDLE OutKey);
|
||||||
|
|
||||||
|
typedef PVOID (*PMIXER_ALLOC_EVENT_DATA)(
|
||||||
|
IN ULONG ExtraBytes);
|
||||||
|
|
||||||
|
typedef VOID (*PMIXER_FREE_EVENT_DATA)(
|
||||||
|
IN PVOID EventData);
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
ULONG SizeOfStruct;
|
ULONG SizeOfStruct;
|
||||||
|
@ -83,6 +89,8 @@ typedef struct
|
||||||
PMIXER_OPEN_KEY OpenKey;
|
PMIXER_OPEN_KEY OpenKey;
|
||||||
PMIXER_QUERY_KEY_VALUE QueryKeyValue;
|
PMIXER_QUERY_KEY_VALUE QueryKeyValue;
|
||||||
PMIXER_CLOSEKEY CloseKey;
|
PMIXER_CLOSEKEY CloseKey;
|
||||||
|
PMIXER_ALLOC_EVENT_DATA AllocEventData;
|
||||||
|
PMIXER_FREE_EVENT_DATA FreeEventData;
|
||||||
}MIXER_CONTEXT, *PMIXER_CONTEXT;
|
}MIXER_CONTEXT, *PMIXER_CONTEXT;
|
||||||
|
|
||||||
MIXER_STATUS
|
MIXER_STATUS
|
||||||
|
|
|
@ -15,9 +15,15 @@
|
||||||
#include "mmixer.h"
|
#include "mmixer.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#define YDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
KSEVENTDATA EventData;
|
||||||
|
LIST_ENTRY Entry;
|
||||||
|
}EVENT_ITEM, *LPEVENT_ITEM;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
LIST_ENTRY Entry;
|
LIST_ENTRY Entry;
|
||||||
|
@ -25,6 +31,7 @@ typedef struct
|
||||||
HANDLE hMixer;
|
HANDLE hMixer;
|
||||||
LIST_ENTRY LineList;
|
LIST_ENTRY LineList;
|
||||||
ULONG ControlId;
|
ULONG ControlId;
|
||||||
|
LIST_ENTRY EventList;
|
||||||
}MIXER_INFO, *LPMIXER_INFO;
|
}MIXER_INFO, *LPMIXER_INFO;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -268,4 +275,9 @@ MMixerInitializeWaveInfo(
|
||||||
IN ULONG bWaveIn,
|
IN ULONG bWaveIn,
|
||||||
IN ULONG PinId);
|
IN ULONG PinId);
|
||||||
|
|
||||||
|
MIXER_STATUS
|
||||||
|
MMixerAddEvents(
|
||||||
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
IN OUT LPMIXER_INFO MixerInfo);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -29,6 +29,7 @@ const GUID KSPROPSETID_Audio = {0x45FFAAA0L, 0x6E1B, 0x11D0, {0xBC, 0xF2, 0x44,
|
||||||
const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
|
const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
|
||||||
const GUID KSPROPSETID_General = {0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
|
const GUID KSPROPSETID_General = {0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
|
||||||
const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
|
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}};
|
||||||
|
|
||||||
MIXER_STATUS
|
MIXER_STATUS
|
||||||
MMixerVerifyContext(
|
MMixerVerifyContext(
|
||||||
|
@ -38,6 +39,7 @@ MMixerVerifyContext(
|
||||||
return MM_STATUS_INVALID_PARAMETER;
|
return MM_STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open ||
|
if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open ||
|
||||||
|
!MixerContext->AllocEventData || !MixerContext->FreeEventData ||
|
||||||
!MixerContext->Close || !MixerContext->OpenKey || !MixerContext->QueryKeyValue || !MixerContext->CloseKey)
|
!MixerContext->Close || !MixerContext->OpenKey || !MixerContext->QueryKeyValue || !MixerContext->CloseKey)
|
||||||
return MM_STATUS_INVALID_PARAMETER;
|
return MM_STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
@ -129,7 +131,7 @@ MMixerGetSourceMixerLineByLineId(
|
||||||
while(Entry != &MixerInfo->LineList)
|
while(Entry != &MixerInfo->LineList)
|
||||||
{
|
{
|
||||||
MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry);
|
MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry);
|
||||||
DPRINT("dwLineID %x dwLineID %x\n", MixerLineSrc->Line.dwLineID, dwLineID);
|
DPRINT("dwLineID %x dwLineID %x MixerLineSrc %p\n", MixerLineSrc->Line.dwLineID, dwLineID, MixerLineSrc);
|
||||||
if (MixerLineSrc->Line.dwLineID == dwLineID)
|
if (MixerLineSrc->Line.dwLineID == dwLineID)
|
||||||
return MixerLineSrc;
|
return MixerLineSrc;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue