/* 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_ */
