PMIXER_LIST MixerList;
MIXER_STATUS Status;
- // verify mixer context
+ /* verify mixer context */
Status = MMixerVerifyContext(MixerContext);
if (Status != MM_STATUS_SUCCESS)
{
- // invalid context passed
+ /* invalid context passed */
return Status;
}
- // grab mixer list
+ /* grab mixer list */
MixerList = (PMIXER_LIST)MixerContext->MixerContext;
// return number of mixers
MIXER_STATUS Status;
LPMIXER_INFO MixerInfo;
- // verify mixer context
+ /* verify mixer context */
Status = MMixerVerifyContext(MixerContext);
if (Status != MM_STATUS_SUCCESS)
{
- // invalid context passed
+ /* invalid context passed */
return Status;
}
- // get mixer info
+ /* get mixer info */
MixerInfo = MMixerGetMixerInfoByIndex(MixerContext, MixerIndex);
if (!MixerInfo)
MixerCaps->vDriverVersion = MixerInfo->MixCaps.vDriverVersion;
MixerCaps->fdwSupport = MixerInfo->MixCaps.fdwSupport;
MixerCaps->cDestinations = MixerInfo->MixCaps.cDestinations;
+
+ ASSERT(MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] == 0);
wcscpy(MixerCaps->szPname, MixerInfo->MixCaps.szPname);
return MM_STATUS_SUCCESS;
MMixerOpen(
IN PMIXER_CONTEXT MixerContext,
IN ULONG MixerId,
- IN PVOID MixerEvent,
+ IN PVOID MixerEventContext,
IN PMIXER_EVENT MixerEventRoutine,
OUT PHANDLE MixerHandle)
{
MIXER_STATUS Status;
LPMIXER_INFO MixerInfo;
- // verify mixer context
+ /* verify mixer context */
Status = MMixerVerifyContext(MixerContext);
if (Status != MM_STATUS_SUCCESS)
{
- // invalid context passed
+ /* invalid context passed */
+ DPRINT1("invalid context\n");
return Status;
}
+ /* get mixer info */
MixerInfo = (LPMIXER_INFO)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
if (!MixerInfo)
{
- // invalid mixer id
+ /* invalid mixer id */
+ DPRINT1("invalid mixer id %lu\n", MixerId);
return MM_STATUS_INVALID_PARAMETER;
}
- // FIXME
- // handle event notification
-
- Status = MMixerAddEvents(MixerContext, MixerInfo);
+ /* add the event */
+ Status = MMixerAddEvent(MixerContext, MixerInfo, MixerEventContext, MixerEventRoutine);
- // store result
+ /* store result */
*MixerHandle = (HANDLE)MixerInfo;
return MM_STATUS_SUCCESS;
MIXER_STATUS
MMixerGetLineInfo(
IN PMIXER_CONTEXT MixerContext,
- IN HANDLE MixerHandle,
- IN ULONG Flags,
+ IN HANDLE MixerHandle,
+ IN ULONG MixerId,
+ IN ULONG Flags,
OUT LPMIXERLINEW MixerLine)
{
MIXER_STATUS Status;
LPMIXER_INFO MixerInfo;
LPMIXERLINE_EXT MixerLineSrc;
- // verify mixer context
+ /* verify mixer context */
Status = MMixerVerifyContext(MixerContext);
if (Status != MM_STATUS_SUCCESS)
{
- // invalid context passed
+ /* invalid context passed */
return Status;
}
+ if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
+ {
+ /* caller passed mixer id */
+ MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
+
+ if (!MixerHandle)
+ {
+ /* invalid parameter */
+ return MM_STATUS_INVALID_PARAMETER;
+ }
+ }
- // clear hmixer from flags
+ /* clear hmixer from flags */
Flags &=~MIXER_OBJECTF_HMIXER;
if (Flags == MIXER_GETLINEINFOF_DESTINATION)
{
- // cast to mixer info
+ /* cast to mixer info */
MixerInfo = (LPMIXER_INFO)MixerHandle;
if (MixerLine->dwDestination != 0)
{
- // destination line member must be zero
+ /* destination line member must be zero */
return MM_STATUS_INVALID_PARAMETER;
}
}
else if (Flags == MIXER_GETLINEINFOF_SOURCE)
{
- // cast to mixer info
+ /* cast to mixer info */
MixerInfo = (LPMIXER_INFO)MixerHandle;
if (MixerLine->dwSource >= MixerLineSrc->Line.cConnections)
{
- DPRINT1("dwSource %u > Destinations %u\n", MixerLine->dwSource, MixerLineSrc->Line.cConnections);
+ DPRINT("dwSource %u > Destinations %u\n", MixerLine->dwSource, MixerLineSrc->Line.cConnections);
- // invalid parameter
+ /* invalid parameter */
return MM_STATUS_INVALID_PARAMETER;
}
}
else if (Flags == MIXER_GETLINEINFOF_LINEID)
{
- // cast to mixer info
+ /* cast to mixer info */
MixerInfo = (LPMIXER_INFO)MixerHandle;
MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwLineID);
if (!MixerLineSrc)
{
- // invalid parameter
+ /* invalid parameter */
return MM_STATUS_INVALID_PARAMETER;
}
}
else if (Flags == MIXER_GETLINEINFOF_COMPONENTTYPE)
{
- // cast to mixer info
+ /* cast to mixer info */
MixerInfo = (LPMIXER_INFO)MixerHandle;
MixerLineSrc = MMixerGetSourceMixerLineByComponentType(MixerInfo, MixerLine->dwComponentType);
MMixerGetLineControls(
IN PMIXER_CONTEXT MixerContext,
IN HANDLE MixerHandle,
+ IN ULONG MixerId,
IN ULONG Flags,
OUT LPMIXERLINECONTROLSW MixerLineControls)
{
MIXER_STATUS Status;
ULONG Index;
- // verify mixer context
+ /* verify mixer context */
Status = MMixerVerifyContext(MixerContext);
if (Status != MM_STATUS_SUCCESS)
{
- // invalid context passed
+ /* invalid context passed */
return Status;
}
+ if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
+ {
+ /* caller passed mixer id */
+ MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
+
+ if (!MixerHandle)
+ {
+ /* invalid parameter */
+ return MM_STATUS_INVALID_PARAMETER;
+ }
+ }
+
Flags &= ~MIXER_OBJECTF_HMIXER;
if (Flags == MIXER_GETLINECONTROLSF_ALL)
{
- // cast to mixer info
+ /* cast to mixer info */
MixerInfo = (LPMIXER_INFO)MixerHandle;
MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLineControls->dwLineID);
if (!MixerLineSrc)
{
- // invalid line id
+ /* invalid line id */
return MM_STATUS_INVALID_PARAMETER;
}
- // copy line control(s)
+ /* copy line control(s) */
MixerContext->Copy(MixerLineControls->pamxctrl, MixerLineSrc->LineControls, min(MixerLineSrc->Line.cControls, MixerLineControls->cControls) * sizeof(MIXERCONTROLW));
return MM_STATUS_SUCCESS;
}
else if (Flags == MIXER_GETLINECONTROLSF_ONEBYTYPE)
{
- // cast to mixer info
+ /* cast to mixer info */
MixerInfo = (LPMIXER_INFO)MixerHandle;
MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLineControls->dwLineID);
if (!MixerLineSrc)
{
- // invalid line id
+ /* invalid line id */
return MM_STATUS_INVALID_PARAMETER;
}
DPRINT("dwControlType %x\n", MixerLineSrc->LineControls[Index].dwControlType);
if (MixerLineControls->dwControlType == MixerLineSrc->LineControls[Index].dwControlType)
{
- // found a control with that type
+ /* found a control with that type */
MixerContext->Copy(MixerLineControls->pamxctrl, &MixerLineSrc->LineControls[Index], sizeof(MIXERCONTROLW));
return MM_STATUS_SUCCESS;
}
}
else if (Flags == MIXER_GETLINECONTROLSF_ONEBYID)
{
- // cast to mixer info
+ /* cast to mixer info */
MixerInfo = (LPMIXER_INFO)MixerHandle;
Status = MMixerGetMixerControlById(MixerInfo, MixerLineControls->dwControlID, NULL, &MixerControl, NULL);
if (Status != MM_STATUS_SUCCESS)
{
- // invalid parameter
+ /* invalid parameter */
return MM_STATUS_INVALID_PARAMETER;
}
- // copy the controls
+ /* copy the controls */
MixerContext->Copy(MixerLineControls->pamxctrl, MixerControl, sizeof(MIXERCONTROLW));
return MM_STATUS_SUCCESS;
}
MMixerSetControlDetails(
IN PMIXER_CONTEXT MixerContext,
IN HANDLE MixerHandle,
+ IN ULONG MixerId,
IN ULONG Flags,
OUT LPMIXERCONTROLDETAILS MixerControlDetails)
{
LPMIXERLINE_EXT MixerLine;
LPMIXERCONTROLW MixerControl;
- // verify mixer context
+ /* verify mixer context */
Status = MMixerVerifyContext(MixerContext);
if (Status != MM_STATUS_SUCCESS)
{
- // invalid context passed
+ /* invalid context passed */
return Status;
}
- // get mixer info
+ if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
+ {
+ /* caller passed mixer id */
+ MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
+
+ if (!MixerHandle)
+ {
+ /* invalid parameter */
+ return MM_STATUS_INVALID_PARAMETER;
+ }
+ }
+
+ /* get mixer info */
MixerInfo = (LPMIXER_INFO)MixerHandle;
- // get mixer control
+ /* get mixer control */
Status = MMixerGetMixerControlById(MixerInfo, MixerControlDetails->dwControlID, &MixerLine, &MixerControl, &NodeId);
- // check for success
+ /* check for success */
if (Status != MM_STATUS_SUCCESS)
{
- // failed to find control id
+ /* failed to find control id */
return MM_STATUS_INVALID_PARAMETER;
}
MMixerGetControlDetails(
IN PMIXER_CONTEXT MixerContext,
IN HANDLE MixerHandle,
+ IN ULONG MixerId,
IN ULONG Flags,
OUT LPMIXERCONTROLDETAILS MixerControlDetails)
{
LPMIXERLINE_EXT MixerLine;
LPMIXERCONTROLW MixerControl;
- // verify mixer context
+ /* verify mixer context */
Status = MMixerVerifyContext(MixerContext);
if (Status != MM_STATUS_SUCCESS)
{
- // invalid context passed
+ /* invalid context passed */
return Status;
}
- // get mixer info
+ if ((Flags & (MIXER_OBJECTF_MIXER | MIXER_OBJECTF_HMIXER)) == MIXER_OBJECTF_MIXER)
+ {
+ /* caller passed mixer id */
+ MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
+
+ if (!MixerHandle)
+ {
+ /* invalid parameter */
+ return MM_STATUS_INVALID_PARAMETER;
+ }
+ }
+
+ /* get mixer info */
MixerInfo = (LPMIXER_INFO)MixerHandle;
- // get mixer control
+ /* get mixer control */
Status = MMixerGetMixerControlById(MixerInfo, MixerControlDetails->dwControlID, &MixerLine, &MixerControl, &NodeId);
- // check for success
+ /* check for success */
if (Status != MM_STATUS_SUCCESS)
{
- // failed to find control id
+ /* failed to find control id */
return MM_STATUS_INVALID_PARAMETER;
}
switch(MixerControl->dwControlType)
{
case MIXERCONTROL_CONTROLTYPE_MUTE:
- Status = MMixerSetGetMuteControlDetails(MixerContext, MixerInfo->hMixer, NodeId, MixerLine->Line.dwLineID, MixerControlDetails, FALSE);
+ Status = MMixerSetGetMuteControlDetails(MixerContext, MixerInfo, NodeId, MixerLine->Line.dwLineID, MixerControlDetails, FALSE);
break;
case MIXERCONTROL_CONTROLTYPE_VOLUME:
- Status = MMixerSetGetVolumeControlDetails(MixerContext, MixerInfo->hMixer, NodeId, FALSE, MixerControl, MixerControlDetails, MixerLine);
+ Status = MMixerSetGetVolumeControlDetails(MixerContext, MixerInfo, NodeId, FALSE, MixerControl, MixerControlDetails, MixerLine);
break;
default:
Status = MM_STATUS_NOT_IMPLEMENTED;
if (!MixerContext || !EnumFunction || !EnumContext)
{
- // invalid parameter
+ /* invalid parameter */
return MM_STATUS_INVALID_PARAMETER;
}
!MixerContext->AllocEventData || !MixerContext->FreeEventData ||
!MixerContext->Close || !MixerContext->OpenKey || !MixerContext->QueryKeyValue || !MixerContext->CloseKey)
{
- // invalid parameter
+ /* invalid parameter */
return MM_STATUS_INVALID_PARAMETER;
}
- // allocate a mixer list
+ /* allocate a mixer list */
MixerList = (PMIXER_LIST)MixerContext->Alloc(sizeof(MIXER_LIST));
if (!MixerList)
{
- // no memory
+ /* no memory */
return MM_STATUS_NO_MEMORY;
}
- //initialize mixer list
+ /* initialize mixer list */
MixerList->MixerListCount = 0;
MixerList->MixerDataCount = 0;
MixerList->WaveInListCount = 0;
MixerList->WaveOutListCount = 0;
+ MixerList->MidiInListCount = 0;
+ MixerList->MidiOutListCount = 0;
InitializeListHead(&MixerList->MixerList);
InitializeListHead(&MixerList->MixerData);
InitializeListHead(&MixerList->WaveInList);
InitializeListHead(&MixerList->WaveOutList);
+ InitializeListHead(&MixerList->MidiInList);
+ InitializeListHead(&MixerList->MidiOutList);
-
- // store mixer list
+ /* store mixer list */
MixerContext->MixerContext = (PVOID)MixerList;
- // start enumerating all available devices
+ /* start enumerating all available devices */
Count = 0;
DeviceIndex = 0;
do
{
- // enumerate a device
+ /* enumerate a device */
Status = EnumFunction(EnumContext, DeviceIndex, &DeviceName, &hMixer, &hKey);
if (Status != MM_STATUS_SUCCESS)
{
- //check error code
+ /* check error code */
if (Status == MM_STATUS_NO_MORE_DEVICES)
{
- // enumeration has finished
+ /* enumeration has finished */
break;
}
+ else
+ {
+ DPRINT1("Failed to enumerate device %lu\n", DeviceIndex);
+
+ /* TODO cleanup */
+ return Status;
+ }
}
else
{
- // create a mixer data entry
+ /* create a mixer data entry */
Status = MMixerCreateMixerData(MixerContext, MixerList, DeviceIndex, DeviceName, hMixer, hKey);
if (Status != MM_STATUS_SUCCESS)
break;
}
- // increment device index
+ /* increment device index */
DeviceIndex++;
}while(TRUE);
- //now all filters have been pre-opened
- // lets enumerate the filters
+ /* now all filters have been pre-opened
+ * lets enumerate the filters
+ */
Entry = MixerList->MixerData.Flink;
while(Entry != &MixerList->MixerData)
{
Entry = Entry->Flink;
}
- // done
+ /* done */
return MM_STATUS_SUCCESS;
}