提交 da72c570 authored 作者: Brian West's avatar Brian West

ROUND 1... FIGHT... MODENDP-264

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15422 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 b92ca24e
...@@ -42,9 +42,14 @@ ...@@ -42,9 +42,14 @@
@brief Functions for generating dither noise @brief Functions for generating dither noise
*/ */
#include "pa_dither.h"
#include "pa_types.h" #include "pa_types.h"
#include "pa_dither.h"
/* Note that the linear congruential algorithm requires 32 bit integers
* because it uses arithmetic overflow. So use PaUint32 instead of
* unsigned long so it will work on 64 bit systems.
*/
#define PA_DITHER_BITS_ (15) #define PA_DITHER_BITS_ (15)
...@@ -57,9 +62,9 @@ void PaUtil_InitializeTriangularDitherState( PaUtilTriangularDitherGenerator *st ...@@ -57,9 +62,9 @@ void PaUtil_InitializeTriangularDitherState( PaUtilTriangularDitherGenerator *st
} }
signed long PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerator *state ) PaInt32 PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerator *state )
{ {
signed long current, highPass; PaInt32 current, highPass;
/* Generate two random numbers. */ /* Generate two random numbers. */
state->randSeed1 = (state->randSeed1 * 196314165) + 907633515; state->randSeed1 = (state->randSeed1 * 196314165) + 907633515;
...@@ -69,9 +74,10 @@ signed long PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerato ...@@ -69,9 +74,10 @@ signed long PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerato
* Shift before adding to prevent overflow which would skew the distribution. * Shift before adding to prevent overflow which would skew the distribution.
* Also shift an extra bit for the high pass filter. * Also shift an extra bit for the high pass filter.
*/ */
#define DITHER_SHIFT_ ((SIZEOF_LONG*8 - PA_DITHER_BITS_) + 1) #define DITHER_SHIFT_ ((sizeof(PaInt32)*8 - PA_DITHER_BITS_) + 1)
current = (((signed long)state->randSeed1)>>DITHER_SHIFT_) +
(((signed long)state->randSeed2)>>DITHER_SHIFT_); current = (((PaInt32)state->randSeed1)>>DITHER_SHIFT_) +
(((PaInt32)state->randSeed2)>>DITHER_SHIFT_);
/* High pass filter to reduce audibility. */ /* High pass filter to reduce audibility. */
highPass = current - state->previous; highPass = current - state->previous;
...@@ -86,7 +92,7 @@ static const float const_float_dither_scale_ = PA_FLOAT_DITHER_SCALE_; ...@@ -86,7 +92,7 @@ static const float const_float_dither_scale_ = PA_FLOAT_DITHER_SCALE_;
float PaUtil_GenerateFloatTriangularDither( PaUtilTriangularDitherGenerator *state ) float PaUtil_GenerateFloatTriangularDither( PaUtilTriangularDitherGenerator *state )
{ {
signed long current, highPass; PaInt32 current, highPass;
/* Generate two random numbers. */ /* Generate two random numbers. */
state->randSeed1 = (state->randSeed1 * 196314165) + 907633515; state->randSeed1 = (state->randSeed1 * 196314165) + 907633515;
...@@ -96,9 +102,8 @@ float PaUtil_GenerateFloatTriangularDither( PaUtilTriangularDitherGenerator *sta ...@@ -96,9 +102,8 @@ float PaUtil_GenerateFloatTriangularDither( PaUtilTriangularDitherGenerator *sta
* Shift before adding to prevent overflow which would skew the distribution. * Shift before adding to prevent overflow which would skew the distribution.
* Also shift an extra bit for the high pass filter. * Also shift an extra bit for the high pass filter.
*/ */
#define DITHER_SHIFT_ ((SIZEOF_LONG*8 - PA_DITHER_BITS_) + 1) current = (((PaInt32)state->randSeed1)>>DITHER_SHIFT_) +
current = (((signed long)state->randSeed1)>>DITHER_SHIFT_) + (((PaInt32)state->randSeed2)>>DITHER_SHIFT_);
(((signed long)state->randSeed2)>>DITHER_SHIFT_);
/* High pass filter to reduce audibility. */ /* High pass filter to reduce audibility. */
highPass = current - state->previous; highPass = current - state->previous;
......
...@@ -44,18 +44,24 @@ ...@@ -44,18 +44,24 @@
@brief Functions for generating dither noise @brief Functions for generating dither noise
*/ */
#include "pa_types.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#endif /* __cplusplus */ #endif /* __cplusplus */
/* Note that the linear congruential algorithm requires 32 bit integers
* because it uses arithmetic overflow. So use PaUint32 instead of
* unsigned long so it will work on 64 bit systems.
*/
/** @brief State needed to generate a dither signal */ /** @brief State needed to generate a dither signal */
typedef struct PaUtilTriangularDitherGenerator{ typedef struct PaUtilTriangularDitherGenerator{
unsigned long previous; PaUint32 previous;
unsigned long randSeed1; PaUint32 randSeed1;
unsigned long randSeed2; PaUint32 randSeed2;
} PaUtilTriangularDitherGenerator; } PaUtilTriangularDitherGenerator;
...@@ -73,9 +79,9 @@ void PaUtil_InitializeTriangularDitherState( PaUtilTriangularDitherGenerator *di ...@@ -73,9 +79,9 @@ void PaUtil_InitializeTriangularDitherState( PaUtilTriangularDitherGenerator *di
signed short out = (signed short)(((in>>1) + dither) >> 15); signed short out = (signed short)(((in>>1) + dither) >> 15);
</pre> </pre>
@return @return
A signed long with a range of +32767 to -32768 A signed 32-bit integer with a range of +32767 to -32768
*/ */
signed long PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerator *ditherState ); PaInt32 PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerator *ditherState );
/** /**
......
...@@ -1709,8 +1709,10 @@ static OSStatus ringBufferIOProc( AudioConverterRef inAudioConverter, ...@@ -1709,8 +1709,10 @@ static OSStatus ringBufferIOProc( AudioConverterRef inAudioConverter,
PaUtilRingBuffer *rb = (PaUtilRingBuffer *) inUserData; PaUtilRingBuffer *rb = (PaUtilRingBuffer *) inUserData;
VVDBUG(("ringBufferIOProc()\n")); VVDBUG(("ringBufferIOProc()\n"));
/*
assert( sizeof( UInt32 ) == sizeof( long ) ); Removing this fixes it but no clue if it breaks other things. (bkw_)
assert( sizeof( UInt32 ) == sizeof( long ) );
*/
if( PaUtil_GetRingBufferReadAvailable( rb ) == 0 ) { if( PaUtil_GetRingBufferReadAvailable( rb ) == 0 ) {
*outData = NULL; *outData = NULL;
*ioDataSize = 0; *ioDataSize = 0;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论