Merge from default branch

This commit is contained in:
Chris Cannam
2021-09-30 15:27:33 +01:00
5 changed files with 79 additions and 39 deletions

View File

@@ -258,17 +258,11 @@ this:
$ meson build --cross-file cross/macos-universal.txt && ninja -C build $ meson build --cross-file cross/macos-universal.txt && ninja -C build
``` ```
However, the resulting binary will be marked as loadable on macOS 11+ Note that the universal cross file also sets the minimum OS version to
only, even for Intel, which is probably not what you want (ideally the the earliest supported macOS versions for both architectures. (Note
Intel slice would support older versions of the OS). A Makefile that that actual compatibility will also depend on how any dependent
handles this explicitly is also provided: libraries have been compiled.) You can edit this in the
`cross/macos-universal.txt` file if you want a specific target.
```
$ make -f otherbuilds/Makefile.macos-universal
```
This produces only a static library, but it's a universal binary that
is compatible with macOS 10.7 onwards on the Intel side.
See "FFT and resampler selection" below for further build options. See "FFT and resampler selection" below for further build options.
@@ -284,7 +278,7 @@ commercial terms.
Ensure the Xcode command-line tools are installed, and Ensure the Xcode command-line tools are installed, and
``` ```
$ meson build_ios --cross-file cross/ios.txt && ninja -C build $ meson build_ios --cross-file cross/ios.txt && ninja -C build_ios
``` ```
The output files will be found in the `build_ios` directory. The output files will be found in the `build_ios` directory.
@@ -292,7 +286,7 @@ The output files will be found in the `build_ios` directory.
To build for the simulator, To build for the simulator,
``` ```
$ meson build_sim --cross-file cross/ios-simulator.txt && ninja -C build $ meson build_sim --cross-file cross/ios-simulator.txt && ninja -C build_sim
``` ```
The output files will be found in the `build_sim` directory. The output files will be found in the `build_sim` directory.

View File

@@ -14,8 +14,8 @@ strip = 'strip'
pkgconfig = 'pkg-config' pkgconfig = 'pkg-config'
[built-in options] [built-in options]
c_args = ['-arch', 'arm64', '-arch', 'x86_64'] c_args = ['-arch', 'arm64', '-arch', 'x86_64', '-mmacosx-version-min=10.7']
cpp_args = ['-arch', 'arm64', '-arch', 'x86_64'] cpp_args = ['-arch', 'arm64', '-arch', 'x86_64', '-stdlib=libc++', '-mmacosx-version-min=10.7']
cpp_link_args = ['-arch', 'arm64', '-arch', 'x86_64'] cpp_link_args = ['-arch', 'arm64', '-arch', 'x86_64', '-stdlib=libc++', '-mmacosx-version-min=10.7']

View File

@@ -15,6 +15,6 @@ pkgconfig = 'pkg-config'
[built-in options] [built-in options]
c_args = ['-arch', 'x86_64'] c_args = ['-arch', 'x86_64']
cpp_args = ['-arch', 'x86_64'] cpp_args = ['-arch', 'x86_64', '-stdlib=libc++']
cpp_link_args = ['-arch', 'x86_64'] cpp_link_args = ['-arch', 'x86_64', '-stdlib=libc++']

View File

