From 7e28d02927b894639a0cbc2d287e7cf0c6d638ef Mon Sep 17 00:00:00 2001 From: boris_mikhaylov Date: Tue, 17 Mar 2009 11:04:34 +0000 Subject: Added handling of big/little endian buffers. git-svn-id: svn://svn.code.sf.net/p/bs2b/code/trunk/libbs2b@65 bc0edfbe-c936-4687-b64d-f70bc3985e72 --- ChangeLog | 3 + src/bs2b.c | 389 +++++++++++++++++++++++++++++++++++++++++++++++++++--- src/bs2b.h | 52 +++++--- src/bs2bclass.cpp | 60 ++++++++- src/bs2bclass.h | 16 +++ src/bs2bstream.c | 14 +- 6 files changed, 486 insertions(+), 48 deletions(-) diff --git a/ChangeLog b/ChangeLog index 28968d1..94dc473 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2009-03-17 Boris Mikhaylov + * Added handling of big/little endian buffers. + 2009-03-11 Boris Mikhaylov * Changed processing from one stereo sample to more. diff --git a/src/bs2b.c b/src/bs2b.c index febf475..66eafe3 100644 --- a/src/bs2b.c +++ b/src/bs2b.c @@ -30,13 +30,52 @@ #define M_PI 3.14159265358979323846 #endif +static void int16swap( uint16_t *x ) +{ + *x = ( *x >> 8 ) | ( *x << 8 ); +} + +static void int24swap( uint24_t *x ) +{ + uint8_t x1; + + x1 = x->octet0; + x->octet0 = x->octet2; + x->octet2 = x1; +} + +static void int32swap( uint32_t *x ) +{ + *x = ( *x >> 24 ) | ( ( *x >> 8 ) & 0xff00 ) | + ( ( *x << 8 ) & ( ( uint32_t )0xff << 16 ) ) | ( *x << 24 ); +} + +static void int64swap( uint32_t *x ) +{ + uint32_t x1; + + x1 = *x; + *x = x[ 1 ]; + x[ 1 ] = x1; + + int32swap( x ); + int32swap( x + 1 ); +} + static double int242double( int24_t *in ) { int32_t out = + #ifdef WORDS_BIGENDIAN + ( ( uint32_t )in->octet2 ) | + ( ( uint32_t )in->octet1 << 8 ) | + ( ( uint32_t )in->octet0 << 16 ) | + ( ( in->octet0 < 0 ? ( uint32_t )-1 : 0 ) << 24 ); + #else ( ( uint32_t )in->octet0 ) | ( ( uint32_t )in->octet1 << 8 ) | ( ( uint32_t )in->octet2 << 16 ) | ( ( in->octet2 < 0 ? ( uint32_t )-1 : 0 ) << 24 ); + #endif /* WORDS_BIGENDIAN */ return ( double )out; } /* int242double() */ @@ -44,9 +83,15 @@ static double int242double( int24_t *in ) static double uint242double( uint24_t *in ) { uint32_t out = + #ifdef WORDS_BIGENDIAN + ( ( uint32_t )in->octet2 ) | + ( ( uint32_t )in->octet1 << 8 ) | + ( ( uint32_t )in->octet0 << 16 ); + #else ( ( uint32_t )in->octet0 ) | ( ( uint32_t )in->octet1 << 8 ) | ( ( uint32_t )in->octet2 << 16 ); + #endif /* WORDS_BIGENDIAN */ return ( double )out; } /* uint242double() */ @@ -55,18 +100,30 @@ static void double2int24( double in, int24_t *out ) { uint32_t i = ( uint32_t )in; + #ifdef WORDS_BIGENDIAN + out->octet2 = i & 0xff; + out->octet1 = ( i >> 8 ) & 0xff; + out->octet0 = ( i >> 16 ) & 0xff; + #else out->octet0 = i & 0xff; out->octet1 = ( i >> 8 ) & 0xff; out->octet2 = ( i >> 16 ) & 0xff; + #endif /* WORDS_BIGENDIAN */ } /* double2int24() */ static void double2uint24( double in, uint24_t *out ) { uint32_t i = ( uint32_t )in; + #ifdef WORDS_BIGENDIAN + out->octet2 = i & 0xff; + out->octet1 = ( i >> 8 ) & 0xff; + out->octet0 = ( i >> 16 ) & 0xff; + #else out->octet0 = i & 0xff; out->octet1 = ( i >> 8 ) & 0xff; out->octet2 = ( i >> 16 ) & 0xff; + #endif /* WORDS_BIGENDIAN */ } /* double2uint24() */ /* Set up bs2b data. */ @@ -155,7 +212,7 @@ static void init( t_bs2bdp bs2bdp ) #define hi_filter( in, in_1, out_1 ) \ ( bs2bdp->a0_hi * in + bs2bdp->a1_hi * in_1 + bs2bdp->b1_hi * out_1 ) -static void cross_feed_dne( t_bs2bdp bs2bdp, double *sample ) +static void cross_feed_d( t_bs2bdp bs2bdp, double *sample ) { /* Lowpass filter */ bs2bdp->lfs.lo[ 0 ] = lo_filter( sample[ 0 ], bs2bdp->lfs.lo[ 0 ] ); @@ -182,7 +239,7 @@ static void cross_feed_dne( t_bs2bdp bs2bdp, double *sample ) if( sample[ 0 ] < -1.0 ) sample[ 0 ] = -1.0; if( sample[ 1 ] > 1.0 ) sample[ 1 ] = 1.0; if( sample[ 1 ] < -1.0 ) sample[ 1 ] = -1.0; -} /* cross_feed_dne() */ +} /* cross_feed_d() */ /* Exported functions. * See descriptions in "bs2b.h" @@ -268,19 +325,117 @@ char const *bs2b_runtime_version( void ) return BS2B_VERSION_STR; } /* bs2b_runtime_version() */ -void bs2b_cross_feed_dne( t_bs2bdp bs2bdp, double *sample, int n ) +void bs2b_cross_feed_d( t_bs2bdp bs2bdp, double *sample, int n ) +{ + if( n > 0 ) + { + while( n-- ) + { + cross_feed_d( bs2bdp, sample ); + sample += 2; + } /* while */ + } /* if */ +} /* bs2b_cross_feed_d() */ + +void bs2b_cross_feed_dbe( t_bs2bdp bs2bdp, double *sample, int n ) +{ + if( n > 0 ) + { + while( n-- ) + { + #ifndef WORDS_BIGENDIAN + int64swap( ( uint32_t * )sample ); + int64swap( ( uint32_t * )( sample + 1 ) ); + #endif + + cross_feed_d( bs2bdp, sample ); + + #ifndef WORDS_BIGENDIAN + int64swap( ( uint32_t * )sample ); + int64swap( ( uint32_t * )( sample + 1 ) ); + #endif + + sample += 2; + } /* while */ + } /* if */ +} /* bs2b_cross_feed_dbe() */ + +void bs2b_cross_feed_dle( t_bs2bdp bs2bdp, double *sample, int n ) +{ + if( n > 0 ) + { + while( n-- ) + { + #ifdef WORDS_BIGENDIAN + int64swap( ( uint32_t * )sample ); + int64swap( ( uint32_t * )( sample + 1 ) ); + #endif + + cross_feed_d( bs2bdp, sample ); + + #ifdef WORDS_BIGENDIAN + int64swap( ( uint32_t * )sample ); + int64swap( ( uint32_t * )( sample + 1 ) ); + #endif + + sample += 2; + } /* while */ + } /* if */ +} /* bs2b_cross_feed_dle() */ + +void bs2b_cross_feed_f( t_bs2bdp bs2bdp, float *sample, int n ) +{ + double sample_d[ 2 ]; + + if( n > 0 ) + { + while( n-- ) + { + sample_d[ 0 ] = ( double )sample[ 0 ]; + sample_d[ 1 ] = ( double )sample[ 1 ]; + + cross_feed_d( bs2bdp, sample_d ); + + sample[ 0 ] = ( float )sample_d[ 0 ]; + sample[ 1 ] = ( float )sample_d[ 1 ]; + + sample += 2; + } /* while */ + } /* if */ +} /* bs2b_cross_feed_f() */ + +void bs2b_cross_feed_fbe( t_bs2bdp bs2bdp, float *sample, int n ) { + double sample_d[ 2 ]; + if( n > 0 ) { while( n-- ) { - cross_feed_dne( bs2bdp, sample ); + #ifndef WORDS_BIGENDIAN + int32swap( ( uint32_t * )sample ); + int32swap( ( uint32_t * )( sample + 1 ) ); + #endif + + sample_d[ 0 ] = ( double )sample[ 0 ]; + sample_d[ 1 ] = ( double )sample[ 1 ]; + + cross_feed_d( bs2bdp, sample_d ); + + sample[ 0 ] = ( float )sample_d[ 0 ]; + sample[ 1 ] = ( float )sample_d[ 1 ]; + + #ifndef WORDS_BIGENDIAN + int32swap( ( uint32_t * )sample ); + int32swap( ( uint32_t * )( sample + 1 ) ); + #endif + sample += 2; } /* while */ } /* if */ -} /* bs2b_cross_feed_dne() */ +} /* bs2b_cross_feed_fbe() */ -void bs2b_cross_feed_fne( t_bs2bdp bs2bdp, float *sample, int n ) +void bs2b_cross_feed_fle( t_bs2bdp bs2bdp, float *sample, int n ) { double sample_d[ 2 ]; @@ -288,25 +443,35 @@ void bs2b_cross_feed_fne( t_bs2bdp bs2bdp, float *sample, int n ) { while( n-- ) { + #ifdef WORDS_BIGENDIAN + int32swap( ( uint32_t * )sample ); + int32swap( ( uint32_t * )( sample + 1 ) ); + #endif + sample_d[ 0 ] = ( double )sample[ 0 ]; sample_d[ 1 ] = ( double )sample[ 1 ]; - cross_feed_dne( bs2bdp, sample_d ); + cross_feed_d( bs2bdp, sample_d ); sample[ 0 ] = ( float )sample_d[ 0 ]; sample[ 1 ] = ( float )sample_d[ 1 ]; + #ifdef WORDS_BIGENDIAN + int32swap( ( uint32_t * )sample ); + int32swap( ( uint32_t * )( sample + 1 ) ); + #endif + sample += 2; } /* while */ } /* if */ -} /* bs2b_cross_feed_fne() */ +} /* bs2b_cross_feed_fle() */ #define MAX_INT32_VALUE 2147483647.0 #define MAX_INT16_VALUE 32767.0 #define MAX_INT8_VALUE 127.0 #define MAX_INT24_VALUE 8388607.0 -void bs2b_cross_feed_s32ne( t_bs2bdp bs2bdp, int32_t *sample, int n ) +void bs2b_cross_feed_s32( t_bs2bdp bs2bdp, int32_t *sample, int n ) { double sample_d[ 2 ]; @@ -317,7 +482,7 @@ void bs2b_cross_feed_s32ne( t_bs2bdp bs2bdp, int32_t *sample, int n ) sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT32_VALUE; sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT32_VALUE; - cross_feed_dne( bs2bdp, sample_d ); + cross_feed_d( bs2bdp, sample_d ); sample[ 0 ] = ( int32_t )( sample_d[ 0 ] * MAX_INT32_VALUE ); sample[ 1 ] = ( int32_t )( sample_d[ 1 ] * MAX_INT32_VALUE ); @@ -325,9 +490,9 @@ void bs2b_cross_feed_s32ne( t_bs2bdp bs2bdp, int32_t *sample, int n ) sample += 2; } /* while */ } /* if */ -} /* bs2b_cross_feed_s32ne() */ +} /* bs2b_cross_feed_s32() */ -void bs2b_cross_feed_s16ne( t_bs2bdp bs2bdp, int16_t *sample, int n ) +void bs2b_cross_feed_s32be( t_bs2bdp bs2bdp, int32_t *sample, int n ) { double sample_d[ 2 ]; @@ -335,18 +500,142 @@ void bs2b_cross_feed_s16ne( t_bs2bdp bs2bdp, int16_t *sample, int n ) { while( n-- ) { + #ifndef WORDS_BIGENDIAN + int32swap( sample ); + int32swap( sample + 1 ); + #endif + + sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT32_VALUE; + sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT32_VALUE; + + cross_feed_d( bs2bdp, sample_d ); + + sample[ 0 ] = ( int32_t )( sample_d[ 0 ] * MAX_INT32_VALUE ); + sample[ 1 ] = ( int32_t )( sample_d[ 1 ] * MAX_INT32_VALUE ); + + #ifndef WORDS_BIGENDIAN + int32swap( sample ); + int32swap( sample + 1 ); + #endif + + sample += 2; + } /* while */ + } /* if */ +} /* bs2b_cross_feed_s32be() */ + +void bs2b_cross_feed_s32le( t_bs2bdp bs2bdp, int32_t *sample, int n ) +{ + double sample_d[ 2 ]; + + if( n > 0 ) + { + while( n-- ) + { + #ifdef WORDS_BIGENDIAN + int32swap( sample ); + int32swap( sample + 1 ); + #endif + + sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT32_VALUE; + sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT32_VALUE; + + cross_feed_d( bs2bdp, sample_d ); + + sample[ 0 ] = ( int32_t )( sample_d[ 0 ] * MAX_INT32_VALUE ); + sample[ 1 ] = ( int32_t )( sample_d[ 1 ] * MAX_INT32_VALUE ); + + #ifdef WORDS_BIGENDIAN + int32swap( sample ); + int32swap( sample + 1 ); + #endif + + sample += 2; + } /* while */ + } /* if */ +} /* bs2b_cross_feed_s32le() */ + +void bs2b_cross_feed_s16( t_bs2bdp bs2bdp, int16_t *sample, int n ) +{ + double sample_d[ 2 ]; + + if( n > 0 ) + { + while( n-- ) + { + sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT16_VALUE; + sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT16_VALUE; + + cross_feed_d( bs2bdp, sample_d ); + + sample[ 0 ] = ( int16_t )( sample_d[ 0 ] * MAX_INT16_VALUE ); + sample[ 1 ] = ( int16_t )( sample_d[ 1 ] * MAX_INT16_VALUE ); + + sample += 2; + } /* while */ + } /* if */ +} /* bs2b_cross_feed_s16() */ + +void bs2b_cross_feed_s16be( t_bs2bdp bs2bdp, int16_t *sample, int n ) +{ + double sample_d[ 2 ]; + + if( n > 0 ) + { + while( n-- ) + { + #ifndef WORDS_BIGENDIAN + int16swap( sample ); + int16swap( sample + 1 ); + #endif + sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT16_VALUE; sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT16_VALUE; - cross_feed_dne( bs2bdp, sample_d ); + cross_feed_d( bs2bdp, sample_d ); sample[ 0 ] = ( int16_t )( sample_d[ 0 ] * MAX_INT16_VALUE ); sample[ 1 ] = ( int16_t )( sample_d[ 1 ] * MAX_INT16_VALUE ); + #ifndef WORDS_BIGENDIAN + int16swap( sample ); + int16swap( sample + 1 ); + #endif + sample += 2; } /* while */ } /* if */ -} /* bs2b_cross_feed_s16ne() */ +} /* bs2b_cross_feed_s16be() */ + +void bs2b_cross_feed_s16le( t_bs2bdp bs2bdp, int16_t *sample, int n ) +{ + double sample_d[ 2 ]; + + if( n > 0 ) + { + while( n-- ) + { + #ifdef WORDS_BIGENDIAN + int16swap( sample ); + int16swap( sample + 1 ); + #endif + + sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT16_VALUE; + sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT16_VALUE; + + cross_feed_d( bs2bdp, sample_d ); + + sample[ 0 ] = ( int16_t )( sample_d[ 0 ] * MAX_INT16_VALUE ); + sample[ 1 ] = ( int16_t )( sample_d[ 1 ] * MAX_INT16_VALUE ); + + #ifdef WORDS_BIGENDIAN + int16swap( sample ); + int16swap( sample + 1 ); + #endif + + sample += 2; + } /* while */ + } /* if */ +} /* bs2b_cross_feed_s16le() */ void bs2b_cross_feed_s8( t_bs2bdp bs2bdp, int8_t *sample, int n ) { @@ -359,7 +648,7 @@ void bs2b_cross_feed_s8( t_bs2bdp bs2bdp, int8_t *sample, int n ) sample_d[ 0 ] = ( double )sample[ 0 ] / MAX_INT8_VALUE; sample_d[ 1 ] = ( double )sample[ 1 ] / MAX_INT8_VALUE; - cross_feed_dne( bs2bdp, sample_d ); + cross_feed_d( bs2bdp, sample_d ); sample[ 0 ] = ( int8_t )( sample_d[ 0 ] * MAX_INT8_VALUE ); sample[ 1 ] = ( int8_t )( sample_d[ 1 ] * MAX_INT8_VALUE ); @@ -380,7 +669,7 @@ void bs2b_cross_feed_u8( t_bs2bdp bs2bdp, uint8_t *sample, int n ) sample_d[ 0 ] = ( ( double )( ( int8_t )( sample[ 0 ] ^ 0x80 ) ) ) / MAX_INT8_VALUE; sample_d[ 1 ] = ( ( double )( ( int8_t )( sample[ 1 ] ^ 0x80 ) ) ) / MAX_INT8_VALUE; - cross_feed_dne( bs2bdp, sample_d ); + cross_feed_d( bs2bdp, sample_d ); sample[ 0 ] = ( ( uint8_t )( sample_d[ 0 ] * MAX_INT8_VALUE ) ) ^ 0x80; sample[ 1 ] = ( ( uint8_t )( sample_d[ 1 ] * MAX_INT8_VALUE ) ) ^ 0x80; @@ -390,7 +679,7 @@ void bs2b_cross_feed_u8( t_bs2bdp bs2bdp, uint8_t *sample, int n ) } /* if */ } /* bs2b_cross_feed_u8() */ -void bs2b_cross_feed_s24ne( t_bs2bdp bs2bdp, int24_t *sample, int n ) +void bs2b_cross_feed_s24( t_bs2bdp bs2bdp, int24_t *sample, int n ) { double sample_d[ 2 ]; @@ -401,7 +690,7 @@ void bs2b_cross_feed_s24ne( t_bs2bdp bs2bdp, int24_t *sample, int n ) sample_d[ 0 ] = int242double( sample ) / MAX_INT24_VALUE; sample_d[ 1 ] = int242double( sample + 1 ) / MAX_INT24_VALUE; - cross_feed_dne( bs2bdp, sample_d ); + cross_feed_d( bs2bdp, sample_d ); double2int24( sample_d[ 0 ] * MAX_INT24_VALUE, sample ); double2int24( sample_d[ 1 ] * MAX_INT24_VALUE, sample + 1 ); @@ -409,4 +698,66 @@ void bs2b_cross_feed_s24ne( t_bs2bdp bs2bdp, int24_t *sample, int n ) sample += 2; } /* while */ } /* if */ -} /* bs2b_cross_feed_s24ne() */ +} /* bs2b_cross_feed_s24() */ + +void bs2b_cross_feed_s24be( t_bs2bdp bs2bdp, int24_t *sample, int n ) +{ + double sample_d[ 2 ]; + + if( n > 0 ) + { + while( n-- ) + { + #ifndef WORDS_BIGENDIAN + int24swap( ( uint24_t * )sample ); + int24swap( ( uint24_t * )( sample + 1 ) ); + #endif + + sample_d[ 0 ] = int242double( sample ) / MAX_INT24_VALUE; + sample_d[ 1 ] = int242double( sample + 1 ) / MAX_INT24_VALUE; + + cross_feed_d( bs2bdp, sample_d ); + + double2int24( sample_d[ 0 ] * MAX_INT24_VALUE, sample ); + double2int24( sample_d[ 1 ] * MAX_INT24_VALUE, sample + 1 ); + + #ifndef WORDS_BIGENDIAN + int24swap( ( uint24_t * )sample ); + int24swap( ( uint24_t * )( sample + 1 ) ); + #endif + + sample += 2; + } /* while */ + } /* if */ +} /* bs2b_cross_feed_s24be() */ + +void bs2b_cross_feed_s24le( t_bs2bdp bs2bdp, int24_t *sample, int n ) +{ + double sample_d[ 2 ]; + + if( n > 0 ) + { + while( n-- ) + { + #ifdef WORDS_BIGENDIAN + int24swap( ( uint24_t * )sample ); + int24swap( ( uint24_t * )( sample + 1 ) ); + #endif + + sample_d[ 0 ] = int242double( sample ) / MAX_INT24_VALUE; + sample_d[ 1 ] = int242double( sample + 1 ) / MAX_INT24_VALUE; + + cross_feed_d( bs2bdp, sample_d ); + + double2int24( sample_d[ 0 ] * MAX_INT24_VALUE, sample ); + double2int24( sample_d[ 1 ] * MAX_INT24_VALUE, sample + 1 ); + + #ifdef WORDS_BIGENDIAN + int24swap( ( uint24_t * )sample ); + int24swap( ( uint24_t * )( sample + 1 ) ); + #endif + + sample += 2; + } /* while */ + } /* if */ +} /* bs2b_cross_feed_s24le() */ diff --git a/src/bs2b.h b/src/bs2b.h index 4daaafd..f4fb83e 100644 --- a/src/bs2b.h +++ b/src/bs2b.h @@ -46,28 +46,16 @@ typedef unsigned int uint32_t; typedef struct { -#ifdef WORDS_BIGENDIAN - int8_t octet2; - uint8_t octet1; - uint8_t octet0; -#else uint8_t octet0; uint8_t octet1; int8_t octet2; -#endif /* WORDS_BIGENDIAN */ } int24_t; typedef struct { -#ifdef WORDS_BIGENDIAN - uint8_t octet2; - uint8_t octet1; - uint8_t octet0; -#else uint8_t octet0; uint8_t octet1; uint8_t octet2; -#endif /* WORDS_BIGENDIAN */ } uint24_t; /* Number of crossfeed levels */ @@ -147,16 +135,40 @@ char const *bs2b_runtime_version( void ); */ /* sample poits to double floats native endians */ -void bs2b_cross_feed_dne( t_bs2bdp bs2bdp, double *sample, int n ); +void bs2b_cross_feed_d( t_bs2bdp bs2bdp, double *sample, int n ); + +/* sample poits to double floats big endians */ +void bs2b_cross_feed_dbe( t_bs2bdp bs2bdp, double *sample, int n ); + +/* sample poits to double floats little endians */ +void bs2b_cross_feed_dle( t_bs2bdp bs2bdp, double *sample, int n ); /* sample poits to floats native endians */ -void bs2b_cross_feed_fne( t_bs2bdp bs2bdp, float *sample, int n ); +void bs2b_cross_feed_f( t_bs2bdp bs2bdp, float *sample, int n ); + +/* sample poits to floats big endians */ +void bs2b_cross_feed_fbe( t_bs2bdp bs2bdp, float *sample, int n ); + +/* sample poits to floats little endians */ +void bs2b_cross_feed_fle( t_bs2bdp bs2bdp, float *sample, int n ); /* sample poits to 32bit signed integers native endians */ -void bs2b_cross_feed_s32ne( t_bs2bdp bs2bdp, int32_t *sample, int n ); +void bs2b_cross_feed_s32( t_bs2bdp bs2bdp, int32_t *sample, int n ); + +/* sample poits to 32bit signed integers big endians */ +void bs2b_cross_feed_s32be( t_bs2bdp bs2bdp, int32_t *sample, int n ); + +/* sample poits to 32bit signed integers little endians */ +void bs2b_cross_feed_s32le( t_bs2bdp bs2bdp, int32_t *sample, int n ); /* sample poits to 16bit signed integers native endians */ -void bs2b_cross_feed_s16ne( t_bs2bdp bs2bdp, int16_t *sample, int n ); +void bs2b_cross_feed_s16( t_bs2bdp bs2bdp, int16_t *sample, int n ); + +/* sample poits to 16bit signed integers big endians */ +void bs2b_cross_feed_s16be( t_bs2bdp bs2bdp, int16_t *sample, int n ); + +/* sample poits to 16bit signed integers little endians */ +void bs2b_cross_feed_s16le( t_bs2bdp bs2bdp, int16_t *sample, int n ); /* sample poits to 8bit signed integers */ void bs2b_cross_feed_s8( t_bs2bdp bs2bdp, int8_t *sample, int n ); @@ -165,7 +177,13 @@ void bs2b_cross_feed_s8( t_bs2bdp bs2bdp, int8_t *sample, int n ); void bs2b_cross_feed_u8( t_bs2bdp bs2bdp, uint8_t *sample, int n ); /* sample poits to 24bit signed integers native endians */ -void bs2b_cross_feed_s24ne( t_bs2bdp bs2bdp, int24_t *sample, int n ); +void bs2b_cross_feed_s24( t_bs2bdp bs2bdp, int24_t *sample, int n ); + +/* sample poits to 24bit signed integers be endians */ +void bs2b_cross_feed_s24be( t_bs2bdp bs2bdp, int24_t *sample, int n ); + +/* sample poits to 24bit signed integers little endians */ +void bs2b_cross_feed_s24le( t_bs2bdp bs2bdp, int24_t *sample, int n ); #ifdef __cplusplus } /* extern "C" */ diff --git a/src/bs2bclass.cpp b/src/bs2bclass.cpp index aa63b4a..672d049 100644 --- a/src/bs2bclass.cpp +++ b/src/bs2bclass.cpp @@ -70,22 +70,62 @@ char const *bs2b_base::runtime_version( void ) void bs2b_base::cross_feed( double *sample, int n ) { - bs2b_cross_feed_dne( bs2bdp, sample, n ); + bs2b_cross_feed_d( bs2bdp, sample, n ); +} + +void bs2b_base::cross_feed_be( double *sample, int n ) +{ + bs2b_cross_feed_dbe( bs2bdp, sample, n ); +} + +void bs2b_base::cross_feed_le( double *sample, int n ) +{ + bs2b_cross_feed_dle( bs2bdp, sample, n ); } void bs2b_base::cross_feed( float *sample, int n ) { - bs2b_cross_feed_fne( bs2bdp, sample, n ); + bs2b_cross_feed_f( bs2bdp, sample, n ); +} + +void bs2b_base::cross_feed_be( float *sample, int n ) +{ + bs2b_cross_feed_fbe( bs2bdp, sample, n ); +} + +void bs2b_base::cross_feed_le( float *sample, int n ) +{ + bs2b_cross_feed_fle( bs2bdp, sample, n ); } void bs2b_base::cross_feed( int32_t *sample, int n ) { - bs2b_cross_feed_s32ne( bs2bdp, sample, n ); + bs2b_cross_feed_s32( bs2bdp, sample, n ); +} + +void bs2b_base::cross_feed_be( int32_t *sample, int n ) +{ + bs2b_cross_feed_s32be( bs2bdp, sample, n ); +} + +void bs2b_base::cross_feed_le( int32_t *sample, int n ) +{ + bs2b_cross_feed_s32le( bs2bdp, sample, n ); } void bs2b_base::cross_feed( int16_t *sample, int n ) { - bs2b_cross_feed_s16ne( bs2bdp, sample, n ); + bs2b_cross_feed_s16( bs2bdp, sample, n ); +} + +void bs2b_base::cross_feed_be( int16_t *sample, int n ) +{ + bs2b_cross_feed_s16be( bs2bdp, sample, n ); +} + +void bs2b_base::cross_feed_le( int16_t *sample, int n ) +{ + bs2b_cross_feed_s16le( bs2bdp, sample, n ); } void bs2b_base::cross_feed( int8_t *sample, int n ) @@ -100,5 +140,15 @@ void bs2b_base::cross_feed( uint8_t *sample, int n ) void bs2b_base::cross_feed( int24_t *sample, int n ) { - bs2b_cross_feed_s24ne( bs2bdp, sample, n ); + bs2b_cross_feed_s24( bs2bdp, sample, n ); +} + +void bs2b_base::cross_feed_be( int24_t *sample, int n ) +{ + bs2b_cross_feed_s24be( bs2bdp, sample, n ); +} + +void bs2b_base::cross_feed_le( int24_t *sample, int n ) +{ + bs2b_cross_feed_s24le( bs2bdp, sample, n ); } diff --git a/src/bs2bclass.h b/src/bs2bclass.h index d2e5071..8beab2a 100644 --- a/src/bs2bclass.h +++ b/src/bs2bclass.h @@ -50,6 +50,22 @@ public: void cross_feed( int8_t *sample, int n = 1 ); void cross_feed( uint8_t *sample, int n = 1 ); void cross_feed( int24_t *sample, int n = 1 ); + + void cross_feed_be( double *sample, int n = 1 ); + void cross_feed_be( float *sample, int n = 1 ); + void cross_feed_be( int32_t *sample, int n = 1 ); + void cross_feed_be( int16_t *sample, int n = 1 ); + void cross_feed_be( int8_t *sample, int n = 1 ); + void cross_feed_be( uint8_t *sample, int n = 1 ); + void cross_feed_be( int24_t *sample, int n = 1 ); + + void cross_feed_le( double *sample, int n = 1 ); + void cross_feed_le( float *sample, int n = 1 ); + void cross_feed_le( int32_t *sample, int n = 1 ); + void cross_feed_le( int16_t *sample, int n = 1 ); + void cross_feed_le( int8_t *sample, int n = 1 ); + void cross_feed_le( uint8_t *sample, int n = 1 ); + void cross_feed_le( int24_t *sample, int n = 1 ); }; // class bs2b_base #endif // BS2BCLASS_H diff --git a/src/bs2bstream.c b/src/bs2bstream.c index 1a57983..f5ecd3e 100644 --- a/src/bs2bstream.c +++ b/src/bs2bstream.c @@ -52,7 +52,7 @@ int main( int argc, char *argv[] ) char *progname, *tmpstr; uint32_t srate; uint32_t level; - short sample[ 2 ]; + int16_t sample[ 2 ]; tmpstr = strrchr( argv[0], '/' ); tmpstr = tmpstr ? tmpstr + 1 : argv[ 0 ]; @@ -106,18 +106,18 @@ int main( int argc, char *argv[] ) bs2b_set_srate( bs2bdp, srate ); bs2b_set_level( bs2bdp, level ); -#if defined( _O_BINARY ) + #if defined( _O_BINARY ) _setmode( _fileno( stdin ), _O_BINARY ); _setmode( _fileno( stdout ), _O_BINARY ); -#elif defined( _O_RAW ) + #elif defined( _O_RAW ) _setmode( _fileno( stdin ), _O_RAW ); _setmode( _fileno( stdout ), _O_RAW ); -#endif + #endif - while( 2 == fread( sample, sizeof( short ), 2, stdin ) ) + while( 2 == fread( sample, sizeof( int16_t ), 2, stdin ) ) { - bs2b_cross_feed_s16ne( bs2bdp, sample, 1 ); - fwrite( sample, sizeof( short ), 2, stdout ); + bs2b_cross_feed_s16( bs2bdp, sample, 1 ); + fwrite( sample, sizeof( int16_t ), 2, stdout ); } bs2b_close( bs2bdp ); -- cgit v1.2.3