- 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:
Johannes Anderwald 2010-01-02 01:52:12 +00:00
parent 0926ed6652
commit c42d9f27cc
5 changed files with 108 additions and 5 deletions

View file

@ -853,6 +853,7 @@ MMixerInitializeFilter(
// initialize line list
InitializeListHead(&MixerInfo->LineList);
InitializeListHead(&MixerInfo->EventList);
// now allocate an array which will receive the indices of the pin
// which has a ADC / DAC nodetype in its path
@ -1075,3 +1076,79 @@ MMixerSetupFilter(
// done
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;
}

View file

@ -100,6 +100,9 @@ MMixerOpen(
// FIXME
// handle event notification
Status = MMixerAddEvents(MixerContext, MixerInfo);
// store result
*MixerHandle = (HANDLE)MixerInfo;
@ -163,7 +166,7 @@ MMixerGetLineInfo(
return MM_STATUS_INVALID_PARAMETER;
}
MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwSource);
MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwSource * 0x10000);
if (MixerLineSrc)
{
DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName);
@ -422,7 +425,8 @@ MMixerInitialize(
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)
{
// invalid parameter

View file

@ -69,6 +69,12 @@ typedef MIXER_STATUS(*PMIXER_OPEN_KEY)(
IN ULONG DesiredAccess,
OUT PHANDLE OutKey);
typedef PVOID (*PMIXER_ALLOC_EVENT_DATA)(
IN ULONG ExtraBytes);
typedef VOID (*PMIXER_FREE_EVENT_DATA)(
IN PVOID EventData);
typedef struct
{
ULONG SizeOfStruct;
@ -83,6 +89,8 @@ typedef struct
PMIXER_OPEN_KEY OpenKey;
PMIXER_QUERY_KEY_VALUE QueryKeyValue;
PMIXER_CLOSEKEY CloseKey;
PMIXER_ALLOC_EVENT_DATA AllocEventData;
PMIXER_FREE_EVENT_DATA FreeEventData;
}MIXER_CONTEXT, *PMIXER_CONTEXT;
MIXER_STATUS

View file

@ -15,9 +15,15 @@
#include "mmixer.h"
#include <stdio.h>
#define YDEBUG
#include <debug.h>
typedef struct
{
KSEVENTDATA EventData;
LIST_ENTRY Entry;
}EVENT_ITEM, *LPEVENT_ITEM;
typedef struct
{
LIST_ENTRY Entry;
@ -25,6 +31,7 @@ typedef struct
HANDLE hMixer;
LIST_ENTRY LineList;
ULONG ControlId;
LIST_ENTRY EventList;
}MIXER_INFO, *LPMIXER_INFO;
typedef struct
@ -268,4 +275,9 @@ MMixerInitializeWaveInfo(
IN ULONG bWaveIn,
IN ULONG PinId);
MIXER_STATUS
MMixerAddEvents(
IN PMIXER_CONTEXT MixerContext,
IN OUT LPMIXER_INFO MixerInfo);
#endif

View file

@ -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_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 KSEVENTSETID_AudioControlChange = {0xE85E9698L, 0xFA2F, 0x11D1, {0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}};
MIXER_STATUS
MMixerVerifyContext(
@ -37,7 +38,8 @@ MMixerVerifyContext(
if (MixerContext->SizeOfStruct != sizeof(MIXER_CONTEXT))
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)
return MM_STATUS_INVALID_PARAMETER;
@ -129,7 +131,7 @@ MMixerGetSourceMixerLineByLineId(
while(Entry != &MixerInfo->LineList)
{
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)
return MixerLineSrc;