diff --git a/sdk/lib/drivers/sound/mmixer/controls.c b/sdk/lib/drivers/sound/mmixer/controls.c index ad500360c44..84c5fe00e96 100644 --- a/sdk/lib/drivers/sound/mmixer/controls.c +++ b/sdk/lib/drivers/sound/mmixer/controls.c @@ -159,6 +159,7 @@ MMixerAddMixerControl( PKSPROPERTY_DESCRIPTION Desc; PKSPROPERTY_MEMBERSHEADER Members; PKSPROPERTY_STEPPING_LONG Range; + LPMIXERVOLUME_DATA VolumeData; MixerControl->Control.Bounds.dwMinimum = 0; MixerControl->Control.Bounds.dwMaximum = 0xFFFF; @@ -179,54 +180,38 @@ MMixerAddMixerControl( /* get node volume level info */ Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), Desc, Length, &BytesReturned); + VolumeData = (LPMIXERVOLUME_DATA)MixerContext->Alloc(sizeof(*VolumeData)); + if (!VolumeData) + return MM_STATUS_NO_MEMORY; + if (Status == MM_STATUS_SUCCESS) { - LPMIXERVOLUME_DATA VolumeData; - ULONG Steps, MaxRange, Index; - LONG Value; - Members = (PKSPROPERTY_MEMBERSHEADER)(Desc + 1); Range = (PKSPROPERTY_STEPPING_LONG)(Members + 1); DPRINT("NodeIndex %u Range Min %d Max %d Steps %x UMin %x UMax %x\n", NodeIndex, Range->Bounds.SignedMinimum, Range->Bounds.SignedMaximum, Range->SteppingDelta, Range->Bounds.UnsignedMinimum, Range->Bounds.UnsignedMaximum); - MaxRange = Range->Bounds.UnsignedMaximum - Range->Bounds.UnsignedMinimum; + /* Store mixer control info there */ + VolumeData->Header.dwControlID = MixerControl->Control.dwControlID; + VolumeData->SignedMinimum = Range->Bounds.SignedMinimum; + VolumeData->SignedMaximum = Range->Bounds.SignedMaximum; - if (MaxRange) + /* Fallback to defaults if: 1) the range is not defined (typically is 0) */ + if (VolumeData->SignedMinimum == VolumeData->SignedMaximum) { - ASSERT(MaxRange); - VolumeData = (LPMIXERVOLUME_DATA)MixerContext->Alloc(sizeof(MIXERVOLUME_DATA)); - if (!VolumeData) - return MM_STATUS_NO_MEMORY; - - Steps = MaxRange / Range->SteppingDelta + 1; - - /* store mixer control info there */ - VolumeData->Header.dwControlID = MixerControl->Control.dwControlID; - VolumeData->SignedMaximum = Range->Bounds.SignedMaximum; - VolumeData->SignedMinimum = Range->Bounds.SignedMinimum; - VolumeData->SteppingDelta = Range->SteppingDelta; - VolumeData->ValuesCount = Steps; - VolumeData->InputSteppingDelta = 0x10000 / Steps; - - VolumeData->Values = (PLONG)MixerContext->Alloc(sizeof(LONG) * Steps); - if (!VolumeData->Values) - { - MixerContext->Free(Desc); - MixerContext->Free(VolumeData); - return MM_STATUS_NO_MEMORY; - } - - Value = Range->Bounds.SignedMinimum; - for (Index = 0; Index < Steps; Index++) - { - VolumeData->Values[Index] = Value; - Value += Range->SteppingDelta; - } - MixerControl->ExtraData = VolumeData; - } - } - MixerContext->Free(Desc); + VolumeData->SignedMinimum = -96 * 0x10000; // -96 DB + VolumeData->SignedMaximum = 0; // 0 DB + } + } + else + { + /* or 2) when some failure occurs */ + VolumeData->Header.dwControlID = MixerControl->Control.dwControlID; + VolumeData->SignedMinimum = -96 * 0x10000; // -96 DB + VolumeData->SignedMaximum = 0; // 0 DB + } + MixerControl->ExtraData = VolumeData; + MixerContext->Free(Desc); } DPRINT("Status %x Name %S\n", Status, MixerControl->Control.szName); diff --git a/sdk/lib/drivers/sound/mmixer/precomp.h b/sdk/lib/drivers/sound/mmixer/precomp.h index 4ffc3f7129b..609936d918e 100644 --- a/sdk/lib/drivers/sound/mmixer/precomp.h +++ b/sdk/lib/drivers/sound/mmixer/precomp.h @@ -102,10 +102,6 @@ typedef struct MIXERCONTROL_DATA Header; LONG SignedMinimum; LONG SignedMaximum; - LONG SteppingDelta; - ULONG InputSteppingDelta; - ULONG ValuesCount; - PLONG Values; }MIXERVOLUME_DATA, *LPMIXERVOLUME_DATA; typedef struct diff --git a/sdk/lib/drivers/sound/mmixer/sup.c b/sdk/lib/drivers/sound/mmixer/sup.c index 27e26ba4bb2..c511bcef89f 100644 --- a/sdk/lib/drivers/sound/mmixer/sup.c +++ b/sdk/lib/drivers/sound/mmixer/sup.c @@ -315,23 +315,6 @@ MMixerGetMixerControlById( return MM_STATUS_UNSUCCESSFUL; } -ULONG -MMixerGetVolumeControlIndex( - LPMIXERVOLUME_DATA VolumeData, - LONG Value) -{ - ULONG Index; - - for(Index = 0; Index < VolumeData->ValuesCount; Index++) - { - if (VolumeData->Values[Index] > Value) - { - return VolumeData->InputSteppingDelta * Index; - } - } - return VolumeData->InputSteppingDelta * (VolumeData->ValuesCount-1); -} - VOID MMixerNotifyControlChange( IN PMIXER_CONTEXT MixerContext, @@ -672,8 +655,8 @@ MMixerSetGetVolumeControlDetails( LPMIXERLINE_EXT MixerLine) { LPMIXERCONTROLDETAILS_UNSIGNED Input; - LONG Value; - ULONG Index, Channel; + LONG MaxRange, Value; + ULONG Channel; MIXER_STATUS Status; LPMIXERVOLUME_DATA VolumeData; @@ -689,21 +672,17 @@ MMixerSetGetVolumeControlDetails( if (!Input) return MM_STATUS_UNSUCCESSFUL; /* To prevent dereferencing NULL */ + /* Get maximum available range */ + MaxRange = VolumeData->SignedMaximum - VolumeData->SignedMinimum; + /* Loop for each channel */ for (Channel = 0; Channel < MixerControlDetails->cChannels; Channel++) { if (bSet) { /* FIXME SEH */ - Index = Input[Channel].dwValue / VolumeData->InputSteppingDelta; - - if (Index >= VolumeData->ValuesCount) - { - DPRINT1("Index %u out of bounds %u \n", Index, VolumeData->ValuesCount); - return MM_STATUS_INVALID_PARAMETER; - } - - Value = VolumeData->Values[Index]; + /* Convert from logical units to hardware range (DB) */ + Value = (LONG)((INT64)Input[Channel].dwValue * MaxRange / 0x10000 + VolumeData->SignedMinimum); } /* Get/set control details */ @@ -712,7 +691,8 @@ MMixerSetGetVolumeControlDetails( if (!bSet) { /* FIXME SEH */ - Input[Channel].dwValue = MMixerGetVolumeControlIndex(VolumeData, Value); + /* Convert from hardware range (DB) to logical units */ + Input[Channel].dwValue = (ULONG)(((INT64)Value - VolumeData->SignedMinimum + 1) * 0x10000 / MaxRange); } }