From b45ec9ed0a9e3afa60bd767897eca30aea45051d Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Fri, 2 Sep 2016 20:52:42 +1000 Subject: [PATCH] Moved hotplug function prototypes from random locations to new header file src/common/pa_hotplug.h. Added draft documentation and licence headers. In pa_front.c moved devices changed code next to refresh device list code. --- src/common/pa_front.c | 70 +++++++++++++------------- src/common/pa_hotplug.h | 98 +++++++++++++++++++++++++++++++++++++ src/os/win/pa_win_hotplug.c | 49 ++++++++++++++++--- 3 files changed, 172 insertions(+), 45 deletions(-) create mode 100644 src/common/pa_hotplug.h diff --git a/src/common/pa_front.c b/src/common/pa_front.c index e552569..615b39e 100644 --- a/src/common/pa_front.c +++ b/src/common/pa_front.c @@ -76,14 +76,12 @@ #include "pa_stream.h" #include "pa_trace.h" /* still usefull?*/ #include "pa_debugprint.h" +#include "pa_hotplug.h" #ifndef PA_SVN_REVISION #include "pa_svnrevision.h" #endif -extern void PaUtil_InitializeHotPlug(); -extern void PaUtil_TerminateHotPlug(); - /** * This is incremented if we make incompatible API changes. @@ -866,6 +864,37 @@ done: return result; } + +PaError Pa_SetDevicesChangedCallback( void *userData, PaStreamFinishedCallback* devicesChangedCallback ) +{ + PaUtil_LockHotPlug(); + devicesChangedCallback_ = devicesChangedCallback; + devicesChangedCallbackUserData_ = userData; + PaUtil_UnlockHotPlug(); + return paNoError; +} + +/* Called by platform hotplug implementation whenever a OS audio device change has been detected */ +void PaUtil_DevicesChanged(unsigned state, void* pData) +{ + (void)state; + (void)pData; + PaUtil_LockHotPlug(); + if (devicesChangedCallback_) + { + (devicesChangedCallback_)(devicesChangedCallbackUserData_); + } + PaUtil_UnlockHotPlug(); +} + +static PaDeviceConnectionId nextDeviceConnectionId_ = 1000; + +PaDeviceConnectionId PaUtil_MakeDeviceConnectionId( void ) +{ + return nextDeviceConnectionId_++; +} + + const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceIndex device ) { int hostSpecificDeviceIndex; @@ -1927,37 +1956,4 @@ PaError Pa_GetSampleSize( PaSampleFormat format ) PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( "Pa_GetSampleSize", "int: %d", result ); return (PaError) result; -} - -extern void PaUtil_LockHotPlug(); -extern void PaUtil_UnlockHotPlug(); - - -PaError Pa_SetDevicesChangedCallback( void *userData, PaStreamFinishedCallback* devicesChangedCallback ) -{ - PaUtil_LockHotPlug(); - devicesChangedCallback_ = devicesChangedCallback; - devicesChangedCallbackUserData_ = userData; - PaUtil_UnlockHotPlug(); - return paNoError; -} - -/* Called whenever a OS audio device change has been detected */ -void PaUtil_DevicesChanged(unsigned state, void* pData) -{ - (void)state; - (void)pData; - PaUtil_LockHotPlug(); - if (devicesChangedCallback_) - { - (devicesChangedCallback_)(devicesChangedCallbackUserData_); - } - PaUtil_UnlockHotPlug(); -} - -static PaDeviceConnectionId nextDeviceConnectionId_ = 1000; - -PaDeviceConnectionId PaUtil_MakeDeviceConnectionId( void ) -{ - return nextDeviceConnectionId_++; -} +} \ No newline at end of file diff --git a/src/common/pa_hotplug.h b/src/common/pa_hotplug.h new file mode 100644 index 0000000..703849a --- /dev/null +++ b/src/common/pa_hotplug.h @@ -0,0 +1,98 @@ +#ifndef PA_HOTPLUG_H +#define PA_HOTPLUG_H +/* + * $Id$ + * Portable Audio I/O Library + * hotplug interface and utilities + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2016 Ross Bencina, Phil Burk + * + * 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. + */ + +/** @file + @ingroup common_src + + @brief Utilities for implementing hotplug support. +*/ + +#include "portaudio.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/** Init/terminate hotplug notification engine. + + At the moment there is on hotplug implementation per platform. + It is responsible for posting devices changed notifications + by calling PaUtil_DevicesChanged. + + Once we support multiple notification mechanisms we'll probably + have the host APIs init and terminate their own notification + engines (using reference counting?) e.g. wasapi will have its own, + but other windows APIs will use the global windows notifier. + + Implemented in pa_win_hotplug.c +*/ +void PaUtil_InitializeHotPlug(); +void PaUtil_TerminateHotPlug(); + + +/** Invoke the client's registered devices changed notification. + + @param first 0 = unknown, 1 = insertion, 2 = removal + @param second Host specific device change info (in windows it is the (unicode) device path) + + Parameters are currently ignored. TODO REVIEW + + Implemented in pa_front.c +*/ +void PaUtil_DevicesChanged(unsigned, void*); + + +/** Lock/unlock a mutex used to protect the devices changed callback. + Used by pa_front.c to synchronise notification callbacks and client + requests to set/clear the device callback. + + Coded like this because we don't have a cross-platform mutex. + + Implemented in pa_win_hotplug.c +*/ +void PaUtil_LockHotPlug(); +void PaUtil_UnlockHotPlug(); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PA_HOTPLUG_H */ diff --git a/src/os/win/pa_win_hotplug.c b/src/os/win/pa_win_hotplug.c index 9257c0c..093c087 100644 --- a/src/os/win/pa_win_hotplug.c +++ b/src/os/win/pa_win_hotplug.c @@ -1,4 +1,44 @@ - +/* + * $Id$ + * Portable Audio I/O Library + * Hotplug interface and utilities + * Copyright (c) 2011-2016 Robert Bielik + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2016 Ross Bencina, Phil Burk + * + * 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 "pa_hotplug.h" #include "pa_util.h" #include "pa_debugprint.h" #include "pa_allocation.h" @@ -20,13 +60,6 @@ #pragma comment( lib, "setupapi.lib" ) #endif - -/* Implemented in pa_front.c - @param first 0 = unknown, 1 = insertion, 2 = removal - @param second Host specific device change info (in windows it is the (unicode) device path) -*/ -extern void PaUtil_DevicesChanged(unsigned, void*); - /* use CreateThread for CYGWIN/Windows Mobile, _beginthreadex for all others */ #if !defined(__CYGWIN__) && !defined(_WIN32_WCE) #define CREATE_THREAD_FUNCTION (HANDLE)_beginthreadex -- 2.43.0