summaryrefslogtreecommitdiff
path: root/cras/src/server/cras_iodev.h
diff options
context:
space:
mode:
Diffstat (limited to 'cras/src/server/cras_iodev.h')
-rw-r--r--cras/src/server/cras_iodev.h850
1 files changed, 0 insertions, 850 deletions
diff --git a/cras/src/server/cras_iodev.h b/cras/src/server/cras_iodev.h
deleted file mode 100644
index 18a0962c..00000000
--- a/cras/src/server/cras_iodev.h
+++ /dev/null
@@ -1,850 +0,0 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * cras_iodev represents playback or capture devices on the system. Each iodev
- * will attach to a thread to render or capture audio. For playback, this
- * thread will gather audio from the streams that are attached to the device and
- * render the samples it gets to the iodev. For capture the process is
- * reversed, the samples are pulled from the device and passed on to the
- * attached streams.
- */
-#ifndef CRAS_IODEV_H_
-#define CRAS_IODEV_H_
-
-#include <stdbool.h>
-
-#include "cras_dsp.h"
-#include "cras_iodev_info.h"
-#include "cras_messages.h"
-#include "ewma_power.h"
-
-struct buffer_share;
-struct cras_fmt_conv;
-struct cras_ramp;
-struct cras_rstream;
-struct cras_audio_area;
-struct cras_audio_format;
-struct audio_thread;
-struct cras_iodev;
-struct rate_estimator;
-
-/*
- * Type of callback function to execute when loopback sender transfers audio
- * to the receiver. For example, this is called in audio thread when playback
- * samples are mixed and about to write to hardware.
- * Args:
- * frames - Loopback audio data from sender.
- * nframes - Number loopback audio data in frames.
- * fmt - Format of the loopback audio data.
- * cb_data - Pointer to the loopback receiver.
- */
-typedef int (*loopback_hook_data_t)(const uint8_t *frames, unsigned int nframes,
- const struct cras_audio_format *fmt,
- void *cb_data);
-
-/*
- * Type of callback function to notify loopback receiver that the loopback path
- * starts or stops.
- * Args:
- * start - True to notify receiver that loopback starts. False to notify
- * loopback stops.
- * cb_data - Pointer to the loopback receiver.
- */
-typedef int (*loopback_hook_control_t)(bool start, void *cb_data);
-
-/* Callback type for an iodev event. */
-typedef int (*iodev_hook_t)();
-
-/*
- * Holds the information of a receiver of loopback audio, used to register
- * with the sender of loopback audio. A sender keeps a list of cras_loopback
- * objects representing all the receivers.
- * Members:
- * type - Pre-dsp loopback can be used for system loopback. Post-dsp
- * loopback can be used for echo reference.
- * hook_data - Callback used for playback samples after mixing, before or
- * after applying DSP depends on the value of |type|.
- * hook_control - Callback to notify receiver that loopback starts or stops.
- * cb_data - Pointer to the loopback receiver, will be passing to hook functions.
- */
-struct cras_loopback {
- enum CRAS_LOOPBACK_TYPE type;
- loopback_hook_data_t hook_data;
- loopback_hook_control_t hook_control;
- void *cb_data;
- struct cras_loopback *prev, *next;
-};
-
-/* State of an iodev.
- * no_stream state is only supported on output device.
- * Open state is only supported for device supporting start ops.
- */
-enum CRAS_IODEV_STATE {
- CRAS_IODEV_STATE_CLOSE = 0,
- CRAS_IODEV_STATE_OPEN = 1,
- CRAS_IODEV_STATE_NORMAL_RUN = 2,
- CRAS_IODEV_STATE_NO_STREAM_RUN = 3,
-};
-
-/* Holds an output/input node for this device. An ionode is a control that
- * can be switched on and off such as headphones or speakers.
- * Members:
- * dev - iodev which this node belongs to.
- * idx - ionode index.
- * plugged - true if the device is plugged.
- * plugged_time - If plugged is true, this is the time it was attached.
- * volume - per-node volume (0-100)
- * capture_gain - Internal per-node capture gain/attenuation (in 100*dBFS)
- * This is only used for CRAS internal tuning, no way to change by
- * client.
- * ui_gain_scaler - The adjustable gain scaler set by client.
- * left_right_swapped - If left and right output channels are swapped.
- * type - Type displayed to the user.
- * position - Specify where on the system this node locates.
- * name - Name displayed to the user.
- * dsp_name - The "DspName" variable specified in the ucm config.
- * active_hotword_model - name of the currently selected hotword model.
- * softvol_scalers - pointer to software volume scalers.
- * software_volume_needed - For output: True if the volume range of the node
- * is smaller than desired. For input: True if this node needs software
- * gain.
- * intrinsic_sensitivity - The "IntrinsicSensitivity" in 0.01 dBFS/Pa
- * specified in the ucm config.
- * stable_id - id for node that doesn't change after unplug/plug.
- * is_sco_pcm - Bool to indicate whether the ionode is for SCO over PCM.
- */
-struct cras_ionode {
- struct cras_iodev *dev;
- uint32_t idx;
- int plugged;
- struct timeval plugged_time;
- unsigned int volume;
- long capture_gain;
- float ui_gain_scaler;
- int left_right_swapped;
- enum CRAS_NODE_TYPE type;
- enum CRAS_NODE_POSITION position;
- char name[CRAS_NODE_NAME_BUFFER_SIZE];
- const char *dsp_name;
- char active_hotword_model[CRAS_NODE_HOTWORD_MODEL_BUFFER_SIZE];
- float *softvol_scalers;
- int software_volume_needed;
- long intrinsic_sensitivity;
- unsigned int stable_id;
- int is_sco_pcm;
- struct cras_ionode *prev, *next;
-};
-
-/* An input or output device, that can have audio routed to/from it.
- * set_volume - Function to call if the system volume changes.
- * set_capture_gain - Function to call if active node's capture_gain changes.
- * set_mute - Function to call if the system mute state changes.
- * set_capture_mute - Function to call if the system capture mute state changes.
- * set_swap_mode_for_node - Function to call to set swap mode for the node.
- * open_dev - Opens the device.
- * configure_dev - Configures the device.
- * close_dev - Closes the device if it is open.
- * update_supported_formats - Refresh supported frame rates and channel counts.
- * frames_queued - The number of frames in the audio buffer, and fills tstamp
- * with the associated timestamp. The timestamp is {0, 0} when
- * the device hasn't started processing data (and on error).
- * delay_frames - The delay of the next sample in frames.
- * get_buffer - Returns a buffer to read/write to/from.
- * put_buffer - Marks a buffer from get_buffer as read/written.
- * flush_buffer - Flushes the buffer and return the number of frames flushed.
- * start - Starts running device. This is optionally supported on output device.
- * If device supports this ops, device can be in CRAS_IODEV_STATE_OPEN
- * state after being opened.
- * If device does not support this ops, then device will be in
- * CRAS_IODEV_STATE_NO_STREAM_RUN.
- * no_stream - (Optional) When there is no stream, we let device keep running
- * for some time to save the time to open device for the next
- * stream. This is the no stream state of an output device.
- * The default action of no stream state is to fill zeros
- * periodically. Device can implement this function to define
- * its own optimization of entering/exiting no stream state.
- * is_free_running - (Optional) Checks if the device is in free running state.
- * output_underrun - (Optional) Handle output device underrun.
- * update_active_node - Update the active node when the selected device/node has
- * changed.
- * update_channel_layout - Update the channel layout base on set iodev->format,
- * expect the best available layout be filled to iodev->format.
- * set_hotword_model - Sets the hotword model to this iodev.
- * get_hotword_models - Gets a comma separated string of the list of supported
- * hotword models of this iodev.
- * get_num_severe_underruns - Gets number of severe underrun recorded since
- * iodev was created.
- * get_valid_frames - Gets number of valid frames in device which have not
- * played yet. Valid frames does not include zero samples
- * we filled under no streams state.
- * frames_to_play_in_sleep - Returns the non-negative number of frames that
- * audio thread can sleep before serving this playback dev the next time.
- * Not implementing this ops means fall back to default behavior in
- * cras_iodev_default_frames_to_play_in_sleep().
- * support_noise_cancellation - (Optional) Checks if the device supports noise
- * cancellation.
- * format - The audio format being rendered or captured to hardware.
- * rate_est - Rate estimator to estimate the actual device rate.
- * area - Information about how the samples are stored.
- * info - Unique identifier for this device (index and name).
- * nodes - The output or input nodes available for this device.
- * active_node - The current node being used for playback or capture.
- * direction - Input or Output.
- * supported_rates - Array of sample rates supported by device 0-terminated.
- * supported_channel_counts - List of number of channels supported by device.
- * supported_formats - List of audio formats (s16le, s32le) supported by device.
- * buffer_size - Size of the audio buffer in frames.
- * min_buffer_level - Extra frames to keep queued in addition to requested.
- * dsp_context - The context used for dsp processing on the audio data.
- * dsp_name - The "dsp_name" dsp variable specified in the ucm config.
- * echo_reference_dev - Used only for playback iodev. Pointer to the input
- * iodev, which can be used to record what is playing out from this
- * iodev. This will be used as the echo reference for echo cancellation.
- * is_enabled - True if this iodev is enabled, false otherwise.
- * software_volume_needed - True if volume control is not supported by hardware.
- * software_gain_scaler - Scaler value to apply to captured data. This can
- * be different when active node changes. Configured when there's no
- * hardware gain control.
- * streams - List of audio streams serviced by dev.
- * state - Device is in one of close, open, normal, or no_stream state defined
- * in enum CRAS_IODEV_STATE.
- * min_cb_level - min callback level of any stream attached.
- * max_cb_level - max callback level of any stream attached.
- * highest_hw_level - The highest hardware level of the device.
- * largest_cb_level - The largest callback level of streams attached to this
- * device. The difference with max_cb_level is it takes all
- * streams into account even if they have been removed.
- * num_underruns - Number of times we have run out of data (playback only).
- * buf_state - If multiple streams are writing to this device, then this
- * keeps track of how much each stream has written.
- * idle_timeout - The timestamp when to close the dev after being idle.
- * open_ts - The time when the device opened.
- * loopbacks - List of registered cras_loopback objects representing the
- * receivers who wants a copy of the audio sending through this iodev.
- * pre_open_iodev_hook - Optional callback to call before iodev open.
- * post_close_iodev_hook - Optional callback to call after iodev close.
- * ext_dsp_module - External dsp module to process audio data in stream level
- * after dsp_context.
- * reset_request_pending - The flag for pending reset request.
- * ramp - The cras_ramp struct to control ramping up/down at mute/unmute and
- * start of playback.
- * input_streaming - For capture only. Indicate if input has started.
- * input_frames_read - The number of frames read from the device, but that
- * haven't been "put" yet.
- * input_dsp_offset - The number of frames in the HW buffer that have already
- * been processed by the input DSP.
- * input_data - Used to pass audio input data to streams with or without
- * stream side processing.
- * initial_ramp_request - The value indicates which type of ramp the device
- * should perform when some samples are ready for playback.
- * ewma - The ewma instance to calculate iodev volume.
- */
-struct cras_iodev {
- void (*set_volume)(struct cras_iodev *iodev);
- void (*set_mute)(struct cras_iodev *iodev);
- void (*set_capture_gain)(struct cras_iodev *iodev);
- void (*set_capture_mute)(struct cras_iodev *iodev);
- int (*set_swap_mode_for_node)(struct cras_iodev *iodev,
- struct cras_ionode *node, int enable);
- int (*open_dev)(struct cras_iodev *iodev);
- int (*configure_dev)(struct cras_iodev *iodev);
- int (*close_dev)(struct cras_iodev *iodev);
- int (*update_supported_formats)(struct cras_iodev *iodev);
- int (*frames_queued)(const struct cras_iodev *iodev,
- struct timespec *tstamp);
- int (*delay_frames)(const struct cras_iodev *iodev);
- int (*get_buffer)(struct cras_iodev *iodev,
- struct cras_audio_area **area, unsigned *frames);
- int (*put_buffer)(struct cras_iodev *iodev, unsigned nwritten);
- int (*flush_buffer)(struct cras_iodev *iodev);
- int (*start)(const struct cras_iodev *iodev);
- int (*is_free_running)(const struct cras_iodev *iodev);
- int (*output_underrun)(struct cras_iodev *iodev);
- int (*no_stream)(struct cras_iodev *iodev, int enable);
- void (*update_active_node)(struct cras_iodev *iodev, unsigned node_idx,
- unsigned dev_enabled);
- int (*update_channel_layout)(struct cras_iodev *iodev);
- int (*set_hotword_model)(struct cras_iodev *iodev,
- const char *model_name);
- char *(*get_hotword_models)(struct cras_iodev *iodev);
- unsigned int (*get_num_severe_underruns)(const struct cras_iodev *iodev);
- int (*get_valid_frames)(struct cras_iodev *odev,
- struct timespec *tstamp);
- unsigned int (*frames_to_play_in_sleep)(struct cras_iodev *iodev,
- unsigned int *hw_level,
- struct timespec *hw_tstamp);
- int (*support_noise_cancellation)(const struct cras_iodev *iodev);
- struct cras_audio_format *format;
- struct rate_estimator *rate_est;
- struct cras_audio_area *area;
- struct cras_iodev_info info;
- struct cras_ionode *nodes;
- struct cras_ionode *active_node;
- enum CRAS_STREAM_DIRECTION direction;
- size_t *supported_rates;
- size_t *supported_channel_counts;
- snd_pcm_format_t *supported_formats;
- snd_pcm_uframes_t buffer_size;
- unsigned int min_buffer_level;
- struct cras_dsp_context *dsp_context;
- const char *dsp_name;
- struct cras_iodev *echo_reference_dev;
- int is_enabled;
- int software_volume_needed;
- float software_gain_scaler;
- struct dev_stream *streams;
- enum CRAS_IODEV_STATE state;
- unsigned int min_cb_level;
- unsigned int max_cb_level;
- unsigned int highest_hw_level;
- unsigned int largest_cb_level;
- unsigned int num_underruns;
- struct buffer_share *buf_state;
- struct timespec idle_timeout;
- struct timespec open_ts;
- struct cras_loopback *loopbacks;
- iodev_hook_t pre_open_iodev_hook;
- iodev_hook_t post_close_iodev_hook;
- struct ext_dsp_module *ext_dsp_module;
- int reset_request_pending;
- struct cras_ramp *ramp;
- int input_streaming;
- unsigned int input_frames_read;
- unsigned int input_dsp_offset;
- unsigned int initial_ramp_request;
- struct input_data *input_data;
- struct ewma_power ewma;
- struct cras_iodev *prev, *next;
-};
-
-/*
- * Ramp request used in cras_iodev_start_ramp.
- *
- * - CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE: Mute->unmute.
- * Change device to unmute state after ramping is stared,
- * that is, (a) in the plot.
- *
- * ____
- * .... /
- * _____/
- * (a)
- *
- * - CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE: Unmute->mute.
- * Change device to mute state after ramping is done, that is,
- * (b) in the plot.
- *
- * _____
- * \....
- * \____
- * (b)
- *
- * - CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK: Ramping is requested because
- * first sample of new stream is ready, there is no need to change mute/unmute
- * state.
- *
- * - CRAS_IODEV_RAMP_REQUEST_RESUME_MUTE: To prevent popped noise, mute the
- * device for RAMP_RESUME_MUTE_DURATION_SECS seconds on sample ready after
- * resume if there were playback stream before suspend.
- *
- * - CRAS_IODEV_RAMP_REQUEST_SWITCH_MUTE: To prevent popped noise, mute the
- * device for RAMP_SWITCH_MUTE_DURATION_SECS seconds on sample ready after
- * device switch if there were playback stream before switch.
- *
- */
-
-enum CRAS_IODEV_RAMP_REQUEST {
- CRAS_IODEV_RAMP_REQUEST_NONE = 0,
- CRAS_IODEV_RAMP_REQUEST_UP_UNMUTE = 1,
- CRAS_IODEV_RAMP_REQUEST_DOWN_MUTE = 2,
- CRAS_IODEV_RAMP_REQUEST_UP_START_PLAYBACK = 3,
- CRAS_IODEV_RAMP_REQUEST_RESUME_MUTE = 4,
- CRAS_IODEV_RAMP_REQUEST_SWITCH_MUTE = 5,
-};
-
-/*
- * Utility functions to be used by iodev implementations.
- */
-
-/* Sets up the iodev for the given format if possible. If the iodev can't
- * handle the requested format, format conversion will happen in dev_stream.
- * It also allocates a dsp context for the iodev.
- * Args:
- * iodev - the iodev you want the format for.
- * fmt - the desired format.
- */
-int cras_iodev_set_format(struct cras_iodev *iodev,
- const struct cras_audio_format *fmt);
-
-/* Clear the format previously set for this iodev.
- *
- * Args:
- * iodev - the iodev you want to free the format.
- */
-void cras_iodev_free_format(struct cras_iodev *iodev);
-
-/* Initializes the audio area for this iodev.
- * Args:
- * iodev - the iodev to init audio area
- * num_channels - the total number of channels
- */
-void cras_iodev_init_audio_area(struct cras_iodev *iodev, int num_channels);
-
-/* Frees the audio area for this iodev.
- * Args:
- * iodev - the iodev to free audio area
- */
-void cras_iodev_free_audio_area(struct cras_iodev *iodev);
-
-/* Free resources allocated for this iodev.
- *
- * Args:
- * iodev - the iodev you want to free the resources for.
- */
-void cras_iodev_free_resources(struct cras_iodev *iodev);
-
-/* Fill timespec ts with the time to sleep based on the number of frames and
- * frame rate.
- * Args:
- * frames - Number of frames in buffer..
- * frame_rate - 44100, 48000, etc.
- * ts - Filled with the time to sleep for.
- */
-void cras_iodev_fill_time_from_frames(size_t frames, size_t frame_rate,
- struct timespec *ts);
-
-/* Update the "dsp_name" dsp variable. This may cause the dsp pipeline to be
- * reloaded.
- * Args:
- * iodev - device which the state changes.
- */
-void cras_iodev_update_dsp(struct cras_iodev *iodev);
-
-/* Sets swap mode on a node using dsp. This function can be called when
- * dsp pipline is not created yet. It will take effect when dsp pipeline
- * is created later. If there is dsp pipeline, this function causes the dsp
- * pipeline to be reloaded and swap mode takes effect right away.
- * Args:
- * iodev - device to be changed for swap mode.
- * node - the node to be changed for swap mode.
- * enable - 1 to enable swap mode, 0 otherwise.
- * Returns:
- * 0 on success, error code on failure.
- */
-int cras_iodev_dsp_set_swap_mode_for_node(struct cras_iodev *iodev,
- struct cras_ionode *node, int enable);
-
-/* Handles a plug event happening on this node.
- * Args:
- * node - ionode on which a plug event was detected.
- * plugged - true if the device was plugged, false for unplugged.
- */
-void cras_ionode_plug_event(struct cras_ionode *node, int plugged);
-
-/* Returns true if node a is preferred over node b. */
-int cras_ionode_better(struct cras_ionode *a, struct cras_ionode *b);
-
-/* Sets the plugged state of a node. */
-void cras_iodev_set_node_plugged(struct cras_ionode *node, int plugged);
-
-/* Adds a node to the iodev's node list. */
-void cras_iodev_add_node(struct cras_iodev *iodev, struct cras_ionode *node);
-
-/* Removes a node from iodev's node list. */
-void cras_iodev_rm_node(struct cras_iodev *iodev, struct cras_ionode *node);
-
-/* Assign a node to be the active node of the device */
-void cras_iodev_set_active_node(struct cras_iodev *iodev,
- struct cras_ionode *node);
-
-/* Checks if the node is the typical playback or capture option for AEC usage. */
-bool cras_iodev_is_aec_use_case(const struct cras_ionode *node);
-
-/* Checks if the node is a playback or capture node on internal card. */
-bool cras_iodev_is_on_internal_card(const struct cras_ionode *node);
-
-/* Adjust the system volume based on the volume of the given node. */
-static inline unsigned int
-cras_iodev_adjust_node_volume(const struct cras_ionode *node,
- unsigned int system_volume)
-{
- unsigned int node_vol_offset = 100 - node->volume;
-
- if (system_volume > node_vol_offset)
- return system_volume - node_vol_offset;
- else
- return 0;
-}
-
-/* Get the volume scaler for the active node. */
-static inline unsigned int
-cras_iodev_adjust_active_node_volume(struct cras_iodev *iodev,
- unsigned int system_volume)
-{
- if (!iodev->active_node)
- return system_volume;
-
- return cras_iodev_adjust_node_volume(iodev->active_node, system_volume);
-}
-
-/* Returns true if the active node of the iodev needs software volume. */
-static inline int
-cras_iodev_software_volume_needed(const struct cras_iodev *iodev)
-{
- if (iodev->software_volume_needed)
- return 1;
-
- if (!iodev->active_node)
- return 0;
-
- if (iodev->active_node->intrinsic_sensitivity)
- return 1;
-
- return iodev->active_node->software_volume_needed;
-}
-
-static inline float
-cras_iodev_get_ui_gain_scaler(const struct cras_iodev *iodev)
-{
- if (!iodev->active_node)
- return 1.0f;
- return iodev->active_node->ui_gain_scaler;
-}
-
-/* Gets the software gain scaler should be applied on the deivce.
- * Args:
- * iodev - The device.
- * Returns:
- * A scaler translated from system gain and active node gain.
- * Returns 1.0 if software gain is not needed. */
-float cras_iodev_get_software_gain_scaler(const struct cras_iodev *iodev);
-
-/* Gets the software volume scaler of the iodev. The scaler should only be
- * applied if the device needs software volume. */
-float cras_iodev_get_software_volume_scaler(struct cras_iodev *iodev);
-
-/* Indicate that a stream has been added from the device. */
-int cras_iodev_add_stream(struct cras_iodev *iodev, struct dev_stream *stream);
-
-/* Indicate that a stream is taken into consideration of device's I/O. This
- * function is for output stream only. For input stream, it is already included
- * by add_stream function. */
-void cras_iodev_start_stream(struct cras_iodev *iodev,
- struct dev_stream *stream);
-
-/* Indicate that a stream has been removed from the device. */
-struct dev_stream *cras_iodev_rm_stream(struct cras_iodev *iodev,
- const struct cras_rstream *stream);
-
-/* Get the offset of this stream into the dev's buffer. */
-unsigned int cras_iodev_stream_offset(struct cras_iodev *iodev,
- struct dev_stream *stream);
-
-/* Get the maximum offset of any stream into the dev's buffer. */
-unsigned int cras_iodev_max_stream_offset(const struct cras_iodev *iodev);
-
-/* Tell the device how many frames the given stream wrote. */
-void cras_iodev_stream_written(struct cras_iodev *iodev,
- struct dev_stream *stream,
- unsigned int nwritten);
-
-/* All streams have written what they can, update the write pointers and return
- * the amount that has been filled by all streams and can be comitted to the
- * device.
- */
-unsigned int cras_iodev_all_streams_written(struct cras_iodev *iodev);
-
-/* Return the state of an iodev. */
-enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev *iodev);
-
-/* Open an iodev, does setup and invokes the open_dev callback. */
-int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level,
- const struct cras_audio_format *fmt);
-
-/* Open an iodev, does teardown and invokes the close_dev callback. */
-int cras_iodev_close(struct cras_iodev *iodev);
-
-/* Gets the available buffer to write/read audio.*/
-int cras_iodev_buffer_avail(struct cras_iodev *iodev, unsigned hw_level);
-
-/* Marks a buffer from get_buffer as read.
- * Args:
- * iodev - The input device.
- * Returns:
- * Number of frames to put sucessfully. Negative error code on failure.
- */
-int cras_iodev_put_input_buffer(struct cras_iodev *iodev);
-
-/* Marks a buffer from get_buffer as written. */
-int cras_iodev_put_output_buffer(struct cras_iodev *iodev, uint8_t *frames,
- unsigned int nframes, int *is_non_empty,
- struct cras_fmt_conv *remix_converter);
-
-/* Returns a buffer to read from.
- * Args:
- * iodev - The device.
- * frames - Filled with the number of frames that can be read/written.
- */
-int cras_iodev_get_input_buffer(struct cras_iodev *iodev, unsigned *frames);
-
-/* Returns a buffer to read from.
- * Args:
- * iodev - The device.
- * area - Filled with a pointer to the audio to read/write.
- * frames - Filled with the number of frames that can be read/written.
- */
-int cras_iodev_get_output_buffer(struct cras_iodev *iodev,
- struct cras_audio_area **area,
- unsigned *frames);
-
-/* Update the estimated sample rate of the device. */
-int cras_iodev_update_rate(struct cras_iodev *iodev, unsigned int level,
- struct timespec *level_tstamp);
-
-/* Resets the rate estimator of the device. */
-int cras_iodev_reset_rate_estimator(const struct cras_iodev *iodev);
-
-/* Returns the rate of estimated frame rate and the claimed frame rate of
- * the device. */
-double cras_iodev_get_est_rate_ratio(const struct cras_iodev *iodev);
-
-/* Get the delay from DSP processing in frames. */
-int cras_iodev_get_dsp_delay(const struct cras_iodev *iodev);
-
-/* Returns the number of frames in the hardware buffer.
- * Args:
- * iodev - The device.
- * tstamp - The associated hardware time stamp.
- * Returns:
- * Number of frames in the hardware buffer.
- * Returns -EPIPE if there is severe underrun.
- */
-int cras_iodev_frames_queued(struct cras_iodev *iodev, struct timespec *tstamp);
-
-/* Get the delay for input/output in frames. */
-static inline int cras_iodev_delay_frames(const struct cras_iodev *iodev)
-{
- return iodev->delay_frames(iodev) + cras_iodev_get_dsp_delay(iodev);
-}
-
-/* Returns if input iodev has started streaming. */
-static inline int cras_iodev_input_streaming(const struct cras_iodev *iodev)
-{
- return iodev->input_streaming;
-}
-
-/* Returns true if the device is open. */
-static inline int cras_iodev_is_open(const struct cras_iodev *iodev)
-{
- if (iodev && iodev->state != CRAS_IODEV_STATE_CLOSE)
- return 1;
- return 0;
-}
-
-/* Configure iodev to exit idle mode. */
-static inline void cras_iodev_exit_idle(struct cras_iodev *iodev)
-{
- iodev->idle_timeout.tv_sec = 0;
-}
-
-/*
- * Sets the external dsp module for |iodev| and configures the module
- * accordingly if iodev is already open. This function should be called
- * in main thread.
- * Args:
- * iodev - The iodev to hold the dsp module.
- * ext - External dsp module to set to iodev. Pass NULL to release
- * the ext_dsp_module already added to dsp pipeline.
- */
-void cras_iodev_set_ext_dsp_module(struct cras_iodev *iodev,
- struct ext_dsp_module *ext);
-
-/* Put 'frames' worth of zero samples into odev. */
-int cras_iodev_fill_odev_zeros(struct cras_iodev *odev, unsigned int frames);
-
-/*
- * The default implementation of frames_to_play_in_sleep ops, used when an
- * iodev doesn't have its own logic.
- * The default behavior is to calculate how log it takes for buffer level to
- * run to as low as min_buffer_level.
- */
-unsigned int
-cras_iodev_default_frames_to_play_in_sleep(struct cras_iodev *odev,
- unsigned int *hw_level,
- struct timespec *hw_tstamp);
-
-/* Gets the number of frames to play when audio thread sleeps.
- * Args:
- * iodev[in] - The device.
- * hw_level[out] - Pointer to number of frames in hardware.
- * hw_tstamp[out] - Pointer to the timestamp for hw_level.
- * Returns:
- * Number of frames to play in sleep for this output device.
- */
-unsigned int cras_iodev_frames_to_play_in_sleep(struct cras_iodev *odev,
- unsigned int *hw_level,
- struct timespec *hw_tstamp);
-
-/* Checks if audio thread should wake for this output device.
- * Args:
- * iodev[in] - The output device.
- * Returns:
- * 1 if audio thread should wake for this output device. 0 otherwise.
- */
-int cras_iodev_odev_should_wake(const struct cras_iodev *odev);
-
-/* The default implementation of no_stream ops.
- * The default behavior is to fill some zeros when entering no stream state.
- * Note that when a device in no stream state enters into no stream state again,
- * device needs to fill some zeros again.
- * Do nothing to leave no stream state.
- * Args:
- * iodev[in] - The output device.
- * enable[in] - 1 to enter no stream playback, 0 to leave.
- * Returns:
- * 0 on success. Negative error code on failure.
- * */
-int cras_iodev_default_no_stream_playback(struct cras_iodev *odev, int enable);
-
-/* Get current state of iodev.
- * Args:
- * iodev[in] - The device.
- * Returns:
- * One of states defined in CRAS_IODEV_STATE.
- */
-enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev *iodev);
-
-/* Possibly transit state for output device.
- * Check if this output device needs to transit from open state/no_stream state
- * into normal run state. If device does not need transition and is still in
- * no stream state, call no_stream ops to do its work for one cycle.
- * Args:
- * odev[in] - The output device.
- * Returns:
- * 0 on success. Negative error code on failure.
- */
-int cras_iodev_prepare_output_before_write_samples(struct cras_iodev *odev);
-
-/* Get number of underruns recorded so far.
- * Args:
- * iodev[in] - The device.
- * Returns:
- * An unsigned int for number of underruns recorded.
- */
-unsigned int cras_iodev_get_num_underruns(const struct cras_iodev *iodev);
-
-/* Get number of severe underruns recorded so far.
- * Args:
- * iodev[in] - The device.
- * Returns:
- * An unsigned int for number of severe underruns recorded since iodev
- * was created.
- */
-unsigned int
-cras_iodev_get_num_severe_underruns(const struct cras_iodev *iodev);
-
-/* Get number of valid frames in the hardware buffer. The valid frames does
- * not include zero samples we filled with before.
- * Args:
- * iodev[in] - The device.
- * hw_tstamp[out] - Pointer to the timestamp for hw_level.
- * Returns:
- * Number of valid frames in the hardware buffer.
- * Negative error code on failure.
- */
-int cras_iodev_get_valid_frames(struct cras_iodev *iodev,
- struct timespec *hw_tstamp);
-
-/* Request main thread to re-open device. This should be used in audio thread
- * when it finds device is in a bad state. The request will be ignored if
- * there is still a pending request.
- * Args:
- * iodev[in] - The device.
- * Returns:
- * 0 on success. Negative error code on failure.
- */
-int cras_iodev_reset_request(struct cras_iodev *iodev);
-
-/* Handle output underrun.
- * Args:
- * odev[in] - The output device.
- * hw_level[in] - The current hw_level. Used in the debug log.
- * frames_written[in] - The number of written frames. Used in the debug log.
- * Returns:
- * 0 on success. Negative error code on failure.
- */
-int cras_iodev_output_underrun(struct cras_iodev *odev, unsigned int hw_level,
- unsigned int frames_written);
-
-/* Start ramping samples up/down on a device.
- * Args:
- * iodev[in] - The device.
- * request[in] - The request type. Check the docstrings of
- * CRAS_IODEV_RAMP_REQUEST.
- * Returns:
- * 0 on success. Negative error code on failure.
- */
-int cras_iodev_start_ramp(struct cras_iodev *odev,
- enum CRAS_IODEV_RAMP_REQUEST request);
-
-/* Start ramping samples up/down on a device after a volume change.
- * Args:
- * iodev[in] - The device.
- * old_volume[in] - The previous volume percentage of the device.
- * new_volume[in] - The new volume percentage of the device.
- * Returns:
- * 0 on success. Negative error code on failure.
- */
-int cras_iodev_start_volume_ramp(struct cras_iodev *odev,
- unsigned int old_volume,
- unsigned int new_volume);
-
-/* Set iodev to mute/unmute state.
- * Args:
- * iodev[in] - The device.
- * Returns:
- * 0 on success. Negative error code on failure.
- */
-int cras_iodev_set_mute(struct cras_iodev *iodev);
-
-/*
- * Checks if an output iodev's volume is zero.
- * If there is an active node, check the adjusted node volume.
- * If there is no active node, check system volume.
- * Args:
- * odev[in] - The device.
- * Returns:
- * 1 if device's volume is 0. 0 otherwise.
- */
-int cras_iodev_is_zero_volume(const struct cras_iodev *odev);
-
-/*
- * Updates the highest hardware level of the device.
- * Args:
- * iodev - The device.
- */
-void cras_iodev_update_highest_hw_level(struct cras_iodev *iodev,
- unsigned int hw_level);
-
-/*
- * Makes an input device drop the specific number of frames by given time.
- * Args:
- * iodev - The device.
- * ts - The time indicates how many frames will be dropped in a device.
- * Returns:
- * The number of frames have been dropped. Negative error code on failure.
- */
-int cras_iodev_drop_frames_by_time(struct cras_iodev *iodev,
- struct timespec ts);
-
-/* Checks if an input device supports noise cancellation.
- * Args:
- * iodev - The device.
- * Returns:
- * True if device supports noise cancellation. False otherwise.
- */
-bool cras_iodev_support_noise_cancellation(const struct cras_iodev *iodev);
-
-#endif /* CRAS_IODEV_H_ */