diff --git a/portaudio-audacity.patch b/portaudio-audacity.patch index 9535f96..61883eb 100644 --- a/portaudio-audacity.patch +++ b/portaudio-audacity.patch @@ -1,6 +1,36 @@ -diff -wruN portaudio/include/pa_unix_oss.h portaudio-v19/include/pa_unix_oss.h ---- portaudio/include/pa_unix_oss.h 1969-12-31 18:00:00.000000000 -0600 -+++ portaudio-v19/include/pa_unix_oss.h 2012-12-14 22:34:14.290247100 -0600 +From 42dc9c90a703b8dd251d71389a7e6220a50a43a9 Mon Sep 17 00:00:00 2001 +From: Uwe Klotz +Date: Fri, 26 Mar 2021 10:43:46 +0100 +Subject: [PATCH] portaudio-audacity.patch + +--- + configure.in | 1 + + include/pa_unix_oss.h | 52 +++++++++++++++++++++++++++++++++++ + include/portaudio.h | 9 ++++++ + src/common/pa_front.c | 32 ++++++++++++++++++++- + src/common/pa_stream.c | 2 ++ + src/common/pa_stream.h | 1 + + src/hostapi/oss/pa_unix_oss.c | 26 ++++++++++++++++++ + 7 files changed, 122 insertions(+), 1 deletion(-) + create mode 100644 include/pa_unix_oss.h + +diff --git a/configure.in b/configure.in +index bb4ae96..fe0e112 100644 +--- a/configure.in ++++ b/configure.in +@@ -415,6 +415,7 @@ case "${host_os}" in + DLL_LIBS="$DLL_LIBS -lossaudio" + LIBS="$LIBS -lossaudio" + fi ++ INCLUDES="$INCLUDES pa_unix_oss.h" + AC_DEFINE(PA_USE_OSS,1) + fi + +diff --git a/include/pa_unix_oss.h b/include/pa_unix_oss.h +new file mode 100644 +index 0000000..2351e64 +--- /dev/null ++++ b/include/pa_unix_oss.h @@ -0,0 +1,52 @@ +#ifndef PA_UNIX_OSS_H +#define PA_UNIX_OSS_H @@ -54,13 +84,14 @@ diff -wruN portaudio/include/pa_unix_oss.h portaudio-v19/include/pa_unix_oss.h +#endif + +#endif -diff -wruN portaudio/include/portaudio.h portaudio-v19/include/portaudio.h ---- portaudio/include/portaudio.h 2012-08-31 19:10:13.000000000 -0500 -+++ portaudio-v19/include/portaudio.h 2012-12-14 22:34:14.368247200 -0600 -@@ -1146,6 +1146,15 @@ +diff --git a/include/portaudio.h b/include/portaudio.h +index 5d84731..7660c8a 100644 +--- a/include/portaudio.h ++++ b/include/portaudio.h +@@ -1200,6 +1200,15 @@ signed long Pa_GetStreamReadAvailable( PaStream* stream ); signed long Pa_GetStreamWriteAvailable( PaStream* stream ); - - + + +/** Retrieve the host type handling an open stream. + + @return Returns a non-negative value representing the host API type @@ -71,27 +102,28 @@ diff -wruN portaudio/include/portaudio.h portaudio-v19/include/portaudio.h + + /* Miscellaneous utilities */ - - -diff -wruN portaudio/src/common/pa_front.c portaudio-v19/src/common/pa_front.c ---- portaudio/src/common/pa_front.c 2012-12-04 12:39:48.000000000 -0600 -+++ portaudio-v19/src/common/pa_front.c 2012-12-14 09:44:34.604344800 -0600 -@@ -1216,8 +1216,10 @@ + + +diff --git a/src/common/pa_front.c b/src/common/pa_front.c +index 65a656f..02a67a8 100644 +--- a/src/common/pa_front.c ++++ b/src/common/pa_front.c +@@ -1257,8 +1257,10 @@ PaError Pa_OpenStream( PaStream** stream, hostApiInputParametersPtr, hostApiOutputParametersPtr, sampleRate, framesPerBuffer, streamFlags, streamCallback, userData ); - + - if( result == paNoError ) + if( result == paNoError ) { AddOpenStream( *stream ); + PA_STREAM_REP(*stream)->hostApiType = hostApi->info.type; + } - - + + PA_LOGAPI(("Pa_OpenStream returned:\n" )); -@@ -1729,6 +1731,32 @@ - return result; +@@ -1771,6 +1773,34 @@ signed long Pa_GetStreamWriteAvailable( PaStream* stream ) } - + + +PaHostApiTypeId Pa_GetStreamHostApiType( PaStream* stream ) +{ + PaError error = PaUtil_ValidateStreamPointer( stream ); @@ -118,39 +150,46 @@ diff -wruN portaudio/src/common/pa_front.c portaudio-v19/src/common/pa_front.c + + return result; +} - ++ ++ PaError Pa_GetSampleSize( PaSampleFormat format ) { -diff -wruN portaudio/src/common/pa_stream.c portaudio-v19/src/common/pa_stream.c ---- portaudio/src/common/pa_stream.c 2008-02-15 01:50:33.000000000 -0600 -+++ portaudio-v19/src/common/pa_stream.c 2012-12-14 09:44:34.607345000 -0600 -@@ -93,6 +93,8 @@ + int result; +diff --git a/src/common/pa_stream.c b/src/common/pa_stream.c +index ffbf530..305f7c8 100644 +--- a/src/common/pa_stream.c ++++ b/src/common/pa_stream.c +@@ -93,6 +93,8 @@ void PaUtil_InitializeStreamRepresentation( PaUtilStreamRepresentation *streamRe streamRepresentation->streamInfo.inputLatency = 0.; streamRepresentation->streamInfo.outputLatency = 0.; streamRepresentation->streamInfo.sampleRate = 0.; + + streamRepresentation->hostApiType = 0; } - - -diff -wruN portaudio/src/common/pa_stream.h portaudio-v19/src/common/pa_stream.h ---- portaudio/src/common/pa_stream.h 2008-02-15 01:50:33.000000000 -0600 -+++ portaudio-v19/src/common/pa_stream.h 2012-12-14 09:44:34.610345200 -0600 -@@ -152,6 +152,7 @@ + + +diff --git a/src/common/pa_stream.h b/src/common/pa_stream.h +index 4afda39..0a5cd1e 100644 +--- a/src/common/pa_stream.h ++++ b/src/common/pa_stream.h +@@ -152,6 +152,7 @@ typedef struct PaUtilStreamRepresentation { PaStreamFinishedCallback *streamFinishedCallback; void *userData; PaStreamInfo streamInfo; + PaHostApiTypeId hostApiType; } PaUtilStreamRepresentation; - - -diff -wruN portaudio/src/hostapi/oss/pa_unix_oss.c portaudio-v19/src/hostapi/oss/pa_unix_oss.c ---- portaudio/src/hostapi/oss/pa_unix_oss.c 2011-05-02 12:07:11.000000000 -0500 -+++ portaudio-v19/src/hostapi/oss/pa_unix_oss.c 2012-12-14 09:44:34.625346000 -0600 -@@ -2028,3 +2028,26 @@ + + +diff --git a/src/hostapi/oss/pa_unix_oss.c b/src/hostapi/oss/pa_unix_oss.c +index 20113e2..9dedc3f 100644 +--- a/src/hostapi/oss/pa_unix_oss.c ++++ b/src/hostapi/oss/pa_unix_oss.c +@@ -2050,3 +2050,29 @@ error: + return result; #endif } - ++ ++ +const char *PaOSS_GetStreamInputDevice( PaStream* s ) +{ + PaOssStream *stream = (PaOssStream*)s; @@ -163,6 +202,7 @@ diff -wruN portaudio/src/hostapi/oss/pa_unix_oss.c portaudio-v19/src/hostapi/oss + return NULL; +} + ++ +const char *PaOSS_GetStreamOutputDevice( PaStream* s ) +{ + PaOssStream *stream = (PaOssStream*)s; @@ -174,15 +214,6 @@ diff -wruN portaudio/src/hostapi/oss/pa_unix_oss.c portaudio-v19/src/hostapi/oss + + return NULL; +} -diff -up portaudio/configure.in~ portaudio/configure.in ---- portaudio/configure.in~ 2013-04-07 12:20:18.000000000 +0200 -+++ portaudio/configure.in 2013-05-04 15:14:14.356191153 +0200 -@@ -387,7 +387,7 @@ case "${host_os}" in - DLL_LIBS="$DLL_LIBS -lasound" - LIBS="$LIBS -lasound" - OTHER_OBJS="$OTHER_OBJS src/hostapi/alsa/pa_linux_alsa.o" -- INCLUDES="$INCLUDES pa_linux_alsa.h" -+ INCLUDES="$INCLUDES pa_linux_alsa.h pa_unix_oss.h" - AC_DEFINE(PA_USE_ALSA,1) - fi - +-- +2.30.2 + diff --git a/portaudio-pipewire-jacknames.patch b/portaudio-pipewire-jacknames.patch deleted file mode 100644 index f9c1b59..0000000 --- a/portaudio-pipewire-jacknames.patch +++ /dev/null @@ -1,194 +0,0 @@ -From eec7bb739771381ab698a6a611d933bdd72cbd8f Mon Sep 17 00:00:00 2001 -From: Be -Date: Fri, 19 Mar 2021 12:51:31 -0500 -Subject: [PATCH] JACK PipeWire fixes (escape regex chars) (#504) - -This patch fixes a problem caused by special regex characters -appearing in the device names when using the Jack interface to PipeWire. - -It is uncommon for JACK ports to have any characters that need to -be escaped in a regex. jackd simply calls the audio interface -"system". However PipeWire uses the device name from ALSA for the -JACK port names. If this contains any special regex characters, -BuildDeviceList would find the device but determine it has 0 -input channels and 0 output channels. In my case, I have an RME -Babyface Pro which puts its serial number in parentheses: - -$ aplay -l -card 0: Pro70785713 [Babyface Pro (70785713)], device 0: USB Audio [USB Audio] - Subdevices: 1/1 - Subdevice #0: subdevice #0 ---- - src/hostapi/jack/pa_jack.c | 83 +++++++++++++++++++++++++++++++++----- - 1 file changed, 73 insertions(+), 10 deletions(-) - -diff --git a/src/hostapi/jack/pa_jack.c b/src/hostapi/jack/pa_jack.c -index 0dad24fb..88926f47 100644 ---- a/src/hostapi/jack/pa_jack.c -+++ b/src/hostapi/jack/pa_jack.c -@@ -76,6 +76,7 @@ - static pthread_t mainThread_; - static char *jackErr_ = NULL; - static const char* clientName_ = "PortAudio"; -+static const char* port_regex_suffix = ":.*"; - - #define STRINGIZE_HELPER(expr) #expr - #define STRINGIZE(expr) STRINGIZE_HELPER(expr) -@@ -451,6 +452,38 @@ BlockingWaitEmpty( PaStream *s ) - - /* ---- jack driver ---- */ - -+/* copy null terminated string source to destination, escaping regex characters with '\\' in the process */ -+static void copy_string_and_escape_regex_chars( char *destination, const char *source, size_t destbuffersize ) -+{ -+ assert( destination != source ); -+ assert( destbuffersize > 0 ); -+ -+ char *dest = destination; -+ /* dest_stop is the last location that we can null-terminate the string */ -+ char *dest_stop = destination + (destbuffersize - 1); -+ -+ const char *src = source; -+ -+ while ( *src != '\0' && dest != dest_stop ) -+ { -+ const char c = *src; -+ if ( strchr( "\\()[]{}*+?|$^.", c ) != NULL ) -+ { -+ if( (dest + 1) == dest_stop ) -+ break; /* only proceed if we can write both c and the escape */ -+ -+ *dest = '\\'; -+ dest++; -+ } -+ *dest = c; -+ dest++; -+ -+ src++; -+ } -+ -+ *dest = '\0'; -+} -+ - /* BuildDeviceList(): - * - * The process of determining a list of PortAudio "devices" from -@@ -472,7 +505,12 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) - - const char **jack_ports = NULL; - char **client_names = NULL; -- char *regex_pattern = NULL; -+ char *port_regex_string = NULL; -+ char *device_name_regex_escaped = NULL; -+ // In the worst case scenario, every character would be escaped, doubling the string size. -+ // Add 1 for null terminator. -+ size_t device_name_regex_escaped_size = jack_client_name_size() * 2 + 1; -+ size_t port_regex_size = device_name_regex_escaped_size + strlen(port_regex_suffix); - int port_index, client_index, i; - double globalSampleRate; - regex_t port_regex; -@@ -490,7 +528,9 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) - * associated with the previous list */ - PaUtil_FreeAllAllocations( jackApi->deviceInfoMemory ); - -- regex_pattern = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jack_client_name_size() + 3 ); -+ port_regex_string = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, port_regex_size ); -+ device_name_regex_escaped = PaUtil_GroupAllocateMemory( -+ jackApi->deviceInfoMemory, device_name_regex_escaped_size ); - tmp_client_name = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jack_client_name_size() ); - - /* We can only retrieve the list of clients indirectly, by first -@@ -512,6 +552,7 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) - int client_seen = FALSE; - regmatch_t match_info; - const char *port = jack_ports[port_index]; -+ PA_DEBUG(( "JACK port found: %s\n", port )); - - /* extract the client name from the port name, using a regex - * that parses the clientname:portname syntax */ -@@ -584,11 +625,14 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) - - /* To determine how many input and output channels are available, - * we re-query jackd with more specific parameters. */ -- -- sprintf( regex_pattern, "%s:.*", client_names[client_index] ); -+ copy_string_and_escape_regex_chars( device_name_regex_escaped, -+ client_names[client_index], -+ device_name_regex_escaped_size ); -+ strncpy( port_regex_string, device_name_regex_escaped, port_regex_size ); -+ strncat( port_regex_string, port_regex_suffix, port_regex_size ); - - /* ... what are your output ports (that we could input from)? */ -- clientPorts = jack_get_ports( jackApi->jack_client, regex_pattern, -+ clientPorts = jack_get_ports( jackApi->jack_client, port_regex_string, - JACK_PORT_TYPE_FILTER, JackPortIsOutput); - curDevInfo->maxInputChannels = 0; - curDevInfo->defaultLowInputLatency = 0.; -@@ -609,7 +653,7 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) - } - - /* ... what are your input ports (that we could output to)? */ -- clientPorts = jack_get_ports( jackApi->jack_client, regex_pattern, -+ clientPorts = jack_get_ports( jackApi->jack_client, port_regex_string, - JACK_PORT_TYPE_FILTER, JackPortIsInput); - curDevInfo->maxOutputChannels = 0; - curDevInfo->defaultLowOutputLatency = 0.; -@@ -629,6 +673,11 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) - free(clientPorts); - } - -+ PA_DEBUG(( "Adding JACK device %s with %d input channels and %d output channels\n", -+ client_names[client_index], -+ curDevInfo->maxInputChannels, -+ curDevInfo->maxOutputChannels )); -+ - /* Add this client to the list of devices */ - commonApi->deviceInfos[client_index] = curDevInfo; - ++commonApi->info.deviceCount; -@@ -1080,8 +1129,13 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, - PaJackHostApiRepresentation *jackHostApi = (PaJackHostApiRepresentation*)hostApi; - PaJackStream *stream = NULL; - char *port_string = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, jack_port_name_size() ); -- unsigned long regexSz = jack_client_name_size() + 3; -- char *regex_pattern = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, regexSz ); -+ // In the worst case every character would be escaped which would double the string length. -+ // Add 1 for null terminator -+ size_t regex_escaped_client_name_length = jack_client_name_size() * 2 + 1; -+ char *regex_escaped_client_name = PaUtil_GroupAllocateMemory( -+ jackHostApi->deviceInfoMemory, regex_escaped_client_name_length ); -+ unsigned long regex_size = jack_client_name_size() * 2 + 1 + strlen(port_regex_suffix); -+ char *regex_pattern = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, regex_size ); - const char **jack_ports = NULL; - /* int jack_max_buffer_size = jack_get_buffer_size( jackHostApi->jack_client ); */ - int i; -@@ -1239,7 +1293,11 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, - int err = 0; - - /* Get output ports of our capture device */ -- snprintf( regex_pattern, regexSz, "%s:.*", hostApi->deviceInfos[ inputParameters->device ]->name ); -+ copy_string_and_escape_regex_chars( regex_escaped_client_name, -+ hostApi->deviceInfos[ inputParameters->device ]->name, -+ regex_escaped_client_name_length ); -+ strncpy( regex_pattern, regex_escaped_client_name, regex_size ); -+ strncat( regex_pattern, port_regex_suffix, regex_size ); - UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern, - JACK_PORT_TYPE_FILTER, JackPortIsOutput ), paUnanticipatedHostError ); - for( i = 0; i < inputChannelCount && jack_ports[i]; i++ ) -@@ -1263,7 +1321,11 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, - int err = 0; - - /* Get input ports of our playback device */ -- snprintf( regex_pattern, regexSz, "%s:.*", hostApi->deviceInfos[ outputParameters->device ]->name ); -+ copy_string_and_escape_regex_chars( regex_escaped_client_name, -+ hostApi->deviceInfos[ outputParameters->device ]->name, -+ regex_escaped_client_name_length ); -+ strncpy( regex_pattern, regex_escaped_client_name, regex_size ); -+ strncat( regex_pattern, port_regex_suffix, regex_size ); - UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern, - JACK_PORT_TYPE_FILTER, JackPortIsInput ), paUnanticipatedHostError ); - for( i = 0; i < outputChannelCount && jack_ports[i]; i++ ) -@@ -1769,3 +1831,4 @@ PaError PaJack_GetClientName(const char** clientName) - error: - return result; - } -+ diff --git a/portaudio.spec b/portaudio.spec index 7473187..49a0c35 100644 --- a/portaudio.spec +++ b/portaudio.spec @@ -1,18 +1,16 @@ Name: portaudio Version: 19 -Release: 34%{?dist} +Release: 35%{?dist} Summary: Free, cross platform, open-source, audio I/O library License: MIT URL: http://www.portaudio.com/ -Source0: http://www.portaudio.com/archives/pa_stable_v19_20140130.tgz +Source0: http://files.portaudio.com/archives/pa_stable_v190700_20210406.tgz Patch1: portaudio-doxynodate.patch Patch2: portaudio-pkgconfig-alsa.patch # Add some extra API needed by audacity # http://audacity.googlecode.com/svn/audacity-src/trunk/lib-src/portmixer/portaudio.patch Patch3: portaudio-audacity.patch -# Deal with pipewire jack identifiers containing chars which have special meanings in regexes -Patch4: portaudio-pipewire-jacknames.patch BuildRequires: make BuildRequires: doxygen @@ -67,7 +65,7 @@ doxygen %files %license LICENSE.txt -%doc README.txt +%doc README.md %{_libdir}/*.so.* %files devel @@ -83,6 +81,9 @@ doxygen %changelog +* Tue Apr 06 2021 Uwe Klotz - 19-35 +- rebuilt + * Mon Mar 22 2021 Hans de Goede - 19-34 - Deal with pipewire jack identifiers containing chars which have special meanings in regexes Resolves rhbz#1939749 diff --git a/sources b/sources index 95b8093..2d5630c 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -7f220406902af9dca009668e198cbd23 pa_stable_v19_20140130.tgz +77393bf0628ad9c9d5fb1b0d9b1732d403e23513b1332553964bdafcc80878b2798141011d2615688150d753a594285e718cf716e990b2396f1d8dea7babd02d pa_stable_v190700_20210406.tgz