@@ -333,31 +333,43 @@ if system == 'darwin'
'-exported_symbols_list', meson.source_root() / 'vamp/vamp-plugin.list' '-exported_symbols_list', meson.source_root() / 'vamp/vamp-plugin.list'
] ]
have_version_min = false
foreach arg: get_option('cpp_args')
if arg.contains('version-min')
have_version_min = true
endif
endforeach
if architecture == 'aarch64' if architecture == 'aarch64'
arch_flags += [ arch_flags += [
'-arch', 'arm64', '-arch', 'arm64',
] ]
if not have_version_min
arch_flags += [ '-mmacosx-version-min=11' ]
endif
elif architecture == 'x86_64' elif architecture == 'x86_64'
arch_flags += [ arch_flags += [
'-arch', 'x86_64', '-arch', 'x86_64',
] ]
if not have_version_min
arch_flags += [ '-mmacosx-version-min=10.13' ]
endif
else # begin architecture != 'aarch64' or 'x86_64' else # begin architecture != 'aarch64' or 'x86_64'
error('Build for architecture ' + architecture + ' is not supported on this platform') error('Build for architecture ' + architecture + ' is not supported on this platform')
endif # end architecture endif # end architecture
have_version_min = false
foreach arg: get_option('cpp_args')
if arg.contains('version-min')
have_version_min = true
bits = arg.split('=')
if bits.length() > 1
config_summary += { 'Target OS': bits[1] + '+' }
else
config_summary += { 'Target OS': '(unknown)' }
endif
endif
endforeach
if not have_version_min
message('Using default minimum target OS version')
message('(consider specifying this in cross-file if earlier target is desired)')
if architecture == 'aarch64'
arch_flags += [ '-mmacosx-version-min=11' ]
config_summary += { 'Target OS': '11+' }
else
arch_flags += [ '-mmacosx-version-min=10.13' ]
config_summary += { 'Target OS': '10.13+' }
endif
endif
elif system == 'windows' elif system == 'windows'
feature_defines += ['-D_WIN32', '-DNOMINMAX', '-D_USE_MATH_DEFINES', '-DGETOPT_API='] feature_defines += ['-D_WIN32', '-DNOMINMAX', '-D_USE_MATH_DEFINES', '-DGETOPT_API=']
if cpp.get_id() == 'msvc' if cpp.get_id() == 'msvc'

View File

@@ -45,6 +45,21 @@
* The Rubber Band API is contained in the single class * The Rubber Band API is contained in the single class
* RubberBand::RubberBandStretcher. * RubberBand::RubberBandStretcher.
* *
* The Rubber Band stretcher supports two processing modes, offline
* and real-time. The choice of mode is fixed on construction. In
* offline mode, you must provide the audio block-by-block in two
* passes: in the first pass calling study(), in the second pass
* calling process() and receiving the output via retrieve(). In
* real-time mode, there is no study pass, just a single streaming
* pass in which the audio is passed to process() and output received
* via retrieve().
*
* In real-time mode you can change the time and pitch ratios at any
* time, but in offline mode they are fixed and cannot be changed
* after the study pass has begun. (However, see setKeyFrameMap() for
* a way to do pre-planned variable time stretching in offline mode.)
* Offline mode typically produces slightly more precise results.
*
* Threading notes for real-time applications: * Threading notes for real-time applications:
* *
* Multiple instances of RubberBandStretcher may be created and used * Multiple instances of RubberBandStretcher may be created and used
@@ -332,11 +347,28 @@ public:
/** /**
* Construct a time and pitch stretcher object to run at the given * Construct a time and pitch stretcher object to run at the given
* sample rate, with the given number of channels. Processing * sample rate, with the given number of channels.
* options and the time and pitch scaling ratios may be provided. *
* The time and pitch ratios may be changed after construction, * Initial time and pitch scaling ratios and other processing
* but most of the options may not. See the option documentation * options may be provided. In particular, the behaviour of the
* above for more details. * stretcher depends strongly on whether offline or real-time mode
* is selected on construction (via OptionProcessOffline or
* OptionProcessRealTime option - offline is the default).
*
* In offline mode, you must provide the audio block-by-block in
* two passes: in the first pass calling study(), in the second
* pass calling process() and receiving the output via
* retrieve(). In real-time mode, there is no study pass, just a
* single streaming pass in which the audio is passed to process()
* and output received via retrieve().
*
* In real-time mode you can change the time and pitch ratios at
* any time, but in offline mode they are fixed and cannot be
* changed after the study pass has begun. (However, see
* setKeyFrameMap() for a way to do pre-planned variable time
* stretching in offline mode.)
*
* See the option documentation above for more details.
*/ */
RubberBandStretcher(size_t sampleRate, RubberBandStretcher(size_t sampleRate,
size_t channels, size_t channels,
@@ -635,8 +667,10 @@ public:
/** /**
* Obtain some processed output data from the stretcher. Up to * Obtain some processed output data from the stretcher. Up to
* "samples" samples will be stored in the output arrays (one per * "samples" samples will be stored in each of the output arrays
* channel for de-interleaved audio data) pointed to by "output". * (one per channel for de-interleaved audio data) pointed to by
* "output". The number of sample frames available to be
* retrieved can be queried beforehand with a call to available().
* The return value is the actual number of sample frames * The return value is the actual number of sample frames
* retrieved. * retrieved.
* *