/* 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.
*/
/*
* Used to convert from one audio format to another. Currently only supports
* sample rate conversion with the speex backend.
*/
#ifndef CRAS_FMT_CONV_H_
#define CRAS_FMT_CONV_H_
#include <stdint.h>
#include <stdlib.h>
#include "cras_types.h"
struct cras_audio_format;
struct cras_fmt_conv;
/* Create and destroy format converters. */
struct cras_fmt_conv *cras_fmt_conv_create(const struct cras_audio_format *in,
const struct cras_audio_format *out,
size_t max_frames,
size_t pre_linear_resample);
void cras_fmt_conv_destroy(struct cras_fmt_conv *conv);
/* Creates the format converter for channel remixing. The conversion takes
* a N by N float matrix, to multiply each N-channels sample.
* Args:
* num_channels - Number of channels of PCM data.
* coefficient - Float array of length N * N representing the conversion
* matrix, where matrix[i][j] corresponds to coefficient[i * N + j]
*/
struct cras_fmt_conv *cras_channel_remix_conv_create(
unsigned int num_channels,
const float *coefficient);
/* Converts nframes of sample from in_buf, using given remix converter.
* Args:
* conv - The format converter.
* fmt - The format of the buffer to convert.
* in_buf - The buffer to convert.
* nframes - The number of frames to convert.
*/
void cras_channel_remix_convert(struct cras_fmt_conv *conv,
const struct cras_audio_format *fmt,
uint8_t *in_buf,
size_t nframes);
/* Get the input format of the converter. */
const struct cras_audio_format *cras_fmt_conv_in_format(
const struct cras_fmt_conv *conv);
/* Get the output format of the converter. */
const struct cras_audio_format *cras_fmt_conv_out_format(
const struct cras_fmt_conv *conv);
/* Get the number of output frames that will result from converting in_frames */
size_t cras_fmt_conv_in_frames_to_out(struct cras_fmt_conv *conv,
size_t in_frames);
/* Get the number of input frames that will result from converting out_frames */
size_t cras_fmt_conv_out_frames_to_in(struct cras_fmt_conv *conv,
size_t out_frames);
/* Sets the input and output rate to the linear resampler. */
void cras_fmt_conv_set_linear_resample_rates(struct cras_fmt_conv *conv,
float from,
float to);
/* Converts in_frames samples from in_buf, storing the results in out_buf.
* Args:
* conv - The format converter returned from cras_fmt_conv_create().
* in_buf - Samples to convert.
* out_buf - Converted samples are placed here.
* in_frames - Number of frames from in_buf to convert.
* out_frames - Maximum number of frames to store in out_buf. If there isn't
* any format conversion, out_frames must be >= in_frames. When doing
* format conversion out_frames should be able to hold all the converted
* frames, this can be checked with cras_fmt_conv_in_frames_to_out().
* Return number of frames put in out_buf. */
size_t cras_fmt_conv_convert_frames(struct cras_fmt_conv *conv,
const uint8_t *in_buf,
uint8_t *out_buf,
unsigned int *in_frames,
size_t out_frames);
/* Checks if format conversion is needed for a fmt converter.
* Args:
* conv - The format convert to check.
* Returns:
* Non-zero if a format conversion is needed.
*/
int cras_fmt_conversion_needed(const struct cras_fmt_conv *conv);
/* If the server cannot provide the requested format, configures an audio format
* converter that handles transforming the input format to the format used by
* the server.
* Args:
* conv - filled with the new converter if needed.
* dir - the stream direction the new converter used for.
* from - Format to convert from.
* to - Format to convert to.
* frames - size of buffer.
*/
int config_format_converter(struct cras_fmt_conv **conv,
enum CRAS_STREAM_DIRECTION dir,
const struct cras_audio_format *from,
const struct cras_audio_format *to,
unsigned int frames);
#endif /* CRAS_FMT_CONV_H_ */