You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/noatun/library/conversion.cpp

150 lines
3.9 KiB

#include "noatun/conversion.h"
// inherit the aRts routines
#include <convert.h>
#include <config.h>
#include <limits.h>
namespace Conversion
{
void convertMono8ToFloat(unsigned long samples, unsigned char *from, float *to)
{
Arts::convert_mono_8_float(samples, from, to);
}
void interpolateMono8ToFloat(unsigned long samples, double start, double speed,
unsigned char *from, float *to)
{
Arts::interpolate_mono_8_float(samples, start, speed, from, to);
}
void convertMono16leToFloat(unsigned long samples, unsigned char *from, float *to)
{
Arts::convert_mono_16le_float(samples, from, to);
}
void interpolateMono16leToFloat(unsigned long samples, double startpos, double speed,
unsigned char *from, float *to)
{
Arts::interpolate_mono_16le_float(samples, startpos, speed, from, to);
}
void convertStereoI8To2Float(unsigned long samples, unsigned char *from,
float *left, float *right)
{
Arts::convert_stereo_i8_2float(samples, from, left, right);
}
void interpolateStereoI8To2Float(unsigned long samples, double startpos, double speed,
unsigned char *from, float *left, float *right)
{
Arts::interpolate_stereo_i8_2float(samples, startpos, speed, from, left, right);
}
void convertStereoI16leTo2Float(unsigned long samples, unsigned char *from, float *left,
float *right)
{
Arts::convert_stereo_i16le_2float(samples, from, left, right);
}
void interpolateStereoI16leTo2Float(unsigned long samples, double startpos, double speed,
unsigned char *from, float *left, float *right)
{
Arts::interpolate_stereo_i16le_2float(samples, startpos, speed, from, left, right);
}
void interpolateMonoFloatToFloat(unsigned long samples, double startpos, double speed,
float *from, float *to)
{
Arts::interpolate_mono_float_float( samples, startpos, speed, from, to);
}
void convertStereoIFloatTo2Float(unsigned long samples, float *from, float *left,
float *right)
{
Arts::convert_stereo_ifloat_2float(samples, from, left, right);
}
void interpolateStereoIFloatTo2Float(unsigned long samples, double startpos,
double speed, float *from, float *left,
float *right)
{
Arts::interpolate_stereo_ifloat_2float(samples, startpos, speed, from, left, right);
}
void convertMonoFloatTo16le(unsigned long samples, float *from, unsigned char *to)
{
Arts::convert_mono_float_16le(samples, from, to);
}
void convertStereo2FloatToI16le(unsigned long samples, float *left, float *right,
unsigned char *to)
{
Arts::convert_stereo_2float_i16le(samples, left, right, to);
}
void convertMonoFloatTo8(unsigned long samples, float *from, unsigned char *to)
{
Arts::convert_mono_float_8(samples, from, to);
}
void convertStereo2FloatToI8(unsigned long samples, float *left, float *right,
unsigned char *to)
{
Arts::convert_stereo_2float_i8(samples, left, right, to);
}
inline void toLittleEndian(unsigned long length, char *buffer)
{
#ifdef WORDS_BIGENDIAN
swapEndian(length, buffer);
#else
(void)length;
(void)buffer;
#endif
}
inline void toBigEndian(unsigned long length, char *buffer)
{
#ifndef WORDS_BIGENDIAN
swapEndian(length, buffer);
#else
(void)length;
(void)buffer;
#endif
}
void swapEndian(unsigned long length, char *buffer)
{
// if you use a little-endian non intel box, and the ASM
// version doesn't work, it's safe to use the C version
#ifdef __i386__
__asm__(
"shrl $1,%0\n"
"jz .l2\n"
".l1:\n"
"rolw $8,(%1)\n"
"incl %1\n"
"incl %1\n"
"decl %0\n"
"jnz .l1\n"
".l2:\n"
: : "r" (length), "r" (buffer));
#else
while (length--)
{
char c=*(buffer+1);
*(buffer+1)=*buffer;
*(buffer)=c;
buffer++; buffer++;
--length;
}
#endif
}
}