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 <math.h> 2453a5a1b3Sopenharmony_ci 2553a5a1b3Sopenharmony_ci#include <check.h> 2653a5a1b3Sopenharmony_ci 2753a5a1b3Sopenharmony_ci#include <pulse/sample.h> 2853a5a1b3Sopenharmony_ci#include <pulse/volume.h> 2953a5a1b3Sopenharmony_ci 3053a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 3153a5a1b3Sopenharmony_ci#include <pulsecore/endianmacros.h> 3253a5a1b3Sopenharmony_ci#include <pulsecore/memblock.h> 3353a5a1b3Sopenharmony_ci#include <pulsecore/sample-util.h> 3453a5a1b3Sopenharmony_ci#include <pulsecore/mix.h> 3553a5a1b3Sopenharmony_ci 3653a5a1b3Sopenharmony_ci/* PA_SAMPLE_U8 */ 3753a5a1b3Sopenharmony_cistatic const uint8_t u8_result[3][10] = { 3853a5a1b3Sopenharmony_ci{ 0x00, 0xff, 0x7f, 0x80, 0x9f, 0x3f, 0x01, 0xf0, 0x20, 0x21 }, 3953a5a1b3Sopenharmony_ci{ 0x0c, 0xf2, 0x7f, 0x80, 0x9b, 0x45, 0x0d, 0xe4, 0x29, 0x2a }, 4053a5a1b3Sopenharmony_ci{ 0x00, 0xff, 0x7e, 0x80, 0xba, 0x04, 0x00, 0xff, 0x00, 0x00 }, 4153a5a1b3Sopenharmony_ci}; 4253a5a1b3Sopenharmony_ci 4353a5a1b3Sopenharmony_ci/* PA_SAMPLE_ALAW */ 4453a5a1b3Sopenharmony_cistatic const uint8_t alaw_result[3][10] = { 4553a5a1b3Sopenharmony_ci{ 0x00, 0xff, 0x7f, 0x80, 0x9f, 0x3f, 0x01, 0xf0, 0x20, 0x21 }, 4653a5a1b3Sopenharmony_ci{ 0x06, 0xf2, 0x72, 0x86, 0x92, 0x32, 0x07, 0xf6, 0x26, 0x27 }, 4753a5a1b3Sopenharmony_ci{ 0x31, 0xec, 0x6d, 0xb1, 0x8c, 0x2d, 0x36, 0xe1, 0x2a, 0x2a }, 4853a5a1b3Sopenharmony_ci}; 4953a5a1b3Sopenharmony_ci 5053a5a1b3Sopenharmony_ci/* PA_SAMPLE_ULAW */ 5153a5a1b3Sopenharmony_cistatic const uint8_t ulaw_result[3][10] = { 5253a5a1b3Sopenharmony_ci{ 0x00, 0xff, 0x7f, 0x80, 0x9f, 0x3f, 0x01, 0xf0, 0x20, 0x21 }, 5353a5a1b3Sopenharmony_ci{ 0x03, 0xff, 0xff, 0x83, 0xa2, 0x42, 0x04, 0xf2, 0x23, 0x24 }, 5453a5a1b3Sopenharmony_ci{ 0x00, 0xff, 0xff, 0x80, 0x91, 0x31, 0x00, 0xe9, 0x12, 0x13 }, 5553a5a1b3Sopenharmony_ci}; 5653a5a1b3Sopenharmony_ci 5753a5a1b3Sopenharmony_cistatic const uint16_t s16ne_result[3][10] = { 5853a5a1b3Sopenharmony_ci{ 0x0000, 0xffff, 0x7fff, 0x8000, 0x9fff, 0x3fff, 0x0001, 0xf000, 0x0020, 0x0021 }, 5953a5a1b3Sopenharmony_ci{ 0x0000, 0xffff, 0x7332, 0x8ccd, 0xa998, 0x3998, 0x0000, 0xf199, 0x001c, 0x001d }, 6053a5a1b3Sopenharmony_ci{ 0x0000, 0xfffe, 0x7fff, 0x8000, 0x8000, 0x7997, 0x0001, 0xe199, 0x003c, 0x003e }, 6153a5a1b3Sopenharmony_ci}; 6253a5a1b3Sopenharmony_ci 6353a5a1b3Sopenharmony_cistatic const float float32ne_result[3][10] = { 6453a5a1b3Sopenharmony_ci{ 0.000000, -1.000000, 1.000000, 4711.000000, 0.222000, 0.330000, -0.300000, 99.000000, -0.555000, -0.123000 }, 6553a5a1b3Sopenharmony_ci{ 0.000000, -0.899987, 0.899987, 4239.837402, 0.199797, 0.296996, -0.269996, 89.098679, -0.499493, -0.110698 }, 6653a5a1b3Sopenharmony_ci{ 0.000000, -1.899987, 1.899987, 8950.837891, 0.421797, 0.626996, -0.569996, 188.098679, -1.054493, -0.233698 }, 6753a5a1b3Sopenharmony_ci}; 6853a5a1b3Sopenharmony_ci 6953a5a1b3Sopenharmony_cistatic const uint32_t s32ne_result[3][10] = { 7053a5a1b3Sopenharmony_ci{ 0x00000001, 0xffff0002, 0x7fff0003, 0x80000004, 0x9fff0005, 0x3fff0006, 0x00010007, 0xf0000008, 0x00200009, 0x0021000a }, 7153a5a1b3Sopenharmony_ci{ 0x00000000, 0xffff199b, 0x7332199c, 0x8ccd0003, 0xa998d99e, 0x3998999f, 0x0000e66c, 0xf199a007, 0x001cccc8, 0x001db32e }, 7253a5a1b3Sopenharmony_ci{ 0x00000001, 0xfffe199d, 0x7fffffff, 0x80000000, 0x80000000, 0x799799a5, 0x0001e673, 0xe199a00f, 0x003cccd1, 0x003eb338 }, 7353a5a1b3Sopenharmony_ci}; 7453a5a1b3Sopenharmony_ci 7553a5a1b3Sopenharmony_ci/* attention: result is in BE, not NE! */ 7653a5a1b3Sopenharmony_cistatic const uint8_t s24be_result[3][30] = { 7753a5a1b3Sopenharmony_ci{ 0x00, 0x00, 0x01, 0xff, 0xff, 0x02, 0x7f, 0xff, 0x03, 0x80, 0x00, 0x04, 0x9f, 0xff, 0x05, 0x3f, 0xff, 0x06, 0x01, 0x00, 0x07, 0xf0, 0x00, 0x08, 0x20, 0x00, 0x09, 0x21, 0x00, 0x0a }, 7853a5a1b3Sopenharmony_ci{ 0x00, 0x00, 0x00, 0xff, 0xff, 0x1b, 0x73, 0x32, 0x1c, 0x8c, 0xcd, 0x03, 0xa9, 0x98, 0xde, 0x39, 0x98, 0x9f, 0x00, 0xe6, 0x6c, 0xf1, 0x99, 0xa7, 0x1c, 0xcc, 0xc8, 0x1d, 0xb3, 0x2e }, 7953a5a1b3Sopenharmony_ci{ 0x00, 0x00, 0x01, 0xff, 0xfe, 0x1d, 0x7f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x79, 0x97, 0xa5, 0x01, 0xe6, 0x73, 0xe1, 0x99, 0xaf, 0x3c, 0xcc, 0xd1, 0x3e, 0xb3, 0x38 }, 8053a5a1b3Sopenharmony_ci}; 8153a5a1b3Sopenharmony_ci 8253a5a1b3Sopenharmony_cistatic const uint32_t s24_32ne_result[3][10] = { 8353a5a1b3Sopenharmony_ci{ 0x00000001, 0xffff0002, 0x7fff0003, 0x80000004, 0x9fff0005, 0x3fff0006, 0x00010007, 0xf0000008, 0x00200009, 0x0021000a }, 8453a5a1b3Sopenharmony_ci{ 0x00000000, 0x00ff199b, 0x00ff199c, 0x00000003, 0x00ff199e, 0x00ff199f, 0x0000e66c, 0x00000007, 0x001cccc8, 0x001db32e }, 8553a5a1b3Sopenharmony_ci{ 0x00000001, 0x00fe199d, 0x00fe199f, 0x00000007, 0x00fe19a3, 0x00fe19a5, 0x0001e673, 0x0000000f, 0x003cccd1, 0x003eb338 }, 8653a5a1b3Sopenharmony_ci}; 8753a5a1b3Sopenharmony_ci 8853a5a1b3Sopenharmony_cistatic void compare_block(const pa_sample_spec *ss, const pa_memchunk *chunk, int iter) { 8953a5a1b3Sopenharmony_ci void *d; 9053a5a1b3Sopenharmony_ci unsigned i; 9153a5a1b3Sopenharmony_ci 9253a5a1b3Sopenharmony_ci d = pa_memblock_acquire(chunk->memblock); 9353a5a1b3Sopenharmony_ci 9453a5a1b3Sopenharmony_ci switch (ss->format) { 9553a5a1b3Sopenharmony_ci case PA_SAMPLE_U8: { 9653a5a1b3Sopenharmony_ci const uint8_t *v = u8_result[iter]; 9753a5a1b3Sopenharmony_ci uint8_t *u = d; 9853a5a1b3Sopenharmony_ci 9953a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) { 10053a5a1b3Sopenharmony_ci fail_unless(*u == *v); 10153a5a1b3Sopenharmony_ci ++u; 10253a5a1b3Sopenharmony_ci ++v; 10353a5a1b3Sopenharmony_ci } 10453a5a1b3Sopenharmony_ci break; 10553a5a1b3Sopenharmony_ci } 10653a5a1b3Sopenharmony_ci 10753a5a1b3Sopenharmony_ci case PA_SAMPLE_ALAW: { 10853a5a1b3Sopenharmony_ci const uint8_t *v = alaw_result[iter]; 10953a5a1b3Sopenharmony_ci uint8_t *u = d; 11053a5a1b3Sopenharmony_ci 11153a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) { 11253a5a1b3Sopenharmony_ci fail_unless(*u == *v); 11353a5a1b3Sopenharmony_ci ++u; 11453a5a1b3Sopenharmony_ci ++v; 11553a5a1b3Sopenharmony_ci } 11653a5a1b3Sopenharmony_ci break; 11753a5a1b3Sopenharmony_ci } 11853a5a1b3Sopenharmony_ci 11953a5a1b3Sopenharmony_ci case PA_SAMPLE_ULAW: { 12053a5a1b3Sopenharmony_ci const uint8_t *v = ulaw_result[iter]; 12153a5a1b3Sopenharmony_ci uint8_t *u = d; 12253a5a1b3Sopenharmony_ci 12353a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) { 12453a5a1b3Sopenharmony_ci fail_unless(*u == *v); 12553a5a1b3Sopenharmony_ci ++u; 12653a5a1b3Sopenharmony_ci ++v; 12753a5a1b3Sopenharmony_ci } 12853a5a1b3Sopenharmony_ci break; 12953a5a1b3Sopenharmony_ci } 13053a5a1b3Sopenharmony_ci 13153a5a1b3Sopenharmony_ci case PA_SAMPLE_S16NE: 13253a5a1b3Sopenharmony_ci case PA_SAMPLE_S16RE: { 13353a5a1b3Sopenharmony_ci const uint16_t *v = s16ne_result[iter]; 13453a5a1b3Sopenharmony_ci uint16_t *u = d; 13553a5a1b3Sopenharmony_ci 13653a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) { 13753a5a1b3Sopenharmony_ci uint16_t uu = PA_MAYBE_UINT16_SWAP(ss->format != PA_SAMPLE_S16NE, *u); 13853a5a1b3Sopenharmony_ci fail_unless(uu == *v); 13953a5a1b3Sopenharmony_ci ++u; 14053a5a1b3Sopenharmony_ci ++v; 14153a5a1b3Sopenharmony_ci } 14253a5a1b3Sopenharmony_ci break; 14353a5a1b3Sopenharmony_ci } 14453a5a1b3Sopenharmony_ci 14553a5a1b3Sopenharmony_ci case PA_SAMPLE_FLOAT32NE: 14653a5a1b3Sopenharmony_ci case PA_SAMPLE_FLOAT32RE: { 14753a5a1b3Sopenharmony_ci const float *v = float32ne_result[iter]; 14853a5a1b3Sopenharmony_ci float *u = d; 14953a5a1b3Sopenharmony_ci 15053a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) { 15153a5a1b3Sopenharmony_ci float uu = ss->format == PA_SAMPLE_FLOAT32NE ? *u : PA_READ_FLOAT32RE(u); 15253a5a1b3Sopenharmony_ci fail_unless(fabsf(uu - *v) <= 1e-6f); 15353a5a1b3Sopenharmony_ci ++u; 15453a5a1b3Sopenharmony_ci ++v; 15553a5a1b3Sopenharmony_ci } 15653a5a1b3Sopenharmony_ci break; 15753a5a1b3Sopenharmony_ci } 15853a5a1b3Sopenharmony_ci 15953a5a1b3Sopenharmony_ci case PA_SAMPLE_S32NE: 16053a5a1b3Sopenharmony_ci case PA_SAMPLE_S32RE: { 16153a5a1b3Sopenharmony_ci const uint32_t *v = s32ne_result[iter]; 16253a5a1b3Sopenharmony_ci uint32_t *u = d; 16353a5a1b3Sopenharmony_ci 16453a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) { 16553a5a1b3Sopenharmony_ci uint32_t uu = PA_MAYBE_UINT32_SWAP(ss->format != PA_SAMPLE_S32NE, *u); 16653a5a1b3Sopenharmony_ci fail_unless(uu == *v); 16753a5a1b3Sopenharmony_ci ++u; 16853a5a1b3Sopenharmony_ci ++v; 16953a5a1b3Sopenharmony_ci } 17053a5a1b3Sopenharmony_ci break; 17153a5a1b3Sopenharmony_ci } 17253a5a1b3Sopenharmony_ci 17353a5a1b3Sopenharmony_ci case PA_SAMPLE_S24_32NE: 17453a5a1b3Sopenharmony_ci case PA_SAMPLE_S24_32RE: { 17553a5a1b3Sopenharmony_ci const uint32_t *v = s24_32ne_result[iter]; 17653a5a1b3Sopenharmony_ci uint32_t *u = d; 17753a5a1b3Sopenharmony_ci 17853a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) { 17953a5a1b3Sopenharmony_ci uint32_t uu = PA_MAYBE_UINT32_SWAP(ss->format != PA_SAMPLE_S24_32NE, *u); 18053a5a1b3Sopenharmony_ci fail_unless(uu == *v); 18153a5a1b3Sopenharmony_ci ++u; 18253a5a1b3Sopenharmony_ci ++v; 18353a5a1b3Sopenharmony_ci } 18453a5a1b3Sopenharmony_ci break; 18553a5a1b3Sopenharmony_ci } 18653a5a1b3Sopenharmony_ci 18753a5a1b3Sopenharmony_ci case PA_SAMPLE_S24NE: 18853a5a1b3Sopenharmony_ci case PA_SAMPLE_S24RE: { 18953a5a1b3Sopenharmony_ci const uint8_t *v = s24be_result[iter]; 19053a5a1b3Sopenharmony_ci uint8_t *u = d; 19153a5a1b3Sopenharmony_ci 19253a5a1b3Sopenharmony_ci for (i = 0; i < chunk->length / pa_frame_size(ss); i++) { 19353a5a1b3Sopenharmony_ci uint32_t uu = ss->format == PA_SAMPLE_S24LE ? PA_READ24LE(u) : PA_READ24BE(u); 19453a5a1b3Sopenharmony_ci fail_unless(uu == PA_READ24BE(v)); 19553a5a1b3Sopenharmony_ci 19653a5a1b3Sopenharmony_ci u += 3; 19753a5a1b3Sopenharmony_ci v += 3; 19853a5a1b3Sopenharmony_ci } 19953a5a1b3Sopenharmony_ci break; 20053a5a1b3Sopenharmony_ci } 20153a5a1b3Sopenharmony_ci 20253a5a1b3Sopenharmony_ci default: 20353a5a1b3Sopenharmony_ci pa_assert_not_reached(); 20453a5a1b3Sopenharmony_ci } 20553a5a1b3Sopenharmony_ci 20653a5a1b3Sopenharmony_ci pa_memblock_release(chunk->memblock); 20753a5a1b3Sopenharmony_ci} 20853a5a1b3Sopenharmony_ci 20953a5a1b3Sopenharmony_cistatic pa_memblock* generate_block(pa_mempool *pool, const pa_sample_spec *ss) { 21053a5a1b3Sopenharmony_ci pa_memblock *r; 21153a5a1b3Sopenharmony_ci void *d; 21253a5a1b3Sopenharmony_ci unsigned i; 21353a5a1b3Sopenharmony_ci 21453a5a1b3Sopenharmony_ci pa_assert_se(r = pa_memblock_new(pool, pa_frame_size(ss) * 10)); 21553a5a1b3Sopenharmony_ci d = pa_memblock_acquire(r); 21653a5a1b3Sopenharmony_ci 21753a5a1b3Sopenharmony_ci switch (ss->format) { 21853a5a1b3Sopenharmony_ci 21953a5a1b3Sopenharmony_ci case PA_SAMPLE_U8: 22053a5a1b3Sopenharmony_ci case PA_SAMPLE_ULAW: 22153a5a1b3Sopenharmony_ci case PA_SAMPLE_ALAW: { 22253a5a1b3Sopenharmony_ci memcpy(d, u8_result[0], sizeof(u8_result[0])); 22353a5a1b3Sopenharmony_ci break; 22453a5a1b3Sopenharmony_ci } 22553a5a1b3Sopenharmony_ci 22653a5a1b3Sopenharmony_ci case PA_SAMPLE_S16NE: 22753a5a1b3Sopenharmony_ci case PA_SAMPLE_S16RE: { 22853a5a1b3Sopenharmony_ci if (ss->format == PA_SAMPLE_S16RE) { 22953a5a1b3Sopenharmony_ci uint16_t *u = d; 23053a5a1b3Sopenharmony_ci for (i = 0; i < 10; i++) 23153a5a1b3Sopenharmony_ci u[i] = PA_UINT16_SWAP(s16ne_result[0][i]); 23253a5a1b3Sopenharmony_ci } else 23353a5a1b3Sopenharmony_ci memcpy(d, s16ne_result[0], sizeof(s16ne_result[0])); 23453a5a1b3Sopenharmony_ci break; 23553a5a1b3Sopenharmony_ci } 23653a5a1b3Sopenharmony_ci 23753a5a1b3Sopenharmony_ci case PA_SAMPLE_S24_32NE: 23853a5a1b3Sopenharmony_ci case PA_SAMPLE_S24_32RE: 23953a5a1b3Sopenharmony_ci case PA_SAMPLE_S32NE: 24053a5a1b3Sopenharmony_ci case PA_SAMPLE_S32RE: { 24153a5a1b3Sopenharmony_ci if (ss->format == PA_SAMPLE_S24_32RE || ss->format == PA_SAMPLE_S32RE) { 24253a5a1b3Sopenharmony_ci uint32_t *u = d; 24353a5a1b3Sopenharmony_ci for (i = 0; i < 10; i++) 24453a5a1b3Sopenharmony_ci u[i] = PA_UINT32_SWAP(s32ne_result[0][i]); 24553a5a1b3Sopenharmony_ci } else 24653a5a1b3Sopenharmony_ci memcpy(d, s32ne_result[0], sizeof(s32ne_result[0])); 24753a5a1b3Sopenharmony_ci break; 24853a5a1b3Sopenharmony_ci } 24953a5a1b3Sopenharmony_ci 25053a5a1b3Sopenharmony_ci case PA_SAMPLE_S24NE: 25153a5a1b3Sopenharmony_ci case PA_SAMPLE_S24RE: 25253a5a1b3Sopenharmony_ci if (ss->format == PA_SAMPLE_S24LE) { 25353a5a1b3Sopenharmony_ci uint8_t *u = d; 25453a5a1b3Sopenharmony_ci for (i = 0; i < 30; i += 3) 25553a5a1b3Sopenharmony_ci PA_WRITE24LE(&u[i], PA_READ24BE(&s24be_result[0][i])); 25653a5a1b3Sopenharmony_ci } else 25753a5a1b3Sopenharmony_ci memcpy(d, s24be_result[0], sizeof(s24be_result[0])); 25853a5a1b3Sopenharmony_ci break; 25953a5a1b3Sopenharmony_ci 26053a5a1b3Sopenharmony_ci case PA_SAMPLE_FLOAT32NE: 26153a5a1b3Sopenharmony_ci case PA_SAMPLE_FLOAT32RE: { 26253a5a1b3Sopenharmony_ci if (ss->format == PA_SAMPLE_FLOAT32RE) { 26353a5a1b3Sopenharmony_ci float *u = d; 26453a5a1b3Sopenharmony_ci for (i = 0; i < 10; i++) 26553a5a1b3Sopenharmony_ci PA_WRITE_FLOAT32RE(&u[i], float32ne_result[0][i]); 26653a5a1b3Sopenharmony_ci } else 26753a5a1b3Sopenharmony_ci memcpy(d, float32ne_result[0], sizeof(float32ne_result[0])); 26853a5a1b3Sopenharmony_ci 26953a5a1b3Sopenharmony_ci break; 27053a5a1b3Sopenharmony_ci } 27153a5a1b3Sopenharmony_ci 27253a5a1b3Sopenharmony_ci default: 27353a5a1b3Sopenharmony_ci pa_assert_not_reached(); 27453a5a1b3Sopenharmony_ci } 27553a5a1b3Sopenharmony_ci 27653a5a1b3Sopenharmony_ci pa_memblock_release(r); 27753a5a1b3Sopenharmony_ci 27853a5a1b3Sopenharmony_ci return r; 27953a5a1b3Sopenharmony_ci} 28053a5a1b3Sopenharmony_ci 28153a5a1b3Sopenharmony_ciSTART_TEST (mix_test) { 28253a5a1b3Sopenharmony_ci pa_mempool *pool; 28353a5a1b3Sopenharmony_ci pa_sample_spec a; 28453a5a1b3Sopenharmony_ci pa_cvolume v; 28553a5a1b3Sopenharmony_ci 28653a5a1b3Sopenharmony_ci if (!getenv("MAKE_CHECK")) 28753a5a1b3Sopenharmony_ci pa_log_set_level(PA_LOG_DEBUG); 28853a5a1b3Sopenharmony_ci 28953a5a1b3Sopenharmony_ci fail_unless((pool = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true)) != NULL); 29053a5a1b3Sopenharmony_ci 29153a5a1b3Sopenharmony_ci a.channels = 1; 29253a5a1b3Sopenharmony_ci a.rate = 44100; 29353a5a1b3Sopenharmony_ci 29453a5a1b3Sopenharmony_ci v.channels = a.channels; 29553a5a1b3Sopenharmony_ci v.values[0] = pa_sw_volume_from_linear(0.9); 29653a5a1b3Sopenharmony_ci 29753a5a1b3Sopenharmony_ci for (a.format = 0; a.format < PA_SAMPLE_MAX; a.format ++) { 29853a5a1b3Sopenharmony_ci pa_memchunk i, j, k; 29953a5a1b3Sopenharmony_ci pa_mix_info m[2]; 30053a5a1b3Sopenharmony_ci void *ptr; 30153a5a1b3Sopenharmony_ci 30253a5a1b3Sopenharmony_ci pa_log_debug("=== mixing: %s", pa_sample_format_to_string(a.format)); 30353a5a1b3Sopenharmony_ci 30453a5a1b3Sopenharmony_ci /* Generate block */ 30553a5a1b3Sopenharmony_ci i.memblock = generate_block(pool, &a); 30653a5a1b3Sopenharmony_ci i.length = pa_memblock_get_length(i.memblock); 30753a5a1b3Sopenharmony_ci i.index = 0; 30853a5a1b3Sopenharmony_ci 30953a5a1b3Sopenharmony_ci /* Make a copy */ 31053a5a1b3Sopenharmony_ci j = i; 31153a5a1b3Sopenharmony_ci pa_memblock_ref(j.memblock); 31253a5a1b3Sopenharmony_ci pa_memchunk_make_writable(&j, 0); 31353a5a1b3Sopenharmony_ci 31453a5a1b3Sopenharmony_ci /* Adjust volume of the copy */ 31553a5a1b3Sopenharmony_ci pa_volume_memchunk(&j, &a, &v); 31653a5a1b3Sopenharmony_ci 31753a5a1b3Sopenharmony_ci compare_block(&a, &j, 1); 31853a5a1b3Sopenharmony_ci 31953a5a1b3Sopenharmony_ci m[0].chunk = i; 32053a5a1b3Sopenharmony_ci m[0].volume.values[0] = PA_VOLUME_NORM; 32153a5a1b3Sopenharmony_ci m[0].volume.channels = a.channels; 32253a5a1b3Sopenharmony_ci m[1].chunk = j; 32353a5a1b3Sopenharmony_ci m[1].volume.values[0] = PA_VOLUME_NORM; 32453a5a1b3Sopenharmony_ci m[1].volume.channels = a.channels; 32553a5a1b3Sopenharmony_ci 32653a5a1b3Sopenharmony_ci k.memblock = pa_memblock_new(pool, i.length); 32753a5a1b3Sopenharmony_ci k.length = i.length; 32853a5a1b3Sopenharmony_ci k.index = 0; 32953a5a1b3Sopenharmony_ci 33053a5a1b3Sopenharmony_ci ptr = pa_memblock_acquire_chunk(&k); 33153a5a1b3Sopenharmony_ci pa_mix(m, 2, ptr, k.length, &a, NULL, false); 33253a5a1b3Sopenharmony_ci pa_memblock_release(k.memblock); 33353a5a1b3Sopenharmony_ci 33453a5a1b3Sopenharmony_ci compare_block(&a, &k, 2); 33553a5a1b3Sopenharmony_ci 33653a5a1b3Sopenharmony_ci pa_memblock_unref(i.memblock); 33753a5a1b3Sopenharmony_ci pa_memblock_unref(j.memblock); 33853a5a1b3Sopenharmony_ci pa_memblock_unref(k.memblock); 33953a5a1b3Sopenharmony_ci } 34053a5a1b3Sopenharmony_ci 34153a5a1b3Sopenharmony_ci pa_mempool_unref(pool); 34253a5a1b3Sopenharmony_ci} 34353a5a1b3Sopenharmony_ciEND_TEST 34453a5a1b3Sopenharmony_ci 34553a5a1b3Sopenharmony_ciint main(int argc, char *argv[]) { 34653a5a1b3Sopenharmony_ci int failed = 0; 34753a5a1b3Sopenharmony_ci Suite *s; 34853a5a1b3Sopenharmony_ci TCase *tc; 34953a5a1b3Sopenharmony_ci SRunner *sr; 35053a5a1b3Sopenharmony_ci 35153a5a1b3Sopenharmony_ci s = suite_create("Mix"); 35253a5a1b3Sopenharmony_ci tc = tcase_create("mix"); 35353a5a1b3Sopenharmony_ci tcase_add_test(tc, mix_test); 35453a5a1b3Sopenharmony_ci suite_add_tcase(s, tc); 35553a5a1b3Sopenharmony_ci 35653a5a1b3Sopenharmony_ci sr = srunner_create(s); 35753a5a1b3Sopenharmony_ci srunner_run_all(sr, CK_NORMAL); 35853a5a1b3Sopenharmony_ci failed = srunner_ntests_failed(sr); 35953a5a1b3Sopenharmony_ci srunner_free(sr); 36053a5a1b3Sopenharmony_ci 36153a5a1b3Sopenharmony_ci return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; 36253a5a1b3Sopenharmony_ci} 363