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