Index: sdk/lib/drivers/sound/mmixer/controls.c =================================================================== --- sdk/lib/drivers/sound/mmixer/controls.c (révision 74296) +++ sdk/lib/drivers/sound/mmixer/controls.c (copie de travail) @@ -1731,7 +1731,7 @@ //ULONG BytesReturned; //MIXER_STATUS Status; - EventData = (PEVENT_NOTIFICATION_ENTRY)MixerContext->AllocEventData(sizeof(EVENT_NOTIFICATION_ENTRY)); + EventData = (PEVENT_NOTIFICATION_ENTRY)MixerContext->Alloc(sizeof(EVENT_NOTIFICATION_ENTRY)); if (!EventData) { /* not enough memory */ @@ -1764,3 +1764,31 @@ InsertTailList(&MixerInfo->EventList, &EventData->Entry); return MM_STATUS_SUCCESS; } + +MIXER_STATUS +MMixerRemoveEvent( + IN PMIXER_CONTEXT MixerContext, + IN OUT LPMIXER_INFO MixerInfo, + IN PVOID MixerEventContext, + IN PMIXER_EVENT MixerEventRoutine) +{ + PLIST_ENTRY EventList; + PEVENT_NOTIFICATION_ENTRY NotificationEntry; + + /* Lookup through mixers */ + EventList = MixerInfo->EventList.Flink; + while(EventList != &MixerInfo->EventList) + { + NotificationEntry = (PEVENT_NOTIFICATION_ENTRY)CONTAINING_RECORD(EventList, EVENT_NOTIFICATION_ENTRY, Entry); + EventList = EventList->Flink; + if(NotificationEntry->MixerEventRoutine == MixerEventRoutine && + NotificationEntry->MixerEventContext == MixerEventContext) + { + DPRINT1("Freeing entry %p\n", NotificationEntry); + /* We found the event to remove */ + RemoveEntryList(&NotificationEntry->Entry); + MixerContext->Free(NotificationEntry); + } + } + return MM_STATUS_SUCCESS; +} Index: sdk/lib/drivers/sound/mmixer/mixer.c =================================================================== --- sdk/lib/drivers/sound/mmixer/mixer.c (révision 74296) +++ sdk/lib/drivers/sound/mmixer/mixer.c (copie de travail) @@ -113,6 +113,40 @@ } MIXER_STATUS +MMixerClose( + IN PMIXER_CONTEXT MixerContext, + IN ULONG MixerId, + IN PVOID MixerEventContext, + IN PMIXER_EVENT MixerEventRoutine) +{ + MIXER_STATUS Status; + LPMIXER_INFO MixerInfo; + + /* verify mixer context */ + Status = MMixerVerifyContext(MixerContext); + + if (Status != MM_STATUS_SUCCESS) + { + /* invalid context passed */ + DPRINT1("invalid context\n"); + return Status; + } + + /* get mixer info */ + MixerInfo = (LPMIXER_INFO)MMixerGetMixerInfoByIndex(MixerContext, MixerId); + if (!MixerInfo) + { + /* invalid mixer id */ + DPRINT1("invalid mixer id %lu\n", MixerId); + return MM_STATUS_INVALID_PARAMETER; + } + + /* remove event from list */ + Status = MMixerRemoveEvent(MixerContext, MixerInfo, MixerEventContext, MixerEventRoutine); + return MM_STATUS_SUCCESS; +} + +MIXER_STATUS MMixerGetLineInfo( IN PMIXER_CONTEXT MixerContext, IN HANDLE MixerHandle, Index: sdk/lib/drivers/sound/mmixer/mmixer.h =================================================================== --- sdk/lib/drivers/sound/mmixer/mmixer.h (révision 74296) +++ sdk/lib/drivers/sound/mmixer/mmixer.h (copie de travail) @@ -147,6 +147,13 @@ OUT PHANDLE MixerHandle); MIXER_STATUS +MMixerClose( + IN PMIXER_CONTEXT MixerContext, + IN ULONG MixerId, + IN PVOID MixerEventContext, + IN PMIXER_EVENT MixerEventRoutine); + +MIXER_STATUS MMixerGetLineInfo( IN PMIXER_CONTEXT MixerContext, IN HANDLE MixerHandle, Index: sdk/lib/drivers/sound/mmixer/precomp.h =================================================================== --- sdk/lib/drivers/sound/mmixer/precomp.h (révision 74296) +++ sdk/lib/drivers/sound/mmixer/precomp.h (copie de travail) @@ -353,6 +353,13 @@ IN PMIXER_EVENT MixerEventRoutine); MIXER_STATUS +MMixerRemoveEvent( + IN PMIXER_CONTEXT MixerContext, + IN OUT LPMIXER_INFO MixerInfo, + IN PVOID MixerEventContext, + IN PMIXER_EVENT MixerEventRoutine); + +MIXER_STATUS MMixerGetDeviceName( IN PMIXER_CONTEXT MixerContext, OUT LPWSTR DeviceName, Index: drivers/wdm/audio/legacy/wdmaud/control.c =================================================================== --- drivers/wdm/audio/legacy/wdmaud/control.c (révision 74296) +++ drivers/wdm/audio/legacy/wdmaud/control.c (copie de travail) @@ -166,11 +166,8 @@ } else if (ClientInfo->hPins[Index].Handle == DeviceInfo->hDevice && ClientInfo->hPins[Index].Type == MIXER_DEVICE_TYPE) { - if (ClientInfo->hPins[Index].NotifyEvent) - { - ObDereferenceObject(ClientInfo->hPins[Index].NotifyEvent); - ClientInfo->hPins[Index].NotifyEvent = NULL; - } + DPRINT1("Closing mixer %p\n", DeviceInfo->hDevice); + return WdmAudControlCloseMixer(DeviceObject, Irp, DeviceInfo, ClientInfo, Index); } } Index: drivers/wdm/audio/legacy/wdmaud/mmixer.c =================================================================== --- drivers/wdm/audio/legacy/wdmaud/mmixer.c (révision 74296) +++ drivers/wdm/audio/legacy/wdmaud/mmixer.c (copie de travail) @@ -467,6 +467,33 @@ NTSTATUS NTAPI +WdmAudControlCloseMixer( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo, + IN ULONG Index) +{ + /* Remove event associated to this client */ + if (MMixerClose(&MixerContext, DeviceInfo->DeviceIndex, ClientInfo, EventCallback)) + { + DPRINT1("Failed to close mixer\n"); + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); + } + + /* Dereference event */ + if (ClientInfo->hPins[Index].NotifyEvent) + { + ObDereferenceObject(ClientInfo->hPins[Index].NotifyEvent); + ClientInfo->hPins[Index].NotifyEvent = NULL; + } + + /* FIXME: do we need to free ClientInfo->hPins ? */ + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); +} + +NTSTATUS +NTAPI WdmAudGetControlDetails( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, Index: drivers/wdm/audio/legacy/wdmaud/wdmaud.h =================================================================== --- drivers/wdm/audio/legacy/wdmaud/wdmaud.h (révision 74296) +++ drivers/wdm/audio/legacy/wdmaud/wdmaud.h (copie de travail) @@ -129,6 +129,15 @@ IN PWDMAUD_CLIENT ClientInfo); NTSTATUS +NTAPI +WdmAudControlCloseMixer( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo, + IN ULONG Index); + +NTSTATUS WdmAudControlOpenWave( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp,