153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 553a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 653a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 753a5a1b3Sopenharmony_ci or (at your option) any later version. 853a5a1b3Sopenharmony_ci 953a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1053a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1153a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1253a5a1b3Sopenharmony_ci General Public License for more details. 1353a5a1b3Sopenharmony_ci 1453a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1553a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1653a5a1b3Sopenharmony_ci***/ 1753a5a1b3Sopenharmony_ci 1853a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 1953a5a1b3Sopenharmony_ci#include <config.h> 2053a5a1b3Sopenharmony_ci#endif 2153a5a1b3Sopenharmony_ci 2253a5a1b3Sopenharmony_ci#include <stdio.h> 2353a5a1b3Sopenharmony_ci#include <getopt.h> 2453a5a1b3Sopenharmony_ci#include <locale.h> 2553a5a1b3Sopenharmony_ci 2653a5a1b3Sopenharmony_ci#include <pulse/pulseaudio.h> 2753a5a1b3Sopenharmony_ci 2853a5a1b3Sopenharmony_ci#include <pulse/rtclock.h> 2953a5a1b3Sopenharmony_ci#include <pulse/sample.h> 3053a5a1b3Sopenharmony_ci#include <pulse/volume.h> 3153a5a1b3Sopenharmony_ci 3253a5a1b3Sopenharmony_ci#include <pulsecore/i18n.h> 3353a5a1b3Sopenharmony_ci#include <pulsecore/log.h> 3453a5a1b3Sopenharmony_ci#include <pulsecore/resampler.h> 3553a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 3653a5a1b3Sopenharmony_ci#include <pulsecore/endianmacros.h> 3753a5a1b3Sopenharmony_ci#include <pulsecore/memblock.h> 3853a5a1b3Sopenharmony_ci#include <pulsecore/sample-util.h> 3953a5a1b3Sopenharmony_ci#include <pulsecore/core-util.h> 4053a5a1b3Sopenharmony_ci 4153a5a1b3Sopenharmony_cistatic void dump_block(const char *label, const pa_sample_spec *ss, const pa_memchunk *chunk) { 4253a5a1b3Sopenharmony_ci void *d; 4353a5a1b3Sopenharmony_ci unsigned i; 4453a5a1b3Sopenharmony_ci 4553a5a1b3Sopenharmony_ci if (getenv("MAKE_CHECK")) 4653a5a1b3Sopenharmony_ci return; 4753a5a1b3Sopenharmony_ci printf("%s: \t", label); 4853a5a1b3Sopenharmony_ci 4953a5a1b3Sopenharmony_ci d = pa_memblock_acquire(chunk->memblock); 5053a5a1b3Sopenharmony_ci 5153a5a1b3Sopenharmony_ci switch (ss->format) { 5253a5a1b3Sopenharmony_ci 5353a5a1b3Sopenharmony_ci case PA_SAMPLE_U8: 5453a5a1b3Sopenharmony_ci case PA_SAMPLE_ULAW: 5553a5a1b3Sopenharmony_ci case PA_SAMPLE_ALAW: { 5653a5a1b3Sopenharmony_ci uint8_t *u = d; 5753a5a1b3Sopenharmony_ci 5853a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) 5953a5a1b3Sopenharmony_ci printf(" 0x%02x ", *(u++)); 6053a5a1b3Sopenharmony_ci 6153a5a1b3Sopenharmony_ci break; 6253a5a1b3Sopenharmony_ci } 6353a5a1b3Sopenharmony_ci 6453a5a1b3Sopenharmony_ci case PA_SAMPLE_S16NE: 6553a5a1b3Sopenharmony_ci case PA_SAMPLE_S16RE: { 6653a5a1b3Sopenharmony_ci uint16_t *u = d; 6753a5a1b3Sopenharmony_ci 6853a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) 6953a5a1b3Sopenharmony_ci printf(" 0x%04x ", *(u++)); 7053a5a1b3Sopenharmony_ci 7153a5a1b3Sopenharmony_ci break; 7253a5a1b3Sopenharmony_ci } 7353a5a1b3Sopenharmony_ci 7453a5a1b3Sopenharmony_ci case PA_SAMPLE_S32NE: 7553a5a1b3Sopenharmony_ci case PA_SAMPLE_S32RE: { 7653a5a1b3Sopenharmony_ci uint32_t *u = d; 7753a5a1b3Sopenharmony_ci 7853a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) 7953a5a1b3Sopenharmony_ci printf("0x%08x ", *(u++)); 8053a5a1b3Sopenharmony_ci 8153a5a1b3Sopenharmony_ci break; 8253a5a1b3Sopenharmony_ci } 8353a5a1b3Sopenharmony_ci 8453a5a1b3Sopenharmony_ci case PA_SAMPLE_S24_32NE: 8553a5a1b3Sopenharmony_ci case PA_SAMPLE_S24_32RE: { 8653a5a1b3Sopenharmony_ci uint32_t *u = d; 8753a5a1b3Sopenharmony_ci 8853a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) 8953a5a1b3Sopenharmony_ci printf("0x%08x ", *(u++)); 9053a5a1b3Sopenharmony_ci 9153a5a1b3Sopenharmony_ci break; 9253a5a1b3Sopenharmony_ci } 9353a5a1b3Sopenharmony_ci 9453a5a1b3Sopenharmony_ci case PA_SAMPLE_FLOAT32NE: 9553a5a1b3Sopenharmony_ci case PA_SAMPLE_FLOAT32RE: { 9653a5a1b3Sopenharmony_ci float *u = d; 9753a5a1b3Sopenharmony_ci 9853a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) { 9953a5a1b3Sopenharmony_ci printf("%4.3g ", ss->format == PA_SAMPLE_FLOAT32NE ? *u : PA_READ_FLOAT32RE(u)); 10053a5a1b3Sopenharmony_ci u++; 10153a5a1b3Sopenharmony_ci } 10253a5a1b3Sopenharmony_ci 10353a5a1b3Sopenharmony_ci break; 10453a5a1b3Sopenharmony_ci } 10553a5a1b3Sopenharmony_ci 10653a5a1b3Sopenharmony_ci case PA_SAMPLE_S24LE: 10753a5a1b3Sopenharmony_ci case PA_SAMPLE_S24BE: { 10853a5a1b3Sopenharmony_ci uint8_t *u = d; 10953a5a1b3Sopenharmony_ci 11053a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) { 11153a5a1b3Sopenharmony_ci printf(" 0x%06x ", PA_READ24NE(u)); 11253a5a1b3Sopenharmony_ci u += pa_frame_size(ss); 11353a5a1b3Sopenharmony_ci } 11453a5a1b3Sopenharmony_ci 11553a5a1b3Sopenharmony_ci break; 11653a5a1b3Sopenharmony_ci } 11753a5a1b3Sopenharmony_ci 11853a5a1b3Sopenharmony_ci default: 11953a5a1b3Sopenharmony_ci pa_assert_not_reached(); 12053a5a1b3Sopenharmony_ci } 12153a5a1b3Sopenharmony_ci 12253a5a1b3Sopenharmony_ci printf("\n"); 12353a5a1b3Sopenharmony_ci 12453a5a1b3Sopenharmony_ci pa_memblock_release(chunk->memblock); 12553a5a1b3Sopenharmony_ci} 12653a5a1b3Sopenharmony_ci 12753a5a1b3Sopenharmony_cistatic pa_memblock* generate_block(pa_mempool *pool, const pa_sample_spec *ss) { 12853a5a1b3Sopenharmony_ci pa_memblock *r; 12953a5a1b3Sopenharmony_ci void *d; 13053a5a1b3Sopenharmony_ci unsigned i; 13153a5a1b3Sopenharmony_ci 13253a5a1b3Sopenharmony_ci pa_assert_se(r = pa_memblock_new(pool, pa_frame_size(ss) * 10)); 13353a5a1b3Sopenharmony_ci d = pa_memblock_acquire(r); 13453a5a1b3Sopenharmony_ci 13553a5a1b3Sopenharmony_ci switch (ss->format) { 13653a5a1b3Sopenharmony_ci 13753a5a1b3Sopenharmony_ci case PA_SAMPLE_U8: 13853a5a1b3Sopenharmony_ci case PA_SAMPLE_ULAW: 13953a5a1b3Sopenharmony_ci case PA_SAMPLE_ALAW: { 14053a5a1b3Sopenharmony_ci uint8_t *u = d; 14153a5a1b3Sopenharmony_ci 14253a5a1b3Sopenharmony_ci u[0] = 0x00; 14353a5a1b3Sopenharmony_ci u[1] = 0xFF; 14453a5a1b3Sopenharmony_ci u[2] = 0x7F; 14553a5a1b3Sopenharmony_ci u[3] = 0x80; 14653a5a1b3Sopenharmony_ci u[4] = 0x9f; 14753a5a1b3Sopenharmony_ci u[5] = 0x3f; 14853a5a1b3Sopenharmony_ci u[6] = 0x1; 14953a5a1b3Sopenharmony_ci u[7] = 0xF0; 15053a5a1b3Sopenharmony_ci u[8] = 0x20; 15153a5a1b3Sopenharmony_ci u[9] = 0x21; 15253a5a1b3Sopenharmony_ci break; 15353a5a1b3Sopenharmony_ci } 15453a5a1b3Sopenharmony_ci 15553a5a1b3Sopenharmony_ci case PA_SAMPLE_S16NE: 15653a5a1b3Sopenharmony_ci case PA_SAMPLE_S16RE: { 15753a5a1b3Sopenharmony_ci uint16_t *u = d; 15853a5a1b3Sopenharmony_ci 15953a5a1b3Sopenharmony_ci u[0] = 0x0000; 16053a5a1b3Sopenharmony_ci u[1] = 0xFFFF; 16153a5a1b3Sopenharmony_ci u[2] = 0x7FFF; 16253a5a1b3Sopenharmony_ci u[3] = 0x8000; 16353a5a1b3Sopenharmony_ci u[4] = 0x9fff; 16453a5a1b3Sopenharmony_ci u[5] = 0x3fff; 16553a5a1b3Sopenharmony_ci u[6] = 0x1; 16653a5a1b3Sopenharmony_ci u[7] = 0xF000; 16753a5a1b3Sopenharmony_ci u[8] = 0x20; 16853a5a1b3Sopenharmony_ci u[9] = 0x21; 16953a5a1b3Sopenharmony_ci break; 17053a5a1b3Sopenharmony_ci } 17153a5a1b3Sopenharmony_ci 17253a5a1b3Sopenharmony_ci case PA_SAMPLE_S32NE: 17353a5a1b3Sopenharmony_ci case PA_SAMPLE_S32RE: { 17453a5a1b3Sopenharmony_ci uint32_t *u = d; 17553a5a1b3Sopenharmony_ci 17653a5a1b3Sopenharmony_ci u[0] = 0x00000001; 17753a5a1b3Sopenharmony_ci u[1] = 0xFFFF0002; 17853a5a1b3Sopenharmony_ci u[2] = 0x7FFF0003; 17953a5a1b3Sopenharmony_ci u[3] = 0x80000004; 18053a5a1b3Sopenharmony_ci u[4] = 0x9fff0005; 18153a5a1b3Sopenharmony_ci u[5] = 0x3fff0006; 18253a5a1b3Sopenharmony_ci u[6] = 0x10007; 18353a5a1b3Sopenharmony_ci u[7] = 0xF0000008; 18453a5a1b3Sopenharmony_ci u[8] = 0x200009; 18553a5a1b3Sopenharmony_ci u[9] = 0x21000A; 18653a5a1b3Sopenharmony_ci break; 18753a5a1b3Sopenharmony_ci } 18853a5a1b3Sopenharmony_ci 18953a5a1b3Sopenharmony_ci case PA_SAMPLE_S24_32NE: 19053a5a1b3Sopenharmony_ci case PA_SAMPLE_S24_32RE: { 19153a5a1b3Sopenharmony_ci uint32_t *u = d; 19253a5a1b3Sopenharmony_ci 19353a5a1b3Sopenharmony_ci u[0] = 0x000001; 19453a5a1b3Sopenharmony_ci u[1] = 0xFF0002; 19553a5a1b3Sopenharmony_ci u[2] = 0x7F0003; 19653a5a1b3Sopenharmony_ci u[3] = 0x800004; 19753a5a1b3Sopenharmony_ci u[4] = 0x9f0005; 19853a5a1b3Sopenharmony_ci u[5] = 0x3f0006; 19953a5a1b3Sopenharmony_ci u[6] = 0x107; 20053a5a1b3Sopenharmony_ci u[7] = 0xF00008; 20153a5a1b3Sopenharmony_ci u[8] = 0x2009; 20253a5a1b3Sopenharmony_ci u[9] = 0x210A; 20353a5a1b3Sopenharmony_ci break; 20453a5a1b3Sopenharmony_ci } 20553a5a1b3Sopenharmony_ci 20653a5a1b3Sopenharmony_ci case PA_SAMPLE_FLOAT32NE: 20753a5a1b3Sopenharmony_ci case PA_SAMPLE_FLOAT32RE: { 20853a5a1b3Sopenharmony_ci float *u = d; 20953a5a1b3Sopenharmony_ci 21053a5a1b3Sopenharmony_ci u[0] = 0.0f; 21153a5a1b3Sopenharmony_ci u[1] = -1.0f; 21253a5a1b3Sopenharmony_ci u[2] = 1.0f; 21353a5a1b3Sopenharmony_ci u[3] = 4711.0f; 21453a5a1b3Sopenharmony_ci u[4] = 0.222f; 21553a5a1b3Sopenharmony_ci u[5] = 0.33f; 21653a5a1b3Sopenharmony_ci u[6] = -.3f; 21753a5a1b3Sopenharmony_ci u[7] = 99.0f; 21853a5a1b3Sopenharmony_ci u[8] = -0.555f; 21953a5a1b3Sopenharmony_ci u[9] = -.123f; 22053a5a1b3Sopenharmony_ci 22153a5a1b3Sopenharmony_ci if (ss->format == PA_SAMPLE_FLOAT32RE) 22253a5a1b3Sopenharmony_ci for (i = 0; i < 10; i++) 22353a5a1b3Sopenharmony_ci PA_WRITE_FLOAT32RE(&u[i], u[i]); 22453a5a1b3Sopenharmony_ci 22553a5a1b3Sopenharmony_ci break; 22653a5a1b3Sopenharmony_ci } 22753a5a1b3Sopenharmony_ci 22853a5a1b3Sopenharmony_ci case PA_SAMPLE_S24NE: 22953a5a1b3Sopenharmony_ci case PA_SAMPLE_S24RE: { 23053a5a1b3Sopenharmony_ci uint8_t *u = d; 23153a5a1b3Sopenharmony_ci 23253a5a1b3Sopenharmony_ci PA_WRITE24NE(u, 0x000001); 23353a5a1b3Sopenharmony_ci PA_WRITE24NE(u+3, 0xFF0002); 23453a5a1b3Sopenharmony_ci PA_WRITE24NE(u+6, 0x7F0003); 23553a5a1b3Sopenharmony_ci PA_WRITE24NE(u+9, 0x800004); 23653a5a1b3Sopenharmony_ci PA_WRITE24NE(u+12, 0x9f0005); 23753a5a1b3Sopenharmony_ci PA_WRITE24NE(u+15, 0x3f0006); 23853a5a1b3Sopenharmony_ci PA_WRITE24NE(u+18, 0x107); 23953a5a1b3Sopenharmony_ci PA_WRITE24NE(u+21, 0xF00008); 24053a5a1b3Sopenharmony_ci PA_WRITE24NE(u+24, 0x2009); 24153a5a1b3Sopenharmony_ci PA_WRITE24NE(u+27, 0x210A); 24253a5a1b3Sopenharmony_ci break; 24353a5a1b3Sopenharmony_ci } 24453a5a1b3Sopenharmony_ci 24553a5a1b3Sopenharmony_ci default: 24653a5a1b3Sopenharmony_ci pa_assert_not_reached(); 24753a5a1b3Sopenharmony_ci } 24853a5a1b3Sopenharmony_ci 24953a5a1b3Sopenharmony_ci pa_memblock_release(r); 25053a5a1b3Sopenharmony_ci 25153a5a1b3Sopenharmony_ci return r; 25253a5a1b3Sopenharmony_ci} 25353a5a1b3Sopenharmony_ci 25453a5a1b3Sopenharmony_cistatic void help(const char *argv0) { 25553a5a1b3Sopenharmony_ci printf("%s [options]\n\n" 25653a5a1b3Sopenharmony_ci "-h, --help Show this help\n" 25753a5a1b3Sopenharmony_ci "-v, --verbose Print debug messages\n" 25853a5a1b3Sopenharmony_ci " --from-rate=SAMPLERATE From sample rate in Hz (defaults to 44100)\n" 25953a5a1b3Sopenharmony_ci " --from-format=SAMPLEFORMAT From sample type (defaults to s16le)\n" 26053a5a1b3Sopenharmony_ci " --from-channels=CHANNELS From number of channels (defaults to 1)\n" 26153a5a1b3Sopenharmony_ci " --to-rate=SAMPLERATE To sample rate in Hz (defaults to 44100)\n" 26253a5a1b3Sopenharmony_ci " --to-format=SAMPLEFORMAT To sample type (defaults to s16le)\n" 26353a5a1b3Sopenharmony_ci " --to-channels=CHANNELS To number of channels (defaults to 1)\n" 26453a5a1b3Sopenharmony_ci " --resample-method=METHOD Resample method (defaults to auto)\n" 26553a5a1b3Sopenharmony_ci " --seconds=SECONDS From stream duration (defaults to 60)\n" 26653a5a1b3Sopenharmony_ci "\n" 26753a5a1b3Sopenharmony_ci "If the formats are not specified, the test performs all formats combinations,\n" 26853a5a1b3Sopenharmony_ci "back and forth.\n" 26953a5a1b3Sopenharmony_ci "\n" 27053a5a1b3Sopenharmony_ci "Sample type must be one of s16le, s16be, u8, float32le, float32be, ulaw, alaw,\n" 27153a5a1b3Sopenharmony_ci "s24le, s24be, s24-32le, s24-32be, s32le, s32be (defaults to s16ne)\n" 27253a5a1b3Sopenharmony_ci "\n" 27353a5a1b3Sopenharmony_ci "See --dump-resample-methods for possible values of resample methods.\n", 27453a5a1b3Sopenharmony_ci argv0); 27553a5a1b3Sopenharmony_ci} 27653a5a1b3Sopenharmony_ci 27753a5a1b3Sopenharmony_cienum { 27853a5a1b3Sopenharmony_ci ARG_VERSION = 256, 27953a5a1b3Sopenharmony_ci ARG_FROM_SAMPLERATE, 28053a5a1b3Sopenharmony_ci ARG_FROM_SAMPLEFORMAT, 28153a5a1b3Sopenharmony_ci ARG_FROM_CHANNELS, 28253a5a1b3Sopenharmony_ci ARG_TO_SAMPLERATE, 28353a5a1b3Sopenharmony_ci ARG_TO_SAMPLEFORMAT, 28453a5a1b3Sopenharmony_ci ARG_TO_CHANNELS, 28553a5a1b3Sopenharmony_ci ARG_SECONDS, 28653a5a1b3Sopenharmony_ci ARG_RESAMPLE_METHOD, 28753a5a1b3Sopenharmony_ci ARG_DUMP_RESAMPLE_METHODS 28853a5a1b3Sopenharmony_ci}; 28953a5a1b3Sopenharmony_ci 29053a5a1b3Sopenharmony_cistatic void dump_resample_methods(void) { 29153a5a1b3Sopenharmony_ci int i; 29253a5a1b3Sopenharmony_ci 29353a5a1b3Sopenharmony_ci for (i = 0; i < PA_RESAMPLER_MAX; i++) 29453a5a1b3Sopenharmony_ci if (pa_resample_method_supported(i)) 29553a5a1b3Sopenharmony_ci printf("%s\n", pa_resample_method_to_string(i)); 29653a5a1b3Sopenharmony_ci 29753a5a1b3Sopenharmony_ci} 29853a5a1b3Sopenharmony_ci 29953a5a1b3Sopenharmony_ciint main(int argc, char *argv[]) { 30053a5a1b3Sopenharmony_ci pa_mempool *pool = NULL; 30153a5a1b3Sopenharmony_ci pa_sample_spec a, b; 30253a5a1b3Sopenharmony_ci int ret = 1, c; 30353a5a1b3Sopenharmony_ci bool all_formats = true; 30453a5a1b3Sopenharmony_ci pa_resample_method_t method; 30553a5a1b3Sopenharmony_ci int seconds; 30653a5a1b3Sopenharmony_ci unsigned crossover_freq = 120; 30753a5a1b3Sopenharmony_ci 30853a5a1b3Sopenharmony_ci static const struct option long_options[] = { 30953a5a1b3Sopenharmony_ci {"help", 0, NULL, 'h'}, 31053a5a1b3Sopenharmony_ci {"verbose", 0, NULL, 'v'}, 31153a5a1b3Sopenharmony_ci {"version", 0, NULL, ARG_VERSION}, 31253a5a1b3Sopenharmony_ci {"from-rate", 1, NULL, ARG_FROM_SAMPLERATE}, 31353a5a1b3Sopenharmony_ci {"from-format", 1, NULL, ARG_FROM_SAMPLEFORMAT}, 31453a5a1b3Sopenharmony_ci {"from-channels", 1, NULL, ARG_FROM_CHANNELS}, 31553a5a1b3Sopenharmony_ci {"to-rate", 1, NULL, ARG_TO_SAMPLERATE}, 31653a5a1b3Sopenharmony_ci {"to-format", 1, NULL, ARG_TO_SAMPLEFORMAT}, 31753a5a1b3Sopenharmony_ci {"to-channels", 1, NULL, ARG_TO_CHANNELS}, 31853a5a1b3Sopenharmony_ci {"seconds", 1, NULL, ARG_SECONDS}, 31953a5a1b3Sopenharmony_ci {"resample-method", 1, NULL, ARG_RESAMPLE_METHOD}, 32053a5a1b3Sopenharmony_ci {"dump-resample-methods", 0, NULL, ARG_DUMP_RESAMPLE_METHODS}, 32153a5a1b3Sopenharmony_ci {NULL, 0, NULL, 0} 32253a5a1b3Sopenharmony_ci }; 32353a5a1b3Sopenharmony_ci 32453a5a1b3Sopenharmony_ci setlocale(LC_ALL, ""); 32553a5a1b3Sopenharmony_ci#ifdef ENABLE_NLS 32653a5a1b3Sopenharmony_ci bindtextdomain(GETTEXT_PACKAGE, PULSE_LOCALEDIR); 32753a5a1b3Sopenharmony_ci#endif 32853a5a1b3Sopenharmony_ci 32953a5a1b3Sopenharmony_ci pa_log_set_level(PA_LOG_WARN); 33053a5a1b3Sopenharmony_ci if (!getenv("MAKE_CHECK")) 33153a5a1b3Sopenharmony_ci pa_log_set_level(PA_LOG_INFO); 33253a5a1b3Sopenharmony_ci 33353a5a1b3Sopenharmony_ci a.channels = b.channels = 1; 33453a5a1b3Sopenharmony_ci a.rate = b.rate = 44100; 33553a5a1b3Sopenharmony_ci a.format = b.format = PA_SAMPLE_S16LE; 33653a5a1b3Sopenharmony_ci 33753a5a1b3Sopenharmony_ci method = PA_RESAMPLER_AUTO; 33853a5a1b3Sopenharmony_ci seconds = 60; 33953a5a1b3Sopenharmony_ci 34053a5a1b3Sopenharmony_ci while ((c = getopt_long(argc, argv, "hv", long_options, NULL)) != -1) { 34153a5a1b3Sopenharmony_ci 34253a5a1b3Sopenharmony_ci switch (c) { 34353a5a1b3Sopenharmony_ci case 'h' : 34453a5a1b3Sopenharmony_ci help(argv[0]); 34553a5a1b3Sopenharmony_ci ret = 0; 34653a5a1b3Sopenharmony_ci goto quit; 34753a5a1b3Sopenharmony_ci 34853a5a1b3Sopenharmony_ci case 'v': 34953a5a1b3Sopenharmony_ci pa_log_set_level(PA_LOG_DEBUG); 35053a5a1b3Sopenharmony_ci break; 35153a5a1b3Sopenharmony_ci 35253a5a1b3Sopenharmony_ci case ARG_VERSION: 35353a5a1b3Sopenharmony_ci printf("%s %s\n", argv[0], PACKAGE_VERSION); 35453a5a1b3Sopenharmony_ci ret = 0; 35553a5a1b3Sopenharmony_ci goto quit; 35653a5a1b3Sopenharmony_ci 35753a5a1b3Sopenharmony_ci case ARG_DUMP_RESAMPLE_METHODS: 35853a5a1b3Sopenharmony_ci dump_resample_methods(); 35953a5a1b3Sopenharmony_ci ret = 0; 36053a5a1b3Sopenharmony_ci goto quit; 36153a5a1b3Sopenharmony_ci 36253a5a1b3Sopenharmony_ci case ARG_FROM_CHANNELS: 36353a5a1b3Sopenharmony_ci a.channels = (uint8_t) atoi(optarg); 36453a5a1b3Sopenharmony_ci break; 36553a5a1b3Sopenharmony_ci 36653a5a1b3Sopenharmony_ci case ARG_FROM_SAMPLEFORMAT: 36753a5a1b3Sopenharmony_ci a.format = pa_parse_sample_format(optarg); 36853a5a1b3Sopenharmony_ci all_formats = false; 36953a5a1b3Sopenharmony_ci break; 37053a5a1b3Sopenharmony_ci 37153a5a1b3Sopenharmony_ci case ARG_FROM_SAMPLERATE: 37253a5a1b3Sopenharmony_ci a.rate = (uint32_t) atoi(optarg); 37353a5a1b3Sopenharmony_ci break; 37453a5a1b3Sopenharmony_ci 37553a5a1b3Sopenharmony_ci case ARG_TO_CHANNELS: 37653a5a1b3Sopenharmony_ci b.channels = (uint8_t) atoi(optarg); 37753a5a1b3Sopenharmony_ci break; 37853a5a1b3Sopenharmony_ci 37953a5a1b3Sopenharmony_ci case ARG_TO_SAMPLEFORMAT: 38053a5a1b3Sopenharmony_ci b.format = pa_parse_sample_format(optarg); 38153a5a1b3Sopenharmony_ci all_formats = false; 38253a5a1b3Sopenharmony_ci break; 38353a5a1b3Sopenharmony_ci 38453a5a1b3Sopenharmony_ci case ARG_TO_SAMPLERATE: 38553a5a1b3Sopenharmony_ci b.rate = (uint32_t) atoi(optarg); 38653a5a1b3Sopenharmony_ci break; 38753a5a1b3Sopenharmony_ci 38853a5a1b3Sopenharmony_ci case ARG_SECONDS: 38953a5a1b3Sopenharmony_ci seconds = atoi(optarg); 39053a5a1b3Sopenharmony_ci break; 39153a5a1b3Sopenharmony_ci 39253a5a1b3Sopenharmony_ci case ARG_RESAMPLE_METHOD: 39353a5a1b3Sopenharmony_ci if (*optarg == '\0' || pa_streq(optarg, "help")) { 39453a5a1b3Sopenharmony_ci dump_resample_methods(); 39553a5a1b3Sopenharmony_ci ret = 0; 39653a5a1b3Sopenharmony_ci goto quit; 39753a5a1b3Sopenharmony_ci } 39853a5a1b3Sopenharmony_ci method = pa_parse_resample_method(optarg); 39953a5a1b3Sopenharmony_ci break; 40053a5a1b3Sopenharmony_ci 40153a5a1b3Sopenharmony_ci default: 40253a5a1b3Sopenharmony_ci goto quit; 40353a5a1b3Sopenharmony_ci } 40453a5a1b3Sopenharmony_ci } 40553a5a1b3Sopenharmony_ci 40653a5a1b3Sopenharmony_ci ret = 0; 40753a5a1b3Sopenharmony_ci pa_assert_se(pool = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true)); 40853a5a1b3Sopenharmony_ci 40953a5a1b3Sopenharmony_ci if (!all_formats) { 41053a5a1b3Sopenharmony_ci 41153a5a1b3Sopenharmony_ci pa_resampler *resampler; 41253a5a1b3Sopenharmony_ci pa_memchunk i, j; 41353a5a1b3Sopenharmony_ci pa_usec_t ts; 41453a5a1b3Sopenharmony_ci 41553a5a1b3Sopenharmony_ci pa_log_debug("Compilation CFLAGS: %s", PA_CFLAGS); 41653a5a1b3Sopenharmony_ci pa_log_debug("=== %d seconds: %d Hz %d ch (%s) -> %d Hz %d ch (%s)", seconds, 41753a5a1b3Sopenharmony_ci a.rate, a.channels, pa_sample_format_to_string(a.format), 41853a5a1b3Sopenharmony_ci b.rate, b.channels, pa_sample_format_to_string(b.format)); 41953a5a1b3Sopenharmony_ci 42053a5a1b3Sopenharmony_ci ts = pa_rtclock_now(); 42153a5a1b3Sopenharmony_ci pa_assert_se(resampler = pa_resampler_new(pool, &a, NULL, &b, NULL, crossover_freq, method, 0)); 42253a5a1b3Sopenharmony_ci pa_log_info("init: %llu", (long long unsigned)(pa_rtclock_now() - ts)); 42353a5a1b3Sopenharmony_ci 42453a5a1b3Sopenharmony_ci i.memblock = pa_memblock_new(pool, pa_usec_to_bytes(1*PA_USEC_PER_SEC, &a)); 42553a5a1b3Sopenharmony_ci 42653a5a1b3Sopenharmony_ci ts = pa_rtclock_now(); 42753a5a1b3Sopenharmony_ci i.length = pa_memblock_get_length(i.memblock); 42853a5a1b3Sopenharmony_ci i.index = 0; 42953a5a1b3Sopenharmony_ci while (seconds--) { 43053a5a1b3Sopenharmony_ci pa_resampler_run(resampler, &i, &j); 43153a5a1b3Sopenharmony_ci if (j.memblock) 43253a5a1b3Sopenharmony_ci pa_memblock_unref(j.memblock); 43353a5a1b3Sopenharmony_ci } 43453a5a1b3Sopenharmony_ci pa_log_info("resampling: %llu", (long long unsigned)(pa_rtclock_now() - ts)); 43553a5a1b3Sopenharmony_ci pa_memblock_unref(i.memblock); 43653a5a1b3Sopenharmony_ci 43753a5a1b3Sopenharmony_ci pa_resampler_free(resampler); 43853a5a1b3Sopenharmony_ci 43953a5a1b3Sopenharmony_ci goto quit; 44053a5a1b3Sopenharmony_ci } 44153a5a1b3Sopenharmony_ci 44253a5a1b3Sopenharmony_ci for (a.format = 0; a.format < PA_SAMPLE_MAX; a.format ++) { 44353a5a1b3Sopenharmony_ci for (b.format = 0; b.format < PA_SAMPLE_MAX; b.format ++) { 44453a5a1b3Sopenharmony_ci pa_resampler *forth, *back; 44553a5a1b3Sopenharmony_ci pa_memchunk i, j, k; 44653a5a1b3Sopenharmony_ci 44753a5a1b3Sopenharmony_ci pa_log_debug("=== %s -> %s -> %s -> /2", 44853a5a1b3Sopenharmony_ci pa_sample_format_to_string(a.format), 44953a5a1b3Sopenharmony_ci pa_sample_format_to_string(b.format), 45053a5a1b3Sopenharmony_ci pa_sample_format_to_string(a.format)); 45153a5a1b3Sopenharmony_ci 45253a5a1b3Sopenharmony_ci pa_assert_se(forth = pa_resampler_new(pool, &a, NULL, &b, NULL, crossover_freq, method, 0)); 45353a5a1b3Sopenharmony_ci pa_assert_se(back = pa_resampler_new(pool, &b, NULL, &a, NULL, crossover_freq, method, 0)); 45453a5a1b3Sopenharmony_ci 45553a5a1b3Sopenharmony_ci i.memblock = generate_block(pool, &a); 45653a5a1b3Sopenharmony_ci i.length = pa_memblock_get_length(i.memblock); 45753a5a1b3Sopenharmony_ci i.index = 0; 45853a5a1b3Sopenharmony_ci pa_resampler_run(forth, &i, &j); 45953a5a1b3Sopenharmony_ci pa_resampler_run(back, &j, &k); 46053a5a1b3Sopenharmony_ci 46153a5a1b3Sopenharmony_ci dump_block("before", &a, &i); 46253a5a1b3Sopenharmony_ci dump_block("after", &b, &j); 46353a5a1b3Sopenharmony_ci dump_block("reverse", &a, &k); 46453a5a1b3Sopenharmony_ci 46553a5a1b3Sopenharmony_ci pa_memblock_unref(i.memblock); 46653a5a1b3Sopenharmony_ci pa_memblock_unref(j.memblock); 46753a5a1b3Sopenharmony_ci pa_memblock_unref(k.memblock); 46853a5a1b3Sopenharmony_ci 46953a5a1b3Sopenharmony_ci pa_resampler_free(forth); 47053a5a1b3Sopenharmony_ci pa_resampler_free(back); 47153a5a1b3Sopenharmony_ci } 47253a5a1b3Sopenharmony_ci } 47353a5a1b3Sopenharmony_ci 47453a5a1b3Sopenharmony_ci quit: 47553a5a1b3Sopenharmony_ci if (pool) 47653a5a1b3Sopenharmony_ci pa_mempool_unref(pool); 47753a5a1b3Sopenharmony_ci 47853a5a1b3Sopenharmony_ci return ret; 47953a5a1b3Sopenharmony_ci} 480