mirror of
http://mpg123.de/trunk/.git
synced 2025-11-01 12:51:03 +03:00
I couldn't help myself... here is the option for a build using the generic decoder that produces 32bit float output.
You select it via --with-cpu=generic_float, which implies dummy output and also disables the buffer. The decoded audio can be written raw or to a IEEE float wav file. This demonstrates that it's doable and not too complicated for the generic code. Next would be to a) make it into a runtime option and b) adapt assembler opts to that. The latter will most likely not happen for every opt. git-svn-id: svn://scm.orgis.org/mpg123/trunk@668 35dc7657-300d-0410-a2e5-dc2837fedb53
This commit is contained in:
23
configure.ac
23
configure.ac
@@ -93,6 +93,7 @@ AC_ARG_ENABLE(fifo,
|
|||||||
|
|
||||||
AC_ARG_WITH([cpu], [
|
AC_ARG_WITH([cpu], [
|
||||||
--with-cpu=generic[_fpu] Use generic processor code with floating point arithmetic
|
--with-cpu=generic[_fpu] Use generic processor code with floating point arithmetic
|
||||||
|
--with-cpu=generic_float A special build with generic fpu code that produces 32bit float output
|
||||||
--with-cpu=generic_nofpu Use generic processor code with fixed point arithmetic (p.ex. ARM, experimental)
|
--with-cpu=generic_nofpu Use generic processor code with fixed point arithmetic (p.ex. ARM, experimental)
|
||||||
--with-cpu=i386[_fpu] Use code optimized for i386 processors with floating point arithmetic
|
--with-cpu=i386[_fpu] Use code optimized for i386 processors with floating point arithmetic
|
||||||
--with-cpu=i386_nofpu Use code optimized for i386 processors with fixed point arithmetic (experimental)
|
--with-cpu=i386_nofpu Use code optimized for i386 processors with fixed point arithmetic (experimental)
|
||||||
@@ -393,6 +394,9 @@ case $cpu_type in
|
|||||||
generic)
|
generic)
|
||||||
CFLAGS="$CFLAGS -DOPT_GENERIC -DREAL_IS_FLOAT"
|
CFLAGS="$CFLAGS -DOPT_GENERIC -DREAL_IS_FLOAT"
|
||||||
;;
|
;;
|
||||||
|
generic_float)
|
||||||
|
CFLAGS="$CFLAGS -DOPT_GENERIC -DFLOATOUT -DNOXFERMEM -DREAL_IS_FLOAT"
|
||||||
|
;;
|
||||||
generic_fpu)
|
generic_fpu)
|
||||||
CFLAGS="$CFLAGS -DOPT_GENERIC -DREAL_IS_FLOAT"
|
CFLAGS="$CFLAGS -DOPT_GENERIC -DREAL_IS_FLOAT"
|
||||||
;;
|
;;
|
||||||
@@ -444,7 +448,11 @@ case $cpu_type in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
CPU_TYPE_LIB="libcpu_$cpu_type.a"
|
if test $cpu_type = "generic_float"; then
|
||||||
|
CPU_TYPE_LIB="libcpu_generic.a"
|
||||||
|
else
|
||||||
|
CPU_TYPE_LIB="libcpu_$cpu_type.a"
|
||||||
|
fi
|
||||||
AC_SUBST( CPU_TYPE_LIB )
|
AC_SUBST( CPU_TYPE_LIB )
|
||||||
|
|
||||||
|
|
||||||
@@ -503,8 +511,10 @@ AC_DEFINE_UNQUOTED(INDEX_SIZE, $seektable, [size of the frame index seek table])
|
|||||||
dnl ############## Audio Sub-system Settings
|
dnl ############## Audio Sub-system Settings
|
||||||
|
|
||||||
# Choose audio subsystem based on what we have.
|
# Choose audio subsystem based on what we have.
|
||||||
|
if test $cpu_type = "generic_float"; then
|
||||||
if test "x$HAVE_ALSA" = "xyes"; then
|
audio_system="dummy"
|
||||||
|
AC_MSG_WARN( Defaulting to dummy output with float samples, as the audio device system cannot handle floats. )
|
||||||
|
elif test "x$HAVE_ALSA" = "xyes"; then
|
||||||
audio_system="alsa"
|
audio_system="alsa"
|
||||||
elif test "x$HAVE_OSS" = "xyes"; then
|
elif test "x$HAVE_OSS" = "xyes"; then
|
||||||
audio_system="oss"
|
audio_system="oss"
|
||||||
@@ -683,7 +693,12 @@ echo ")
|
|||||||
Seek table size ......... $seektable
|
Seek table size ......... $seektable
|
||||||
FIFO support ............ $fifo
|
FIFO support ............ $fifo
|
||||||
"
|
"
|
||||||
|
if test $cpu_type = "generic_float"; then
|
||||||
|
echo "You chose the generic build with 32bit float output.
|
||||||
|
That means output via -s, -O or -w to a file/pipe and no buffer.
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$debugging" = "enabled"; then
|
if test "$debugging" = "enabled"; then
|
||||||
echo "CFLAGS='$CFLAGS'"
|
echo "CFLAGS='$CFLAGS'"
|
||||||
echo "LIBS='$LIBS'"
|
echo "LIBS='$LIBS'"
|
||||||
|
|||||||
12
src/common.c
12
src/common.c
@@ -73,7 +73,7 @@ unsigned long track_frames = 0;
|
|||||||
#define TRACK_MAX_FRAMES ULONG_MAX/4/1152
|
#define TRACK_MAX_FRAMES ULONG_MAX/4/1152
|
||||||
|
|
||||||
/* this could become a struct... */
|
/* this could become a struct... */
|
||||||
long lastscale = -1; /* last used scale */
|
scale_t lastscale = -1; /* last used scale */
|
||||||
int rva_level[2] = {-1,-1}; /* significance level of stored rva */
|
int rva_level[2] = {-1,-1}; /* significance level of stored rva */
|
||||||
float rva_gain[2] = {0,0}; /* mix, album */
|
float rva_gain[2] = {0,0}; /* mix, album */
|
||||||
float rva_peak[2] = {0,0};
|
float rva_peak[2] = {0,0};
|
||||||
@@ -129,6 +129,9 @@ unsigned long samples_to_bytes(unsigned long s, struct frame *fr , struct audio_
|
|||||||
samf = floor(sammy);
|
samf = floor(sammy);
|
||||||
return (unsigned long)
|
return (unsigned long)
|
||||||
(((ai->format & AUDIO_FORMAT_MASK) == AUDIO_FORMAT_16) ? 2 : 1)
|
(((ai->format & AUDIO_FORMAT_MASK) == AUDIO_FORMAT_16) ? 2 : 1)
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
* 2
|
||||||
|
#endif
|
||||||
* ai->channels
|
* ai->channels
|
||||||
* (int) (((sammy - samf) < 0.5) ? samf : ( sammy-samf > 0.5 ? samf+1 : ((unsigned long) samf % 2 == 0 ? samf : samf + 1)));
|
* (int) (((sammy - samf) < 0.5) ? samf : ( sammy-samf > 0.5 ? samf+1 : ((unsigned long) samf % 2 == 0 ? samf : samf + 1)));
|
||||||
}
|
}
|
||||||
@@ -247,9 +250,10 @@ void do_volume(double factor)
|
|||||||
/* adjust the volume, taking both outscale and rva values into account */
|
/* adjust the volume, taking both outscale and rva values into account */
|
||||||
void do_rva()
|
void do_rva()
|
||||||
{
|
{
|
||||||
float rvafact = 1;
|
double rvafact = 1;
|
||||||
float peak = 0;
|
float peak = 0;
|
||||||
long newscale;
|
scale_t newscale;
|
||||||
|
|
||||||
if(param.rva)
|
if(param.rva)
|
||||||
{
|
{
|
||||||
int rt = 0;
|
int rt = 0;
|
||||||
@@ -272,7 +276,7 @@ void do_rva()
|
|||||||
/* if peak is unknown (== 0) this check won't hurt */
|
/* if peak is unknown (== 0) this check won't hurt */
|
||||||
if((peak*newscale) > MAXOUTBURST)
|
if((peak*newscale) > MAXOUTBURST)
|
||||||
{
|
{
|
||||||
newscale = (long) ((float) MAXOUTBURST/peak);
|
newscale = (scale_t) ((double) MAXOUTBURST/peak);
|
||||||
warning2("limiting scale value to %li to prevent clipping with indicated peak factor of %f", newscale, peak);
|
warning2("limiting scale value to %li to prevent clipping with indicated peak factor of %f", newscale, peak);
|
||||||
}
|
}
|
||||||
/* first rva setting is forced with lastscale < 0 */
|
/* first rva setting is forced with lastscale < 0 */
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ void print_stat(struct frame *fr,unsigned long no,long buffsize,struct audio_inf
|
|||||||
void clear_stat();
|
void clear_stat();
|
||||||
|
|
||||||
/* rva data, used in common.c, set in id3.c */
|
/* rva data, used in common.c, set in id3.c */
|
||||||
extern long lastscale;
|
extern scale_t lastscale;
|
||||||
extern int rva_level[2];
|
extern int rva_level[2];
|
||||||
extern float rva_gain[2];
|
extern float rva_gain[2];
|
||||||
extern float rva_peak[2];
|
extern float rva_peak[2];
|
||||||
|
|||||||
51
src/decode.c
51
src/decode.c
@@ -12,16 +12,14 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "mpg123.h"
|
#include "mpg123.h"
|
||||||
|
#include "decode.h"
|
||||||
|
|
||||||
#define WRITE_SAMPLE(samples,sum,clip) \
|
/* 8bit functions silenced for FLOATOUT */
|
||||||
if( (sum) > REAL_PLUS_32767) { *(samples) = 0x7fff; (clip)++; } \
|
|
||||||
else if( (sum) < REAL_MINUS_32768) { *(samples) = -0x8000; (clip)++; } \
|
|
||||||
else { *(samples) = REAL_TO_SHORT(sum); }
|
|
||||||
|
|
||||||
int synth_1to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
int synth_1to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[64];
|
sample_t samples_tmp[64];
|
||||||
short *tmp1 = samples_tmp + channel;
|
sample_t *tmp1 = samples_tmp + channel;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1=0;
|
int pnt1=0;
|
||||||
|
|
||||||
@@ -29,7 +27,11 @@ int synth_1to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
|||||||
samples += channel + *pnt;
|
samples += channel + *pnt;
|
||||||
|
|
||||||
for(i=0;i<32;i++) {
|
for(i=0;i<32;i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples = 0;
|
||||||
|
#else
|
||||||
*samples = conv16to8[*tmp1>>AUSHIFT];
|
*samples = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
samples += 2;
|
samples += 2;
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
@@ -40,8 +42,8 @@ int synth_1to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_1to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_1to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[64];
|
sample_t samples_tmp[64];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -49,7 +51,11 @@ int synth_1to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<32;i++) {
|
for(i=0;i<32;i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples++ = 0;
|
||||||
|
#else
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += 32;
|
*pnt += 32;
|
||||||
@@ -59,8 +65,8 @@ int synth_1to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_1to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_1to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[64];
|
sample_t samples_tmp[64];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -68,8 +74,13 @@ int synth_1to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<32;i++) {
|
for(i=0;i<32;i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples++ = 0;
|
||||||
|
*samples++ = 0;
|
||||||
|
#else
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += 64;
|
*pnt += 64;
|
||||||
@@ -79,8 +90,8 @@ int synth_1to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_1to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_1to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[64];
|
sample_t samples_tmp[64];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -88,11 +99,11 @@ int synth_1to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<32;i++) {
|
for(i=0;i<32;i++) {
|
||||||
*( (short *)samples) = *tmp1;
|
*( (sample_t *)samples) = *tmp1;
|
||||||
samples += 2;
|
samples += sizeof(sample_t);
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += 64;
|
*pnt += 32*sizeof(sample_t);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -103,11 +114,11 @@ int synth_1to1_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
int i,ret;
|
int i,ret;
|
||||||
|
|
||||||
ret = synth_1to1(bandPtr,0,samples,pnt);
|
ret = synth_1to1(bandPtr,0,samples,pnt);
|
||||||
samples = samples + *pnt - 128;
|
samples = samples + *pnt - 64*sizeof(sample_t);
|
||||||
|
|
||||||
for(i=0;i<32;i++) {
|
for(i=0;i<32;i++) {
|
||||||
((short *)samples)[1] = ((short *)samples)[0];
|
((sample_t *)samples)[1] = ((sample_t *)samples)[0];
|
||||||
samples+=4;
|
samples+=2*sizeof(sample_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -119,7 +130,7 @@ int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
|
|||||||
static real buffs[2][2][0x110];
|
static real buffs[2][2][0x110];
|
||||||
static const int step = 2;
|
static const int step = 2;
|
||||||
static int bo = 1;
|
static int bo = 1;
|
||||||
short *samples = (short *) (out+*pnt);
|
sample_t *samples = (sample_t *) (out+*pnt);
|
||||||
|
|
||||||
real *b0,(*buf)[0x110];
|
real *b0,(*buf)[0x110];
|
||||||
int clip = 0;
|
int clip = 0;
|
||||||
@@ -216,7 +227,7 @@ int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*pnt += 128;
|
*pnt += 64*sizeof(sample_t);
|
||||||
|
|
||||||
return clip;
|
return clip;
|
||||||
}
|
}
|
||||||
|
|||||||
18
src/decode.h
Normal file
18
src/decode.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
decode.h: common definitions for decode functions
|
||||||
|
|
||||||
|
copyright 2007 by the mpg123 project - free software under the terms of the LGPL 2.1
|
||||||
|
see COPYING and AUTHORS files in distribution or http://mpg123.de
|
||||||
|
initially written by Thomas Orgis, taking WRITE_SAMPLE from decode.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
#define WRITE_SAMPLE(samples,sum,clip) *(samples) = sum
|
||||||
|
#define sample_t float
|
||||||
|
#else
|
||||||
|
#define WRITE_SAMPLE(samples,sum,clip) \
|
||||||
|
if( (sum) > REAL_PLUS_32767) { *(samples) = 0x7fff; (clip)++; } \
|
||||||
|
else if( (sum) < REAL_MINUS_32768) { *(samples) = -0x8000; (clip)++; } \
|
||||||
|
else { *(samples) = REAL_TO_SHORT(sum); }
|
||||||
|
#define sample_t short
|
||||||
|
#endif
|
||||||
@@ -12,16 +12,12 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "mpg123.h"
|
#include "mpg123.h"
|
||||||
|
#include "decode.h"
|
||||||
#define WRITE_SAMPLE(samples,sum,clip) \
|
|
||||||
if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
|
|
||||||
else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
|
|
||||||
else { *(samples) = sum; }
|
|
||||||
|
|
||||||
int synth_2to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
int synth_2to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[32];
|
sample_t samples_tmp[32];
|
||||||
short *tmp1 = samples_tmp + channel;
|
sample_t *tmp1 = samples_tmp + channel;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -29,7 +25,11 @@ int synth_2to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
|||||||
samples += channel + *pnt;
|
samples += channel + *pnt;
|
||||||
|
|
||||||
for(i=0;i<16;i++) {
|
for(i=0;i<16;i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples = 0;
|
||||||
|
#else
|
||||||
*samples = conv16to8[*tmp1>>AUSHIFT];
|
*samples = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
samples += 2;
|
samples += 2;
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
@@ -40,8 +40,8 @@ int synth_2to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_2to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_2to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[32];
|
sample_t samples_tmp[32];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -49,7 +49,11 @@ int synth_2to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<16;i++) {
|
for(i=0;i<16;i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples++ = 0;
|
||||||
|
#else
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += 16;
|
*pnt += 16;
|
||||||
@@ -60,8 +64,8 @@ int synth_2to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_2to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_2to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[32];
|
sample_t samples_tmp[32];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -69,8 +73,13 @@ int synth_2to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<16;i++) {
|
for(i=0;i<16;i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples++ = 0;
|
||||||
|
*samples++ = 0;
|
||||||
|
#else
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += 32;
|
*pnt += 32;
|
||||||
@@ -80,8 +89,8 @@ int synth_2to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_2to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_2to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[32];
|
sample_t samples_tmp[32];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1=0;
|
int pnt1=0;
|
||||||
|
|
||||||
@@ -89,11 +98,11 @@ int synth_2to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<16;i++) {
|
for(i=0;i<16;i++) {
|
||||||
*( (short *) samples) = *tmp1;
|
*( (sample_t *) samples) = *tmp1;
|
||||||
samples += 2;
|
samples += sizeof(sample_t);
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += 32;
|
*pnt += 16*sizeof(sample_t);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -103,11 +112,11 @@ int synth_2to1_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
int i,ret;
|
int i,ret;
|
||||||
|
|
||||||
ret = synth_2to1(bandPtr,0,samples,pnt);
|
ret = synth_2to1(bandPtr,0,samples,pnt);
|
||||||
samples = samples + *pnt - 64;
|
samples = samples + *pnt - 32*sizeof(sample_t);
|
||||||
|
|
||||||
for(i=0;i<16;i++) {
|
for(i=0;i<16;i++) {
|
||||||
((short *)samples)[1] = ((short *)samples)[0];
|
((sample_t *)samples)[1] = ((sample_t *)samples)[0];
|
||||||
samples+=4;
|
samples+=2*sizeof(sample_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -118,7 +127,7 @@ int synth_2to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
|
|||||||
static real buffs[2][2][0x110];
|
static real buffs[2][2][0x110];
|
||||||
static const int step = 2;
|
static const int step = 2;
|
||||||
static int bo = 1;
|
static int bo = 1;
|
||||||
short *samples = (short *) (out + *pnt);
|
sample_t *samples = (sample_t *) (out + *pnt);
|
||||||
|
|
||||||
real *b0,(*buf)[0x110];
|
real *b0,(*buf)[0x110];
|
||||||
int clip = 0;
|
int clip = 0;
|
||||||
@@ -223,7 +232,7 @@ int synth_2to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*pnt += 64;
|
*pnt += 32*sizeof(sample_t);
|
||||||
|
|
||||||
return clip;
|
return clip;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,16 +15,12 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "mpg123.h"
|
#include "mpg123.h"
|
||||||
|
#include "decode.h"
|
||||||
#define WRITE_SAMPLE(samples,sum,clip) \
|
|
||||||
if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
|
|
||||||
else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
|
|
||||||
else { *(samples) = sum; }
|
|
||||||
|
|
||||||
int synth_4to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
int synth_4to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[16];
|
sample_t samples_tmp[16];
|
||||||
short *tmp1 = samples_tmp + channel;
|
sample_t *tmp1 = samples_tmp + channel;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -32,7 +28,11 @@ int synth_4to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
|||||||
samples += channel + *pnt;
|
samples += channel + *pnt;
|
||||||
|
|
||||||
for(i=0;i<8;i++) {
|
for(i=0;i<8;i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples = 0;
|
||||||
|
#else
|
||||||
*samples = conv16to8[*tmp1>>AUSHIFT];
|
*samples = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
samples += 2;
|
samples += 2;
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
@@ -43,8 +43,8 @@ int synth_4to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_4to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_4to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[16];
|
sample_t samples_tmp[16];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -52,7 +52,11 @@ int synth_4to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<8;i++) {
|
for(i=0;i<8;i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples++ = 0;
|
||||||
|
#else
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += 8;
|
*pnt += 8;
|
||||||
@@ -63,8 +67,8 @@ int synth_4to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_4to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_4to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[16];
|
sample_t samples_tmp[16];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -72,8 +76,13 @@ int synth_4to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<8;i++) {
|
for(i=0;i<8;i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples++ = 0;
|
||||||
|
*samples++ = 0;
|
||||||
|
#else
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += 16;
|
*pnt += 16;
|
||||||
@@ -83,8 +92,8 @@ int synth_4to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_4to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_4to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[16];
|
sample_t samples_tmp[16];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -92,11 +101,11 @@ int synth_4to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<8;i++) {
|
for(i=0;i<8;i++) {
|
||||||
*( (short *)samples) = *tmp1;
|
*( (sample_t *)samples) = *tmp1;
|
||||||
samples += 2;
|
samples += sizeof(sample_t);
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += 16;
|
*pnt += 8*sizeof(sample_t);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -106,11 +115,11 @@ int synth_4to1_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
int i,ret;
|
int i,ret;
|
||||||
|
|
||||||
ret = synth_4to1(bandPtr,0,samples,pnt);
|
ret = synth_4to1(bandPtr,0,samples,pnt);
|
||||||
samples = samples + *pnt - 32;
|
samples = samples + *pnt - 16*sizeof(sample_t);
|
||||||
|
|
||||||
for(i=0;i<8;i++) {
|
for(i=0;i<8;i++) {
|
||||||
((short *)samples)[1] = ((short *)samples)[0];
|
((sample_t *)samples)[1] = ((sample_t *)samples)[0];
|
||||||
samples+=4;
|
samples+=2*sizeof(sample_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -121,7 +130,7 @@ int synth_4to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
|
|||||||
static real buffs[2][2][0x110];
|
static real buffs[2][2][0x110];
|
||||||
static const int step = 2;
|
static const int step = 2;
|
||||||
static int bo = 1;
|
static int bo = 1;
|
||||||
short *samples = (short *) (out + *pnt);
|
sample_t *samples = (sample_t *) (out + *pnt);
|
||||||
|
|
||||||
real *b0,(*buf)[0x110];
|
real *b0,(*buf)[0x110];
|
||||||
int clip = 0;
|
int clip = 0;
|
||||||
@@ -232,7 +241,7 @@ int synth_4to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*pnt += 32;
|
*pnt += 16*sizeof(sample_t);
|
||||||
|
|
||||||
return clip;
|
return clip;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,11 +13,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "mpg123.h"
|
#include "mpg123.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include "decode.h"
|
||||||
#define WRITE_SAMPLE(samples,sum,clip) \
|
|
||||||
if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
|
|
||||||
else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
|
|
||||||
else { *(samples) = sum; }
|
|
||||||
|
|
||||||
#define NTOM_MUL (32768)
|
#define NTOM_MUL (32768)
|
||||||
static unsigned long ntom_val[2] = { NTOM_MUL>>1,NTOM_MUL>>1 };
|
static unsigned long ntom_val[2] = { NTOM_MUL>>1,NTOM_MUL>>1 };
|
||||||
@@ -48,8 +44,8 @@ int synth_ntom_set_step(long m,long n)
|
|||||||
|
|
||||||
int synth_ntom_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
int synth_ntom_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[8*64];
|
sample_t samples_tmp[8*64];
|
||||||
short *tmp1 = samples_tmp + channel;
|
sample_t *tmp1 = samples_tmp + channel;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -57,7 +53,11 @@ int synth_ntom_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
|||||||
samples += channel + *pnt;
|
samples += channel + *pnt;
|
||||||
|
|
||||||
for(i=0;i<(pnt1>>2);i++) {
|
for(i=0;i<(pnt1>>2);i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples = 0;
|
||||||
|
#else
|
||||||
*samples = conv16to8[*tmp1>>AUSHIFT];
|
*samples = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
samples += 2;
|
samples += 2;
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
@@ -68,8 +68,8 @@ int synth_ntom_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_ntom_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_ntom_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[8*64];
|
sample_t samples_tmp[8*64];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -77,7 +77,11 @@ int synth_ntom_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<(pnt1>>2);i++) {
|
for(i=0;i<(pnt1>>2);i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples++ = 0;
|
||||||
|
#else
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += pnt1 >> 2;
|
*pnt += pnt1 >> 2;
|
||||||
@@ -87,8 +91,8 @@ int synth_ntom_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_ntom_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_ntom_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[8*64];
|
sample_t samples_tmp[8*64];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -96,8 +100,13 @@ int synth_ntom_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<(pnt1>>2);i++) {
|
for(i=0;i<(pnt1>>2);i++) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
*samples++ = 0;
|
||||||
|
*samples++ = 0;
|
||||||
|
#else
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
*samples++ = conv16to8[*tmp1>>AUSHIFT];
|
||||||
|
#endif
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += pnt1 >> 1;
|
*pnt += pnt1 >> 1;
|
||||||
@@ -107,8 +116,8 @@ int synth_ntom_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
|
|
||||||
int synth_ntom_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
int synth_ntom_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
{
|
{
|
||||||
short samples_tmp[8*64];
|
sample_t samples_tmp[8*64];
|
||||||
short *tmp1 = samples_tmp;
|
sample_t *tmp1 = samples_tmp;
|
||||||
int i,ret;
|
int i,ret;
|
||||||
int pnt1 = 0;
|
int pnt1 = 0;
|
||||||
|
|
||||||
@@ -116,11 +125,11 @@ int synth_ntom_mono(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += *pnt;
|
samples += *pnt;
|
||||||
|
|
||||||
for(i=0;i<(pnt1>>2);i++) {
|
for(i=0;i<(pnt1>>2);i++) {
|
||||||
*( (short *)samples) = *tmp1;
|
*( (sample_t *)samples) = *tmp1;
|
||||||
samples += 2;
|
samples += sizeof(sample_t);
|
||||||
tmp1 += 2;
|
tmp1 += 2;
|
||||||
}
|
}
|
||||||
*pnt += pnt1 >> 1;
|
*pnt += (pnt1>>2)*sizeof(sample_t);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -135,8 +144,8 @@ int synth_ntom_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
|
|||||||
samples += pnt1;
|
samples += pnt1;
|
||||||
|
|
||||||
for(i=0;i<((*pnt-pnt1)>>2);i++) {
|
for(i=0;i<((*pnt-pnt1)>>2);i++) {
|
||||||
((short *)samples)[1] = ((short *)samples)[0];
|
((sample_t *)samples)[1] = ((sample_t *)samples)[0];
|
||||||
samples+=4;
|
samples+=2*sizeof(sample_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -148,7 +157,7 @@ int synth_ntom(real *bandPtr,int channel,unsigned char *out,int *pnt)
|
|||||||
static real buffs[2][2][0x110];
|
static real buffs[2][2][0x110];
|
||||||
static const int step = 2;
|
static const int step = 2;
|
||||||
static int bo = 1;
|
static int bo = 1;
|
||||||
short *samples = (short *) (out + *pnt);
|
sample_t *samples = (sample_t *) (out + *pnt);
|
||||||
|
|
||||||
real *b0,(*buf)[0x110];
|
real *b0,(*buf)[0x110];
|
||||||
int clip = 0;
|
int clip = 0;
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ int performoption (int argc, char *argv[], topt *opt)
|
|||||||
debug1("int at %p", opt->var);
|
debug1("int at %p", opt->var);
|
||||||
*( (int *) opt->var ) = (int) opt->value;
|
*( (int *) opt->var ) = (int) opt->value;
|
||||||
}
|
}
|
||||||
|
/* GLO_DOUBLE is not supported here */
|
||||||
else prog_error();
|
else prog_error();
|
||||||
|
|
||||||
debug("casting assignment done");
|
debug("casting assignment done");
|
||||||
@@ -90,6 +91,8 @@ int performoption (int argc, char *argv[], topt *opt)
|
|||||||
*((long *) opt->var) = atol(loptarg);
|
*((long *) opt->var) = atol(loptarg);
|
||||||
else if(opt->flags & GLO_INT)
|
else if(opt->flags & GLO_INT)
|
||||||
*((int *) opt->var) = atoi(loptarg);
|
*((int *) opt->var) = atoi(loptarg);
|
||||||
|
else if(opt->flags & GLO_DOUBLE)
|
||||||
|
*((double *) opt->var) = atof(loptarg);
|
||||||
else prog_error();
|
else prog_error();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ for .... no flag) */
|
|||||||
#define GLO_CHAR 2
|
#define GLO_CHAR 2
|
||||||
#define GLO_INT 4
|
#define GLO_INT 4
|
||||||
#define GLO_LONG 8
|
#define GLO_LONG 8
|
||||||
|
#define GLO_DOUBLE 16
|
||||||
|
|
||||||
/* flags:
|
/* flags:
|
||||||
* bit 0 = 0 - no argument
|
* bit 0 = 0 - no argument
|
||||||
|
|||||||
10
src/mpg123.c
10
src/mpg123.c
@@ -107,7 +107,7 @@ char *prgName = NULL;
|
|||||||
char *equalfile = NULL;
|
char *equalfile = NULL;
|
||||||
/* ThOr: pointers are not TRUE or FALSE */
|
/* ThOr: pointers are not TRUE or FALSE */
|
||||||
int have_eq_settings = FALSE;
|
int have_eq_settings = FALSE;
|
||||||
long outscale = MAXOUTBURST;
|
scale_t outscale = MAXOUTBURST;
|
||||||
long numframes = -1;
|
long numframes = -1;
|
||||||
long startFrame= 0;
|
long startFrame= 0;
|
||||||
int buffer_fd[2];
|
int buffer_fd[2];
|
||||||
@@ -364,7 +364,11 @@ topt opts[] = {
|
|||||||
{0, "speaker", 0, set_output_s, 0,0},
|
{0, "speaker", 0, set_output_s, 0,0},
|
||||||
{0, "lineout", 0, set_output_l, 0,0},
|
{0, "lineout", 0, set_output_l, 0,0},
|
||||||
{'o', "output", GLO_ARG | GLO_CHAR, set_output, 0, 0},
|
{'o', "output", GLO_ARG | GLO_CHAR, set_output, 0, 0},
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
{'f', "scale", GLO_ARG | GLO_DOUBLE, 0, &outscale, 0},
|
||||||
|
#else
|
||||||
{'f', "scale", GLO_ARG | GLO_LONG, 0, &outscale, 0},
|
{'f', "scale", GLO_ARG | GLO_LONG, 0, &outscale, 0},
|
||||||
|
#endif
|
||||||
{'n', "frames", GLO_ARG | GLO_LONG, 0, &numframes, 0},
|
{'n', "frames", GLO_ARG | GLO_LONG, 0, &numframes, 0},
|
||||||
#ifdef HAVE_TERMIOS
|
#ifdef HAVE_TERMIOS
|
||||||
{'C', "control", GLO_INT, 0, ¶m.term_ctrl, TRUE},
|
{'C', "control", GLO_INT, 0, ¶m.term_ctrl, TRUE},
|
||||||
@@ -1120,7 +1124,7 @@ static void usage(int err) /* print syntax & exit */
|
|||||||
fprintf(o," -w <filename> write Output as WAV file\n");
|
fprintf(o," -w <filename> write Output as WAV file\n");
|
||||||
fprintf(o," -k n skip first n frames [0] -n n decode only n frames [all]\n");
|
fprintf(o," -k n skip first n frames [0] -n n decode only n frames [all]\n");
|
||||||
fprintf(o," -c check range violations -y DISABLE resync on errors\n");
|
fprintf(o," -c check range violations -y DISABLE resync on errors\n");
|
||||||
fprintf(o," -b n output buffer: n Kbytes [0] -f n change scalefactor [32768]\n");
|
fprintf(o," -b n output buffer: n Kbytes [0] -f n change scalefactor [%g]\n", (double)outscale);
|
||||||
fprintf(o," -r n set/force samplerate [auto] -g n set audio hardware output gain\n");
|
fprintf(o," -r n set/force samplerate [auto] -g n set audio hardware output gain\n");
|
||||||
fprintf(o," -os,-ol,-oh output to built-in speaker,line-out connector,headphones\n");
|
fprintf(o," -os,-ol,-oh output to built-in speaker,line-out connector,headphones\n");
|
||||||
#ifdef NAS
|
#ifdef NAS
|
||||||
@@ -1187,7 +1191,7 @@ static void long_usage(int err)
|
|||||||
fprintf(o," --cdr <f> write samples as CDR file in <f> (- is stdout)\n");
|
fprintf(o," --cdr <f> write samples as CDR file in <f> (- is stdout)\n");
|
||||||
fprintf(o," --reopen force close/open on audiodevice\n");
|
fprintf(o," --reopen force close/open on audiodevice\n");
|
||||||
fprintf(o," -g --gain set audio hardware output gain\n");
|
fprintf(o," -g --gain set audio hardware output gain\n");
|
||||||
fprintf(o," -f <n> --scale <n> scale output samples (soft gain, default=%li)\n", outscale);
|
fprintf(o," -f <n> --scale <n> scale output samples (soft gain, default=%g)\n", (double)outscale);
|
||||||
fprintf(o," --rva-mix,\n");
|
fprintf(o," --rva-mix,\n");
|
||||||
fprintf(o," --rva-radio use RVA2/ReplayGain values for mix/radio mode\n");
|
fprintf(o," --rva-radio use RVA2/ReplayGain values for mix/radio mode\n");
|
||||||
fprintf(o," --rva-album,\n");
|
fprintf(o," --rva-album,\n");
|
||||||
|
|||||||
@@ -138,8 +138,15 @@ typedef unsigned char byte;
|
|||||||
#define MPG_MD_DUAL_CHANNEL 2
|
#define MPG_MD_DUAL_CHANNEL 2
|
||||||
#define MPG_MD_MONO 3
|
#define MPG_MD_MONO 3
|
||||||
|
|
||||||
|
/* float output only for generic decoder! */
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
#define MAXOUTBURST 1.0
|
||||||
|
#define scale_t double
|
||||||
|
#else
|
||||||
/* I suspect that 32767 would be a better idea here, but Michael put this in... */
|
/* I suspect that 32767 would be a better idea here, but Michael put this in... */
|
||||||
#define MAXOUTBURST 32768
|
#define MAXOUTBURST 32768
|
||||||
|
#define scale_t long
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Pre Shift fo 16 to 8 bit converter table */
|
/* Pre Shift fo 16 to 8 bit converter table */
|
||||||
#define AUSHIFT (3)
|
#define AUSHIFT (3)
|
||||||
@@ -417,7 +424,7 @@ extern struct parameter param;
|
|||||||
|
|
||||||
/* avoid the SIGINT in terminal control */
|
/* avoid the SIGINT in terminal control */
|
||||||
void next_track(void);
|
void next_track(void);
|
||||||
extern long outscale;
|
extern scale_t outscale;
|
||||||
|
|
||||||
#include "optimize.h"
|
#include "optimize.h"
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ typedef int (*func_synth_pent)(real *,int,unsigned char *);
|
|||||||
/* last headaches about getting mmx hardcode out */
|
/* last headaches about getting mmx hardcode out */
|
||||||
real init_layer3_gainpow2(int i);
|
real init_layer3_gainpow2(int i);
|
||||||
real* init_layer2_table(real *table, double m);
|
real* init_layer2_table(real *table, double m);
|
||||||
void make_decode_tables(long scale);
|
void make_decode_tables(scale_t scaleval);
|
||||||
|
|
||||||
/* only 3dnow replaces that one, it's internal to layer3.c otherwise */
|
/* only 3dnow replaces that one, it's internal to layer3.c otherwise */
|
||||||
void dct36(real *,real *,real *,real *,real *);
|
void dct36(real *,real *,real *,real *,real *);
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ static long intwinbase[] = {
|
|||||||
64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835,
|
64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835,
|
||||||
73415, 73908, 74313, 74630, 74856, 74992, 75038 };
|
73415, 73908, 74313, 74630, 74856, 74992, 75038 };
|
||||||
|
|
||||||
void make_decode_tables(long scaleval)
|
void make_decode_tables(scale_t scaleval)
|
||||||
{
|
{
|
||||||
int i,j,k,kr,divv;
|
int i,j,k,kr,divv;
|
||||||
real *costab;
|
real *costab;
|
||||||
|
|||||||
135
src/wav.c
135
src/wav.c
@@ -20,36 +20,71 @@
|
|||||||
#include "mpg123.h"
|
#include "mpg123.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
#define WAVE_FORMAT 3
|
||||||
|
#else
|
||||||
|
#define WAVE_FORMAT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
byte riffheader[4];
|
byte riffheader[4];
|
||||||
byte WAVElen[4];
|
byte WAVElen[4]; /* should this include riffheader or not? */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
byte fmtheader[8];
|
byte WAVEID[4];
|
||||||
byte fmtlen[4];
|
byte fmtheader[4];
|
||||||
struct
|
byte fmtlen[4];
|
||||||
{
|
struct
|
||||||
byte FormatTag[2];
|
{
|
||||||
byte Channels[2];
|
byte FormatTag[2];
|
||||||
byte SamplesPerSec[4];
|
byte Channels[2];
|
||||||
byte AvgBytesPerSec[4];
|
byte SamplesPerSec[4];
|
||||||
byte BlockAlign[2];
|
byte AvgBytesPerSec[4];
|
||||||
byte BitsPerSample[2]; /* format specific for PCM */
|
byte BlockAlign[2];
|
||||||
} fmt;
|
byte BitsPerSample[2]; /* format specific for PCM */
|
||||||
struct
|
#ifdef FLOATOUT
|
||||||
{
|
byte cbSize[2];
|
||||||
byte dataheader[4];
|
#endif
|
||||||
byte datalen[4];
|
} fmt;
|
||||||
/* from here you insert your PCM data */
|
#ifdef FLOATOUT
|
||||||
} data;
|
byte factheader[4];
|
||||||
} WAVE;
|
byte factlen[4];
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
byte samplelen[4];
|
||||||
|
} fact;
|
||||||
|
#endif
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
byte dataheader[4];
|
||||||
|
byte datalen[4];
|
||||||
|
/* from here you insert your PCM data */
|
||||||
|
} data;
|
||||||
|
} WAVE;
|
||||||
} RIFF =
|
} RIFF =
|
||||||
{ { 'R','I','F','F' } , { sizeof(RIFF.WAVE),0,0,0 } ,
|
{
|
||||||
{ { 'W','A','V','E','f','m','t',' ' } , { sizeof(RIFF.WAVE.fmt),0,0,0} ,
|
{ 'R','I','F','F' } ,
|
||||||
{ {1,0} , {0,0},{0,0,0,0},{0,0,0,0},{0,0},{0,0} } ,
|
{ sizeof(RIFF.WAVE),0,0,0 } ,
|
||||||
{ { 'd','a','t','a' } , {0,0,0,0} }
|
{
|
||||||
}
|
{ 'W','A','V','E' },
|
||||||
|
{ 'f','m','t',' ' },
|
||||||
|
{ sizeof(RIFF.WAVE.fmt),0,0,0 } ,
|
||||||
|
{
|
||||||
|
{WAVE_FORMAT,0} , {0,0},{0,0,0,0},{0,0,0,0},{0,0},{0,0}
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
,{0,0}
|
||||||
|
#endif
|
||||||
|
} ,
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
{ 'f','a','c','t' },
|
||||||
|
{ sizeof(RIFF.WAVE.fact),0,0,0 },
|
||||||
|
{
|
||||||
|
{0,0,0,0} /* to be filled later, like datalen and wavelen */
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
{ { 'd','a','t','a' } , {0,0,0,0} }
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct auhead {
|
struct auhead {
|
||||||
@@ -90,6 +125,15 @@ static void long2bigendian(long inval,byte *outval,int b)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long from_little(byte *inval, int b)
|
||||||
|
{
|
||||||
|
long ret = 0;
|
||||||
|
int i;
|
||||||
|
for(i=0;i<b;++i) ret += ((long)inval[i])<<(i*8);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int testEndian(void)
|
static int testEndian(void)
|
||||||
{
|
{
|
||||||
long i,a=0,b=0,c=0;
|
long i,a=0,b=0,c=0;
|
||||||
@@ -129,6 +173,10 @@ static int open_file(char *filename)
|
|||||||
|
|
||||||
int au_open(struct audio_info_struct *ai, char *aufilename)
|
int au_open(struct audio_info_struct *ai, char *aufilename)
|
||||||
{
|
{
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
error("AU file support for float values not there yet");
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
flipendian = 0;
|
flipendian = 0;
|
||||||
|
|
||||||
switch(ai->format) {
|
switch(ai->format) {
|
||||||
@@ -161,10 +209,15 @@ int au_open(struct audio_info_struct *ai, char *aufilename)
|
|||||||
datalen = 0;
|
datalen = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int cdr_open(struct audio_info_struct *ai, char *cdrfilename)
|
int cdr_open(struct audio_info_struct *ai, char *cdrfilename)
|
||||||
{
|
{
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
error("refusing to produce cdr file with float values");
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
param.force_stereo = 0;
|
param.force_stereo = 0;
|
||||||
ai->format = AUDIO_FORMAT_SIGNED_16;
|
ai->format = AUDIO_FORMAT_SIGNED_16;
|
||||||
ai->rate = 44100;
|
ai->rate = 44100;
|
||||||
@@ -182,6 +235,7 @@ int cdr_open(struct audio_info_struct *ai, char *cdrfilename)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int wav_open(struct audio_info_struct *ai, char *wavfilename)
|
int wav_open(struct audio_info_struct *ai, char *wavfilename)
|
||||||
@@ -191,8 +245,11 @@ int wav_open(struct audio_info_struct *ai, char *wavfilename)
|
|||||||
flipendian = 0;
|
flipendian = 0;
|
||||||
|
|
||||||
/* standard MS PCM, and its format specific is BitsPerSample */
|
/* standard MS PCM, and its format specific is BitsPerSample */
|
||||||
long2littleendian(1,RIFF.WAVE.fmt.FormatTag,sizeof(RIFF.WAVE.fmt.FormatTag));
|
long2littleendian(WAVE_FORMAT,RIFF.WAVE.fmt.FormatTag,sizeof(RIFF.WAVE.fmt.FormatTag));
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
long2littleendian(bps=32,RIFF.WAVE.fmt.BitsPerSample,sizeof(RIFF.WAVE.fmt.BitsPerSample));
|
||||||
|
flipendian = testEndian();
|
||||||
|
#else
|
||||||
if(ai->format == AUDIO_FORMAT_SIGNED_16) {
|
if(ai->format == AUDIO_FORMAT_SIGNED_16) {
|
||||||
long2littleendian(bps=16,RIFF.WAVE.fmt.BitsPerSample,sizeof(RIFF.WAVE.fmt.BitsPerSample));
|
long2littleendian(bps=16,RIFF.WAVE.fmt.BitsPerSample,sizeof(RIFF.WAVE.fmt.BitsPerSample));
|
||||||
flipendian = testEndian();
|
flipendian = testEndian();
|
||||||
@@ -204,6 +261,7 @@ int wav_open(struct audio_info_struct *ai, char *wavfilename)
|
|||||||
error("Format not supported.");
|
error("Format not supported.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if(ai->rate < 0) ai->rate = 44100;
|
if(ai->rate < 0) ai->rate = 44100;
|
||||||
|
|
||||||
@@ -235,6 +293,20 @@ int wav_write(unsigned char *buf,int len)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(flipendian) {
|
if(flipendian) {
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
if(len & 3)
|
||||||
|
{
|
||||||
|
error("Number of bytes no multiple of 4 (32bit)!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
for(i=0;i<len;i+=4)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
unsigned char tmp[4];
|
||||||
|
for(j = 0; j<=3; ++j) tmp[j] = buf[i+j];
|
||||||
|
for(j = 0; j<=3; ++j) buf[i+j] = tmp[3-j];
|
||||||
|
}
|
||||||
|
#else
|
||||||
if(len & 1) {
|
if(len & 1) {
|
||||||
error("Odd number of bytes!");
|
error("Odd number of bytes!");
|
||||||
return 0;
|
return 0;
|
||||||
@@ -245,6 +317,7 @@ int wav_write(unsigned char *buf,int len)
|
|||||||
buf[i+0] = buf[i+1];
|
buf[i+0] = buf[i+1];
|
||||||
buf[i+1] = tmp;
|
buf[i+1] = tmp;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
temp = fwrite(buf, 1, len, wavfp);
|
temp = fwrite(buf, 1, len, wavfp);
|
||||||
@@ -264,6 +337,10 @@ int wav_close(void)
|
|||||||
if(fseek(wavfp, 0L, SEEK_SET) >= 0) {
|
if(fseek(wavfp, 0L, SEEK_SET) >= 0) {
|
||||||
long2littleendian(datalen,RIFF.WAVE.data.datalen,sizeof(RIFF.WAVE.data.datalen));
|
long2littleendian(datalen,RIFF.WAVE.data.datalen,sizeof(RIFF.WAVE.data.datalen));
|
||||||
long2littleendian(datalen+sizeof(RIFF.WAVE),RIFF.WAVElen,sizeof(RIFF.WAVElen));
|
long2littleendian(datalen+sizeof(RIFF.WAVE),RIFF.WAVElen,sizeof(RIFF.WAVElen));
|
||||||
|
#ifdef FLOATOUT
|
||||||
|
long2littleendian(datalen/(from_little(RIFF.WAVE.fmt.Channels,2)*from_little(RIFF.WAVE.fmt.BitsPerSample,2)/8),
|
||||||
|
RIFF.WAVE.fact.samplelen,sizeof(RIFF.WAVE.fact.samplelen));
|
||||||
|
#endif
|
||||||
fwrite(&RIFF, sizeof(RIFF),1,wavfp);
|
fwrite(&RIFF, sizeof(RIFF),1,wavfp);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
Reference in New Issue
Block a user