| // 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 <stdio.h> |
| #include <gtest/gtest.h> |
| |
| extern "C" { |
| #include "cras_shm.h" |
| #include "cras_mix.h" |
| #include "cras_types.h" |
| |
| } |
| |
| namespace { |
| |
| static const size_t kBufferFrames = 8192; |
| static const size_t kNumChannels = 2; |
| static const size_t kNumSamples = kBufferFrames * kNumChannels; |
| |
| class MixTestSuiteS16_LE : public testing::Test{ |
| protected: |
| virtual void SetUp() { |
| fmt_ = SND_PCM_FORMAT_S16_LE; |
| mix_buffer_ = (int16_t *)malloc(kBufferFrames * 4); |
| src_buffer_ = static_cast<int16_t *>( |
| calloc(1, kBufferFrames * 4 + sizeof(cras_audio_shm_area))); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) { |
| src_buffer_[i] = i; |
| mix_buffer_[i] = -i; |
| } |
| |
| compare_buffer_ = (int16_t *)malloc(kBufferFrames * 4); |
| } |
| |
| virtual void TearDown() { |
| free(mix_buffer_); |
| free(compare_buffer_); |
| free(src_buffer_); |
| } |
| |
| int16_t *mix_buffer_; |
| int16_t *src_buffer_; |
| int16_t *compare_buffer_; |
| snd_pcm_format_t fmt_; |
| }; |
| |
| TEST_F(MixTestSuiteS16_LE, MixFirst) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| EXPECT_EQ(0, memcmp(mix_buffer_, src_buffer_, kBufferFrames*4)); |
| } |
| |
| TEST_F(MixTestSuiteS16_LE, MixTwo) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] * 2; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames*4)); |
| } |
| |
| TEST_F(MixTestSuiteS16_LE, MixTwoClip) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| src_buffer_[i] = INT16_MAX; |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = INT16_MAX; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames*4)); |
| } |
| |
| TEST_F(MixTestSuiteS16_LE, MixFirstMuted) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 1, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = 0; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames*4)); |
| } |
| |
| TEST_F(MixTestSuiteS16_LE, MixFirstZeroVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 0.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = 0; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames*4)); |
| } |
| |
| TEST_F(MixTestSuiteS16_LE, MixFirstHalfVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 0.5); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] * 0.5; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames*4)); |
| } |
| |
| TEST_F(MixTestSuiteS16_LE, MixTwoSecondHalfVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 0.5); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] + (int16_t)(src_buffer_[i] * 0.5); |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames*4)); |
| } |
| |
| TEST_F(MixTestSuiteS16_LE, ScaleFullVolume) { |
| memcpy(compare_buffer_, src_buffer_, kBufferFrames * 4); |
| cras_scale_buffer(fmt_, (uint8_t *)mix_buffer_, kNumSamples, 0.999999999); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * 4)); |
| } |
| |
| TEST_F(MixTestSuiteS16_LE, ScaleMinVolume) { |
| memset(compare_buffer_, 0, kBufferFrames * 4); |
| cras_scale_buffer(fmt_, (uint8_t *)src_buffer_, kNumSamples, 0.0000000001); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * 4)); |
| } |
| |
| TEST_F(MixTestSuiteS16_LE, ScaleHalfVolume) { |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] * 0.5; |
| cras_scale_buffer(fmt_, (uint8_t *)src_buffer_, kNumSamples, 0.5); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * 4)); |
| } |
| |
| TEST_F(MixTestSuiteS16_LE, StrideCopy) { |
| for (size_t i = 0; i < kBufferFrames * 2; i += 2) |
| compare_buffer_[i] = src_buffer_[i/2]; |
| for (size_t i = 1; i < kBufferFrames * 2; i += 2) |
| compare_buffer_[i] = 0; |
| memset(mix_buffer_, 0, kBufferFrames * 4); |
| cras_mix_add_stride(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kBufferFrames, 4, 2); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 4)); |
| } |
| |
| class MixTestSuiteS24_LE : public testing::Test{ |
| protected: |
| virtual void SetUp() { |
| fmt_ = SND_PCM_FORMAT_S24_LE; |
| fr_bytes_ = 4 * kNumChannels; |
| mix_buffer_ = (int32_t *)malloc(kBufferFrames * fr_bytes_); |
| src_buffer_ = static_cast<int32_t *>( |
| calloc(1, kBufferFrames * fr_bytes_ + sizeof(cras_audio_shm_area))); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) { |
| src_buffer_[i] = i; |
| mix_buffer_[i] = -i; |
| } |
| |
| compare_buffer_ = (int32_t *)malloc(kBufferFrames * fr_bytes_); |
| } |
| |
| virtual void TearDown() { |
| free(mix_buffer_); |
| free(compare_buffer_); |
| free(src_buffer_); |
| } |
| |
| int32_t *mix_buffer_; |
| int32_t *src_buffer_; |
| int32_t *compare_buffer_; |
| snd_pcm_format_t fmt_; |
| unsigned int fr_bytes_; |
| }; |
| |
| TEST_F(MixTestSuiteS24_LE, MixFirst) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| EXPECT_EQ(0, memcmp(mix_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_LE, MixTwo) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] * 2; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_LE, MixTwoClip) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| src_buffer_[i] = 0x007fffff; |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = 0x007fffff; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_LE, MixFirstMuted) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 1, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = 0; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_LE, MixFirstZeroVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 0.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = 0; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_LE, MixFirstHalfVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 0.5); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] * 0.5; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_LE, MixTwoSecondHalfVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 0.5); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] + (int32_t)(src_buffer_[i] * 0.5); |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_LE, ScaleFullVolume) { |
| memcpy(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_); |
| cras_scale_buffer(fmt_, (uint8_t *)mix_buffer_, kNumSamples, 0.999999999); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_LE, ScaleMinVolume) { |
| memset(compare_buffer_, 0, kBufferFrames * fr_bytes_); |
| cras_scale_buffer(fmt_, (uint8_t *)src_buffer_, kNumSamples, 0.0000000001); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_LE, ScaleHalfVolume) { |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] * 0.5; |
| cras_scale_buffer(fmt_, (uint8_t *)src_buffer_, kNumSamples, 0.5); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_LE, StrideCopy) { |
| for (size_t i = 0; i < kBufferFrames * 2; i += 2) |
| compare_buffer_[i] = src_buffer_[i/2]; |
| for (size_t i = 1; i < kBufferFrames * 2; i += 2) |
| compare_buffer_[i] = 0; |
| memset(mix_buffer_, 0, kBufferFrames * 8); |
| cras_mix_add_stride(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kBufferFrames, 8, 4); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 8)); |
| } |
| |
| class MixTestSuiteS32_LE : public testing::Test{ |
| protected: |
| virtual void SetUp() { |
| fmt_ = SND_PCM_FORMAT_S32_LE; |
| fr_bytes_ = 4 * kNumChannels; |
| mix_buffer_ = (int32_t *)malloc(kBufferFrames * fr_bytes_); |
| src_buffer_ = static_cast<int32_t *>( |
| calloc(1, kBufferFrames * fr_bytes_ + sizeof(cras_audio_shm_area))); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) { |
| src_buffer_[i] = i; |
| mix_buffer_[i] = -i; |
| } |
| |
| compare_buffer_ = (int32_t *)malloc(kBufferFrames * fr_bytes_); |
| } |
| |
| virtual void TearDown() { |
| free(mix_buffer_); |
| free(compare_buffer_); |
| free(src_buffer_); |
| } |
| |
| int32_t *mix_buffer_; |
| int32_t *src_buffer_; |
| int32_t *compare_buffer_; |
| snd_pcm_format_t fmt_; |
| unsigned int fr_bytes_; |
| }; |
| |
| TEST_F(MixTestSuiteS32_LE, MixFirst) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| EXPECT_EQ(0, memcmp(mix_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS32_LE, MixTwo) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] * 2; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS32_LE, MixTwoClip) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| src_buffer_[i] = INT32_MAX; |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = INT32_MAX; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS32_LE, MixFirstMuted) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 1, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = 0; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS32_LE, MixFirstZeroVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 0.0); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = 0; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS32_LE, MixFirstHalfVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 0.5); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] * 0.5; |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS32_LE, MixTwoSecondHalfVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 0.5); |
| |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] + (int32_t)(src_buffer_[i] * 0.5); |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS32_LE, ScaleFullVolume) { |
| memcpy(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_); |
| cras_scale_buffer(fmt_, (uint8_t *)mix_buffer_, kNumSamples, 0.999999999); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS32_LE, ScaleMinVolume) { |
| memset(compare_buffer_, 0, kBufferFrames * fr_bytes_); |
| cras_scale_buffer(fmt_, (uint8_t *)src_buffer_, kNumSamples, 0.0000000001); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS32_LE, ScaleHalfVolume) { |
| for (size_t i = 0; i < kBufferFrames * 2; i++) |
| compare_buffer_[i] = src_buffer_[i] * 0.5; |
| cras_scale_buffer(fmt_, (uint8_t *)src_buffer_, kNumSamples, 0.5); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS32_LE, StrideCopy) { |
| for (size_t i = 0; i < kBufferFrames * 2; i += 2) |
| compare_buffer_[i] = src_buffer_[i/2]; |
| for (size_t i = 1; i < kBufferFrames * 2; i += 2) |
| compare_buffer_[i] = 0; |
| memset(mix_buffer_, 0, kBufferFrames * 8); |
| cras_mix_add_stride(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kBufferFrames, 8, 4); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 8)); |
| } |
| |
| class MixTestSuiteS24_3LE : public testing::Test{ |
| protected: |
| virtual void SetUp() { |
| fmt_ = SND_PCM_FORMAT_S24_3LE; |
| fr_bytes_ = 3 * kNumChannels; |
| mix_buffer_ = (uint8_t *)malloc(kBufferFrames * fr_bytes_); |
| src_buffer_ = static_cast<uint8_t *>( |
| calloc(1, kBufferFrames * fr_bytes_ + sizeof(cras_audio_shm_area))); |
| |
| for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) { |
| memcpy(src_buffer_ + 3*i, &i, 3); |
| int32_t tmp = -i * 256; |
| memcpy(mix_buffer_ + 3*i, (uint8_t *)&tmp + 1, 3); |
| } |
| |
| compare_buffer_ = (uint8_t *)malloc(kBufferFrames * fr_bytes_); |
| } |
| |
| virtual void TearDown() { |
| free(mix_buffer_); |
| free(compare_buffer_); |
| free(src_buffer_); |
| } |
| |
| uint8_t *mix_buffer_; |
| uint8_t *src_buffer_; |
| uint8_t *compare_buffer_; |
| snd_pcm_format_t fmt_; |
| unsigned int fr_bytes_; |
| }; |
| |
| TEST_F(MixTestSuiteS24_3LE, MixFirst) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| EXPECT_EQ(0, memcmp(mix_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_3LE, MixTwo) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) { |
| int32_t tmp = 0; |
| memcpy((uint8_t *)&tmp + 1, src_buffer_ + 3*i, 3); |
| tmp *= 2; |
| memcpy(compare_buffer_ + 3*i, (uint8_t *)&tmp + 1, 3); |
| } |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_3LE, MixTwoClip) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) { |
| int32_t tmp = INT32_MAX; |
| memcpy(src_buffer_ + 3*i, (uint8_t *)&tmp + 1, 3); |
| } |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) { |
| int32_t tmp = INT32_MAX; |
| memcpy(compare_buffer_ + 3*i, (uint8_t *)&tmp + 1, 3); |
| } |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_3LE, MixFirstMuted) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 1, 1.0); |
| |
| for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) |
| memset(compare_buffer_ + 3*i, 0, 3); |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_3LE, MixFirstZeroVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 0.0); |
| |
| for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) |
| memset(compare_buffer_ + 3*i, 0, 3); |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_3LE, MixFirstHalfVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 0.5); |
| |
| for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) { |
| int32_t tmp = 0; |
| memcpy((uint8_t *)&tmp + 1, src_buffer_ + 3*i, 3); |
| tmp *= 0.5; |
| memcpy(compare_buffer_ + 3*i, (uint8_t *)&tmp + 1, 3); |
| } |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_3LE, MixTwoSecondHalfVolume) { |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 0, 0, 1.0); |
| cras_mix_add(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kNumSamples, 1, 0, 0.5); |
| |
| for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) { |
| int32_t tmp1 = 0, tmp2 = 0; |
| memcpy((uint8_t *)&tmp1 + 1, src_buffer_ + 3*i, 3); |
| memcpy((uint8_t *)&tmp2 + 1, src_buffer_ + 3*i, 3); |
| tmp1 = tmp1 + (int32_t)(tmp2 * 0.5); |
| memcpy(compare_buffer_ + 3*i, (uint8_t *)&tmp1 + 1, 3); |
| } |
| EXPECT_EQ(0, memcmp(mix_buffer_, compare_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_3LE, ScaleFullVolume) { |
| memcpy(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_); |
| cras_scale_buffer(fmt_, (uint8_t *)mix_buffer_, kNumSamples, 0.999999999); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_3LE, ScaleMinVolume) { |
| memset(compare_buffer_, 0, kBufferFrames * fr_bytes_); |
| cras_scale_buffer(fmt_, (uint8_t *)src_buffer_, kNumSamples, 0.0000000001); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_3LE, ScaleHalfVolume) { |
| for (size_t i = 0; i < kBufferFrames * kNumChannels; i++) { |
| int32_t tmp = 0; |
| memcpy((uint8_t *)&tmp + 1, src_buffer_ + 3*i, 3); |
| tmp *= 0.5; |
| memcpy(compare_buffer_ + 3*i, (uint8_t *)&tmp + 1, 3); |
| } |
| cras_scale_buffer(fmt_, (uint8_t *)src_buffer_, kNumSamples, 0.5); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, src_buffer_, kBufferFrames * fr_bytes_)); |
| } |
| |
| TEST_F(MixTestSuiteS24_3LE, StrideCopy) { |
| for (size_t i = 0; i < kBufferFrames * kNumChannels; i += 2) |
| memcpy(compare_buffer_ + 3*i, src_buffer_ + 3*i/2, 3); |
| for (size_t i = 1; i < kBufferFrames * kNumChannels; i += 2) |
| memset(compare_buffer_ + 3*i, 0, 3); |
| memset(mix_buffer_, 0, kBufferFrames * 6); |
| cras_mix_add_stride(fmt_, (uint8_t *)mix_buffer_, (uint8_t *)src_buffer_, |
| kBufferFrames, 6, 3); |
| |
| EXPECT_EQ(0, memcmp(compare_buffer_, mix_buffer_, kBufferFrames * 6)); |
| } |
| |
| /* Stubs */ |
| extern "C" { |
| |
| } // extern "C" |
| |
| } // namespace |
| |
| int main(int argc, char **argv) { |
| ::testing::InitGoogleTest(&argc, argv); |
| return RUN_ALL_TESTS(); |
| } |