diff options
Diffstat (limited to 'cras/src/tests/audio_thread_unittest.cc')
-rw-r--r-- | cras/src/tests/audio_thread_unittest.cc | 1475 |
1 files changed, 0 insertions, 1475 deletions
diff --git a/cras/src/tests/audio_thread_unittest.cc b/cras/src/tests/audio_thread_unittest.cc deleted file mode 100644 index 93045e0b..00000000 --- a/cras/src/tests/audio_thread_unittest.cc +++ /dev/null @@ -1,1475 +0,0 @@ -// Copyright 2014 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. - -extern "C" { -#include "audio_thread.c" - -#include "cras_audio_area.h" -#include "metrics_stub.h" -} - -#include <gtest/gtest.h> - -#include <map> - -#define MAX_CALLS 10 -#define BUFFER_SIZE 8192 -#define FIRST_CB_LEVEL 480 - -static int cras_audio_thread_event_busyloop_called; -static int cras_audio_thread_event_severe_underrun_called; -static unsigned int cras_rstream_dev_offset_called; -static unsigned int cras_rstream_dev_offset_ret[MAX_CALLS]; -static const struct cras_rstream* - cras_rstream_dev_offset_rstream_val[MAX_CALLS]; -static unsigned int cras_rstream_dev_offset_dev_id_val[MAX_CALLS]; -static unsigned int cras_rstream_dev_offset_update_called; -static const struct cras_rstream* - cras_rstream_dev_offset_update_rstream_val[MAX_CALLS]; -static unsigned int cras_rstream_dev_offset_update_frames_val[MAX_CALLS]; -static unsigned int cras_rstream_dev_offset_update_dev_id_val[MAX_CALLS]; -static int cras_rstream_is_pending_reply_ret; -static int cras_iodev_all_streams_written_ret; -static struct cras_audio_area* cras_iodev_get_output_buffer_area; -static int cras_iodev_put_output_buffer_called; -static unsigned int cras_iodev_put_output_buffer_nframes; -static unsigned int cras_iodev_fill_odev_zeros_frames; -static int dev_stream_playback_frames_ret; -static int dev_stream_mix_called; -static unsigned int dev_stream_update_next_wake_time_called; -static unsigned int dev_stream_request_playback_samples_called; -static unsigned int cras_iodev_prepare_output_before_write_samples_called; -static enum CRAS_IODEV_STATE - cras_iodev_prepare_output_before_write_samples_state; -static unsigned int cras_iodev_get_output_buffer_called; -static unsigned int cras_iodev_frames_to_play_in_sleep_called; -static int cras_iodev_prepare_output_before_write_samples_ret; -static int cras_iodev_reset_request_called; -static struct cras_iodev* cras_iodev_reset_request_iodev; -static int cras_iodev_get_valid_frames_ret; -static int cras_iodev_output_underrun_called; -static int cras_iodev_start_stream_called; -static int cras_device_monitor_reset_device_called; -static struct cras_iodev* cras_device_monitor_reset_device_iodev; -static struct cras_iodev* cras_iodev_start_ramp_odev; -static enum CRAS_IODEV_RAMP_REQUEST cras_iodev_start_ramp_request; -static struct timespec clock_gettime_retspec; -static struct timespec init_cb_ts_; -static struct timespec sleep_interval_ts_; -static std::map<const struct dev_stream*, struct timespec> - dev_stream_wake_time_val; -static int cras_device_monitor_set_device_mute_state_called; -static int cras_iodev_is_zero_volume_ret; - -void ResetGlobalStubData() { - cras_rstream_dev_offset_called = 0; - cras_rstream_dev_offset_update_called = 0; - cras_rstream_is_pending_reply_ret = 0; - for (int i = 0; i < MAX_CALLS; i++) { - cras_rstream_dev_offset_ret[i] = 0; - cras_rstream_dev_offset_rstream_val[i] = NULL; - cras_rstream_dev_offset_dev_id_val[i] = 0; - cras_rstream_dev_offset_update_rstream_val[i] = NULL; - cras_rstream_dev_offset_update_frames_val[i] = 0; - cras_rstream_dev_offset_update_dev_id_val[i] = 0; - } - cras_iodev_all_streams_written_ret = 0; - if (cras_iodev_get_output_buffer_area) { - free(cras_iodev_get_output_buffer_area->channels[0].buf); - free(cras_iodev_get_output_buffer_area); - cras_iodev_get_output_buffer_area = NULL; - } - cras_iodev_put_output_buffer_called = 0; - cras_iodev_put_output_buffer_nframes = 0; - cras_iodev_fill_odev_zeros_frames = 0; - cras_iodev_frames_to_play_in_sleep_called = 0; - dev_stream_playback_frames_ret = 0; - dev_stream_mix_called = 0; - dev_stream_request_playback_samples_called = 0; - dev_stream_update_next_wake_time_called = 0; - cras_iodev_prepare_output_before_write_samples_called = 0; - cras_iodev_prepare_output_before_write_samples_state = CRAS_IODEV_STATE_OPEN; - cras_iodev_get_output_buffer_called = 0; - cras_iodev_prepare_output_before_write_samples_ret = 0; - cras_iodev_reset_request_called = 0; - cras_iodev_reset_request_iodev = NULL; - cras_iodev_get_valid_frames_ret = 0; - cras_iodev_output_underrun_called = 0; - cras_iodev_start_stream_called = 0; - cras_device_monitor_reset_device_called = 0; - cras_device_monitor_reset_device_iodev = NULL; - cras_iodev_start_ramp_odev = NULL; - cras_iodev_start_ramp_request = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK; - cras_device_monitor_set_device_mute_state_called = 0; - cras_iodev_is_zero_volume_ret = 0; - clock_gettime_retspec.tv_sec = 0; - clock_gettime_retspec.tv_nsec = 0; - dev_stream_wake_time_val.clear(); -} - -void SetupRstream(struct cras_rstream* rstream, - enum CRAS_STREAM_DIRECTION direction) { - uint32_t frame_bytes = 4; - uint32_t used_size = 4096 * frame_bytes; - - memset(rstream, 0, sizeof(*rstream)); - rstream->direction = direction; - rstream->cb_threshold = 480; - rstream->format.frame_rate = 48000; - - rstream->shm = static_cast<cras_audio_shm*>(calloc(1, sizeof(*rstream->shm))); - rstream->shm->header = static_cast<cras_audio_shm_header*>( - calloc(1, sizeof(*rstream->shm->header))); - - rstream->shm->samples = static_cast<uint8_t*>( - calloc(1, cras_shm_calculate_samples_size(used_size))); - - cras_shm_set_frame_bytes(rstream->shm, frame_bytes); - cras_shm_set_used_size(rstream->shm, used_size); -} - -void TearDownRstream(struct cras_rstream* rstream) { - free(rstream->shm->samples); - free(rstream->shm->header); - free(rstream->shm); -} - -// Test streams and devices manipulation. -class StreamDeviceSuite : public testing::Test { - protected: - virtual void SetUp() { - thread_ = audio_thread_create(); - ResetStubData(); - } - - virtual void TearDown() { - audio_thread_destroy(thread_); - ResetGlobalStubData(); - } - - virtual void SetupDevice(cras_iodev* iodev, - enum CRAS_STREAM_DIRECTION direction) { - memset(iodev, 0, sizeof(*iodev)); - iodev->info.idx = ++device_id_; - iodev->direction = direction; - iodev->configure_dev = configure_dev; - iodev->close_dev = close_dev; - iodev->frames_queued = frames_queued; - iodev->delay_frames = delay_frames; - iodev->get_buffer = get_buffer; - iodev->put_buffer = put_buffer; - iodev->flush_buffer = flush_buffer; - iodev->format = &format_; - iodev->buffer_size = BUFFER_SIZE; - iodev->min_cb_level = FIRST_CB_LEVEL; - iodev->state = CRAS_IODEV_STATE_NORMAL_RUN; - format_.frame_rate = 48000; - } - - void ResetStubData() { - device_id_ = 0; - open_dev_called_ = 0; - close_dev_called_ = 0; - frames_queued_ = 0; - delay_frames_ = 0; - audio_buffer_size_ = 0; - cras_iodev_start_ramp_odev = NULL; - cras_iodev_is_zero_volume_ret = 0; - } - - void SetupPinnedStream(struct cras_rstream* rstream, - enum CRAS_STREAM_DIRECTION direction, - cras_iodev* pin_to_dev) { - SetupRstream(rstream, direction); - rstream->is_pinned = 1; - rstream->pinned_dev_idx = pin_to_dev->info.idx; - } - - static int configure_dev(cras_iodev* iodev) { - open_dev_called_++; - return 0; - } - - static int close_dev(cras_iodev* iodev) { - close_dev_called_++; - return 0; - } - - static int frames_queued(const cras_iodev* iodev, struct timespec* tstamp) { - clock_gettime(CLOCK_MONOTONIC_RAW, tstamp); - return frames_queued_; - } - - static int delay_frames(const cras_iodev* iodev) { return delay_frames_; } - - static int get_buffer(cras_iodev* iodev, - struct cras_audio_area** area, - unsigned int* num) { - size_t sz = sizeof(*area_) + sizeof(struct cras_channel_area) * 2; - - if (audio_buffer_size_ < *num) - *num = audio_buffer_size_; - - area_ = (cras_audio_area*)calloc(1, sz); - area_->frames = *num; - area_->num_channels = 2; - area_->channels[0].buf = audio_buffer_; - channel_area_set_channel(&area_->channels[0], CRAS_CH_FL); - area_->channels[0].step_bytes = 4; - area_->channels[1].buf = audio_buffer_ + 2; - channel_area_set_channel(&area_->channels[1], CRAS_CH_FR); - area_->channels[1].step_bytes = 4; - - *area = area_; - return 0; - } - - static int put_buffer(cras_iodev* iodev, unsigned int num) { - free(area_); - return 0; - } - - static int flush_buffer(cras_iodev* iodev) { return 0; } - - int device_id_; - struct audio_thread* thread_; - - static int open_dev_called_; - static int close_dev_called_; - static int frames_queued_; - static int delay_frames_; - static struct cras_audio_format format_; - static struct cras_audio_area* area_; - static uint8_t audio_buffer_[BUFFER_SIZE]; - static unsigned int audio_buffer_size_; -}; - -int StreamDeviceSuite::open_dev_called_; -int StreamDeviceSuite::close_dev_called_; -int StreamDeviceSuite::frames_queued_; -int StreamDeviceSuite::delay_frames_; -struct cras_audio_format StreamDeviceSuite::format_; -struct cras_audio_area* StreamDeviceSuite::area_; -uint8_t StreamDeviceSuite::audio_buffer_[8192]; -unsigned int StreamDeviceSuite::audio_buffer_size_; - -TEST_F(StreamDeviceSuite, AddRemoveOpenOutputDevice) { - struct cras_iodev iodev; - struct open_dev* adev; - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - - // Check the newly added device is open. - thread_add_open_dev(thread_, &iodev); - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - EXPECT_EQ(adev->dev, &iodev); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - EXPECT_EQ(NULL, adev); -} - -TEST_F(StreamDeviceSuite, StartRamp) { - struct cras_iodev iodev; - struct open_dev* adev; - int rc; - enum CRAS_IODEV_RAMP_REQUEST req; - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - - // Check the newly added device is open. - thread_add_open_dev(thread_, &iodev); - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - EXPECT_EQ(adev->dev, &iodev); - - // Ramp up for unmute. - iodev.ramp = reinterpret_cast<cras_ramp*>(0x123); - req = CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE; - rc = thread_dev_start_ramp(thread_, iodev.info.idx, req); - - EXPECT_EQ(0, rc); - EXPECT_EQ(&iodev, cras_iodev_start_ramp_odev); - EXPECT_EQ(req, cras_iodev_start_ramp_request); - - // Ramp down for mute. - ResetStubData(); - req = CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE; - - rc = thread_dev_start_ramp(thread_, iodev.info.idx, req); - - EXPECT_EQ(0, rc); - EXPECT_EQ(&iodev, cras_iodev_start_ramp_odev); - EXPECT_EQ(req, cras_iodev_start_ramp_request); - - // If device's volume percentage is zero, than ramp won't start. - ResetStubData(); - cras_iodev_is_zero_volume_ret = 1; - rc = thread_dev_start_ramp(thread_, iodev.info.idx, req); - - EXPECT_EQ(0, rc); - EXPECT_EQ(NULL, cras_iodev_start_ramp_odev); - EXPECT_EQ(1, cras_device_monitor_set_device_mute_state_called); - - // Assume iodev changed to no_stream run state, it should not use ramp. - ResetStubData(); - iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN; - rc = thread_dev_start_ramp(thread_, iodev.info.idx, req); - - EXPECT_EQ(0, rc); - EXPECT_EQ(NULL, cras_iodev_start_ramp_odev); - EXPECT_EQ(2, cras_device_monitor_set_device_mute_state_called); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); -} - -TEST_F(StreamDeviceSuite, AddRemoveOpenInputDevice) { - struct cras_iodev iodev; - struct open_dev* adev; - - SetupDevice(&iodev, CRAS_STREAM_INPUT); - - // Check the newly added device is open. - thread_add_open_dev(thread_, &iodev); - adev = thread_->open_devs[CRAS_STREAM_INPUT]; - EXPECT_EQ(adev->dev, &iodev); - - thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, iodev.info.idx); - adev = thread_->open_devs[CRAS_STREAM_INPUT]; - EXPECT_EQ(NULL, adev); -} - -TEST_F(StreamDeviceSuite, AddRemoveMultipleOpenDevices) { - struct cras_iodev odev; - struct cras_iodev odev2; - struct cras_iodev odev3; - struct cras_iodev idev; - struct cras_iodev idev2; - struct cras_iodev idev3; - struct open_dev* adev; - - SetupDevice(&odev, CRAS_STREAM_OUTPUT); - SetupDevice(&odev2, CRAS_STREAM_OUTPUT); - SetupDevice(&odev3, CRAS_STREAM_OUTPUT); - SetupDevice(&idev, CRAS_STREAM_INPUT); - SetupDevice(&idev2, CRAS_STREAM_INPUT); - SetupDevice(&idev3, CRAS_STREAM_INPUT); - - // Add 2 open devices and check both are open. - thread_add_open_dev(thread_, &odev); - thread_add_open_dev(thread_, &odev2); - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - EXPECT_EQ(adev->dev, &odev); - EXPECT_EQ(adev->next->dev, &odev2); - - // Remove first open device and check the second one is still open. - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, odev.info.idx); - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - EXPECT_EQ(adev->dev, &odev2); - - // Add another open device and check both are open. - thread_add_open_dev(thread_, &odev3); - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - EXPECT_EQ(adev->dev, &odev2); - EXPECT_EQ(adev->next->dev, &odev3); - - // Add 2 open devices and check both are open. - thread_add_open_dev(thread_, &idev); - thread_add_open_dev(thread_, &idev2); - adev = thread_->open_devs[CRAS_STREAM_INPUT]; - EXPECT_EQ(adev->dev, &idev); - EXPECT_EQ(adev->next->dev, &idev2); - - // Remove first open device and check the second one is still open. - thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, idev.info.idx); - adev = thread_->open_devs[CRAS_STREAM_INPUT]; - EXPECT_EQ(adev->dev, &idev2); - - // Add and remove another open device and check still open. - thread_add_open_dev(thread_, &idev3); - thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, idev3.info.idx); - adev = thread_->open_devs[CRAS_STREAM_INPUT]; - EXPECT_EQ(adev->dev, &idev2); - thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, idev2.info.idx); - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, odev2.info.idx); - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, odev3.info.idx); -} - -TEST_F(StreamDeviceSuite, MultipleInputStreamsCopyFirstStreamOffset) { - struct cras_iodev iodev; - struct cras_iodev iodev2; - struct cras_iodev* iodevs[] = {&iodev, &iodev2}; - struct cras_rstream rstream; - struct cras_rstream rstream2; - struct cras_rstream rstream3; - - SetupDevice(&iodev, CRAS_STREAM_INPUT); - SetupDevice(&iodev2, CRAS_STREAM_INPUT); - SetupRstream(&rstream, CRAS_STREAM_INPUT); - SetupRstream(&rstream2, CRAS_STREAM_INPUT); - SetupRstream(&rstream3, CRAS_STREAM_INPUT); - - thread_add_open_dev(thread_, &iodev); - thread_add_open_dev(thread_, &iodev2); - - thread_add_stream(thread_, &rstream, iodevs, 2); - EXPECT_NE((void*)NULL, iodev.streams); - EXPECT_NE((void*)NULL, iodev2.streams); - - EXPECT_EQ(0, cras_rstream_dev_offset_called); - EXPECT_EQ(0, cras_rstream_dev_offset_update_called); - - // Fake offset for rstream - cras_rstream_dev_offset_ret[0] = 30; - cras_rstream_dev_offset_ret[1] = 0; - - thread_add_stream(thread_, &rstream2, iodevs, 2); - EXPECT_EQ(2, cras_rstream_dev_offset_called); - EXPECT_EQ(&rstream, cras_rstream_dev_offset_rstream_val[0]); - EXPECT_EQ(iodev.info.idx, cras_rstream_dev_offset_dev_id_val[0]); - EXPECT_EQ(&rstream, cras_rstream_dev_offset_rstream_val[1]); - EXPECT_EQ(iodev2.info.idx, cras_rstream_dev_offset_dev_id_val[1]); - - EXPECT_EQ(2, cras_rstream_dev_offset_update_called); - EXPECT_EQ(&rstream2, cras_rstream_dev_offset_update_rstream_val[0]); - EXPECT_EQ(30, cras_rstream_dev_offset_update_frames_val[0]); - EXPECT_EQ(&rstream2, cras_rstream_dev_offset_update_rstream_val[1]); - EXPECT_EQ(0, cras_rstream_dev_offset_update_frames_val[1]); - - thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, iodev.info.idx); - thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, iodev2.info.idx); - TearDownRstream(&rstream); - TearDownRstream(&rstream2); - TearDownRstream(&rstream3); -} - -TEST_F(StreamDeviceSuite, InputStreamsSetInputDeviceWakeTime) { - struct cras_iodev iodev; - struct cras_iodev* iodevs[] = {&iodev}; - struct cras_rstream rstream1, rstream2; - struct timespec ts_wake_1 = {.tv_sec = 1, .tv_nsec = 500}; - struct timespec ts_wake_2 = {.tv_sec = 1, .tv_nsec = 1000}; - struct open_dev* adev; - - SetupDevice(&iodev, CRAS_STREAM_INPUT); - SetupRstream(&rstream1, CRAS_STREAM_INPUT); - SetupRstream(&rstream2, CRAS_STREAM_INPUT); - - thread_add_open_dev(thread_, &iodev); - thread_add_stream(thread_, &rstream1, iodevs, 1); - thread_add_stream(thread_, &rstream2, iodevs, 1); - EXPECT_NE((void*)NULL, iodev.streams); - - // Assume device is running. - iodev.state = CRAS_IODEV_STATE_NORMAL_RUN; - - // Set stub data for dev_stream_wake_time. - dev_stream_wake_time_val[iodev.streams] = ts_wake_1; - dev_stream_wake_time_val[iodev.streams->next] = ts_wake_2; - - // Send captured samples to client. - // This will also update wake time for this device based on - // dev_stream_wake_time of each stream of this device. - dev_io_send_captured_samples(thread_->open_devs[CRAS_STREAM_INPUT]); - - // wake_ts is maintained in open_dev. - adev = thread_->open_devs[CRAS_STREAM_INPUT]; - - // The wake up time for this device is the minimum of - // ts_wake_1 and ts_wake_2. - EXPECT_EQ(ts_wake_1.tv_sec, adev->wake_ts.tv_sec); - EXPECT_EQ(ts_wake_1.tv_nsec, adev->wake_ts.tv_nsec); - - thread_rm_open_dev(thread_, CRAS_STREAM_INPUT, iodev.info.idx); - TearDownRstream(&rstream1); - TearDownRstream(&rstream2); -} - -TEST_F(StreamDeviceSuite, AddOutputStream) { - struct cras_iodev iodev, *piodev = &iodev; - struct cras_rstream rstream; - struct cras_audio_shm_header* shm_header; - struct dev_stream* dev_stream; - struct open_dev* adev; - - ResetGlobalStubData(); - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - SetupRstream(&rstream, CRAS_STREAM_OUTPUT); - shm_header = rstream.shm->header; - - thread_add_open_dev(thread_, &iodev); - thread_add_stream(thread_, &rstream, &piodev, 1); - dev_stream = iodev.streams; - EXPECT_EQ(dev_stream->stream, &rstream); - /* - * When a output stream is added, the start_stream function will be called - * just before its first fetch. - */ - EXPECT_EQ(cras_iodev_start_stream_called, 0); - - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - - shm_header->write_buf_idx = 0; - shm_header->write_offset[0] = 0; - - /* Assume device is started. */ - iodev.state = CRAS_IODEV_STATE_NORMAL_RUN; - - /* Fetch stream. */ - cras_rstream_is_pending_reply_ret = 0; - dev_io_playback_fetch(adev); - EXPECT_EQ(dev_stream_request_playback_samples_called, 1); - EXPECT_EQ(cras_iodev_start_stream_called, 1); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); - TearDownRstream(&rstream); -} - -TEST_F(StreamDeviceSuite, OutputStreamFetchTime) { - struct cras_iodev iodev, *piodev = &iodev; - struct cras_rstream rstream1, rstream2; - struct dev_stream* dev_stream; - struct timespec expect_ts; - - ResetGlobalStubData(); - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - SetupRstream(&rstream1, CRAS_STREAM_OUTPUT); - SetupRstream(&rstream2, CRAS_STREAM_OUTPUT); - - thread_add_open_dev(thread_, &iodev); - - /* Add a new stream. init_cb_ts should be the time right now. */ - clock_gettime_retspec.tv_sec = 1; - clock_gettime_retspec.tv_nsec = 500; - cras_iodev_get_valid_frames_ret = 0; - expect_ts = clock_gettime_retspec; - thread_add_stream(thread_, &rstream1, &piodev, 1); - dev_stream = iodev.streams; - EXPECT_EQ(dev_stream->stream, &rstream1); - EXPECT_EQ(init_cb_ts_.tv_sec, expect_ts.tv_sec); - EXPECT_EQ(init_cb_ts_.tv_nsec, expect_ts.tv_nsec); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); - - thread_add_open_dev(thread_, &iodev); - - /* - * Add a new stream when there are remaining frames in device buffer. - * init_cb_ts should be the time that hw_level drops to min_cb_level. - * In this case, we should wait 480 / 48000 = 0.01s. - */ - clock_gettime_retspec.tv_sec = 1; - clock_gettime_retspec.tv_nsec = 500; - expect_ts = clock_gettime_retspec; - cras_iodev_get_valid_frames_ret = 960; - rstream1.cb_threshold = 480; - expect_ts.tv_nsec += 10 * 1000000; - thread_add_stream(thread_, &rstream1, &piodev, 1); - dev_stream = iodev.streams; - EXPECT_EQ(dev_stream->stream, &rstream1); - EXPECT_EQ(init_cb_ts_.tv_sec, expect_ts.tv_sec); - EXPECT_EQ(init_cb_ts_.tv_nsec, expect_ts.tv_nsec); - - /* - * Add a new stream when there are other streams exist. init_cb_ts should - * be the earliest next callback time from other streams. - */ - rstream1.next_cb_ts = expect_ts; - thread_add_stream(thread_, &rstream2, &piodev, 1); - dev_stream = iodev.streams->prev; - EXPECT_EQ(dev_stream->stream, &rstream2); - EXPECT_EQ(init_cb_ts_.tv_sec, expect_ts.tv_sec); - EXPECT_EQ(init_cb_ts_.tv_nsec, expect_ts.tv_nsec); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); - TearDownRstream(&rstream1); - TearDownRstream(&rstream2); -} - -TEST_F(StreamDeviceSuite, AddRemoveMultipleStreamsOnMultipleDevices) { - struct cras_iodev iodev, *piodev = &iodev; - struct cras_iodev iodev2, *piodev2 = &iodev2; - struct cras_rstream rstream; - struct cras_rstream rstream2; - struct cras_rstream rstream3; - struct dev_stream* dev_stream; - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - SetupDevice(&iodev2, CRAS_STREAM_OUTPUT); - SetupRstream(&rstream, CRAS_STREAM_OUTPUT); - SetupRstream(&rstream2, CRAS_STREAM_OUTPUT); - SetupRstream(&rstream3, CRAS_STREAM_OUTPUT); - - // Add first device as open and check 2 streams can be added. - thread_add_open_dev(thread_, &iodev); - thread_add_stream(thread_, &rstream, &piodev, 1); - dev_stream = iodev.streams; - EXPECT_EQ(dev_stream->stream, &rstream); - thread_add_stream(thread_, &rstream2, &piodev, 1); - EXPECT_EQ(dev_stream->next->stream, &rstream2); - - // Add second device as open and check no streams are copied over. - thread_add_open_dev(thread_, &iodev2); - dev_stream = iodev2.streams; - EXPECT_EQ(NULL, dev_stream); - // Also check the 2 streams on first device remain intact. - dev_stream = iodev.streams; - EXPECT_EQ(dev_stream->stream, &rstream); - EXPECT_EQ(dev_stream->next->stream, &rstream2); - - // Add a stream to the second dev and check it isn't also added to the first. - thread_add_stream(thread_, &rstream3, &piodev2, 1); - dev_stream = iodev.streams; - EXPECT_EQ(dev_stream->stream, &rstream); - EXPECT_EQ(dev_stream->next->stream, &rstream2); - EXPECT_EQ(NULL, dev_stream->next->next); - dev_stream = iodev2.streams; - EXPECT_EQ(&rstream3, dev_stream->stream); - EXPECT_EQ(NULL, dev_stream->next); - - // Remove first device from open and streams on second device remain - // intact. - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); - dev_stream = iodev2.streams; - EXPECT_EQ(&rstream3, dev_stream->stream); - EXPECT_EQ(NULL, dev_stream->next); - - // Remove 2 streams, check the streams are removed from both open devices. - dev_io_remove_stream(&thread_->open_devs[rstream.direction], &rstream, - &iodev); - dev_io_remove_stream(&thread_->open_devs[rstream3.direction], &rstream3, - &iodev2); - dev_stream = iodev2.streams; - EXPECT_EQ(NULL, dev_stream); - - // Remove open devices and check stream is on fallback device. - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev2.info.idx); - - // Add open device, again check it is empty of streams. - thread_add_open_dev(thread_, &iodev); - dev_stream = iodev.streams; - EXPECT_EQ(NULL, dev_stream); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); - TearDownRstream(&rstream); - TearDownRstream(&rstream2); - TearDownRstream(&rstream3); -} - -TEST_F(StreamDeviceSuite, FetchStreams) { - struct cras_iodev iodev, *piodev = &iodev; - struct open_dev* adev; - struct cras_rstream rstream; - struct cras_audio_shm_header* shm_header; - - SetupRstream(&rstream, CRAS_STREAM_OUTPUT); - shm_header = rstream.shm->header; - ResetGlobalStubData(); - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - - shm_header->write_buf_idx = 0; - - /* Add the device and add the stream. */ - thread_add_open_dev(thread_, &iodev); - thread_add_stream(thread_, &rstream, &piodev, 1); - - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - - /* Assume device is started. */ - iodev.state = CRAS_IODEV_STATE_NORMAL_RUN; - - /* - * If the stream is pending a reply and shm buffer for writing is empty, - * just skip it. - */ - cras_rstream_is_pending_reply_ret = 1; - shm_header->write_offset[0] = 0; - dev_io_playback_fetch(adev); - - EXPECT_EQ(dev_stream_request_playback_samples_called, 0); - EXPECT_EQ(dev_stream_update_next_wake_time_called, 0); - - /* - * If the stream is not pending a reply and shm buffer for writing is full, - * update next wake up time and skip fetching. - */ - cras_rstream_is_pending_reply_ret = 0; - shm_header->write_offset[0] = cras_shm_used_size(rstream.shm); - dev_io_playback_fetch(adev); - EXPECT_EQ(dev_stream_request_playback_samples_called, 0); - EXPECT_EQ(dev_stream_update_next_wake_time_called, 1); - - /* If the stream can be fetched, fetch it. */ - cras_rstream_is_pending_reply_ret = 0; - shm_header->write_offset[0] = 0; - dev_io_playback_fetch(adev); - EXPECT_EQ(dev_stream_request_playback_samples_called, 1); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); - TearDownRstream(&rstream); -} - -TEST_F(StreamDeviceSuite, WriteOutputSamplesPrepareOutputFailed) { - struct cras_iodev iodev; - struct open_dev* adev; - - ResetGlobalStubData(); - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - - // Add the device. - thread_add_open_dev(thread_, &iodev); - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - - // Assume device is started. - iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN; - // Assume device remains in no stream state; - cras_iodev_prepare_output_before_write_samples_state = - CRAS_IODEV_STATE_NO_STREAM_RUN; - - // Assume there is an error in prepare_output. - cras_iodev_prepare_output_before_write_samples_ret = -EINVAL; - - // cras_iodev should handle no stream playback. - EXPECT_EQ(-EINVAL, - write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, - nullptr)); - - // cras_iodev_get_output_buffer in audio_thread write_output_samples is not - // called. - EXPECT_EQ(0, cras_iodev_get_output_buffer_called); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); -} - -TEST_F(StreamDeviceSuite, WriteOutputSamplesNoStream) { - struct cras_iodev iodev; - struct open_dev* adev; - - ResetGlobalStubData(); - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - - // Add the device. - thread_add_open_dev(thread_, &iodev); - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - - // Assume device is started. - iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN; - // Assume device remains in no stream state; - cras_iodev_prepare_output_before_write_samples_state = - CRAS_IODEV_STATE_NO_STREAM_RUN; - - // cras_iodev should handle no stream playback. - write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr); - EXPECT_EQ(1, cras_iodev_prepare_output_before_write_samples_called); - // cras_iodev_get_output_buffer in audio_thread write_output_samples is not - // called. - EXPECT_EQ(0, cras_iodev_get_output_buffer_called); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); -} - -TEST_F(StreamDeviceSuite, WriteOutputSamplesLeaveNoStream) { - struct cras_iodev iodev; - struct open_dev* adev; - - ResetGlobalStubData(); - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - - // Setup the output buffer for device. - cras_iodev_get_output_buffer_area = cras_audio_area_create(2); - - // Add the device. - thread_add_open_dev(thread_, &iodev); - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - - // Assume device in no stream state. - iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN; - - // Assume device remains in no stream state; - cras_iodev_prepare_output_before_write_samples_state = - CRAS_IODEV_STATE_NO_STREAM_RUN; - - // cras_iodev should NOT leave no stream state; - write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr); - EXPECT_EQ(1, cras_iodev_prepare_output_before_write_samples_called); - // cras_iodev_get_output_buffer in audio_thread write_output_samples is not - // called. - EXPECT_EQ(0, cras_iodev_get_output_buffer_called); - - // Assume device leaves no stream state; - cras_iodev_prepare_output_before_write_samples_state = - CRAS_IODEV_STATE_NORMAL_RUN; - - // cras_iodev should write samples from streams. - write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr); - EXPECT_EQ(2, cras_iodev_prepare_output_before_write_samples_called); - EXPECT_EQ(1, cras_iodev_get_output_buffer_called); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); -} - -TEST_F(StreamDeviceSuite, MixOutputSamples) { - struct cras_iodev iodev, *piodev = &iodev; - struct cras_rstream rstream1; - struct cras_rstream rstream2; - struct open_dev* adev; - struct dev_stream* dev_stream; - - ResetGlobalStubData(); - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - SetupRstream(&rstream1, CRAS_STREAM_OUTPUT); - SetupRstream(&rstream2, CRAS_STREAM_OUTPUT); - - // Setup the output buffer for device. - cras_iodev_get_output_buffer_area = cras_audio_area_create(2); - - // Add the device and add the stream. - thread_add_open_dev(thread_, &iodev); - thread_add_stream(thread_, &rstream1, &piodev, 1); - adev = thread_->open_devs[CRAS_STREAM_OUTPUT]; - - // Assume device is running. - iodev.state = CRAS_IODEV_STATE_NORMAL_RUN; - - // Assume device in normal run stream state. - cras_iodev_prepare_output_before_write_samples_state = - CRAS_IODEV_STATE_NORMAL_RUN; - - // cras_iodev should not mix samples because the stream has not started - // running. - frames_queued_ = 0; - dev_stream_playback_frames_ret = 100; - dev_stream = iodev.streams; - write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr); - EXPECT_EQ(1, cras_iodev_prepare_output_before_write_samples_called); - EXPECT_EQ(1, cras_iodev_get_output_buffer_called); - EXPECT_EQ(0, dev_stream_mix_called); - - // Set rstream1 to be running. cras_iodev should mix samples from rstream1. - dev_stream_set_running(dev_stream); - write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr); - EXPECT_EQ(2, cras_iodev_prepare_output_before_write_samples_called); - EXPECT_EQ(2, cras_iodev_get_output_buffer_called); - EXPECT_EQ(1, dev_stream_mix_called); - - // Add rstream2. cras_iodev should mix samples from rstream1 but not from - // rstream2. - thread_add_stream(thread_, &rstream2, &piodev, 1); - write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr); - EXPECT_EQ(3, cras_iodev_prepare_output_before_write_samples_called); - EXPECT_EQ(3, cras_iodev_get_output_buffer_called); - EXPECT_EQ(2, dev_stream_mix_called); - - // Set rstream2 to be running. cras_iodev should mix samples from rstream1 - // and rstream2. - dev_stream = iodev.streams->prev; - dev_stream_set_running(dev_stream); - write_output_samples(&thread_->open_devs[CRAS_STREAM_OUTPUT], adev, nullptr); - EXPECT_EQ(4, cras_iodev_prepare_output_before_write_samples_called); - EXPECT_EQ(4, cras_iodev_get_output_buffer_called); - EXPECT_EQ(4, dev_stream_mix_called); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); - TearDownRstream(&rstream1); - TearDownRstream(&rstream2); -} - -TEST_F(StreamDeviceSuite, DoPlaybackNoStream) { - struct cras_iodev iodev; - - ResetGlobalStubData(); - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - - // Add the device. - thread_add_open_dev(thread_, &iodev); - - // Assume device is started. - iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN; - // Assume device remains in no stream state; - cras_iodev_prepare_output_before_write_samples_state = - CRAS_IODEV_STATE_NO_STREAM_RUN; - // Add 10 frames in queue to prevent underrun - frames_queued_ = 10; - - // cras_iodev should handle no stream playback. - dev_io_playback_write(&thread_->open_devs[CRAS_STREAM_OUTPUT], nullptr); - EXPECT_EQ(1, cras_iodev_prepare_output_before_write_samples_called); - // cras_iodev_get_output_buffer in audio_thread write_output_samples is not - // called. - EXPECT_EQ(0, cras_iodev_get_output_buffer_called); - - EXPECT_EQ(0, cras_iodev_output_underrun_called); - // cras_iodev_frames_to_play_in_sleep should be called from - // update_dev_wakeup_time. - EXPECT_EQ(1, cras_iodev_frames_to_play_in_sleep_called); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); -} - -TEST_F(StreamDeviceSuite, DoPlaybackUnderrun) { - struct cras_iodev iodev, *piodev = &iodev; - struct cras_rstream rstream; - - ResetGlobalStubData(); - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - SetupRstream(&rstream, CRAS_STREAM_OUTPUT); - - // Setup the output buffer for device. - cras_iodev_get_output_buffer_area = cras_audio_area_create(2); - - // Add the device and add the stream. - thread_add_open_dev(thread_, &iodev); - thread_add_stream(thread_, &rstream, &piodev, 1); - - // Assume device is running and there is an underrun. - // It wrote 11 frames into device but new hw_level is only 10. - // It means underrun may happened because 10 - 11 < 0. - // Audio thread should ask iodev to handle output underrun. - iodev.state = CRAS_IODEV_STATE_NORMAL_RUN; - frames_queued_ = 10; - cras_iodev_all_streams_written_ret = 11; - - // Assume device in normal run stream state; - cras_iodev_prepare_output_before_write_samples_state = - CRAS_IODEV_STATE_NORMAL_RUN; - - EXPECT_EQ(0, cras_iodev_output_underrun_called); - dev_io_playback_write(&thread_->open_devs[CRAS_STREAM_OUTPUT], nullptr); - EXPECT_EQ(1, cras_iodev_output_underrun_called); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); - TearDownRstream(&rstream); -} - -TEST_F(StreamDeviceSuite, DoPlaybackSevereUnderrun) { - struct cras_iodev iodev, *piodev = &iodev; - struct cras_rstream rstream; - - ResetGlobalStubData(); - - SetupDevice(&iodev, CRAS_STREAM_OUTPUT); - SetupRstream(&rstream, CRAS_STREAM_OUTPUT); - - // Setup the output buffer for device. - cras_iodev_get_output_buffer_area = cras_audio_area_create(2); - - // Add the device and add the stream. - thread_add_open_dev(thread_, &iodev); - thread_add_stream(thread_, &rstream, &piodev, 1); - - // Assume device is running and there is a severe underrun. - cras_audio_thread_event_severe_underrun_called = 0; - iodev.state = CRAS_IODEV_STATE_NORMAL_RUN; - frames_queued_ = -EPIPE; - - // Assume device in normal run stream state; - cras_iodev_prepare_output_before_write_samples_state = - CRAS_IODEV_STATE_NORMAL_RUN; - - dev_io_playback_write(&thread_->open_devs[CRAS_STREAM_OUTPUT], nullptr); - - // Audio thread should ask main thread to reset device. - EXPECT_EQ(1, cras_iodev_reset_request_called); - EXPECT_EQ(&iodev, cras_iodev_reset_request_iodev); - EXPECT_EQ(1, cras_audio_thread_event_severe_underrun_called); - - thread_rm_open_dev(thread_, CRAS_STREAM_OUTPUT, iodev.info.idx); - TearDownRstream(&rstream); -} - -TEST(AudioThreadStreams, DrainStream) { - struct cras_rstream rstream; - struct cras_audio_shm_header* shm_header; - struct audio_thread thread; - - SetupRstream(&rstream, CRAS_STREAM_OUTPUT); - shm_header = rstream.shm->header; - - shm_header->write_offset[0] = 1 * 4; - EXPECT_EQ(1, thread_drain_stream_ms_remaining(&thread, &rstream)); - - shm_header->write_offset[0] = 479 * 4; - EXPECT_EQ(10, thread_drain_stream_ms_remaining(&thread, &rstream)); - - shm_header->write_offset[0] = 0; - EXPECT_EQ(0, thread_drain_stream_ms_remaining(&thread, &rstream)); - - rstream.direction = CRAS_STREAM_INPUT; - shm_header->write_offset[0] = 479 * 4; - EXPECT_EQ(0, thread_drain_stream_ms_remaining(&thread, &rstream)); - TearDownRstream(&rstream); -} - -TEST(BusyloopDetectSuite, CheckerTest) { - continuous_zero_sleep_count = 0; - cras_audio_thread_event_busyloop_called = 0; - timespec wait_ts; - wait_ts.tv_sec = 0; - wait_ts.tv_nsec = 0; - - check_busyloop(&wait_ts); - EXPECT_EQ(continuous_zero_sleep_count, 1); - EXPECT_EQ(cras_audio_thread_event_busyloop_called, 0); - check_busyloop(&wait_ts); - EXPECT_EQ(continuous_zero_sleep_count, 2); - EXPECT_EQ(cras_audio_thread_event_busyloop_called, 1); - check_busyloop(&wait_ts); - EXPECT_EQ(continuous_zero_sleep_count, 3); - EXPECT_EQ(cras_audio_thread_event_busyloop_called, 1); - - wait_ts.tv_sec = 1; - check_busyloop(&wait_ts); - EXPECT_EQ(continuous_zero_sleep_count, 0); - EXPECT_EQ(cras_audio_thread_event_busyloop_called, 1); -} - -extern "C" { - -int cras_iodev_add_stream(struct cras_iodev* iodev, struct dev_stream* stream) { - DL_APPEND(iodev->streams, stream); - return 0; -} - -void cras_iodev_start_stream(struct cras_iodev* iodev, - struct dev_stream* stream) { - dev_stream_set_running(stream); - cras_iodev_start_stream_called++; -} - -unsigned int cras_iodev_all_streams_written(struct cras_iodev* iodev) { - return cras_iodev_all_streams_written_ret; -} - -int cras_iodev_close(struct cras_iodev* iodev) { - return 0; -} - -void cras_iodev_free_format(struct cras_iodev* iodev) { - return; -} - -double cras_iodev_get_est_rate_ratio(const struct cras_iodev* iodev) { - return 1.0; -} - -unsigned int cras_iodev_max_stream_offset(const struct cras_iodev* iodev) { - return 0; -} - -int cras_iodev_open(struct cras_iodev* iodev, - unsigned int cb_level, - const struct cras_audio_format* fmt) { - return 0; -} - -int cras_iodev_put_buffer(struct cras_iodev* iodev, unsigned int nframes) { - return 0; -} - -struct dev_stream* cras_iodev_rm_stream(struct cras_iodev* iodev, - const struct cras_rstream* stream) { - struct dev_stream* out; - DL_FOREACH (iodev->streams, out) { - if (out->stream == stream) { - DL_DELETE(iodev->streams, out); - return out; - } - } - return NULL; -} - -int cras_iodev_set_format(struct cras_iodev* iodev, - const struct cras_audio_format* fmt) { - return 0; -} - -unsigned int cras_iodev_stream_offset(struct cras_iodev* iodev, - struct dev_stream* stream) { - return 0; -} - -int cras_iodev_is_zero_volume(const struct cras_iodev* iodev) { - return cras_iodev_is_zero_volume_ret; -} - -int dev_stream_attached_devs(const struct dev_stream* dev_stream) { - return 1; -} - -void cras_iodev_stream_written(struct cras_iodev* iodev, - struct dev_stream* stream, - unsigned int nwritten) {} - -int cras_iodev_update_rate(struct cras_iodev* iodev, - unsigned int level, - struct timespec* level_tstamp) { - return 0; -} - -int cras_iodev_put_input_buffer(struct cras_iodev* iodev) { - return 0; -} - -int cras_iodev_put_output_buffer(struct cras_iodev* iodev, - uint8_t* frames, - unsigned int nframes, - int* non_empty, - struct cras_fmt_conv* output_converter) { - cras_iodev_put_output_buffer_called++; - cras_iodev_put_output_buffer_nframes = nframes; - return 0; -} - -int cras_iodev_get_input_buffer(struct cras_iodev* iodev, unsigned* frames) { - return 0; -} - -int cras_iodev_get_output_buffer(struct cras_iodev* iodev, - struct cras_audio_area** area, - unsigned* frames) { - cras_iodev_get_output_buffer_called++; - *area = cras_iodev_get_output_buffer_area; - return 0; -} - -int cras_iodev_get_dsp_delay(const struct cras_iodev* iodev) { - return 0; -} - -void cras_fmt_conv_destroy(struct cras_fmt_conv** conv) {} - -struct cras_fmt_conv* cras_channel_remix_conv_create(unsigned int num_channels, - const float* coefficient) { - return NULL; -} - -void cras_rstream_dev_attach(struct cras_rstream* rstream, - unsigned int dev_id, - void* dev_ptr) {} - -void cras_rstream_dev_detach(struct cras_rstream* rstream, - unsigned int dev_id) {} - -void cras_rstream_destroy(struct cras_rstream* stream) {} - -void cras_rstream_dev_offset_update(struct cras_rstream* rstream, - unsigned int frames, - unsigned int dev_id) { - int i = cras_rstream_dev_offset_update_called; - if (i < MAX_CALLS) { - cras_rstream_dev_offset_update_rstream_val[i] = rstream; - cras_rstream_dev_offset_update_frames_val[i] = frames; - cras_rstream_dev_offset_update_dev_id_val[i] = dev_id; - cras_rstream_dev_offset_update_called++; - } -} - -unsigned int cras_rstream_dev_offset(const struct cras_rstream* rstream, - unsigned int dev_id) { - int i = cras_rstream_dev_offset_called; - if (i < MAX_CALLS) { - cras_rstream_dev_offset_rstream_val[i] = rstream; - cras_rstream_dev_offset_dev_id_val[i] = dev_id; - cras_rstream_dev_offset_called++; - return cras_rstream_dev_offset_ret[i]; - } - return 0; -} - -void cras_rstream_record_fetch_interval(struct cras_rstream* rstream, - const struct timespec* now) {} - -int cras_rstream_is_pending_reply(const struct cras_rstream* stream) { - return cras_rstream_is_pending_reply_ret; -} - -float cras_rstream_get_volume_scaler(struct cras_rstream* rstream) { - return 1.0f; -} - -int cras_set_rt_scheduling(int rt_lim) { - return 0; -} - -int cras_set_thread_priority(int priority) { - return 0; -} - -void cras_system_rm_select_fd(int fd) {} - -unsigned int dev_stream_capture(struct dev_stream* dev_stream, - const struct cras_audio_area* area, - unsigned int area_offset, - float software_gain_scaler) { - return 0; -} - -unsigned int dev_stream_capture_avail(const struct dev_stream* dev_stream) { - return 0; -} -unsigned int dev_stream_cb_threshold(const struct dev_stream* dev_stream) { - return 0; -} - -int dev_stream_capture_update_rstream(struct dev_stream* dev_stream) { - return 0; -} - -struct dev_stream* dev_stream_create(struct cras_rstream* stream, - unsigned int dev_id, - const struct cras_audio_format* dev_fmt, - void* dev_ptr, - struct timespec* cb_ts, - const struct timespec* sleep_interval_ts) { - struct dev_stream* out = static_cast<dev_stream*>(calloc(1, sizeof(*out))); - out->stream = stream; - init_cb_ts_ = *cb_ts; - sleep_interval_ts_ = *sleep_interval_ts; - return out; -} - -void dev_stream_destroy(struct dev_stream* dev_stream) { - free(dev_stream); -} - -int dev_stream_mix(struct dev_stream* dev_stream, - const struct cras_audio_format* fmt, - uint8_t* dst, - unsigned int num_to_write) { - dev_stream_mix_called++; - return num_to_write; -} - -int dev_stream_playback_frames(const struct dev_stream* dev_stream) { - return dev_stream_playback_frames_ret; -} - -int dev_stream_playback_update_rstream(struct dev_stream* dev_stream) { - return 0; -} - -int dev_stream_poll_stream_fd(const struct dev_stream* dev_stream) { - return dev_stream->stream->fd; -} - -int dev_stream_request_playback_samples(struct dev_stream* dev_stream, - const struct timespec* now) { - dev_stream_request_playback_samples_called++; - return 0; -} - -void dev_stream_set_delay(const struct dev_stream* dev_stream, - unsigned int delay_frames) {} - -void dev_stream_set_dev_rate(struct dev_stream* dev_stream, - unsigned int dev_rate, - double dev_rate_ratio, - double main_rate_ratio, - int coarse_rate_adjust) {} - -void dev_stream_update_frames(const struct dev_stream* dev_stream) {} - -void dev_stream_update_next_wake_time(struct dev_stream* dev_stream) { - dev_stream_update_next_wake_time_called++; -} - -int dev_stream_wake_time(struct dev_stream* dev_stream, - unsigned int curr_level, - struct timespec* level_tstamp, - unsigned int cap_limit, - int is_cap_limit_stream, - struct timespec* wake_time) { - if (dev_stream_wake_time_val.find(dev_stream) != - dev_stream_wake_time_val.end()) { - wake_time->tv_sec = dev_stream_wake_time_val[dev_stream].tv_sec; - wake_time->tv_nsec = dev_stream_wake_time_val[dev_stream].tv_nsec; - } - return 0; -} - -int dev_stream_is_pending_reply(const struct dev_stream* dev_stream) { - return 0; -} - -int dev_stream_flush_old_audio_messages(struct dev_stream* dev_stream) { - return 0; -} - -int cras_iodev_frames_queued(struct cras_iodev* iodev, - struct timespec* tstamp) { - return iodev->frames_queued(iodev, tstamp); -} - -int cras_iodev_buffer_avail(struct cras_iodev* iodev, unsigned hw_level) { - struct timespec tstamp; - return iodev->buffer_size - iodev->frames_queued(iodev, &tstamp); -} - -int cras_iodev_fill_odev_zeros(struct cras_iodev* odev, unsigned int frames) { - cras_iodev_fill_odev_zeros_frames = frames; - return 0; -} - -int cras_iodev_output_underrun(struct cras_iodev* odev, - unsigned int hw_level, - unsigned int frames_written) { - cras_iodev_output_underrun_called++; - return 0; -} - -int cras_iodev_prepare_output_before_write_samples(struct cras_iodev* odev) { - cras_iodev_prepare_output_before_write_samples_called++; - odev->state = cras_iodev_prepare_output_before_write_samples_state; - return cras_iodev_prepare_output_before_write_samples_ret; -} - -float cras_iodev_get_software_gain_scaler(const struct cras_iodev* iodev) { - return 1.0f; -} - -unsigned int cras_iodev_frames_to_play_in_sleep(struct cras_iodev* odev, - unsigned int* hw_level, - struct timespec* hw_tstamp) { - *hw_level = cras_iodev_frames_queued(odev, hw_tstamp); - cras_iodev_frames_to_play_in_sleep_called++; - return 0; -} - -int cras_iodev_odev_should_wake(const struct cras_iodev* odev) { - return 1; -} - -struct cras_audio_area* cras_audio_area_create(int num_channels) { - struct cras_audio_area* area; - size_t sz; - - sz = sizeof(*area) + num_channels * sizeof(struct cras_channel_area); - area = (cras_audio_area*)calloc(1, sz); - area->num_channels = num_channels; - area->channels[0].buf = (uint8_t*)calloc(1, BUFFER_SIZE * 2 * num_channels); - - return area; -} - -enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev* iodev) { - return iodev->state; -} - -unsigned int cras_iodev_get_num_underruns(const struct cras_iodev* iodev) { - return 0; -} - -int cras_iodev_get_valid_frames(struct cras_iodev* iodev, - struct timespec* hw_tstamp) { - clock_gettime(CLOCK_MONOTONIC_RAW, hw_tstamp); - return cras_iodev_get_valid_frames_ret; -} - -int cras_iodev_reset_request(struct cras_iodev* iodev) { - cras_iodev_reset_request_called++; - cras_iodev_reset_request_iodev = iodev; - return 0; -} - -unsigned int cras_iodev_get_num_severe_underruns( - const struct cras_iodev* iodev) { - return 0; -} - -void cras_iodev_update_highest_hw_level(struct cras_iodev* iodev, - unsigned int hw_level) {} - -int cras_iodev_start_ramp(struct cras_iodev* odev, - enum CRAS_IODEV_RAMP_REQUEST request) { - cras_iodev_start_ramp_odev = odev; - cras_iodev_start_ramp_request = request; - return 0; -} - -int input_data_get_for_stream(struct input_data* data, - struct cras_rstream* stream, - struct buffer_share* offsets, - struct cras_audio_area** area, - unsigned int* offset) { - return 0; -} - -int input_data_put_for_stream(struct input_data* data, - struct cras_rstream* stream, - struct buffer_share* offsets, - unsigned int frames) { - return 0; -} - -int cras_device_monitor_set_device_mute_state(unsigned int dev_idx) { - cras_device_monitor_set_device_mute_state_called++; - return 0; -} -int cras_device_monitor_error_close(unsigned int dev_idx) { - return 0; -} - -int cras_iodev_drop_frames_by_time(struct cras_iodev* iodev, - struct timespec ts) { - return 0; -} - -bool cras_iodev_is_on_internal_card(const struct cras_ionode* node) { - return 0; -} - -// From librt. -int clock_gettime(clockid_t clk_id, struct timespec* tp) { - *tp = clock_gettime_retspec; - return 0; -} - -#ifdef HAVE_WEBRTC_APM - -uint64_t cras_apm_list_get_effects(struct cras_apm_list* list) { - return 0; -} - -void cras_apm_list_set_debug_recording(struct cras_apm* apm, - unsigned int stream_id, - int start, - const char* file_name_base) {} -void cras_apm_list_set_aec_dump(struct cras_apm_list* list, - void* dev_ptr, - int start, - int fd) {} - -#endif - -int cras_audio_thread_event_busyloop() { - cras_audio_thread_event_busyloop_called++; - return 0; -} - -int cras_audio_thread_event_drop_samples() { - return 0; -} - -int cras_audio_thread_event_severe_underrun() { - cras_audio_thread_event_severe_underrun_called++; - return 0; -} - -float input_data_get_software_gain_scaler(struct input_data* data, - float idev_sw_gain_scaler, - struct cras_rstream* stream) { - return 1.0; -} -} // extern "C" - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} |