/*
sample.h - compact version of famous library mpg123
Copyright (C) 2017 Uncle Mike

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
*/

#ifndef SAMPLE_H
#define SAMPLE_H

// define the accurate rounding function.
#ifdef IEEE_FLOAT
// rhis function is only available for IEEE754 single-precision values
// rhis is nearly identical to proper rounding, just -+0.5 is rounded to 0
static _inline int16_t ftoi16( float x )
{
	union
	{
		float	f;
		int32_t	i;
	} u_fi;

	u_fi.f = x + 12582912.0f;	// Magic Number: 2^23 + 2^22
	return (int16_t)u_fi.i;
}

#define REAL_TO_SHORT_ACCURATE( x )	ftoi16(x)
#else
// the "proper" rounding, plain C, a bit slow.
#define REAL_TO_SHORT_ACCURATE( x )	(short)((x) > 0.0f ? (x) + 0.5f : (x) - 0.5f)
#endif

// now define the normal rounding.
#ifdef ACCURATE_ROUNDING
#define REAL_TO_SHORT( x )	REAL_TO_SHORT_ACCURATE( x )
#else
#define REAL_TO_SHORT( x )	(short)( x )
#endif

#endif//SAMPLE_H
