Mercurial > sdl-ios-xcode
annotate src/audio/SDL_mixer.c @ 4105:84882a89ca50 SDL-1.2
Date: Thu, 27 Dec 2007 07:38:25 +0000
From: John Bartholomew
Subject: [SDL] SDL Semaphore implementation broken on Windows?
Hi,
Over the past couple of days, I've been battling with SDL, SDL_Mixer and SMPEG to try to find an audio hang bug. I believe I've found the problem, which I think is a race condition inside SDL's semaphore implementation (at least the Windows implementation). The semaphore code uses Windows' built in semaphore functions, but it also maintains a separate count value. This count value is updated with bare increment and decrement operations in SemPost and SemWaitTimeout - no locking primitives to protect them.
In tracking down the apparent audio bug, I found that at some point a semaphore's count value was being decremented to -1, which is clearly not a valid value for it to take.
I'm still not certain exactly what sequence of operations is occuring for this to happen, but I believe that overall it's a race condition between a thread calling SemPost (which increments the count) and the thread on the other end calling SemWait (which decrements it).
I will try to make a test case to verify this, but I'm not sure if I'll be able to (threading errors being difficult to reproduce even in the best circumstances).
However, assuming this is the cause of my problems, there is a very
simple fix:
Windows provides InterlockedIncrement() and InterlockedDecrement()
functions to perform increments and decrements which are guaranteed to be atomic. So the fix is in thread/win32/SDL_syssem.c: replace occurrences of --sem->count with InterlockedDecrement(&sem->count); and replace occurrences of ++sem->count with InterlockedIncrement(&sem->count);
This is using SDL v1.2.12, built with VC++ 2008 Express, running on a
Core 2 duo processor.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 28 Dec 2007 22:05:17 +0000 |
parents | e3242177fe4a |
children | 782fd950bd46 c121d94672cb a1b03ba2fcd0 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 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 | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
1
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 /* This provides the default mixing callback for the SDL audio routines */ | |
25 | |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
26 #include "SDL_cpuinfo.h" |
0 | 27 #include "SDL_timer.h" |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
28 #include "SDL_audio.h" |
0 | 29 #include "SDL_sysaudio.h" |
539
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
30 #include "SDL_mixer_MMX.h" |
574
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
31 #include "SDL_mixer_MMX_VC.h" |
633
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
32 #include "SDL_mixer_m68k.h" |
0 | 33 |
34 /* This table is used to add two sound values together and pin | |
35 * the value to avoid overflow. (used with permission from ARDI) | |
36 * Changed to use 0xFE instead of 0xFF for better sound quality. | |
37 */ | |
38 static const Uint8 mix8[] = | |
39 { | |
40 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, | |
43 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, | |
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, 0x01, 0x02, 0x03, | |
52 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, | |
53 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, | |
54 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, | |
55 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, | |
56 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, | |
57 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, | |
58 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, | |
59 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, | |
60 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, | |
61 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, | |
62 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, | |
63 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, | |
64 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, | |
65 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, | |
66 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, | |
67 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, | |
68 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, | |
69 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, | |
70 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, | |
71 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, | |
72 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, | |
73 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, | |
74 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 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, | |
77 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, | |
80 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, | |
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 | |
87 }; | |
88 | |
89 /* The volume ranges from 0 - 128 */ | |
90 #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) | |
92 | |
1
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
93 void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) |
0 | 94 { |
95 Uint16 format; | |
96 | |
97 if ( volume == 0 ) { | |
98 return; | |
99 } | |
100 /* Mix the user-level audio format */ | |
101 if ( current_audio ) { | |
102 if ( current_audio->convert.needed ) { | |
103 format = current_audio->convert.src_format; | |
104 } else { | |
105 format = current_audio->spec.format; | |
106 } | |
107 } else { | |
108 /* HACK HACK HACK */ | |
109 format = AUDIO_S16; | |
110 } | |
111 switch (format) { | |
112 | |
113 case AUDIO_U8: { | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
114 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES) |
633
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
115 SDL_MixAudio_m68k_U8((char*)dst,(char*)src,(unsigned long)len,(long)volume,(char *)mix8); |
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
116 #else |
0 | 117 Uint8 src_sample; |
118 | |
119 while ( len-- ) { | |
120 src_sample = *src; | |
121 ADJUST_VOLUME_U8(src_sample, volume); | |
122 *dst = mix8[*dst+src_sample]; | |
123 ++dst; | |
124 ++src; | |
125 } | |
633
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
126 #endif |
0 | 127 } |
128 break; | |
129 | |
130 case AUDIO_S8: { | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
131 #if defined(__GNUC__) && defined(__i386__) && defined(SDL_ASSEMBLY_ROUTINES) |
739
22dbf364c017
Added SDL_HasMMX(), SDL_Has3DNow(), SDL_HasSSE() in SDL_cpuinfo.h
Sam Lantinga <slouken@libsdl.org>
parents:
633
diff
changeset
|
132 if (SDL_HasMMX()) |
539
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
133 { |
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
134 SDL_MixAudio_MMX_S8((char*)dst,(char*)src,(unsigned int)len,(int)volume); |
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
135 } |
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
136 else |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
137 #elif ((defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)) && defined(SDL_ASSEMBLY_ROUTINES) |
746
72ef7ce609ef
Greatly simplified the SDL CPU info code
Sam Lantinga <slouken@libsdl.org>
parents:
739
diff
changeset
|
138 if (SDL_HasMMX()) |
574
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
139 { |
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
140 SDL_MixAudio_MMX_S8_VC((char*)dst,(char*)src,(unsigned int)len,(int)volume); |
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
141 } |
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
142 else |
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
143 #endif |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
144 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES) |
633
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
145 SDL_MixAudio_m68k_S8((char*)dst,(char*)src,(unsigned long)len,(long)volume); |
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
146 #else |
539
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
147 { |
0 | 148 Sint8 *dst8, *src8; |
149 Sint8 src_sample; | |
150 int dst_sample; | |
151 const int max_audioval = ((1<<(8-1))-1); | |
152 const int min_audioval = -(1<<(8-1)); | |
153 | |
154 src8 = (Sint8 *)src; | |
155 dst8 = (Sint8 *)dst; | |
156 while ( len-- ) { | |
157 src_sample = *src8; | |
158 ADJUST_VOLUME(src_sample, volume); | |
159 dst_sample = *dst8 + src_sample; | |
160 if ( dst_sample > max_audioval ) { | |
161 *dst8 = max_audioval; | |
162 } else | |
163 if ( dst_sample < min_audioval ) { | |
164 *dst8 = min_audioval; | |
165 } else { | |
166 *dst8 = dst_sample; | |
167 } | |
168 ++dst8; | |
169 ++src8; | |
170 } | |
539
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
171 } |
633
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
172 #endif |
0 | 173 } |
174 break; | |
175 | |
176 case AUDIO_S16LSB: { | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
177 #if defined(__GNUC__) && defined(__i386__) && defined(SDL_ASSEMBLY_ROUTINES) |
739
22dbf364c017
Added SDL_HasMMX(), SDL_Has3DNow(), SDL_HasSSE() in SDL_cpuinfo.h
Sam Lantinga <slouken@libsdl.org>
parents:
633
diff
changeset
|
178 if (SDL_HasMMX()) |
539
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
179 { |
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
180 SDL_MixAudio_MMX_S16((char*)dst,(char*)src,(unsigned int)len,(int)volume); |
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
181 } |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
182 else |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
183 #elif ((defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)) && defined(SDL_ASSEMBLY_ROUTINES) |
746
72ef7ce609ef
Greatly simplified the SDL CPU info code
Sam Lantinga <slouken@libsdl.org>
parents:
739
diff
changeset
|
184 if (SDL_HasMMX()) |
574
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
185 { |
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
186 SDL_MixAudio_MMX_S16_VC((char*)dst,(char*)src,(unsigned int)len,(int)volume); |
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
187 } |
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
188 else |
539
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
189 #endif |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
190 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES) |
633
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
191 SDL_MixAudio_m68k_S16LSB((short*)dst,(short*)src,(unsigned long)len,(long)volume); |
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
192 #else |
539
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
193 { |
0 | 194 Sint16 src1, src2; |
195 int dst_sample; | |
196 const int max_audioval = ((1<<(16-1))-1); | |
197 const int min_audioval = -(1<<(16-1)); | |
198 | |
199 len /= 2; | |
200 while ( len-- ) { | |
201 src1 = ((src[1])<<8|src[0]); | |
202 ADJUST_VOLUME(src1, volume); | |
203 src2 = ((dst[1])<<8|dst[0]); | |
204 src += 2; | |
205 dst_sample = src1+src2; | |
206 if ( dst_sample > max_audioval ) { | |
207 dst_sample = max_audioval; | |
208 } else | |
209 if ( dst_sample < min_audioval ) { | |
210 dst_sample = min_audioval; | |
211 } | |
212 dst[0] = dst_sample&0xFF; | |
213 dst_sample >>= 8; | |
214 dst[1] = dst_sample&0xFF; | |
215 dst += 2; | |
216 } | |
539
a9e38f3b8e4d
Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
217 } |
633
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
218 #endif |
0 | 219 } |
220 break; | |
221 | |
222 case AUDIO_S16MSB: { | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
223 #if defined(__GNUC__) && defined(__M68000__) && defined(SDL_ASSEMBLY_ROUTINES) |
633
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
224 SDL_MixAudio_m68k_S16MSB((short*)dst,(short*)src,(unsigned long)len,(long)volume); |
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
225 #else |
0 | 226 Sint16 src1, src2; |
227 int dst_sample; | |
228 const int max_audioval = ((1<<(16-1))-1); | |
229 const int min_audioval = -(1<<(16-1)); | |
230 | |
231 len /= 2; | |
232 while ( len-- ) { | |
233 src1 = ((src[0])<<8|src[1]); | |
234 ADJUST_VOLUME(src1, volume); | |
235 src2 = ((dst[0])<<8|dst[1]); | |
236 src += 2; | |
237 dst_sample = src1+src2; | |
238 if ( dst_sample > max_audioval ) { | |
239 dst_sample = max_audioval; | |
240 } else | |
241 if ( dst_sample < min_audioval ) { | |
242 dst_sample = min_audioval; | |
243 } | |
244 dst[1] = dst_sample&0xFF; | |
245 dst_sample >>= 8; | |
246 dst[0] = dst_sample&0xFF; | |
247 dst += 2; | |
248 } | |
633
873c2598f969
Add m68k assembly mixing routines
Patrice Mandin <patmandin@gmail.com>
parents:
574
diff
changeset
|
249 #endif |
0 | 250 } |
251 break; | |
252 | |
253 default: /* If this happens... FIXME! */ | |
254 SDL_SetError("SDL_MixAudio(): unknown audio format"); | |
255 return; | |
256 } | |
257 } | |
574
64fe373be3dc
Cth converted the MMX audio mixing routines to VC++ syntax
Sam Lantinga <slouken@libsdl.org>
parents:
539
diff
changeset
|
258 |