SDL  2.0
SDL_mixer.c File Reference
#include "../SDL_internal.h"
#include "SDL_cpuinfo.h"
#include "SDL_timer.h"
#include "SDL_audio.h"
#include "SDL_sysaudio.h"
+ Include dependency graph for SDL_mixer.c:

Go to the source code of this file.

Macros

#define ADJUST_VOLUME(s, v)   (s = (s*v)/SDL_MIX_MAXVOLUME)
 
#define ADJUST_VOLUME_U8(s, v)   (s = (((s-128)*v)/SDL_MIX_MAXVOLUME)+128)
 

Functions

void SDL_MixAudioFormat (Uint8 *dst, const Uint8 *src, SDL_AudioFormat format, Uint32 len, int volume)
 

Variables

static const Uint8 mix8 []
 

Macro Definition Documentation

#define ADJUST_VOLUME (   s,
  v 
)    (s = (s*v)/SDL_MIX_MAXVOLUME)

Definition at line 85 of file SDL_mixer.c.

Referenced by SDL_MixAudioFormat().

#define ADJUST_VOLUME_U8 (   s,
  v 
)    (s = (((s-128)*v)/SDL_MIX_MAXVOLUME)+128)

Definition at line 86 of file SDL_mixer.c.

Referenced by SDL_MixAudioFormat().

Function Documentation

void SDL_MixAudioFormat ( Uint8 dst,
const Uint8 src,
SDL_AudioFormat  format,
Uint32  len,
int  volume 
)

This works like SDL_MixAudio(), but you specify the audio format instead of using the format of audio device 1. Thus it can be used when no audio device is open at all.

Definition at line 90 of file SDL_mixer.c.

References ADJUST_VOLUME, ADJUST_VOLUME_U8, AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_S8, AUDIO_U8, F, mix8, SDL_MIX_MAXVOLUME, SDL_SetError, SDL_SwapBE32, SDL_SwapFloatBE, SDL_SwapFloatLE, and SDL_SwapLE32.

