/* Copyright 2017 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include #include extern "C" { #include "cras_iodev.h" #include "dev_stream.h" #include "utlist.h" } namespace { struct cb_data { int frames_queued_ret; timespec frames_queued_ts; }; std::unordered_map frames_queued_map; std::unordered_map valid_frames_map; std::unordered_map drop_time_map; std::unordered_map est_rate_ratio_map; std::unordered_map update_rate_map; std::unordered_map on_internal_card_map; } // namespace void iodev_stub_reset() { frames_queued_map.clear(); valid_frames_map.clear(); drop_time_map.clear(); est_rate_ratio_map.clear(); update_rate_map.clear(); on_internal_card_map.clear(); } void iodev_stub_est_rate_ratio(cras_iodev* iodev, double ratio) { est_rate_ratio_map.insert({iodev, ratio}); } void iodev_stub_update_rate(cras_iodev* iodev, int data) { update_rate_map.insert({iodev, data}); } void iodev_stub_on_internal_card(cras_ionode* node, int data) { on_internal_card_map.insert({node, data}); } void iodev_stub_frames_queued(cras_iodev* iodev, int ret, timespec ts) { cb_data data = {ret, ts}; frames_queued_map.insert({iodev, data}); } void iodev_stub_valid_frames(cras_iodev* iodev, int ret, timespec ts) { cb_data data = {ret, ts}; valid_frames_map.insert({iodev, data}); } bool iodev_stub_get_drop_time(cras_iodev* iodev, timespec* ts) { auto elem = drop_time_map.find(iodev); if (elem != drop_time_map.end()) { *ts = elem->second; return true; } return false; } extern "C" { int cras_iodev_add_stream(struct cras_iodev* iodev, struct dev_stream* stream) { DL_APPEND(iodev->streams, stream); return 0; } int cras_iodev_get_valid_frames(struct cras_iodev* iodev, struct timespec* tstamp) { auto elem = valid_frames_map.find(iodev); if (elem != valid_frames_map.end()) { *tstamp = elem->second.frames_queued_ts; return elem->second.frames_queued_ret; } clock_gettime(CLOCK_MONOTONIC_RAW, tstamp); return 0; } double cras_iodev_get_est_rate_ratio(const struct cras_iodev* iodev) { auto elem = est_rate_ratio_map.find(iodev); if (elem != est_rate_ratio_map.end()) { return elem->second; } return 1.0f; } int cras_iodev_get_dsp_delay(const struct cras_iodev* iodev) { return 0; } int cras_iodev_frames_queued(struct cras_iodev* iodev, struct timespec* tstamp) { auto elem = frames_queued_map.find(iodev); if (elem != frames_queued_map.end()) { *tstamp = elem->second.frames_queued_ts; return elem->second.frames_queued_ret; } clock_gettime(CLOCK_MONOTONIC_RAW, tstamp); return 0; } struct dev_stream* cras_iodev_rm_stream(struct cras_iodev* iodev, const struct cras_rstream* stream) { return NULL; } int cras_iodev_update_rate(struct cras_iodev* iodev, unsigned int level, struct timespec* level_tstamp) { auto elem = update_rate_map.find(iodev); if (elem != update_rate_map.end()) { return elem->second; } return 0; } enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev* iodev) { return iodev->state; } unsigned int cras_iodev_all_streams_written(struct cras_iodev* iodev) { return 0; } int cras_iodev_put_input_buffer(struct cras_iodev* iodev) { return 0; } int cras_iodev_put_output_buffer(struct cras_iodev* iodev, uint8_t* frames, unsigned int nframes, int* non_empty, struct cras_fmt_conv* output_converter) { return 0; } int cras_iodev_get_input_buffer(struct cras_iodev* iodev, unsigned* frames) { return 0; } int cras_iodev_get_output_buffer(struct cras_iodev* iodev, struct cras_audio_area** area, unsigned* frames) { return 0; } float cras_iodev_get_software_gain_scaler(const struct cras_iodev* iodev) { return 0.0; } void cras_iodev_stream_written(struct cras_iodev* iodev, struct dev_stream* stream, unsigned int nwritten) {} int cras_iodev_prepare_output_before_write_samples(struct cras_iodev* odev) { return 0; } int cras_iodev_buffer_avail(struct cras_iodev* iodev, unsigned hw_level) { return 0; } unsigned int cras_iodev_max_stream_offset(const struct cras_iodev* iodev) { return 0; } int cras_iodev_odev_should_wake(const struct cras_iodev* odev) { return 1; } int cras_iodev_output_underrun(struct cras_iodev* odev, unsigned int hw_level, unsigned int frames_written) { return 0; } int cras_iodev_reset_request(struct cras_iodev* iodev) { return 0; } unsigned int cras_iodev_stream_offset(struct cras_iodev* iodev, struct dev_stream* stream) { return 0; } unsigned int cras_iodev_get_num_underruns(const struct cras_iodev* iodev) { return 0; } unsigned int cras_iodev_frames_to_play_in_sleep(struct cras_iodev* odev, unsigned int* hw_level, struct timespec* hw_tstamp) { clock_gettime(CLOCK_MONOTONIC_RAW, hw_tstamp); *hw_level = 0; return 0; } void cras_iodev_update_highest_hw_level(struct cras_iodev* iodev, unsigned int hw_level) {} void cras_iodev_start_stream(struct cras_iodev* iodev, struct dev_stream* stream) {} int cras_iodev_drop_frames_by_time(struct cras_iodev* iodev, struct timespec ts) { drop_time_map.insert({iodev, ts}); return 0; } bool cras_iodev_is_on_internal_card(const struct cras_ionode* node) { auto elem = on_internal_card_map.find(node); if (elem != on_internal_card_map.end()) { return elem->second; } return 1; } } // extern "C"