Mercurial > sdl-ios-xcode
annotate src/audio/SDL_mixer.c @ 172:37e3ca9254c7
Date: Sat, 8 Sep 2001 04:42:23 +0200
From: Max Horn <max@quendi.de>
Subject: SDL/OSX: Joystick; Better key handling
I just finished implementing improved keyhandling for OS X (in fact
the code should be easily ported to the "normal" MacOS part of SDL, I
just had no chance yet). Works like this:
First init the mapping table statically like before. Them, it queries
the OS for the "official" key table, then iterates over all 127
scancode and gets the associates ascii code. It ignores everythng
below 32 (has to, as it would lead to many problems if we did not...
e.g. both ESC and NUM LOCk produce an ascii code 27 on my keyboard),
and all stuff above 127 is mapped to SDLK_WORLD_* simply in the order
it is encountered.
In addition, caps lock is now working, too.
The code work flawless for me, but since I only have one keyboard, I
may have not encountered some serious problem... but I am pretty
confident that it is better than the old code in most cases.
The joystick driver works fine for me, too. I think it can be added
to CVS already. It would simply be helpful if more people would test
it. Hm, I wonder if Maelstrom or GLTron has Joystick support? That
would be a wonderful test application :)
I also took the liberty of modifying some text files like BUGS,
README.CVS, README.MacOSX (which now contains the OS X docs I long
promised)
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 11 Sep 2001 19:00:18 +0000 |
parents | cf2af46e9e2a |
children | e8157fcb3114 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
3 Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga | |
4 | |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 of the License, or (at your option) any later version. | |
9 | |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
20 slouken@devolution.com | |
21 */ | |
22 | |
23 #ifdef SAVE_RCSID | |
24 static char rcsid = | |
25 "@(#) $Id$"; | |
26 #endif | |
27 | |
28 /* This provides the default mixing callback for the SDL audio routines */ | |
29 | |
30 #include <stdio.h> | |
31 #include <stdlib.h> | |
32 #include <string.h> | |
33 | |
34 #include "SDL_audio.h" | |
35 #include "SDL_mutex.h" | |
36 #include "SDL_timer.h" | |
37 #include "SDL_sysaudio.h" | |
38 | |
39 | |
40 /* This table is used to add two sound values together and pin | |
41 * the value to avoid overflow. (used with permission from ARDI) | |
42 * Changed to use 0xFE instead of 0xFF for better sound quality. | |
43 */ | |
44 static const Uint8 mix8[] = | |
45 { | |
46 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, | |
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
55 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, | |
58 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, | |
59 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, | |
60 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, | |
61 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, | |
62 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, | |
63 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, | |
64 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, | |
65 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, | |
66 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, | |
67 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, | |
68 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, | |
69 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, | |
70 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, | |
71 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, | |
72 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, | |
73 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, | |
74 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, | |
75 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, | |
76 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, | |
77 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, | |
78 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, | |
79 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, | |
80 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 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, | |
83 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, | |
86 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, | |
87 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, | |
88 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, | |
89 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, | |
90 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, | |
91 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, | |
92 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE | |
93 }; | |
94 | |
95 /* The volume ranges from 0 - 128 */ | |
96 #define ADJUST_VOLUME(s, v) (s = (s*v)/SDL_MIX_MAXVOLUME) | |
97 #define ADJUST_VOLUME_U8(s, v) (s = (((s-128)*v)/SDL_MIX_MAXVOLUME)+128) | |
98 | |
1
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
99 void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) |
0 | 100 { |
101 Uint16 format; | |
102 | |
103 if ( volume == 0 ) { | |
104 return; | |
105 } | |
106 /* Mix the user-level audio format */ | |
107 if ( current_audio ) { | |
108 if ( current_audio->convert.needed ) { | |
109 format = current_audio->convert.src_format; | |
110 } else { | |
111 format = current_audio->spec.format; | |
112 } | |
113 } else { | |
114 /* HACK HACK HACK */ | |
115 format = AUDIO_S16; | |
116 } | |
117 switch (format) { | |
118 | |
119 case AUDIO_U8: { | |
120 Uint8 src_sample; | |
121 | |
122 while ( len-- ) { | |
123 src_sample = *src; | |
124 ADJUST_VOLUME_U8(src_sample, volume); | |
125 *dst = mix8[*dst+src_sample]; | |
126 ++dst; | |
127 ++src; | |
128 } | |
129 } | |
130 break; | |
131 | |
132 case AUDIO_S8: { | |
133 Sint8 *dst8, *src8; | |
134 Sint8 src_sample; | |
135 int dst_sample; | |
136 const int max_audioval = ((1<<(8-1))-1); | |
137 const int min_audioval = -(1<<(8-1)); | |
138 | |
139 src8 = (Sint8 *)src; | |
140 dst8 = (Sint8 *)dst; | |
141 while ( len-- ) { | |
142 src_sample = *src8; | |
143 ADJUST_VOLUME(src_sample, volume); | |
144 dst_sample = *dst8 + src_sample; | |
145 if ( dst_sample > max_audioval ) { | |
146 *dst8 = max_audioval; | |
147 } else | |
148 if ( dst_sample < min_audioval ) { | |
149 *dst8 = min_audioval; | |
150 } else { | |
151 *dst8 = dst_sample; | |
152 } | |
153 ++dst8; | |
154 ++src8; | |
155 } | |
156 } | |
157 break; | |
158 | |
159 case AUDIO_S16LSB: { | |
160 Sint16 src1, src2; | |
161 int dst_sample; | |
162 const int max_audioval = ((1<<(16-1))-1); | |
163 const int min_audioval = -(1<<(16-1)); | |
164 | |
165 len /= 2; | |
166 while ( len-- ) { | |
167 src1 = ((src[1])<<8|src[0]); | |
168 ADJUST_VOLUME(src1, volume); | |
169 src2 = ((dst[1])<<8|dst[0]); | |
170 src += 2; | |
171 dst_sample = src1+src2; | |
172 if ( dst_sample > max_audioval ) { | |
173 dst_sample = max_audioval; | |
174 } else | |
175 if ( dst_sample < min_audioval ) { | |
176 dst_sample = min_audioval; | |
177 } | |
178 dst[0] = dst_sample&0xFF; | |
179 dst_sample >>= 8; | |
180 dst[1] = dst_sample&0xFF; | |
181 dst += 2; | |
182 } | |
183 } | |
184 break; | |
185 | |
186 case AUDIO_S16MSB: { | |
187 Sint16 src1, src2; | |
188 int dst_sample; | |
189 const int max_audioval = ((1<<(16-1))-1); | |
190 const int min_audioval = -(1<<(16-1)); | |
191 | |
192 len /= 2; | |
193 while ( len-- ) { | |
194 src1 = ((src[0])<<8|src[1]); | |
195 ADJUST_VOLUME(src1, volume); | |
196 src2 = ((dst[0])<<8|dst[1]); | |
197 src += 2; | |
198 dst_sample = src1+src2; | |
199 if ( dst_sample > max_audioval ) { | |
200 dst_sample = max_audioval; | |
201 } else | |
202 if ( dst_sample < min_audioval ) { | |
203 dst_sample = min_audioval; | |
204 } | |
205 dst[1] = dst_sample&0xFF; | |
206 dst_sample >>= 8; | |
207 dst[0] = dst_sample&0xFF; | |
208 dst += 2; | |
209 } | |
210 } | |
211 break; | |
212 | |
213 default: /* If this happens... FIXME! */ | |
214 SDL_SetError("SDL_MixAudio(): unknown audio format"); | |
215 return; | |
216 } | |
217 } |