92 {
93  if (volume == 0) {
94  return;
95  }
96 
97  switch (format) {
98 
99  case AUDIO_U8:
100  {
101 #if defined(__GNUC__) && defined(__M68000__) && !defined(__mcoldfire__) && defined(SDL_ASSEMBLY_ROUTINES)
102  SDL_MixAudio_m68k_U8((char *) dst, (char *) src,
103  (unsigned long) len, (long) volume,
104  (char *) mix8);
105 #else
106  Uint8 src_sample;
107 
108  while (len--) {
109  src_sample = *src;
110  ADJUST_VOLUME_U8(src_sample, volume);
111  *dst = mix8[*dst + src_sample];
112  ++dst;
113  ++src;
114  }
115 #endif
116  }
117  break;
118 
119  case AUDIO_S8:
120  {
121  Sint8 *dst8, *src8;
122  Sint8 src_sample;
123  int dst_sample;
124  const int max_audioval = ((1 << (8 - 1)) - 1);
125  const int min_audioval = -(1 << (8 - 1));
126 
127  src8 = (Sint8 *) src;
128  dst8 = (Sint8 *) dst;
129  while (len--) {
130  src_sample = *src8;
131  ADJUST_VOLUME(src_sample, volume);
132  dst_sample = *dst8 + src_sample;
133  if (dst_sample > max_audioval) {
134  *dst8 = max_audioval;
135  } else if (dst_sample < min_audioval) {
136  *dst8 = min_audioval;
137  } else {
138  *dst8 = dst_sample;
139  }
140  ++dst8;
141  ++src8;
142  }
143  }
144  break;
145 
146  case AUDIO_S16LSB:
147  {
148  Sint16 src1, src2;
149  int dst_sample;
150  const int max_audioval = ((1 << (16 - 1)) - 1);
151  const int min_audioval = -(1 << (16 - 1));
152 
153  len /= 2;
154  while (len--) {
155  src1 = ((src[1]) << 8 | src[0]);
156  ADJUST_VOLUME(src1, volume);
157  src2 = ((dst[1]) << 8 | dst[0]);
158  src += 2;
159  dst_sample = src1 + src2;
160  if (dst_sample > max_audioval) {
161  dst_sample = max_audioval;
162  } else if (dst_sample < min_audioval) {
163  dst_sample = min_audioval;
164  }
165  dst[0] = dst_sample & 0xFF;
166  dst_sample >>= 8;
167  dst[1] = dst_sample & 0xFF;
168  dst += 2;
169  }
170  }
171  break;
172 
173  case AUDIO_S16MSB:
174  {
175 #if defined(__GNUC__) && defined(__M68000__) && !defined(__mcoldfire__) && defined(SDL_ASSEMBLY_ROUTINES)
176  SDL_MixAudio_m68k_S16MSB((short *) dst, (short *) src,
177  (unsigned long) len, (long) volume);
178 #else
179  Sint16 src1, src2;
180  int dst_sample;
181  const int max_audioval = ((1 << (16 - 1)) - 1);
182  const int min_audioval = -(1 << (16 - 1));
183 
184  len /= 2;
185  while (len--) {
186  src1 = ((src[0]) << 8 | src[1]);
187  ADJUST_VOLUME(src1, volume);
188  src2 = ((dst[0]) << 8 | dst[1]);
189  src += 2;
190  dst_sample = src1 + src2;
191  if (dst_sample > max_audioval) {
192  dst_sample = max_audioval;
193  } else if (dst_sample < min_audioval) {
194  dst_sample = min_audioval;
195  }
196  dst[1] = dst_sample & 0xFF;
197  dst_sample >>= 8;
198  dst[0] = dst_sample & 0xFF;
199  dst += 2;
200  }
201 #endif
202  }
203  break;
204 
205  case AUDIO_S32LSB:
206  {
207  const Uint32 *src32 = (Uint32 *) src;
208  Uint32 *dst32 = (Uint32 *) dst;
209  Sint64 src1, src2;
210  Sint64 dst_sample;
211  const Sint64 max_audioval = ((((Sint64) 1) << (32 - 1)) - 1);
212  const Sint64 min_audioval = -(((Sint64) 1) << (32 - 1));
213 
214  len /= 4;
215  while (len--) {
216  src1 = (Sint64) ((Sint32) SDL_SwapLE32(*src32));
217  src32++;
218  ADJUST_VOLUME(src1, volume);
219  src2 = (Sint64) ((Sint32) SDL_SwapLE32(*dst32));
220  dst_sample = src1 + src2;
221  if (dst_sample > max_audioval) {
222  dst_sample = max_audioval;
223  } else if (dst_sample < min_audioval) {
224  dst_sample = min_audioval;
225  }
226  *(dst32++) = SDL_SwapLE32((Uint32) ((Sint32) dst_sample));
227  }
228  }
229  break;
230 
231  case AUDIO_S32MSB:
232  {
233  const Uint32 *src32 = (Uint32 *) src;
234  Uint32 *dst32 = (Uint32 *) dst;
235  Sint64 src1, src2;
236  Sint64 dst_sample;
237  const Sint64 max_audioval = ((((Sint64) 1) << (32 - 1)) - 1);
238  const Sint64 min_audioval = -(((Sint64) 1) << (32 - 1));
239 
240  len /= 4;
241  while (len--) {
242  src1 = (Sint64) ((Sint32) SDL_SwapBE32(*src32));
243  src32++;
244  ADJUST_VOLUME(src1, volume);
245  src2 = (Sint64) ((Sint32) SDL_SwapBE32(*dst32));
246  dst_sample = src1 + src2;
247  if (dst_sample > max_audioval) {
248  dst_sample = max_audioval;
249  } else if (dst_sample < min_audioval) {
250  dst_sample = min_audioval;
251  }
252  *(dst32++) = SDL_SwapBE32((Uint32) ((Sint32) dst_sample));
253  }
254  }
255  break;
256 
257  case AUDIO_F32LSB:
258  {
259  const float fmaxvolume = 1.0f / ((float) SDL_MIX_MAXVOLUME);
260  const float fvolume = (float) volume;
261  const float *src32 = (float *) src;
262  float *dst32 = (float *) dst;
263  float src1, src2;
264  double dst_sample;
265  /* !!! FIXME: are these right? */
266  const double max_audioval = 3.402823466e+38F;
267  const double min_audioval = -3.402823466e+38F;
268 
269  len /= 4;
270  while (len--) {
271  src1 = ((SDL_SwapFloatLE(*src32) * fvolume) * fmaxvolume);
272  src2 = SDL_SwapFloatLE(*dst32);
273  src32++;
274 
275  dst_sample = ((double) src1) + ((double) src2);
276  if (dst_sample > max_audioval) {
277  dst_sample = max_audioval;
278  } else if (dst_sample < min_audioval) {
279  dst_sample = min_audioval;
280  }
281  *(dst32++) = SDL_SwapFloatLE((float) dst_sample);
282  }
283  }
284  break;
285 
286  case AUDIO_F32MSB:
287  {
288  const float fmaxvolume = 1.0f / ((float) SDL_MIX_MAXVOLUME);
289  const float fvolume = (float) volume;
290  const float *src32 = (float *) src;
291  float *dst32 = (float *) dst;
292  float src1, src2;
293  double dst_sample;
294  /* !!! FIXME: are these right? */
295  const double max_audioval = 3.402823466e+38F;
296  const double min_audioval = -3.402823466e+38F;
297 
298  len /= 4;
299  while (len--) {
300  src1 = ((SDL_SwapFloatBE(*src32) * fvolume) * fmaxvolume);
301  src2 = SDL_SwapFloatBE(*dst32);
302  src32++;
303 
304  dst_sample = ((double) src1) + ((double) src2);
305  if (dst_sample > max_audioval) {
306  dst_sample = max_audioval;
307  } else if (dst_sample < min_audioval) {
308  dst_sample = min_audioval;
309  }
310  *(dst32++) = SDL_SwapFloatBE((float) dst_sample);
311  }
312  }
313  break;
314 
315  default: /* If this happens... FIXME! */
316  SDL_SetError("SDL_MixAudio(): unknown audio format");
317  return;
318  }
319 }
#define SDL_MIX_MAXVOLUME
Definition: SDL_audio.h:461
GLenum GLenum dst
#define ADJUST_VOLUME(s, v)
Definition: SDL_mixer.c:85
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1565
#define SDL_SwapFloatBE(X)
Definition: SDL_endian.h:218
#define AUDIO_S32MSB
Definition: SDL_audio.h:104
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:155
#define SDL_SwapFloatLE(X)
Definition: SDL_endian.h:214
GLenum GLsizei len
#define SDL_SwapBE32(X)
Definition: SDL_endian.h:216
#define AUDIO_F32MSB
Definition: SDL_audio.h:113
static const Uint8 mix8[]
Definition: SDL_mixer.c:34
#define AUDIO_U8
Definition: SDL_audio.h:89
int8_t Sint8
A signed 8-bit integer type.
Definition: SDL_stdinc.h:135
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
#define ADJUST_VOLUME_U8(s, v)
Definition: SDL_mixer.c:86
#define SDL_SwapLE32(X)
Definition: SDL_endian.h:212
#define AUDIO_F32LSB
Definition: SDL_audio.h:112
#define AUDIO_S32LSB
Definition: SDL_audio.h:103
int32_t Sint32
A signed 32-bit integer type.
Definition: SDL_stdinc.h:151
#define SDL_SetError
#define AUDIO_S16MSB
Definition: SDL_audio.h:94
#define AUDIO_S16LSB
Definition: SDL_audio.h:92
#define F(x, y, z)
Definition: SDL_test_md5.c:73
int64_t Sint64
A signed 64-bit integer type.
Definition: SDL_stdinc.h:160
#define AUDIO_S8
Definition: SDL_audio.h:90
GLenum src
int16_t Sint16
A signed 16-bit integer type.
Definition: SDL_stdinc.h:143

Variable Documentation

const Uint8 mix8[]
static

Definition at line 34 of file SDL_mixer.c.

Referenced by SDL_MixAudioFormat().