• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2  // Use of this source code is governed by a BSD-style license that can be
3  // found in the LICENSE file.
4  
5  #include <gtest/gtest.h>
6  #include <stdio.h>
7  
8  extern "C" {
9  #include "audio_thread_log.h"
10  #include "cras_audio_area.h"
11  #include "cras_iodev.h"
12  #include "cras_main_thread_log.h"
13  #include "cras_ramp.h"
14  #include "cras_rstream.h"
15  #include "dev_stream.h"
16  #include "input_data.h"
17  #include "utlist.h"
18  
19  // Mock software volume scalers.
20  float softvol_scalers[101];
21  
22  // For audio_thread_log.h use.
23  int atlog_rw_shm_fd;
24  int atlog_ro_shm_fd;
25  }
26  
27  #define BUFFER_SIZE 8192
28  
29  static const float RAMP_UNMUTE_DURATION_SECS = 0.5;
30  static const float RAMP_NEW_STREAM_DURATION_SECS = 0.01;
31  static const float RAMP_MUTE_DURATION_SECS = 0.1;
32  static const float RAMP_VOLUME_CHANGE_DURATION_SECS = 0.1;
33  
34  static int cras_iodev_list_disable_dev_called;
35  static int select_node_called;
36  static enum CRAS_STREAM_DIRECTION select_node_direction;
37  static cras_node_id_t select_node_id;
38  static struct cras_ionode* node_selected;
39  static size_t notify_nodes_changed_called;
40  static size_t notify_active_node_changed_called;
41  static int dsp_context_new_sample_rate;
42  static const char* dsp_context_new_purpose;
43  static int dsp_context_free_called;
44  static int update_channel_layout_called;
45  static int update_channel_layout_return_val;
46  static int cras_audio_format_set_channel_layout_called;
47  static unsigned int cras_system_get_volume_return;
48  static int cras_dsp_get_pipeline_called;
49  static int cras_dsp_get_pipeline_ret;
50  static int cras_dsp_put_pipeline_called;
51  static int cras_dsp_pipeline_get_source_buffer_called;
52  static int cras_dsp_pipeline_get_sink_buffer_called;
53  static float cras_dsp_pipeline_source_buffer[2][DSP_BUFFER_SIZE];
54  static float cras_dsp_pipeline_sink_buffer[2][DSP_BUFFER_SIZE];
55  static int cras_dsp_pipeline_get_delay_called;
56  static int cras_dsp_pipeline_apply_called;
57  static int cras_dsp_pipeline_set_sink_ext_module_called;
58  static int cras_dsp_pipeline_apply_sample_count;
59  static unsigned int cras_mix_mute_count;
60  static unsigned int cras_dsp_num_input_channels_return;
61  static unsigned int cras_dsp_num_output_channels_return;
62  struct cras_dsp_context* cras_dsp_context_new_return;
63  static unsigned int cras_dsp_load_mock_pipeline_called;
64  static unsigned int rate_estimator_add_frames_num_frames;
65  static unsigned int rate_estimator_add_frames_called;
66  static int cras_system_get_mute_return;
67  static snd_pcm_format_t cras_scale_buffer_fmt;
68  static float cras_scale_buffer_scaler;
69  static int cras_scale_buffer_called;
70  static unsigned int pre_dsp_hook_called;
71  static const uint8_t* pre_dsp_hook_frames;
72  static void* pre_dsp_hook_cb_data;
73  static unsigned int post_dsp_hook_called;
74  static const uint8_t* post_dsp_hook_frames;
75  static void* post_dsp_hook_cb_data;
76  static int iodev_buffer_size;
77  static uint8_t audio_buffer[BUFFER_SIZE];
78  static struct cras_audio_area* audio_area;
79  static unsigned int put_buffer_nframes;
80  static int is_free_running_ret;
81  static int no_stream_called;
82  static int no_stream_enable;
83  // This will be used extensively in cras_iodev.
84  struct audio_thread_event_log* atlog;
85  static unsigned int simple_no_stream_called;
86  static int simple_no_stream_enable;
87  static int dev_stream_playback_frames_ret;
88  static int device_monitor_reset_device_called;
89  static int output_underrun_called;
90  static int set_mute_called;
91  static int cras_ramp_start_mute_ramp;
92  static float cras_ramp_start_from;
93  static float cras_ramp_start_to;
94  static int cras_ramp_start_duration_frames;
95  static int cras_ramp_start_is_called;
96  static int cras_ramp_reset_is_called;
97  static struct cras_ramp_action cras_ramp_get_current_action_ret;
98  static int cras_ramp_update_ramped_frames_num_frames;
99  static cras_ramp_cb cras_ramp_start_cb;
100  static void* cras_ramp_start_cb_data;
101  static int cras_device_monitor_set_device_mute_state_called;
102  unsigned int cras_device_monitor_set_device_mute_state_dev_idx;
103  static snd_pcm_format_t cras_scale_buffer_increment_fmt;
104  static uint8_t* cras_scale_buffer_increment_buff;
105  static unsigned int cras_scale_buffer_increment_frame;
106  static float cras_scale_buffer_increment_scaler;
107  static float cras_scale_buffer_increment_increment;
108  static float cras_scale_buffer_increment_target;
109  static int cras_scale_buffer_increment_channel;
110  static struct cras_audio_format audio_fmt;
111  static int buffer_share_add_id_called;
112  static int buffer_share_get_new_write_point_ret;
113  static int ext_mod_configure_called;
114  static struct input_data* input_data_create_ret;
115  static double rate_estimator_get_rate_ret;
116  static int cras_audio_thread_event_dev_overrun_called;
117  
118  static char* atlog_name;
119  
120  // Iodev callback
update_channel_layout(struct cras_iodev * iodev)121  int update_channel_layout(struct cras_iodev* iodev) {
122    update_channel_layout_called = 1;
123    return update_channel_layout_return_val;
124  }
125  
ResetStubData()126  void ResetStubData() {
127    cras_iodev_list_disable_dev_called = 0;
128    select_node_called = 0;
129    notify_nodes_changed_called = 0;
130    notify_active_node_changed_called = 0;
131    dsp_context_new_sample_rate = 0;
132    dsp_context_new_purpose = NULL;
133    dsp_context_free_called = 0;
134    cras_audio_format_set_channel_layout_called = 0;
135    cras_dsp_get_pipeline_called = 0;
136    cras_dsp_get_pipeline_ret = 0;
137    cras_dsp_put_pipeline_called = 0;
138    cras_dsp_pipeline_get_source_buffer_called = 0;
139    cras_dsp_pipeline_get_sink_buffer_called = 0;
140    memset(&cras_dsp_pipeline_source_buffer, 0,
141           sizeof(cras_dsp_pipeline_source_buffer));
142    memset(&cras_dsp_pipeline_sink_buffer, 0,
143           sizeof(cras_dsp_pipeline_sink_buffer));
144    cras_dsp_pipeline_get_delay_called = 0;
145    cras_dsp_pipeline_apply_called = 0;
146    cras_dsp_pipeline_set_sink_ext_module_called = 0;
147    cras_dsp_pipeline_apply_sample_count = 0;
148    cras_dsp_num_input_channels_return = 2;
149    cras_dsp_num_output_channels_return = 2;
150    cras_dsp_context_new_return = NULL;
151    cras_dsp_load_mock_pipeline_called = 0;
152    rate_estimator_add_frames_num_frames = 0;
153    rate_estimator_add_frames_called = 0;
154    cras_system_get_mute_return = 0;
155    cras_system_get_volume_return = 100;
156    cras_mix_mute_count = 0;
157    pre_dsp_hook_called = 0;
158    pre_dsp_hook_frames = NULL;
159    post_dsp_hook_called = 0;
160    post_dsp_hook_frames = NULL;
161    iodev_buffer_size = 0;
162    // Assume there is some data in audio buffer.
163    memset(audio_buffer, 0xff, sizeof(audio_buffer));
164    if (audio_area) {
165      free(audio_area);
166      audio_area = NULL;
167    }
168    put_buffer_nframes = 0;
169    is_free_running_ret = 0;
170    no_stream_called = 0;
171    no_stream_enable = 0;
172    simple_no_stream_called = 0;
173    simple_no_stream_enable = 0;
174    dev_stream_playback_frames_ret = 0;
175    if (!atlog) {
176      if (asprintf(&atlog_name, "/ATlog-%d", getpid()) < 0) {
177        exit(-1);
178      }
179      /* To avoid un-used variable warning. */
180      atlog_rw_shm_fd = atlog_ro_shm_fd = -1;
181      atlog = audio_thread_event_log_init(atlog_name);
182    }
183    device_monitor_reset_device_called = 0;
184    output_underrun_called = 0;
185    set_mute_called = 0;
186    cras_ramp_start_mute_ramp = 0;
187    cras_ramp_start_from = 0.0;
188    cras_ramp_start_to = 0.0;
189    cras_ramp_start_duration_frames = 0;
190    cras_ramp_start_cb = NULL;
191    cras_ramp_start_cb_data = NULL;
192    cras_ramp_start_is_called = 0;
193    cras_ramp_reset_is_called = 0;
194    cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
195    cras_ramp_update_ramped_frames_num_frames = 0;
196    cras_device_monitor_set_device_mute_state_called = 0;
197    cras_device_monitor_set_device_mute_state_dev_idx = 0;
198    cras_scale_buffer_called = 0;
199    cras_scale_buffer_increment_fmt = SND_PCM_FORMAT_UNKNOWN;
200    cras_scale_buffer_increment_buff = NULL;
201    cras_scale_buffer_increment_frame = 0;
202    cras_scale_buffer_increment_scaler = 0;
203    cras_scale_buffer_increment_increment = 0;
204    cras_scale_buffer_increment_target = 0.0;
205    cras_scale_buffer_increment_channel = 0;
206    audio_fmt.format = SND_PCM_FORMAT_S16_LE;
207    audio_fmt.frame_rate = 48000;
208    audio_fmt.num_channels = 2;
209    buffer_share_add_id_called = 0;
210    ext_mod_configure_called = 0;
211    rate_estimator_get_rate_ret = 0;
212    cras_audio_thread_event_dev_overrun_called = 0;
213  }
214  
215  namespace {
216  
217  //  Test fill_time_from_frames
TEST(IoDevTestSuite,FillTimeFromFramesNormal)218  TEST(IoDevTestSuite, FillTimeFromFramesNormal) {
219    struct timespec ts;
220  
221    cras_iodev_fill_time_from_frames(12000, 48000, &ts);
222    EXPECT_EQ(0, ts.tv_sec);
223    EXPECT_GE(ts.tv_nsec, 249900000);
224    EXPECT_LE(ts.tv_nsec, 250100000);
225  }
226  
TEST(IoDevTestSuite,FillTimeFromFramesLong)227  TEST(IoDevTestSuite, FillTimeFromFramesLong) {
228    struct timespec ts;
229  
230    cras_iodev_fill_time_from_frames(120000 - 12000, 48000, &ts);
231    EXPECT_EQ(2, ts.tv_sec);
232    EXPECT_GE(ts.tv_nsec, 249900000);
233    EXPECT_LE(ts.tv_nsec, 250100000);
234  }
235  
TEST(IoDevTestSuite,FillTimeFromFramesShort)236  TEST(IoDevTestSuite, FillTimeFromFramesShort) {
237    struct timespec ts;
238  
239    cras_iodev_fill_time_from_frames(12000 - 12000, 48000, &ts);
240    EXPECT_EQ(0, ts.tv_sec);
241    EXPECT_EQ(0, ts.tv_nsec);
242  }
243  
244  class IoDevSetFormatTestSuite : public testing::Test {
245   protected:
SetUp()246    virtual void SetUp() {
247      ResetStubData();
248      sample_rates_[0] = 44100;
249      sample_rates_[1] = 48000;
250      sample_rates_[2] = 0;
251  
252      channel_counts_[0] = 2;
253      channel_counts_[1] = 0;
254      channel_counts_[2] = 0;
255  
256      pcm_formats_[0] = SND_PCM_FORMAT_S16_LE;
257      pcm_formats_[1] = SND_PCM_FORMAT_S32_LE;
258      pcm_formats_[2] = static_cast<snd_pcm_format_t>(0);
259  
260      update_channel_layout_called = 0;
261      update_channel_layout_return_val = 0;
262  
263      memset(&iodev_, 0, sizeof(iodev_));
264      iodev_.update_channel_layout = update_channel_layout;
265      iodev_.supported_rates = sample_rates_;
266      iodev_.supported_channel_counts = channel_counts_;
267      iodev_.supported_formats = pcm_formats_;
268      iodev_.dsp_context = NULL;
269  
270      cras_audio_format_set_channel_layout_called = 0;
271  
272      main_log = main_thread_event_log_init();
273    }
274  
TearDown()275    virtual void TearDown() {
276      cras_iodev_free_format(&iodev_);
277      main_thread_event_log_deinit(main_log);
278    }
279  
280    struct cras_iodev iodev_;
281    size_t sample_rates_[3];
282    size_t channel_counts_[3];
283    snd_pcm_format_t pcm_formats_[3];
284  };
285  
TEST_F(IoDevSetFormatTestSuite,SupportedFormatSecondary)286  TEST_F(IoDevSetFormatTestSuite, SupportedFormatSecondary) {
287    struct cras_audio_format fmt;
288    int rc;
289  
290    fmt.format = SND_PCM_FORMAT_S16_LE;
291    fmt.frame_rate = 48000;
292    fmt.num_channels = 2;
293    iodev_.direction = CRAS_STREAM_OUTPUT;
294    ResetStubData();
295    rc = cras_iodev_set_format(&iodev_, &fmt);
296    EXPECT_EQ(0, rc);
297    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
298    EXPECT_EQ(48000, iodev_.format->frame_rate);
299    EXPECT_EQ(2, iodev_.format->num_channels);
300    EXPECT_EQ(dsp_context_new_sample_rate, 48000);
301    EXPECT_STREQ(dsp_context_new_purpose, "playback");
302  }
303  
TEST_F(IoDevSetFormatTestSuite,SupportedFormat32bit)304  TEST_F(IoDevSetFormatTestSuite, SupportedFormat32bit) {
305    struct cras_audio_format fmt;
306    int rc;
307  
308    fmt.format = SND_PCM_FORMAT_S32_LE;
309    fmt.frame_rate = 48000;
310    fmt.num_channels = 2;
311    iodev_.direction = CRAS_STREAM_OUTPUT;
312    ResetStubData();
313    rc = cras_iodev_set_format(&iodev_, &fmt);
314    EXPECT_EQ(0, rc);
315    EXPECT_EQ(SND_PCM_FORMAT_S32_LE, iodev_.format->format);
316    EXPECT_EQ(48000, iodev_.format->frame_rate);
317    EXPECT_EQ(2, iodev_.format->num_channels);
318    EXPECT_EQ(dsp_context_new_sample_rate, 48000);
319    EXPECT_STREQ(dsp_context_new_purpose, "playback");
320  }
321  
TEST_F(IoDevSetFormatTestSuite,SupportedFormatPrimary)322  TEST_F(IoDevSetFormatTestSuite, SupportedFormatPrimary) {
323    struct cras_audio_format fmt;
324    int rc;
325  
326    fmt.format = SND_PCM_FORMAT_S16_LE;
327    fmt.frame_rate = 44100;
328    fmt.num_channels = 2;
329    iodev_.direction = CRAS_STREAM_INPUT;
330    ResetStubData();
331    rc = cras_iodev_set_format(&iodev_, &fmt);
332    EXPECT_EQ(0, rc);
333    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
334    EXPECT_EQ(44100, iodev_.format->frame_rate);
335    EXPECT_EQ(2, iodev_.format->num_channels);
336    EXPECT_EQ(dsp_context_new_sample_rate, 44100);
337    EXPECT_STREQ(dsp_context_new_purpose, "capture");
338  }
339  
TEST_F(IoDevSetFormatTestSuite,SupportedFormatDivisor)340  TEST_F(IoDevSetFormatTestSuite, SupportedFormatDivisor) {
341    struct cras_audio_format fmt;
342    int rc;
343  
344    fmt.format = SND_PCM_FORMAT_S16_LE;
345    fmt.frame_rate = 96000;
346    fmt.num_channels = 2;
347    rc = cras_iodev_set_format(&iodev_, &fmt);
348    EXPECT_EQ(0, rc);
349    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
350    EXPECT_EQ(48000, iodev_.format->frame_rate);
351    EXPECT_EQ(2, iodev_.format->num_channels);
352  }
353  
TEST_F(IoDevSetFormatTestSuite,Supported96k)354  TEST_F(IoDevSetFormatTestSuite, Supported96k) {
355    struct cras_audio_format fmt;
356    int rc;
357  
358    sample_rates_[0] = 48000;
359    sample_rates_[1] = 96000;
360    sample_rates_[2] = 0;
361  
362    fmt.format = SND_PCM_FORMAT_S16_LE;
363    fmt.frame_rate = 96000;
364    fmt.num_channels = 2;
365    rc = cras_iodev_set_format(&iodev_, &fmt);
366    EXPECT_EQ(0, rc);
367    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
368    EXPECT_EQ(96000, iodev_.format->frame_rate);
369    EXPECT_EQ(2, iodev_.format->num_channels);
370  }
371  
TEST_F(IoDevSetFormatTestSuite,LimitLowRate)372  TEST_F(IoDevSetFormatTestSuite, LimitLowRate) {
373    struct cras_audio_format fmt;
374    int rc;
375  
376    sample_rates_[0] = 48000;
377    sample_rates_[1] = 8000;
378    sample_rates_[2] = 0;
379  
380    fmt.format = SND_PCM_FORMAT_S16_LE;
381    fmt.frame_rate = 8000;
382    fmt.num_channels = 2;
383    rc = cras_iodev_set_format(&iodev_, &fmt);
384    EXPECT_EQ(0, rc);
385    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
386    EXPECT_EQ(48000, iodev_.format->frame_rate);
387    EXPECT_EQ(2, iodev_.format->num_channels);
388  }
389  
TEST_F(IoDevSetFormatTestSuite,UnsupportedChannelCount)390  TEST_F(IoDevSetFormatTestSuite, UnsupportedChannelCount) {
391    struct cras_audio_format fmt;
392    int rc;
393  
394    fmt.format = SND_PCM_FORMAT_S16_LE;
395    fmt.frame_rate = 96000;
396    fmt.num_channels = 1;
397    rc = cras_iodev_set_format(&iodev_, &fmt);
398    EXPECT_EQ(0, rc);
399    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
400    EXPECT_EQ(48000, iodev_.format->frame_rate);
401    EXPECT_EQ(2, iodev_.format->num_channels);
402  }
403  
TEST_F(IoDevSetFormatTestSuite,SupportedFormatFallbackDefault)404  TEST_F(IoDevSetFormatTestSuite, SupportedFormatFallbackDefault) {
405    struct cras_audio_format fmt;
406    int rc;
407  
408    fmt.format = SND_PCM_FORMAT_S16_LE;
409    fmt.frame_rate = 96008;
410    fmt.num_channels = 2;
411    rc = cras_iodev_set_format(&iodev_, &fmt);
412    EXPECT_EQ(0, rc);
413    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
414    EXPECT_EQ(44100, iodev_.format->frame_rate);
415    EXPECT_EQ(2, iodev_.format->num_channels);
416  }
417  
TEST_F(IoDevSetFormatTestSuite,UpdateChannelLayoutSuccess)418  TEST_F(IoDevSetFormatTestSuite, UpdateChannelLayoutSuccess) {
419    struct cras_audio_format fmt;
420    int rc;
421  
422    fmt.format = SND_PCM_FORMAT_S16_LE;
423    fmt.frame_rate = 48000;
424    fmt.num_channels = 6;
425  
426    iodev_.supported_channel_counts[0] = 6;
427    iodev_.supported_channel_counts[1] = 2;
428  
429    rc = cras_iodev_set_format(&iodev_, &fmt);
430    EXPECT_EQ(0, rc);
431    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
432    EXPECT_EQ(48000, iodev_.format->frame_rate);
433    EXPECT_EQ(6, iodev_.format->num_channels);
434  }
435  
TEST_F(IoDevSetFormatTestSuite,UpdateChannelLayoutFail)436  TEST_F(IoDevSetFormatTestSuite, UpdateChannelLayoutFail) {
437    static const int8_t stereo_layout[] = {0,  1,  -1, -1, -1, -1,
438                                           -1, -1, -1, -1, -1};
439    struct cras_audio_format fmt;
440    int rc, i;
441  
442    fmt.format = SND_PCM_FORMAT_S16_LE;
443    fmt.frame_rate = 48000;
444    fmt.num_channels = 2;
445  
446    cras_dsp_context_new_return = reinterpret_cast<cras_dsp_context*>(0xf0f);
447  
448    update_channel_layout_return_val = -1;
449    iodev_.supported_channel_counts[0] = 6;
450    iodev_.supported_channel_counts[1] = 2;
451  
452    rc = cras_iodev_set_format(&iodev_, &fmt);
453    EXPECT_EQ(0, rc);
454    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
455    EXPECT_EQ(48000, iodev_.format->frame_rate);
456    EXPECT_EQ(2, iodev_.format->num_channels);
457    EXPECT_EQ(0, dsp_context_free_called);
458    for (i = 0; i < CRAS_CH_MAX; i++)
459      EXPECT_EQ(iodev_.format->channel_layout[i], stereo_layout[i]);
460  }
461  
TEST_F(IoDevSetFormatTestSuite,UpdateChannelLayoutFail6ch)462  TEST_F(IoDevSetFormatTestSuite, UpdateChannelLayoutFail6ch) {
463    static const int8_t default_6ch_layout[] = {0,  1,  2,  3,  4, 5,
464                                                -1, -1, -1, -1, -1};
465    struct cras_audio_format fmt;
466    int rc, i;
467  
468    fmt.format = SND_PCM_FORMAT_S16_LE;
469    fmt.frame_rate = 48000;
470    fmt.num_channels = 6;
471  
472    cras_dsp_context_new_return = reinterpret_cast<cras_dsp_context*>(0xf0f);
473  
474    update_channel_layout_return_val = -1;
475    iodev_.supported_channel_counts[0] = 6;
476    iodev_.supported_channel_counts[1] = 2;
477  
478    rc = cras_iodev_set_format(&iodev_, &fmt);
479    EXPECT_EQ(0, rc);
480    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, iodev_.format->format);
481    EXPECT_EQ(48000, iodev_.format->frame_rate);
482    EXPECT_EQ(6, iodev_.format->num_channels);
483    EXPECT_EQ(0, dsp_context_free_called);
484    for (i = 0; i < CRAS_CH_MAX; i++)
485      EXPECT_EQ(iodev_.format->channel_layout[i], default_6ch_layout[i]);
486  }
487  
488  // Put buffer tests
489  
get_buffer(cras_iodev * iodev,struct cras_audio_area ** area,unsigned int * num)490  static int get_buffer(cras_iodev* iodev,
491                        struct cras_audio_area** area,
492                        unsigned int* num) {
493    size_t sz = sizeof(*audio_area) + sizeof(struct cras_channel_area) * 2;
494  
495    audio_area = (cras_audio_area*)calloc(1, sz);
496    audio_area->frames = *num;
497    audio_area->num_channels = 2;
498    audio_area->channels[0].buf = audio_buffer;
499    channel_area_set_channel(&audio_area->channels[0], CRAS_CH_FL);
500    audio_area->channels[0].step_bytes = 4;
501    audio_area->channels[1].buf = audio_buffer + 2;
502    channel_area_set_channel(&audio_area->channels[1], CRAS_CH_FR);
503    audio_area->channels[1].step_bytes = 4;
504  
505    *area = audio_area;
506    return 0;
507  }
508  
put_buffer(struct cras_iodev * iodev,unsigned int nframes)509  static int put_buffer(struct cras_iodev* iodev, unsigned int nframes) {
510    put_buffer_nframes = nframes;
511    if (audio_area) {
512      free(audio_area);
513      audio_area = NULL;
514    }
515    return 0;
516  }
517  
no_stream(struct cras_iodev * odev,int enable)518  static int no_stream(struct cras_iodev* odev, int enable) {
519    no_stream_called++;
520    no_stream_enable = enable;
521    // Use default no stream playback to test default behavior.
522    return cras_iodev_default_no_stream_playback(odev, enable);
523  }
524  
is_free_running(const struct cras_iodev * odev)525  static int is_free_running(const struct cras_iodev* odev) {
526    return is_free_running_ret;
527  }
528  
pre_dsp_hook(const uint8_t * frames,unsigned int nframes,const struct cras_audio_format * fmt,void * cb_data)529  static int pre_dsp_hook(const uint8_t* frames,
530                          unsigned int nframes,
531                          const struct cras_audio_format* fmt,
532                          void* cb_data) {
533    pre_dsp_hook_called++;
534    pre_dsp_hook_frames = frames;
535    pre_dsp_hook_cb_data = cb_data;
536    return 0;
537  }
538  
post_dsp_hook(const uint8_t * frames,unsigned int nframes,const struct cras_audio_format * fmt,void * cb_data)539  static int post_dsp_hook(const uint8_t* frames,
540                           unsigned int nframes,
541                           const struct cras_audio_format* fmt,
542                           void* cb_data) {
543    post_dsp_hook_called++;
544    post_dsp_hook_frames = frames;
545    post_dsp_hook_cb_data = cb_data;
546    return 0;
547  }
548  
loopback_hook_control(bool start,void * cb_data)549  static int loopback_hook_control(bool start, void* cb_data) {
550    return 0;
551  }
552  
TEST(IoDevPutOutputBuffer,SystemMuted)553  TEST(IoDevPutOutputBuffer, SystemMuted) {
554    struct cras_audio_format fmt;
555    struct cras_iodev iodev;
556    uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
557    int rc;
558  
559    ResetStubData();
560    memset(&iodev, 0, sizeof(iodev));
561    cras_system_get_mute_return = 1;
562  
563    fmt.format = SND_PCM_FORMAT_S16_LE;
564    fmt.frame_rate = 48000;
565    fmt.num_channels = 2;
566    iodev.format = &fmt;
567    iodev.put_buffer = put_buffer;
568    iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
569  
570    rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
571    EXPECT_EQ(0, rc);
572    EXPECT_EQ(20, cras_mix_mute_count);
573    EXPECT_EQ(20, put_buffer_nframes);
574    EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
575  }
576  
TEST(IoDevPutOutputBuffer,MuteForVolume)577  TEST(IoDevPutOutputBuffer, MuteForVolume) {
578    struct cras_iodev iodev;
579    struct cras_ionode ionode;
580  
581    ResetStubData();
582    memset(&iodev, 0, sizeof(iodev));
583    memset(&ionode, 0, sizeof(ionode));
584  
585    iodev.nodes = &ionode;
586    iodev.active_node = &ionode;
587    iodev.active_node->dev = &iodev;
588  
589    // Case: System volume 100; Node volume 0. => Mute
590    cras_system_get_volume_return = 100;
591    iodev.active_node->volume = 0;
592    EXPECT_EQ(1, cras_iodev_is_zero_volume(&iodev));
593  
594    // Case: System volume 100; Node volume 50. => Not mute
595    cras_system_get_volume_return = 100;
596    iodev.active_node->volume = 50;
597    EXPECT_EQ(0, cras_iodev_is_zero_volume(&iodev));
598  
599    // Case: System volume 0; Node volume 50. => Mute
600    cras_system_get_volume_return = 0;
601    iodev.active_node->volume = 50;
602    EXPECT_EQ(1, cras_iodev_is_zero_volume(&iodev));
603  
604    // Case: System volume 50; Node volume 50. => Mute
605    cras_system_get_volume_return = 50;
606    iodev.active_node->volume = 50;
607    EXPECT_EQ(1, cras_iodev_is_zero_volume(&iodev));
608  }
609  
TEST(IoDevPutOutputBuffer,NodeVolumeZeroShouldMute)610  TEST(IoDevPutOutputBuffer, NodeVolumeZeroShouldMute) {
611    struct cras_audio_format fmt;
612    struct cras_iodev iodev;
613    struct cras_ionode ionode;
614    uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
615    int rc;
616  
617    ResetStubData();
618    memset(&iodev, 0, sizeof(iodev));
619    memset(&ionode, 0, sizeof(ionode));
620  
621    iodev.nodes = &ionode;
622    iodev.active_node = &ionode;
623    iodev.active_node->dev = &iodev;
624    iodev.active_node->volume = 0;
625  
626    fmt.format = SND_PCM_FORMAT_S16_LE;
627    fmt.frame_rate = 48000;
628    fmt.num_channels = 2;
629    iodev.format = &fmt;
630    iodev.put_buffer = put_buffer;
631    iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
632  
633    rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
634    EXPECT_EQ(0, rc);
635    EXPECT_EQ(20, cras_mix_mute_count);
636    EXPECT_EQ(20, put_buffer_nframes);
637    EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
638  }
639  
TEST(IoDevPutOutputBuffer,SystemMutedWithRamp)640  TEST(IoDevPutOutputBuffer, SystemMutedWithRamp) {
641    struct cras_audio_format fmt;
642    struct cras_iodev iodev;
643    uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
644    int rc;
645  
646    ResetStubData();
647    memset(&iodev, 0, sizeof(iodev));
648    cras_system_get_mute_return = 1;
649  
650    fmt.format = SND_PCM_FORMAT_S16_LE;
651    fmt.frame_rate = 48000;
652    fmt.num_channels = 2;
653    iodev.format = &fmt;
654    iodev.put_buffer = put_buffer;
655  
656    // Assume device has ramp member.
657    iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
658    iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
659  
660    // Assume ramping is done.
661    cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
662  
663    rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
664    // Output should be muted.
665    EXPECT_EQ(0, rc);
666    EXPECT_EQ(20, cras_mix_mute_count);
667    EXPECT_EQ(20, put_buffer_nframes);
668    EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
669  
670    // Test for the case where ramping is not done yet.
671    ResetStubData();
672    cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
673    rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
674  
675    // Output should not be muted.
676    EXPECT_EQ(0, rc);
677    EXPECT_EQ(0, cras_mix_mute_count);
678    // Ramped frames should be increased by 20.
679    EXPECT_EQ(20, cras_ramp_update_ramped_frames_num_frames);
680    EXPECT_EQ(20, put_buffer_nframes);
681    EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
682  }
683  
TEST(IoDevPutOutputBuffer,NodeVolumeZeroShouldMuteWithRamp)684  TEST(IoDevPutOutputBuffer, NodeVolumeZeroShouldMuteWithRamp) {
685    struct cras_audio_format fmt;
686    struct cras_iodev iodev;
687    struct cras_ionode ionode;
688    uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
689    int rc;
690  
691    ResetStubData();
692    memset(&iodev, 0, sizeof(iodev));
693    memset(&ionode, 0, sizeof(ionode));
694  
695    iodev.nodes = &ionode;
696    iodev.active_node = &ionode;
697    iodev.active_node->dev = &iodev;
698    iodev.active_node->volume = 0;
699  
700    fmt.format = SND_PCM_FORMAT_S16_LE;
701    fmt.frame_rate = 48000;
702    fmt.num_channels = 2;
703    iodev.format = &fmt;
704    iodev.put_buffer = put_buffer;
705    iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
706  
707    // Assume device has ramp member.
708    iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
709  
710    // Assume ramping is done.
711    cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
712  
713    rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
714    EXPECT_EQ(0, rc);
715    EXPECT_EQ(20, cras_mix_mute_count);
716    EXPECT_EQ(20, put_buffer_nframes);
717    EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
718  
719    // Test for the case where ramping is not done yet.
720    ResetStubData();
721    cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
722    rc = cras_iodev_put_output_buffer(&iodev, frames, 20, NULL, nullptr);
723  
724    // Output should not be muted.
725    EXPECT_EQ(0, rc);
726    EXPECT_EQ(0, cras_mix_mute_count);
727    // Ramped frames should be increased by 20.
728    EXPECT_EQ(20, cras_ramp_update_ramped_frames_num_frames);
729    EXPECT_EQ(20, put_buffer_nframes);
730    EXPECT_EQ(20, rate_estimator_add_frames_num_frames);
731  }
TEST(IoDevPutOutputBuffer,NoDSP)732  TEST(IoDevPutOutputBuffer, NoDSP) {
733    struct cras_audio_format fmt;
734    struct cras_iodev iodev;
735    struct cras_ionode ionode;
736    uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
737    int rc;
738  
739    ResetStubData();
740    memset(&iodev, 0, sizeof(iodev));
741    memset(&ionode, 0, sizeof(ionode));
742  
743    iodev.nodes = &ionode;
744    iodev.active_node = &ionode;
745    iodev.active_node->dev = &iodev;
746    iodev.active_node->volume = 100;
747  
748    fmt.format = SND_PCM_FORMAT_S16_LE;
749    fmt.frame_rate = 48000;
750    fmt.num_channels = 2;
751    iodev.format = &fmt;
752    iodev.put_buffer = put_buffer;
753    iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
754  
755    rc = cras_iodev_put_output_buffer(&iodev, frames, 22, NULL, nullptr);
756    EXPECT_EQ(0, rc);
757    EXPECT_EQ(0, cras_mix_mute_count);
758    EXPECT_EQ(22, put_buffer_nframes);
759    EXPECT_EQ(22, rate_estimator_add_frames_num_frames);
760  }
761  
TEST(IoDevPutOutputBuffer,DSP)762  TEST(IoDevPutOutputBuffer, DSP) {
763    struct cras_audio_format fmt;
764    struct cras_iodev iodev;
765    uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
766    int rc;
767    struct cras_loopback pre_dsp;
768    struct cras_loopback post_dsp;
769  
770    ResetStubData();
771    memset(&iodev, 0, sizeof(iodev));
772    iodev.dsp_context = reinterpret_cast<cras_dsp_context*>(0x15);
773    cras_dsp_get_pipeline_ret = 0x25;
774  
775    fmt.format = SND_PCM_FORMAT_S16_LE;
776    fmt.frame_rate = 48000;
777    fmt.num_channels = 2;
778    iodev.format = &fmt;
779    iodev.put_buffer = put_buffer;
780    iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
781    pre_dsp.type = LOOPBACK_POST_MIX_PRE_DSP;
782    pre_dsp.hook_data = pre_dsp_hook;
783    pre_dsp.hook_control = loopback_hook_control;
784    pre_dsp.cb_data = (void*)0x1234;
785    DL_APPEND(iodev.loopbacks, &pre_dsp);
786    post_dsp.type = LOOPBACK_POST_DSP;
787    post_dsp.hook_data = post_dsp_hook;
788    post_dsp.hook_control = loopback_hook_control;
789    post_dsp.cb_data = (void*)0x5678;
790    DL_APPEND(iodev.loopbacks, &post_dsp);
791  
792    rc = cras_iodev_put_output_buffer(&iodev, frames, 32, NULL, nullptr);
793    EXPECT_EQ(0, rc);
794    EXPECT_EQ(0, cras_mix_mute_count);
795    EXPECT_EQ(1, pre_dsp_hook_called);
796    EXPECT_EQ(frames, pre_dsp_hook_frames);
797    EXPECT_EQ((void*)0x1234, pre_dsp_hook_cb_data);
798    EXPECT_EQ(1, post_dsp_hook_called);
799    EXPECT_EQ((void*)0x5678, post_dsp_hook_cb_data);
800    EXPECT_EQ(32, put_buffer_nframes);
801    EXPECT_EQ(32, rate_estimator_add_frames_num_frames);
802    EXPECT_EQ(32, cras_dsp_pipeline_apply_sample_count);
803    EXPECT_EQ(cras_dsp_get_pipeline_called, cras_dsp_put_pipeline_called);
804  }
805  
TEST(IoDevPutOutputBuffer,SoftVol)806  TEST(IoDevPutOutputBuffer, SoftVol) {
807    struct cras_audio_format fmt;
808    struct cras_iodev iodev;
809    uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
810    int rc;
811  
812    ResetStubData();
813    memset(&iodev, 0, sizeof(iodev));
814    iodev.software_volume_needed = 1;
815  
816    fmt.format = SND_PCM_FORMAT_S16_LE;
817    fmt.frame_rate = 48000;
818    fmt.num_channels = 2;
819    iodev.format = &fmt;
820    iodev.put_buffer = put_buffer;
821    iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
822  
823    cras_system_get_volume_return = 13;
824    softvol_scalers[13] = 0.435;
825  
826    rc = cras_iodev_put_output_buffer(&iodev, frames, 53, NULL, nullptr);
827    EXPECT_EQ(0, rc);
828    EXPECT_EQ(0, cras_mix_mute_count);
829    EXPECT_EQ(53, put_buffer_nframes);
830    EXPECT_EQ(53, rate_estimator_add_frames_num_frames);
831    EXPECT_EQ(softvol_scalers[13], cras_scale_buffer_scaler);
832    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, cras_scale_buffer_fmt);
833  }
834  
TEST(IoDevPutOutputBuffer,SoftVolWithRamp)835  TEST(IoDevPutOutputBuffer, SoftVolWithRamp) {
836    struct cras_audio_format fmt;
837    struct cras_iodev iodev;
838    uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
839    int rc;
840    int n_frames = 53;
841    float ramp_scaler = 0.2;
842    float increment = 0.001;
843    float target = 1.0;
844    int volume = 13;
845    float volume_scaler = 0.435;
846  
847    ResetStubData();
848    memset(&iodev, 0, sizeof(iodev));
849    iodev.software_volume_needed = 1;
850  
851    fmt.format = SND_PCM_FORMAT_S16_LE;
852    fmt.frame_rate = 48000;
853    fmt.num_channels = 2;
854    iodev.format = &fmt;
855    iodev.put_buffer = put_buffer;
856    // Assume device has ramp member.
857    iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
858    iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
859  
860    // Assume ramping is done.
861    cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
862  
863    cras_system_get_volume_return = volume;
864    softvol_scalers[volume] = volume_scaler;
865  
866    rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
867    EXPECT_EQ(0, rc);
868    EXPECT_EQ(0, cras_mix_mute_count);
869    EXPECT_EQ(n_frames, put_buffer_nframes);
870    EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
871    EXPECT_EQ(softvol_scalers[volume], cras_scale_buffer_scaler);
872    EXPECT_EQ(SND_PCM_FORMAT_S16_LE, cras_scale_buffer_fmt);
873  
874    ResetStubData();
875    // Assume ramping is not done.
876    cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
877    cras_ramp_get_current_action_ret.scaler = ramp_scaler;
878    cras_ramp_get_current_action_ret.increment = increment;
879    cras_ramp_get_current_action_ret.target = target;
880  
881    cras_system_get_volume_return = volume;
882    softvol_scalers[volume] = volume_scaler;
883  
884    rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
885    EXPECT_EQ(0, rc);
886    EXPECT_EQ(0, cras_mix_mute_count);
887    // cras_scale_buffer is not called.
888    EXPECT_EQ(0, cras_scale_buffer_called);
889  
890    // Verify the arguments passed to cras_scale_buffer_increment.
891    EXPECT_EQ(fmt.format, cras_scale_buffer_increment_fmt);
892    EXPECT_EQ(frames, cras_scale_buffer_increment_buff);
893    EXPECT_EQ(n_frames, cras_scale_buffer_increment_frame);
894    // Initial scaler will be product of software volume scaler and
895    // ramp scaler.
896    EXPECT_FLOAT_EQ(softvol_scalers[volume] * ramp_scaler,
897                    cras_scale_buffer_increment_scaler);
898    // Increment scaler will be product of software volume scaler and
899    // ramp increment.
900    EXPECT_FLOAT_EQ(softvol_scalers[volume] * increment,
901                    cras_scale_buffer_increment_increment);
902    EXPECT_FLOAT_EQ(softvol_scalers[volume] * target,
903                    cras_scale_buffer_increment_target);
904    EXPECT_EQ(fmt.num_channels, cras_scale_buffer_increment_channel);
905  
906    EXPECT_EQ(n_frames, put_buffer_nframes);
907    EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
908  }
909  
TEST(IoDevPutOutputBuffer,NoSoftVolWithRamp)910  TEST(IoDevPutOutputBuffer, NoSoftVolWithRamp) {
911    struct cras_audio_format fmt;
912    struct cras_iodev iodev;
913    uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
914    int rc;
915    int n_frames = 53;
916    float ramp_scaler = 0.2;
917    float increment = 0.001;
918    float target = 1.0;
919  
920    ResetStubData();
921    memset(&iodev, 0, sizeof(iodev));
922    iodev.software_volume_needed = 0;
923  
924    fmt.format = SND_PCM_FORMAT_S16_LE;
925    fmt.frame_rate = 48000;
926    fmt.num_channels = 2;
927    iodev.format = &fmt;
928    iodev.put_buffer = put_buffer;
929    // Assume device has ramp member.
930    iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
931    iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
932  
933    // Assume ramping is done.
934    cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_NONE;
935  
936    rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
937    EXPECT_EQ(0, rc);
938    EXPECT_EQ(0, cras_mix_mute_count);
939    // cras_scale_buffer is not called.
940    EXPECT_EQ(0, cras_scale_buffer_called);
941    EXPECT_EQ(n_frames, put_buffer_nframes);
942    EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
943  
944    ResetStubData();
945    // Assume ramping is not done.
946    cras_ramp_get_current_action_ret.type = CRAS_RAMP_ACTION_PARTIAL;
947    cras_ramp_get_current_action_ret.scaler = ramp_scaler;
948    cras_ramp_get_current_action_ret.increment = increment;
949    cras_ramp_get_current_action_ret.target = target;
950  
951    rc = cras_iodev_put_output_buffer(&iodev, frames, n_frames, NULL, nullptr);
952    EXPECT_EQ(0, rc);
953    EXPECT_EQ(0, cras_mix_mute_count);
954    // cras_scale_buffer is not called.
955    EXPECT_EQ(0, cras_scale_buffer_called);
956  
957    // Verify the arguments passed to cras_scale_buffer_increment.
958    EXPECT_EQ(fmt.format, cras_scale_buffer_increment_fmt);
959    EXPECT_EQ(frames, cras_scale_buffer_increment_buff);
960    EXPECT_EQ(n_frames, cras_scale_buffer_increment_frame);
961    EXPECT_FLOAT_EQ(ramp_scaler, cras_scale_buffer_increment_scaler);
962    EXPECT_FLOAT_EQ(increment, cras_scale_buffer_increment_increment);
963    EXPECT_FLOAT_EQ(1.0, cras_scale_buffer_increment_target);
964    EXPECT_EQ(fmt.num_channels, cras_scale_buffer_increment_channel);
965  
966    EXPECT_EQ(n_frames, put_buffer_nframes);
967    EXPECT_EQ(n_frames, rate_estimator_add_frames_num_frames);
968  }
969  
TEST(IoDevPutOutputBuffer,Scale32Bit)970  TEST(IoDevPutOutputBuffer, Scale32Bit) {
971    struct cras_audio_format fmt;
972    struct cras_iodev iodev;
973    uint8_t* frames = reinterpret_cast<uint8_t*>(0x44);
974    int rc;
975  
976    ResetStubData();
977    memset(&iodev, 0, sizeof(iodev));
978    iodev.software_volume_needed = 1;
979  
980    cras_system_get_volume_return = 13;
981    softvol_scalers[13] = 0.435;
982  
983    fmt.format = SND_PCM_FORMAT_S32_LE;
984    fmt.frame_rate = 48000;
985    fmt.num_channels = 2;
986    iodev.format = &fmt;
987    iodev.put_buffer = put_buffer;
988    iodev.rate_est = reinterpret_cast<struct rate_estimator*>(0xdeadbeef);
989  
990    rc = cras_iodev_put_output_buffer(&iodev, frames, 53, NULL, nullptr);
991    EXPECT_EQ(0, rc);
992    EXPECT_EQ(0, cras_mix_mute_count);
993    EXPECT_EQ(53, put_buffer_nframes);
994    EXPECT_EQ(53, rate_estimator_add_frames_num_frames);
995    EXPECT_EQ(SND_PCM_FORMAT_S32_LE, cras_scale_buffer_fmt);
996  }
997  
998  // frames queued/avail tests
999  
1000  static unsigned fr_queued = 0;
1001  
frames_queued(const struct cras_iodev * iodev,struct timespec * tstamp)1002  static int frames_queued(const struct cras_iodev* iodev,
1003                           struct timespec* tstamp) {
1004    clock_gettime(CLOCK_MONOTONIC_RAW, tstamp);
1005    return fr_queued;
1006  }
1007  
TEST(IoDevQueuedBuffer,ZeroMinBufferLevel)1008  TEST(IoDevQueuedBuffer, ZeroMinBufferLevel) {
1009    struct cras_iodev iodev;
1010    struct timespec tstamp;
1011    int rc;
1012  
1013    ResetStubData();
1014    memset(&iodev, 0, sizeof(iodev));
1015    iodev.direction = CRAS_STREAM_OUTPUT;
1016    iodev.frames_queued = frames_queued;
1017    iodev.min_buffer_level = 0;
1018    iodev.buffer_size = 200;
1019    fr_queued = 50;
1020  
1021    rc = cras_iodev_frames_queued(&iodev, &tstamp);
1022    EXPECT_EQ(50, rc);
1023    rc = cras_iodev_buffer_avail(&iodev, rc);
1024    EXPECT_EQ(150, rc);
1025  }
1026  
TEST(IoDevQueuedBuffer,NonZeroMinBufferLevel)1027  TEST(IoDevQueuedBuffer, NonZeroMinBufferLevel) {
1028    struct cras_iodev iodev;
1029    struct timespec hw_tstamp;
1030    int rc;
1031  
1032    ResetStubData();
1033    memset(&iodev, 0, sizeof(iodev));
1034    iodev.direction = CRAS_STREAM_OUTPUT;
1035    iodev.frames_queued = frames_queued;
1036    iodev.min_buffer_level = 100;
1037    iodev.buffer_size = 200;
1038    fr_queued = 180;
1039  
1040    rc = cras_iodev_frames_queued(&iodev, &hw_tstamp);
1041    EXPECT_EQ(80, rc);
1042    rc = cras_iodev_buffer_avail(&iodev, rc);
1043    EXPECT_EQ(20, rc);
1044  
1045    /* When fr_queued < min_buffer_level*/
1046    fr_queued = 80;
1047    rc = cras_iodev_frames_queued(&iodev, &hw_tstamp);
1048    EXPECT_EQ(0, rc);
1049    rc = cras_iodev_buffer_avail(&iodev, rc);
1050    EXPECT_EQ(100, rc);
1051  }
1052  
update_active_node(struct cras_iodev * iodev,unsigned node_idx,unsigned dev_enabled)1053  static void update_active_node(struct cras_iodev* iodev,
1054                                 unsigned node_idx,
1055                                 unsigned dev_enabled) {}
1056  
dev_set_mute(struct cras_iodev * iodev)1057  static void dev_set_mute(struct cras_iodev* iodev) {
1058    set_mute_called++;
1059  }
1060  
TEST(IoNodePlug,PlugUnplugNode)1061  TEST(IoNodePlug, PlugUnplugNode) {
1062    struct cras_iodev iodev;
1063    struct cras_ionode ionode, ionode2;
1064  
1065    main_log = main_thread_event_log_init();
1066  
1067    memset(&iodev, 0, sizeof(iodev));
1068    memset(&ionode, 0, sizeof(ionode));
1069    memset(&ionode2, 0, sizeof(ionode2));
1070    iodev.direction = CRAS_STREAM_INPUT;
1071    iodev.update_active_node = update_active_node;
1072    ionode.dev = &iodev;
1073    cras_iodev_add_node(&iodev, &ionode);
1074    ionode2.dev = &iodev;
1075    cras_iodev_add_node(&iodev, &ionode2);
1076    cras_iodev_set_active_node(&iodev, &ionode);
1077    ResetStubData();
1078    cras_iodev_set_node_plugged(&ionode, 1);
1079    EXPECT_EQ(0, cras_iodev_list_disable_dev_called);
1080    cras_iodev_set_node_plugged(&ionode, 0);
1081    EXPECT_EQ(1, cras_iodev_list_disable_dev_called);
1082  
1083    /* Unplug non-active node shouldn't disable iodev. */
1084    cras_iodev_set_node_plugged(&ionode2, 1);
1085    EXPECT_EQ(1, cras_iodev_list_disable_dev_called);
1086    cras_iodev_set_node_plugged(&ionode2, 0);
1087    EXPECT_EQ(1, cras_iodev_list_disable_dev_called);
1088    main_thread_event_log_deinit(main_log);
1089  }
1090  
TEST(IoDev,AddRemoveNode)1091  TEST(IoDev, AddRemoveNode) {
1092    struct cras_iodev iodev;
1093    struct cras_ionode ionode;
1094  
1095    memset(&iodev, 0, sizeof(iodev));
1096    memset(&ionode, 0, sizeof(ionode));
1097    ResetStubData();
1098    EXPECT_EQ(0, notify_nodes_changed_called);
1099    cras_iodev_add_node(&iodev, &ionode);
1100    EXPECT_EQ(1, notify_nodes_changed_called);
1101    cras_iodev_rm_node(&iodev, &ionode);
1102    EXPECT_EQ(2, notify_nodes_changed_called);
1103  }
1104  
TEST(IoDev,SetActiveNode)1105  TEST(IoDev, SetActiveNode) {
1106    struct cras_iodev iodev;
1107    struct cras_ionode ionode;
1108  
1109    memset(&iodev, 0, sizeof(iodev));
1110    memset(&ionode, 0, sizeof(ionode));
1111    ResetStubData();
1112    EXPECT_EQ(0, notify_active_node_changed_called);
1113    cras_iodev_set_active_node(&iodev, &ionode);
1114    EXPECT_EQ(1, notify_active_node_changed_called);
1115  }
1116  
TEST(IoDev,SetMute)1117  TEST(IoDev, SetMute) {
1118    struct cras_iodev iodev;
1119    int rc;
1120  
1121    memset(&iodev, 0, sizeof(iodev));
1122    iodev.set_mute = dev_set_mute;
1123    iodev.state = CRAS_IODEV_STATE_CLOSE;
1124  
1125    ResetStubData();
1126    rc = cras_iodev_set_mute(&iodev);
1127    EXPECT_EQ(0, rc);
1128    EXPECT_EQ(0, set_mute_called);
1129  
1130    iodev.state = CRAS_IODEV_STATE_OPEN;
1131    rc = cras_iodev_set_mute(&iodev);
1132    EXPECT_EQ(0, rc);
1133    EXPECT_EQ(1, set_mute_called);
1134  }
1135  
1136  // Test software volume changes for default output.
TEST(IoDev,SoftwareVolume)1137  TEST(IoDev, SoftwareVolume) {
1138    struct cras_iodev iodev;
1139    struct cras_ionode ionode;
1140  
1141    memset(&iodev, 0, sizeof(iodev));
1142    memset(&ionode, 0, sizeof(ionode));
1143    ResetStubData();
1144  
1145    iodev.nodes = &ionode;
1146    iodev.active_node = &ionode;
1147    iodev.active_node->dev = &iodev;
1148  
1149    iodev.active_node->volume = 100;
1150    iodev.software_volume_needed = 0;
1151  
1152    softvol_scalers[80] = 0.5;
1153    softvol_scalers[70] = 0.3;
1154  
1155    // Check that system volume changes software volume if needed.
1156    cras_system_get_volume_return = 80;
1157    // system_volume - 100 + node_volume = 80 - 100 + 100 = 80
1158    EXPECT_FLOAT_EQ(0.5, cras_iodev_get_software_volume_scaler(&iodev));
1159  
1160    // Check that node volume changes software volume if needed.
1161    iodev.active_node->volume = 90;
1162    // system_volume - 100 + node_volume = 80 - 100 + 90 = 70
1163    EXPECT_FLOAT_EQ(0.3, cras_iodev_get_software_volume_scaler(&iodev));
1164  }
1165  
1166  // Test software gain scaler.
TEST(IoDev,SoftwareGain)1167  TEST(IoDev, SoftwareGain) {
1168    struct cras_iodev iodev;
1169    struct cras_ionode ionode;
1170  
1171    memset(&iodev, 0, sizeof(iodev));
1172    memset(&ionode, 0, sizeof(ionode));
1173    ResetStubData();
1174  
1175    iodev.nodes = &ionode;
1176    iodev.active_node = &ionode;
1177    iodev.active_node->dev = &iodev;
1178  
1179    ionode.capture_gain = 2400;
1180    ionode.software_volume_needed = 1;
1181  
1182    // 2400 * 0.01 dB is 15.848931
1183    EXPECT_FLOAT_EQ(15.848931, cras_iodev_get_software_gain_scaler(&iodev));
1184  
1185    // Software gain scaler should be 1.0 if software gain is not needed.
1186    ionode.software_volume_needed = 0;
1187    EXPECT_FLOAT_EQ(1.0, cras_iodev_get_software_gain_scaler(&iodev));
1188  }
1189  
1190  // This get_buffer implementation set returned frames larger than requested
1191  // frames.
bad_get_buffer(struct cras_iodev * iodev,struct cras_audio_area ** area,unsigned * frames)1192  static int bad_get_buffer(struct cras_iodev* iodev,
1193                            struct cras_audio_area** area,
1194                            unsigned* frames) {
1195    *frames = *frames + 1;
1196    return 0;
1197  }
1198  
1199  // Check that if get_buffer implementation returns invalid frames,
1200  // cras_iodev_get_output_buffer and cras_iodev_get_input_buffer can return
1201  // error.
TEST(IoDev,GetBufferInvalidFrames)1202  TEST(IoDev, GetBufferInvalidFrames) {
1203    struct cras_iodev iodev;
1204    struct cras_audio_area** area = NULL;
1205    unsigned int frames = 512;
1206    struct cras_audio_format fmt;
1207  
1208    // Format is used in cras_iodev_get_input_buffer;
1209    fmt.format = SND_PCM_FORMAT_S16_LE;
1210    fmt.frame_rate = 48000;
1211    fmt.num_channels = 2;
1212  
1213    memset(&iodev, 0, sizeof(iodev));
1214  
1215    ResetStubData();
1216  
1217    iodev.format = &fmt;
1218    iodev.get_buffer = bad_get_buffer;
1219  
1220    EXPECT_EQ(-EINVAL, cras_iodev_get_output_buffer(&iodev, area, &frames));
1221    EXPECT_EQ(-EINVAL, cras_iodev_get_input_buffer(&iodev, &frames));
1222  }
1223  
configure_dev(struct cras_iodev * iodev)1224  static int configure_dev(struct cras_iodev* iodev) {
1225    iodev->buffer_size = iodev_buffer_size;
1226    return 0;
1227  }
1228  
TEST(IoDev,OpenOutputDeviceNoStart)1229  TEST(IoDev, OpenOutputDeviceNoStart) {
1230    struct cras_iodev iodev;
1231  
1232    memset(&iodev, 0, sizeof(iodev));
1233    iodev.configure_dev = configure_dev;
1234    iodev.direction = CRAS_STREAM_OUTPUT;
1235    iodev.format = &audio_fmt;
1236    iodev.get_buffer = get_buffer;
1237    iodev.put_buffer = put_buffer;
1238    ResetStubData();
1239  
1240    iodev.state = CRAS_IODEV_STATE_CLOSE;
1241  
1242    iodev_buffer_size = 1024;
1243    cras_iodev_open(&iodev, 240, &audio_fmt);
1244    EXPECT_EQ(0, iodev.max_cb_level);
1245    EXPECT_EQ(240, iodev.min_cb_level);
1246  
1247    // Test that state is no stream run when there is no start ops.
1248    EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
1249  }
1250  
TEST(IoDev,OpenOutputDeviceWithLowRateFmt)1251  TEST(IoDev, OpenOutputDeviceWithLowRateFmt) {
1252    struct cras_iodev iodev;
1253  
1254    memset(&iodev, 0, sizeof(iodev));
1255    iodev.configure_dev = configure_dev;
1256    iodev.direction = CRAS_STREAM_OUTPUT;
1257    iodev.format = &audio_fmt;
1258    iodev.get_buffer = get_buffer;
1259    iodev.put_buffer = put_buffer;
1260    ResetStubData();
1261  
1262    cras_audio_format low_rate_fmt = audio_fmt;
1263    low_rate_fmt.frame_rate = 8000;
1264    iodev.state = CRAS_IODEV_STATE_CLOSE;
1265  
1266    iodev_buffer_size = 1024;
1267    cras_iodev_open(&iodev, 40, &low_rate_fmt);
1268    EXPECT_EQ(0, iodev.max_cb_level);
1269  
1270    // Test that iodev min_cb_level should be set to
1271    // 40 * 48000 / 8000 = 240
1272    EXPECT_EQ(240, iodev.min_cb_level);
1273  }
1274  
fake_start(const struct cras_iodev * iodev)1275  int fake_start(const struct cras_iodev* iodev) {
1276    return 0;
1277  }
1278  
TEST(IoDev,OpenOutputDeviceWithStart)1279  TEST(IoDev, OpenOutputDeviceWithStart) {
1280    struct cras_iodev iodev;
1281  
1282    memset(&iodev, 0, sizeof(iodev));
1283    iodev.configure_dev = configure_dev;
1284    iodev.direction = CRAS_STREAM_OUTPUT;
1285    iodev.format = &audio_fmt;
1286    ResetStubData();
1287  
1288    iodev.state = CRAS_IODEV_STATE_CLOSE;
1289    iodev.start = fake_start;
1290  
1291    iodev_buffer_size = 1024;
1292    cras_iodev_open(&iodev, 240, &audio_fmt);
1293    EXPECT_EQ(0, iodev.max_cb_level);
1294    EXPECT_EQ(240, iodev.min_cb_level);
1295  
1296    // Test that state is no stream run when there is start ops.
1297    EXPECT_EQ(CRAS_IODEV_STATE_OPEN, iodev.state);
1298  }
1299  
TEST(IoDev,OpenInputDeviceNoStart)1300  TEST(IoDev, OpenInputDeviceNoStart) {
1301    struct cras_iodev iodev;
1302  
1303    memset(&iodev, 0, sizeof(iodev));
1304    iodev.configure_dev = configure_dev;
1305    iodev.direction = CRAS_STREAM_INPUT;
1306    iodev.format = &audio_fmt;
1307    ResetStubData();
1308  
1309    iodev.state = CRAS_IODEV_STATE_CLOSE;
1310  
1311    iodev_buffer_size = 1024;
1312    cras_iodev_open(&iodev, 240, &audio_fmt);
1313    EXPECT_EQ(0, iodev.max_cb_level);
1314    EXPECT_EQ(240, iodev.min_cb_level);
1315  
1316    // Test that state is normal run when there is start ops.
1317    EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
1318  }
1319  
TEST(IoDev,OpenInputDeviceWithStart)1320  TEST(IoDev, OpenInputDeviceWithStart) {
1321    struct cras_iodev iodev;
1322  
1323    memset(&iodev, 0, sizeof(iodev));
1324    iodev.configure_dev = configure_dev;
1325    iodev.direction = CRAS_STREAM_INPUT;
1326    iodev.format = &audio_fmt;
1327    ResetStubData();
1328  
1329    iodev.state = CRAS_IODEV_STATE_CLOSE;
1330    iodev.start = fake_start;
1331  
1332    iodev_buffer_size = 1024;
1333    cras_iodev_open(&iodev, 240, &audio_fmt);
1334    EXPECT_EQ(0, iodev.max_cb_level);
1335    EXPECT_EQ(240, iodev.min_cb_level);
1336  
1337    // Test that state is normal run even if there is start ops.
1338    EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
1339  }
1340  
TEST(IoDev,OpenInputDeviceWithLowRateFmt)1341  TEST(IoDev, OpenInputDeviceWithLowRateFmt) {
1342    struct cras_iodev iodev;
1343  
1344    memset(&iodev, 0, sizeof(iodev));
1345    iodev.configure_dev = configure_dev;
1346    iodev.direction = CRAS_STREAM_INPUT;
1347    iodev.format = &audio_fmt;
1348    ResetStubData();
1349  
1350    cras_audio_format low_rate_fmt = audio_fmt;
1351    low_rate_fmt.frame_rate = 8000;
1352    iodev.state = CRAS_IODEV_STATE_CLOSE;
1353  
1354    iodev_buffer_size = 1024;
1355    cras_iodev_open(&iodev, 40, &low_rate_fmt);
1356    EXPECT_EQ(0, iodev.max_cb_level);
1357  
1358    // Test that iodev min_cb_level should be set to
1359    // 40 * 48000 / 8000 = 240
1360    EXPECT_EQ(240, iodev.min_cb_level);
1361  }
1362  
simple_no_stream(struct cras_iodev * dev,int enable)1363  static int simple_no_stream(struct cras_iodev* dev, int enable) {
1364    simple_no_stream_enable = enable;
1365    simple_no_stream_called++;
1366    return 0;
1367  }
1368  
TEST(IoDev,AddRmStream)1369  TEST(IoDev, AddRmStream) {
1370    struct cras_iodev iodev;
1371    struct cras_rstream rstream1, rstream2;
1372    struct dev_stream stream1, stream2;
1373  
1374    memset(&iodev, 0, sizeof(iodev));
1375    memset(&rstream1, 0, sizeof(rstream1));
1376    memset(&rstream2, 0, sizeof(rstream2));
1377    iodev.configure_dev = configure_dev;
1378    iodev.no_stream = simple_no_stream;
1379    iodev.format = &audio_fmt;
1380    iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
1381    iodev.get_buffer = get_buffer;
1382    iodev.put_buffer = put_buffer;
1383    rstream1.cb_threshold = 800;
1384    stream1.stream = &rstream1;
1385    stream1.is_running = 0;
1386    rstream2.cb_threshold = 400;
1387    stream2.stream = &rstream2;
1388    stream2.is_running = 0;
1389    ResetStubData();
1390  
1391    iodev_buffer_size = 1024;
1392    cras_iodev_open(&iodev, rstream1.cb_threshold, &audio_fmt);
1393    EXPECT_EQ(0, iodev.max_cb_level);
1394    EXPECT_EQ(512, iodev.min_cb_level);
1395  
1396    /* min_cb_level should not exceed half the buffer size. */
1397    cras_iodev_add_stream(&iodev, &stream1);
1398    cras_iodev_start_stream(&iodev, &stream1);
1399    EXPECT_EQ(800, iodev.max_cb_level);
1400    EXPECT_EQ(512, iodev.min_cb_level);
1401    EXPECT_EQ(1, buffer_share_add_id_called);
1402  
1403    cras_iodev_add_stream(&iodev, &stream2);
1404    cras_iodev_start_stream(&iodev, &stream2);
1405    EXPECT_EQ(800, iodev.max_cb_level);
1406    EXPECT_EQ(400, iodev.min_cb_level);
1407    EXPECT_EQ(2, buffer_share_add_id_called);
1408  
1409    cras_iodev_rm_stream(&iodev, &rstream1);
1410    EXPECT_EQ(400, iodev.max_cb_level);
1411    EXPECT_EQ(400, iodev.min_cb_level);
1412    EXPECT_EQ(0, simple_no_stream_called);
1413  
1414    /* When all streams are removed, keep the last min_cb_level for draining. */
1415    cras_iodev_rm_stream(&iodev, &rstream2);
1416    EXPECT_EQ(0, iodev.max_cb_level);
1417    EXPECT_EQ(512, iodev.min_cb_level);
1418  }
1419  
TEST(IoDev,RmStreamUpdateFetchTime)1420  TEST(IoDev, RmStreamUpdateFetchTime) {
1421    struct cras_iodev iodev;
1422    struct cras_rstream rstream1, rstream2, rstream3;
1423    struct dev_stream stream1, stream2, stream3;
1424  
1425    memset(&iodev, 0, sizeof(iodev));
1426    memset(&rstream1, 0, sizeof(rstream1));
1427    memset(&rstream2, 0, sizeof(rstream2));
1428    memset(&rstream3, 0, sizeof(rstream2));
1429    memset(&stream1, 0, sizeof(stream2));
1430    memset(&stream2, 0, sizeof(stream2));
1431    memset(&stream3, 0, sizeof(stream2));
1432    iodev.configure_dev = configure_dev;
1433    iodev.no_stream = simple_no_stream;
1434    iodev.format = &audio_fmt;
1435    iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
1436    iodev.get_buffer = get_buffer;
1437    iodev.put_buffer = put_buffer;
1438    rstream1.direction = CRAS_STREAM_OUTPUT;
1439    rstream2.direction = CRAS_STREAM_OUTPUT;
1440    rstream3.direction = CRAS_STREAM_OUTPUT;
1441    stream1.stream = &rstream1;
1442    stream2.stream = &rstream2;
1443    stream3.stream = &rstream3;
1444    ResetStubData();
1445  
1446    cras_iodev_open(&iodev, 1024, &audio_fmt);
1447  
1448    cras_iodev_add_stream(&iodev, &stream1);
1449    cras_iodev_start_stream(&iodev, &stream1);
1450    cras_iodev_add_stream(&iodev, &stream2);
1451    cras_iodev_start_stream(&iodev, &stream2);
1452    cras_iodev_add_stream(&iodev, &stream3);
1453  
1454    rstream1.next_cb_ts.tv_sec = 2;
1455    rstream1.next_cb_ts.tv_nsec = 0;
1456    rstream2.next_cb_ts.tv_sec = 1;
1457    rstream2.next_cb_ts.tv_nsec = 0;
1458    rstream3.next_cb_ts.tv_sec = 1;
1459    rstream3.next_cb_ts.tv_nsec = 0;
1460  
1461    /*
1462     * Because rstream3 has not started yet, the next_cb_ts will be change to the
1463     * earliest fetch time of remaining streams, which is rstream1.
1464     */
1465    cras_iodev_rm_stream(&iodev, &rstream2);
1466  
1467    EXPECT_EQ(rstream3.next_cb_ts.tv_sec, rstream1.next_cb_ts.tv_sec);
1468    EXPECT_EQ(rstream3.next_cb_ts.tv_nsec, rstream1.next_cb_ts.tv_nsec);
1469  }
1470  
TEST(IoDev,StartStreams)1471  TEST(IoDev, StartStreams) {
1472    struct cras_iodev iodev1, iodev2;
1473    struct cras_rstream rstream1, rstream2;
1474    struct dev_stream stream1, stream2;
1475  
1476    memset(&iodev1, 0, sizeof(iodev1));
1477    memset(&iodev2, 0, sizeof(iodev2));
1478    memset(&rstream1, 0, sizeof(rstream1));
1479    memset(&rstream2, 0, sizeof(rstream2));
1480    memset(&stream1, 0, sizeof(stream1));
1481    memset(&stream2, 0, sizeof(stream2));
1482    iodev1.configure_dev = configure_dev;
1483    iodev1.format = &audio_fmt;
1484    iodev1.state = CRAS_IODEV_STATE_NORMAL_RUN;
1485    iodev1.get_buffer = get_buffer;
1486    iodev1.put_buffer = put_buffer;
1487    iodev2.configure_dev = configure_dev;
1488    iodev2.format = &audio_fmt;
1489    iodev2.state = CRAS_IODEV_STATE_NORMAL_RUN;
1490    rstream1.direction = CRAS_STREAM_INPUT;
1491    rstream2.direction = CRAS_STREAM_OUTPUT;
1492    stream1.stream = &rstream1;
1493    stream2.stream = &rstream2;
1494  
1495    /* An input stream starts running immediately. */
1496    ResetStubData();
1497    iodev1.direction = CRAS_STREAM_INPUT;
1498    cras_iodev_open(&iodev1, 1024, &audio_fmt);
1499    cras_iodev_add_stream(&iodev1, &stream1);
1500    EXPECT_EQ(1, dev_stream_is_running(&stream1));
1501    EXPECT_EQ(1, buffer_share_add_id_called);
1502  
1503    /* An output stream starts running after its first fetch. */
1504    ResetStubData();
1505    iodev2.direction = CRAS_STREAM_OUTPUT;
1506    cras_iodev_open(&iodev2, 1024, &audio_fmt);
1507    cras_iodev_add_stream(&iodev2, &stream2);
1508    EXPECT_EQ(0, dev_stream_is_running(&stream2));
1509    EXPECT_EQ(0, buffer_share_add_id_called);
1510  }
1511  
TEST(IoDev,TriggerOnlyStreamNoBufferShare)1512  TEST(IoDev, TriggerOnlyStreamNoBufferShare) {
1513    struct cras_iodev iodev;
1514    struct cras_rstream rstream;
1515    struct dev_stream stream;
1516  
1517    memset(&iodev, 0, sizeof(iodev));
1518    memset(&rstream, 0, sizeof(rstream));
1519    iodev.configure_dev = configure_dev;
1520    iodev.format = &audio_fmt;
1521    iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
1522    rstream.cb_threshold = 800;
1523    rstream.flags = TRIGGER_ONLY;
1524    stream.stream = &rstream;
1525    ResetStubData();
1526  
1527    cras_iodev_open(&iodev, rstream.cb_threshold, &audio_fmt);
1528    /* TRIGGER_ONLY streams shall not be added to buffer_share. */
1529    cras_iodev_add_stream(&iodev, &stream);
1530    EXPECT_EQ(0, buffer_share_add_id_called);
1531  }
1532  
TEST(IoDev,FillZeros)1533  TEST(IoDev, FillZeros) {
1534    struct cras_iodev iodev;
1535    struct cras_audio_format fmt;
1536    unsigned int frames = 50;
1537    int16_t* zeros;
1538    int rc;
1539  
1540    ResetStubData();
1541  
1542    memset(&iodev, 0, sizeof(iodev));
1543    fmt.format = SND_PCM_FORMAT_S16_LE;
1544    fmt.frame_rate = 48000;
1545    fmt.num_channels = 2;
1546    iodev.format = &fmt;
1547    iodev.get_buffer = get_buffer;
1548    iodev.put_buffer = put_buffer;
1549  
1550    iodev.direction = CRAS_STREAM_INPUT;
1551    rc = cras_iodev_fill_odev_zeros(&iodev, frames);
1552    EXPECT_EQ(-EINVAL, rc);
1553  
1554    iodev.direction = CRAS_STREAM_OUTPUT;
1555    rc = cras_iodev_fill_odev_zeros(&iodev, frames);
1556  
1557    EXPECT_EQ(0, rc);
1558    EXPECT_EQ(frames, put_buffer_nframes);
1559    zeros = (int16_t*)calloc(frames * 2, sizeof(*zeros));
1560    rc = memcmp(audio_buffer, zeros, frames * 2 * 2);
1561    free(zeros);
1562    EXPECT_EQ(0, rc);
1563  }
1564  
TEST(IoDev,DefaultNoStreamPlaybackRunning)1565  TEST(IoDev, DefaultNoStreamPlaybackRunning) {
1566    struct cras_iodev iodev;
1567    struct cras_audio_format fmt;
1568    unsigned int hw_level = 50;
1569    unsigned int min_cb_level = 240;
1570    unsigned int zeros_to_fill;
1571    int16_t* zeros;
1572    int rc;
1573  
1574    memset(&iodev, 0, sizeof(iodev));
1575  
1576    fmt.format = SND_PCM_FORMAT_S16_LE;
1577    fmt.frame_rate = 48000;
1578    fmt.num_channels = 2;
1579    iodev.format = &fmt;
1580    iodev.min_cb_level = min_cb_level;
1581    iodev.get_buffer = get_buffer;
1582    iodev.put_buffer = put_buffer;
1583    iodev.frames_queued = frames_queued;
1584    iodev.min_buffer_level = 0;
1585    iodev.direction = CRAS_STREAM_OUTPUT;
1586    iodev.buffer_size = BUFFER_SIZE;
1587    iodev.no_stream = no_stream;
1588  
1589    ResetStubData();
1590  
1591    // Device is running. hw_level is less than target.
1592    // Need to fill to callback level * 2;
1593    iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
1594    fr_queued = hw_level;
1595    zeros_to_fill = min_cb_level * 2 - hw_level;
1596  
1597    rc = cras_iodev_default_no_stream_playback(&iodev, 1);
1598  
1599    EXPECT_EQ(0, rc);
1600    EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
1601    EXPECT_EQ(zeros_to_fill, put_buffer_nframes);
1602    zeros = (int16_t*)calloc(zeros_to_fill * 2, sizeof(*zeros));
1603    EXPECT_EQ(0, memcmp(audio_buffer, zeros, zeros_to_fill * 2 * 2));
1604    free(zeros);
1605  
1606    ResetStubData();
1607  
1608    // Device is running. hw_level is not less than target.
1609    // No need to fill zeros.
1610    iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
1611    hw_level = min_cb_level * 2;
1612    fr_queued = hw_level;
1613    zeros_to_fill = 0;
1614  
1615    rc = cras_iodev_default_no_stream_playback(&iodev, 1);
1616    EXPECT_EQ(0, rc);
1617    EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
1618    EXPECT_EQ(zeros_to_fill, put_buffer_nframes);
1619  }
1620  
TEST(IoDev,PrepareOutputBeforeWriteSamples)1621  TEST(IoDev, PrepareOutputBeforeWriteSamples) {
1622    struct cras_iodev iodev;
1623    struct cras_audio_format fmt;
1624    unsigned int min_cb_level = 240;
1625    int rc;
1626    struct cras_rstream rstream1;
1627    struct dev_stream stream1;
1628    struct cras_iodev_info info;
1629  
1630    memset(&info, 0, sizeof(info));
1631  
1632    ResetStubData();
1633  
1634    rstream1.cb_threshold = min_cb_level;
1635    stream1.stream = &rstream1;
1636    stream1.is_running = 1;
1637  
1638    memset(&iodev, 0, sizeof(iodev));
1639  
1640    fmt.format = SND_PCM_FORMAT_S16_LE;
1641    fmt.frame_rate = 48000;
1642    fmt.num_channels = 2;
1643    iodev.format = &fmt;
1644    iodev.format = &fmt;
1645    iodev.min_cb_level = min_cb_level;
1646    iodev.get_buffer = get_buffer;
1647    iodev.put_buffer = put_buffer;
1648    iodev.frames_queued = frames_queued;
1649    iodev.min_buffer_level = 0;
1650    iodev.direction = CRAS_STREAM_OUTPUT;
1651    iodev.buffer_size = BUFFER_SIZE;
1652    iodev.no_stream = no_stream;
1653    iodev.configure_dev = configure_dev;
1654    iodev.start = fake_start;
1655    iodev.info = info;
1656    iodev_buffer_size = BUFFER_SIZE;
1657  
1658    // Open device.
1659    cras_iodev_open(&iodev, rstream1.cb_threshold, &fmt);
1660  
1661    // Add one stream to device.
1662    cras_iodev_add_stream(&iodev, &stream1);
1663  
1664    // Case 1: Assume device is not started yet.
1665    iodev.state = CRAS_IODEV_STATE_OPEN;
1666    // Assume sample is not ready yet.
1667    dev_stream_playback_frames_ret = 0;
1668  
1669    rc = cras_iodev_prepare_output_before_write_samples(&iodev);
1670  
1671    EXPECT_EQ(0, rc);
1672    // Device should remain in open state.
1673    EXPECT_EQ(CRAS_IODEV_STATE_OPEN, iodev.state);
1674    EXPECT_EQ(0, no_stream_called);
1675  
1676    // Assume now sample is ready.
1677    dev_stream_playback_frames_ret = 100;
1678  
1679    rc = cras_iodev_prepare_output_before_write_samples(&iodev);
1680  
1681    EXPECT_EQ(0, rc);
1682    // Device should enter normal run state.
1683    EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
1684    EXPECT_EQ(0, no_stream_called);
1685    // Need to fill 1 callback level of zeros;
1686    EXPECT_EQ(min_cb_level, put_buffer_nframes);
1687  
1688    ResetStubData();
1689  
1690    // Case 2: Assume device is started and is in no stream state.
1691    iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
1692    // Sample is not ready yet.
1693    dev_stream_playback_frames_ret = 0;
1694  
1695    rc = cras_iodev_prepare_output_before_write_samples(&iodev);
1696  
1697    EXPECT_EQ(0, rc);
1698    // Device should remain in no_stream state.
1699    EXPECT_EQ(CRAS_IODEV_STATE_NO_STREAM_RUN, iodev.state);
1700    // Device in no_stream state should call no_stream ops once.
1701    EXPECT_EQ(1, no_stream_called);
1702    EXPECT_EQ(1, no_stream_enable);
1703  
1704    // Assume now sample is ready.
1705    dev_stream_playback_frames_ret = 100;
1706  
1707    rc = cras_iodev_prepare_output_before_write_samples(&iodev);
1708  
1709    EXPECT_EQ(0, rc);
1710    // Device should enter normal run state.
1711    EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
1712    // Device should call no_stream ops with enable=0 to leave no stream state.
1713    EXPECT_EQ(2, no_stream_called);
1714    EXPECT_EQ(0, no_stream_enable);
1715  
1716    ResetStubData();
1717  
1718    // Case 3: Assume device is started and is in normal run state.
1719    iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
1720  
1721    rc = cras_iodev_prepare_output_before_write_samples(&iodev);
1722  
1723    EXPECT_EQ(0, rc);
1724    // Device should remain in normal run state.
1725    EXPECT_EQ(CRAS_IODEV_STATE_NORMAL_RUN, iodev.state);
1726    // Device in no_stream state should call no_stream ops once.
1727    EXPECT_EQ(0, no_stream_called);
1728  
1729    ResetStubData();
1730  
1731    // Test for device with ramp. Device should start ramping
1732    // when sample is ready.
1733  
1734    // Assume device has ramp member.
1735    iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
1736    iodev.initial_ramp_request = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
1737    // Case 4.1: Assume device with ramp is started and is in no stream state.
1738    iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
1739    // Assume sample is ready.
1740    dev_stream_playback_frames_ret = 100;
1741  
1742    rc = cras_iodev_prepare_output_before_write_samples(&iodev);
1743  
1744    // Device should start ramping up without setting mute callback.
1745    EXPECT_EQ(0, rc);
1746    EXPECT_EQ(1, cras_ramp_start_is_called);
1747    EXPECT_EQ(1, cras_ramp_start_mute_ramp);
1748    EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
1749    EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
1750    EXPECT_EQ(fmt.frame_rate * RAMP_NEW_STREAM_DURATION_SECS,
1751              cras_ramp_start_duration_frames);
1752    EXPECT_EQ(NULL, cras_ramp_start_cb);
1753    EXPECT_EQ(NULL, cras_ramp_start_cb_data);
1754  
1755    ResetStubData();
1756  
1757    // Case 4.2: Assume device with ramp is started and is in no stream state.
1758    //           But system is muted.
1759    iodev.state = CRAS_IODEV_STATE_NO_STREAM_RUN;
1760    // Assume system is muted.
1761    cras_system_get_mute_return = 1;
1762    // Assume sample is ready.
1763    dev_stream_playback_frames_ret = 100;
1764  
1765    rc = cras_iodev_prepare_output_before_write_samples(&iodev);
1766  
1767    // Device should not start ramping up because system is muted.
1768    EXPECT_EQ(0, rc);
1769    EXPECT_EQ(0, cras_ramp_start_is_called);
1770  
1771    ResetStubData();
1772  
1773    // Case 5.1: Assume device with ramp is in open state.
1774    iodev.state = CRAS_IODEV_STATE_OPEN;
1775    // Assume sample is ready.
1776    dev_stream_playback_frames_ret = 100;
1777  
1778    rc = cras_iodev_prepare_output_before_write_samples(&iodev);
1779  
1780    // Device should start ramping up without setting mute callback.
1781    EXPECT_EQ(0, rc);
1782    EXPECT_EQ(1, cras_ramp_start_is_called);
1783    EXPECT_EQ(1, cras_ramp_start_mute_ramp);
1784    EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
1785    EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
1786    EXPECT_EQ(fmt.frame_rate * RAMP_NEW_STREAM_DURATION_SECS,
1787              cras_ramp_start_duration_frames);
1788    EXPECT_EQ(NULL, cras_ramp_start_cb);
1789    EXPECT_EQ(NULL, cras_ramp_start_cb_data);
1790  
1791    ResetStubData();
1792  
1793    // Case 5.2: Assume device with ramp is in open state. But system is muted.
1794    iodev.state = CRAS_IODEV_STATE_OPEN;
1795    // Assume system is muted.
1796    cras_system_get_mute_return = 1;
1797    // Assume sample is ready.
1798    dev_stream_playback_frames_ret = 100;
1799  
1800    rc = cras_iodev_prepare_output_before_write_samples(&iodev);
1801  
1802    // Device should not start ramping up because system is muted.
1803    EXPECT_EQ(0, rc);
1804    EXPECT_EQ(0, cras_ramp_start_is_called);
1805  }
1806  
TEST(IoDev,StartRampUp)1807  TEST(IoDev, StartRampUp) {
1808    struct cras_iodev iodev;
1809    int rc;
1810    struct cras_audio_format fmt;
1811    enum CRAS_IODEV_RAMP_REQUEST req;
1812    memset(&iodev, 0, sizeof(iodev));
1813  
1814    // Format will be used in cras_iodev_start_ramp to determine ramp duration.
1815    fmt.format = SND_PCM_FORMAT_S16_LE;
1816    fmt.frame_rate = 48000;
1817    fmt.num_channels = 2;
1818    iodev.format = &fmt;
1819  
1820    // Assume device has ramp member.
1821    iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
1822  
1823    // Case 1: Device is not opened yet.
1824    ResetStubData();
1825    iodev.state = CRAS_IODEV_STATE_CLOSE;
1826    req = CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE;
1827  
1828    rc = cras_iodev_start_ramp(&iodev, req);
1829  
1830    // Ramp request is ignored.
1831    EXPECT_EQ(0, rc);
1832    EXPECT_EQ(0, cras_ramp_start_is_called);
1833  
1834    // Case 2: Ramp up without mute.
1835    ResetStubData();
1836    iodev.state = CRAS_IODEV_STATE_OPEN;
1837    req = CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK;
1838  
1839    rc = cras_iodev_start_ramp(&iodev, req);
1840  
1841    // Device should start ramping up without setting mute callback.
1842    EXPECT_EQ(0, rc);
1843    EXPECT_EQ(1, cras_ramp_start_is_called);
1844    EXPECT_EQ(1, cras_ramp_start_mute_ramp);
1845    EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
1846    EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
1847    EXPECT_EQ(fmt.frame_rate * RAMP_NEW_STREAM_DURATION_SECS,
1848              cras_ramp_start_duration_frames);
1849    EXPECT_EQ(NULL, cras_ramp_start_cb);
1850    EXPECT_EQ(NULL, cras_ramp_start_cb_data);
1851  
1852    // Case 3: Ramp up for unmute.
1853    ResetStubData();
1854    iodev.state = CRAS_IODEV_STATE_OPEN;
1855    req = CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE;
1856  
1857    rc = cras_iodev_start_ramp(&iodev, req);
1858  
1859    // Device should start ramping up.
1860    EXPECT_EQ(0, rc);
1861    EXPECT_EQ(1, cras_ramp_start_is_called);
1862    EXPECT_EQ(1, cras_ramp_start_mute_ramp);
1863    EXPECT_FLOAT_EQ(0.0, cras_ramp_start_from);
1864    EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
1865    EXPECT_EQ(fmt.frame_rate * RAMP_UNMUTE_DURATION_SECS,
1866              cras_ramp_start_duration_frames);
1867    // Callback for unmute is not used.
1868    EXPECT_EQ(NULL, cras_ramp_start_cb);
1869    // Device mute state is set after ramping starts.
1870    EXPECT_EQ(1, cras_device_monitor_set_device_mute_state_called);
1871    EXPECT_EQ(iodev.info.idx, cras_device_monitor_set_device_mute_state_dev_idx);
1872  }
1873  
TEST(IoDev,StartRampDown)1874  TEST(IoDev, StartRampDown) {
1875    struct cras_iodev iodev;
1876    int rc;
1877    struct cras_audio_format fmt;
1878    enum CRAS_IODEV_RAMP_REQUEST req;
1879    memset(&iodev, 0, sizeof(iodev));
1880  
1881    // Format will be used in cras_iodev_start_ramp to determine ramp duration.
1882    fmt.format = SND_PCM_FORMAT_S16_LE;
1883    fmt.frame_rate = 48000;
1884    fmt.num_channels = 2;
1885    iodev.format = &fmt;
1886  
1887    // Assume device has ramp member.
1888    iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
1889  
1890    // Case 1: Device is not opened yet.
1891    ResetStubData();
1892    iodev.state = CRAS_IODEV_STATE_CLOSE;
1893    req = CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE;
1894  
1895    rc = cras_iodev_start_ramp(&iodev, req);
1896  
1897    // Ramp request is ignored.
1898    EXPECT_EQ(0, rc);
1899    EXPECT_EQ(0, cras_ramp_start_is_called);
1900  
1901    // Case 2: Ramp down for mute.
1902    ResetStubData();
1903    iodev.state = CRAS_IODEV_STATE_OPEN;
1904    req = CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE;
1905  
1906    rc = cras_iodev_start_ramp(&iodev, req);
1907  
1908    // Device should start ramping down with mute callback.
1909    EXPECT_EQ(0, rc);
1910    EXPECT_EQ(1, cras_ramp_start_is_called);
1911    EXPECT_EQ(1, cras_ramp_start_mute_ramp);
1912    EXPECT_FLOAT_EQ(1.0, cras_ramp_start_from);
1913    EXPECT_FLOAT_EQ(0.0, cras_ramp_start_to);
1914    EXPECT_EQ(fmt.frame_rate * RAMP_MUTE_DURATION_SECS,
1915              cras_ramp_start_duration_frames);
1916  
1917    // Device mute state is not set yet. It should wait for ramp to finish.
1918    EXPECT_EQ(0, cras_device_monitor_set_device_mute_state_called);
1919  
1920    // Assume the callback is set, and it is later called after ramp is done.
1921    // It should trigger cras_device_monitor_set_device_mute_state.
1922    cras_ramp_start_cb(cras_ramp_start_cb_data);
1923    EXPECT_EQ(1, cras_device_monitor_set_device_mute_state_called);
1924    EXPECT_EQ(iodev.info.idx, cras_device_monitor_set_device_mute_state_dev_idx);
1925  }
1926  
TEST(IoDev,StartVolumeRamp)1927  TEST(IoDev, StartVolumeRamp) {
1928    struct cras_ionode ionode;
1929    struct cras_iodev iodev;
1930    int rc;
1931    struct cras_audio_format fmt;
1932    int expected_frames;
1933    float ionode_softvol_scalers[101];
1934    memset(&iodev, 0, sizeof(iodev));
1935  
1936    // Format will be used in cras_iodev_start_ramp to determine ramp duration.
1937    fmt.format = SND_PCM_FORMAT_S16_LE;
1938    fmt.frame_rate = 48000;
1939    fmt.num_channels = 2;
1940    iodev.format = &fmt;
1941    expected_frames = fmt.frame_rate * RAMP_VOLUME_CHANGE_DURATION_SECS;
1942  
1943    // Assume device has ramp member.
1944    iodev.ramp = reinterpret_cast<struct cras_ramp*>(0x1);
1945  
1946    // Case 1: Device is not opened yet.
1947    ResetStubData();
1948    iodev.state = CRAS_IODEV_STATE_CLOSE;
1949    rc = cras_iodev_start_volume_ramp(&iodev, 30, 94);
1950  
1951    // Ramp request is ignored.
1952    EXPECT_EQ(0, rc);
1953    EXPECT_EQ(0, cras_ramp_start_is_called);
1954  
1955    // Case 2: Volumes are equal.
1956    ResetStubData();
1957    iodev.state = CRAS_IODEV_STATE_OPEN;
1958    rc = cras_iodev_start_volume_ramp(&iodev, 70, 70);
1959  
1960    // Ramp request is ignored.
1961    EXPECT_EQ(0, rc);
1962    EXPECT_EQ(0, cras_ramp_start_is_called);
1963  
1964    // Case 3: Ramp up, global scalers
1965    ResetStubData();
1966    iodev.state = CRAS_IODEV_STATE_OPEN;
1967    softvol_scalers[40] = 0.2;
1968    softvol_scalers[60] = 0.8;
1969  
1970    rc = cras_iodev_start_volume_ramp(&iodev, 40, 60);
1971  
1972    EXPECT_EQ(0, rc);
1973    EXPECT_EQ(1, cras_ramp_start_is_called);
1974    EXPECT_EQ(0, cras_ramp_start_mute_ramp);
1975    EXPECT_FLOAT_EQ(0.25, cras_ramp_start_from);
1976    EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
1977    EXPECT_EQ(expected_frames, cras_ramp_start_duration_frames);
1978    EXPECT_EQ(NULL, cras_ramp_start_cb);
1979    EXPECT_EQ(NULL, cras_ramp_start_cb_data);
1980  
1981    // Case 4: Ramp down, device saclers
1982    ResetStubData();
1983    iodev.state = CRAS_IODEV_STATE_OPEN;
1984  
1985    ionode_softvol_scalers[40] = 0.4;
1986    ionode_softvol_scalers[60] = 0.5;
1987    ionode.softvol_scalers = ionode_softvol_scalers;
1988    iodev.active_node = &ionode;
1989  
1990    rc = cras_iodev_start_volume_ramp(&iodev, 60, 40);
1991  
1992    EXPECT_EQ(0, rc);
1993    EXPECT_EQ(1, cras_ramp_start_is_called);
1994    EXPECT_EQ(0, cras_ramp_start_mute_ramp);
1995    EXPECT_FLOAT_EQ(1.25, cras_ramp_start_from);
1996    EXPECT_FLOAT_EQ(1.0, cras_ramp_start_to);
1997    EXPECT_EQ(expected_frames, cras_ramp_start_duration_frames);
1998    EXPECT_EQ(NULL, cras_ramp_start_cb);
1999    EXPECT_EQ(NULL, cras_ramp_start_cb_data);
2000  }
2001  
TEST(IoDev,OutputDeviceShouldWake)2002  TEST(IoDev, OutputDeviceShouldWake) {
2003    struct cras_iodev iodev;
2004    int rc;
2005  
2006    memset(&iodev, 0, sizeof(iodev));
2007  
2008    ResetStubData();
2009  
2010    // Device is not running. No need to wake for this device.
2011    iodev.state = CRAS_IODEV_STATE_OPEN;
2012    rc = cras_iodev_odev_should_wake(&iodev);
2013    EXPECT_EQ(0, rc);
2014  
2015    // Device is running. Need to wake for this device.
2016    iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
2017    rc = cras_iodev_odev_should_wake(&iodev);
2018    EXPECT_EQ(1, rc);
2019  
2020    // Device is running. Device has is_free_running ops.
2021    iodev.is_free_running = is_free_running;
2022    is_free_running_ret = 1;
2023    rc = cras_iodev_odev_should_wake(&iodev);
2024    EXPECT_EQ(0, rc);
2025  
2026    // Device is running. Device has is_free_running ops.
2027    is_free_running_ret = 0;
2028    rc = cras_iodev_odev_should_wake(&iodev);
2029    EXPECT_EQ(1, rc);
2030  
2031    // Ignore input device.
2032    iodev.direction = CRAS_STREAM_INPUT;
2033    rc = cras_iodev_odev_should_wake(&iodev);
2034    EXPECT_EQ(0, rc);
2035  }
2036  
TEST(IoDev,FramesToPlayInSleep)2037  TEST(IoDev, FramesToPlayInSleep) {
2038    struct cras_iodev iodev;
2039    struct cras_audio_format fmt;
2040    unsigned int min_cb_level = 512, hw_level;
2041    unsigned int got_hw_level, got_frames;
2042    struct timespec hw_tstamp;
2043    struct cras_rstream rstream;
2044    struct dev_stream stream;
2045  
2046    memset(&iodev, 0, sizeof(iodev));
2047    memset(&fmt, 0, sizeof(fmt));
2048    iodev.frames_queued = frames_queued;
2049    iodev.min_buffer_level = 0;
2050    iodev.direction = CRAS_STREAM_OUTPUT;
2051    iodev.buffer_size = BUFFER_SIZE;
2052    iodev.min_cb_level = min_cb_level;
2053    iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
2054    iodev.format = &fmt;
2055    fmt.frame_rate = 48000;
2056    rstream.cb_threshold = min_cb_level;
2057    stream.stream = &rstream;
2058  
2059    ResetStubData();
2060  
2061    cras_iodev_add_stream(&iodev, &stream);
2062    cras_iodev_start_stream(&iodev, &stream);
2063  
2064    // Device is running. There is at least one stream for this device
2065    // and there are frames waiting to be played. hw_level is greater
2066    // than min_cb_level.
2067    dev_stream_playback_frames_ret = 100;
2068    hw_level = min_cb_level + 50;
2069    fr_queued = hw_level;
2070    got_frames =
2071        cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
2072    EXPECT_EQ(got_hw_level, hw_level);
2073    EXPECT_EQ(got_frames, 50);
2074    dev_stream_playback_frames_ret = 0;
2075  
2076    // Device is running. There is at least one stream for this device.
2077    // hw_level is greater than min_cb_level.
2078    hw_level = min_cb_level + 50;
2079    fr_queued = hw_level;
2080    got_frames =
2081        cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
2082    EXPECT_EQ(got_hw_level, hw_level);
2083    EXPECT_EQ(got_frames, 514);
2084  
2085    // Device is running. There is at least one stream for this device.
2086    // hw_level is 2x greater than min_cb_level.
2087    hw_level = 2 * min_cb_level + 50;
2088    fr_queued = hw_level;
2089    got_frames =
2090        cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
2091    EXPECT_EQ(got_hw_level, hw_level);
2092    EXPECT_EQ(got_frames, 1026);
2093  
2094    // Device is running. There is at least one stream for this device.
2095    // hw_level is less than min_cb_level.
2096    hw_level = min_cb_level / 2;
2097    fr_queued = hw_level;
2098    got_frames =
2099        cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
2100    EXPECT_EQ(got_hw_level, hw_level);
2101    EXPECT_EQ(got_frames, 208);
2102  
2103    // Device is running. There is no stream for this device. The audio thread
2104    // will wake up until hw_level drops to DEV_NO_STREAM_WAKE_UP_LATEST_TIME,
2105    // which is defined as 5 milliseconds in cras_iodev.c.
2106    iodev.streams = NULL;
2107    hw_level = min_cb_level;
2108    fr_queued = hw_level;
2109    got_frames =
2110        cras_iodev_frames_to_play_in_sleep(&iodev, &got_hw_level, &hw_tstamp);
2111    EXPECT_EQ(got_hw_level, hw_level);
2112    EXPECT_EQ(got_frames, hw_level - fmt.frame_rate / 1000 * 5);
2113  }
2114  
TEST(IoDev,GetNumUnderruns)2115  TEST(IoDev, GetNumUnderruns) {
2116    struct cras_iodev iodev;
2117    memset(&iodev, 0, sizeof(iodev));
2118  
2119    EXPECT_EQ(0, cras_iodev_get_num_underruns(&iodev));
2120  
2121    iodev.num_underruns = 10;
2122    EXPECT_EQ(10, cras_iodev_get_num_underruns(&iodev));
2123  }
2124  
TEST(IoDev,RequestReset)2125  TEST(IoDev, RequestReset) {
2126    struct cras_iodev iodev;
2127    memset(&iodev, 0, sizeof(iodev));
2128  
2129    ResetStubData();
2130  
2131    iodev.configure_dev = configure_dev;
2132    iodev.direction = CRAS_STREAM_OUTPUT;
2133    iodev.format = &audio_fmt;
2134    iodev.get_buffer = get_buffer;
2135    iodev.put_buffer = put_buffer;
2136  
2137    iodev.state = CRAS_IODEV_STATE_CLOSE;
2138    iodev_buffer_size = 1024;
2139  
2140    // Open device.
2141    cras_iodev_open(&iodev, 240, &audio_fmt);
2142  
2143    // The first reset request works.
2144    EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
2145    EXPECT_EQ(1, device_monitor_reset_device_called);
2146  
2147    // The second reset request will do nothing.
2148    EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
2149    EXPECT_EQ(1, device_monitor_reset_device_called);
2150  
2151    // Assume device is opened again.
2152    cras_iodev_open(&iodev, 240, &audio_fmt);
2153  
2154    // The reset request works.
2155    EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
2156    EXPECT_EQ(2, device_monitor_reset_device_called);
2157  }
2158  
output_underrun(struct cras_iodev * iodev)2159  static int output_underrun(struct cras_iodev* iodev) {
2160    output_underrun_called++;
2161    return 0;
2162  }
2163  
TEST(IoDev,HandleOutputUnderrun)2164  TEST(IoDev, HandleOutputUnderrun) {
2165    struct cras_iodev iodev;
2166    struct cras_audio_format fmt;
2167    unsigned int frames = 240;
2168    int16_t* zeros;
2169    int rc;
2170  
2171    ResetStubData();
2172  
2173    memset(&iodev, 0, sizeof(iodev));
2174    fmt.format = SND_PCM_FORMAT_S16_LE;
2175    fmt.frame_rate = 48000;
2176    fmt.num_channels = 2;
2177    iodev.format = &fmt;
2178    iodev.get_buffer = get_buffer;
2179    iodev.put_buffer = put_buffer;
2180    iodev.direction = CRAS_STREAM_OUTPUT;
2181    iodev.min_cb_level = frames;
2182  
2183    // Default case, fill one block of zeros.
2184    EXPECT_EQ(0, cras_iodev_output_underrun(&iodev, 0, 0));
2185  
2186    EXPECT_EQ(frames, put_buffer_nframes);
2187    zeros = (int16_t*)calloc(frames * 2, sizeof(*zeros));
2188    rc = memcmp(audio_buffer, zeros, frames * 2 * 2);
2189    free(zeros);
2190    EXPECT_EQ(0, rc);
2191  
2192    // Test iodev has output_underrun ops.
2193    iodev.output_underrun = output_underrun;
2194    EXPECT_EQ(0, cras_iodev_output_underrun(&iodev, 0, 0));
2195    EXPECT_EQ(1, output_underrun_called);
2196  }
2197  
ext_mod_configure(struct ext_dsp_module * ext,unsigned int buffer_size,unsigned int num_channels,unsigned int rate)2198  static void ext_mod_configure(struct ext_dsp_module* ext,
2199                                unsigned int buffer_size,
2200                                unsigned int num_channels,
2201                                unsigned int rate) {
2202    ext_mod_configure_called++;
2203  }
2204  
TEST(IoDev,SetExtDspMod)2205  TEST(IoDev, SetExtDspMod) {
2206    struct cras_iodev iodev;
2207    struct cras_audio_format fmt;
2208    struct ext_dsp_module ext;
2209  
2210    ResetStubData();
2211  
2212    memset(&iodev, 0, sizeof(iodev));
2213    fmt.format = SND_PCM_FORMAT_S16_LE;
2214    fmt.frame_rate = 48000;
2215    fmt.num_channels = 2;
2216    iodev.configure_dev = configure_dev;
2217    iodev.format = &fmt;
2218    iodev.format = &fmt;
2219    iodev.state = CRAS_IODEV_STATE_CLOSE;
2220    ext.configure = ext_mod_configure;
2221  
2222    iodev.dsp_context = reinterpret_cast<cras_dsp_context*>(0xf0f);
2223    cras_dsp_get_pipeline_ret = 0x25;
2224  
2225    cras_iodev_set_ext_dsp_module(&iodev, &ext);
2226    EXPECT_EQ(0, ext_mod_configure_called);
2227  
2228    cras_iodev_open(&iodev, 240, &fmt);
2229    EXPECT_EQ(1, ext_mod_configure_called);
2230    EXPECT_EQ(1, cras_dsp_get_pipeline_called);
2231    EXPECT_EQ(1, cras_dsp_pipeline_set_sink_ext_module_called);
2232  
2233    cras_iodev_set_ext_dsp_module(&iodev, NULL);
2234    EXPECT_EQ(1, ext_mod_configure_called);
2235    EXPECT_EQ(2, cras_dsp_get_pipeline_called);
2236    EXPECT_EQ(2, cras_dsp_pipeline_set_sink_ext_module_called);
2237  
2238    cras_iodev_set_ext_dsp_module(&iodev, &ext);
2239    EXPECT_EQ(2, ext_mod_configure_called);
2240    EXPECT_EQ(3, cras_dsp_get_pipeline_called);
2241    EXPECT_EQ(3, cras_dsp_pipeline_set_sink_ext_module_called);
2242  
2243    /* If pipeline doesn't exist, mock pipeline should be loaded. */
2244    cras_dsp_get_pipeline_ret = 0x0;
2245    cras_iodev_set_ext_dsp_module(&iodev, &ext);
2246    EXPECT_EQ(3, ext_mod_configure_called);
2247    EXPECT_EQ(5, cras_dsp_get_pipeline_called);
2248    EXPECT_EQ(1, cras_dsp_load_mock_pipeline_called);
2249    EXPECT_EQ(4, cras_dsp_pipeline_set_sink_ext_module_called);
2250  }
2251  
TEST(IoDev,InputDspOffset)2252  TEST(IoDev, InputDspOffset) {
2253    struct cras_iodev iodev;
2254    struct cras_audio_format fmt;
2255    struct cras_rstream rstream1;
2256    struct dev_stream stream1;
2257    struct input_data data;
2258    unsigned int frames = 240;
2259    int rc;
2260  
2261    ResetStubData();
2262  
2263    rstream1.cb_threshold = 240;
2264    rstream1.stream_id = 123;
2265    stream1.stream = &rstream1;
2266  
2267    memset(&iodev, 0, sizeof(iodev));
2268    fmt.format = SND_PCM_FORMAT_S16_LE;
2269    fmt.frame_rate = 48000;
2270    fmt.num_channels = 2;
2271    iodev.configure_dev = configure_dev;
2272    iodev.format = &fmt;
2273    iodev.format = &fmt;
2274    iodev.state = CRAS_IODEV_STATE_CLOSE;
2275    iodev.get_buffer = get_buffer;
2276    iodev.put_buffer = put_buffer;
2277    iodev.direction = CRAS_STREAM_INPUT;
2278    iodev.buffer_size = 480;
2279  
2280    iodev.dsp_context = reinterpret_cast<cras_dsp_context*>(0xf0f);
2281    cras_dsp_get_pipeline_ret = 0x25;
2282    input_data_create_ret = &data;
2283  
2284    cras_iodev_open(&iodev, 240, &fmt);
2285  
2286    cras_iodev_add_stream(&iodev, &stream1);
2287    cras_iodev_get_input_buffer(&iodev, &frames);
2288  
2289    buffer_share_get_new_write_point_ret = 100;
2290    rc = cras_iodev_put_input_buffer(&iodev);
2291    EXPECT_EQ(140, iodev.input_dsp_offset);
2292    EXPECT_EQ(100, rc);
2293  
2294    frames = 130;
2295    cras_iodev_get_input_buffer(&iodev, &frames);
2296    EXPECT_EQ(130, iodev.input_frames_read);
2297  
2298    buffer_share_get_new_write_point_ret = 80;
2299    rc = cras_iodev_put_input_buffer(&iodev);
2300    EXPECT_EQ(60, iodev.input_dsp_offset);
2301    EXPECT_EQ(80, rc);
2302  }
2303  
TEST(IoDev,DropDeviceFramesByTime)2304  TEST(IoDev, DropDeviceFramesByTime) {
2305    struct cras_iodev iodev;
2306    struct cras_audio_format fmt;
2307    struct input_data data;
2308    struct timespec ts;
2309    int rc;
2310  
2311    ResetStubData();
2312  
2313    memset(&iodev, 0, sizeof(iodev));
2314    fmt.format = SND_PCM_FORMAT_S16_LE;
2315    fmt.frame_rate = 48000;
2316    fmt.num_channels = 2;
2317    iodev.configure_dev = configure_dev;
2318    iodev.format = &fmt;
2319    iodev.state = CRAS_IODEV_STATE_CLOSE;
2320    iodev.get_buffer = get_buffer;
2321    iodev.put_buffer = put_buffer;
2322    iodev.frames_queued = frames_queued;
2323    iodev.direction = CRAS_STREAM_INPUT;
2324    iodev.buffer_size = 480;
2325    input_data_create_ret = &data;
2326    cras_iodev_open(&iodev, 240, &fmt);
2327    rate_estimator_get_rate_ret = 48000.0;
2328  
2329    /* hw_level: 240, drop: 48(1ms). */
2330    fr_queued = 240;
2331    ts.tv_sec = 0;
2332    ts.tv_nsec = 1000000;
2333    rc = cras_iodev_drop_frames_by_time(&iodev, ts);
2334    EXPECT_EQ(48, rc);
2335    EXPECT_EQ(48, put_buffer_nframes);
2336    EXPECT_EQ(1, rate_estimator_add_frames_called);
2337    EXPECT_EQ(-48, rate_estimator_add_frames_num_frames);
2338  
2339    /* hw_level: 360, drop: 240(5ms). */
2340    fr_queued = 360;
2341    ts.tv_sec = 0;
2342    ts.tv_nsec = 5000000;
2343    rc = cras_iodev_drop_frames_by_time(&iodev, ts);
2344    EXPECT_EQ(240, rc);
2345    EXPECT_EQ(240, put_buffer_nframes);
2346    EXPECT_EQ(2, rate_estimator_add_frames_called);
2347    EXPECT_EQ(-240, rate_estimator_add_frames_num_frames);
2348  
2349    /* hw_level: 360, drop: 480(10ms). Only drop 360 because of lower hw_level. */
2350    fr_queued = 360;
2351    ts.tv_sec = 0;
2352    ts.tv_nsec = 10000000;
2353    rc = cras_iodev_drop_frames_by_time(&iodev, ts);
2354    EXPECT_EQ(360, rc);
2355    EXPECT_EQ(360, put_buffer_nframes);
2356    EXPECT_EQ(3, rate_estimator_add_frames_called);
2357    EXPECT_EQ(-360, rate_estimator_add_frames_num_frames);
2358  }
2359  
TEST(IoDev,AecUseCaseCheck)2360  TEST(IoDev, AecUseCaseCheck) {
2361    struct cras_ionode node;
2362  
2363    /* test output types */
2364    node.type = CRAS_NODE_TYPE_INTERNAL_SPEAKER;
2365    EXPECT_EQ(1, cras_iodev_is_aec_use_case(&node));
2366    node.type = CRAS_NODE_TYPE_HEADPHONE;
2367    EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
2368    node.type = CRAS_NODE_TYPE_HDMI;
2369    EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
2370    node.type = CRAS_NODE_TYPE_USB;
2371    EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
2372    node.type = CRAS_NODE_TYPE_BLUETOOTH;
2373    EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
2374  
2375    /* test mic positions */
2376    node.type = CRAS_NODE_TYPE_MIC;
2377    node.position = NODE_POSITION_INTERNAL;
2378    EXPECT_EQ(1, cras_iodev_is_aec_use_case(&node));
2379    node.position = NODE_POSITION_FRONT;
2380    EXPECT_EQ(1, cras_iodev_is_aec_use_case(&node));
2381    node.position = NODE_POSITION_EXTERNAL;
2382    EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
2383    node.position = NODE_POSITION_REAR;
2384    EXPECT_EQ(0, cras_iodev_is_aec_use_case(&node));
2385  }
2386  
TEST(IoDev,DeviceOverrun)2387  TEST(IoDev, DeviceOverrun) {
2388    struct cras_iodev iodev;
2389  
2390    iodev.buffer_size = 4096;
2391    iodev.largest_cb_level = 2048;
2392    cras_iodev_update_highest_hw_level(&iodev, 4096);
2393    EXPECT_EQ(0, cras_audio_thread_event_dev_overrun_called);
2394  
2395    iodev.largest_cb_level = 1024;
2396    iodev.highest_hw_level = 1024;
2397    cras_iodev_update_highest_hw_level(&iodev, 2048);
2398    EXPECT_EQ(0, cras_audio_thread_event_dev_overrun_called);
2399  
2400    cras_iodev_update_highest_hw_level(&iodev, 4096);
2401    EXPECT_EQ(1, cras_audio_thread_event_dev_overrun_called);
2402  
2403    cras_iodev_update_highest_hw_level(&iodev, 4096);
2404    EXPECT_EQ(1, cras_audio_thread_event_dev_overrun_called);
2405  }
2406  
TEST(IoDev,OnInternalCard)2407  TEST(IoDev, OnInternalCard) {
2408    static struct cras_ionode node;
2409    node.type = CRAS_NODE_TYPE_INTERNAL_SPEAKER;
2410    EXPECT_EQ(1, cras_iodev_is_on_internal_card(&node));
2411    node.type = CRAS_NODE_TYPE_HEADPHONE;
2412    EXPECT_EQ(1, cras_iodev_is_on_internal_card(&node));
2413    node.type = CRAS_NODE_TYPE_MIC;
2414    EXPECT_EQ(1, cras_iodev_is_on_internal_card(&node));
2415    node.type = CRAS_NODE_TYPE_USB;
2416    EXPECT_EQ(0, cras_iodev_is_on_internal_card(&node));
2417    node.type = CRAS_NODE_TYPE_BLUETOOTH;
2418    EXPECT_EQ(0, cras_iodev_is_on_internal_card(&node));
2419  }
2420  
2421  extern "C" {
2422  
2423  struct main_thread_event_log* main_log;
2424  
2425  //  From libpthread.
pthread_create(pthread_t * thread,const pthread_attr_t * attr,void * (* start_routine)(void *),void * arg)2426  int pthread_create(pthread_t* thread,
2427                     const pthread_attr_t* attr,
2428                     void* (*start_routine)(void*),
2429                     void* arg) {
2430    return 0;
2431  }
2432  
pthread_join(pthread_t thread,void ** value_ptr)2433  int pthread_join(pthread_t thread, void** value_ptr) {
2434    return 0;
2435  }
2436  
2437  // Fromt fmt_conv
cras_channel_remix_convert(struct cras_fmt_conv * conv,uint8_t * in_buf,size_t frames)2438  void cras_channel_remix_convert(struct cras_fmt_conv* conv,
2439                                  uint8_t* in_buf,
2440                                  size_t frames) {}
2441  
cras_fmt_conv_in_frames_to_out(struct cras_fmt_conv * conv,size_t in_frames)2442  size_t cras_fmt_conv_in_frames_to_out(struct cras_fmt_conv* conv,
2443                                        size_t in_frames) {
2444    return in_frames;
2445  }
2446  
2447  // From buffer_share
buffer_share_create(unsigned int buf_sz)2448  struct buffer_share* buffer_share_create(unsigned int buf_sz) {
2449    return NULL;
2450  }
2451  
buffer_share_destroy(struct buffer_share * mix)2452  void buffer_share_destroy(struct buffer_share* mix) {}
2453  
buffer_share_offset_update(struct buffer_share * mix,unsigned int id,unsigned int frames)2454  int buffer_share_offset_update(struct buffer_share* mix,
2455                                 unsigned int id,
2456                                 unsigned int frames) {
2457    return 0;
2458  }
2459  
buffer_share_get_new_write_point(struct buffer_share * mix)2460  unsigned int buffer_share_get_new_write_point(struct buffer_share* mix) {
2461    return buffer_share_get_new_write_point_ret;
2462  }
2463  
buffer_share_add_id(struct buffer_share * mix,unsigned int id,void * data)2464  int buffer_share_add_id(struct buffer_share* mix, unsigned int id, void* data) {
2465    buffer_share_add_id_called++;
2466    return 0;
2467  }
2468  
buffer_share_rm_id(struct buffer_share * mix,unsigned int id)2469  int buffer_share_rm_id(struct buffer_share* mix, unsigned int id) {
2470    return 0;
2471  }
2472  
buffer_share_id_offset(const struct buffer_share * mix,unsigned int id)2473  unsigned int buffer_share_id_offset(const struct buffer_share* mix,
2474                                      unsigned int id) {
2475    return 0;
2476  }
2477  
2478  // From cras_system_state.
cras_system_state_stream_added(enum CRAS_STREAM_DIRECTION direction,enum CRAS_CLIENT_TYPE client_type)2479  void cras_system_state_stream_added(enum CRAS_STREAM_DIRECTION direction,
2480                                      enum CRAS_CLIENT_TYPE client_type) {}
2481  
cras_system_state_stream_removed(enum CRAS_STREAM_DIRECTION direction,enum CRAS_CLIENT_TYPE client_type)2482  void cras_system_state_stream_removed(enum CRAS_STREAM_DIRECTION direction,
2483                                        enum CRAS_CLIENT_TYPE client_type) {}
2484  
2485  // From cras_dsp
cras_dsp_context_new(int sample_rate,const char * purpose)2486  struct cras_dsp_context* cras_dsp_context_new(int sample_rate,
2487                                                const char* purpose) {
2488    dsp_context_new_sample_rate = sample_rate;
2489    dsp_context_new_purpose = purpose;
2490    return cras_dsp_context_new_return;
2491  }
2492  
cras_dsp_context_free(struct cras_dsp_context * ctx)2493  void cras_dsp_context_free(struct cras_dsp_context* ctx) {
2494    dsp_context_free_called++;
2495  }
2496  
cras_dsp_load_pipeline(struct cras_dsp_context * ctx)2497  void cras_dsp_load_pipeline(struct cras_dsp_context* ctx) {}
cras_dsp_load_mock_pipeline(struct cras_dsp_context * ctx,unsigned int num_channels)2498  void cras_dsp_load_mock_pipeline(struct cras_dsp_context* ctx,
2499                                   unsigned int num_channels) {
2500    cras_dsp_load_mock_pipeline_called++;
2501  }
2502  
cras_dsp_set_variable_string(struct cras_dsp_context * ctx,const char * key,const char * value)2503  void cras_dsp_set_variable_string(struct cras_dsp_context* ctx,
2504                                    const char* key,
2505                                    const char* value) {}
2506  
cras_dsp_set_variable_boolean(struct cras_dsp_context * ctx,const char * key,char value)2507  void cras_dsp_set_variable_boolean(struct cras_dsp_context* ctx,
2508                                     const char* key,
2509                                     char value) {}
2510  
cras_dsp_get_pipeline(struct cras_dsp_context * ctx)2511  struct pipeline* cras_dsp_get_pipeline(struct cras_dsp_context* ctx) {
2512    cras_dsp_get_pipeline_called++;
2513    return reinterpret_cast<struct pipeline*>(cras_dsp_get_pipeline_ret);
2514  }
2515  
cras_dsp_put_pipeline(struct cras_dsp_context * ctx)2516  void cras_dsp_put_pipeline(struct cras_dsp_context* ctx) {
2517    cras_dsp_put_pipeline_called++;
2518  }
2519  
cras_dsp_pipeline_get_source_buffer(struct pipeline * pipeline,int index)2520  float* cras_dsp_pipeline_get_source_buffer(struct pipeline* pipeline,
2521                                             int index) {
2522    cras_dsp_pipeline_get_source_buffer_called++;
2523    return cras_dsp_pipeline_source_buffer[index];
2524  }
2525  
cras_dsp_pipeline_get_sink_buffer(struct pipeline * pipeline,int index)2526  float* cras_dsp_pipeline_get_sink_buffer(struct pipeline* pipeline, int index) {
2527    cras_dsp_pipeline_get_sink_buffer_called++;
2528    return cras_dsp_pipeline_sink_buffer[index];
2529  }
2530  
cras_dsp_pipeline_get_delay(struct pipeline * pipeline)2531  int cras_dsp_pipeline_get_delay(struct pipeline* pipeline) {
2532    cras_dsp_pipeline_get_delay_called++;
2533    return 0;
2534  }
2535  
cras_dsp_pipeline_apply(struct pipeline * pipeline,uint8_t * buf,snd_pcm_format_t format,unsigned int frames)2536  int cras_dsp_pipeline_apply(struct pipeline* pipeline,
2537                              uint8_t* buf,
2538                              snd_pcm_format_t format,
2539                              unsigned int frames) {
2540    cras_dsp_pipeline_apply_called++;
2541    cras_dsp_pipeline_apply_sample_count = frames;
2542    return 0;
2543  }
2544  
cras_dsp_pipeline_add_statistic(struct pipeline * pipeline,const struct timespec * time_delta,int samples)2545  void cras_dsp_pipeline_add_statistic(struct pipeline* pipeline,
2546                                       const struct timespec* time_delta,
2547                                       int samples) {}
cras_dsp_pipeline_set_sink_ext_module(struct pipeline * pipeline,struct ext_dsp_module * ext_module)2548  void cras_dsp_pipeline_set_sink_ext_module(struct pipeline* pipeline,
2549                                             struct ext_dsp_module* ext_module) {
2550    cras_dsp_pipeline_set_sink_ext_module_called++;
2551  }
2552  
cras_dsp_num_output_channels(const struct cras_dsp_context * ctx)2553  unsigned int cras_dsp_num_output_channels(const struct cras_dsp_context* ctx) {
2554    return cras_dsp_num_output_channels_return;
2555  }
2556  
cras_dsp_num_input_channels(const struct cras_dsp_context * ctx)2557  unsigned int cras_dsp_num_input_channels(const struct cras_dsp_context* ctx) {
2558    return cras_dsp_num_input_channels_return;
2559  }
2560  
2561  // From audio thread
audio_thread_post_message(struct audio_thread * thread,struct audio_thread_msg * msg)2562  int audio_thread_post_message(struct audio_thread* thread,
2563                                struct audio_thread_msg* msg) {
2564    return 0;
2565  }
2566  
cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,cras_node_id_t node_id)2567  void cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,
2568                                   cras_node_id_t node_id) {
2569    select_node_called++;
2570    select_node_direction = direction;
2571    select_node_id = node_id;
2572  }
2573  
cras_iodev_list_node_selected(struct cras_ionode * node)2574  int cras_iodev_list_node_selected(struct cras_ionode* node) {
2575    return node == node_selected;
2576  }
2577  
cras_iodev_list_disable_dev(struct cras_iodev * dev)2578  void cras_iodev_list_disable_dev(struct cras_iodev* dev) {
2579    cras_iodev_list_disable_dev_called++;
2580  }
2581  
cras_iodev_list_notify_nodes_changed()2582  void cras_iodev_list_notify_nodes_changed() {
2583    notify_nodes_changed_called++;
2584  }
2585  
cras_iodev_list_notify_active_node_changed(enum CRAS_STREAM_DIRECTION direction)2586  void cras_iodev_list_notify_active_node_changed(
2587      enum CRAS_STREAM_DIRECTION direction) {
2588    notify_active_node_changed_called++;
2589  }
2590  
cras_audio_area_create(int num_channels)2591  struct cras_audio_area* cras_audio_area_create(int num_channels) {
2592    return NULL;
2593  }
2594  
cras_audio_area_destroy(struct cras_audio_area * area)2595  void cras_audio_area_destroy(struct cras_audio_area* area) {}
2596  
cras_audio_area_config_channels(struct cras_audio_area * area,const struct cras_audio_format * fmt)2597  void cras_audio_area_config_channels(struct cras_audio_area* area,
2598                                       const struct cras_audio_format* fmt) {}
2599  
cras_audio_format_set_channel_layout(struct cras_audio_format * format,const int8_t layout[CRAS_CH_MAX])2600  int cras_audio_format_set_channel_layout(struct cras_audio_format* format,
2601                                           const int8_t layout[CRAS_CH_MAX]) {
2602    int i;
2603    cras_audio_format_set_channel_layout_called++;
2604    for (i = 0; i < CRAS_CH_MAX; i++)
2605      format->channel_layout[i] = layout[i];
2606    return 0;
2607  }
2608  
softvol_get_scaler(unsigned int volume_index)2609  float softvol_get_scaler(unsigned int volume_index) {
2610    return softvol_scalers[volume_index];
2611  }
2612  
cras_system_get_volume()2613  size_t cras_system_get_volume() {
2614    return cras_system_get_volume_return;
2615  }
2616  
cras_system_get_mute()2617  int cras_system_get_mute() {
2618    return cras_system_get_mute_return;
2619  }
2620  
cras_system_get_capture_mute()2621  int cras_system_get_capture_mute() {
2622    return 0;
2623  }
2624  
cras_scale_buffer(snd_pcm_format_t fmt,uint8_t * buffer,unsigned int count,float scaler)2625  void cras_scale_buffer(snd_pcm_format_t fmt,
2626                         uint8_t* buffer,
2627                         unsigned int count,
2628                         float scaler) {
2629    cras_scale_buffer_called++;
2630    cras_scale_buffer_fmt = fmt;
2631    cras_scale_buffer_scaler = scaler;
2632  }
2633  
cras_scale_buffer_increment(snd_pcm_format_t fmt,uint8_t * buff,unsigned int frame,float scaler,float increment,float target,int channel)2634  void cras_scale_buffer_increment(snd_pcm_format_t fmt,
2635                                   uint8_t* buff,
2636                                   unsigned int frame,
2637                                   float scaler,
2638                                   float increment,
2639                                   float target,
2640                                   int channel) {
2641    cras_scale_buffer_increment_fmt = fmt;
2642    cras_scale_buffer_increment_buff = buff;
2643    cras_scale_buffer_increment_frame = frame;
2644    cras_scale_buffer_increment_scaler = scaler;
2645    cras_scale_buffer_increment_increment = increment;
2646    cras_scale_buffer_increment_target = target;
2647    cras_scale_buffer_increment_channel = channel;
2648  }
2649  
cras_mix_mute_buffer(uint8_t * dst,size_t frame_bytes,size_t count)2650  size_t cras_mix_mute_buffer(uint8_t* dst, size_t frame_bytes, size_t count) {
2651    cras_mix_mute_count = count;
2652    return count;
2653  }
2654  
rate_estimator_create(unsigned int rate,const struct timespec * window_size,double smooth_factor)2655  struct rate_estimator* rate_estimator_create(unsigned int rate,
2656                                               const struct timespec* window_size,
2657                                               double smooth_factor) {
2658    return NULL;
2659  }
2660  
rate_estimator_destroy(struct rate_estimator * re)2661  void rate_estimator_destroy(struct rate_estimator* re) {}
2662  
rate_estimator_add_frames(struct rate_estimator * re,int fr)2663  void rate_estimator_add_frames(struct rate_estimator* re, int fr) {
2664    rate_estimator_add_frames_called++;
2665    rate_estimator_add_frames_num_frames = fr;
2666  }
2667  
rate_estimator_check(struct rate_estimator * re,int level,struct timespec * now)2668  int rate_estimator_check(struct rate_estimator* re,
2669                           int level,
2670                           struct timespec* now) {
2671    return 0;
2672  }
2673  
rate_estimator_reset_rate(struct rate_estimator * re,unsigned int rate)2674  void rate_estimator_reset_rate(struct rate_estimator* re, unsigned int rate) {}
2675  
rate_estimator_get_rate(struct rate_estimator * re)2676  double rate_estimator_get_rate(struct rate_estimator* re) {
2677    return rate_estimator_get_rate_ret;
2678  }
2679  
dev_stream_cb_threshold(const struct dev_stream * dev_stream)2680  unsigned int dev_stream_cb_threshold(const struct dev_stream* dev_stream) {
2681    if (dev_stream->stream)
2682      return dev_stream->stream->cb_threshold;
2683    return 0;
2684  }
2685  
dev_stream_attached_devs(const struct dev_stream * dev_stream)2686  int dev_stream_attached_devs(const struct dev_stream* dev_stream) {
2687    return 1;
2688  }
2689  
dev_stream_update_frames(const struct dev_stream * dev_stream)2690  void dev_stream_update_frames(const struct dev_stream* dev_stream) {}
2691  
dev_stream_playback_frames(const struct dev_stream * dev_stream)2692  int dev_stream_playback_frames(const struct dev_stream* dev_stream) {
2693    return dev_stream_playback_frames_ret;
2694  }
2695  
cras_device_monitor_reset_device(struct cras_iodev * iodev)2696  int cras_device_monitor_reset_device(struct cras_iodev* iodev) {
2697    device_monitor_reset_device_called++;
2698    return 0;
2699  }
2700  
cras_ramp_destroy(struct cras_ramp * ramp)2701  void cras_ramp_destroy(struct cras_ramp* ramp) {
2702    return;
2703  }
2704  
cras_ramp_start(struct cras_ramp * ramp,int mute_ramp,float from,float to,int duration_frames,cras_ramp_cb cb,void * cb_data)2705  int cras_ramp_start(struct cras_ramp* ramp,
2706                      int mute_ramp,
2707                      float from,
2708                      float to,
2709                      int duration_frames,
2710                      cras_ramp_cb cb,
2711                      void* cb_data) {
2712    cras_ramp_start_is_called++;
2713    cras_ramp_start_mute_ramp = mute_ramp;
2714    cras_ramp_start_from = from;
2715    cras_ramp_start_to = to;
2716    cras_ramp_start_duration_frames = duration_frames;
2717    cras_ramp_start_cb = cb;
2718    cras_ramp_start_cb_data = cb_data;
2719    return 0;
2720  }
2721  
cras_ramp_reset(struct cras_ramp * ramp)2722  int cras_ramp_reset(struct cras_ramp* ramp) {
2723    cras_ramp_reset_is_called++;
2724    return 0;
2725  }
2726  
cras_ramp_get_current_action(const struct cras_ramp * ramp)2727  struct cras_ramp_action cras_ramp_get_current_action(
2728      const struct cras_ramp* ramp) {
2729    return cras_ramp_get_current_action_ret;
2730  }
2731  
cras_ramp_update_ramped_frames(struct cras_ramp * ramp,int num_frames)2732  int cras_ramp_update_ramped_frames(struct cras_ramp* ramp, int num_frames) {
2733    cras_ramp_update_ramped_frames_num_frames = num_frames;
2734    return 0;
2735  }
2736  
cras_device_monitor_set_device_mute_state(unsigned int dev_idx)2737  int cras_device_monitor_set_device_mute_state(unsigned int dev_idx) {
2738    cras_device_monitor_set_device_mute_state_called++;
2739    cras_device_monitor_set_device_mute_state_dev_idx = dev_idx;
2740    return 0;
2741  }
2742  
mod_run(struct ext_dsp_module * ext,unsigned int nframes)2743  static void mod_run(struct ext_dsp_module* ext, unsigned int nframes) {}
2744  
mod_configure(struct ext_dsp_module * ext,unsigned int buffer_size,unsigned int num_channels,unsigned int rate)2745  static void mod_configure(struct ext_dsp_module* ext,
2746                            unsigned int buffer_size,
2747                            unsigned int num_channels,
2748                            unsigned int rate) {}
2749  
input_data_create(void * dev_ptr)2750  struct input_data* input_data_create(void* dev_ptr) {
2751    if (input_data_create_ret) {
2752      input_data_create_ret->ext.run = mod_run;
2753      input_data_create_ret->ext.configure = mod_configure;
2754    }
2755    return input_data_create_ret;
2756  }
2757  
input_data_destroy(struct input_data ** data)2758  void input_data_destroy(struct input_data** data) {}
input_data_set_all_streams_read(struct input_data * data,unsigned int nframes)2759  void input_data_set_all_streams_read(struct input_data* data,
2760                                       unsigned int nframes) {}
2761  
cras_audio_thread_event_underrun()2762  int cras_audio_thread_event_underrun() {
2763    return 0;
2764  }
2765  
cras_audio_thread_event_dev_overrun()2766  int cras_audio_thread_event_dev_overrun() {
2767    cras_audio_thread_event_dev_overrun_called++;
2768    return 0;
2769  }
2770  
cras_server_metrics_device_runtime(struct cras_iodev * iodev)2771  int cras_server_metrics_device_runtime(struct cras_iodev* iodev) {
2772    return 0;
2773  }
2774  
cras_server_metrics_device_volume(struct cras_iodev * iodev)2775  int cras_server_metrics_device_volume(struct cras_iodev* iodev) {
2776    return 0;
2777  }
2778  
ewma_power_init(struct ewma_power * ewma,unsigned int rate)2779  void ewma_power_init(struct ewma_power* ewma, unsigned int rate){};
2780  
ewma_power_calculate(struct ewma_power * ewma,const int16_t * buf,unsigned int channels,unsigned int size)2781  void ewma_power_calculate(struct ewma_power* ewma,
2782                            const int16_t* buf,
2783                            unsigned int channels,
2784                            unsigned int size){};
2785  
ewma_power_calculate_area(struct ewma_power * ewma,const int16_t * buf,struct cras_audio_area * area,unsigned int size)2786  void ewma_power_calculate_area(struct ewma_power* ewma,
2787                                 const int16_t* buf,
2788                                 struct cras_audio_area* area,
2789                                 unsigned int size){};
2790  
2791  }  // extern "C"
2792  }  //  namespace
2793  
main(int argc,char ** argv)2794  int main(int argc, char** argv) {
2795    ::testing::InitGoogleTest(&argc, argv);
2796    int rc = RUN_ALL_TESTS();
2797  
2798    audio_thread_event_log_deinit(atlog, atlog_name);
2799    free(atlog_name);
2800    return rc;
2801  }
2802