1 #if !defined (SDL_MIX_MAXVOLUME)
2 #define SDL_MIX_MAXVOLUME 128
6 #include <SDL/SDL_thread.h>
7 #include <SDL/SDL_mixer.h>
13 #if ( ( SDL_MAJOR_VERSION > 1) || (SDL_MINOR_VERSION > 2) || (SDL_PATCHLEVEL >= 10 ) )
14 #if (defined (SDL_HAS_64BIT_TYPE) && (SDL_HAS_64BIT_TYPE != 0 ) )
15 #define SDL_INT64 int64_t
16 #define SDL_UINT64 uint64_t
18 #define SDL_INT64 __undefined_64bit_type__
19 #define SDL_UINT64 __undefined_64bit_type__
22 #if (defined (SDL_HAS_64BIT_TYPE ) )
23 #define SDL_INT64 signed SDL_HAS_64BIT_TYPE
24 #define SDL_UINT64 unsigned SDL_HAS_64BIT_TYPE
26 #define SDL_INT64 __undefined_64bit_type__
27 #define SDL_UINT64 __undefined_64bit_type__
36 #if defined (_WIN32) || __GNUC__ != 2
41 #if defined (_WIN32) || __GNUC__ != 2
42 #define UC8_MIN ( (unsigned long) std::numeric_limits< unsigned char >::min() )
43 #define UC8_MAX ( (unsigned long) std::numeric_limits< unsigned char >::max() )
44 #define SC8_MIN ( (signed long) std::numeric_limits< signed char >::min() )
45 #define SC8_MAX ( (signed long) std::numeric_limits< signed char >::max() )
46 #define US16_MIN ( (unsigned long) std::numeric_limits< unsigned short >::min() )
47 #define US16_MAX ( (unsigned long) std::numeric_limits< unsigned short >::max() )
48 #define SS16_MIN ( (signed long) std::numeric_limits< signed short >::min() )
49 #define SS16_MAX ( (signed long) std::numeric_limits< signed short >::max() )
51 #define UC8_MIN ( (unsigned long) 0 )
52 #define UC8_MAX ( (unsigned long) 255 )
53 #define SC8_MIN ( (signed long) -128 )
54 #define SC8_MAX ( (signed long) 127 )
55 #define US16_MIN ( (unsigned long) 0 )
56 #define US16_MAX ( (unsigned long) 16384 )
57 #define SS16_MIN ( (signed long) -32768 )
58 #define SS16_MAX ( (signed long) 32767 )
63 #if defined (_WIN32) && defined (_WINDOWS)
64 FILE *anotherstdout = stdout;
65 #define STD_ERR anotherstdout
66 #define STD_OUT anotherstdout
68 #define STD_ERR stderr
69 #define STD_OUT stdout
72 #define SHAPE_SAMPLE_ORDER 10
73 #define SHAPE_SAMPLES (1<<SHAPE_SAMPLE_ORDER)
74 #define SHAPE_SAMPLE_SAFEPOS( p ) ( (p)&( (1<<SHAPE_SAMPLE_ORDER)-1 ) )
76 #define RNG_COUNT (1<<16)
77 #define RNG_MASK ( (1<<16)-1 )
79 template <
typename T >
87 template <
typename T >
100 _data[
i] = (rand()&0xFFFF)-0x8000;
116 #if (defined (SDL_HAS_64BIT_TYPE) && !defined (USE_FAST_F16MATH ) )
118 inline unsigned long interpolateF16F16(
unsigned long a,
unsigned long b,
unsigned long t )
125 #if !defined (USE_FAST_F16MATH)
126 #pragma message ( "64-bit type unavailable - softvolume will have lower quality" )
131 return (a>>8)*( (0x10000-t)>>8 )+(b>>8)*(t>>8);
141 void init(
unsigned long total_samples )
143 if (total_samples == 0) total_samples = 1;
149 this->pos = this->step = 0;
154 this->pos += this->step;
163 this->pos>>16 )+1], this->pos&0xFFFF );
180 return (
unsigned long)
max( 0.0f,
min( (
float) 0xFFFFFFFF, (
float) (f*0x10000) ) );
182 inline double f16tod(
unsigned long f16 )
184 return f16/(double) 0x10000;
187 #define LOG_10 2.3025850929940456840179914546844
188 #define INV_LOG_10 (1.0/LOG_10)
189 #define C_PI 3.1415926535897932384626433832795
200 #if (defined (SDL_HAS_64BIT_TYPE) && !defined (USE_FAST_F16MATH ) )
202 inline unsigned short mpyUS16F16(
unsigned short a,
unsigned long f16 )
209 inline signed short mpySS16F16(
signed short a,
unsigned long f16 )
217 #if !defined (USE_FAST_F16MATH)
218 #pragma message ( "64-bit type unavailable - softvolume will have lower quality" )
221 inline unsigned short mpyUS16F16(
unsigned short a,
unsigned long f16 )
223 return (
unsigned short)
min( US16_MAX,
225 (
unsigned long) ( ( ( ( ( ( (
signed long) a )
226 -0x8000 )*(f16>>8) )+
rng16.
get() )>>8 )+0x8000 ) ) );
229 inline signed short mpySS16F16(
signed short a,
unsigned long f16 )
231 return (
signed short)
min( SS16_MAX,
232 max( SS16_MIN, ( (
signed long) ( ( ( (
signed long) a )*(f16>>8) )+
rng16.
get() )/(1<<8) ) ) );
237 inline unsigned char mpyUC8F16(
unsigned char a,
unsigned long f16 )
241 (
unsigned long) ( ( ( ( ( ( (
signed long) a )-0x80 )*f16 )+
rng16.
get() )>>16 )+0x80 ) ) );
244 inline signed char mpySC8F16(
signed char a,
unsigned long f16 )
249 #if (SDL_BYTEORDER == SDL_LIL_ENDIAN)
252 return (x>>8)|(x<<8);
256 return (x>>8)|(x<<8);
258 #define lil_endian_to_native( x ) x
259 #define native_to_big_endian( x ) big_endian_to_native( x )
260 #define native_to_lil_endian( x ) lil_endian_to_native( x )
264 return (x>>8)|(x<<8);
268 return (x>>8)|(x<<8);
270 #define big_endian_to_native( x ) x
271 #define native_to_big_endian( x ) big_endian_to_native( x )
272 #define native_to_lil_endian( x ) lil_endian_to_native( x )
299 unsigned char *buf = (
unsigned char*) stream;
302 for (
int i = g_sdl_channels;
i > 0;
i--, buf++, len -=
sizeof (*buf) )
312 buf++, len -=
sizeof (*buf);
321 signed char *buf = (
signed char*) stream;
324 for (
int i = g_sdl_channels;
i > 0;
i--, buf++, len -=
sizeof (*buf) )
332 memset( buf, 0, len );
336 buf++, len -=
sizeof (*buf);
345 unsigned short *buf = (
unsigned short*) stream;
348 for (
int i = g_sdl_channels;
i > 0;
i--, buf++, len -=
sizeof (*buf) )
358 *(buf++) = ct, len -=
sizeof (*buf);
362 buf++, len -=
sizeof (*buf);
372 signed short *buf = (
signed short*) stream;
375 for (
int i = g_sdl_channels;
i > 0;
i--, buf++, len -=
sizeof (*buf) )
383 memset( buf, 0, len );
387 buf++, len -=
sizeof (*buf);
396 unsigned short *buf = (
unsigned short*) stream;
399 for (
int i = g_sdl_channels;
i > 0;
i--, buf++, len -=
sizeof (*buf) )
409 *(buf++) = ct, len -=
sizeof (*buf);
413 buf++, len -=
sizeof (*buf);
422 signed short *buf = (
signed short*) stream;
425 for (
int i = g_sdl_channels;
i > 0;
i--, buf++, len -=
sizeof (*buf) )
433 memset( buf, 0, len );
437 buf++, len -=
sizeof (*buf);
448 Mix_QuerySpec( &g_sdl_frequency, &g_sdl_format, &g_sdl_channels );
449 switch (g_sdl_format)
485 double new_volume = newvolume;
515 fprintf(
STD_ERR,
"WARNING(softvolume.cpp): unrecognized transition shape, using default (linear)\n" );
516 goto mix_sv_shape_linear;
519 cstat.
t_shape.
init( (
unsigned long) (time*g_sdl_frequency) );
526 Mix_UnregisterEffect( chan, g_sdl_effect_func );
527 Mix_RegisterEffect( chan, g_sdl_effect_func, 0, 0 );
550 if (channel_state.count( chan ) > 0)
551 res =
f16tod( channel_state[chan].current_volume );
565 if (channel_state.count( chan ) > 0)
566 channel_state[chan].autoStopMusic = enable;