VOID MMixerInitializeMidiForFilter( IN PMIXER_CONTEXT MixerContext, IN PMIXER_LIST MixerList, IN LPMIXER_DATA MixerData, IN PTOPOLOGY Topology) { ULONG PinCount, Index; MIXER_STATUS Status; PKSMULTIPLE_ITEM MultipleItem; WCHAR szPname[MAXPNAMELEN]; /* get filter pin count */ MMixerGetTopologyPinCount(Topology, &PinCount); /* get mixer name */ if (MMixerGetDeviceName(MixerContext, szPname, MixerData->hDeviceInterfaceKey) != MM_STATUS_SUCCESS) { /* clear name */ szPname[0] = 0; } /* iterate all pins and check for KSDATARANGE_MUSIC support */ for(Index = 0; Index < PinCount; Index++) { /* get audio pin data ranges */ Status = MMixerGetAudioPinDataRanges(MixerContext, MixerData->hDevice, Index, &MultipleItem); /* check for success */ if (Status == MM_STATUS_SUCCESS) { /* check if there is support KSDATARANGE_MUSIC */ MMixerCheckFilterPinMidiSupport(MixerContext, MixerList, MixerData, Index, MultipleItem, szPname); } } }
MIXER_STATUS MMixerInitializeWaveInfo( IN PMIXER_CONTEXT MixerContext, IN PMIXER_LIST MixerList, IN LPMIXER_DATA MixerData, IN LPWSTR DeviceName, IN ULONG bWaveIn, IN ULONG PinCount, IN PULONG Pins) { MIXER_STATUS Status; PKSMULTIPLE_ITEM MultipleItem; PKSDATARANGE_AUDIO DataRangeAudio; LPWAVE_INFO WaveInfo; WaveInfo = (LPWAVE_INFO)MixerContext->Alloc(sizeof(WAVE_INFO)); if (!WaveInfo) return MM_STATUS_NO_MEMORY; if (PinCount > 1) { /* FIXME support multiple pins for wave device */ DPRINT1("Implement support for multiple pins\n"); //ASSERT(PinCount == 1); } /* initialize wave info */ WaveInfo->DeviceId = MixerData->DeviceId; WaveInfo->PinId = Pins[0]; /* sanity check */ ASSERT(wcslen(DeviceName) + 1 < MAXPNAMELEN); /* copy device name */ if (bWaveIn) { wcscpy(WaveInfo->u.InCaps.szPname, DeviceName); } else { wcscpy(WaveInfo->u.OutCaps.szPname, DeviceName); } /* FIXME determine manufacturer / product id */ if (bWaveIn) { WaveInfo->u.InCaps.wMid = MM_MICROSOFT; WaveInfo->u.InCaps.wPid = MM_PID_UNMAPPED; WaveInfo->u.InCaps.vDriverVersion = 1; } else { WaveInfo->u.OutCaps.wMid = MM_MICROSOFT; WaveInfo->u.OutCaps.wPid = MM_PID_UNMAPPED; WaveInfo->u.OutCaps.vDriverVersion = 1; } /* get audio pin data ranges */ Status = MMixerGetAudioPinDataRanges(MixerContext, MixerData->hDevice, Pins[0], &MultipleItem); if (Status != MM_STATUS_SUCCESS) { /* failed to get audio pin data ranges */ MixerContext->Free(WaveInfo); return MM_STATUS_UNSUCCESSFUL; } /* find an KSDATARANGE_AUDIO range */ Status = MMixerFindAudioDataRange(MultipleItem, &DataRangeAudio); if (Status != MM_STATUS_SUCCESS) { /* failed to find audio pin data range */ MixerContext->Free(MultipleItem); MixerContext->Free(WaveInfo); return MM_STATUS_UNSUCCESSFUL; } /* store channel count */ if (bWaveIn) { WaveInfo->u.InCaps.wChannels = DataRangeAudio->MaximumChannels; } else { WaveInfo->u.OutCaps.wChannels = DataRangeAudio->MaximumChannels; } /* get all supported formats */ MMixerCheckFormat(DataRangeAudio, WaveInfo, bWaveIn); /* free dataranges buffer */ MixerContext->Free(MultipleItem); if (bWaveIn) { InsertTailList(&MixerList->WaveInList, &WaveInfo->Entry); MixerList->WaveInListCount++; } else { InsertTailList(&MixerList->WaveOutList, &WaveInfo->Entry); MixerList->WaveOutListCount++; } return MM_STATUS_SUCCESS; }