pipewire/spa/plugins/audioconvert/meson.build
Wim Taymans 8971c488f3 audioconvert: add zeroramp and gap detection to audioconvert
Make a new zeroramp.duration and zeroramp.gap property on audioconver.
It detects N samples of silence before triggering a fade-in or fade-out
of the given zeroramp.duration.

The zeroramp.duration is by default 5ms and zeroramp.gap is set to 0.

When the zeroramp.gap is set to 0, the audioconver will not do any gap
detection but it will only do fade-out from the last sample when the IO
Buffer area is removed from a port.

This by default makes the audio adapter perform a fade-out when the last
input of the port mixer was removed and the mixer is no longer scheduled
and the IO Area removed from the audioconverter input port.
2026-06-17 17:11:42 +02:00

269 lines
7.1 KiB
Meson

audioconvert_sources = [
'audioadapter.c',
'audioconvert.c',
'plugin.c'
]
simd_cargs = []
simd_dependencies = []
opt_flags = []
if host_machine.cpu_family() != 'alpha'
opt_flags += '-Ofast'
else
opt_flags += '-O3'
endif
audioconvert_c = static_library('audioconvert_c',
[ 'channelmix-ops-c.c',
'biquad.c',
'crossover.c',
'volume-ops-c.c',
'gaps-ops-c.c',
'peaks-ops-c.c',
'resample-native-c.c',
'fmt-ops-c.c' ],
c_args : [ opt_flags ],
dependencies : [ spa_dep ],
install : false
)
simd_dependencies += audioconvert_c
if have_sse
audioconvert_sse = static_library('audioconvert_sse',
['resample-native-sse.c',
'volume-ops-sse.c',
'peaks-ops-sse.c',
'channelmix-ops-sse.c' ],
c_args : [sse_args, opt_flags, '-DHAVE_SSE'],
dependencies : [ spa_dep ],
install : false
)
simd_cargs += ['-DHAVE_SSE']
simd_dependencies += audioconvert_sse
endif
if have_sse2
audioconvert_sse2 = static_library('audioconvert_sse2',
['fmt-ops-sse2.c' ],
c_args : [sse2_args, '-O3', '-DHAVE_SSE2', simd_cargs],
dependencies : [ spa_dep ],
install : false
)
simd_cargs += ['-DHAVE_SSE2']
simd_dependencies += audioconvert_sse2
endif
if have_ssse3
audioconvert_ssse3 = static_library('audioconvert_ssse3',
['fmt-ops-ssse3.c',
'resample-native-ssse3.c' ],
c_args : [ssse3_args, '-O3', '-DHAVE_SSSE3', simd_cargs],
dependencies : [ spa_dep ],
install : false
)
simd_cargs += ['-DHAVE_SSSE3']
simd_dependencies += audioconvert_ssse3
endif
if have_sse41
audioconvert_sse41 = static_library('audioconvert_sse41',
['fmt-ops-sse41.c'],
c_args : [sse41_args, '-O3', '-DHAVE_SSE41', simd_cargs],
dependencies : [ spa_dep ],
install : false
)
simd_cargs += ['-DHAVE_SSE41']
simd_dependencies += audioconvert_sse41
endif
if have_avx
audioconvert_avx = static_library('audioconvert_avx',
['channelmix-ops-avx.c'],
c_args : [avx_args, '-O3', '-DHAVE_AVX', simd_cargs],
dependencies : [ spa_dep ],
install : false
)
simd_cargs += ['-DHAVE_AVX']
simd_dependencies += audioconvert_avx
endif
if have_avx2 and have_fma
audioconvert_avx2_fma = static_library('audioconvert_avx2_fma',
['resample-native-avx2.c'],
c_args : [avx2_args, fma_args, '-O3', '-DHAVE_AVX2', '-DHAVE_FMA', simd_cargs],
dependencies : [ spa_dep ],
install : false
)
simd_cargs += ['-DHAVE_AVX2', '-DHAVE_FMA']
simd_dependencies += audioconvert_avx2_fma
endif
if have_avx2
audioconvert_avx2 = static_library('audioconvert_avx2',
['fmt-ops-avx2.c'],
c_args : [avx2_args, '-O3', '-DHAVE_AVX2', simd_cargs],
dependencies : [ spa_dep ],
install : false
)
simd_cargs += ['-DHAVE_AVX2']
simd_dependencies += audioconvert_avx2
endif
if have_neon
audioconvert_neon = static_library('audioconvert_neon',
['resample-native-neon.c',
'fmt-ops-neon.c' ],
c_args : [neon_args, '-O3', '-DHAVE_NEON'],
dependencies : [ spa_dep ],
install : false
)
simd_cargs += ['-DHAVE_NEON']
simd_dependencies += audioconvert_neon
endif
if have_rvv
audioconvert_rvv = static_library('audioconvert_rvv',
['fmt-ops-rvv.c' ],
c_args : ['-O3', '-DHAVE_RVV'],
dependencies : [ spa_dep ],
install : false
)
simd_cargs += ['-DHAVE_RVV']
simd_dependencies += audioconvert_rvv
endif
sparesampledumpcoeffs_sources = [
'resample-native.c',
'resample-native-c.c',
'spa-resample-dump-coeffs.c',
]
sparesampledumpcoeffs = executable(
'spa-resample-dump-coeffs',
sparesampledumpcoeffs_sources,
c_args : [ '-DRESAMPLE_DISABLE_PRECOMP' ],
dependencies : [ spa_dep, mathlib_native ],
install : false,
native : true,
)
precomptuples = []
foreach tuple : get_option('resampler-precomp-tuples')
precomptuples += '-t ' + tuple
endforeach
resample_native_precomp_h = custom_target(
'resample-native-precomp.h',
output : 'resample-native-precomp.h',
capture : true,
command : [
sparesampledumpcoeffs,
] + precomptuples
)
audioconvert_lib = static_library('audioconvert',
['fmt-ops.c',
'channelmix-ops.c',
'gaps-ops.c',
'peaks-ops.c',
resample_native_precomp_h,
'resample-native.c',
'resample-peaks.c',
'wavfile.c',
'volume-ops.c' ],
c_args : [ simd_cargs, '-O3'],
link_with : simd_dependencies,
include_directories : [configinc],
dependencies : [ spa_dep ],
install : false
)
audioconvert_dep = declare_dependency(link_with: audioconvert_lib)
spa_audioconvert_lib = shared_library('spa-audioconvert',
audioconvert_sources,
c_args : simd_cargs,
dependencies : [ spa_dep, mathlib, audioconvert_dep ],
install : true,
install_dir : spa_plugindir / 'audioconvert')
spa_audioconvert_dep = declare_dependency(link_with: spa_audioconvert_lib)
test_lib = static_library('test_lib',
['test-source.c' ],
c_args : ['-O3'],
dependencies : [ spa_dep ],
install : false
)
test_inc = include_directories('../test')
test_apps = [
'test-audioadapter',
'test-audioconvert',
'test-channelmix',
'test-fmt-ops',
'test-peaks',
'test-resample',
'test-resample-delay',
]
foreach a : test_apps
test(a,
executable(a, a + '.c',
dependencies : [ spa_dep, dl_lib, pthread_lib, mathlib, audioconvert_dep, spa_audioconvert_dep ],
include_directories : [ configinc, test_inc ],
link_with : [ test_lib ],
install_rpath : spa_plugindir / 'audioconvert',
c_args : [ simd_cargs ],
install : installed_tests_enabled,
install_dir : installed_tests_execdir / 'audioconvert'),
env : [
'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable('plugindir')),
])
if installed_tests_enabled
test_conf = configuration_data()
test_conf.set('exec', installed_tests_execdir / 'audioconvert' / a)
configure_file(
input: installed_tests_template,
output: a + '.test',
install_dir: installed_tests_metadir / 'audioconvert',
configuration: test_conf
)
endif
endforeach
benchmark_apps = [
'benchmark-fmt-ops',
'benchmark-resample',
]
foreach a : benchmark_apps
benchmark(a,
executable(a, a + '.c',
dependencies : [ spa_dep, dl_lib, pthread_lib, mathlib, audioconvert_dep, spa_audioconvert_dep ],
include_directories : [ configinc, test_inc ],
c_args : [ simd_cargs ],
install_rpath : spa_plugindir / 'audioconvert',
install : installed_tests_enabled,
install_dir : installed_tests_execdir / 'audioconvert'),
env : [
'SPA_PLUGIN_DIR=@0@'.format(spa_dep.get_variable('plugindir')),
])
if installed_tests_enabled
test_conf = configuration_data()
test_conf.set('exec', installed_tests_execdir / 'audioconvert' / a)
configure_file(
input: installed_tests_template,
output: a + '.test',
install_dir: installed_tests_metadir / 'audioconvert',
configuration: test_conf
)
endif
endforeach
if sndfile_dep.found()
sparesample_sources = [
'spa-resample.c',
]
executable('spa-resample',
sparesample_sources,
link_with : [ test_lib ],
dependencies : [ spa_dep, sndfile_dep, mathlib, audioconvert_dep ],
install : true,
)
endif