diff options
Diffstat (limited to 'portaudio/src/os/win/pa_win_wdmks_utils.c')
-rw-r--r-- | portaudio/src/os/win/pa_win_wdmks_utils.c | 309 |
1 files changed, 0 insertions, 309 deletions
diff --git a/portaudio/src/os/win/pa_win_wdmks_utils.c b/portaudio/src/os/win/pa_win_wdmks_utils.c deleted file mode 100644 index 3373146..0000000 --- a/portaudio/src/os/win/pa_win_wdmks_utils.c +++ /dev/null @@ -1,309 +0,0 @@ -/* - * PortAudio Portable Real-Time Audio Library - * Windows WDM KS utilities - * - * Copyright (c) 1999 - 2007 Andrew Baldwin, Ross Bencina - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files - * (the "Software"), to deal in the Software without restriction, - * including without limitation the rights to use, copy, modify, merge, - * publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * Any person wishing to distribute modifications to the Software is - * requested to send the modifications to the original developer so that - * they can be incorporated into the canonical version. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - -#include <windows.h> -#include <mmreg.h> -#ifndef WAVE_FORMAT_IEEE_FLOAT - #define WAVE_FORMAT_IEEE_FLOAT 0x0003 // MinGW32 does not define this -#endif -#ifndef _WAVEFORMATEXTENSIBLE_ - #define _WAVEFORMATEXTENSIBLE_ // MinGW32 does not define this -#endif -#ifndef _INC_MMREG - #define _INC_MMREG // for STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT -#endif -#include <winioctl.h> // MinGW32 does not define this automatically - -#if defined(__GNUC__) - -#include "../../hostapi/wasapi/mingw-include/ks.h" -#include "../../hostapi/wasapi/mingw-include/ksmedia.h" - -#else - -#include <ks.h> -#include <ksmedia.h> - -#endif - -#include <stdio.h> // just for some development printfs - -#include "portaudio.h" -#include "pa_util.h" -#include "pa_win_wdmks_utils.h" - - -/* PortAudio-local instances of GUIDs previously sourced from ksguid.lib */ - -/* GUID KSDATAFORMAT_TYPE_AUDIO */ -static const GUID pa_KSDATAFORMAT_TYPE_AUDIO = { STATIC_KSDATAFORMAT_TYPE_AUDIO }; - -/* GUID KSDATAFORMAT_SUBTYPE_IEEE_FLOAT */ -static const GUID pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = { STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT }; - -/* GUID KSDATAFORMAT_SUBTYPE_PCM */ -static const GUID pa_KSDATAFORMAT_SUBTYPE_PCM = { STATIC_KSDATAFORMAT_SUBTYPE_PCM }; - -/* GUID KSDATAFORMAT_SUBTYPE_WAVEFORMATEX */ -static const GUID pa_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX = { STATIC_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX }; - -/* GUID KSMEDIUMSETID_Standard */ -static const GUID pa_KSMEDIUMSETID_Standard = { STATIC_KSMEDIUMSETID_Standard }; - -/* GUID KSINTERFACESETID_Standard */ -static const GUID pa_KSINTERFACESETID_Standard = { STATIC_KSINTERFACESETID_Standard }; - -/* GUID KSPROPSETID_Pin */ -static const GUID pa_KSPROPSETID_Pin = { STATIC_KSPROPSETID_Pin }; - -#define pa_IS_VALID_WAVEFORMATEX_GUID(Guid)\ - (!memcmp(((PUSHORT)&pa_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX) + 1, ((PUSHORT)(Guid)) + 1, sizeof(GUID) - sizeof(USHORT))) - - -static PaError WdmGetPinPropertySimple( - HANDLE handle, - unsigned long pinId, - unsigned long property, - void* value, - unsigned long valueSize ) -{ - DWORD bytesReturned; - KSP_PIN ksPProp; - ksPProp.Property.Set = pa_KSPROPSETID_Pin; - ksPProp.Property.Id = property; - ksPProp.Property.Flags = KSPROPERTY_TYPE_GET; - ksPProp.PinId = pinId; - ksPProp.Reserved = 0; - - if( DeviceIoControl( handle, IOCTL_KS_PROPERTY, &ksPProp, sizeof(KSP_PIN), - value, valueSize, &bytesReturned, NULL ) == 0 || bytesReturned != valueSize ) - { - return paUnanticipatedHostError; - } - else - { - return paNoError; - } -} - - -static PaError WdmGetPinPropertyMulti( - HANDLE handle, - unsigned long pinId, - unsigned long property, - KSMULTIPLE_ITEM** ksMultipleItem) -{ - unsigned long multipleItemSize = 0; - KSP_PIN ksPProp; - DWORD bytesReturned; - - *ksMultipleItem = 0; - - ksPProp.Property.Set = pa_KSPROPSETID_Pin; - ksPProp.Property.Id = property; - ksPProp.Property.Flags = KSPROPERTY_TYPE_GET; - ksPProp.PinId = pinId; - ksPProp.Reserved = 0; - - if( DeviceIoControl( handle, IOCTL_KS_PROPERTY, &ksPProp.Property, - sizeof(KSP_PIN), NULL, 0, &multipleItemSize, NULL ) == 0 && GetLastError() != ERROR_MORE_DATA ) - { - return paUnanticipatedHostError; - } - - *ksMultipleItem = (KSMULTIPLE_ITEM*)PaUtil_AllocateMemory( multipleItemSize ); - if( !*ksMultipleItem ) - { - return paInsufficientMemory; - } - - if( DeviceIoControl( handle, IOCTL_KS_PROPERTY, &ksPProp, sizeof(KSP_PIN), - (void*)*ksMultipleItem, multipleItemSize, &bytesReturned, NULL ) == 0 || bytesReturned != multipleItemSize ) - { - PaUtil_FreeMemory( ksMultipleItem ); - return paUnanticipatedHostError; - } - - return paNoError; -} - - -static int GetKSFilterPinCount( HANDLE deviceHandle ) -{ - DWORD result; - - if( WdmGetPinPropertySimple( deviceHandle, 0, KSPROPERTY_PIN_CTYPES, &result, sizeof(result) ) == paNoError ){ - return result; - }else{ - return 0; - } -} - - -static KSPIN_COMMUNICATION GetKSFilterPinPropertyCommunication( HANDLE deviceHandle, int pinId ) -{ - KSPIN_COMMUNICATION result; - - if( WdmGetPinPropertySimple( deviceHandle, pinId, KSPROPERTY_PIN_COMMUNICATION, &result, sizeof(result) ) == paNoError ){ - return result; - }else{ - return KSPIN_COMMUNICATION_NONE; - } -} - - -static KSPIN_DATAFLOW GetKSFilterPinPropertyDataflow( HANDLE deviceHandle, int pinId ) -{ - KSPIN_DATAFLOW result; - - if( WdmGetPinPropertySimple( deviceHandle, pinId, KSPROPERTY_PIN_DATAFLOW, &result, sizeof(result) ) == paNoError ){ - return result; - }else{ - return (KSPIN_DATAFLOW)0; - } -} - - -static int KSFilterPinPropertyIdentifiersInclude( - HANDLE deviceHandle, int pinId, unsigned long property, const GUID *identifierSet, unsigned long identifierId ) -{ - KSMULTIPLE_ITEM* item = NULL; - KSIDENTIFIER* identifier; - int i; - int result = 0; - - if( WdmGetPinPropertyMulti( deviceHandle, pinId, property, &item) != paNoError ) - return 0; - - identifier = (KSIDENTIFIER*)(item+1); - - for( i = 0; i < (int)item->Count; i++ ) - { - if( !memcmp( (void*)&identifier[i].Set, (void*)identifierSet, sizeof( GUID ) ) && - ( identifier[i].Id == identifierId ) ) - { - result = 1; - break; - } - } - - PaUtil_FreeMemory( item ); - - return result; -} - - -/* return the maximum channel count supported by any pin on the device. - if isInput is non-zero we query input pins, otherwise output pins. -*/ -int PaWin_WDMKS_QueryFilterMaximumChannelCount( void *wcharDevicePath, int isInput ) -{ - HANDLE deviceHandle; - ULONG i; - int pinCount, pinId; - int result = 0; - KSPIN_DATAFLOW requiredDataflowDirection = (isInput ? KSPIN_DATAFLOW_OUT : KSPIN_DATAFLOW_IN ); - - if( !wcharDevicePath ) - return 0; - - deviceHandle = CreateFileW( (LPCWSTR)wcharDevicePath, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); - if( deviceHandle == INVALID_HANDLE_VALUE ) - return 0; - - pinCount = GetKSFilterPinCount( deviceHandle ); - for( pinId = 0; pinId < pinCount; ++pinId ) - { - KSPIN_COMMUNICATION communication = GetKSFilterPinPropertyCommunication( deviceHandle, pinId ); - KSPIN_DATAFLOW dataflow = GetKSFilterPinPropertyDataflow( deviceHandle, pinId ); - if( ( dataflow == requiredDataflowDirection ) && - (( communication == KSPIN_COMMUNICATION_SINK) || - ( communication == KSPIN_COMMUNICATION_BOTH)) - && ( KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, - KSPROPERTY_PIN_INTERFACES, &pa_KSINTERFACESETID_Standard, KSINTERFACE_STANDARD_STREAMING ) - || KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, - KSPROPERTY_PIN_INTERFACES, &pa_KSINTERFACESETID_Standard, KSINTERFACE_STANDARD_LOOPED_STREAMING ) ) - && KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, - KSPROPERTY_PIN_MEDIUMS, &pa_KSMEDIUMSETID_Standard, KSMEDIUM_STANDARD_DEVIO ) ) - { - KSMULTIPLE_ITEM* item = NULL; - if( WdmGetPinPropertyMulti( deviceHandle, pinId, KSPROPERTY_PIN_DATARANGES, &item ) == paNoError ) - { - KSDATARANGE *dataRange = (KSDATARANGE*)(item+1); - - for( i=0; i < item->Count; ++i ){ - - if( pa_IS_VALID_WAVEFORMATEX_GUID(&dataRange->SubFormat) - || memcmp( (void*)&dataRange->SubFormat, (void*)&pa_KSDATAFORMAT_SUBTYPE_PCM, sizeof(GUID) ) == 0 - || memcmp( (void*)&dataRange->SubFormat, (void*)&pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, sizeof(GUID) ) == 0 - || ( ( memcmp( (void*)&dataRange->MajorFormat, (void*)&pa_KSDATAFORMAT_TYPE_AUDIO, sizeof(GUID) ) == 0 ) - && ( memcmp( (void*)&dataRange->SubFormat, (void*)&KSDATAFORMAT_SUBTYPE_WILDCARD, sizeof(GUID) ) == 0 ) ) ) - { - KSDATARANGE_AUDIO *dataRangeAudio = (KSDATARANGE_AUDIO*)dataRange; - - /* - printf( ">>> %d %d %d %d %S\n", isInput, dataflow, communication, dataRangeAudio->MaximumChannels, devicePath ); - - if( memcmp((void*)&dataRange->Specifier, (void*)&KSDATAFORMAT_SPECIFIER_WAVEFORMATEX, sizeof(GUID) ) == 0 ) - printf( "\tspecifier: KSDATAFORMAT_SPECIFIER_WAVEFORMATEX\n" ); - else if( memcmp((void*)&dataRange->Specifier, (void*)&KSDATAFORMAT_SPECIFIER_DSOUND, sizeof(GUID) ) == 0 ) - printf( "\tspecifier: KSDATAFORMAT_SPECIFIER_DSOUND\n" ); - else if( memcmp((void*)&dataRange->Specifier, (void*)&KSDATAFORMAT_SPECIFIER_WILDCARD, sizeof(GUID) ) == 0 ) - printf( "\tspecifier: KSDATAFORMAT_SPECIFIER_WILDCARD\n" ); - else - printf( "\tspecifier: ?\n" ); - */ - - /* - We assume that very high values for MaximumChannels are not useful and indicate - that the driver isn't prepared to tell us the real number of channels which it supports. - */ - if( dataRangeAudio->MaximumChannels < 0xFFFFUL && (int)dataRangeAudio->MaximumChannels > result ) - result = (int)dataRangeAudio->MaximumChannels; - } - - dataRange = (KSDATARANGE*)( ((char*)dataRange) + dataRange->FormatSize); - } - - PaUtil_FreeMemory( item ); - } - } - } - - CloseHandle( deviceHandle ); - return result; -} |