Upgrade to pa_stable_v190700_20210406

- Upgraded the source package
- Rebuilt the audacity patch based on the upgraded source package
- Deleted obsolete portaudio-pipewire-jacknames.patch
- Fixed a minor bug in the audacity patch that mixed up the alsa and oss
  build options (didn't matter, because we enable both of them)
- Update sources file and replace MD5 with SHA512 hash
epel9
Uwe Klotz 4 years ago
parent 71dc5b5710
commit 5c1adf2a43

@ -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 <uwe.klotz@gmail.com>
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

@ -1,194 +0,0 @@
From eec7bb739771381ab698a6a611d933bdd72cbd8f Mon Sep 17 00:00:00 2001
From: Be <be@mixxx.org>
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;
}
+

@ -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 <uwe.klotz@gmail.com> - 19-35
- rebuilt
* Mon Mar 22 2021 Hans de Goede <hdegoede@redhat.com> - 19-34
- Deal with pipewire jack identifiers containing chars which have special meanings in regexes
Resolves rhbz#1939749

@ -1 +1 @@
7f220406902af9dca009668e198cbd23 pa_stable_v19_20140130.tgz
77393bf0628ad9c9d5fb1b0d9b1732d403e23513b1332553964bdafcc80878b2798141011d2615688150d753a594285e718cf716e990b2396f1d8dea7babd02d pa_stable_v190700_20210406.tgz

Loading…
Cancel
Save