summaryrefslogtreecommitdiff
path: root/cras/src/tests/iodev_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cras/src/tests/iodev_unittest.cc')
-rw-r--r--cras/src/tests/iodev_unittest.cc2801
1 files changed, 0 insertions, 2801 deletions
diff --git a/cras/src/tests/iodev_unittest.cc b/cras/src/tests/iodev_unittest.cc
deleted file mode 100644
index 24b2b38d..00000000
--- a/cras/src/tests/iodev_unittest.cc
+++ /dev/null
@@ -1,2801 +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 <stdio.h>
-
-extern "C" {
-#include "audio_thread_log.h"
-#include "cras_audio_area.h"
-#include "cras_iodev.h"
-#include "cras_main_thread_log.h"
-#include "cras_ramp.h"
-#include "cras_rstream.h"
-#include "dev_stream.h"
-#include "input_data.h"
-#include "utlist.h"
-
-// Mock software volume scalers.
-float softvol_scalers[101];
-
-// For audio_thread_log.h use.
-int atlog_rw_shm_fd;
-int atlog_ro_shm_fd;
-}
-
-#define BUFFER_SIZE 8192
-
-static const float RAMP_UNMUTE_DURATION_SECS = 0.5;
-static const float RAMP_NEW_STREAM_DURATION_SECS = 0.01;
-static const float RAMP_MUTE_DURATION_SECS = 0.1;
-static const float RAMP_VOLUME_CHANGE_DURATION_SECS = 0.1;
-
-static int cras_iodev_list_disable_dev_called;
-static int select_node_called;
-static enum CRAS_STREAM_DIRECTION select_node_direction;
-static cras_node_id_t select_node_id;
-static struct cras_ionode* node_selected;
-static size_t notify_nodes_changed_called;
-static size_t notify_active_node_changed_called;
-static int dsp_context_new_sample_rate;
-static const char* dsp_context_new_purpose;
-static int dsp_context_free_called;
-static int update_channel_layout_called;
-static int update_channel_layout_return_val;
-static int cras_audio_format_set_channel_layout_called;
-static unsigned int cras_system_get_volume_return;
-static int cras_dsp_get_pipeline_called;
-static int cras_dsp_get_pipeline_ret;
-static int cras_dsp_put_pipeline_called;
-static int cras_dsp_pipeline_get_source_buffer_called;
-static int cras_dsp_pipeline_get_sink_buffer_called;
-static float cras_dsp_pipeline_source_buffer[2][DSP_BUFFER_SIZE];
-static float cras_dsp_pipeline_sink_buffer[2][DSP_BUFFER_SIZE];
-static int cras_dsp_pipeline_get_delay_called;
-static int cras_dsp_pipeline_apply_called;
-static int cras_dsp_pipeline_set_sink_ext_module_called;
-static int cras_dsp_pipeline_apply_sample_count;
-static unsigned int cras_mix_mute_count;
-static unsigned int cras_dsp_num_input_channels_return;
-static unsigned int cras_dsp_num_output_channels_return;
-struct cras_dsp_context* cras_dsp_context_new_return;
-static unsigned int cras_dsp_load_mock_pipeline_called;
-static unsigned int rate_estimator_add_frames_num_frames;
-static unsigned int rate_estimator_add_frames_called;
-static int cras_system_get_mute_return;
-static snd_pcm_format_t cras_scale_buffer_fmt;
-static float cras_scale_buffer_scaler;
-static int cras_scale_buffer_called;
-static unsigned int pre_dsp_hook_called;
-static const uint8_t* pre_dsp_hook_frames;
-static void* pre_dsp_hook_cb_data;
-static unsigned int post_dsp_hook_called;
-static const uint8_t* post_dsp_hook_frames;
-static void* post_dsp_hook_cb_data;
-static int iodev_buffer_size;
-static uint8_t audio_buffer[BUFFER_SIZE];
-static struct cras_audio_area* audio_area;
-static unsigned int put_buffer_nframes;
-static int is_free_running_ret;
-static int no_stream_called;
-static int no_stream_enable;
-// This will be used extensively in cras_iodev.
-struct audio_thread_event_log* atlog;
-static unsigned int simple_no_stream_called;
-static int simple_no_stream_enable;
-static int dev_stream_playback_frames_ret;
-static int device_monitor_reset_device_called;
-static int output_underrun_called;
-static int set_mute_called;
-static int cras_ramp_start_mute_ramp;
-static float cras_ramp_start_from;
-static float cras_ramp_start_to;
-static int cras_ramp_start_duration_frames;
-static int cras_ramp_start_is_called;
-static int cras_ramp_reset_is_called;
-static struct cras_ramp_action cras_ramp_get_current_action_ret;
-static int cras_ramp_update_ramped_frames_num_frames;
-static cras_ramp_cb cras_ramp_start_cb;
-static void* cras_ramp_start_cb_data;
-static int cras_device_monitor_set_device_mute_state_called;
-unsigned int cras_device_monitor_set_device_mute_state_dev_idx;
-static snd_pcm_format_t cras_scale_buffer_increment_fmt;
-static uint8_t* cras_scale_buffer_increment_buff;
-static unsigned int cras_scale_buffer_increment_frame;
-static float cras_scale_buffer_increment_scaler;
-static float cras_scale_buffer_increment_increment;
-static float cras_scale_buffer_increment_target;
-static int cras_scale_buffer_increment_channel;
-static struct cras_audio_format audio_fmt;
-static int buffer_share_add_id_called;
-static int buffer_share_get_new_write_point_ret;
-static int ext_mod_configure_called;
-static struct input_data* input_data_create_ret;
-static double rate_estimator_get_rate_ret;
-static int cras_audio_thread_event_dev_overrun_called;
-
-static char* atlog_name;
-
-// Iodev callback
-int update_channel_layout(struct cras_iodev* iodev) {
- update_channel_layout_called = 1;
- return update_channel_layout_return_val;
-}
-
-void ResetStubData() {
- cras_iodev_list_disable_dev_called = 0;
- select_node_called = 0;
- notify_nodes_changed_called = 0;
- notify_active_node_changed_called = 0;
- dsp_context_new_sample_rate = 0;
- dsp_context_new_purpose = NULL;
- dsp_context_free_called = 0;
- cras_audio_format_set_channel_layout_called = 0;
- cras_dsp_get_pipeline_called = 0;
- cras_dsp_get_pipeline_ret = 0;
- cras_dsp_put_pipeline_called = 0;
- cras_dsp_pipeline_get_source_buffer_called = 0;
- cras_dsp_pipeline_get_sink_buffer_called = 0;
- memset(&cras_dsp_pipeline_source_buffer, 0,
- sizeof(cras_dsp_pipeline_source_buffer));
- memset(&cras_dsp_pipeline_sink_buffer, 0,
- sizeof(cras_dsp_pipeline_sink_buffer));
- cras_dsp_pipeline_get_delay_called = 0;
- cras_dsp_pipeline_apply_called = 0;
- cras_dsp_pipeline_set_sink_ext_module_called = 0;
- cras_dsp_pipeline_apply_sample_count = 0;
- cras_dsp_num_input_channels_return = 2;
- cras_dsp_num_output_channels_return = 2;
- cras_dsp_context_new_return = NULL;
- cras_dsp_load_mock_pipeline_called = 0;
- rate_estimator_add_frames_num_frames = 0;
- rate_estimator_add_frames_called = 0;
- cras_system_get_mute_return = 0;
- cras_system_get_volume_return = 100;
- cras_mix_mute_count = 0;
- pre_dsp_hook_called = 0;
- pre_dsp_hook_frames = NULL;
- post_dsp_hook_called = 0;
- post_dsp_hook_frames = NULL;
- iodev_buffer_size = 0;
- // Assume there is some data in audio buffer.
- memset(audio_buffer, 0xff, sizeof(audio_buffer));
- if (audio_area) {
- free(audio_area);
- audio_area = NULL;
- }
- put_buffer_nframes = 0;
- is_free_running_ret = 0;
- no_stream_called = 0;
- no_stream_enable = 0;
- simple_no_stream_called = 0;
- simple_no_stream_enable = 0;
- dev_stream_playback_frames_ret = 0;
- if (!atlog) {
- if (asprintf(&atlog_name, "/ATlog-%d", getpid()) < 0) {
- exit(-1);
- }
- /* To avoid un-used variable warning. */
- atlog_rw_shm_fd = atlog_ro_shm_fd = -1;
- atlog = audio_thread_event_log_init(atlog_name);
- }
- device_monitor_reset_device_called = 0;
- output_underrun_called = 0;
- set_mute_called = 0;
- cras_ramp_start_mute_ramp = 0;
- cras_ramp_start_from = 0.0;
- cras_ramp_start_to = 0.0;
- cras_ramp_start_duration_frames = 0;
- cras_ramp_start_cb = NULL;
- cras_ramp_start_cb_data = NULL;
- cras_ramp_start_is_called = 0;
- cras_ramp_reset_is_called = 0;
- cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
- cras_ramp_update_ramped_frames_num_frames = 0;
- cras_device_monitor_set_device_mute_state_called = 0;
- cras_device_monitor_set_device_mute_state_dev_idx = 0;
- cras_scale_buffer_called = 0;
- cras_scale_buffer_increment_fmt = SND_PCM_FORMAT_UNKNOWN;
- cras_scale_buffer_increment_buff = NULL;
- cras_scale_buffer_increment_frame = 0;
- cras_scale_buffer_increment_scaler = 0;
- cras_scale_buffer_increment_increment = 0;
- cras_scale_buffer_increment_target = 0.0;
- cras_scale_buffer_increment_channel = 0;
- audio_fmt.format = SND_PCM_FORMAT_S16_LE;
- audio_fmt.frame_rate = 48000;
- audio_fmt.num_channels = 2;
- buffer_share_add_id_called = 0;
- ext_mod_configure_called = 0;
- rate_estimator_get_rate_ret = 0;
- cras_audio_thread_event_dev_overrun_called = 0;
-}
-
-namespace {
-
-// Test fill_time_from_frames
-TEST(IoDevTestSuite, FillTimeFromFramesNormal) {
- struct timespec ts;
-
- cras_iodev_fill_time_from_frames(12000, 48000, &ts);
- EXPECT_EQ(0, ts.tv_sec);
- EXPECT_GE(ts.tv_nsec, 249900000);
- EXPECT_LE(ts.tv_nsec, 250100000);
-}
-
-TEST(IoDevTestSuite, FillTimeFromFramesLong) {
- struct timespec ts;
-
- cras_iodev_fill_time_from_frames(120000 - 12000, 48000, &ts);
- EXPECT_EQ(2, ts.tv_sec);
- EXPECT_GE(ts.tv_nsec, 249900000);
- EXPECT_LE(ts.tv_nsec, 250100000);
-}
-
-TEST(IoDevTestSuite, FillTimeFromFramesShort) {
- struct timespec ts;
-
- cras_iodev_fill_time_from_frames(12000 - 12000, 48000, &ts);
- EXPECT_EQ(0, ts.tv_sec);
- EXPECT_EQ(0, ts.tv_nsec);
-}
-
-class IoDevSetFormatTestSuite : public testing::Test {
- protected:
- virtual void SetUp() {
- ResetStubData();
- sample_rates_[0] = 44100;
- sample_rates_[1] = 48000;
- sample_rates_[2] = 0;
-
- channel_counts_[0] = 2;
- channel_counts_[1] = 0;
- channel_counts_[2] = 0;
-
- pcm_formats_[0] = SND_PCM_FORMAT_S16_LE;
- pcm_formats_[1] = SND_PCM_FORMAT_S32_LE;
- pcm_formats_[2] = static_cast<snd_pcm_format_t>(0);
-
- update_channel_layout_called = 0;
- update_channel_layout_return_val = 0;
-
- memset(&iodev_, 0, sizeof(iodev_));
- iodev_.update_channel_layout = update_channel_layout;
- iodev_.supported_rates = sample_rates_;
- iodev_.supported_channel_counts = channel_counts_;
- iodev_.supported_formats = pcm_formats_;
- iodev_.dsp_context = NULL;
-
- cras_audio_format_set_channel_layout_called = 0;
-
- main_log = main_thread_event_log_init();
- }
-
- virtual void TearDown() {
- cras_iodev_free_format(&iodev_);
- main_thread_event_log_deinit(main_log);
- }
-
- struct cras_iodev iodev_;
- size_t sample_rates_[3];
- size_t channel_counts_[3];
- snd_pcm_format_t pcm_formats_[3];
-};
-
-TEST_F(IoDevSetFormatTestSuite, SupportedFormatSecondary) {
- struct cras_audio_format fmt;
- int rc;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev_.direction = CRAS_STREAM_OUTPUT;
- ResetStubData();
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
- EXPECT_EQ(48000, iodev_.format->frame_rate);
- EXPECT_EQ(2, iodev_.format->num_channels);
- EXPECT_EQ(dsp_context_new_sample_rate, 48000);
- EXPECT_STREQ(dsp_context_new_purpose, "playback");
-}
-
-TEST_F(IoDevSetFormatTestSuite, SupportedFormat32bit) {
- struct cras_audio_format fmt;
- int rc;
-
- fmt.format = SND_PCM_FORMAT_S32_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev_.direction = CRAS_STREAM_OUTPUT;
- ResetStubData();
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S32_LE, iodev_.format->format);
- EXPECT_EQ(48000, iodev_.format->frame_rate);
- EXPECT_EQ(2, iodev_.format->num_channels);
- EXPECT_EQ(dsp_context_new_sample_rate, 48000);
- EXPECT_STREQ(dsp_context_new_purpose, "playback");
-}
-
-TEST_F(IoDevSetFormatTestSuite, SupportedFormatPrimary) {
- struct cras_audio_format fmt;
- int rc;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 44100;
- fmt.num_channels = 2;
- iodev_.direction = CRAS_STREAM_INPUT;
- ResetStubData();
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
- EXPECT_EQ(44100, iodev_.format->frame_rate);
- EXPECT_EQ(2, iodev_.format->num_channels);
- EXPECT_EQ(dsp_context_new_sample_rate, 44100);
- EXPECT_STREQ(dsp_context_new_purpose, "capture");
-}
-
-TEST_F(IoDevSetFormatTestSuite, SupportedFormatDivisor) {
- struct cras_audio_format fmt;
- int rc;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 96000;
- fmt.num_channels = 2;
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
- EXPECT_EQ(48000, iodev_.format->frame_rate);
- EXPECT_EQ(2, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, Supported96k) {
- struct cras_audio_format fmt;
- int rc;
-
- sample_rates_[0] = 48000;
- sample_rates_[1] = 96000;
- sample_rates_[2] = 0;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 96000;
- fmt.num_channels = 2;
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
- EXPECT_EQ(96000, iodev_.format->frame_rate);
- EXPECT_EQ(2, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, LimitLowRate) {
- struct cras_audio_format fmt;
- int rc;
-
- sample_rates_[0] = 48000;
- sample_rates_[1] = 8000;
- sample_rates_[2] = 0;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 8000;
- fmt.num_channels = 2;
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
- EXPECT_EQ(48000, iodev_.format->frame_rate);
- EXPECT_EQ(2, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, UnsupportedChannelCount) {
- struct cras_audio_format fmt;
- int rc;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 96000;
- fmt.num_channels = 1;
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
- EXPECT_EQ(48000, iodev_.format->frame_rate);
- EXPECT_EQ(2, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, SupportedFormatFallbackDefault) {
- struct cras_audio_format fmt;
- int rc;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 96008;
- fmt.num_channels = 2;
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
- EXPECT_EQ(44100, iodev_.format->frame_rate);
- EXPECT_EQ(2, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, UpdateChannelLayoutSuccess) {
- struct cras_audio_format fmt;
- int rc;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 6;
-
- iodev_.supported_channel_counts[0] = 6;
- iodev_.supported_channel_counts[1] = 2;
-
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
- EXPECT_EQ(48000, iodev_.format->frame_rate);
- EXPECT_EQ(6, iodev_.format->num_channels);
-}
-
-TEST_F(IoDevSetFormatTestSuite, UpdateChannelLayoutFail) {
- static const int8_t stereo_layout[] = {0, 1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1};
- struct cras_audio_format fmt;
- int rc, i;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
-
- cras_dsp_context_new_return = reinterpret_cast<cras_dsp_context*>(0xf0f);
-
- update_channel_layout_return_val = -1;
- iodev_.supported_channel_counts[0] = 6;
- iodev_.supported_channel_counts[1] = 2;
-
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
- EXPECT_EQ(48000, iodev_.format->frame_rate);
- EXPECT_EQ(2, iodev_.format->num_channels);
- EXPECT_EQ(0, dsp_context_free_called);
- for (i = 0; i < CRAS_CH_MAX; i++)
- EXPECT_EQ(iodev_.format->channel_layout[i], stereo_layout[i]);
-}
-
-TEST_F(IoDevSetFormatTestSuite, UpdateChannelLayoutFail6ch) {
- static const int8_t default_6ch_layout[] = {0, 1, 2, 3, 4, 5,
- -1, -1, -1, -1, -1};
- struct cras_audio_format fmt;
- int rc, i;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 6;
-
- cras_dsp_context_new_return = reinterpret_cast<cras_dsp_context*>(0xf0f);
-
- update_channel_layout_return_val = -1;
- iodev_.supported_channel_counts[0] = 6;
- iodev_.supported_channel_counts[1] = 2;
-
- rc = cras_iodev_set_format(&iodev_, &fmt);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
- EXPECT_EQ(48000, iodev_.format->frame_rate);
- EXPECT_EQ(6, iodev_.format->num_channels);
- EXPECT_EQ(0, dsp_context_free_called);
- for (i = 0; i < CRAS_CH_MAX; i++)
- EXPECT_EQ(iodev_.format->channel_layout[i], default_6ch_layout[i]);
-}
-
-// Put buffer tests
-
-static int get_buffer(cras_iodev* iodev,
- struct cras_audio_area** area,
- unsigned int* num) {
- size_t sz = sizeof(*audio_area) + sizeof(struct cras_channel_area) * 2;
-
- audio_area = (cras_audio_area*)calloc(1, sz);
- audio_area->frames = *num;
- audio_area->num_channels = 2;
- audio_area->channels[0].buf = audio_buffer;
- channel_area_set_channel(&audio_area->channels[0], CRAS_CH_FL);
- audio_area->channels[0].step_bytes = 4;
- audio_area->channels[1].buf = audio_buffer + 2;
- channel_area_set_channel(&audio_area->channels[1], CRAS_CH_FR);
- audio_area->channels[1].step_bytes = 4;
-
- *area = audio_area;
- return 0;
-}
-
-static int put_buffer(struct cras_iodev* iodev, unsigned int nframes) {
- put_buffer_nframes = nframes;
- if (audio_area) {
- free(audio_area);
- audio_area = NULL;
- }
- return 0;
-}
-
-static int no_stream(struct cras_iodev* odev, int enable) {
- no_stream_called++;
- no_stream_enable = enable;
- // Use default no stream playback to test default behavior.
- return cras_iodev_default_no_stream_playback(odev, enable);
-}
-
-static int is_free_running(const struct cras_iodev* odev) {
- return is_free_running_ret;
-}
-
-static int pre_dsp_hook(const uint8_t* frames,
- unsigned int nframes,
- const struct cras_audio_format* fmt,
- void* cb_data) {
- pre_dsp_hook_called++;
- pre_dsp_hook_frames = frames;
- pre_dsp_hook_cb_data = cb_data;
- return 0;
-}
-
-static int post_dsp_hook(const uint8_t* frames,
- unsigned int nframes,
- const struct cras_audio_format* fmt,
- void* cb_data) {
- post_dsp_hook_called++;
- post_dsp_hook_frames = frames;
- post_dsp_hook_cb_data = cb_data;
- return 0;
-}
-
-static int loopback_hook_control(bool start, void* cb_data) {
- return 0;
-}
-
-TEST(IoDevPutOutputBuffer, SystemMuted) {
- struct cras_audio_format fmt;
- struct cras_iodev iodev;
- uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
- int rc;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- cras_system_get_mute_return = 1;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.put_buffer = put_buffer;
- iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(20, cras_mix_mute_count);
- EXPECT_EQ(20, put_buffer_nframes);
- EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, MuteForVolume) {
- struct cras_iodev iodev;
- struct cras_ionode ionode;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- memset(&ionode, 0, sizeof(ionode));
-
- iodev.nodes = &ionode;
- iodev.active_node = &ionode;
- iodev.active_node->dev = &iodev;
-
- // Case: System volume 100; Node volume 0. => Mute
- cras_system_get_volume_return = 100;
- iodev.active_node->volume = 0;
- EXPECT_EQ(1, cras_iodev_is_zero_volume(&iodev));
-
- // Case: System volume 100; Node volume 50. => Not mute
- cras_system_get_volume_return = 100;
- iodev.active_node->volume = 50;
- EXPECT_EQ(0, cras_iodev_is_zero_volume(&iodev));
-
- // Case: System volume 0; Node volume 50. => Mute
- cras_system_get_volume_return = 0;
- iodev.active_node->volume = 50;
- EXPECT_EQ(1, cras_iodev_is_zero_volume(&iodev));
-
- // Case: System volume 50; Node volume 50. => Mute
- cras_system_get_volume_return = 50;
- iodev.active_node->volume = 50;
- EXPECT_EQ(1, cras_iodev_is_zero_volume(&iodev));
-}
-
-TEST(IoDevPutOutputBuffer, NodeVolumeZeroShouldMute) {
- struct cras_audio_format fmt;
- struct cras_iodev iodev;
- struct cras_ionode ionode;
- uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
- int rc;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- memset(&ionode, 0, sizeof(ionode));
-
- iodev.nodes = &ionode;
- iodev.active_node = &ionode;
- iodev.active_node->dev = &iodev;
- iodev.active_node->volume = 0;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.put_buffer = put_buffer;
- iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(20, cras_mix_mute_count);
- EXPECT_EQ(20, put_buffer_nframes);
- EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, SystemMutedWithRamp) {
- struct cras_audio_format fmt;
- struct cras_iodev iodev;
- uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
- int rc;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- cras_system_get_mute_return = 1;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.put_buffer = put_buffer;
-
- // Assume device has ramp member.
- iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
- iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
- // Assume ramping is done.
- cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
- // Output should be muted.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(20, cras_mix_mute_count);
- EXPECT_EQ(20, put_buffer_nframes);
- EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-
- // Test for the case where ramping is not done yet.
- ResetStubData();
- cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
- rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
-
- // Output should not be muted.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_mix_mute_count);
- // Ramped frames should be increased by 20.
- EXPECT_EQ(20, cras_ramp_update_ramped_frames_num_frames);
- EXPECT_EQ(20, put_buffer_nframes);
- EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, NodeVolumeZeroShouldMuteWithRamp) {
- struct cras_audio_format fmt;
- struct cras_iodev iodev;
- struct cras_ionode ionode;
- uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
- int rc;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- memset(&ionode, 0, sizeof(ionode));
-
- iodev.nodes = &ionode;
- iodev.active_node = &ionode;
- iodev.active_node->dev = &iodev;
- iodev.active_node->volume = 0;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.put_buffer = put_buffer;
- iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
- // Assume device has ramp member.
- iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-
- // Assume ramping is done.
- cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(20, cras_mix_mute_count);
- EXPECT_EQ(20, put_buffer_nframes);
- EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-
- // Test for the case where ramping is not done yet.
- ResetStubData();
- cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
- rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
-
- // Output should not be muted.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_mix_mute_count);
- // Ramped frames should be increased by 20.
- EXPECT_EQ(20, cras_ramp_update_ramped_frames_num_frames);
- EXPECT_EQ(20, put_buffer_nframes);
- EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
-}
-TEST(IoDevPutOutputBuffer, NoDSP) {
- struct cras_audio_format fmt;
- struct cras_iodev iodev;
- struct cras_ionode ionode;
- uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
- int rc;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- memset(&ionode, 0, sizeof(ionode));
-
- iodev.nodes = &ionode;
- iodev.active_node = &ionode;
- iodev.active_node->dev = &iodev;
- iodev.active_node->volume = 100;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.put_buffer = put_buffer;
- iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, 22, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_mix_mute_count);
- EXPECT_EQ(22, put_buffer_nframes);
- EXPECT_EQ(22, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, DSP) {
- struct cras_audio_format fmt;
- struct cras_iodev iodev;
- uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
- int rc;
- struct cras_loopback pre_dsp;
- struct cras_loopback post_dsp;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- iodev.dsp_context = reinterpret_cast<cras_dsp_context*>(0x15);
- cras_dsp_get_pipeline_ret = 0x25;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.put_buffer = put_buffer;
- iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
- pre_dsp.type = LOOPBACK_POST_MIX_PRE_DSP;
- pre_dsp.hook_data = pre_dsp_hook;
- pre_dsp.hook_control = loopback_hook_control;
- pre_dsp.cb_data = (void*)0x1234;
- DL_APPEND(iodev.loopbacks, &pre_dsp);
- post_dsp.type = LOOPBACK_POST_DSP;
- post_dsp.hook_data = post_dsp_hook;
- post_dsp.hook_control = loopback_hook_control;
- post_dsp.cb_data = (void*)0x5678;
- DL_APPEND(iodev.loopbacks, &post_dsp);
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, 32, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_mix_mute_count);
- EXPECT_EQ(1, pre_dsp_hook_called);
- EXPECT_EQ(frames, pre_dsp_hook_frames);
- EXPECT_EQ((void*)0x1234, pre_dsp_hook_cb_data);
- EXPECT_EQ(1, post_dsp_hook_called);
- EXPECT_EQ((void*)0x5678, post_dsp_hook_cb_data);
- EXPECT_EQ(32, put_buffer_nframes);
- EXPECT_EQ(32, rate_estimator_add_frames_num_frames);
- EXPECT_EQ(32, cras_dsp_pipeline_apply_sample_count);
- EXPECT_EQ(cras_dsp_get_pipeline_called, cras_dsp_put_pipeline_called);
-}
-
-TEST(IoDevPutOutputBuffer, SoftVol) {
- struct cras_audio_format fmt;
- struct cras_iodev iodev;
- uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
- int rc;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- iodev.software_volume_needed = 1;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.put_buffer = put_buffer;
- iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
- cras_system_get_volume_return = 13;
- softvol_scalers[13] = 0.435;
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, 53, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_mix_mute_count);
- EXPECT_EQ(53, put_buffer_nframes);
- EXPECT_EQ(53, rate_estimator_add_frames_num_frames);
- EXPECT_EQ(softvol_scalers[13], cras_scale_buffer_scaler);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, cras_scale_buffer_fmt);
-}
-
-TEST(IoDevPutOutputBuffer, SoftVolWithRamp) {
- struct cras_audio_format fmt;
- struct cras_iodev iodev;
- uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
- int rc;
- int n_frames = 53;
- float ramp_scaler = 0.2;
- float increment = 0.001;
- float target = 1.0;
- int volume = 13;
- float volume_scaler = 0.435;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- iodev.software_volume_needed = 1;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.put_buffer = put_buffer;
- // Assume device has ramp member.
- iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
- iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
- // Assume ramping is done.
- cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
-
- cras_system_get_volume_return = volume;
- softvol_scalers[volume] = volume_scaler;
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_mix_mute_count);
- EXPECT_EQ(n_frames, put_buffer_nframes);
- EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
- EXPECT_EQ(softvol_scalers[volume], cras_scale_buffer_scaler);
- EXPECT_EQ(SND_PCM_FORMAT_S16_LE, cras_scale_buffer_fmt);
-
- ResetStubData();
- // Assume ramping is not done.
- cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
- cras_ramp_get_current_action_ret.scaler = ramp_scaler;
- cras_ramp_get_current_action_ret.increment = increment;
- cras_ramp_get_current_action_ret.target = target;
-
- cras_system_get_volume_return = volume;
- softvol_scalers[volume] = volume_scaler;
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_mix_mute_count);
- // cras_scale_buffer is not called.
- EXPECT_EQ(0, cras_scale_buffer_called);
-
- // Verify the arguments passed to cras_scale_buffer_increment.
- EXPECT_EQ(fmt.format, cras_scale_buffer_increment_fmt);
- EXPECT_EQ(frames, cras_scale_buffer_increment_buff);
- EXPECT_EQ(n_frames, cras_scale_buffer_increment_frame);
- // Initial scaler will be product of software volume scaler and
- // ramp scaler.
- EXPECT_FLOAT_EQ(softvol_scalers[volume] * ramp_scaler,
- cras_scale_buffer_increment_scaler);
- // Increment scaler will be product of software volume scaler and
- // ramp increment.
- EXPECT_FLOAT_EQ(softvol_scalers[volume] * increment,
- cras_scale_buffer_increment_increment);
- EXPECT_FLOAT_EQ(softvol_scalers[volume] * target,
- cras_scale_buffer_increment_target);
- EXPECT_EQ(fmt.num_channels, cras_scale_buffer_increment_channel);
-
- EXPECT_EQ(n_frames, put_buffer_nframes);
- EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, NoSoftVolWithRamp) {
- struct cras_audio_format fmt;
- struct cras_iodev iodev;
- uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
- int rc;
- int n_frames = 53;
- float ramp_scaler = 0.2;
- float increment = 0.001;
- float target = 1.0;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- iodev.software_volume_needed = 0;
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.put_buffer = put_buffer;
- // Assume device has ramp member.
- iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
- iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
- // Assume ramping is done.
- cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_mix_mute_count);
- // cras_scale_buffer is not called.
- EXPECT_EQ(0, cras_scale_buffer_called);
- EXPECT_EQ(n_frames, put_buffer_nframes);
- EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
-
- ResetStubData();
- // Assume ramping is not done.
- cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
- cras_ramp_get_current_action_ret.scaler = ramp_scaler;
- cras_ramp_get_current_action_ret.increment = increment;
- cras_ramp_get_current_action_ret.target = target;
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_mix_mute_count);
- // cras_scale_buffer is not called.
- EXPECT_EQ(0, cras_scale_buffer_called);
-
- // Verify the arguments passed to cras_scale_buffer_increment.
- EXPECT_EQ(fmt.format, cras_scale_buffer_increment_fmt);
- EXPECT_EQ(frames, cras_scale_buffer_increment_buff);
- EXPECT_EQ(n_frames, cras_scale_buffer_increment_frame);
- EXPECT_FLOAT_EQ(ramp_scaler, cras_scale_buffer_increment_scaler);
- EXPECT_FLOAT_EQ(increment, cras_scale_buffer_increment_increment);
- EXPECT_FLOAT_EQ(1.0, cras_scale_buffer_increment_target);
- EXPECT_EQ(fmt.num_channels, cras_scale_buffer_increment_channel);
-
- EXPECT_EQ(n_frames, put_buffer_nframes);
- EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDevPutOutputBuffer, Scale32Bit) {
- struct cras_audio_format fmt;
- struct cras_iodev iodev;
- uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
- int rc;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- iodev.software_volume_needed = 1;
-
- cras_system_get_volume_return = 13;
- softvol_scalers[13] = 0.435;
-
- fmt.format = SND_PCM_FORMAT_S32_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.put_buffer = put_buffer;
- iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
-
- rc = cras_iodev_put_output_buffer(&iodev, frames, 53, NULL, nullptr);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_mix_mute_count);
- EXPECT_EQ(53, put_buffer_nframes);
- EXPECT_EQ(53, rate_estimator_add_frames_num_frames);
- EXPECT_EQ(SND_PCM_FORMAT_S32_LE, cras_scale_buffer_fmt);
-}
-
-// frames queued/avail tests
-
-static unsigned fr_queued = 0;
-
-static int frames_queued(const struct cras_iodev* iodev,
- struct timespec* tstamp) {
- clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
- return fr_queued;
-}
-
-TEST(IoDevQueuedBuffer, ZeroMinBufferLevel) {
- struct cras_iodev iodev;
- struct timespec tstamp;
- int rc;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- iodev.direction = CRAS_STREAM_OUTPUT;
- iodev.frames_queued = frames_queued;
- iodev.min_buffer_level = 0;
- iodev.buffer_size = 200;
- fr_queued = 50;
-
- rc = cras_iodev_frames_queued(&iodev, &tstamp);
- EXPECT_EQ(50, rc);
- rc = cras_iodev_buffer_avail(&iodev, rc);
- EXPECT_EQ(150, rc);
-}
-
-TEST(IoDevQueuedBuffer, NonZeroMinBufferLevel) {
- struct cras_iodev iodev;
- struct timespec hw_tstamp;
- int rc;
-
- ResetStubData();
- memset(&iodev, 0, sizeof(iodev));
- iodev.direction = CRAS_STREAM_OUTPUT;
- iodev.frames_queued = frames_queued;
- iodev.min_buffer_level = 100;
- iodev.buffer_size = 200;
- fr_queued = 180;
-
- rc = cras_iodev_frames_queued(&iodev, &hw_tstamp);
- EXPECT_EQ(80, rc);
- rc = cras_iodev_buffer_avail(&iodev, rc);
- EXPECT_EQ(20, rc);
-
- /* When fr_queued < min_buffer_level*/
- fr_queued = 80;
- rc = cras_iodev_frames_queued(&iodev, &hw_tstamp);
- EXPECT_EQ(0, rc);
- rc = cras_iodev_buffer_avail(&iodev, rc);
- EXPECT_EQ(100, rc);
-}
-
-static void update_active_node(struct cras_iodev* iodev,
- unsigned node_idx,
- unsigned dev_enabled) {}
-
-static void dev_set_mute(struct cras_iodev* iodev) {
- set_mute_called++;
-}
-
-TEST(IoNodePlug, PlugUnplugNode) {
- struct cras_iodev iodev;
- struct cras_ionode ionode, ionode2;
-
- main_log = main_thread_event_log_init();
-
- memset(&iodev, 0, sizeof(iodev));
- memset(&ionode, 0, sizeof(ionode));
- memset(&ionode2, 0, sizeof(ionode2));
- iodev.direction = CRAS_STREAM_INPUT;
- iodev.update_active_node = update_active_node;
- ionode.dev = &iodev;
- cras_iodev_add_node(&iodev, &ionode);
- ionode2.dev = &iodev;
- cras_iodev_add_node(&iodev, &ionode2);
- cras_iodev_set_active_node(&iodev, &ionode);
- ResetStubData();
- cras_iodev_set_node_plugged(&ionode, 1);
- EXPECT_EQ(0, cras_iodev_list_disable_dev_called);
- cras_iodev_set_node_plugged(&ionode, 0);
- EXPECT_EQ(1, cras_iodev_list_disable_dev_called);
-
- /* Unplug non-active node shouldn't disable iodev. */
- cras_iodev_set_node_plugged(&ionode2, 1);
- EXPECT_EQ(1, cras_iodev_list_disable_dev_called);
- cras_iodev_set_node_plugged(&ionode2, 0);
- EXPECT_EQ(1, cras_iodev_list_disable_dev_called);
- main_thread_event_log_deinit(main_log);
-}
-
-TEST(IoDev, AddRemoveNode) {
- struct cras_iodev iodev;
- struct cras_ionode ionode;
-
- memset(&iodev, 0, sizeof(iodev));
- memset(&ionode, 0, sizeof(ionode));
- ResetStubData();
- EXPECT_EQ(0, notify_nodes_changed_called);
- cras_iodev_add_node(&iodev, &ionode);
- EXPECT_EQ(1, notify_nodes_changed_called);
- cras_iodev_rm_node(&iodev, &ionode);
- EXPECT_EQ(2, notify_nodes_changed_called);
-}
-
-TEST(IoDev, SetActiveNode) {
- struct cras_iodev iodev;
- struct cras_ionode ionode;
-
- memset(&iodev, 0, sizeof(iodev));
- memset(&ionode, 0, sizeof(ionode));
- ResetStubData();
- EXPECT_EQ(0, notify_active_node_changed_called);
- cras_iodev_set_active_node(&iodev, &ionode);
- EXPECT_EQ(1, notify_active_node_changed_called);
-}
-
-TEST(IoDev, SetMute) {
- struct cras_iodev iodev;
- int rc;
-
- memset(&iodev, 0, sizeof(iodev));
- iodev.set_mute = dev_set_mute;
- iodev.state = CRAS_IODEV_STATE_CLOSE;
-
- ResetStubData();
- rc = cras_iodev_set_mute(&iodev);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, set_mute_called);
-
- iodev.state = CRAS_IODEV_STATE_OPEN;
- rc = cras_iodev_set_mute(&iodev);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(1, set_mute_called);
-}
-
-// Test software volume changes for default output.
-TEST(IoDev, SoftwareVolume) {
- struct cras_iodev iodev;
- struct cras_ionode ionode;
-
- memset(&iodev, 0, sizeof(iodev));
- memset(&ionode, 0, sizeof(ionode));
- ResetStubData();
-
- iodev.nodes = &ionode;
- iodev.active_node = &ionode;
- iodev.active_node->dev = &iodev;
-
- iodev.active_node->volume = 100;
- iodev.software_volume_needed = 0;
-
- softvol_scalers[80] = 0.5;
- softvol_scalers[70] = 0.3;
-
- // Check that system volume changes software volume if needed.
- cras_system_get_volume_return = 80;
- // system_volume - 100 + node_volume = 80 - 100 + 100 = 80
- EXPECT_FLOAT_EQ(0.5, cras_iodev_get_software_volume_scaler(&iodev));
-
- // Check that node volume changes software volume if needed.
- iodev.active_node->volume = 90;
- // system_volume - 100 + node_volume = 80 - 100 + 90 = 70
- EXPECT_FLOAT_EQ(0.3, cras_iodev_get_software_volume_scaler(&iodev));
-}
-
-// Test software gain scaler.
-TEST(IoDev, SoftwareGain) {
- struct cras_iodev iodev;
- struct cras_ionode ionode;
-
- memset(&iodev, 0, sizeof(iodev));
- memset(&ionode, 0, sizeof(ionode));
- ResetStubData();
-
- iodev.nodes = &ionode;
- iodev.active_node = &ionode;
- iodev.active_node->dev = &iodev;
-
- ionode.capture_gain = 2400;
- ionode.software_volume_needed = 1;
-
- // 2400 * 0.01 dB is 15.848931
- EXPECT_FLOAT_EQ(15.848931, cras_iodev_get_software_gain_scaler(&iodev));
-
- // Software gain scaler should be 1.0 if software gain is not needed.
- ionode.software_volume_needed = 0;
- EXPECT_FLOAT_EQ(1.0, cras_iodev_get_software_gain_scaler(&iodev));
-}
-
-// This get_buffer implementation set returned frames larger than requested
-// frames.
-static int bad_get_buffer(struct cras_iodev* iodev,
- struct cras_audio_area** area,
- unsigned* frames) {
- *frames = *frames + 1;
- return 0;
-}
-
-// Check that if get_buffer implementation returns invalid frames,
-// cras_iodev_get_output_buffer and cras_iodev_get_input_buffer can return
-// error.
-TEST(IoDev, GetBufferInvalidFrames) {
- struct cras_iodev iodev;
- struct cras_audio_area** area = NULL;
- unsigned int frames = 512;
- struct cras_audio_format fmt;
-
- // Format is used in cras_iodev_get_input_buffer;
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
-
- memset(&iodev, 0, sizeof(iodev));
-
- ResetStubData();
-
- iodev.format = &fmt;
- iodev.get_buffer = bad_get_buffer;
-
- EXPECT_EQ(-EINVAL, cras_iodev_get_output_buffer(&iodev, area, &frames));
- EXPECT_EQ(-EINVAL, cras_iodev_get_input_buffer(&iodev, &frames));
-}
-
-static int configure_dev(struct cras_iodev* iodev) {
- iodev->buffer_size = iodev_buffer_size;
- return 0;
-}
-
-TEST(IoDev, OpenOutputDeviceNoStart) {
- struct cras_iodev iodev;
-
- memset(&iodev, 0, sizeof(iodev));
- iodev.configure_dev = configure_dev;
- iodev.direction = CRAS_STREAM_OUTPUT;
- iodev.format = &audio_fmt;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
- ResetStubData();
-
- iodev.state = CRAS_IODEV_STATE_CLOSE;
-
- iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, 240, &audio_fmt);
- EXPECT_EQ(0, iodev.max_cb_level);
- EXPECT_EQ(240, iodev.min_cb_level);
-
- // Test that state is no stream run when there is no start ops.
- EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
-}
-
-TEST(IoDev, OpenOutputDeviceWithLowRateFmt) {
- struct cras_iodev iodev;
-
- memset(&iodev, 0, sizeof(iodev));
- iodev.configure_dev = configure_dev;
- iodev.direction = CRAS_STREAM_OUTPUT;
- iodev.format = &audio_fmt;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
- ResetStubData();
-
- cras_audio_format low_rate_fmt = audio_fmt;
- low_rate_fmt.frame_rate = 8000;
- iodev.state = CRAS_IODEV_STATE_CLOSE;
-
- iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, 40, &low_rate_fmt);
- EXPECT_EQ(0, iodev.max_cb_level);
-
- // Test that iodev min_cb_level should be set to
- // 40 * 48000 / 8000 = 240
- EXPECT_EQ(240, iodev.min_cb_level);
-}
-
-int fake_start(const struct cras_iodev* iodev) {
- return 0;
-}
-
-TEST(IoDev, OpenOutputDeviceWithStart) {
- struct cras_iodev iodev;
-
- memset(&iodev, 0, sizeof(iodev));
- iodev.configure_dev = configure_dev;
- iodev.direction = CRAS_STREAM_OUTPUT;
- iodev.format = &audio_fmt;
- ResetStubData();
-
- iodev.state = CRAS_IODEV_STATE_CLOSE;
- iodev.start = fake_start;
-
- iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, 240, &audio_fmt);
- EXPECT_EQ(0, iodev.max_cb_level);
- EXPECT_EQ(240, iodev.min_cb_level);
-
- // Test that state is no stream run when there is start ops.
- EXPECT_EQ(CRAS_IODEV_STATE_OPEN, iodev.state);
-}
-
-TEST(IoDev, OpenInputDeviceNoStart) {
- struct cras_iodev iodev;
-
- memset(&iodev, 0, sizeof(iodev));
- iodev.configure_dev = configure_dev;
- iodev.direction = CRAS_STREAM_INPUT;
- iodev.format = &audio_fmt;
- ResetStubData();
-
- iodev.state = CRAS_IODEV_STATE_CLOSE;
-
- iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, 240, &audio_fmt);
- EXPECT_EQ(0, iodev.max_cb_level);
- EXPECT_EQ(240, iodev.min_cb_level);
-
- // Test that state is normal run when there is start ops.
- EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
-}
-
-TEST(IoDev, OpenInputDeviceWithStart) {
- struct cras_iodev iodev;
-
- memset(&iodev, 0, sizeof(iodev));
- iodev.configure_dev = configure_dev;
- iodev.direction = CRAS_STREAM_INPUT;
- iodev.format = &audio_fmt;
- ResetStubData();
-
- iodev.state = CRAS_IODEV_STATE_CLOSE;
- iodev.start = fake_start;
-
- iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, 240, &audio_fmt);
- EXPECT_EQ(0, iodev.max_cb_level);
- EXPECT_EQ(240, iodev.min_cb_level);
-
- // Test that state is normal run even if there is start ops.
- EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
-}
-
-TEST(IoDev, OpenInputDeviceWithLowRateFmt) {
- struct cras_iodev iodev;
-
- memset(&iodev, 0, sizeof(iodev));
- iodev.configure_dev = configure_dev;
- iodev.direction = CRAS_STREAM_INPUT;
- iodev.format = &audio_fmt;
- ResetStubData();
-
- cras_audio_format low_rate_fmt = audio_fmt;
- low_rate_fmt.frame_rate = 8000;
- iodev.state = CRAS_IODEV_STATE_CLOSE;
-
- iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, 40, &low_rate_fmt);
- EXPECT_EQ(0, iodev.max_cb_level);
-
- // Test that iodev min_cb_level should be set to
- // 40 * 48000 / 8000 = 240
- EXPECT_EQ(240, iodev.min_cb_level);
-}
-
-static int simple_no_stream(struct cras_iodev* dev, int enable) {
- simple_no_stream_enable = enable;
- simple_no_stream_called++;
- return 0;
-}
-
-TEST(IoDev, AddRmStream) {
- struct cras_iodev iodev;
- struct cras_rstream rstream1, rstream2;
- struct dev_stream stream1, stream2;
-
- memset(&iodev, 0, sizeof(iodev));
- memset(&rstream1, 0, sizeof(rstream1));
- memset(&rstream2, 0, sizeof(rstream2));
- iodev.configure_dev = configure_dev;
- iodev.no_stream = simple_no_stream;
- iodev.format = &audio_fmt;
- iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
- rstream1.cb_threshold = 800;
- stream1.stream = &rstream1;
- stream1.is_running = 0;
- rstream2.cb_threshold = 400;
- stream2.stream = &rstream2;
- stream2.is_running = 0;
- ResetStubData();
-
- iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, rstream1.cb_threshold, &audio_fmt);
- EXPECT_EQ(0, iodev.max_cb_level);
- EXPECT_EQ(512, iodev.min_cb_level);
-
- /* min_cb_level should not exceed half the buffer size. */
- cras_iodev_add_stream(&iodev, &stream1);
- cras_iodev_start_stream(&iodev, &stream1);
- EXPECT_EQ(800, iodev.max_cb_level);
- EXPECT_EQ(512, iodev.min_cb_level);
- EXPECT_EQ(1, buffer_share_add_id_called);
-
- cras_iodev_add_stream(&iodev, &stream2);
- cras_iodev_start_stream(&iodev, &stream2);
- EXPECT_EQ(800, iodev.max_cb_level);
- EXPECT_EQ(400, iodev.min_cb_level);
- EXPECT_EQ(2, buffer_share_add_id_called);
-
- cras_iodev_rm_stream(&iodev, &rstream1);
- EXPECT_EQ(400, iodev.max_cb_level);
- EXPECT_EQ(400, iodev.min_cb_level);
- EXPECT_EQ(0, simple_no_stream_called);
-
- /* When all streams are removed, keep the last min_cb_level for draining. */
- cras_iodev_rm_stream(&iodev, &rstream2);
- EXPECT_EQ(0, iodev.max_cb_level);
- EXPECT_EQ(512, iodev.min_cb_level);
-}
-
-TEST(IoDev, RmStreamUpdateFetchTime) {
- struct cras_iodev iodev;
- struct cras_rstream rstream1, rstream2, rstream3;
- struct dev_stream stream1, stream2, stream3;
-
- memset(&iodev, 0, sizeof(iodev));
- memset(&rstream1, 0, sizeof(rstream1));
- memset(&rstream2, 0, sizeof(rstream2));
- memset(&rstream3, 0, sizeof(rstream2));
- memset(&stream1, 0, sizeof(stream2));
- memset(&stream2, 0, sizeof(stream2));
- memset(&stream3, 0, sizeof(stream2));
- iodev.configure_dev = configure_dev;
- iodev.no_stream = simple_no_stream;
- iodev.format = &audio_fmt;
- iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
- rstream1.direction = CRAS_STREAM_OUTPUT;
- rstream2.direction = CRAS_STREAM_OUTPUT;
- rstream3.direction = CRAS_STREAM_OUTPUT;
- stream1.stream = &rstream1;
- stream2.stream = &rstream2;
- stream3.stream = &rstream3;
- ResetStubData();
-
- cras_iodev_open(&iodev, 1024, &audio_fmt);
-
- cras_iodev_add_stream(&iodev, &stream1);
- cras_iodev_start_stream(&iodev, &stream1);
- cras_iodev_add_stream(&iodev, &stream2);
- cras_iodev_start_stream(&iodev, &stream2);
- cras_iodev_add_stream(&iodev, &stream3);
-
- rstream1.next_cb_ts.tv_sec = 2;
- rstream1.next_cb_ts.tv_nsec = 0;
- rstream2.next_cb_ts.tv_sec = 1;
- rstream2.next_cb_ts.tv_nsec = 0;
- rstream3.next_cb_ts.tv_sec = 1;
- rstream3.next_cb_ts.tv_nsec = 0;
-
- /*
- * Because rstream3 has not started yet, the next_cb_ts will be change to the
- * earliest fetch time of remaining streams, which is rstream1.
- */
- cras_iodev_rm_stream(&iodev, &rstream2);
-
- EXPECT_EQ(rstream3.next_cb_ts.tv_sec, rstream1.next_cb_ts.tv_sec);
- EXPECT_EQ(rstream3.next_cb_ts.tv_nsec, rstream1.next_cb_ts.tv_nsec);
-}
-
-TEST(IoDev, StartStreams) {
- struct cras_iodev iodev1, iodev2;
- struct cras_rstream rstream1, rstream2;
- struct dev_stream stream1, stream2;
-
- memset(&iodev1, 0, sizeof(iodev1));
- memset(&iodev2, 0, sizeof(iodev2));
- memset(&rstream1, 0, sizeof(rstream1));
- memset(&rstream2, 0, sizeof(rstream2));
- memset(&stream1, 0, sizeof(stream1));
- memset(&stream2, 0, sizeof(stream2));
- iodev1.configure_dev = configure_dev;
- iodev1.format = &audio_fmt;
- iodev1.state = CRAS_IODEV_STATE_NORMAL_RUN;
- iodev1.get_buffer = get_buffer;
- iodev1.put_buffer = put_buffer;
- iodev2.configure_dev = configure_dev;
- iodev2.format = &audio_fmt;
- iodev2.state = CRAS_IODEV_STATE_NORMAL_RUN;
- rstream1.direction = CRAS_STREAM_INPUT;
- rstream2.direction = CRAS_STREAM_OUTPUT;
- stream1.stream = &rstream1;
- stream2.stream = &rstream2;
-
- /* An input stream starts running immediately. */
- ResetStubData();
- iodev1.direction = CRAS_STREAM_INPUT;
- cras_iodev_open(&iodev1, 1024, &audio_fmt);
- cras_iodev_add_stream(&iodev1, &stream1);
- EXPECT_EQ(1, dev_stream_is_running(&stream1));
- EXPECT_EQ(1, buffer_share_add_id_called);
-
- /* An output stream starts running after its first fetch. */
- ResetStubData();
- iodev2.direction = CRAS_STREAM_OUTPUT;
- cras_iodev_open(&iodev2, 1024, &audio_fmt);
- cras_iodev_add_stream(&iodev2, &stream2);
- EXPECT_EQ(0, dev_stream_is_running(&stream2));
- EXPECT_EQ(0, buffer_share_add_id_called);
-}
-
-TEST(IoDev, TriggerOnlyStreamNoBufferShare) {
- struct cras_iodev iodev;
- struct cras_rstream rstream;
- struct dev_stream stream;
-
- memset(&iodev, 0, sizeof(iodev));
- memset(&rstream, 0, sizeof(rstream));
- iodev.configure_dev = configure_dev;
- iodev.format = &audio_fmt;
- iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
- rstream.cb_threshold = 800;
- rstream.flags = TRIGGER_ONLY;
- stream.stream = &rstream;
- ResetStubData();
-
- cras_iodev_open(&iodev, rstream.cb_threshold, &audio_fmt);
- /* TRIGGER_ONLY streams shall not be added to buffer_share. */
- cras_iodev_add_stream(&iodev, &stream);
- EXPECT_EQ(0, buffer_share_add_id_called);
-}
-
-TEST(IoDev, FillZeros) {
- struct cras_iodev iodev;
- struct cras_audio_format fmt;
- unsigned int frames = 50;
- int16_t* zeros;
- int rc;
-
- ResetStubData();
-
- memset(&iodev, 0, sizeof(iodev));
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
-
- iodev.direction = CRAS_STREAM_INPUT;
- rc = cras_iodev_fill_odev_zeros(&iodev, frames);
- EXPECT_EQ(-EINVAL, rc);
-
- iodev.direction = CRAS_STREAM_OUTPUT;
- rc = cras_iodev_fill_odev_zeros(&iodev, frames);
-
- EXPECT_EQ(0, rc);
- EXPECT_EQ(frames, put_buffer_nframes);
- zeros = (int16_t*)calloc(frames * 2, sizeof(*zeros));
- rc = memcmp(audio_buffer, zeros, frames * 2 * 2);
- free(zeros);
- EXPECT_EQ(0, rc);
-}
-
-TEST(IoDev, DefaultNoStreamPlaybackRunning) {
- struct cras_iodev iodev;
- struct cras_audio_format fmt;
- unsigned int hw_level = 50;
- unsigned int min_cb_level = 240;
- unsigned int zeros_to_fill;
- int16_t* zeros;
- int rc;
-
- memset(&iodev, 0, sizeof(iodev));
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.min_cb_level = min_cb_level;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
- iodev.frames_queued = frames_queued;
- iodev.min_buffer_level = 0;
- iodev.direction = CRAS_STREAM_OUTPUT;
- iodev.buffer_size = BUFFER_SIZE;
- iodev.no_stream = no_stream;
-
- ResetStubData();
-
- // Device is running. hw_level is less than target.
- // Need to fill to callback level * 2;
- iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
- fr_queued = hw_level;
- zeros_to_fill = min_cb_level * 2 - hw_level;
-
- rc = cras_iodev_default_no_stream_playback(&iodev, 1);
-
- EXPECT_EQ(0, rc);
- EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
- EXPECT_EQ(zeros_to_fill, put_buffer_nframes);
- zeros = (int16_t*)calloc(zeros_to_fill * 2, sizeof(*zeros));
- EXPECT_EQ(0, memcmp(audio_buffer, zeros, zeros_to_fill * 2 * 2));
- free(zeros);
-
- ResetStubData();
-
- // Device is running. hw_level is not less than target.
- // No need to fill zeros.
- iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
- hw_level = min_cb_level * 2;
- fr_queued = hw_level;
- zeros_to_fill = 0;
-
- rc = cras_iodev_default_no_stream_playback(&iodev, 1);
- EXPECT_EQ(0, rc);
- EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
- EXPECT_EQ(zeros_to_fill, put_buffer_nframes);
-}
-
-TEST(IoDev, PrepareOutputBeforeWriteSamples) {
- struct cras_iodev iodev;
- struct cras_audio_format fmt;
- unsigned int min_cb_level = 240;
- int rc;
- struct cras_rstream rstream1;
- struct dev_stream stream1;
- struct cras_iodev_info info;
-
- memset(&info, 0, sizeof(info));
-
- ResetStubData();
-
- rstream1.cb_threshold = min_cb_level;
- stream1.stream = &rstream1;
- stream1.is_running = 1;
-
- memset(&iodev, 0, sizeof(iodev));
-
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.format = &fmt;
- iodev.min_cb_level = min_cb_level;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
- iodev.frames_queued = frames_queued;
- iodev.min_buffer_level = 0;
- iodev.direction = CRAS_STREAM_OUTPUT;
- iodev.buffer_size = BUFFER_SIZE;
- iodev.no_stream = no_stream;
- iodev.configure_dev = configure_dev;
- iodev.start = fake_start;
- iodev.info = info;
- iodev_buffer_size = BUFFER_SIZE;
-
- // Open device.
- cras_iodev_open(&iodev, rstream1.cb_threshold, &fmt);
-
- // Add one stream to device.
- cras_iodev_add_stream(&iodev, &stream1);
-
- // Case 1: Assume device is not started yet.
- iodev.state = CRAS_IODEV_STATE_OPEN;
- // Assume sample is not ready yet.
- dev_stream_playback_frames_ret = 0;
-
- rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
- EXPECT_EQ(0, rc);
- // Device should remain in open state.
- EXPECT_EQ(CRAS_IODEV_STATE_OPEN, iodev.state);
- EXPECT_EQ(0, no_stream_called);
-
- // Assume now sample is ready.
- dev_stream_playback_frames_ret = 100;
-
- rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
- EXPECT_EQ(0, rc);
- // Device should enter normal run state.
- EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
- EXPECT_EQ(0, no_stream_called);
- // Need to fill 1 callback level of zeros;
- EXPECT_EQ(min_cb_level, put_buffer_nframes);
-
- ResetStubData();
-
- // Case 2: Assume device is started and is in no stream state.
- iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
- // Sample is not ready yet.
- dev_stream_playback_frames_ret = 0;
-
- rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
- EXPECT_EQ(0, rc);
- // Device should remain in no_stream state.
- EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
- // Device in no_stream state should call no_stream ops once.
- EXPECT_EQ(1, no_stream_called);
- EXPECT_EQ(1, no_stream_enable);
-
- // Assume now sample is ready.
- dev_stream_playback_frames_ret = 100;
-
- rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
- EXPECT_EQ(0, rc);
- // Device should enter normal run state.
- EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
- // Device should call no_stream ops with enable=0 to leave no stream state.
- EXPECT_EQ(2, no_stream_called);
- EXPECT_EQ(0, no_stream_enable);
-
- ResetStubData();
-
- // Case 3: Assume device is started and is in normal run state.
- iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
-
- rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
- EXPECT_EQ(0, rc);
- // Device should remain in normal run state.
- EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
- // Device in no_stream state should call no_stream ops once.
- EXPECT_EQ(0, no_stream_called);
-
- ResetStubData();
-
- // Test for device with ramp. Device should start ramping
- // when sample is ready.
-
- // Assume device has ramp member.
- iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
- iodev.initial_ramp_request = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
- // Case 4.1: Assume device with ramp is started and is in no stream state.
- iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
- // Assume sample is ready.
- dev_stream_playback_frames_ret = 100;
-
- rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
- // Device should start ramping up without setting mute callback.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(1, cras_ramp_start_is_called);
- EXPECT_EQ(1, cras_ramp_start_mute_ramp);
- EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
- EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
- EXPECT_EQ(fmt.frame_rate * RAMP_NEW_STREAM_DURATION_SECS,
- cras_ramp_start_duration_frames);
- EXPECT_EQ(NULL, cras_ramp_start_cb);
- EXPECT_EQ(NULL, cras_ramp_start_cb_data);
-
- ResetStubData();
-
- // Case 4.2: Assume device with ramp is started and is in no stream state.
- // But system is muted.
- iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
- // Assume system is muted.
- cras_system_get_mute_return = 1;
- // Assume sample is ready.
- dev_stream_playback_frames_ret = 100;
-
- rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
- // Device should not start ramping up because system is muted.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_ramp_start_is_called);
-
- ResetStubData();
-
- // Case 5.1: Assume device with ramp is in open state.
- iodev.state = CRAS_IODEV_STATE_OPEN;
- // Assume sample is ready.
- dev_stream_playback_frames_ret = 100;
-
- rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
- // Device should start ramping up without setting mute callback.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(1, cras_ramp_start_is_called);
- EXPECT_EQ(1, cras_ramp_start_mute_ramp);
- EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
- EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
- EXPECT_EQ(fmt.frame_rate * RAMP_NEW_STREAM_DURATION_SECS,
- cras_ramp_start_duration_frames);
- EXPECT_EQ(NULL, cras_ramp_start_cb);
- EXPECT_EQ(NULL, cras_ramp_start_cb_data);
-
- ResetStubData();
-
- // Case 5.2: Assume device with ramp is in open state. But system is muted.
- iodev.state = CRAS_IODEV_STATE_OPEN;
- // Assume system is muted.
- cras_system_get_mute_return = 1;
- // Assume sample is ready.
- dev_stream_playback_frames_ret = 100;
-
- rc = cras_iodev_prepare_output_before_write_samples(&iodev);
-
- // Device should not start ramping up because system is muted.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_ramp_start_is_called);
-}
-
-TEST(IoDev, StartRampUp) {
- struct cras_iodev iodev;
- int rc;
- struct cras_audio_format fmt;
- enum CRAS_IODEV_RAMP_REQUEST req;
- memset(&iodev, 0, sizeof(iodev));
-
- // Format will be used in cras_iodev_start_ramp to determine ramp duration.
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
-
- // Assume device has ramp member.
- iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-
- // Case 1: Device is not opened yet.
- ResetStubData();
- iodev.state = CRAS_IODEV_STATE_CLOSE;
- req = CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE;
-
- rc = cras_iodev_start_ramp(&iodev, req);
-
- // Ramp request is ignored.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_ramp_start_is_called);
-
- // Case 2: Ramp up without mute.
- ResetStubData();
- iodev.state = CRAS_IODEV_STATE_OPEN;
- req = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
-
- rc = cras_iodev_start_ramp(&iodev, req);
-
- // Device should start ramping up without setting mute callback.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(1, cras_ramp_start_is_called);
- EXPECT_EQ(1, cras_ramp_start_mute_ramp);
- EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
- EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
- EXPECT_EQ(fmt.frame_rate * RAMP_NEW_STREAM_DURATION_SECS,
- cras_ramp_start_duration_frames);
- EXPECT_EQ(NULL, cras_ramp_start_cb);
- EXPECT_EQ(NULL, cras_ramp_start_cb_data);
-
- // Case 3: Ramp up for unmute.
- ResetStubData();
- iodev.state = CRAS_IODEV_STATE_OPEN;
- req = CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE;
-
- rc = cras_iodev_start_ramp(&iodev, req);
-
- // Device should start ramping up.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(1, cras_ramp_start_is_called);
- EXPECT_EQ(1, cras_ramp_start_mute_ramp);
- EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
- EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
- EXPECT_EQ(fmt.frame_rate * RAMP_UNMUTE_DURATION_SECS,
- cras_ramp_start_duration_frames);
- // Callback for unmute is not used.
- EXPECT_EQ(NULL, cras_ramp_start_cb);
- // Device mute state is set after ramping starts.
- EXPECT_EQ(1, cras_device_monitor_set_device_mute_state_called);
- EXPECT_EQ(iodev.info.idx, cras_device_monitor_set_device_mute_state_dev_idx);
-}
-
-TEST(IoDev, StartRampDown) {
- struct cras_iodev iodev;
- int rc;
- struct cras_audio_format fmt;
- enum CRAS_IODEV_RAMP_REQUEST req;
- memset(&iodev, 0, sizeof(iodev));
-
- // Format will be used in cras_iodev_start_ramp to determine ramp duration.
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
-
- // Assume device has ramp member.
- iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-
- // Case 1: Device is not opened yet.
- ResetStubData();
- iodev.state = CRAS_IODEV_STATE_CLOSE;
- req = CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE;
-
- rc = cras_iodev_start_ramp(&iodev, req);
-
- // Ramp request is ignored.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_ramp_start_is_called);
-
- // Case 2: Ramp down for mute.
- ResetStubData();
- iodev.state = CRAS_IODEV_STATE_OPEN;
- req = CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE;
-
- rc = cras_iodev_start_ramp(&iodev, req);
-
- // Device should start ramping down with mute callback.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(1, cras_ramp_start_is_called);
- EXPECT_EQ(1, cras_ramp_start_mute_ramp);
- EXPECT_FLOAT_EQ(1.0, cras_ramp_start_from);
- EXPECT_FLOAT_EQ(0.0, cras_ramp_start_to);
- EXPECT_EQ(fmt.frame_rate * RAMP_MUTE_DURATION_SECS,
- cras_ramp_start_duration_frames);
-
- // Device mute state is not set yet. It should wait for ramp to finish.
- EXPECT_EQ(0, cras_device_monitor_set_device_mute_state_called);
-
- // Assume the callback is set, and it is later called after ramp is done.
- // It should trigger cras_device_monitor_set_device_mute_state.
- cras_ramp_start_cb(cras_ramp_start_cb_data);
- EXPECT_EQ(1, cras_device_monitor_set_device_mute_state_called);
- EXPECT_EQ(iodev.info.idx, cras_device_monitor_set_device_mute_state_dev_idx);
-}
-
-TEST(IoDev, StartVolumeRamp) {
- struct cras_ionode ionode;
- struct cras_iodev iodev;
- int rc;
- struct cras_audio_format fmt;
- int expected_frames;
- float ionode_softvol_scalers[101];
- memset(&iodev, 0, sizeof(iodev));
-
- // Format will be used in cras_iodev_start_ramp to determine ramp duration.
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- expected_frames = fmt.frame_rate * RAMP_VOLUME_CHANGE_DURATION_SECS;
-
- // Assume device has ramp member.
- iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
-
- // Case 1: Device is not opened yet.
- ResetStubData();
- iodev.state = CRAS_IODEV_STATE_CLOSE;
- rc = cras_iodev_start_volume_ramp(&iodev, 30, 94);
-
- // Ramp request is ignored.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_ramp_start_is_called);
-
- // Case 2: Volumes are equal.
- ResetStubData();
- iodev.state = CRAS_IODEV_STATE_OPEN;
- rc = cras_iodev_start_volume_ramp(&iodev, 70, 70);
-
- // Ramp request is ignored.
- EXPECT_EQ(0, rc);
- EXPECT_EQ(0, cras_ramp_start_is_called);
-
- // Case 3: Ramp up, global scalers
- ResetStubData();
- iodev.state = CRAS_IODEV_STATE_OPEN;
- softvol_scalers[40] = 0.2;
- softvol_scalers[60] = 0.8;
-
- rc = cras_iodev_start_volume_ramp(&iodev, 40, 60);
-
- EXPECT_EQ(0, rc);
- EXPECT_EQ(1, cras_ramp_start_is_called);
- EXPECT_EQ(0, cras_ramp_start_mute_ramp);
- EXPECT_FLOAT_EQ(0.25, cras_ramp_start_from);
- EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
- EXPECT_EQ(expected_frames, cras_ramp_start_duration_frames);
- EXPECT_EQ(NULL, cras_ramp_start_cb);
- EXPECT_EQ(NULL, cras_ramp_start_cb_data);
-
- // Case 4: Ramp down, device saclers
- ResetStubData();
- iodev.state = CRAS_IODEV_STATE_OPEN;
-
- ionode_softvol_scalers[40] = 0.4;
- ionode_softvol_scalers[60] = 0.5;
- ionode.softvol_scalers = ionode_softvol_scalers;
- iodev.active_node = &ionode;
-
- rc = cras_iodev_start_volume_ramp(&iodev, 60, 40);
-
- EXPECT_EQ(0, rc);
- EXPECT_EQ(1, cras_ramp_start_is_called);
- EXPECT_EQ(0, cras_ramp_start_mute_ramp);
- EXPECT_FLOAT_EQ(1.25, cras_ramp_start_from);
- EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
- EXPECT_EQ(expected_frames, cras_ramp_start_duration_frames);
- EXPECT_EQ(NULL, cras_ramp_start_cb);
- EXPECT_EQ(NULL, cras_ramp_start_cb_data);
-}
-
-TEST(IoDev, OutputDeviceShouldWake) {
- struct cras_iodev iodev;
- int rc;
-
- memset(&iodev, 0, sizeof(iodev));
-
- ResetStubData();
-
- // Device is not running. No need to wake for this device.
- iodev.state = CRAS_IODEV_STATE_OPEN;
- rc = cras_iodev_odev_should_wake(&iodev);
- EXPECT_EQ(0, rc);
-
- // Device is running. Need to wake for this device.
- iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
- rc = cras_iodev_odev_should_wake(&iodev);
- EXPECT_EQ(1, rc);
-
- // Device is running. Device has is_free_running ops.
- iodev.is_free_running = is_free_running;
- is_free_running_ret = 1;
- rc = cras_iodev_odev_should_wake(&iodev);
- EXPECT_EQ(0, rc);
-
- // Device is running. Device has is_free_running ops.
- is_free_running_ret = 0;
- rc = cras_iodev_odev_should_wake(&iodev);
- EXPECT_EQ(1, rc);
-
- // Ignore input device.
- iodev.direction = CRAS_STREAM_INPUT;
- rc = cras_iodev_odev_should_wake(&iodev);
- EXPECT_EQ(0, rc);
-}
-
-TEST(IoDev, FramesToPlayInSleep) {
- struct cras_iodev iodev;
- struct cras_audio_format fmt;
- unsigned int min_cb_level = 512, hw_level;
- unsigned int got_hw_level, got_frames;
- struct timespec hw_tstamp;
- struct cras_rstream rstream;
- struct dev_stream stream;
-
- memset(&iodev, 0, sizeof(iodev));
- memset(&fmt, 0, sizeof(fmt));
- iodev.frames_queued = frames_queued;
- iodev.min_buffer_level = 0;
- iodev.direction = CRAS_STREAM_OUTPUT;
- iodev.buffer_size = BUFFER_SIZE;
- iodev.min_cb_level = min_cb_level;
- iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
- iodev.format = &fmt;
- fmt.frame_rate = 48000;
- rstream.cb_threshold = min_cb_level;
- stream.stream = &rstream;
-
- ResetStubData();
-
- cras_iodev_add_stream(&iodev, &stream);
- cras_iodev_start_stream(&iodev, &stream);
-
- // Device is running. There is at least one stream for this device
- // and there are frames waiting to be played. hw_level is greater
- // than min_cb_level.
- dev_stream_playback_frames_ret = 100;
- hw_level = min_cb_level + 50;
- fr_queued = hw_level;
- got_frames =
- cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
- EXPECT_EQ(got_hw_level, hw_level);
- EXPECT_EQ(got_frames, 50);
- dev_stream_playback_frames_ret = 0;
-
- // Device is running. There is at least one stream for this device.
- // hw_level is greater than min_cb_level.
- hw_level = min_cb_level + 50;
- fr_queued = hw_level;
- got_frames =
- cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
- EXPECT_EQ(got_hw_level, hw_level);
- EXPECT_EQ(got_frames, 514);
-
- // Device is running. There is at least one stream for this device.
- // hw_level is 2x greater than min_cb_level.
- hw_level = 2 * min_cb_level + 50;
- fr_queued = hw_level;
- got_frames =
- cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
- EXPECT_EQ(got_hw_level, hw_level);
- EXPECT_EQ(got_frames, 1026);
-
- // Device is running. There is at least one stream for this device.
- // hw_level is less than min_cb_level.
- hw_level = min_cb_level / 2;
- fr_queued = hw_level;
- got_frames =
- cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
- EXPECT_EQ(got_hw_level, hw_level);
- EXPECT_EQ(got_frames, 208);
-
- // Device is running. There is no stream for this device. The audio thread
- // will wake up until hw_level drops to DEV_NO_STREAM_WAKE_UP_LATEST_TIME,
- // which is defined as 5 milliseconds in cras_iodev.c.
- iodev.streams = NULL;
- hw_level = min_cb_level;
- fr_queued = hw_level;
- got_frames =
- cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
- EXPECT_EQ(got_hw_level, hw_level);
- EXPECT_EQ(got_frames, hw_level - fmt.frame_rate / 1000 * 5);
-}
-
-TEST(IoDev, GetNumUnderruns) {
- struct cras_iodev iodev;
- memset(&iodev, 0, sizeof(iodev));
-
- EXPECT_EQ(0, cras_iodev_get_num_underruns(&iodev));
-
- iodev.num_underruns = 10;
- EXPECT_EQ(10, cras_iodev_get_num_underruns(&iodev));
-}
-
-TEST(IoDev, RequestReset) {
- struct cras_iodev iodev;
- memset(&iodev, 0, sizeof(iodev));
-
- ResetStubData();
-
- iodev.configure_dev = configure_dev;
- iodev.direction = CRAS_STREAM_OUTPUT;
- iodev.format = &audio_fmt;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
-
- iodev.state = CRAS_IODEV_STATE_CLOSE;
- iodev_buffer_size = 1024;
-
- // Open device.
- cras_iodev_open(&iodev, 240, &audio_fmt);
-
- // The first reset request works.
- EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
- EXPECT_EQ(1, device_monitor_reset_device_called);
-
- // The second reset request will do nothing.
- EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
- EXPECT_EQ(1, device_monitor_reset_device_called);
-
- // Assume device is opened again.
- cras_iodev_open(&iodev, 240, &audio_fmt);
-
- // The reset request works.
- EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
- EXPECT_EQ(2, device_monitor_reset_device_called);
-}
-
-static int output_underrun(struct cras_iodev* iodev) {
- output_underrun_called++;
- return 0;
-}
-
-TEST(IoDev, HandleOutputUnderrun) {
- struct cras_iodev iodev;
- struct cras_audio_format fmt;
- unsigned int frames = 240;
- int16_t* zeros;
- int rc;
-
- ResetStubData();
-
- memset(&iodev, 0, sizeof(iodev));
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.format = &fmt;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
- iodev.direction = CRAS_STREAM_OUTPUT;
- iodev.min_cb_level = frames;
-
- // Default case, fill one block of zeros.
- EXPECT_EQ(0, cras_iodev_output_underrun(&iodev, 0, 0));
-
- EXPECT_EQ(frames, put_buffer_nframes);
- zeros = (int16_t*)calloc(frames * 2, sizeof(*zeros));
- rc = memcmp(audio_buffer, zeros, frames * 2 * 2);
- free(zeros);
- EXPECT_EQ(0, rc);
-
- // Test iodev has output_underrun ops.
- iodev.output_underrun = output_underrun;
- EXPECT_EQ(0, cras_iodev_output_underrun(&iodev, 0, 0));
- EXPECT_EQ(1, output_underrun_called);
-}
-
-static void ext_mod_configure(struct ext_dsp_module* ext,
- unsigned int buffer_size,
- unsigned int num_channels,
- unsigned int rate) {
- ext_mod_configure_called++;
-}
-
-TEST(IoDev, SetExtDspMod) {
- struct cras_iodev iodev;
- struct cras_audio_format fmt;
- struct ext_dsp_module ext;
-
- ResetStubData();
-
- memset(&iodev, 0, sizeof(iodev));
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.configure_dev = configure_dev;
- iodev.format = &fmt;
- iodev.format = &fmt;
- iodev.state = CRAS_IODEV_STATE_CLOSE;
- ext.configure = ext_mod_configure;
-
- iodev.dsp_context = reinterpret_cast<cras_dsp_context*>(0xf0f);
- cras_dsp_get_pipeline_ret = 0x25;
-
- cras_iodev_set_ext_dsp_module(&iodev, &ext);
- EXPECT_EQ(0, ext_mod_configure_called);
-
- cras_iodev_open(&iodev, 240, &fmt);
- EXPECT_EQ(1, ext_mod_configure_called);
- EXPECT_EQ(1, cras_dsp_get_pipeline_called);
- EXPECT_EQ(1, cras_dsp_pipeline_set_sink_ext_module_called);
-
- cras_iodev_set_ext_dsp_module(&iodev, NULL);
- EXPECT_EQ(1, ext_mod_configure_called);
- EXPECT_EQ(2, cras_dsp_get_pipeline_called);
- EXPECT_EQ(2, cras_dsp_pipeline_set_sink_ext_module_called);
-
- cras_iodev_set_ext_dsp_module(&iodev, &ext);
- EXPECT_EQ(2, ext_mod_configure_called);
- EXPECT_EQ(3, cras_dsp_get_pipeline_called);
- EXPECT_EQ(3, cras_dsp_pipeline_set_sink_ext_module_called);
-
- /* If pipeline doesn't exist, mock pipeline should be loaded. */
- cras_dsp_get_pipeline_ret = 0x0;
- cras_iodev_set_ext_dsp_module(&iodev, &ext);
- EXPECT_EQ(3, ext_mod_configure_called);
- EXPECT_EQ(5, cras_dsp_get_pipeline_called);
- EXPECT_EQ(1, cras_dsp_load_mock_pipeline_called);
- EXPECT_EQ(4, cras_dsp_pipeline_set_sink_ext_module_called);
-}
-
-TEST(IoDev, InputDspOffset) {
- struct cras_iodev iodev;
- struct cras_audio_format fmt;
- struct cras_rstream rstream1;
- struct dev_stream stream1;
- struct input_data data;
- unsigned int frames = 240;
- int rc;
-
- ResetStubData();
-
- rstream1.cb_threshold = 240;
- rstream1.stream_id = 123;
- stream1.stream = &rstream1;
-
- memset(&iodev, 0, sizeof(iodev));
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.configure_dev = configure_dev;
- iodev.format = &fmt;
- iodev.format = &fmt;
- iodev.state = CRAS_IODEV_STATE_CLOSE;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
- iodev.direction = CRAS_STREAM_INPUT;
- iodev.buffer_size = 480;
-
- iodev.dsp_context = reinterpret_cast<cras_dsp_context*>(0xf0f);
- cras_dsp_get_pipeline_ret = 0x25;
- input_data_create_ret = &data;
-
- cras_iodev_open(&iodev, 240, &fmt);
-
- cras_iodev_add_stream(&iodev, &stream1);
- cras_iodev_get_input_buffer(&iodev, &frames);
-
- buffer_share_get_new_write_point_ret = 100;
- rc = cras_iodev_put_input_buffer(&iodev);
- EXPECT_EQ(140, iodev.input_dsp_offset);
- EXPECT_EQ(100, rc);
-
- frames = 130;
- cras_iodev_get_input_buffer(&iodev, &frames);
- EXPECT_EQ(130, iodev.input_frames_read);
-
- buffer_share_get_new_write_point_ret = 80;
- rc = cras_iodev_put_input_buffer(&iodev);
- EXPECT_EQ(60, iodev.input_dsp_offset);
- EXPECT_EQ(80, rc);
-}
-
-TEST(IoDev, DropDeviceFramesByTime) {
- struct cras_iodev iodev;
- struct cras_audio_format fmt;
- struct input_data data;
- struct timespec ts;
- int rc;
-
- ResetStubData();
-
- memset(&iodev, 0, sizeof(iodev));
- fmt.format = SND_PCM_FORMAT_S16_LE;
- fmt.frame_rate = 48000;
- fmt.num_channels = 2;
- iodev.configure_dev = configure_dev;
- iodev.format = &fmt;
- iodev.state = CRAS_IODEV_STATE_CLOSE;
- iodev.get_buffer = get_buffer;
- iodev.put_buffer = put_buffer;
- iodev.frames_queued = frames_queued;
- iodev.direction = CRAS_STREAM_INPUT;
- iodev.buffer_size = 480;
- input_data_create_ret = &data;
- cras_iodev_open(&iodev, 240, &fmt);
- rate_estimator_get_rate_ret = 48000.0;
-
- /* hw_level: 240, drop: 48(1ms). */
- fr_queued = 240;
- ts.tv_sec = 0;
- ts.tv_nsec = 1000000;
- rc = cras_iodev_drop_frames_by_time(&iodev, ts);
- EXPECT_EQ(48, rc);
- EXPECT_EQ(48, put_buffer_nframes);
- EXPECT_EQ(1, rate_estimator_add_frames_called);
- EXPECT_EQ(-48, rate_estimator_add_frames_num_frames);
-
- /* hw_level: 360, drop: 240(5ms). */
- fr_queued = 360;
- ts.tv_sec = 0;
- ts.tv_nsec = 5000000;
- rc = cras_iodev_drop_frames_by_time(&iodev, ts);
- EXPECT_EQ(240, rc);
- EXPECT_EQ(240, put_buffer_nframes);
- EXPECT_EQ(2, rate_estimator_add_frames_called);
- EXPECT_EQ(-240, rate_estimator_add_frames_num_frames);
-
- /* hw_level: 360, drop: 480(10ms). Only drop 360 because of lower hw_level. */
- fr_queued = 360;
- ts.tv_sec = 0;
- ts.tv_nsec = 10000000;
- rc = cras_iodev_drop_frames_by_time(&iodev, ts);
- EXPECT_EQ(360, rc);
- EXPECT_EQ(360, put_buffer_nframes);
- EXPECT_EQ(3, rate_estimator_add_frames_called);
- EXPECT_EQ(-360, rate_estimator_add_frames_num_frames);
-}
-
-TEST(IoDev, AecUseCaseCheck) {
- struct cras_ionode node;
-
- /* test output types */
- node.type = CRAS_NODE_TYPE_INTERNAL_SPEAKER;
- EXPECT_EQ(1, cras_iodev_is_aec_use_case(&node));
- node.type = CRAS_NODE_TYPE_HEADPHONE;
- EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
- node.type = CRAS_NODE_TYPE_HDMI;
- EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
- node.type = CRAS_NODE_TYPE_USB;
- EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
- node.type = CRAS_NODE_TYPE_BLUETOOTH;
- EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
-
- /* test mic positions */
- node.type = CRAS_NODE_TYPE_MIC;
- node.position = NODE_POSITION_INTERNAL;
- EXPECT_EQ(1, cras_iodev_is_aec_use_case(&node));
- node.position = NODE_POSITION_FRONT;
- EXPECT_EQ(1, cras_iodev_is_aec_use_case(&node));
- node.position = NODE_POSITION_EXTERNAL;
- EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
- node.position = NODE_POSITION_REAR;
- EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
-}
-
-TEST(IoDev, DeviceOverrun) {
- struct cras_iodev iodev;
-
- iodev.buffer_size = 4096;
- iodev.largest_cb_level = 2048;
- cras_iodev_update_highest_hw_level(&iodev, 4096);
- EXPECT_EQ(0, cras_audio_thread_event_dev_overrun_called);
-
- iodev.largest_cb_level = 1024;
- iodev.highest_hw_level = 1024;
- cras_iodev_update_highest_hw_level(&iodev, 2048);
- EXPECT_EQ(0, cras_audio_thread_event_dev_overrun_called);
-
- cras_iodev_update_highest_hw_level(&iodev, 4096);
- EXPECT_EQ(1, cras_audio_thread_event_dev_overrun_called);
-
- cras_iodev_update_highest_hw_level(&iodev, 4096);
- EXPECT_EQ(1, cras_audio_thread_event_dev_overrun_called);
-}
-
-TEST(IoDev, OnInternalCard) {
- static struct cras_ionode node;
- node.type = CRAS_NODE_TYPE_INTERNAL_SPEAKER;
- EXPECT_EQ(1, cras_iodev_is_on_internal_card(&node));
- node.type = CRAS_NODE_TYPE_HEADPHONE;
- EXPECT_EQ(1, cras_iodev_is_on_internal_card(&node));
- node.type = CRAS_NODE_TYPE_MIC;
- EXPECT_EQ(1, cras_iodev_is_on_internal_card(&node));
- node.type = CRAS_NODE_TYPE_USB;
- EXPECT_EQ(0, cras_iodev_is_on_internal_card(&node));
- node.type = CRAS_NODE_TYPE_BLUETOOTH;
- EXPECT_EQ(0, cras_iodev_is_on_internal_card(&node));
-}
-
-extern "C" {
-
-struct main_thread_event_log* main_log;
-
-// From libpthread.
-int pthread_create(pthread_t* thread,
- const pthread_attr_t* attr,
- void* (*start_routine)(void*),
- void* arg) {
- return 0;
-}
-
-int pthread_join(pthread_t thread, void** value_ptr) {
- return 0;
-}
-
-// Fromt fmt_conv
-void cras_channel_remix_convert(struct cras_fmt_conv* conv,
- uint8_t* in_buf,
- size_t frames) {}
-
-size_t cras_fmt_conv_in_frames_to_out(struct cras_fmt_conv* conv,
- size_t in_frames) {
- return in_frames;
-}
-
-// From buffer_share
-struct buffer_share* buffer_share_create(unsigned int buf_sz) {
- return NULL;
-}
-
-void buffer_share_destroy(struct buffer_share* mix) {}
-
-int buffer_share_offset_update(struct buffer_share* mix,
- unsigned int id,
- unsigned int frames) {
- return 0;
-}
-
-unsigned int buffer_share_get_new_write_point(struct buffer_share* mix) {
- return buffer_share_get_new_write_point_ret;
-}
-
-int buffer_share_add_id(struct buffer_share* mix, unsigned int id, void* data) {
- buffer_share_add_id_called++;
- return 0;
-}
-
-int buffer_share_rm_id(struct buffer_share* mix, unsigned int id) {
- return 0;
-}
-
-unsigned int buffer_share_id_offset(const struct buffer_share* mix,
- unsigned int id) {
- return 0;
-}
-
-// From cras_system_state.
-void cras_system_state_stream_added(enum CRAS_STREAM_DIRECTION direction,
- enum CRAS_CLIENT_TYPE client_type) {}
-
-void cras_system_state_stream_removed(enum CRAS_STREAM_DIRECTION direction,
- enum CRAS_CLIENT_TYPE client_type) {}
-
-// From cras_dsp
-struct cras_dsp_context* cras_dsp_context_new(int sample_rate,
- const char* purpose) {
- dsp_context_new_sample_rate = sample_rate;
- dsp_context_new_purpose = purpose;
- return cras_dsp_context_new_return;
-}
-
-void cras_dsp_context_free(struct cras_dsp_context* ctx) {
- dsp_context_free_called++;
-}
-
-void cras_dsp_load_pipeline(struct cras_dsp_context* ctx) {}
-void cras_dsp_load_mock_pipeline(struct cras_dsp_context* ctx,
- unsigned int num_channels) {
- cras_dsp_load_mock_pipeline_called++;
-}
-
-void cras_dsp_set_variable_string(struct cras_dsp_context* ctx,
- const char* key,
- const char* value) {}
-
-void cras_dsp_set_variable_boolean(struct cras_dsp_context* ctx,
- const char* key,
- char value) {}
-
-struct pipeline* cras_dsp_get_pipeline(struct cras_dsp_context* ctx) {
- cras_dsp_get_pipeline_called++;
- return reinterpret_cast<struct pipeline*>(cras_dsp_get_pipeline_ret);
-}
-
-void cras_dsp_put_pipeline(struct cras_dsp_context* ctx) {
- cras_dsp_put_pipeline_called++;
-}
-
-float* cras_dsp_pipeline_get_source_buffer(struct pipeline* pipeline,
- int index) {
- cras_dsp_pipeline_get_source_buffer_called++;
- return cras_dsp_pipeline_source_buffer[index];
-}
-
-float* cras_dsp_pipeline_get_sink_buffer(struct pipeline* pipeline, int index) {
- cras_dsp_pipeline_get_sink_buffer_called++;
- return cras_dsp_pipeline_sink_buffer[index];
-}
-
-int cras_dsp_pipeline_get_delay(struct pipeline* pipeline) {
- cras_dsp_pipeline_get_delay_called++;
- return 0;
-}
-
-int cras_dsp_pipeline_apply(struct pipeline* pipeline,
- uint8_t* buf,
- snd_pcm_format_t format,
- unsigned int frames) {
- cras_dsp_pipeline_apply_called++;
- cras_dsp_pipeline_apply_sample_count = frames;
- return 0;
-}
-
-void cras_dsp_pipeline_add_statistic(struct pipeline* pipeline,
- const struct timespec* time_delta,
- int samples) {}
-void cras_dsp_pipeline_set_sink_ext_module(struct pipeline* pipeline,
- struct ext_dsp_module* ext_module) {
- cras_dsp_pipeline_set_sink_ext_module_called++;
-}
-
-unsigned int cras_dsp_num_output_channels(const struct cras_dsp_context* ctx) {
- return cras_dsp_num_output_channels_return;
-}
-
-unsigned int cras_dsp_num_input_channels(const struct cras_dsp_context* ctx) {
- return cras_dsp_num_input_channels_return;
-}
-
-// From audio thread
-int audio_thread_post_message(struct audio_thread* thread,
- struct audio_thread_msg* msg) {
- return 0;
-}
-
-void cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,
- cras_node_id_t node_id) {
- select_node_called++;
- select_node_direction = direction;
- select_node_id = node_id;
-}
-
-int cras_iodev_list_node_selected(struct cras_ionode* node) {
- return node == node_selected;
-}
-
-void cras_iodev_list_disable_dev(struct cras_iodev* dev) {
- cras_iodev_list_disable_dev_called++;
-}
-
-void cras_iodev_list_notify_nodes_changed() {
- notify_nodes_changed_called++;
-}
-
-void cras_iodev_list_notify_active_node_changed(
- enum CRAS_STREAM_DIRECTION direction) {
- notify_active_node_changed_called++;
-}
-
-struct cras_audio_area* cras_audio_area_create(int num_channels) {
- return NULL;
-}
-
-void cras_audio_area_destroy(struct cras_audio_area* area) {}
-
-void cras_audio_area_config_channels(struct cras_audio_area* area,
- const struct cras_audio_format* fmt) {}
-
-int cras_audio_format_set_channel_layout(struct cras_audio_format* format,
- const int8_t layout[CRAS_CH_MAX]) {
- int i;
- cras_audio_format_set_channel_layout_called++;
- for (i = 0; i < CRAS_CH_MAX; i++)
- format->channel_layout[i] = layout[i];
- return 0;
-}
-
-float softvol_get_scaler(unsigned int volume_index) {
- return softvol_scalers[volume_index];
-}
-
-size_t cras_system_get_volume() {
- return cras_system_get_volume_return;
-}
-
-int cras_system_get_mute() {
- return cras_system_get_mute_return;
-}
-
-int cras_system_get_capture_mute() {
- return 0;
-}
-
-void cras_scale_buffer(snd_pcm_format_t fmt,
- uint8_t* buffer,
- unsigned int count,
- float scaler) {
- cras_scale_buffer_called++;
- cras_scale_buffer_fmt = fmt;
- cras_scale_buffer_scaler = scaler;
-}
-
-void cras_scale_buffer_increment(snd_pcm_format_t fmt,
- uint8_t* buff,
- unsigned int frame,
- float scaler,
- float increment,
- float target,
- int channel) {
- cras_scale_buffer_increment_fmt = fmt;
- cras_scale_buffer_increment_buff = buff;
- cras_scale_buffer_increment_frame = frame;
- cras_scale_buffer_increment_scaler = scaler;
- cras_scale_buffer_increment_increment = increment;
- cras_scale_buffer_increment_target = target;
- cras_scale_buffer_increment_channel = channel;
-}
-
-size_t cras_mix_mute_buffer(uint8_t* dst, size_t frame_bytes, size_t count) {
- cras_mix_mute_count = count;
- return count;
-}
-
-struct rate_estimator* rate_estimator_create(unsigned int rate,
- const struct timespec* window_size,
- double smooth_factor) {
- return NULL;
-}
-
-void rate_estimator_destroy(struct rate_estimator* re) {}
-
-void rate_estimator_add_frames(struct rate_estimator* re, int fr) {
- rate_estimator_add_frames_called++;
- rate_estimator_add_frames_num_frames = fr;
-}
-
-int rate_estimator_check(struct rate_estimator* re,
- int level,
- struct timespec* now) {
- return 0;
-}
-
-void rate_estimator_reset_rate(struct rate_estimator* re, unsigned int rate) {}
-
-double rate_estimator_get_rate(struct rate_estimator* re) {
- return rate_estimator_get_rate_ret;
-}
-
-unsigned int dev_stream_cb_threshold(const struct dev_stream* dev_stream) {
- if (dev_stream->stream)
- return dev_stream->stream->cb_threshold;
- return 0;
-}
-
-int dev_stream_attached_devs(const struct dev_stream* dev_stream) {
- return 1;
-}
-
-void dev_stream_update_frames(const struct dev_stream* dev_stream) {}
-
-int dev_stream_playback_frames(const struct dev_stream* dev_stream) {
- return dev_stream_playback_frames_ret;
-}
-
-int cras_device_monitor_reset_device(struct cras_iodev* iodev) {
- device_monitor_reset_device_called++;
- return 0;
-}
-
-void cras_ramp_destroy(struct cras_ramp* ramp) {
- return;
-}
-
-int cras_ramp_start(struct cras_ramp* ramp,
- int mute_ramp,
- float from,
- float to,
- int duration_frames,
- cras_ramp_cb cb,
- void* cb_data) {
- cras_ramp_start_is_called++;
- cras_ramp_start_mute_ramp = mute_ramp;
- cras_ramp_start_from = from;
- cras_ramp_start_to = to;
- cras_ramp_start_duration_frames = duration_frames;
- cras_ramp_start_cb = cb;
- cras_ramp_start_cb_data = cb_data;
- return 0;
-}
-
-int cras_ramp_reset(struct cras_ramp* ramp) {
- cras_ramp_reset_is_called++;
- return 0;
-}
-
-struct cras_ramp_action cras_ramp_get_current_action(
- const struct cras_ramp* ramp) {
- return cras_ramp_get_current_action_ret;
-}
-
-int cras_ramp_update_ramped_frames(struct cras_ramp* ramp, int num_frames) {
- cras_ramp_update_ramped_frames_num_frames = num_frames;
- return 0;
-}
-
-int cras_device_monitor_set_device_mute_state(unsigned int dev_idx) {
- cras_device_monitor_set_device_mute_state_called++;
- cras_device_monitor_set_device_mute_state_dev_idx = dev_idx;
- return 0;
-}
-
-static void mod_run(struct ext_dsp_module* ext, unsigned int nframes) {}
-
-static void mod_configure(struct ext_dsp_module* ext,
- unsigned int buffer_size,
- unsigned int num_channels,
- unsigned int rate) {}
-
-struct input_data* input_data_create(void* dev_ptr) {
- if (input_data_create_ret) {
- input_data_create_ret->ext.run = mod_run;
- input_data_create_ret->ext.configure = mod_configure;
- }
- return input_data_create_ret;
-}
-
-void input_data_destroy(struct input_data** data) {}
-void input_data_set_all_streams_read(struct input_data* data,
- unsigned int nframes) {}
-
-int cras_audio_thread_event_underrun() {
- return 0;
-}
-
-int cras_audio_thread_event_dev_overrun() {
- cras_audio_thread_event_dev_overrun_called++;
- return 0;
-}
-
-int cras_server_metrics_device_runtime(struct cras_iodev* iodev) {
- return 0;
-}
-
-int cras_server_metrics_device_volume(struct cras_iodev* iodev) {
- return 0;
-}
-
-void ewma_power_init(struct ewma_power* ewma, unsigned int rate){};
-
-void ewma_power_calculate(struct ewma_power* ewma,
- const int16_t* buf,
- unsigned int channels,
- unsigned int size){};
-
-void ewma_power_calculate_area(struct ewma_power* ewma,
- const int16_t* buf,
- struct cras_audio_area* area,
- unsigned int size){};
-
-} // extern "C"
-} // namespace
-
-int main(int argc, char** argv) {
- ::testing::InitGoogleTest(&argc, argv);
- int rc = RUN_ALL_TESTS();
-
- audio_thread_event_log_deinit(atlog, atlog_name);
- free(atlog_name);
- return rc;
-}