diff options
Diffstat (limited to 'cras/src/tests/fmt_conv_unittest.cc')
-rw-r--r-- | cras/src/tests/fmt_conv_unittest.cc | 1781 |
1 files changed, 0 insertions, 1781 deletions
diff --git a/cras/src/tests/fmt_conv_unittest.cc b/cras/src/tests/fmt_conv_unittest.cc deleted file mode 100644 index c66984ee..00000000 --- a/cras/src/tests/fmt_conv_unittest.cc +++ /dev/null @@ -1,1781 +0,0 @@ -// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <gtest/gtest.h> -#include <math.h> -#include <sys/param.h> - -extern "C" { -#include "cras_fmt_conv.h" -#include "cras_types.h" -} - -static int mono_channel_layout[CRAS_CH_MAX] = {-1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1}; -static int stereo_channel_layout[CRAS_CH_MAX] = {0, 1, -1, -1, -1, -1, - -1, -1, -1, -1, -1}; -static int surround_channel_center_layout[CRAS_CH_MAX] = {0, 1, 2, 3, 4, 5, - -1, -1, -1, -1, -1}; -static int surround_channel_left_right_layout[CRAS_CH_MAX] = { - 0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; -static int surround_channel_unknown_layout[CRAS_CH_MAX] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; -static int quad_channel_layout[CRAS_CH_MAX] = {0, 1, 2, 3, -1, -1, - -1, -1, -1, -1, -1}; -static int linear_resampler_needed_val; -static double linear_resampler_ratio = 1.0; -static unsigned int linear_resampler_num_channels; -static unsigned int linear_resampler_format_bytes; -static int linear_resampler_src_rate; -static int linear_resampler_dst_rate; - -void ResetStub() { - linear_resampler_needed_val = 0; - linear_resampler_ratio = 1.0; -} - -// Like malloc or calloc, but fill the memory with random bytes. -static void* ralloc(size_t size) { - unsigned char* buf = (unsigned char*)malloc(size); - while (size--) - buf[size] = rand() & 0xff; - return buf; -} - -static void swap_channel_layout(int8_t* layout, - CRAS_CHANNEL a, - CRAS_CHANNEL b) { - int8_t tmp = layout[a]; - layout[a] = layout[b]; - layout[b] = tmp; -} - -TEST(FormatConverterTest, SmallFramesSRCWithLinearResampler) { - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - struct cras_fmt_conv* c; - int16_t* in_buf; - int16_t* out_buf; - unsigned int in_frames = 1; - unsigned int out_frames = 2; - - ResetStub(); - in_fmt.format = out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = out_fmt.num_channels = 1; - in_fmt.frame_rate = 16000; - out_fmt.frame_rate = 48000; - linear_resampler_needed_val = 1; - - in_buf = (int16_t*)malloc(10 * 2 * 2); - out_buf = (int16_t*)malloc(10 * 2 * 2); - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, 10, 1); - EXPECT_NE((void*)NULL, c); - EXPECT_EQ(out_fmt.frame_rate, linear_resampler_src_rate); - EXPECT_EQ(out_fmt.frame_rate, linear_resampler_dst_rate); - - /* When process on small buffers doing SRC 16KHz -> 48KHz, - * speex does the work in two steps: - * - * (1) 0 -> 2 frames in output - * (2) 1 -> 1 frame in output - * - * Total result is 1 frame consumed in input and generated - * 3 frames in output. - */ - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buf, (uint8_t*)out_buf, &in_frames, out_frames); - EXPECT_EQ(2, out_frames); - EXPECT_EQ(0, in_frames); - - in_frames = 1; - out_frames = 2; - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buf, (uint8_t*)out_buf, &in_frames, out_frames); - EXPECT_EQ(1, out_frames); - EXPECT_EQ(1, in_frames); - - cras_fmt_conv_destroy(&c); - free(in_buf); - free(out_buf); -} - -// Only support LE, BE should fail. -TEST(FormatConverterTest, InvalidParamsOnlyLE) { - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - struct cras_fmt_conv* c; - - ResetStub(); - in_fmt.format = out_fmt.format = SND_PCM_FORMAT_S32_BE; - in_fmt.num_channels = out_fmt.num_channels = 2; - c = cras_fmt_conv_create(&in_fmt, &out_fmt, 4096, 0); - EXPECT_EQ(NULL, c); -} - -// Test Mono to Stereo mix. -TEST(FormatConverterTest, MonoToStereo) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 1; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (size_t i = 0; i < buf_size; i++) { - if (in_buff[i] != out_buff[i * 2] || in_buff[i] != out_buff[i * 2 + 1]) { - EXPECT_TRUE(false); - break; - } - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test Stereo to Mono mix. -TEST(FormatConverterTest, StereoToMono) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - unsigned int i; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 2; - out_fmt.num_channels = 1; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)malloc(buf_size * cras_get_format_bytes(&out_fmt)); - for (i = 0; i < buf_size; i++) { - in_buff[i * 2] = 13450; - in_buff[i * 2 + 1] = -13449; - } - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) { - EXPECT_EQ(1, out_buff[i]); - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test Stereo to Mono mix. Overflow. -TEST(FormatConverterTest, StereoToMonoOverflow) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - unsigned int i; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 2; - out_fmt.num_channels = 1; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)malloc(buf_size * cras_get_format_bytes(&out_fmt)); - for (i = 0; i < buf_size; i++) { - in_buff[i * 2] = 0x7fff; - in_buff[i * 2 + 1] = 1; - } - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) { - EXPECT_EQ(0x7fff, out_buff[i]); - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test Stereo to Mono mix. Underflow. -TEST(FormatConverterTest, StereoToMonoUnderflow) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - unsigned int i; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 2; - out_fmt.num_channels = 1; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)malloc(buf_size * cras_get_format_bytes(&out_fmt)); - for (i = 0; i < buf_size; i++) { - in_buff[i * 2] = -0x8000; - in_buff[i * 2 + 1] = -1; - } - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) { - EXPECT_EQ(-0x8000, out_buff[i]); - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test Stereo to Mono mix 24 and 32 bit. -TEST(FormatConverterTest, StereoToMono24bit) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int32_t* in_buff; - int32_t* out_buff; - unsigned int i; - const size_t buf_size = 100; - unsigned int in_buf_size = 100; - unsigned int test; - - for (test = 0; test < 2; test++) { - ResetStub(); - if (test == 0) { - in_fmt.format = SND_PCM_FORMAT_S24_LE; - out_fmt.format = SND_PCM_FORMAT_S24_LE; - } else { - in_fmt.format = SND_PCM_FORMAT_S32_LE; - out_fmt.format = SND_PCM_FORMAT_S32_LE; - } - in_fmt.num_channels = 2; - out_fmt.num_channels = 1; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int32_t*)malloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int32_t*)malloc(buf_size * cras_get_format_bytes(&out_fmt)); - // TODO(dgreid) - s/0x10000/1/ once it stays full bits the whole way. - for (i = 0; i < buf_size; i++) { - in_buff[i * 2] = 13450 << 16; - in_buff[i * 2 + 1] = -in_buff[i * 2] + 0x10000; - } - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) { - EXPECT_EQ(0x10000, out_buff[i]); - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); - } -} - -// Test 5.1 to Stereo mix. -TEST(FormatConverterTest, SurroundToStereo) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - unsigned int i; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 6; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - in_fmt.channel_layout[i] = surround_channel_center_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - - /* Swap channel to FL = 13450, RL = -100. - * Assert right channel is silent. - */ - for (i = 0; i < buf_size; i++) { - in_buff[i * 6] = 13450; - in_buff[i * 6 + 1] = 0; - in_buff[i * 6 + 2] = -100; - in_buff[i * 6 + 3] = 0; - in_buff[i * 6 + 4] = 0; - in_buff[i * 6 + 5] = 0; - } - out_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) - EXPECT_LT(0, out_buff[i * 2]); - cras_fmt_conv_destroy(&c); - - /* Swap channel to FR = 13450, RR = -100. - * Assert left channel is silent. - */ - swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FL, CRAS_CH_FR); - swap_channel_layout(in_fmt.channel_layout, CRAS_CH_RL, CRAS_CH_RR); - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) - EXPECT_LT(0, out_buff[i * 2 + 1]); - cras_fmt_conv_destroy(&c); - - /* Swap channel to FC = 13450, LFE = -100. - * Assert output left and right has equal magnitude. - */ - swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FR, CRAS_CH_FC); - swap_channel_layout(in_fmt.channel_layout, CRAS_CH_RR, CRAS_CH_LFE); - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) { - EXPECT_NE(0, out_buff[i * 2]); - EXPECT_EQ(out_buff[i * 2], out_buff[i * 2 + 1]); - } - cras_fmt_conv_destroy(&c); - - /* Swap channel to FR = 13450, FL = -100. - * Assert output left is positive and right is negative. */ - swap_channel_layout(in_fmt.channel_layout, CRAS_CH_LFE, CRAS_CH_FR); - swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FC, CRAS_CH_FL); - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) { - EXPECT_LT(0, out_buff[i * 2]); - EXPECT_GT(0, out_buff[i * 2 + 1]); - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 5.1 to Quad mix. -TEST(FormatConverterTest, SurroundToQuad) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - unsigned int i; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 6; - out_fmt.num_channels = 4; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - in_fmt.channel_layout[i] = surround_channel_center_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - - const int16_t in_fl = 100; - const int16_t in_fr = 200; - const int16_t in_rl = 200; - const int16_t in_rr = 300; - const int16_t in_fc = 60; - const int16_t in_lfe = 90; - - for (i = 0; i < buf_size; i++) { - in_buff[i * 6 + CRAS_CH_FL] = in_fl; - in_buff[i * 6 + CRAS_CH_FR] = in_fr; - in_buff[i * 6 + CRAS_CH_RL] = in_rl; - in_buff[i * 6 + CRAS_CH_RR] = in_rr; - in_buff[i * 6 + CRAS_CH_FC] = in_fc; - in_buff[i * 6 + CRAS_CH_LFE] = in_lfe; - } - out_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - - // This is the sum of mtx[CRAS_CH_FL] coefficients. - const float normalize_factor = 1.0 / (1 + 0.707 + 0.5); - - for (i = 0; i < buf_size; i++) { - int16_t lfe = 0.5 * normalize_factor * in_lfe; - int16_t center = 0.707 * normalize_factor * in_fc; - int16_t fl = normalize_factor * in_fl + center + lfe; - int16_t fr = normalize_factor * in_fr + center + lfe; - int16_t rl = normalize_factor * in_rl + lfe; - int16_t rr = normalize_factor * in_rr + lfe; - - EXPECT_EQ(fl, out_buff[i * 4 + CRAS_CH_FL]); - EXPECT_EQ(fr, out_buff[i * 4 + CRAS_CH_FR]); - EXPECT_EQ(rl, out_buff[i * 4 + CRAS_CH_RL]); - EXPECT_EQ(rr, out_buff[i * 4 + CRAS_CH_RR]); - } - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test Quad to Stereo mix. -TEST(FormatConverterTest, QuadToStereo) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - unsigned int i; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 4; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - in_fmt.channel_layout[i] = quad_channel_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - - /* - * Set left channel positive, right channel negative, assert values are - * copied and scaled as expected. - */ - for (i = 0; i < buf_size; i++) { - in_buff[i * 4] = 800; - in_buff[i * 4 + 1] = -800; - in_buff[i * 4 + 2] = 80; - in_buff[i * 4 + 3] = -80; - } - out_buff = (int16_t*)malloc(buf_size * 2 * cras_get_format_bytes(&out_fmt)); - - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) { - EXPECT_EQ(820, out_buff[i * 2]); - EXPECT_EQ(-820, out_buff[i * 2 + 1]); - } - cras_fmt_conv_destroy(&c); - - /* - * Swap left and right channels, check channel map is respected. - */ - swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FL, CRAS_CH_FR); - swap_channel_layout(in_fmt.channel_layout, CRAS_CH_RL, CRAS_CH_RR); - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) { - EXPECT_EQ(-820, out_buff[i * 2]); - EXPECT_EQ(820, out_buff[i * 2 + 1]); - } - cras_fmt_conv_destroy(&c); - - /* - * Swap front and rear, check channel map is respected. - */ - swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FR, CRAS_CH_RR); - swap_channel_layout(in_fmt.channel_layout, CRAS_CH_FL, CRAS_CH_RL); - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) { - EXPECT_EQ(-280, out_buff[i * 2]); - EXPECT_EQ(280, out_buff[i * 2 + 1]); - } - cras_fmt_conv_destroy(&c); - - /* - * Empty channel map, check default behavior is applied. - */ - for (i = 0; i < CRAS_CH_MAX; i++) - in_fmt.channel_layout[i] = -1; - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (i = 0; i < buf_size; i++) { - EXPECT_EQ(820, out_buff[i * 2]); - EXPECT_EQ(-820, out_buff[i * 2 + 1]); - } - cras_fmt_conv_destroy(&c); - - free(in_buff); - free(out_buff); -} - -// Test 2 to 1 SRC. -TEST(FormatConverterTest, Convert2To1) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = out_fmt.num_channels = 2; - in_fmt.frame_rate = 96000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size / 2, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size / 2 * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size / 2); - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 1 to 2 SRC. -TEST(FormatConverterTest, Convert1To2) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = out_fmt.num_channels = 2; - in_fmt.frame_rate = 22050; - out_fmt.frame_rate = 44100; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size * 2, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size * 2); - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 1 to 2 SRC with mono to stereo conversion. -TEST(FormatConverterTest, Convert1To2MonoToStereo) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 1; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 22050; - out_fmt.frame_rate = 44100; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_out_frames_to_in(c, buf_size); - EXPECT_EQ(buf_size / 2, out_frames); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size * 2, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size * 2); - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 32 to 16 bit conversion. -TEST(FormatConverterTest, ConvertS32LEToS16LE) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int32_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S32_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int32_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) - EXPECT_EQ((int16_t)(in_buff[i] >> 16), out_buff[i]); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 24 to 16 bit conversion. -TEST(FormatConverterTest, ConvertS24LEToS16LE) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int32_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S24_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int32_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) - EXPECT_EQ((int16_t)(in_buff[i] >> 8), out_buff[i]); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 8 to 16 bit conversion. -TEST(FormatConverterTest, ConvertU8LEToS16LE) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - uint8_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_U8; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 2; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (uint8_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) - EXPECT_EQ((int16_t)((uint16_t)((int16_t)(in_buff[i]) - 128) << 8), - out_buff[i]); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 16 to 32 bit conversion. -TEST(FormatConverterTest, ConvertS16LEToS32LE) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int32_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S32_LE; - in_fmt.num_channels = out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) - EXPECT_EQ((int32_t)((uint32_t)(int32_t)in_buff[i] << 16), out_buff[i]); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 16 to 24 bit conversion. -TEST(FormatConverterTest, ConvertS16LEToS24LE) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int32_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S24_LE; - in_fmt.num_channels = out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int32_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) - EXPECT_EQ((int32_t)((uint32_t)(int32_t)in_buff[i] << 8), out_buff[i]); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 16 to 8 bit conversion. -TEST(FormatConverterTest, ConvertS16LEToU8) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - uint8_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_U8; - in_fmt.num_channels = 2; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (uint8_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) - EXPECT_EQ((in_buff[i] >> 8) + 128, out_buff[i]); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 32 bit 5.1 to 16 bit stereo conversion. -TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int32_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S32_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 6; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - in_fmt.channel_layout[i] = surround_channel_center_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int32_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 16 bit stereo to 5.1 conversion. -TEST(FormatConverterTest, ConvertS16LEToS16LEStereoTo51) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 2; - out_fmt.num_channels = 6; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - out_fmt.channel_layout[i] = surround_channel_center_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) { - /* Check mono be converted to CRAS_CH_FL and CRAS_CH_FR */ - EXPECT_EQ(in_buff[2 * i], out_buff[6 * i]); - EXPECT_EQ(in_buff[2 * i + 1], out_buff[6 * i + 1]); - EXPECT_EQ(0, out_buff[6 * i + 2]); - EXPECT_EQ(0, out_buff[6 * i + 3]); - EXPECT_EQ(0, out_buff[6 * i + 4]); - EXPECT_EQ(0, out_buff[6 * i + 5]); - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 16 bit mono to 5.1 conversion. Center. -TEST(FormatConverterTest, ConvertS16LEToS16LEMonoTo51Center) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 1; - out_fmt.num_channels = 6; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - out_fmt.channel_layout[i] = surround_channel_center_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) { - /* Check mono be converted to CRAS_CH_FC */ - EXPECT_EQ(in_buff[i], out_buff[6 * i + 4]); - EXPECT_EQ(0, out_buff[6 * i + 0]); - EXPECT_EQ(0, out_buff[6 * i + 1]); - EXPECT_EQ(0, out_buff[6 * i + 2]); - EXPECT_EQ(0, out_buff[6 * i + 3]); - EXPECT_EQ(0, out_buff[6 * i + 5]); - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 16 bit mono to 5.1 conversion. Left Right. -TEST(FormatConverterTest, ConvertS16LEToS16LEMonoTo51LeftRight) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - unsigned int i, left, right; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 1; - out_fmt.num_channels = 6; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - out_fmt.channel_layout[i] = surround_channel_left_right_layout[i]; - left = surround_channel_left_right_layout[CRAS_CH_FL]; - right = surround_channel_left_right_layout[CRAS_CH_FR]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) { - /* Check mono be converted to CRAS_CH_FL and CRAS_CH_FR */ - for (unsigned int k = 0; k < 6; ++k) { - if (k == left) - EXPECT_EQ(in_buff[i] / 2, out_buff[6 * i + left]); - else if (k == right) - EXPECT_EQ(in_buff[i] / 2, out_buff[6 * i + right]); - else - EXPECT_EQ(0, out_buff[6 * i + k]); - } - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 16 bit mono to 5.1 conversion. Unknown. -TEST(FormatConverterTest, ConvertS16LEToS16LEMonoTo51Unknown) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 1; - out_fmt.num_channels = 6; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - out_fmt.channel_layout[i] = surround_channel_unknown_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) { - /* Check mono be converted to CRAS_CH_FL */ - EXPECT_EQ(in_buff[i], out_buff[6 * i + 0]); - EXPECT_EQ(0, out_buff[6 * i + 1]); - EXPECT_EQ(0, out_buff[6 * i + 2]); - EXPECT_EQ(0, out_buff[6 * i + 3]); - EXPECT_EQ(0, out_buff[6 * i + 4]); - EXPECT_EQ(0, out_buff[6 * i + 5]); - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 16 bit stereo to quad conversion. -TEST(FormatConverterTest, ConvertS16LEToS16LEStereoToQuad) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int16_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 2; - out_fmt.num_channels = 4; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (unsigned int i = 0; i < CRAS_CH_MAX; i++) - out_fmt.channel_layout[i] = quad_channel_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size, out_frames); - - in_buff = (int16_t*)malloc(buf_size * cras_get_format_bytes(&in_fmt)); - for (unsigned int i = 0; i < in_buf_size; i++) { - in_buff[i * 2] = 40; - in_buff[i * 2 + 1] = 80; - } - - out_buff = (int16_t*)malloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) { - EXPECT_EQ(40, out_buff[4 * i]); - EXPECT_EQ(80, out_buff[4 * i + 1]); - EXPECT_EQ(40, out_buff[4 * i + 2]); - EXPECT_EQ(80, out_buff[4 * i + 3]); - } - cras_fmt_conv_destroy(&c); - - // Swap channels and check channel layout is respected. - swap_channel_layout(out_fmt.channel_layout, CRAS_CH_FL, CRAS_CH_RR); - swap_channel_layout(out_fmt.channel_layout, CRAS_CH_RL, CRAS_CH_FR); - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(buf_size, out_frames); - for (unsigned int i = 0; i < buf_size; i++) { - EXPECT_EQ(80, out_buff[4 * i]); - EXPECT_EQ(40, out_buff[4 * i + 1]); - EXPECT_EQ(80, out_buff[4 * i + 2]); - EXPECT_EQ(40, out_buff[4 * i + 3]); - } - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 32 bit 5.1 to 16 bit stereo conversion with SRC 1 to 2. -TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo48To96) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int32_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S32_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 6; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 96000; - for (i = 0; i < CRAS_CH_MAX; i++) - in_fmt.channel_layout[i] = surround_channel_center_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size * 2, out_frames); - - in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * 2 * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size * 2); - EXPECT_EQ(buf_size * 2, out_frames); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 32 bit 5.1 to 16 bit stereo conversion with SRC 2 to 1. -TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo96To48) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int32_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S32_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 6; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 96000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - in_fmt.channel_layout[i] = surround_channel_center_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size / 2, out_frames); - - in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size / 2 * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size / 2); - EXPECT_EQ(buf_size / 2, out_frames); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 32 bit 5.1 to 16 bit stereo conversion with SRC 48 to 44.1. -TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo48To441) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - size_t ret_frames; - int32_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S32_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 6; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 44100; - for (i = 0; i < CRAS_CH_MAX; i++) - in_fmt.channel_layout[i] = surround_channel_center_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_LT(out_frames, buf_size); - - in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(out_frames * cras_get_format_bytes(&out_fmt)); - ret_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, out_frames); - EXPECT_EQ(out_frames, ret_frames); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test 32 bit 5.1 to 16 bit stereo conversion with SRC 441 to 48. -TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo441To48) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - size_t ret_frames; - int32_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S32_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 6; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 44100; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - in_fmt.channel_layout[i] = surround_channel_center_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_GT(out_frames, buf_size); - - in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = - (int16_t*)ralloc((out_frames - 1) * cras_get_format_bytes(&out_fmt)); - ret_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, out_frames - 1); - EXPECT_EQ(out_frames - 1, ret_frames); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test Invalid buffer length just truncates. -TEST(FormatConverterTest, ConvertS32LEToS16LEDownmix51ToStereo96To48Short) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - size_t ret_frames; - int32_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S32_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 6; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 96000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) - in_fmt.channel_layout[i] = surround_channel_center_layout[i]; - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size, 0); - ASSERT_NE(c, (void*)NULL); - - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(buf_size / 2, out_frames); - - in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = - (int16_t*)ralloc((out_frames - 2) * cras_get_format_bytes(&out_fmt)); - ret_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, out_frames - 2); - EXPECT_EQ(out_frames - 2, ret_frames); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test format convert pre linear resample and then follows SRC from 96 to 48. -TEST(FormatConverterTest, Convert96to48PreLinearResample) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int32_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - unsigned int expected_fr; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 2; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 96000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) { - in_fmt.channel_layout[i] = surround_channel_center_layout[i]; - out_fmt.channel_layout[i] = surround_channel_center_layout[i]; - } - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size * 2, 1); - ASSERT_NE(c, (void*)NULL); - EXPECT_EQ(out_fmt.frame_rate, linear_resampler_src_rate); - EXPECT_EQ(out_fmt.frame_rate, linear_resampler_dst_rate); - - linear_resampler_needed_val = 1; - linear_resampler_ratio = 1.01; - expected_fr = buf_size / 2 * linear_resampler_ratio; - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(expected_fr, out_frames); - - in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, out_frames); - EXPECT_EQ(expected_fr, out_frames); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test format convert SRC from 96 to 48 and then post linear resample. -TEST(FormatConverterTest, Convert96to48PostLinearResample) { - struct cras_fmt_conv* c; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - size_t out_frames; - int32_t* in_buff; - int16_t* out_buff; - const size_t buf_size = 4096; - unsigned int in_buf_size = 4096; - unsigned int expected_fr; - int i; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 2; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 96000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) { - in_fmt.channel_layout[i] = surround_channel_center_layout[i]; - out_fmt.channel_layout[i] = surround_channel_center_layout[i]; - } - - c = cras_fmt_conv_create(&in_fmt, &out_fmt, buf_size * 2, 0); - ASSERT_NE(c, (void*)NULL); - EXPECT_EQ(out_fmt.frame_rate, linear_resampler_src_rate); - EXPECT_EQ(out_fmt.frame_rate, linear_resampler_dst_rate); - - linear_resampler_needed_val = 1; - linear_resampler_ratio = 0.99; - expected_fr = buf_size / 2 * linear_resampler_ratio; - out_frames = cras_fmt_conv_in_frames_to_out(c, buf_size); - EXPECT_EQ(expected_fr, out_frames); - - in_buff = (int32_t*)ralloc(buf_size * cras_get_format_bytes(&in_fmt)); - out_buff = (int16_t*)ralloc(buf_size * cras_get_format_bytes(&out_fmt)); - out_frames = cras_fmt_conv_convert_frames( - c, (uint8_t*)in_buff, (uint8_t*)out_buff, &in_buf_size, buf_size); - EXPECT_EQ(expected_fr, out_frames); - - cras_fmt_conv_destroy(&c); - free(in_buff); - free(out_buff); -} - -// Test format converter created in config_format_converter -TEST(FormatConverterTest, ConfigConverter) { - int i; - struct cras_fmt_conv* c = NULL; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 1; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 96000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) { - in_fmt.channel_layout[i] = mono_channel_layout[i]; - out_fmt.channel_layout[i] = stereo_channel_layout[i]; - } - - config_format_converter(&c, CRAS_STREAM_OUTPUT, &in_fmt, &out_fmt, 4096); - ASSERT_NE(c, (void*)NULL); - - cras_fmt_conv_destroy(&c); -} - -// Test format converter not created when in/out format conversion is not -// needed. -TEST(FormatConverterTest, ConfigConverterNoNeed) { - int i; - struct cras_fmt_conv* c = NULL; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 2; - out_fmt.num_channels = 2; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) { - in_fmt.channel_layout[i] = stereo_channel_layout[i]; - out_fmt.channel_layout[i] = stereo_channel_layout[i]; - } - - config_format_converter(&c, CRAS_STREAM_OUTPUT, &in_fmt, &out_fmt, 4096); - EXPECT_NE(c, (void*)NULL); - EXPECT_EQ(0, cras_fmt_conversion_needed(c)); - cras_fmt_conv_destroy(&c); -} - -// Test format converter not created for input when in/out format differs -// at channel count or layout. -TEST(FormatConverterTest, ConfigConverterNoNeedForInput) { - static int kmic_channel_layout[CRAS_CH_MAX] = {0, 1, -1, -1, 2, -1, - -1, -1, -1, -1, -1}; - int i; - struct cras_fmt_conv* c = NULL; - struct cras_audio_format in_fmt; - struct cras_audio_format out_fmt; - - ResetStub(); - in_fmt.format = SND_PCM_FORMAT_S16_LE; - out_fmt.format = SND_PCM_FORMAT_S16_LE; - in_fmt.num_channels = 2; - out_fmt.num_channels = 3; - in_fmt.frame_rate = 48000; - out_fmt.frame_rate = 48000; - for (i = 0; i < CRAS_CH_MAX; i++) { - in_fmt.channel_layout[i] = stereo_channel_layout[i]; - out_fmt.channel_layout[i] = kmic_channel_layout[i]; - } - - config_format_converter(&c, CRAS_STREAM_INPUT, &in_fmt, &out_fmt, 4096); - EXPECT_NE(c, (void*)NULL); - EXPECT_EQ(0, cras_fmt_conversion_needed(c)); - cras_fmt_conv_destroy(&c); -} - -TEST(ChannelRemixTest, ChannelRemixAppliedOrNot) { - float coeff[4] = {0.5, 0.5, 0.26, 0.73}; - struct cras_fmt_conv* conv; - struct cras_audio_format fmt; - int16_t *buf, *res; - unsigned i; - - fmt.num_channels = 2; - conv = cras_channel_remix_conv_create(2, coeff); - - buf = (int16_t*)ralloc(50 * 4); - res = (int16_t*)malloc(50 * 4); - - memcpy(res, buf, 50 * 4); - - /* Remix conversion will not apply for non S16_LE format. */ - fmt.format = SND_PCM_FORMAT_S24_LE; - cras_channel_remix_convert(conv, &fmt, (uint8_t*)buf, 50); - for (i = 0; i < 100; i++) - EXPECT_EQ(res[i], buf[i]); - - for (i = 0; i < 100; i += 2) { - res[i] = coeff[0] * buf[i]; - res[i] += coeff[1] * buf[i + 1]; - res[i + 1] = coeff[2] * buf[i]; - res[i + 1] += coeff[3] * buf[i + 1]; - } - - fmt.format = SND_PCM_FORMAT_S16_LE; - cras_channel_remix_convert(conv, &fmt, (uint8_t*)buf, 50); - for (i = 0; i < 100; i++) - EXPECT_EQ(res[i], buf[i]); - - /* If num_channels not match, remix conversion will not apply. */ - fmt.num_channels = 6; - cras_channel_remix_convert(conv, &fmt, (uint8_t*)buf, 50); - for (i = 0; i < 100; i++) - EXPECT_EQ(res[i], buf[i]); - - cras_fmt_conv_destroy(&conv); - free(buf); - free(res); -} - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} - -extern "C" { -float** cras_channel_conv_matrix_alloc(size_t in_ch, size_t out_ch) { - int i; - float** conv_mtx; - conv_mtx = (float**)calloc(CRAS_CH_MAX, sizeof(*conv_mtx)); - for (i = 0; i < CRAS_CH_MAX; i++) - conv_mtx[i] = (float*)calloc(CRAS_CH_MAX, sizeof(*conv_mtx[i])); - return conv_mtx; -} -void cras_channel_conv_matrix_destroy(float** mtx, size_t out_ch) { - int i; - for (i = 0; i < CRAS_CH_MAX; i++) - free(mtx[i]); - free(mtx); -} -float** cras_channel_conv_matrix_create(const struct cras_audio_format* in, - const struct cras_audio_format* out) { - return cras_channel_conv_matrix_alloc(in->num_channels, out->num_channels); -} -struct linear_resampler* linear_resampler_create(unsigned int num_channels, - unsigned int format_bytes, - float src_rate, - float dst_rate) { - linear_resampler_format_bytes = format_bytes; - linear_resampler_num_channels = num_channels; - linear_resampler_src_rate = src_rate; - linear_resampler_dst_rate = dst_rate; - return reinterpret_cast<struct linear_resampler*>(0x33); - ; -} - -int linear_resampler_needed(struct linear_resampler* lr) { - return linear_resampler_needed_val; -} - -void linear_resampler_set_rates(struct linear_resampler* lr, - unsigned int from, - unsigned int to) { - linear_resampler_src_rate = from; - linear_resampler_dst_rate = to; -} - -unsigned int linear_resampler_out_frames_to_in(struct linear_resampler* lr, - unsigned int frames) { - return (double)frames / linear_resampler_ratio; -} - -/* Converts the frames count from input rate to output rate. */ -unsigned int linear_resampler_in_frames_to_out(struct linear_resampler* lr, - unsigned int frames) { - return (double)frames * linear_resampler_ratio; -} - -unsigned int linear_resampler_resample(struct linear_resampler* lr, - uint8_t* src, - unsigned int* src_frames, - uint8_t* dst, - unsigned dst_frames) { - unsigned int resampled_fr = *src_frames * linear_resampler_ratio; - - if (resampled_fr > dst_frames) { - resampled_fr = dst_frames; - *src_frames = dst_frames / linear_resampler_ratio; - } - unsigned int resampled_bytes = resampled_fr * linear_resampler_format_bytes * - linear_resampler_num_channels; - for (size_t i = 0; i < resampled_bytes; i++) - dst[i] = (uint8_t)rand() & 0xff; - - return resampled_fr; -} - -void linear_resampler_destroy(struct linear_resampler* lr) {} -} // extern "C" |