wasapi2_sources = [ 'gstwasapi2src.c', 'gstwasapi2sink.c', 'gstwasapi2util.c', 'gstwasapi2client.cpp', 'gstwasapi2device.c', 'gstwasapi2ringbuffer.cpp', 'plugin.c', ] mmdeviceapi_symbols = [ 'ActivateAudioInterfaceAsync', 'DEVINTERFACE_AUDIO_RENDER', 'DEVINTERFACE_AUDIO_CAPTURE', ] wasapi2_option = get_option('wasapi2') if host_system != 'windows' if wasapi2_option.disabled() subdir_done() elif wasapi2_option.enabled() error('Cannot build wasapi2 plugin when not building for Windows') endif endif ole32_dep = cc.find_library('ole32', required : get_option('wasapi2')) ksuser_dep = cc.find_library('ksuser', required : get_option('wasapi2')) runtimeobject_dep = cc.find_library('runtimeobject', required : get_option('wasapi2')) mmdeviceapi_dep = cc.find_library('mmdevapi', required : get_option('wasapi2')) mfplat_dep = cc.find_library('mfplat', required : get_option('wasapi2')) wasapi2_dep = [ole32_dep, ksuser_dep, runtimeobject_dep, mmdeviceapi_dep, mfplat_dep] extra_args = ['-DGST_USE_UNSTABLE_API'] foreach dep: wasapi2_dep if not dep.found() if wasapi2_option.enabled() error('wasapi2 plugin was enabled explicitly, but required dependencies were not found') else subdir_done() endif endif endforeach if not cxx.has_header_symbol ('audioclient.h', 'IAudioClient3', dependencies : wasapi2_dep) if wasapi2_option.enabled() error('wasapi2 plugin was enabled explicitly, but IAudioClient3 is unavailable') else subdir_done() endif endif foreach symbol: mmdeviceapi_symbols if not cxx.has_header_symbol ('mmdeviceapi.h', symbol, dependencies : wasapi2_dep) if wasapi2_option.enabled() error('wasapi2 plugin was enabled explicitly, but @1@ is unavailable'.format(symbol)) else subdir_done() endif endif endforeach winapi_app = cxx.compiles('''#include #include #include #include #include #include #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) #error "not winrt" #endif int main (int argc, char ** argv) { IAudioClient3 *client = NULL; return 0; } ''', dependencies: wasapi2_dep, name: 'building for WINAPI_PARTITION_APP') if not winapi_app if wasapi2_option.enabled() error('wasapi2 plugin was enabled explicitly, but build target is not include WINAPI_PARTITION_APP') else subdir_done() endif endif winapi_desktop = cxx.compiles('''#include #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #error "not win32" #endif''', name: 'building for WINAPI_PARTITION_DESKTOP') if winapi_app and not winapi_desktop extra_args += ['-DGST_WASAPI2_WINAPI_ONLY_APP'] endif win10_sdk = cxx.compiles('''#include #ifndef WDK_NTDDI_VERSION #error "unknown Windows SDK version" #endif #if (WDK_NTDDI_VERSION < 0x0A000000) #error "Not a Windows 10 SDK" #endif ''', name: 'building with Windows 10 SDK') if not win10_sdk if wasapi2_option.enabled() error('wasapi2 plugin was enabled explicitly, but Windows 10 SDK is unavailable') else subdir_done() endif endif building_for_win10 = cxx.compiles('''#include #ifndef WINVER #error "unknown minimum supported OS version" #endif #if (WINVER < 0x0A00) #error "Windows 10 API is not guaranteed" #endif ''', name: 'building for Windows 10') if not building_for_win10 message('Bumping target Windows version to Windows 10 for building wasapi2 plugin') extra_args += ['-DWINVER=0x0A00', '-D_WIN32_WINNT=0x0A00', '-DNTDDI_VERSION=WDK_NTDDI_VERSION'] endif if not gstwinrt_dep.found() if wasapi2_option.enabled() error('wasapi2 plugin was enabled explicitly, but GstWinRt library is unavailable') else subdir_done() endif endif # Work around for Windows SDK header issue # https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-160#windows-header-issues extra_cpp_args = cxx.get_supported_arguments(['/Zc:twoPhase-']) gstwasapi2 = library('gstwasapi2', wasapi2_sources, c_args : gst_plugins_bad_args + ['-DCOBJMACROS'] + extra_args, cpp_args : gst_plugins_bad_args + extra_args + extra_cpp_args, include_directories : [configinc], dependencies : [gstaudio_dep, gstwinrt_dep] + wasapi2_dep, install : true, install_dir : plugins_install_dir) plugins += [gstwasapi2]