blob: 7ac80be4c8b70e0a6f564ee666e928c2b3dc8225 [file] [log] [blame]
/* Copyright 2018 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.
*/
#ifndef INPUT_DATA_H_
#define INPUT_DATA_H_
#include "cras_dsp_pipeline.h"
#include "float_buffer.h"
/*
* Structure holding the information used when a chunk of input buffer
* is accessed by multiple streams with different properties and
* processing requirements.
* Member:
* ext - Provides interface to read and process buffer in dsp pipeline.
* dev_ptr - Pointer to the associated input iodev.
* area - The audio area used for deinterleaved data copy.
* fbuffer - Floating point buffer from input device.
*/
struct input_data {
struct ext_dsp_module ext;
void *dev_ptr;
struct cras_audio_area *area;
struct float_buffer *fbuffer;
};
/*
* Creates an input_data instance for input iodev.
* Args:
* dev_ptr - Pointer to the associated input device.
*/
struct input_data *input_data_create(void *dev_ptr);
/* Destroys an input_data instance. */
void input_data_destroy(struct input_data **data);
/* Sets how many frames in buffer has been read by all input streams. */
void input_data_set_all_streams_read(struct input_data *data,
unsigned int nframes);
/*
* Gets an audio area for |stream| to read data from. An input_data may be
* accessed by multiple streams while some requires processing, the
* |offsets| arguments helps track the offset value each stream has read
* into |data|.
* Args:
* data - The input data to get audio area from.
* stream - The stream that reads data.
* offsets - Structure holding the mapping from stream to the offset value
* of how many frames each stream has read into input buffer.
* area - To be filled with a pointer to an audio area struct for stream to
* read data.
* offset - To be filled with the samples offset in |area| that |stream|
* should start reading.
*/
int input_data_get_for_stream(struct input_data *data,
struct cras_rstream *stream,
struct buffer_share *offsets,
struct cras_audio_area **area,
unsigned int *offset);
/*
* Marks |frames| of audio data as read by |stream|.
* Args:
* data - The input_data to mark frames has been read by |stream|.
* stream - The stream that has read audio data.
* offsets - Structure holding the mapping from stream to the offset value
* of how many frames each stream has read into input buffer.
* frames - Number of frames |stream| has read.
*/
int input_data_put_for_stream(struct input_data *data,
struct cras_rstream *stream,
struct buffer_share *offsets,
unsigned int frames);
/*
* The software gain scaler of input path consist of two parts:
* (1) The device gain scaler used when lack of hardware gain control.
* Configured by the IntrinsicSensitivity label in alsa UCM config.
* (2) The gain scaler in cras_rstream set by app, for example the AGC
* module in Chrome.
* Args:
* data - The input data that holds pointer to APM instance.
* idev_sw_agin_scaler - The gain scaler configured on input iodev.
* stream - To provide stream layer software gain.
* Returns:
* 1.0 if tuned APM in use, otherwise |iodev gain| * |cras_rstream gain|
*/
float input_data_get_software_gain_scaler(struct input_data *data,
float idev_sw_gain_scaler,
struct cras_rstream *stream);
#endif /* INPUT_DATA_H_ */