/* Copyright (c) 2013 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 DSPUTIL_H_
#define DSPUTIL_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include "cras_audio_format.h"
/* Converts from interleaved int16_t samples to non-interleaved float samples.
* The int16_t samples have range [-32768, 32767], and the float samples have
* range [-1.0, 1.0].
* Args:
* input - The interleaved input buffer. Every "channels" samples is a frame.
* output - Pointers to output buffers. There are "channels" output buffers.
* channels - The number of samples per frame.
* frames - The number of frames to convert.
* Returns:
* Negative error if format isn't supported, otherwise 0.
*/
int dsp_util_deinterleave(uint8_t *input, float *const *output, int channels,
snd_pcm_format_t format, int frames);
/* Converts from non-interleaved float samples to interleaved int16_t samples.
* The int16_t samples have range [-32768, 32767], and the float samples have
* range [-1.0, 1.0]. This is the inverse of dsputil_deinterleave().
* Args:
* input - Pointers to input buffers. There are "channels" input buffers.
* output - The interleaved output buffer. Every "channels" samples is a
* frame.
* channels - The number of samples per frame.
* frames - The number of frames to convert.
* Returns:
* Negative error if format isn't supported, otherwise 0.
*/
int dsp_util_interleave(float *const *input, uint8_t *output, int channels,
snd_pcm_format_t format, int frames);
/* Disables denormal numbers in floating point calculation. Denormal numbers
* happens often in IIR filters, and it can be very slow.
*/
void dsp_enable_flush_denormal_to_zero();
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* DSPUTIL_H_ */