Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 736 of file mixer.c.
Referenced by WdmAudInitUserModeMixer(), and WdmAudMixerInitialize().
{ MIXER_STATUS Status; HANDLE hMixer, hKey; ULONG DeviceIndex, Count; LPWSTR DeviceName; LPMIXER_DATA MixerData; PMIXER_LIST MixerList; PLIST_ENTRY Entry; if (!MixerContext || !EnumFunction || !EnumContext) { /* invalid parameter */ return MM_STATUS_INVALID_PARAMETER; } if (!MixerContext->Alloc || !MixerContext->Control || !MixerContext->Free || !MixerContext->Open || !MixerContext->AllocEventData || !MixerContext->FreeEventData || !MixerContext->Close || !MixerContext->OpenKey || !MixerContext->QueryKeyValue || !MixerContext->CloseKey) { /* invalid parameter */ return MM_STATUS_INVALID_PARAMETER; } /* allocate a mixer list */ MixerList = (PMIXER_LIST)MixerContext->Alloc(sizeof(MIXER_LIST)); if (!MixerList) { /* no memory */ return MM_STATUS_NO_MEMORY; } /* 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 */ MixerContext->MixerContext = (PVOID)MixerList; /* start enumerating all available devices */ Count = 0; DeviceIndex = 0; do { /* enumerate a device */ Status = EnumFunction(EnumContext, DeviceIndex, &DeviceName, &hMixer, &hKey); if (Status != MM_STATUS_SUCCESS) { /* check error code */ if (Status == MM_STATUS_NO_MORE_DEVICES) { /* enumeration has finished */ break; } else { DPRINT1("Failed to enumerate device %lu\n", DeviceIndex); /* TODO cleanup */ return Status; } } else { /* create a mixer data entry */ Status = MMixerCreateMixerData(MixerContext, MixerList, DeviceIndex, DeviceName, hMixer, hKey); if (Status != MM_STATUS_SUCCESS) break; } /* increment device index */ DeviceIndex++; }while(TRUE); /* now all filters have been pre-opened * lets enumerate the filters */ Entry = MixerList->MixerData.Flink; while(Entry != &MixerList->MixerData) { MixerData = (LPMIXER_DATA)CONTAINING_RECORD(Entry, MIXER_DATA, Entry); MMixerSetupFilter(MixerContext, MixerList, MixerData, &Count); Entry = Entry->Flink; } Entry = MixerList->MixerData.Flink; while(Entry != &MixerList->MixerData) { MixerData = (LPMIXER_DATA)CONTAINING_RECORD(Entry, MIXER_DATA, Entry); /* now handle alternative mixer types */ MMixerHandleAlternativeMixers(MixerContext, MixerList, MixerData, MixerData->Topology); Entry = Entry->Flink; } //MMixerPrintMixers(MixerContext, MixerList); /* done */ return MM_STATUS_SUCCESS; }