comparison src/audio/SDL_mixer.c @ 1895:c121d94672cb

SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author Sam Lantinga <slouken@libsdl.org>
date Mon, 10 Jul 2006 21:04:37 +0000
parents e3242177fe4a
children 3b4ce57c6215
comparison
equal deleted inserted replaced
1894:c69cee13dd76 1895:c121d94672cb
33 33
34 /* This table is used to add two sound values together and pin 34 /* This table is used to add two sound values together and pin
35 * the value to avoid overflow. (used with permission from ARDI) 35 * the value to avoid overflow. (used with permission from ARDI)
36 * Changed to use 0xFE instead of 0xFF for better sound quality. 36 * Changed to use 0xFE instead of 0xFF for better sound quality.
37 */ 37 */
38 static const Uint8 mix8[] = 38 static const Uint8 mix8[] = {
39 { 39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 40 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 44 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 48 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 51 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
52 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 52 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
53 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 53 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24,
54 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 54 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
55 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 55 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A,
56 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 56 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
57 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 57 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
58 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 58 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B,
59 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 59 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
60 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 60 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,
61 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 61 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C,
62 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 62 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
63 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 63 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92,
64 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 64 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D,
65 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 65 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
66 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 66 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3,
67 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 67 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE,
68 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 68 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9,
69 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 69 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4,
70 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 70 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
71 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 71 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA,
72 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 72 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5,
73 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 73 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFE, 0xFE,
74 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFE, 0xFE, 74 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
75 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 75 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
76 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 76 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
77 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 77 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
78 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 78 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
79 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 79 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
80 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 80 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
81 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 81 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
82 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 82 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
83 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 83 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
84 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 84 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
85 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 85 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE
86 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE
87 }; 86 };
88 87
89 /* The volume ranges from 0 - 128 */ 88 /* The volume ranges from 0 - 128 */
90 #define ADJUST_VOLUME(s, v) (s = (s*v)/SDL_MIX_MAXVOLUME) 89 #define ADJUST_VOLUME(s, v) (s = (s*v)/SDL_MIX_MAXVOLUME)
91 #define ADJUST_VOLUME_U8(s, v) (s = (((s-128)*v)/SDL_MIX_MAXVOLUME)+128) 90 #define ADJUST_VOLUME_U8(s, v) (s = (((s-128)*v)/SDL_MIX_MAXVOLUME)+128)
92 91
93 void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) 92 void
93 SDL_MixAudio(Uint8 * dst, const Uint8 * src, Uint32 len, int volume)
94 { 94 {
95 Uint16 format; 95 Uint16 format;
96 96
97 if ( volume == 0 ) { 97 if (volume == 0) {
98 return; 98 return;
99 } 99 }
100 /* Mix the user-level audio format */ 100 /* Mix the user-level audio format */
101 if ( current_audio ) { 101 if (current_audio) {
102 if ( current_audio->convert.needed ) { 102 if (current_audio->convert.needed) {
103 format = current_audio->convert.src_format; 103 format = current_audio->convert.src_format;
104 } else { 104 } else {
105 format = current_audio->spec.format; 105 format = current_audio->spec.format;
106 } 106 }
107 } else { 107 } else {
108 /* HACK HACK HACK */ 108 /* HACK HACK HACK */
109 format = AUDIO_S16; 109 format = AUDIO_S16;
110 } 110 }
111 switch (format) { 111 switch (format) {
112 112
113 case AUDIO_U8: { 113 case AUDIO_U8:
114 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES) 114 {
115 SDL_MixAudio_m68k_U8((char*)dst,(char*)src,(unsigned long)len,(long)volume,(char *)mix8); 115 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES)
116 #else 116 SDL_MixAudio_m68k_U8((char *) dst, (char *) src,
117 Uint8 src_sample; 117 (unsigned long) len, (long) volume,
118 118 (char *) mix8);
119 while ( len-- ) { 119 #else
120 src_sample = *src; 120 Uint8 src_sample;
121 ADJUST_VOLUME_U8(src_sample, volume); 121
122 *dst = mix8[*dst+src_sample]; 122 while (len--) {
123 ++dst; 123 src_sample = *src;
124 ++src; 124 ADJUST_VOLUME_U8(src_sample, volume);
125 } 125 *dst = mix8[*dst + src_sample];
126 #endif 126 ++dst;
127 } 127 ++src;
128 break; 128 }
129 129 #endif
130 case AUDIO_S8: { 130 }
131 break;
132
133 case AUDIO_S8:
134 {
131 #if defined(__GNUC__) && defined(__i386__) && defined(SDL_ASSEMBLY_ROUTINES) 135 #if defined(__GNUC__) && defined(__i386__) && defined(SDL_ASSEMBLY_ROUTINES)
132 if (SDL_HasMMX()) 136 if (SDL_HasMMX()) {
133 { 137 SDL_MixAudio_MMX_S8((char *) dst, (char *) src,
134 SDL_MixAudio_MMX_S8((char*)dst,(char*)src,(unsigned int)len,(int)volume); 138 (unsigned int) len, (int) volume);
135 } 139 } else
136 else
137 #elif ((defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)) && defined(SDL_ASSEMBLY_ROUTINES) 140 #elif ((defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)) && defined(SDL_ASSEMBLY_ROUTINES)
138 if (SDL_HasMMX()) 141 if (SDL_HasMMX()) {
139 { 142 SDL_MixAudio_MMX_S8_VC((char *) dst, (char *) src,
140 SDL_MixAudio_MMX_S8_VC((char*)dst,(char*)src,(unsigned int)len,(int)volume); 143 (unsigned int) len, (int) volume);
141 } 144 } else
142 else 145 #endif
143 #endif 146 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES)
144 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES) 147 SDL_MixAudio_m68k_S8((char *) dst, (char *) src,
145 SDL_MixAudio_m68k_S8((char*)dst,(char*)src,(unsigned long)len,(long)volume); 148 (unsigned long) len, (long) volume);
146 #else 149 #else
147 { 150 {
148 Sint8 *dst8, *src8; 151 Sint8 *dst8, *src8;
149 Sint8 src_sample; 152 Sint8 src_sample;
150 int dst_sample; 153 int dst_sample;
151 const int max_audioval = ((1<<(8-1))-1); 154 const int max_audioval = ((1 << (8 - 1)) - 1);
152 const int min_audioval = -(1<<(8-1)); 155 const int min_audioval = -(1 << (8 - 1));
153 156
154 src8 = (Sint8 *)src; 157 src8 = (Sint8 *) src;
155 dst8 = (Sint8 *)dst; 158 dst8 = (Sint8 *) dst;
156 while ( len-- ) { 159 while (len--) {
157 src_sample = *src8; 160 src_sample = *src8;
158 ADJUST_VOLUME(src_sample, volume); 161 ADJUST_VOLUME(src_sample, volume);
159 dst_sample = *dst8 + src_sample; 162 dst_sample = *dst8 + src_sample;
160 if ( dst_sample > max_audioval ) { 163 if (dst_sample > max_audioval) {
161 *dst8 = max_audioval; 164 *dst8 = max_audioval;
162 } else 165 } else if (dst_sample < min_audioval) {
163 if ( dst_sample < min_audioval ) { 166 *dst8 = min_audioval;
164 *dst8 = min_audioval; 167 } else {
165 } else { 168 *dst8 = dst_sample;
166 *dst8 = dst_sample; 169 }
167 } 170 ++dst8;
168 ++dst8; 171 ++src8;
169 ++src8; 172 }
170 } 173 }
171 } 174 #endif
172 #endif 175 }
173 } 176 break;
174 break; 177
175 178 case AUDIO_S16LSB:
176 case AUDIO_S16LSB: { 179 {
177 #if defined(__GNUC__) && defined(__i386__) && defined(SDL_ASSEMBLY_ROUTINES) 180 #if defined(__GNUC__) && defined(__i386__) && defined(SDL_ASSEMBLY_ROUTINES)
178 if (SDL_HasMMX()) 181 if (SDL_HasMMX()) {
179 { 182 SDL_MixAudio_MMX_S16((char *) dst, (char *) src,
180 SDL_MixAudio_MMX_S16((char*)dst,(char*)src,(unsigned int)len,(int)volume); 183 (unsigned int) len, (int) volume);
181 } 184 } else
182 else
183 #elif ((defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)) && defined(SDL_ASSEMBLY_ROUTINES) 185 #elif ((defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)) && defined(SDL_ASSEMBLY_ROUTINES)
184 if (SDL_HasMMX()) 186 if (SDL_HasMMX()) {
185 { 187 SDL_MixAudio_MMX_S16_VC((char *) dst, (char *) src,
186 SDL_MixAudio_MMX_S16_VC((char*)dst,(char*)src,(unsigned int)len,(int)volume); 188 (unsigned int) len, (int) volume);
187 } 189 } else
188 else 190 #endif
189 #endif 191 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES)
190 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES) 192 SDL_MixAudio_m68k_S16LSB((short *) dst, (short *) src,
191 SDL_MixAudio_m68k_S16LSB((short*)dst,(short*)src,(unsigned long)len,(long)volume); 193 (unsigned long) len, (long) volume);
192 #else 194 #else
193 { 195 {
194 Sint16 src1, src2; 196 Sint16 src1, src2;
195 int dst_sample; 197 int dst_sample;
196 const int max_audioval = ((1<<(16-1))-1); 198 const int max_audioval = ((1 << (16 - 1)) - 1);
197 const int min_audioval = -(1<<(16-1)); 199 const int min_audioval = -(1 << (16 - 1));
198 200
199 len /= 2; 201 len /= 2;
200 while ( len-- ) { 202 while (len--) {
201 src1 = ((src[1])<<8|src[0]); 203 src1 = ((src[1]) << 8 | src[0]);
202 ADJUST_VOLUME(src1, volume); 204 ADJUST_VOLUME(src1, volume);
203 src2 = ((dst[1])<<8|dst[0]); 205 src2 = ((dst[1]) << 8 | dst[0]);
204 src += 2; 206 src += 2;
205 dst_sample = src1+src2; 207 dst_sample = src1 + src2;
206 if ( dst_sample > max_audioval ) { 208 if (dst_sample > max_audioval) {
207 dst_sample = max_audioval; 209 dst_sample = max_audioval;
208 } else 210 } else if (dst_sample < min_audioval) {
209 if ( dst_sample < min_audioval ) { 211 dst_sample = min_audioval;
210 dst_sample = min_audioval; 212 }
211 } 213 dst[0] = dst_sample & 0xFF;
212 dst[0] = dst_sample&0xFF; 214 dst_sample >>= 8;
213 dst_sample >>= 8; 215 dst[1] = dst_sample & 0xFF;
214 dst[1] = dst_sample&0xFF; 216 dst += 2;
215 dst += 2; 217 }
216 } 218 }
217 } 219 #endif
218 #endif 220 }
219 } 221 break;
220 break; 222
221 223 case AUDIO_S16MSB:
222 case AUDIO_S16MSB: { 224 {
223 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES) 225 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES)
224 SDL_MixAudio_m68k_S16MSB((short*)dst,(short*)src,(unsigned long)len,(long)volume); 226 SDL_MixAudio_m68k_S16MSB((short *) dst, (short *) src,
225 #else 227 (unsigned long) len, (long) volume);
226 Sint16 src1, src2; 228 #else
227 int dst_sample; 229 Sint16 src1, src2;
228 const int max_audioval = ((1<<(16-1))-1); 230 int dst_sample;
229 const int min_audioval = -(1<<(16-1)); 231 const int max_audioval = ((1 << (16 - 1)) - 1);
230 232 const int min_audioval = -(1 << (16 - 1));
231 len /= 2; 233
232 while ( len-- ) { 234 len /= 2;
233 src1 = ((src[0])<<8|src[1]); 235 while (len--) {
234 ADJUST_VOLUME(src1, volume); 236 src1 = ((src[0]) << 8 | src[1]);
235 src2 = ((dst[0])<<8|dst[1]); 237 ADJUST_VOLUME(src1, volume);
236 src += 2; 238 src2 = ((dst[0]) << 8 | dst[1]);
237 dst_sample = src1+src2; 239 src += 2;
238 if ( dst_sample > max_audioval ) { 240 dst_sample = src1 + src2;
239 dst_sample = max_audioval; 241 if (dst_sample > max_audioval) {
240 } else 242 dst_sample = max_audioval;
241 if ( dst_sample < min_audioval ) { 243 } else if (dst_sample < min_audioval) {
242 dst_sample = min_audioval; 244 dst_sample = min_audioval;
243 } 245 }
244 dst[1] = dst_sample&0xFF; 246 dst[1] = dst_sample & 0xFF;
245 dst_sample >>= 8; 247 dst_sample >>= 8;
246 dst[0] = dst_sample&0xFF; 248 dst[0] = dst_sample & 0xFF;
247 dst += 2; 249 dst += 2;
248 } 250 }
249 #endif 251 #endif
250 } 252 }
251 break; 253 break;
252 254
253 default: /* If this happens... FIXME! */ 255 default: /* If this happens... FIXME! */
254 SDL_SetError("SDL_MixAudio(): unknown audio format"); 256 SDL_SetError("SDL_MixAudio(): unknown audio format");
255 return; 257 return;
256 } 258 }
257 } 259 }
258 260
261 /* vi: set ts=4 sw=4 expandtab: */