From: Ross Bencina Date: Sat, 3 Sep 2016 12:51:44 +0000 (+1000) Subject: Commits the C source code of a refining of the automatic audio device X-Git-Url: https://andrewgundersen.net/repos?a=commitdiff_plain;h=ab8b64023c7900b2e067998087adf89a96ad7cff;p=portaudio Commits the C source code of a refining of the automatic audio device selection to pick up devices from the same hardware. lyubomir committed on Dec 19, 2012 6441b56 from https://github.com/jitsi/libsrc/commits/master/portaudio.zip --- diff --git a/Makefile b/Makefile deleted file mode 100644 index fb69908..0000000 --- a/Makefile +++ /dev/null @@ -1,243 +0,0 @@ -# -# PortAudio V19 Makefile.in -# -# Dominic Mazzoni -# Modifications by Mikael Magnusson -# Modifications by Stelios Bounanos -# - -top_srcdir = . -srcdir = . - -top_builddir = . -PREFIX = /usr/local -prefix = $(PREFIX) -exec_prefix = ${prefix} -bindir = ${exec_prefix}/bin -libdir = ${exec_prefix}/lib -includedir = ${prefix}/include -CC = gcc -CXX = @CXX@ -CFLAGS = -I/usr/include -I$(top_srcdir)/include -I$(top_srcdir)/src/common -I$(top_srcdir)/src/os/unix -std=c99 -O2 -Wall -pedantic -pipe -fPIC -DNDEBUG -DPA_LITTLE_ENDIAN -arch i386 -arch x86_64 -mmacosx-version-min=10.4 -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DSIZEOF_SHORT=2 -DSIZEOF_INT=4 -DSIZEOF_LONG=8 -DHAVE_NANOSLEEP=1 -DPA_USE_COREAUDIO=1 -LIBS = -framework CoreAudio -framework AudioToolbox -framework AudioUnit -framework Carbon -AR = /usr/bin/ar -RANLIB = ranlib -SHELL = /bin/sh -LIBTOOL = $(SHELL) $(top_builddir)/libtool -INSTALL = /usr/bin/install -c -INSTALL_DATA = ${INSTALL} -m 644 -SHARED_FLAGS = -LDFLAGS = -DLL_LIBS = -CXXFLAGS = -NASM = -NASMOPT = -LN_S = ln -s -LT_CURRENT=2 -LT_REVISION=0 -LT_AGE=0 - -OTHER_OBJS = src/os/unix/pa_unix_hostapis.o src/os/unix/pa_unix_util.o src/hostapi/coreaudio/pa_mac_core.o src/hostapi/coreaudio/pa_mac_core_utilities.o src/hostapi/coreaudio/pa_mac_core_blocking.o src/common/pa_ringbuffer.o src/os/mac_osx/pa_osx_hotplug.o -INCLUDES = portaudio.h - -PALIB = libportaudio.la -PAINC = include/portaudio.h - -PA_LDFLAGS = $(LDFLAGS) $(SHARED_FLAGS) -rpath $(libdir) -no-undefined \ - -export-symbols-regex "(Pa|PaMacCore|PaJack|PaAlsa|PaAsio|PaOSS)_.*" \ - -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) - -COMMON_OBJS = \ - src/common/pa_allocation.o \ - src/common/pa_converters.o \ - src/common/pa_cpuload.o \ - src/common/pa_dither.o \ - src/common/pa_debugprint.o \ - src/common/pa_front.o \ - src/common/pa_process.o \ - src/common/pa_stream.o \ - src/common/pa_trace.o \ - src/hostapi/skeleton/pa_hostapi_skeleton.o - -LOOPBACK_OBJS = \ - qa/loopback/src/audio_analyzer.o \ - qa/loopback/src/biquad_filter.o \ - qa/loopback/src/paqa_tools.o \ - qa/loopback/src/test_audio_analyzer.o \ - qa/loopback/src/write_wav.o \ - qa/loopback/src/paqa.o - -TESTS = \ - bin/paqa_devs \ - bin/paqa_errs \ - bin/patest1 \ - bin/patest_buffer \ - bin/patest_callbackstop \ - bin/patest_clip \ - bin/patest_dither \ - bin/patest_hang \ - bin/patest_in_overflow \ - bin/patest_latency \ - bin/patest_leftright \ - bin/patest_longsine \ - bin/patest_many \ - bin/patest_maxsines \ - bin/patest_mono \ - bin/patest_multi_sine \ - bin/patest_out_underflow \ - bin/patest_pink \ - bin/patest_prime \ - bin/patest_read_record \ - bin/patest_read_write_wire \ - bin/patest_record \ - bin/patest_ringmix \ - bin/patest_saw \ - bin/patest_sine8 \ - bin/patest_sine \ - bin/patest_sine_channelmaps \ - bin/patest_sine_formats \ - bin/patest_sine_time \ - bin/patest_sine_srate \ - bin/patest_start_stop \ - bin/patest_stop \ - bin/patest_stop_playout \ - bin/patest_toomanysines \ - bin/patest_two_rates \ - bin/patest_underflow \ - bin/patest_wire \ - bin/patest_write_sine \ - bin/patest_write_sine_nonint \ - bin/patest_update_available_device_list \ - bin/pa_devs \ - bin/pa_fuzz \ - bin/pa_minlat - -# Most of these don't compile yet. Put them in TESTS, above, if -# you want to try to compile them... -ALL_TESTS = \ - $(TESTS) \ - bin/patest_sync \ - bin/debug_convert \ - bin/debug_dither_calc \ - bin/debug_dual \ - bin/debug_multi_in \ - bin/debug_multi_out \ - bin/debug_record \ - bin/debug_record_reuse \ - bin/debug_sine_amp \ - bin/debug_sine \ - bin/debug_sine_formats \ - bin/debug_srate \ - bin/debug_test1 - -OBJS := $(COMMON_OBJS) $(OTHER_OBJS) - -LTOBJS := $(OBJS:.o=.lo) - -SRC_DIRS = \ - src/common \ - src/hostapi/alsa \ - src/hostapi/asihpi \ - src/hostapi/asio \ - src/hostapi/coreaudio \ - src/hostapi/dsound \ - src/hostapi/jack \ - src/hostapi/oss \ - src/hostapi/wasapi \ - src/hostapi/wdmks \ - src/hostapi/wmme \ - src/os/unix \ - src/os/mac_osx \ - src/os/win - -SUBDIRS = -#SUBDIRS += bindings/cpp - -all: lib/$(PALIB) all-recursive tests - -tests: bin-stamp $(TESTS) - -loopback: bin-stamp bin/paloopback - -# With ASIO enabled we must link libportaudio and all test programs with CXX -lib/$(PALIB): lib-stamp $(LTOBJS) $(MAKEFILE) $(PAINC) - $(LIBTOOL) --mode=link $(CC) $(PA_LDFLAGS) -o lib/$(PALIB) $(LTOBJS) $(DLL_LIBS) - @ # $(LIBTOOL) --mode=link --tag=CXX $(CXX) $(PA_LDFLAGS) -o lib/$(PALIB) $(LTOBJS) $(DLL_LIBS) - -$(ALL_TESTS): bin/%: lib/$(PALIB) $(MAKEFILE) $(PAINC) test/%.c - $(LIBTOOL) --mode=link $(CC) -o $@ $(CFLAGS) $(top_srcdir)/test/$*.c lib/$(PALIB) $(LIBS) - @ # $(LIBTOOL) --mode=link --tag=CXX $(CXX) -o $@ $(CXXFLAGS) $(top_srcdir)/test/$*.c lib/$(PALIB) $(LIBS) - -bin/paloopback: lib/$(PALIB) $(MAKEFILE) $(PAINC) $(LOOPBACK_OBJS) - $(LIBTOOL) --mode=link $(CC) -o $@ $(CFLAGS) $(LOOPBACK_OBJS) lib/$(PALIB) $(LIBS) - @ # $(LIBTOOL) --mode=link --tag=CXX $(CXX) -o $@ $(CXXFLAGS) $(LOOPBACK_OBJS) lib/$(PALIB) $(LIBS) - -install: lib/$(PALIB) portaudio-2.0.pc - $(INSTALL) -d $(DESTDIR)$(libdir) - $(LIBTOOL) --mode=install $(INSTALL) lib/$(PALIB) $(DESTDIR)$(libdir) - $(INSTALL) -d $(DESTDIR)$(includedir) - for include in $(INCLUDES); do \ - $(INSTALL_DATA) -m 644 $(top_srcdir)/include/$$include $(DESTDIR)$(includedir)/$$include; \ - done - $(INSTALL) -d $(DESTDIR)$(libdir)/pkgconfig - $(INSTALL) -m 644 portaudio-2.0.pc $(DESTDIR)$(libdir)/pkgconfig/portaudio-2.0.pc - @echo "" - @echo "------------------------------------------------------------" - @echo "PortAudio was successfully installed." - @echo "" - @echo "On some systems (e.g. Linux) you should run 'ldconfig' now" - @echo "to make the shared object available. You may also need to" - @echo "modify your LD_LIBRARY_PATH environment variable to include" - @echo "the directory $(libdir)" - @echo "------------------------------------------------------------" - @echo "" - $(MAKE) install-recursive - -uninstall: - $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$(PALIB) - $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(includedir)/portaudio.h - $(MAKE) uninstall-recursive - -clean: - $(LIBTOOL) --mode=clean rm -f $(LTOBJS) $(LOOPBACK_OBJS) $(ALL_TESTS) lib/$(PALIB) - $(RM) bin-stamp lib-stamp - -$(RM) -r bin lib - -distclean: clean - $(RM) config.log config.status Makefile libtool portaudio-2.0.pc - -%.o: %.c $(MAKEFILE) $(PAINC) - $(CC) -c $(CFLAGS) $< -o $@ - -%.lo: %.c $(MAKEFILE) $(PAINC) - $(LIBTOOL) --mode=compile $(CC) -c $(CFLAGS) $< -o $@ - -%.lo: %.cpp $(MAKEFILE) $(PAINC) - $(LIBTOOL) --mode=compile --tag=CXX $(CXX) -c $(CXXFLAGS) $< -o $@ - -%.o: %.cpp $(MAKEFILE) $(PAINC) - $(CXX) -c $(CXXFLAGS) $< -o $@ - -%.o: %.asm - $(NASM) $(NASMOPT) -o $@ $< - -bin-stamp: - -mkdir bin - touch $@ - -lib-stamp: - -mkdir lib - -mkdir -p $(SRC_DIRS) - touch $@ - -Makefile: Makefile.in config.status - $(SHELL) config.status - -all-recursive: - if test -n "$(SUBDIRS)" ; then for dir in "$(SUBDIRS)"; do $(MAKE) -C $$dir all; done ; fi - -install-recursive: - if test -n "$(SUBDIRS)" ; then for dir in "$(SUBDIRS)"; do $(MAKE) -C $$dir install; done ; fi - -uninstall-recursive: - if test -n "$(SUBDIRS)" ; then for dir in "$(SUBDIRS)"; do $(MAKE) -C $$dir uninstall; done ; fi diff --git a/portaudio-2.0.pc b/portaudio-2.0.pc deleted file mode 100644 index 5046d1e..0000000 --- a/portaudio-2.0.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/usr/local -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: PortAudio -Description: Portable audio I/O -Requires: -Version: 19 - -Libs: -L${libdir} -lportaudio -framework CoreAudio -framework AudioToolbox -framework AudioUnit -framework Carbon -Cflags: -I${includedir} diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index 77a50f4..ad6ebc5 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -384,23 +384,90 @@ static PaError CloseHandleWithPaError( HANDLE handle ) } /** - * Sets the transportType of a specific PaDeviceInfo to a - * value deduced by examining the other fields of the specified - * PaDeviceInfo. For example, if name field matches the - * regular expression \(.*USB.*\), the transportType is set to - * USB. + * Sets the transportType of a specific PaDeviceInfo. * + * @param winMmeDeviceId * @param deviceInfo the PaDeviceInfo to set the transportType * of */ -static void SetDeviceInfoTransportType(PaDeviceInfo *deviceInfo) +static void +SetDeviceInfoTransportType(UINT winMmeDeviceId, PaDeviceInfo *deviceInfo) { - const char *s = deviceInfo->name; + deviceInfo->transportType = NULL; - deviceInfo->transportType - = (s && (s = strrchr(s,'(')) && (s = strstr(s,"USB")) && strchr(s,')')) - ? "USB" - : NULL; +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO + if (!(deviceInfo->transportType)) + { + DWORD deviceInterfaceSize; + LPWSTR deviceInterface = NULL; + + if (deviceInfo->maxInputChannels > 0) + { + if (waveInMessage( + (HWAVEIN)winMmeDeviceId, + DRV_QUERYDEVICEINTERFACESIZE, + (DWORD_PTR)&deviceInterfaceSize, + 0) + == MMSYSERR_NOERROR) + { + deviceInterface = PaUtil_AllocateMemory(deviceInterfaceSize); + if (deviceInterface + && (waveInMessage( + (HWAVEIN)winMmeDeviceId, + DRV_QUERYDEVICEINTERFACE, + (DWORD_PTR)deviceInterface, + deviceInterfaceSize) + != MMSYSERR_NOERROR)) + { + PaUtil_FreeMemory(deviceInterface); + deviceInterface = NULL; + } + } + } + else if (deviceInfo->maxOutputChannels > 0) + { + if (waveOutMessage( + (HWAVEOUT)winMmeDeviceId, + DRV_QUERYDEVICEINTERFACESIZE, + (DWORD_PTR)&deviceInterfaceSize, + 0) + == MMSYSERR_NOERROR) + { + deviceInterface = PaUtil_AllocateMemory(deviceInterfaceSize); + if (deviceInterface + && (waveOutMessage( + (HWAVEOUT)winMmeDeviceId, + DRV_QUERYDEVICEINTERFACE, + (DWORD_PTR)deviceInterface, + deviceInterfaceSize) + != MMSYSERR_NOERROR)) + { + PaUtil_FreeMemory(deviceInterface); + deviceInterface = NULL; + } + } + } + if (deviceInterface) + { + if (wcsstr(deviceInterface, L"\\usb#") + || wcsstr(deviceInterface, L"\\USB#")) + deviceInfo->transportType = "USB"; + PaUtil_FreeMemory(deviceInterface); + } + } +#endif /* #ifdef PAWIN_USE_WDMKS_DEVICE_INFO */ + + /* + * As a last resort, attempt to make a decision about the transportType + * based on the name of the specified deviceInfo. + */ + if (!(deviceInfo->transportType)) + { + const char *s = deviceInfo->name; + + if (s && (s = strrchr(s,'(')) && (s = strstr(s,"USB")) && strchr(s,')')) + deviceInfo->transportType = "USB"; + } } /* PaWinMmeHostApiRepresentation - host api datastructure specific to this implementation */ @@ -755,9 +822,6 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH } deviceInfo->name = deviceName; - /* transportType */ - SetDeviceInfoTransportType(deviceInfo); - if( wic.wChannels == 0xFFFF || wic.wChannels < 1 || wic.wChannels > 255 ){ /* For Windows versions using WDM (possibly Windows 98 ME and later) * the kernel mixer sits between the application and the driver. As a result, @@ -782,6 +846,8 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH QueryWaveInKSFilterMaxChannels( winMmeInputDeviceId, &deviceInfo->maxInputChannels ); #endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + /* transportType */ + SetDeviceInfoTransportType(winMmeInputDeviceId, deviceInfo); MMRESULT mmr; size_t cbEndpointIdSize; @@ -932,9 +998,6 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme } deviceInfo->name = deviceName; - /* transportType */ - SetDeviceInfoTransportType(deviceInfo); - if( woc.wChannels == 0xFFFF || woc.wChannels < 1 || woc.wChannels > 255 ){ /* For Windows versions using WDM (possibly Windows 98 ME and later) * the kernel mixer sits between the application and the driver. As a result, @@ -961,6 +1024,9 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme winMmeDeviceInfo->deviceOutputChannelCountIsKnown = 1; #endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + /* transportType */ + SetDeviceInfoTransportType(winMmeOutputDeviceId, deviceInfo); + MMRESULT mmr; size_t cbEndpointIdSize; // Get the size (including the terminating null) of